From a593bc094f35abdba6146f6875963ac7f0acaa41 Mon Sep 17 00:00:00 2001 From: Goran Zdjelar Date: Sat, 11 Mar 2023 21:52:19 +0100 Subject: [PATCH 1/3] Convert cloze deletions to input fields --- esbuild.config.mjs | 2 +- main.js | 16173 ++++++++++++++++++++++++++++++++++++++ src/flashcard-modal.tsx | 24 + src/main.ts | 36 +- yarn.lock | 3388 ++++++++ 5 files changed, 19596 insertions(+), 27 deletions(-) create mode 100644 main.js create mode 100644 yarn.lock diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 57268723..3200e727 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -25,6 +25,6 @@ esbuild sourcemap: "inline", sourcesContent: !prod, treeShaking: true, - outfile: "build/main.js", + outfile: "main.js", }) .catch(() => process.exit(1)); diff --git a/main.js b/main.js new file mode 100644 index 00000000..c0cf3907 --- /dev/null +++ b/main.js @@ -0,0 +1,16173 @@ +/* +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 __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name2 in all) + __defProp(target, name2, { get: all[name2], enumerable: true }); +}; +var __copyProps = (to2, from2, except, desc) => { + if (from2 && typeof from2 === "object" || typeof from2 === "function") { + for (let key of __getOwnPropNames(from2)) + if (!__hasOwnProp.call(to2, key) && key !== except) + __defProp(to2, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); + } + return to2; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; + +// node_modules/pagerank.js/lib/index.js +var require_lib = __commonJS({ + "node_modules/pagerank.js/lib/index.js"(exports, module2) { + "use strict"; + function forOwn(object, callback2) { + if (typeof object === "object" && typeof callback2 === "function") { + for (var key in object) { + if (object.hasOwnProperty(key) === true) { + if (callback2(key, object[key]) === false) { + break; + } + } + } + } + } + module2.exports = function() { + var self = { + count: 0, + edges: {}, + nodes: {} + }; + self.link = function(source, target, weight) { + if (isFinite(weight) !== true || weight === null) { + weight = 1; + } + weight = parseFloat(weight); + if (self.nodes.hasOwnProperty(source) !== true) { + self.count++; + self.nodes[source] = { + weight: 0, + outbound: 0 + }; + } + self.nodes[source].outbound += weight; + if (self.nodes.hasOwnProperty(target) !== true) { + self.count++; + self.nodes[target] = { + weight: 0, + outbound: 0 + }; + } + if (self.edges.hasOwnProperty(source) !== true) { + self.edges[source] = {}; + } + if (self.edges[source].hasOwnProperty(target) !== true) { + self.edges[source][target] = 0; + } + self.edges[source][target] += weight; + }; + self.rank = function(alpha2, epsilon, callback2) { + var delta = 1, inverse = 1 / self.count; + forOwn(self.edges, function(source) { + if (self.nodes[source].outbound > 0) { + forOwn(self.edges[source], function(target) { + self.edges[source][target] /= self.nodes[source].outbound; + }); + } + }); + forOwn(self.nodes, function(key) { + self.nodes[key].weight = inverse; + }); + while (delta > epsilon) { + var leak = 0, nodes = {}; + forOwn(self.nodes, function(key, value) { + nodes[key] = value.weight; + if (value.outbound === 0) { + leak += value.weight; + } + self.nodes[key].weight = 0; + }); + leak *= alpha2; + forOwn(self.nodes, function(source) { + forOwn(self.edges[source], function(target, weight) { + self.nodes[target].weight += alpha2 * nodes[source] * weight; + }); + self.nodes[source].weight += (1 - alpha2) * inverse + leak * inverse; + }); + delta = 0; + forOwn(self.nodes, function(key, value) { + delta += Math.abs(value.weight - nodes[key]); + }); + } + forOwn(self.nodes, function(key) { + return callback2(key, self.nodes[key].weight); + }); + }; + self.reset = function() { + self.count = 0; + self.edges = {}; + self.nodes = {}; + }; + return self; + }(); + } +}); + +// node_modules/vhtml/dist/vhtml.js +var require_vhtml = __commonJS({ + "node_modules/vhtml/dist/vhtml.js"(exports, module2) { + (function(global, factory) { + typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.vhtml = factory(); + })(exports, function() { + "use strict"; + var emptyTags = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; + var esc = function esc2(str) { + return String(str).replace(/[&<>"']/g, function(s) { + return "&" + map3[s] + ";"; + }); + }; + var map3 = { "&": "amp", "<": "lt", ">": "gt", '"': "quot", "'": "apos" }; + var setInnerHTMLAttr = "dangerouslySetInnerHTML"; + var DOMAttributeNames = { + className: "class", + htmlFor: "for" + }; + var sanitized = {}; + function h4(name2, attrs) { + var stack = [], s = ""; + attrs = attrs || {}; + for (var i = arguments.length; i-- > 2; ) { + stack.push(arguments[i]); + } + if (typeof name2 === "function") { + attrs.children = stack.reverse(); + return name2(attrs); + } + if (name2) { + s += "<" + name2; + if (attrs) + for (var _i in attrs) { + if (attrs[_i] !== false && attrs[_i] != null && _i !== setInnerHTMLAttr) { + s += " " + (DOMAttributeNames[_i] ? DOMAttributeNames[_i] : esc(_i)) + '="' + esc(attrs[_i]) + '"'; + } + } + s += ">"; + } + if (emptyTags.indexOf(name2) === -1) { + if (attrs[setInnerHTMLAttr]) { + s += attrs[setInnerHTMLAttr].__html; + } else + while (stack.length) { + var child = stack.pop(); + if (child) { + if (child.pop) { + for (var _i2 = child.length; _i2--; ) { + stack.push(child[_i2]); + } + } else { + s += sanitized[child] === true ? child : esc(child); + } + } + } + s += name2 ? "" : ""; + } + sanitized[s] = true; + return s; + } + return h4; + }); + } +}); + +// src/main.ts +var main_exports = {}; +__export(main_exports, { + default: () => SRPlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian8 = require("obsidian"); +var graph = __toESM(require_lib()); + +// src/settings.ts +var import_obsidian2 = require("obsidian"); + +// src/lang/helpers.ts +var import_obsidian = require("obsidian"); + +// src/lang/locale/af.ts +var af_default = {}; + +// src/lang/locale/ar.ts +var ar_default = { + // flashcard-modal.tsx + DECKS: "\u0627\u0644\u0631\u064F\u0632\u0645\u064E\u0627\u062A", + DUE_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u064F\u0633\u062A\u062D\u0642\u0629", + NEW_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u062C\u062F\u064A\u062F\u0629", + TOTAL_CARDS: "\u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + BACK: "\u0631\u062C\u0648\u0639", + SKIP: "Skip", + EDIT_CARD: "\u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + RESET_CARD_PROGRESS: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645\u0652 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + HARD: "\u0635\u0639\u0628", + GOOD: "\u062C\u064A\u062F", + EASY: "\u0633\u0647\u0644", + SHOW_ANSWER: "\u0623\u0638\u0647\u0650\u0631 \u0627\u0644\u0625\u062C\u0627\u0628\u0629", + CARD_PROGRESS_RESET: ".\u062A\u0645\u0651\u064E\u062A \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + SAVE: "\u062D\u0641\u0638", + CANCEL: "\u0625\u0644\u063A\u0627\u0621", + NO_INPUT: ".\u0644\u0645 \u064A\u062A\u0650\u0645 \u062A\u0642\u062F\u064A\u0645 \u0623\u064A \u0645\u064F\u062F\u062E\u0644\u0627\u062A", + CURRENT_EASE_HELP_TEXT: ":\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629", + CURRENT_INTERVAL_HELP_TEXT: ":\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0627\u0644\u062D\u0627\u0644\u064A", + CARD_GENERATED_FROM: "${notePath} :\u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + REVIEW_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + REVIEW_EASY_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u0633\u0647\u0644", + REVIEW_GOOD_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u062C\u064A\u062F", + REVIEW_HARD_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u0635\u0639\u0628", + REVIEW_NOTE_EASY_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u0633\u0647\u0644\u0629", + REVIEW_NOTE_GOOD_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u062C\u064A\u062F\u0629", + REVIEW_NOTE_HARD_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u0635\u0639\u0628\u0629", + CRAM_ALL_CARDS: "\u062D\u062F\u062F \u0631\u064F\u0632\u0645\u064E\u0629 \u0644\u0644\u062D\u0634\u0631", + REVIEW_ALL_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A", + REVIEW_CARDS_IN_NOTE: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629", + CRAM_CARDS_IN_NOTE: "\u0623\u062D\u0634\u0631 \u062C\u0645\u064A\u0639 \u0628\u0637\u0627\u0642\u0627\u062A \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629", + VIEW_STATS: "\u0639\u0631\u0636 \u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A", + STATUS_BAR: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 ${dueFlashcardsCount},\u0645\u0644\u0627\u062D\u0638\u0627\u062A ${dueNotesCount}:\u0645\u0631\u0627\u062C\u0639\u0629", + SYNC_TIME_TAKEN: "${t}ms \u0627\u0633\u062A\u063A\u0631\u0627\u0642 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629", + NOTE_IN_IGNORED_FOLDER: ".\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u0636\u0645\u0646 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0630\u064A \u062A\u0645 \u062A\u062C\u0627\u0647\u0644\u0647 (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)", + PLEASE_TAG_NOTE: ".\u064A\u0631\u062C\u0649 \u0648\u0636\u0639 \u0648\u0633\u0645 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0628\u0634\u0643\u0644 \u0645\u0646\u0627\u0633\u0628 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629 (\u0641\u064A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)", + RESPONSE_RECEIVED: ".\u0627\u0633\u062A\u064F\u0644\u0645\u062A \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629", + NO_DECK_EXISTS: "${deckName} \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u064F\u0632\u0645\u064E\u0629", + ALL_CAUGHT_UP: "\u{1F606} \u0644\u0642\u062F \u062A\u0645 \u0627\u0644\u0642\u0628\u0636 \u0639\u0644\u064A\u0643\u0645 \u062C\u0645\u064A\u0639\u0627 \u0627\u0644\u0622\u0646", + // scheduling.ts + DAYS_STR_IVL: "\u064A\u0648\u0645/\u0623\u064A\u0627\u0645 ${interval}", + MONTHS_STR_IVL: "\u0634\u0647\u0631/\u0623\u0634\u0647\u0631 ${interval}", + YEARS_STR_IVL: "\u0633\u0646\u0629/\u0633\u0646\u0648\u0627\u062A ${interval}", + DAYS_STR_IVL_MOBILE: "\u064A${interval}", + MONTHS_STR_IVL_MOBILE: "\u0634${interval}", + YEARS_STR_IVL_MOBILE: "\u0633${interval}", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", + CHECK_WIKI: '.wiki \u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u060C \u062A\u062D\u0642\u0642 \u0645\u0646', + FOLDERS_TO_IGNORE: "\u0645\u062C\u0644\u062F\u0627\u062A \u0644\u062A\u062C\u0627\u0647\u0644\u0647\u0627", + FOLDERS_TO_IGNORE_DESC: "Templates Meta/Scripts : \u0623\u062F\u062E\u0644 \u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u062C\u0644\u062F \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u0633\u0637\u0648\u0631 \u062C\u062F\u064A\u062F\u0629,\u0645\u062B\u0627\u0644", + FLASHCARDS: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + FLASHCARD_EASY_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0633\u0647\u0644", + FLASHCARD_GOOD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u062C\u064A\u062F", + FLASHCARD_HARD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0635\u0639\u0628", + FLASHCARD_EASY_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0633\u0647\u0644', + FLASHCARD_GOOD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u062C\u064A\u062F', + FLASHCARD_HARD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0635\u0639\u0628', + FLASHCARD_TAGS: "\u0648\u064F\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + FLASHCARD_TAGS_DESC: "#2\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u064F\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u0623\u0633\u0637\u0631 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A# \u0631\u0632\u0645\u06293# \u0631\u0632\u0645\u0629", + CONVERT_FOLDERS_TO_DECKS: "\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u062C\u0644\u062F\u0627\u062A \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0648 \u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629\u061F", + CONVERT_FOLDERS_TO_DECKS_DESC: ".\u0647\u0630\u0627 \u0647\u0648 \u0628\u062F\u064A\u0644 \u0644\u062E\u064A\u0627\u0631 \u0648\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0623\u0639\u0644\u0627\u0647", + INLINE_SCHEDULING_COMMENTS: "\u062D\u0641\u0638 \u062A\u0639\u0644\u064A\u0642 \u0627\u0644\u062C\u062F\u0648\u0644\u0629 \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0633\u0637\u0631 \u0645\u062B\u0644 \u0627\u0644\u0633\u0637\u0631 \u0627\u0644\u0623\u062E\u064A\u0631 \u0644\u0644\u0628\u0637\u0627\u0642\u0629 \u061F", + INLINE_SCHEDULING_COMMENTS_DESC: "\u0644\u0627 \u062A\u0643\u0633\u0631 \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 HTML \u0633\u064A\u0624\u062F\u064A \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0625\u0644\u0649 \u062C\u0639\u0644 \u062A\u0639\u0644\u064A\u0642\u0627\u062A", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u0623\u062E\u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u062D\u062A\u0649 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u062A\u0627\u0644\u064A", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "cloze deletions : \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u0647\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u0646\u0641\u0633 \u0646\u0635 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0643\u0640", + SHOW_CARD_CONTEXT: "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0633\u064A\u0627\u0642 \u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A\u061F", + SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", + CARD_MODAL_HEIGHT_PERCENT: "\u0646\u0633\u0628\u0629 \u0627\u0631\u062A\u0641\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + CARD_MODAL_SIZE_PERCENT_DESC: "\u064A\u062C\u0628 \u0636\u0628\u0637\u0647\u0627 \u0639\u0644\u0649 100 \u066A \u0639\u0644\u0649 \u0627\u0644\u0647\u0627\u062A\u0641 \u0627\u0644\u0645\u062D\u0645\u0648\u0644 \u0623\u0648 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0635\u0648\u0631 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u064B\u0627", + RESET_DEFAULT: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A", + CARD_MODAL_WIDTH_PERCENT: "\u0646\u0633\u0628\u0629 \u0639\u0631\u0636 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", + RANDOMIZE_CARD_ORDER: "\u062A\u0631\u062A\u064A\u0628 \u0628\u0637\u0627\u0642\u0629 \u0639\u0634\u0648\u0627\u0626\u064A \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629\u061F", + DISABLE_CLOZE_CARDS: "\u061Fcloze \u062A\u0639\u0637\u064A\u0644 \u0628\u0637\u0627\u0642\u0627\u062A", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?", + INLINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0636\u0645\u0646\u0629", + FIX_SEPARATORS_MANUALLY_WARNING: "\u0636\u0639 \u0641\u064A \u062D\u0633\u0627\u0628\u0643 \u0623\u0646\u0647 \u0628\u0639\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u060C \u064A\u062C\u0628 \u0639\u0644\u064A\u0643 \u062A\u0639\u062F\u064A\u0644 \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u064A\u062F\u0648\u064A\u064B\u0627", + INLINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u0636\u0645\u0646\u0629", + MULTILINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629", + NOTES: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A", + REVIEW_PANE_ON_STARTUP: "\u062A\u0645\u0643\u064A\u0646 \u062C\u0632\u0621 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0639\u0646\u062F \u0628\u062F\u0621 \u0627\u0644\u062A\u0634\u063A\u064A\u0644", + TAGS_TO_REVIEW: "\u0648\u0633\u0648\u0645 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + TAGS_TO_REVIEW_DESC: "#\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u062E\u0637\u0648\u0637 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A : \u0645\u0631\u0627\u062C\u0639\u0629# \u0648\u0633\u06452# \u0648\u0633\u06453", + OPEN_RANDOM_NOTE: "\u0627\u0641\u062A\u062D \u0645\u0644\u0627\u062D\u0638\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + OPEN_RANDOM_NOTE_DESC: "(Pagerank) \u0639\u0646\u062F \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u060C\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0633\u064A\u062A\u0645 \u062A\u0631\u062A\u064A\u0628\u064F\u0647\u0627 \u062D\u0633\u0628 \u0627\u0644\u0623\u0647\u0645\u064A\u0629", + AUTO_NEXT_NOTE: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u0628\u0639\u062F \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u062A\u0639\u0637\u064A\u0644 \u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u060C \u0623\u064A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629:\u0627\u0644\u0633\u0647\u0644 \u0627\u0644\u0635\u0639\u0628 \u0627\u0644\u062C\u064A\u062F", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u0639\u0646\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 Obsidian \u0623\u0639\u062F \u062A\u0634\u063A\u064A\u0644 , command hotkeys. \u0628\u0639\u062F \u0627\u0644\u062A\u0639\u0637\u064A\u0644 \u060C \u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645", + MAX_N_DAYS_REVIEW_QUEUE: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 \u0627\u0644\u062A\u064A \u064A\u062C\u0628 \u0639\u0631\u0636\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u064A\u0645\u0646\u0649", + MIN_ONE_DAY: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 1 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644", + VALID_NUMBER_WARNING: "\u064A\u0631\u062C\u0649 \u062A\u0642\u062F\u064A\u0645 \u0631\u0642\u0645 \u0635\u0627\u0644\u062D", + UI_PREFERENCES: "\u062A\u0641\u0636\u064A\u0644\u0627\u062A \u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0634\u062C\u0631\u064A \u0644\u0644\u0631\u064F\u0632\u0645 \u0645\u0648\u0633\u0639 \u0628\u062D\u064A\u062B \u062A\u0637\u0647\u0631 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629 \u0643\u0644\u0647\u0627", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: " \u0639\u0637\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0644\u0637\u064A \u0627\u0644\u0631\u064F\u0632\u0645 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644\u0629 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 , \u0645\u0641\u064A\u062F \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0646\u062A\u0645\u064A \u0625\u0644\u0649 \u0627\u0644\u0639\u062F\u064A\u062F \u0645\u0646 \u0627\u0644\u0631\u064F\u0632\u0645 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0645\u0644\u0641", + ALGORITHM: "\u062E\u0648\u0627\u0631\u0632\u0645\u064A\u0629", + CHECK_ALGORITHM_WIKI: 'algorithm implementation :\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062A\u062D\u0642\u0642 \u0645\u0646', + BASE_EASE: "\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629", + BASE_EASE_DESC: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 130 \u060C \u0648\u064A\u0641\u0636\u0644 \u062D\u0648\u0627\u0644\u064A 250.", + BASE_EASE_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629 130 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", + LAPSE_INTERVAL_CHANGE: "\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u064A\u062A\u063A\u064A\u0631 \u0639\u0646\u062F \u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 \u0635\u0639\u0628\u0629", + LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.", + EASY_BONUS: "\u0645\u0643\u0627\u0641\u0623\u0629 \u0633\u0647\u0644\u0629", + EASY_BONUS_DESC: "\u062A\u062A\u064A\u062D \u0644\u0643 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 \u0636\u0628\u0637 \u0627\u0644\u0641\u0631\u0642 \u0641\u064A \u0627\u0644\u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0628\u064A\u0646 \u0627\u0644\u0631\u062F \u0627\u0644\u062C\u064A\u062F \u0648\u0627\u0644\u0633\u0647\u0644 \u0639\u0644\u0649 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 (\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 100 \u066A).", + EASY_BONUS_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 100 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", + MAX_INTERVAL: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644", + MAX_INTERVAL_DESC: "\u064A\u062A\u064A\u062D \u0644\u0643 \u0648\u0636\u0639 \u062D\u062F \u0623\u0639\u0644\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A (\u0627\u0641\u062A\u0631\u0627\u0636\u064A = 100 \u0639\u0627\u0645).", + MAX_INTERVAL_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0645\u062F\u0629 \u064A\u0648\u0645 \u0648\u0627\u062D\u062F \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", + MAX_LINK_CONTRIB: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0627\u0631\u062A\u0628\u0627\u0637", + MAX_LINK_CONTRIB_DESC: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0644\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0645\u0631\u062C\u062D\u0629 \u0644\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629 \u0628\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0623\u0648\u0644\u064A\u0629.", + LOGGING: "\u062A\u0633\u062C\u064A\u0644", + DISPLAY_DEBUG_INFO: "\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0635\u062D\u064A\u062D \u0639\u0644\u0649 \u0648\u062D\u062F\u0629 \u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u0637\u0648\u0631\u061F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629", + CLOSE: "\u0623\u063A\u0644\u0642", + NEW: "\u062C\u062F\u064A\u062F", + YESTERDAY: "\u0627\u0644\u0628\u0627\u0631\u062D\u0629", + TODAY: "\u0627\u0644\u064A\u0648\u0645", + TOMORROW: "\u0627\u0644\u063A\u062F", + // stats-modal.tsx + STATS_TITLE: "\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A", + MONTH: "\u0634\u0647\u0631", + QUARTER: "\u0631\u0628\u0639 \u0627\u0644\u0633\u0646\u0629", + YEAR: "\u0633\u0646\u0629", + LIFETIME: "", + FORECAST: "", + FORECAST_DESC: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 \u0641\u064A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644", + SCHEDULED: "\u0627\u0644\u0645\u0642\u0631\u0631", + DAYS: "\u0623\u064A\u0627\u0645", + NUMBER_OF_CARDS: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + REVIEWS_PER_DAY: "\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A/\u0627\u0644\u064A\u0648\u0645 ${avg} :\u0645\u062A\u0648\u0633\u0637", + INTERVALS: "\u0641\u0648\u0627\u0635\u0644 \u0632\u0645\u0646\u064A\u0629", + INTERVALS_DESC: "\u0627\u0644\u062A\u0623\u062E\u064A\u0631 \u062D\u062A\u0649 \u064A\u062A\u0645 \u0639\u0631\u0636 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A \u0645\u0631\u0629 \u0623\u062E\u0631\u0649", + COUNT: "\u0639\u062F\u062F", + INTERVALS_SUMMARY: "${longest} : \u0623\u0637\u0648\u0644 \u0641\u0627\u0635\u0644 \u0632\u0645\u0646\u064A ,${avg} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A", + EASES: "\u0627\u0644\u0633\u0647\u0648\u0644\u0629", + EASES_SUMMARY: "${avgEase} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0633\u0647\u0648\u0644\u0629", + CARD_TYPES: "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", + CARD_TYPES_DESC: "\u0648\u0647\u0630\u0627 \u064A\u0634\u0645\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0643\u0630\u0644\u0643 \u060C \u0625\u0646 \u0648\u062C\u062F\u062A", + CARD_TYPE_NEW: "\u062C\u062F\u064A\u062F\u0629", + CARD_TYPE_YOUNG: "\u0635\u063A\u064A\u0631\u0629", + CARD_TYPE_MATURE: "\u0646\u0627\u0636\u062C\u0629", + CARD_TYPES_SUMMARY: " ${totalCardsCount} :\u0625\u062C\u0645\u0627\u0644\u064A \u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A" +}; + +// src/lang/locale/cz.ts +var cz_default = { + // flashcard-modal.tsx + DECKS: "Bal\xED\u010Dky", + DUE_CARDS: "Karti\u010Dky po term\xEDnu", + NEW_CARDS: "Nov\xE9 karti\u010Dky", + TOTAL_CARDS: "Karti\u010Dek celkem", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Vynulovat pokrok karti\u010Dky", + HARD: "Te\u017Ek\xE9", + GOOD: "Dobr\xE9", + EASY: "Jednoduch\xE9", + SHOW_ANSWER: "Uk\xE1zat odpov\u011B\u010F", + CARD_PROGRESS_RESET: "Pokrok karti\u010Dky byl vynulov\xE1n.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Otev\u0159\xEDt pozn\xE1mku k revizi", + REVIEW_CARDS: "Pozn\xE1mek k revizi", + REVIEW_EASY_FILE_MENU: "Revize: Jednoduch\xE9", + REVIEW_GOOD_FILE_MENU: "Revize: Dobr\xE9", + REVIEW_HARD_FILE_MENU: "Revize: T\u011B\u017Ek\xE9", + REVIEW_NOTE_EASY_CMD: "Ozna\u010Dit pozn\xE1mku jako jednoduchou", + REVIEW_NOTE_GOOD_CMD: "Ozna\u010Dit pozn\xE1mku jako dobrou", + REVIEW_NOTE_HARD_CMD: "Ozna\u010Dit pozn\xE1mku jako te\u017Ekou", + REVIEW_ALL_CARDS: "Revidovat karti\u010Dky ve v\u0161ech pozn\xE1mk\xE1ch", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "Revidovat karti\u010Dky v t\xE9to pozn\xE1mce.", + CRAM_CARDS_IN_NOTE: "Cram karti\u010Dky v t\xE9to pozn\xE1mce.", + VIEW_STATS: "Uk\xE1zat statistiky", + STATUS_BAR: "Revize: ${dueNotesCount} pozn\xE1mek, ${dueFlashcardsCount} karti\u010Dek po term\xEDnu", + SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Pozn\xE1mka je ulo\u017Eena v ignorovan\xE9 slo\u017Ece (zkontrolujte nastaven\xED).", + PLEASE_TAG_NOTE: "Pros\xEDm ozna\u010Dne pozn\xE1mku odpov\xEDdaj\xEDc\xEDm tagem pro revizi (v nastaven\xED).", + RESPONSE_RECEIVED: "Odpov\u011B\u010F p\u0159ijata.", + NO_DECK_EXISTS: "Neexistuje \u017E\xE1dn\xFD bal\xED\u010Dek pro ${deckName}", + ALL_CAUGHT_UP: "V\u0161e zrevidov\xE1no", + // scheduling.ts + DAYS_STR_IVL: "${interval} den/dn\xED", + MONTHS_STR_IVL: "${interval} m\u011Bs\xEDc(\u016F)", + YEARS_STR_IVL: "${interval} rok(\u016F)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}r", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Nastaven\xED", + CHECK_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na wiki.', + FOLDERS_TO_IGNORE: "Ignorovan\xE9 slo\u017Eky", + FOLDERS_TO_IGNORE_DESC: "Zadejte cesty ke slo\u017Ek\xE1m odd\u011Blen\xE9 od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDkad. \u0160ablony Meta/Scripts", + FLASHCARDS: "Karti\u010Dky", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "Tag pro karti\u010Dky", + FLASHCARD_TAGS_DESC: "Zadete tagy ood\u011Blen\xE9 mezerou nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad. #karti\u010Dky #bal\xED\u010Dke2 #bal\xED\u010Dek3.", + CONVERT_FOLDERS_TO_DECKS: "P\u0159ev\xE9st slo\u017Eky na bal\xED\u010Dky a podbal\xED\u010Dky?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Toto je alternativa k tag\u016Fm karti\u010Dek viz nastaven\xED v\xFD\u0161e.", + INLINE_SCHEDULING_COMMENTS: "Ulo\u017Eit pl\xE1novac\xED koment\xE1\u0159 na stejn\xFD \u0159\xE1dek jako posledn\xED polo\u017Eka karti\u010Dky?", + INLINE_SCHEDULING_COMMENTS_DESC: "Zapnut\xED t\xE9to volby zp\u016Fsob\xED, \u017Ee HTML koment\xE1\u0159e nebudou rozb\xEDjet form\xE1tov\xE1n\xED list\u016F.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Odlo\u017Eit p\u0159\xEDbuzn\xE9 karti\u010Dky na dal\u0161\xED den?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "P\u0159\xEDbuzn\xE9 karti\u010Dky jsou karti\u010Dky generovan\xE9 z textu stejn\xE9 pozn\xE1mky nap\u0159\xEDklad cloze smaz\xE1n\xED", + SHOW_CARD_CONTEXT: "Uk\xE1zat kontext v karti\u010Dce?", + SHOW_CARD_CONTEXT_DESC: "nap\u0159\xEDklad Titulek > Nadpis1 > Podnadpis > ... > Podnadpis", + CARD_MODAL_HEIGHT_PERCENT: "V\xFD\u0161ka karti\u010Dek v procentech", + CARD_MODAL_SIZE_PERCENT_DESC: "M\u011Blo by b\xFDt nastaveno na 100% na mobilu nebo kdy\u017E pou\u017E\xEDv\xE1te velk\xE9 obr\xE1zky", + RESET_DEFAULT: "Resetovat v\xFDchoz\xED nastaven\xED", + CARD_MODAL_WIDTH_PERCENT: "\u0160\xED\u0159ka karti\u010Dek v procentech", + RANDOMIZE_CARD_ORDER: "N\xE1hodn\u011B zm\u011Bnit po\u0159ad\xED karti\u010Dek b\u011Bhem revize?", + DISABLE_CLOZE_CARDS: "Vypnout cloze karti\u010Dky?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "P\u0159ev\xE9st ==zv\xFDrazn\u011Bn\xED== na clozes?", + CONVERT_BOLD_TEXT_TO_CLOZES: "P\u0159ev\xE9st **tu\u010Dn\xFD text** na clozes?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "P\u0159ev\xE9st {{slo\u017Een\xE9 z\xE1vorky}} na clozes?", + INLINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro inline karti\u010Dky", + FIX_SEPARATORS_MANUALLY_WARNING: "Pozor. Jakmile toto zm\u011Bn\xEDte, budete muset ru\u010Dn\u011B upravit v\u0161echny existuj\xEDc\xED karti\u010Dky.", + INLINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro oto\u010Den\xE9 inline karti\u010Dky", + MULTILINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkov\xE9 karti\u010Dky", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkove oto\u010Den\xE9 karti\u010Dky", + NOTES: "Pozn\xE1mky", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Tag pro revizi", + TAGS_TO_REVIEW_DESC: "Zadejte tagy odd\u011Blen\xE9 mezerami nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "Otev\u0159\xEDt n\xE1hodnou pozn\xE1mku pro revizi", + OPEN_RANDOM_NOTE_DESC: "Pokud toto vypnete, pozn\xE1mky budou \u0159azeny dle d\u016Fle\u017Eitosti (PageRank).", + AUTO_NEXT_NOTE: "Otev\u0159\xEDt automaticky dal\u0161\xED pozn\xE1mku po dokon\u010Den\xED revize", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Vypnout volby revize v menu souboru nap\u0159\xEDklad 'Revize: Jednoduch\xE9'", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Po vypnut\xED m\u016F\u017Eete pou\u017E\xEDvat kl\xE1vesov\xE9 zkratky. Restartujte Obsidian po zm\u011Bn\u011B nastaven\xED.", + MAX_N_DAYS_REVIEW_QUEUE: "Maxim\xE1ln\xED po\u010Det dn\xED zobrazen\xFDch v prav\xE9m panelu", + MIN_ONE_DAY: "Po\u010Det dn\xED mus\xED b\xFDt minim\xE1ln\u011B 1.", + VALID_NUMBER_WARNING: "Pros\xEDm zadejte validn\xED \u010D\xEDslo.", + UI_PREFERENCES: "P\u0159edvolby u\u017Eivatelsk\xE9ho rozhran\xED", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stromy bal\xED\u010Dky by m\u011Bly b\xFDt zpo\u010D\xE1tku zobrazeny jako rozbalen\xE9", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Vypn\u011Bte toto, chcete-li sbalit vno\u0159en\xE9 bal\xED\u010Dky na stejn\xE9 kart\u011B. To je u\u017Eite\u010Dn\xE9, pokud m\xE1te karti\u010Dky, kter\xE9 pat\u0159\xED k mnoha bal\xED\u010Dk\u016Fm ve stejn\xE9m souboru.", + ALGORITHM: "Algoritmus", + CHECK_ALGORITHM_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na popis algoritmu.', + BASE_EASE: "Z\xE1kladn\xED slo\u017Eitost", + BASE_EASE_DESC: "minimum = 130, nejl\xE9pe p\u0159ibli\u017En\u011B 250.", + BASE_EASE_MIN_WARNING: "Z\xE1kladn\xED slo\u017Eitost mus\xED b\xFDt minim\xE1ln\u011B 130.", + LAPSE_INTERVAL_CHANGE: "Zm\u011Bna intervalu pokud karti\u010Dku/pozn\xE1mku ozna\u010D\xEDte jako slo\u017Eitou", + LAPSE_INTERVAL_CHANGE_DESC: "nov\xFD_inteval = star\xFD_interval * zm\u011Bna_intevalu / 100.", + EASY_BONUS: "Bonus pro jednoduch\xE9", + EASY_BONUS_DESC: "Tento bonus umo\u017E\u0148uje nastavit rozd\xEDl intervalu mezi jednoduch\xFDmi a dobr\xFDmi karti\u010Dkami/pozn\xE1mkami (minimum = 100%).", + EASY_BONUS_MIN_WARNING: "Bonus pro jednoduchost mus\xED b\xFDt minim\xE1ln\u011B 100.", + MAX_INTERVAL: "Maxim\xE1ln\xED interval", + MAX_INTERVAL_DESC: "Umo\u017E\u0148uje nastavit horn\xED limit pro interval (defaultn\u011B = 100 let).", + MAX_INTERVAL_MIN_WARNING: "Maxim\xE1ln\xED interval mus\xED b\xFDt alespo\u0148 1 den.", + MAX_LINK_CONTRIB: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bv\u011Bk prolinkov\xE1n\xED", + MAX_LINK_CONTRIB_DESC: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bvek v\xE1\u017Een\xE9 slo\u017Eitosti prolinkovan\xFDch pozn\xE1mek pou\u017Eit\xFD pro ur\u010Den\xED po\u010D\xE1te\u010Dn\xED slo\u017Eitosti.", + LOGGING: "Zaznamen\xE1v\xE1m", + DISPLAY_DEBUG_INFO: "Zobrazit informace pro lad\u011Bn\xED na v\xFDvoj\xE1\u0159sk\xE9 konzoli?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Fronta pozn\xE1mek k revizi", + CLOSE: "Uzav\u0159en\xE9", + NEW: "Nov\xE9", + YESTERDAY: "V\u010Dera", + TODAY: "Dnes", + TOMORROW: "Z\xEDtra", + // stats-modal.tsx + STATS_TITLE: "Statistiky", + MONTH: "M\u011Bs\xEDc", + QUARTER: "\u010Ctvrtlet\xED", + YEAR: "Rok", + LIFETIME: "Celkov\u011B", + FORECAST: "P\u0159edpov\u011B\u010F", + FORECAST_DESC: "Celkov\xFD po\u010Det karti\u010Dek, kter\xFDm vypr\u0161\xED term\xEDn", + SCHEDULED: "Napl\xE1nov\xE1no", + DAYS: "Dn\xED", + NUMBER_OF_CARDS: "Po\u010Det karti\u010Dek", + REVIEWS_PER_DAY: "Pr\u016Fm\u011Br: ${avg} revize/den", + INTERVALS: "Intervaly", + INTERVALS_DESC: "Doba, za kterou bude znovu zobrazeno k revize", + COUNT: "Po\u010Det", + INTERVALS_SUMMARY: "Pr\u016Fm\u011Brn\xFD interval: ${avg}, Nejdel\u0161\xED interval: ${longest}", + EASES: "Slo\u017Eitost", + EASES_SUMMARY: "Pr\u016Fm\u011Brn\xE1 slo\u017Eitost: ${avgEase}", + CARD_TYPES: "Typy karti\u010Dek", + CARD_TYPES_DESC: "Obsahuje i odlo\u017Een\xE9 karti\u010Dky (pokud existuj\xED)", + CARD_TYPE_NEW: "Nov\xE1", + CARD_TYPE_YOUNG: "Mlad\xE1", + CARD_TYPE_MATURE: "Dosp\u011Bl\xE1", + CARD_TYPES_SUMMARY: "Karti\u010Dek celkem: ${totalCardsCount}" +}; + +// src/lang/locale/bn.ts +var bn_default = {}; + +// src/lang/locale/da.ts +var da_default = {}; + +// src/lang/locale/de.ts +var de_default = { + // flashcard-modal.tsx + DECKS: "Stapel", + DUE_CARDS: "Anstehende Karten", + NEW_CARDS: "Neue Karten", + TOTAL_CARDS: "Alle Karten", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Kartenfortschritt zur\xFCcksetzten", + HARD: "Schwer", + GOOD: "Gut", + EASY: "Einfach", + SHOW_ANSWER: "Zeige Antwort", + CARD_PROGRESS_RESET: "Kartenfortschritt wurde zur\xFCckgesetzt.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Notiz zur Wiederholung \xF6ffnen", + REVIEW_CARDS: "Lernkarten wiederholen", + REVIEW_EASY_FILE_MENU: "Notiz abschliessen als: Einfach", + REVIEW_GOOD_FILE_MENU: "Notiz abschliessen als: Gut", + REVIEW_HARD_FILE_MENU: "Notiz abschliessen als: Schwer", + REVIEW_NOTE_EASY_CMD: "Notiz abschliessen als: Einfach", + REVIEW_NOTE_GOOD_CMD: "Notiz abschliessen als: Gut", + REVIEW_NOTE_HARD_CMD: "Notiz abschliessen als: Schwer", + REVIEW_ALL_CARDS: "Alle Lernkarten wiederholen", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "Lernkarten in dieser Notiz wiederholen", + CRAM_CARDS_IN_NOTE: "Lernkarten in dieser Notiz pauken.", + VIEW_STATS: "Statistiken anzeigen", + STATUS_BAR: "Wiederholung: ${dueNotesCount} Notiz(en), ${dueFlashcardsCount} Karte(n) anstehend", + SYNC_TIME_TAKEN: "Sync dauerte ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).", + PLEASE_TAG_NOTE: "Bitte die Notiz f\xFCr Wiederholungen entsprechend taggen (siehe Einstellungen).", + RESPONSE_RECEIVED: "Antwort erhalten.", + NO_DECK_EXISTS: "Kein Stapel f\xFCr ${deckName} gefunden.", + ALL_CAUGHT_UP: "Yuhu! Alles geschafft! :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} Tag(e)", + MONTHS_STR_IVL: "${interval} Monat(e)", + YEARS_STR_IVL: "${interval} Jahr(e)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Einstellungen", + CHECK_WIKI: 'Weitere Informationen gibt es im Wiki (english).', + FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner", + FOLDERS_TO_IGNORE_DESC: "Mehrere Ordner mit Zeilenumbr\xFCchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner", + FLASHCARDS: "Lernkarten", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "Lernkarten Tags", + FLASHCARD_TAGS_DESC: "Mehrere Tags mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angeben. Bsp. #karte #stapel2 #stapel3.", + CONVERT_FOLDERS_TO_DECKS: "Ordner in Stapel und Substapel umwandeln?", + CONVERT_FOLDERS_TO_DECKS_DESC: 'Eine Alternative zur oberen "Lernkarten Tags" Option.', + INLINE_SCHEDULING_COMMENTS: "Den Fortschritt in der gleichen Zeile wie die letzte Zeile einer Lernkartei speichern?", + INLINE_SCHEDULING_COMMENTS_DESC: "Wenn aktiviert, wird der HTML Kommentar die umgebende Liste nicht aufbrechen.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Verwandte Karten auf den n\xE4chsten Tag verlegen?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Verwandte Karten sind aus der gleichen Karte generiert worden (z.B. L\xFCckentextkarten oder beidseitige Karten).", + SHOW_CARD_CONTEXT: "Kontext in den Karten anzeigen?", + SHOW_CARD_CONTEXT_DESC: "Bsp. Titel > \xDCberschrift 1 > Sektion > ... > Untersektion", + CARD_MODAL_HEIGHT_PERCENT: "H\xF6he der Lernkartei in Prozent", + CARD_MODAL_SIZE_PERCENT_DESC: "Auf kleinen Bildschirmen (z.B. Smartphones) oder bei sehr grossen Bildern sollte dieser Wert auf 100% gesetzt werden.", + RESET_DEFAULT: "Standardeinstellung wiederherstellen", + CARD_MODAL_WIDTH_PERCENT: "Breite einer Lernkarte in Prozent", + RANDOMIZE_CARD_ORDER: "W\xE4hrend der Wiederhoung die Reihenfolge zuf\xE4llig mischen?", + DISABLE_CLOZE_CARDS: "L\xFCckentextkarten (cloze deletions) deaktivieren?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "==Hervorgehobenen== Text in L\xFCckentextkarten umwandeln?", + CONVERT_BOLD_TEXT_TO_CLOZES: "**Fettgedruckten** Text in L\xFCckentextkarten umwandeln?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{Geschweifte Klammern}} Text in L\xFCckentextkarten umwandeln?", + INLINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige Lernkarten", + FIX_SEPARATORS_MANUALLY_WARNING: "Wenn diese Einstellung ge\xE4ndert wird, dann m\xFCssen die entsprechenden Lernkarten manuell angepasst werden.", + INLINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige beidseitige Lernkarten", + MULTILINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige Lernkarten", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige beidseitige Lernkarten", + NOTES: "Notizen", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Zu wiederholende Tags", + TAGS_TO_REVIEW_DESC: "Mehrere Tags k\xF6nnen mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angegeben werden. Bsp. #karte #tag1 #tag2.", + OPEN_RANDOM_NOTE: "Zuf\xE4llige Karten wiederholen", + OPEN_RANDOM_NOTE_DESC: "Wenn dies deaktiviert wird, dann werden die Notizen nach Wichtigkeit wiederholt (PageRank).", + AUTO_NEXT_NOTE: "Nach einer Wiederholung automatisch die n\xE4chste Karte \xF6ffnen", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Optionen zur Wiederholung im Men\xFC einer Datei deaktivieren. Bsp. Wiederholen: Einfach Gut Schwer", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Nach dem Deaktivieren k\xF6nnen die Tastenk\xFCrzel zur Wiederholung verwendet werden. Obsidian muss nach einer \xC4nderung neu geladen weren.", + MAX_N_DAYS_REVIEW_QUEUE: "Maximale Anzahl anstehender Notizen, die im rechten Fensterbereich angezeigt werden", + MIN_ONE_DAY: "Anzahl der Tage muss mindestens 1 sein.", + VALID_NUMBER_WARNING: "Bitte eine g\xFCltige Zahl eingeben.", + UI_PREFERENCES: "Einstellungen der Benutzeroberfl\xE4che", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deckb\xE4ume sollten anf\xE4nglich erweitert angezeigt werden", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Deaktivieren Sie dies, um verschachtelte Decks in derselben Karte zu reduzieren. N\xFCtzlich, wenn Sie Karten haben, die zu vielen Decks in derselben Datei geh\xF6ren.", + ALGORITHM: "Algorithmus", + CHECK_ALGORITHM_WIKI: 'Weiterf\xFChrende Informationen: Implementierung des Algorithmus (english).', + BASE_EASE: "Basis der Einfachheit", + BASE_EASE_DESC: "Minimum ist 130. Empfohlen wird ca. 250.", + BASE_EASE_MIN_WARNING: "Basis der Einfachheit muss mindestens 130 sein.", + LAPSE_INTERVAL_CHANGE: "Anpassungsfaktor des Intervalls wenn eine Notiz / Karte 'Schwer' abgeschlossen wird", + LAPSE_INTERVAL_CHANGE_DESC: "neuesIntervall = altesIntervall * anpassungsfaktor / 100.", + EASY_BONUS: "Einfachheit-Bonus", + EASY_BONUS_DESC: "Der Einfachheit-Bonus gibt an um welchen Faktor (in Prozent) das Intervall l\xE4nger sein soll, wenn eine Notiz / Karte 'Einfach' statt 'Gut' abgeschlossen wird. Minimum ist 100%.", + EASY_BONUS_MIN_WARNING: "Der Einfachheit-Bonus muss mindestens 100 sein.", + MAX_INTERVAL: "Maximales Intervall", + MAX_INTERVAL_DESC: "Das maximale Intervall (in Tagen) f\xFCr Wiederholungen. Standard sind 100 Jahre.", + MAX_INTERVAL_MIN_WARNING: "Das maximale Interall muss mindestens ein Tag sein.", + MAX_LINK_CONTRIB: "Maximaler Einfluss von Links", + MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.", + LOGGING: "Logging", + DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", + CLOSE: "Schliessen", + NEW: "Neu", + YESTERDAY: "Gestern", + TODAY: "Heute", + TOMORROW: "Morgen", + // stats-modal.tsx + STATS_TITLE: "Statistiken", + MONTH: "Month", + QUARTER: "Quarter", + YEAR: "Year", + LIFETIME: "Lifetime", + FORECAST: "Prognose", + FORECAST_DESC: "Anzahl der k\xFCnftig anstehenden Karten", + SCHEDULED: "Anstehend", + DAYS: "Tage", + NUMBER_OF_CARDS: "Anzahl der Karten", + REVIEWS_PER_DAY: "Durchschnitt: ${avg} Wiederholungen/Tag", + INTERVALS: "Intervalle", + INTERVALS_DESC: "Intervalle bis Wiederholungen anstehen", + COUNT: "Anzahl", + INTERVALS_SUMMARY: "Durchschnittliches Intervall: ${avg}, L\xE4ngstes Intervall: ${longest}", + EASES: "Einfachheit", + EASES_SUMMARY: "Durchschnittliche Einfachheit: ${avgEase}", + CARD_TYPES: "Kategorisierung", + CARD_TYPES_DESC: "Verlegte Karten eingeschlossen", + CARD_TYPE_NEW: "Neu", + CARD_TYPE_YOUNG: "Jung", + CARD_TYPE_MATURE: "Ausgereift", + CARD_TYPES_SUMMARY: "Insgesamt ${totalCardsCount} Karten" +}; + +// src/lang/locale/en.ts +var en_default = { + // flashcard-modal.tsx + DECKS: "Decks", + DUE_CARDS: "Due Cards", + NEW_CARDS: "New Cards", + TOTAL_CARDS: "Total Cards", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Reset card's progress", + HARD: "Hard", + GOOD: "Good", + EASY: "Easy", + SHOW_ANSWER: "Show Answer", + CARD_PROGRESS_RESET: "Card's progress has been reset.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Open a note for review", + REVIEW_CARDS: "Review flashcards", + REVIEW_EASY_FILE_MENU: "Review: Easy", + REVIEW_GOOD_FILE_MENU: "Review: Good", + REVIEW_HARD_FILE_MENU: "Review: Hard", + REVIEW_NOTE_EASY_CMD: "Review note as easy", + REVIEW_NOTE_GOOD_CMD: "Review note as good", + REVIEW_NOTE_HARD_CMD: "Review note as hard", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_ALL_CARDS: "Review flashcards from all notes", + REVIEW_CARDS_IN_NOTE: "Review flashcards in this note", + CRAM_CARDS_IN_NOTE: "Cram flashcards in this note", + VIEW_STATS: "View statistics", + STATUS_BAR: "Review: ${dueNotesCount} note(s), ${dueFlashcardsCount} card(s) due", + SYNC_TIME_TAKEN: "Sync took ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Note is saved under ignored folder (check settings).", + PLEASE_TAG_NOTE: "Please tag the note appropriately for reviewing (in settings).", + RESPONSE_RECEIVED: "Response received.", + NO_DECK_EXISTS: "No deck exists for ${deckName}", + ALL_CAUGHT_UP: "You're all caught up now :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} day(s)", + MONTHS_STR_IVL: "${interval} month(s)", + YEARS_STR_IVL: "${interval} year(s)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", + CHECK_WIKI: 'For more information, check the wiki.', + FOLDERS_TO_IGNORE: "Folders to ignore", + FOLDERS_TO_IGNORE_DESC: "Enter folder paths separated by newlines i.e. Templates Meta/Scripts", + FLASHCARDS: "Flashcards", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "Flashcard tags", + FLASHCARD_TAGS_DESC: "Enter tags separated by spaces or newlines i.e. #flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "Convert folders to decks and subdecks?", + CONVERT_FOLDERS_TO_DECKS_DESC: "This is an alternative to the Flashcard tags option above.", + INLINE_SCHEDULING_COMMENTS: "Save scheduling comment on the same line as the flashcard's last line?", + INLINE_SCHEDULING_COMMENTS_DESC: "Turning this on will make the HTML comments not break list formatting.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Bury sibling cards until the next day?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Siblings are cards generated from the same card text i.e. cloze deletions", + SHOW_CARD_CONTEXT: "Show context in cards?", + SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", + CARD_MODAL_HEIGHT_PERCENT: "Flashcard Height Percentage", + CARD_MODAL_SIZE_PERCENT_DESC: "Should be set to 100% on mobile or if you have very large images", + RESET_DEFAULT: "Reset to default", + CARD_MODAL_WIDTH_PERCENT: "Flashcard Width Percentage", + RANDOMIZE_CARD_ORDER: "Randomize card order during review?", + DISABLE_CLOZE_CARDS: "Disable cloze cards?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?", + INLINE_CARDS_SEPARATOR: "Separator for inline flashcards", + FIX_SEPARATORS_MANUALLY_WARNING: "Note that after changing this you have to manually edit any flashcards you already have.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separator for inline reversed flashcards", + MULTILINE_CARDS_SEPARATOR: "Separator for multiline flashcards", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator for multiline reversed flashcards", + NOTES: "Notes", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Tags to review", + TAGS_TO_REVIEW_DESC: "Enter tags separated by spaces or newlines i.e. #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "Open a random note for review", + OPEN_RANDOM_NOTE_DESC: "When you turn this off, notes are ordered by importance (PageRank).", + AUTO_NEXT_NOTE: "Open next note automatically after a review", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Disable review options in the file menu i.e. Review: Easy Good Hard", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "After disabling, you can review using the command hotkeys. Reload Obsidian after changing this.", + MAX_N_DAYS_REVIEW_QUEUE: "Maximum number of days to display on right panel", + MIN_ONE_DAY: "The number of days must be at least 1.", + VALID_NUMBER_WARNING: "Please provide a valid number.", + UI_PREFERENCES: "UI Preferences", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deck trees should be initially displayed as expanded", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Turn this off to collapse nested decks in the same card. Useful if you have cards which belong to many decks in the same file.", + ALGORITHM: "Algorithm", + CHECK_ALGORITHM_WIKI: 'For more information, check the algorithm implementation.', + BASE_EASE: "Base ease", + BASE_EASE_DESC: "minimum = 130, preferrably approximately 250.", + BASE_EASE_MIN_WARNING: "The base ease must be at least 130.", + LAPSE_INTERVAL_CHANGE: "Interval change when you review a flashcard/note as hard", + LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.", + EASY_BONUS: "Easy Bonus", + EASY_BONUS_DESC: "The easy bonus allows you to set the difference in intervals between answering Good and Easy on a flashcard/note (minimum = 100%).", + EASY_BONUS_MIN_WARNING: "The easy bonus must be at least 100.", + MAX_INTERVAL: "Maximum Interval", + MAX_INTERVAL_DESC: "Allows you to place an upper limit on the interval (default = 100 years).", + MAX_INTERVAL_MIN_WARNING: "The maximum interval must be at least 1 day.", + MAX_LINK_CONTRIB: "Maximum link contribution", + MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", + LOGGING: "Logging", + DISPLAY_DEBUG_INFO: "Display debugging information on the developer console?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Notes Review Queue", + CLOSE: "Close", + NEW: "New", + YESTERDAY: "Yesterday", + TODAY: "Today", + TOMORROW: "Tomorrow", + // stats-modal.tsx + STATS_TITLE: "Statistics", + MONTH: "Month", + QUARTER: "Quarter", + YEAR: "Year", + LIFETIME: "Lifetime", + FORECAST: "Forecast", + FORECAST_DESC: "The number of cards due in the future", + SCHEDULED: "Scheduled", + DAYS: "Days", + NUMBER_OF_CARDS: "Number of cards", + REVIEWS_PER_DAY: "Average: ${avg} reviews/day", + INTERVALS: "Intervals", + INTERVALS_DESC: "Delays until reviews are shown again", + COUNT: "Count", + INTERVALS_SUMMARY: "Average interval: ${avg}, Longest interval: ${longest}", + EASES: "Eases", + EASES_SUMMARY: "Average ease: ${avgEase}", + CARD_TYPES: "Card Types", + CARD_TYPES_DESC: "This includes buried cards as well, if any", + CARD_TYPE_NEW: "New", + CARD_TYPE_YOUNG: "Young", + CARD_TYPE_MATURE: "Mature", + CARD_TYPES_SUMMARY: "Total cards: ${totalCardsCount}" +}; + +// src/lang/locale/en-gb.ts +var en_gb_default = {}; + +// src/lang/locale/es.ts +var es_default = {}; + +// src/lang/locale/fr.ts +var fr_default = {}; + +// src/lang/locale/hi.ts +var hi_default = {}; + +// src/lang/locale/id.ts +var id_default = {}; + +// src/lang/locale/it.ts +var it_default = {}; + +// src/lang/locale/ja.ts +var ja_default = { + // flashcard-modal.tsx + DECKS: "\u30C7\u30C3\u30AD", + DUE_CARDS: "\u671F\u65E5\u306E\u30AB\u30FC\u30C9", + NEW_CARDS: "\u65B0\u898F\u306E\u30AB\u30FC\u30C9", + TOTAL_CARDS: "\u30AB\u30FC\u30C9\u5408\u8A08", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u3092\u30EA\u30BB\u30C3\u30C8", + HARD: "Hard", + GOOD: "Good", + EASY: "Easy", + SHOW_ANSWER: "\u89E3\u7B54\u3092\u8868\u793A", + CARD_PROGRESS_RESET: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u304C\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F\u3002", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u30CE\u30FC\u30C8\u3092\u958B\u304F", + REVIEW_CARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u30EC\u30D3\u30E5\u30FC", + REVIEW_EASY_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Easy", + REVIEW_GOOD_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Good", + REVIEW_HARD_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Hard", + REVIEW_NOTE_EASY_CMD: "\u30CE\u30FC\u30C8\u3092Easy\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + REVIEW_NOTE_GOOD_CMD: "\u30CE\u30FC\u30C8\u3092Good\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + REVIEW_NOTE_HARD_CMD: "\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + REVIEW_ALL_CARDS: "\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C8\u304B\u3089\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + CRAM_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u8A70\u3081\u8FBC\u307F\u5B66\u7FD2\u3059\u308B", + VIEW_STATS: "\u7D71\u8A08\u3092\u95B2\u89A7\u3059\u308B", + STATUS_BAR: "\u30EC\u30D3\u30E5\u30FC: ${dueNotesCount}\u30CE\u30FC\u30C8, ${dueFlashcardsCount}\u30AB\u30FC\u30C9\u304C\u671F\u65E5", + SYNC_TIME_TAKEN: "\u540C\u671F\u306B${t}ms\u304B\u304B\u308A\u307E\u3057\u305F\u3002", + NOTE_IN_IGNORED_FOLDER: "\u30CE\u30FC\u30C8\u304C\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002", + PLEASE_TAG_NOTE: "\u30EC\u30D3\u30E5\u30FC\u3092\u884C\u3046\u306B\u306F\u30CE\u30FC\u30C8\u306B\u5BFE\u3057\u3066\u6B63\u3057\u304F\u30BF\u30B0\u4ED8\u3051\u3057\u3066\u304F\u3060\u3055\u3044(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002", + RESPONSE_RECEIVED: "\u7B54\u3048\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002", + NO_DECK_EXISTS: "${deckName}\u306B\u306F\u30C7\u30C3\u30AD\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002", + ALL_CAUGHT_UP: "\u4ECA\u65E5\u306E\u8AB2\u984C\u3092\u3059\u3079\u3066\u9054\u6210\u3057\u307E\u3057\u305F :D", + // scheduling.ts + DAYS_STR_IVL: "${interval}\u65E5\u5F8C", + MONTHS_STR_IVL: "${interval}\u6708\u5F8C", + YEARS_STR_IVL: "${interval}\u5E74\u5F8C", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - \u8A2D\u5B9A", + CHECK_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306Fwiki\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002', + FOLDERS_TO_IGNORE: "\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0", + FOLDERS_TO_IGNORE_DESC: '\u30D5\u30A9\u30EB\u30C0\u30D1\u30B9\u3092\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"Templates Meta/Scripts" \u306E\u3088\u3046\u306A\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u533A\u5207\u308A\u3067\u306E\u66F8\u304D\u65B9\u306F\u7121\u52B9\u3067\u3059\u3002', + FLASHCARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0", + FLASHCARD_TAGS_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#flashcards #deck2 #deck3"', + CONVERT_FOLDERS_TO_DECKS: "\u30D5\u30A9\u30EB\u30C0\u3092\u30C7\u30C3\u30AD\u3068\u30B5\u30D6\u30C7\u30C3\u30AD\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u3053\u308C\u306F\u4E0A\u8A18\u306E\u30BF\u30B0\u3092\u4F7F\u7528\u3057\u305F\u30C7\u30C3\u30AD\u69CB\u7BC9\u306E\u4EE3\u66FF\u3068\u306A\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3059\u3002", + INLINE_SCHEDULING_COMMENTS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6700\u7D42\u884C\u3068\u540C\u4E00\u306E\u884C\u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u30B3\u30E1\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F", + INLINE_SCHEDULING_COMMENTS_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001HTML\u30B3\u30E1\u30F3\u30C8\u306B\u3088\u3063\u3066Markdown\u306E\u30EA\u30B9\u30C8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u5D29\u308C\u306A\u304F\u306A\u308A\u307E\u3059\u3002", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u307E\u3067\u30B7\u30D6\u30EA\u30F3\u30B0\u3092\u5EF6\u671F\u3057\u307E\u3059\u304B\uFF1F", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u30B7\u30D6\u30EA\u30F3\u30B0\u306F\u540C\u4E00\u306E\u30AB\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u304B\u3089\u751F\u6210\u3055\u308C\u305F\u30AB\u30FC\u30C9\u3001\u3064\u307E\u308A\u7A74\u57CB\u3081\u554F\u984C\u306E\u6D3E\u751F\u30AB\u30FC\u30C9\u3067\u3059\u3002", + SHOW_CARD_CONTEXT: "\u30AB\u30FC\u30C9\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F", + SHOW_CARD_CONTEXT_DESC: "\uFF62\u30BF\u30A4\u30C8\u30EB > \u898B\u51FA\u3057 1 > \u526F\u898B\u51FA\u3057 > ... > \u526F\u898B\u51FA\u3057\uFF63\u306E\u8868\u793A\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002", + CARD_MODAL_HEIGHT_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u7E26\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8", + CARD_MODAL_SIZE_PERCENT_DESC: "\u30E2\u30D0\u30A4\u30EB\u7248\u3001\u307E\u305F\u306F\u975E\u5E38\u306B\u5927\u304D\u306A\u30B5\u30A4\u30BA\u306E\u753B\u50CF\u304C\u3042\u308B\u5834\u5408\u306B\u306F100%\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002", + RESET_DEFAULT: "\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306B\u30EA\u30BB\u30C3\u30C8\u3059\u308B", + CARD_MODAL_WIDTH_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6A2A\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8", + RANDOMIZE_CARD_ORDER: "\u30EC\u30D3\u30E5\u30FC\u4E2D\u306E\u30AB\u30FC\u30C9\u306E\u9806\u756A\u3092\u30E9\u30F3\u30C0\u30E0\u306B\u3057\u307E\u3059\u304B\uFF1F", + DISABLE_CLOZE_CARDS: "\u7A74\u57CB\u3081\u30AB\u30FC\u30C9\u3092\u7121\u52B9\u5316\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_HIGHLIGHTS_TO_CLOZES: "==\u30CF\u30A4\u30E9\u30A4\u30C8==\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_BOLD_TEXT_TO_CLOZES: "**\u30DC\u30FC\u30EB\u30C9\u4F53**\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{\u4E2D\u62EC\u5F27}}\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", + INLINE_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + FIX_SEPARATORS_MANUALLY_WARNING: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3059\u308B\u5834\u5408\u306B\u306F\u3001\u4F5C\u6210\u6E08\u307F\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u624B\u52D5\u3067\u7DE8\u96C6\u3057\u76F4\u3059\u5FC5\u8981\u304C\u3042\u308B\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + INLINE_REVERSED_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + MULTILINE_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", + NOTES: "\u30CE\u30FC\u30C8", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0", + TAGS_TO_REVIEW_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#review #tag2 #tag3"', + OPEN_RANDOM_NOTE: "\u30E9\u30F3\u30C0\u30E0\u306B\u30CE\u30FC\u30C8\u3092\u958B\u3044\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", + OPEN_RANDOM_NOTE_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u308B\u72B6\u614B\u3067\u306F\u3001\u30CE\u30FC\u30C8\u306F\u91CD\u8981\u5EA6(\u30DA\u30FC\u30B8\u30E9\u30F3\u30AF)\u306B\u3088\u308B\u9806\u756A\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002", + AUTO_NEXT_NOTE: "\u30EC\u30D3\u30E5\u30FC\u5F8C\u306B\u6B21\u306E\u30CE\u30FC\u30C8\u3092\u81EA\u52D5\u7684\u306B\u958B\u304F", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u30D5\u30A1\u30A4\u30EB\u30E1\u30CB\u30E5\u30FC\u3067\u306E\u30EC\u30D3\u30E5\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u5316(\uFF62\u30EC\u30D3\u30E5\u30FC: Easy\uFF63\u7B49\u306E\u9805\u76EE\u3092\u975E\u8868\u793A\u306B\u3059\u308B)", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u7121\u52B9\u5316\u3057\u305F\u5F8C\u3001\u30B3\u30DE\u30F3\u30C9\u30DB\u30C3\u30C8\u30AD\u30FC\u3092\u4F7F\u3063\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u3053\u3068\u304C\u53EF\u80FD\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3057\u305F\u5834\u5408\u306B\u306FObsidian\u3092\u30EA\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u30D1\u30CD\u30EB\u306B\u8868\u793A\u3059\u308B\u6700\u5927\u306E\u65E5\u6570", + MIN_ONE_DAY: "\u65E5\u6570\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + VALID_NUMBER_WARNING: "\u6709\u52B9\u306A\u6570\u5B57\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + UI_PREFERENCES: "\u30E6\u30FC\u30B6\u30FC \u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u306E\u8A2D\u5B9A", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u30C7\u30C3\u30AD \u30C4\u30EA\u30FC\u306F\u6700\u521D\u306F\u5C55\u958B\u3057\u3066\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u3053\u308C\u3092\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u540C\u3058\u30AB\u30FC\u30C9\u5185\u306E\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30C7\u30C3\u30AD\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u307E\u3059\u3002\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u306B\u591A\u304F\u306E\u30C7\u30C3\u30AD\u306B\u5C5E\u3059\u308B\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u4FBF\u5229\u3067\u3059\u3002", + ALGORITHM: "\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0", + CHECK_ALGORITHM_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u5B9F\u88C5\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002', + BASE_EASE: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055", + BASE_EASE_DESC: "\u6700\u5C0F\u5024\u306F130\u3067\u3059\u304C\u3001 \u9069\u6B63\u5024\u306F\u304A\u304A\u3088\u305D250\u3067\u3059\u3002", + BASE_EASE_MIN_WARNING: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055\u306B\u306F130\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + LAPSE_INTERVAL_CHANGE: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3057\u305F\u969B\u306E\u9593\u9694\u5909\u66F4", + LAPSE_INTERVAL_CHANGE_DESC: '"\u65B0\u3057\u3044\u9593\u9694 = \u4EE5\u524D\u306E\u9593\u9694 * \u9593\u9694\u5909\u66F4 / 100" \u3068\u3057\u3066\u8A08\u7B97\u3055\u308C\u307E\u3059\u3002', + EASY_BONUS: "Easy\u30DC\u30FC\u30CA\u30B9", + EASY_BONUS_DESC: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u3088\u3063\u3066\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u306B\u304A\u3051\u308B\u9593\u9694\u306E\u5DEE\u5206\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059(\u6700\u5C0F\u5024 = 100%)\u3002", + EASY_BONUS_MIN_WARNING: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u306F100\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + MAX_INTERVAL: "\u9593\u9694\u306E\u6700\u5927\u5024", + MAX_INTERVAL_DESC: "\u9593\u9694\u306B\u4E0A\u9650\u5024\u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8\u5024 = 100\u5E74)\u3002", + MAX_INTERVAL_MIN_WARNING: "\u9593\u9694\u306E\u6700\u5927\u5024\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + MAX_LINK_CONTRIB: "\u30EA\u30F3\u30AF\u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u306E\u6700\u5927\u5024", + MAX_LINK_CONTRIB_DESC: "\u6700\u521D\u306E\u6613\u3057\u3055\u306B\u5BFE\u3057\u3066\u3001\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306E\u91CD\u307F\u4ED8\u3051\u3055\u308C\u305F\u6613\u3057\u3055\u304C\u5BC4\u4E0E\u3059\u308B\u6700\u5927\u5024\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", + LOGGING: "\u30ED\u30B0\u7BA1\u7406", + DISPLAY_DEBUG_INFO: "\u30C7\u30D9\u30ED\u30C3\u30D1\u30FC\u30B3\u30F3\u30BD\u30FC\u30EB\u306B\u3066\u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u30CE\u30FC\u30C8\u30EC\u30D3\u30E5\u30FC\u306E\u30AD\u30E5\u30FC", + CLOSE: "\u9589\u3058\u308B", + NEW: "\u65B0\u898F", + YESTERDAY: "\u6628\u65E5", + TODAY: "\u4ECA\u65E5", + TOMORROW: "\u660E\u65E5", + // stats-modal.tsx + STATS_TITLE: "\u7D71\u8A08", + MONTH: "Month", + QUARTER: "Quarter", + YEAR: "Year", + LIFETIME: "Lifetime", + FORECAST: "\u4E88\u6E2C", + FORECAST_DESC: "\u5FA9\u7FD2\u671F\u65E5\u304C\u6765\u308B\u30AB\u30FC\u30C9\u306E\u679A\u6570", + SCHEDULED: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u6E08\u307F", + DAYS: "\u65E5", + NUMBER_OF_CARDS: "\u30AB\u30FC\u30C9\u6570", + REVIEWS_PER_DAY: "\u5E73\u5747: ${avg}\u30EC\u30D3\u30E5\u30FC/\u65E5", + INTERVALS: "\u9593\u9694", + INTERVALS_DESC: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u4E88\u5B9A\u65E5", + COUNT: "\u30AB\u30A6\u30F3\u30C8", + INTERVALS_SUMMARY: "\u9593\u9694\u306E\u5E73\u5747\u5024: ${avg}, \u6700\u9577\u306E\u9593\u9694: ${longest}", + EASES: "\u6613\u3057\u3055", + EASES_SUMMARY: "\u6613\u3057\u3055\u306E\u5E73\u5747\u5024: ${avgEase}", + CARD_TYPES: "\u30AB\u30FC\u30C9\u30BF\u30A4\u30D7", + CARD_TYPES_DESC: "\u5EF6\u671F\u306E\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u306F\u3053\u308C\u306B\u542B\u307E\u308C\u307E\u3059", + CARD_TYPE_NEW: "\u65B0\u898F", + CARD_TYPE_YOUNG: "\u5FA9\u7FD2(\u521D\u671F)", + CARD_TYPE_MATURE: "\u5FA9\u7FD2(\u5F8C\u671F)", + CARD_TYPES_SUMMARY: "\u30AB\u30FC\u30C9\u306E\u5408\u8A08: ${totalCardsCount}\u679A" +}; + +// src/lang/locale/ko.ts +var ko_default = { + // flashcard-modal.tsx + DECKS: "\uB371", + DUE_CARDS: "\uB2E4\uC2DC \uBCFC \uCE74\uB4DC\uB4E4", + NEW_CARDS: "\uC0C8\uB85C\uC6B4 \uCE74\uB4DC\uB4E4", + TOTAL_CARDS: "\uC804\uCCB4 \uCE74\uB4DC\uB4E4", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.", + HARD: "\uC5B4\uB824\uC6C0(Hard)", + GOOD: "\uC88B\uC74C(Good)", + EASY: "\uC26C\uC6C0(Easy)", + SHOW_ANSWER: "\uC815\uB2F5 \uD655\uC778\uD558\uAE30", + CARD_PROGRESS_RESET: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uC5F4\uAE30", + REVIEW_CARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB9AC\uBDF0", + REVIEW_EASY_FILE_MENU: "\uB9AC\uBDF0: \uC26C\uC6C0(Easy)", + REVIEW_GOOD_FILE_MENU: "\uB9AC\uBDF0: \uC88B\uC74C(Good)", + REVIEW_HARD_FILE_MENU: "\uB9AC\uBDF0: \uC5B4\uB824\uC6C0(Hard)", + REVIEW_NOTE_EASY_CMD: "\uB178\uD2B8\uB97C \uC26C\uC6C0(easy)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + REVIEW_NOTE_GOOD_CMD: "\uB178\uD2B8\uB97C \uC88B\uC74C(good)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + REVIEW_NOTE_HARD_CMD: "\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(hard)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + REVIEW_ALL_CARDS: "\uBAA8\uB4E0 \uB178\uD2B8\uB4E4\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4", + CRAM_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uBCBC\uB77D\uCE58\uAE30\uD569\uB2C8\uB2E4.", + VIEW_STATS: "\uD1B5\uACC4 \uD655\uC778", + STATUS_BAR: "--\uB9AC\uBDF0: ${dueNotesCount} \uB178\uD2B8, ${dueFlashcardsCount} \uCE74\uB4DC \uB0A8\uC558\uC2B5\uB2C8\uB2E4.", + SYNC_TIME_TAKEN: "\uB3D9\uAE30\uD654\uC5D0 ${t}\uBC00\uB9AC\uCD08 \uAC78\uB838\uC2B5\uB2C8\uB2E4", + NOTE_IN_IGNORED_FOLDER: "\uB178\uD2B8\uAC00 \uBB34\uC2DC\uB41C \uD3F4\uB354 \uC544\uB798\uC5D0 \uC800\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)", + PLEASE_TAG_NOTE: "\uB9AC\uBDF0\uB97C \uD558\uAE30\uC704\uD574 \uB178\uD2B8\uC5D0 \uC801\uC808\uD788 \uD0DC\uADF8\uD574\uC8FC\uC138\uC694. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)", + RESPONSE_RECEIVED: "\uC694\uCCAD\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4", + NO_DECK_EXISTS: "${deckName}\uC774\uB77C\uB294 \uC774\uB984\uC758 \uB371\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + ALL_CAUGHT_UP: "\uBAA8\uB450 \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4. :D", + // scheduling.ts + DAYS_STR_IVL: "${interval} \uC77C \uD6C4", + MONTHS_STR_IVL: "${interval} \uAC1C\uC6D4 \uD6C4", + YEARS_STR_IVL: "${interval} \uB144 \uD6C4", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}y", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition Plugin - \uC124\uC815", + CHECK_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, wiki\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.', + FOLDERS_TO_IGNORE: "\uBB34\uC2DC\uD560 \uD3F4\uB354\uB4E4", + FOLDERS_TO_IGNORE_DESC: "\uD3F4\uB354 \uACBD\uB85C\uB97C \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. 'Templates Meta/Scripts' \uC640 \uAC19\uC774 \uC785\uB825\uD558\uB294 \uAC83\uC740 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + FLASHCARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8", + FLASHCARD_TAGS_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#flashcards #deck2 #deck3'", + CONVERT_FOLDERS_TO_DECKS: "\uD3F4\uB354\uB97C \uB371\uACFC \uC11C\uBE0C\uB371\uC73C\uB85C \uC0AC\uC6A9\uD560\uAE4C\uC694?", + CONVERT_FOLDERS_TO_DECKS_DESC: "\uC774 \uAE30\uB2A5\uC740 \uC704\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8 \uC635\uC158\uC744 \uB300\uCCB4\uD569\uB2C8\uB2E4.", + INLINE_SCHEDULING_COMMENTS: "\uD50C\uB798\uC2DC\uCE74\uB4DC\uC758 \uB9C8\uC9C0\uB9C9 \uC904\uACFC \uB3D9\uC77C\uD55C \uC904\uC5D0 \uC2A4\uCF00\uC904\uB9C1 \uCF54\uBA58\uD2B8\uB97C \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + INLINE_SCHEDULING_COMMENTS_DESC: "\uC774 \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 HTML \uC8FC\uC11D\uC774 \uBAA9\uB85D\uC758 \uD3EC\uB9E4\uD305\uC744 \uBB34\uB108\uD2B8\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Sibling \uCE74\uB4DC\uB97C \uB2E4\uC74C\uB0A0\uAE4C\uC9C0 \uBB3B\uC5B4\uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Sibling \uCE74\uB4DC\uB294 \uB3D9\uC77C\uD55C \uCE74\uB4DC \uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC0DD\uC131\uB41C \uCE74\uB4DC\uC785\uB2C8\uB2E4. i.e. cloze deletions", + SHOW_CARD_CONTEXT: "\uCE74\uB4DC\uC758 \uBB38\uB9E5(context)\uC744 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + SHOW_CARD_CONTEXT_DESC: "\uCE74\uB4DC\uC5D0\uC11C 'Title > Heading 1 > Subheading > ... > Subheading' \uC758 \uD45C\uC2DC\uB97C \uD560\uC9C0 \uC124\uC815\uD569\uB2C8\uB2E4.", + CARD_MODAL_HEIGHT_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB192\uC774 \uBE44\uC728", + CARD_MODAL_SIZE_PERCENT_DESC: "\uBAA8\uBC14\uC77C \uBC84\uC804 \uD639\uC740 \uB9E4\uC6B0 \uD070 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uACBD\uC6B0 100%\uB85C \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.", + RESET_DEFAULT: "\uAE30\uBCF8\uAC12\uC73C\uB85C \uCD08\uAE30\uD654", + CARD_MODAL_WIDTH_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB108\uBE44 \uBE44\uC728", + RANDOMIZE_CARD_ORDER: "\uB9AC\uBDF0\uC911\uC778 \uCE74\uB4DC\uC758 \uC21C\uC11C\uB97C \uB79C\uB364\uC73C\uB85C \uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + DISABLE_CLOZE_CARDS: "\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uCE74\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "==hightlights== \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + CONVERT_BOLD_TEXT_TO_CLOZES: "**bolded text** \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{curly brackets}} \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + INLINE_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + FIX_SEPARATORS_MANUALLY_WARNING: "\uC8FC\uC758: \uC774 \uC635\uC158\uC744 \uC218\uC815\uD55C \uD6C4\uC5D0\uB294 \uC774\uBBF8 \uC791\uC131\uB41C \uD50C\uB798\uC2DC\uCE74\uB4DC\uB97C \uC218\uB3D9\uC73C\uB85C \uC218\uC815\uD574\uC57C \uD568\uC744 \uC8FC\uC758\uD558\uC2ED\uC2DC\uC624.", + INLINE_REVERSED_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + MULTILINE_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", + NOTES: "\uB178\uD2B8", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "\uB9AC\uBDF0\uC5D0 \uC0AC\uC6A9\uD560 \uD0DC\uADF8", + TAGS_TO_REVIEW_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#review #tag2 #tag3'", + OPEN_RANDOM_NOTE: "\uB9AC\uBDF0\uB97C \uC704\uD574 \uB79C\uB364 \uB178\uD2B8\uB97C \uC5FD\uB2C8\uB2E4.", + OPEN_RANDOM_NOTE_DESC: "\uC774 \uC635\uC158\uC774 \uAEBC\uC838\uC788\uC73C\uBA74, \uB178\uD2B8\uB294 \uC911\uC694\uB3C4(\uD398\uC774\uC9C0 \uB7AD\uD06C)\uC5D0 \uB530\uB77C \uC815\uB82C\uB429\uB2C8\uB2E4.", + AUTO_NEXT_NOTE: "\uB9AC\uBDF0 \uD6C4\uC5D0 \uB2E4\uC74C \uB178\uD2B8\uB97C \uC790\uB3D9\uC73C\uB85C \uC5FD\uB2C8\uB2E4.", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\uD30C\uC77C \uBA54\uB274\uC5D0\uC11C\uC758 \uB9AC\uBDF0 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD569\uB2C8\uB2E4. \uC608) \uB9AC\uBDF0: Easy Good Hard", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\uC774 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD55C \uD6C4, \uBA85\uB839 \uB2E8\uCD95\uD0A4\uB97C \uC774\uC6A9\uD574 \uB9AC\uBDF0\uD558\uC2E4 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC635\uC158\uC744 \uBCC0\uACBD\uD55C \uD6C4\uC5D0 \uC635\uC2DC\uB514\uC5B8\uC744 \uC0C8\uB85C\uACE0\uCE68 \uD558\uC2ED\uC2DC\uC624.", + MAX_N_DAYS_REVIEW_QUEUE: "\uC624\uB978\uCABD \uD328\uB110\uC5D0 \uD45C\uC2DC\uD560 \uCD5C\uB300 \uC77C\uC218", + MIN_ONE_DAY: "\uC801\uC5B4\uB3C4 1\uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + VALID_NUMBER_WARNING: "\uC720\uD6A8\uD55C \uC22B\uC790\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.", + UI_PREFERENCES: "\uC0AC\uC6A9\uC790 \uC778\uD130\uD398\uC774\uC2A4 \uAE30\uBCF8 \uC124\uC815", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\uB371 \uD2B8\uB9AC\uB294 \uCC98\uC74C\uC5D0 \uD655\uC7A5\uB41C \uAC83\uC73C\uB85C \uD45C\uC2DC\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\uAC19\uC740 \uCE74\uB4DC\uC5D0 \uC911\uCCA9\uB41C \uB371\uC744 \uC811\uC73C\uB824\uBA74 \uC774 \uC635\uC158\uC744 \uB044\uC2ED\uC2DC\uC624. \uAC19\uC740 \uD30C\uC77C\uC5D0 \uC5EC\uB7EC \uB371\uC5D0 \uC18D\uD55C \uCE74\uB4DC\uAC00 \uC788\uB294 \uACBD\uC6B0 \uC720\uC6A9\uD569\uB2C8\uB2E4.", + ALGORITHM: "\uC54C\uACE0\uB9AC\uC998", + CHECK_ALGORITHM_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, algorithm implementation\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.', + BASE_EASE: "\uAE30\uBCF8 ease", + BASE_EASE_DESC: "\uCD5C\uC19F\uAC12 = 130, \uC801\uC815\uCE58\uB294 \uB300\uB7B5 250\uC785\uB2C8\uB2E4.", + BASE_EASE_MIN_WARNING: "\uAE30\uBCF8 ease\uB294 \uC801\uC5B4\uB3C4 130 \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + LAPSE_INTERVAL_CHANGE: "\uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(Hard)\uC73C\uB85C \uB9AC\uBDF0\uD588\uC744 \uB54C\uC758 \uAC04\uACA9 \uBCC0\uACBD", + LAPSE_INTERVAL_CHANGE_DESC: "\uC0C8\uB85C\uC6B4 \uAC04\uACA9 = \uC774\uC804 \uAC04\uACA9 * \uAC04\uACA9\uBCC0\uACBD \uAC12 / 100.", + EASY_BONUS: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4", + EASY_BONUS_DESC: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uC5D0\uC11C \uC88B\uC74C(Good)\uACFC \uC26C\uC6C0(Easy) \uC0AC\uC774\uC758 \uAC04\uACA9 \uCC28\uC774\uB97C \uC124\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uCD5C\uC18C = 100%)", + EASY_BONUS_MIN_WARNING: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uC801\uC5B4\uB3C4 100\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + MAX_INTERVAL: "\uCD5C\uB300 \uAC04\uACA9", + MAX_INTERVAL_DESC: "\uAC04\uACA9\uC758 \uC0C1\uD55C\uC120\uC744 \uB458 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uAE30\uBCF8\uAC12 = 100\uB144)", + MAX_INTERVAL_MIN_WARNING: "\uCD5C\uB300 \uAC04\uACA9\uC740 \uC801\uC5B4\uB3C4 1\uC77C\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", + MAX_LINK_CONTRIB: "\uCD5C\uB300 \uC5F0\uACB0 \uAE30\uC5EC\uB3C4", + MAX_LINK_CONTRIB_DESC: "\uB9C1\uD06C\uB41C \uB178\uD2B8\uC758 \uCD08\uAE30 ease\uC5D0 \uB300\uD55C \uAC00\uC911\uCE58\uAC00 \uC801\uC6A9\uB41C ease\uC758 \uCD5C\uB300 \uAE30\uC5EC\uB3C4\uC785\uB2C8\uB2E4.", + LOGGING: "\uB85C\uAE45", + DISPLAY_DEBUG_INFO: "\uB514\uBC84\uAE45 \uC815\uBCF4\uB97C \uAC1C\uBC1C\uC790 \uCF58\uC194\uC5D0 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uB300\uAE30\uC5F4", + CLOSE: "\uB2EB\uAE30", + NEW: "New", + YESTERDAY: "\uC5B4\uC81C", + TODAY: "\uC624\uB298", + TOMORROW: "\uB0B4\uC77C", + // stats-modal.tsx + STATS_TITLE: "\uD1B5\uACC4", + MONTH: "\uC6D4", + QUARTER: "\uBD84\uAE30", + YEAR: "\uB144", + LIFETIME: "\uD3C9\uC0DD", + FORECAST: "\uC608\uCE21", + FORECAST_DESC: "\uC774\uD6C4\uC5D0 \uD559\uC2B5\uD560 \uCE74\uB4DC\uC758 \uC218", + SCHEDULED: "Scheduled", + DAYS: "\uC77C", + NUMBER_OF_CARDS: "\uCE74\uB4DC\uC758 \uC218", + REVIEWS_PER_DAY: "\uD3C9\uADE0: ${avg} \uB9AC\uBDF0/\uC77C", + INTERVALS: "\uAC04\uACA9", + INTERVALS_DESC: "\uB9AC\uBDF0\uB97C \uB2E4\uC2DC \uD560 \uB54C \uAE4C\uC9C0\uC758 \uAE30\uAC04", + COUNT: "Count", + INTERVALS_SUMMARY: "\uD3C9\uADE0 \uAC04\uACA9: ${avg}, \uAC00\uC7A5 \uAE34 \uAC04\uACA9: ${longest}", + EASES: "Eases", + EASES_SUMMARY: "Average ease: ${avgEase}", + CARD_TYPES: "\uCE74\uB4DC \uD0C0\uC785", + CARD_TYPES_DESC: "\uC5EC\uAE30\uC5D0\uB294 \uBB3B\uC5B4\uB454 \uCE74\uB4DC\uB3C4 \uD3EC\uD568\uB429\uB2C8\uB2E4.", + CARD_TYPE_NEW: "New", + CARD_TYPE_YOUNG: "Young", + CARD_TYPE_MATURE: "Mature", + CARD_TYPES_SUMMARY: "\uC804\uCCB4 \uCE74\uB4DC \uC218: ${totalCardsCount}" +}; + +// src/lang/locale/mr.ts +var mr_default = {}; + +// src/lang/locale/nl.ts +var nl_default = {}; + +// src/lang/locale/no.ts +var no_default = {}; + +// src/lang/locale/pl.ts +var pl_default = {}; + +// src/lang/locale/pt.ts +var pt_default = {}; + +// src/lang/locale/pt-br.ts +var pt_br_default = { + // flashcard-modal.tsx + DECKS: "Baralhos", + DUE_CARDS: "Cartas para Colocar em Dia", + NEW_CARDS: "Novas Cartas", + TOTAL_CARDS: "Total de Cartas", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "Reiniciar o Progresso da Carta", + HARD: "Dif\xEDcil", + GOOD: "OK", + EASY: "F\xE1cil", + SHOW_ANSWER: "Mostrar Resposta", + CARD_PROGRESS_RESET: "O Progresso da Carta foi reiniciado", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "Abrir uma nota para revisar", + REVIEW_CARDS: "Revisar flashcards", + REVIEW_EASY_FILE_MENU: "Revis\xE3o: F\xE1cil", + REVIEW_GOOD_FILE_MENU: "Revis\xE3o: OK", + REVIEW_HARD_FILE_MENU: "Revis\xE3o: Dif\xEDcil", + REVIEW_NOTE_EASY_CMD: "Revisar nota como f\xE1cil", + REVIEW_NOTE_GOOD_CMD: "Revisar nota como OK", + REVIEW_NOTE_HARD_CMD: "Revisar nota como dif\xEDcil", + REVIEW_ALL_CARDS: "Revisar flashcards de todas as notas", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "Revisar flashcards nessa nota", + CRAM_CARDS_IN_NOTE: "Revisar todas as flashcards nessa nota", + VIEW_STATS: "Ver estat\xEDsticas", + STATUS_BAR: "Revis\xE3o: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia", + SYNC_TIME_TAKEN: "Sicroniza\xE7\xE3o levou ${t}ms", + NOTE_IN_IGNORED_FOLDER: "Nota \xE9 salva na pasta ignorada (cheque as configura\xE7\xF5es).", + PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configura\xE7\xF5es).", + RESPONSE_RECEIVED: "Resposta recebida.", + NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}", + ALL_CAUGHT_UP: "Voc\xEA colocou tudo em prazo agora :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} dia(s)", + MONTHS_STR_IVL: "${interval} m\xEAs(es)", + YEARS_STR_IVL: "${interval} ano(s)", + DAYS_STR_IVL_MOBILE: "${interval}d", + MONTHS_STR_IVL_MOBILE: "${interval}m", + YEARS_STR_IVL_MOBILE: "${interval}a", + // settings.ts + SETTINGS_HEADER: "Plguin Spaced Repetition - Configura\xE7\xE3o", + CHECK_WIKI: 'Para mais informa\xE7\xF5es, checke o wiki.', + FOLDERS_TO_IGNORE: "Pastas para ignorar", + FOLDERS_TO_IGNORE_DESC: "Ensira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts", + FLASHCARDS: "Flashcards", + FLASHCARD_EASY_LABEL: "Texto do Bot\xE3o de F\xE1cil", + FLASHCARD_GOOD_LABEL: "Texto do Bot\xE3o de OK", + FLASHCARD_HARD_LABEL: "Texto do Bot\xE3o de Dif\xEDcil", + FLASHCARD_EASY_DESC: 'Costumize o r\xF3tulo para o bot\xE3o de "F\xE1cil"', + FLASHCARD_GOOD_DESC: 'Costumize o r\xF3tulo para o bot\xE3o de "OK"', + FLASHCARD_HARD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "Dif\xEDcil"', + FLASHCARD_TAGS: "Etiquetas dos Flashcards", + FLASHCARD_TAGS_DESC: "Ensira etiquetas separadas por espa\xE7os ou quebras de linha ex: #flashcards #baralho2 #baralho3.", + CONVERT_FOLDERS_TO_DECKS: "Converter pastas para baralhos e sub-baralhos?", + CONVERT_FOLDERS_TO_DECKS_DESC: "Isso \xE9 uma alternativa para a op\xE7\xE3o de etiqueta dos Flashcards em cima.", + INLINE_SCHEDULING_COMMENTS: "Salvar coment\xE1rios de agendamento na mesma linha que a \xFAltima linha do flashcard?", + INLINE_SCHEDULING_COMMENTS_DESC: "Ligar isso vai fazer com que os coment\xE1rios em HTML n\xE3o quebrem a formata\xE7\xE3o de listas.", + BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrar cartas irm\xE3s at\xE9 o pr\xF3ximo dia?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Cartas irm\xE3s s\xE3o geradas pelo texto da mesma carta ex: omiss\xE3o de palavras", + SHOW_CARD_CONTEXT: "Mostrar conxtexto nas cartas?", + SHOW_CARD_CONTEXT_DESC: "ex: T\xEDtulo > Cabe\xE7alho 1 > Subcabe\xE7alho > ... > Subcabe\xE7alho", + CARD_MODAL_HEIGHT_PERCENT: "Porcentagem da Altura do Flashcard", + CARD_MODAL_SIZE_PERCENT_DESC: "Deveria estar configurado em 100% em dispositivos m\xF3veis ou se voc\xEA tem imagens muito grandes", + RESET_DEFAULT: "Reiniciar para a pr\xE9-defini\xE7\xE3o", + CARD_MODAL_WIDTH_PERCENT: "Porcentagem de Largura do Flashcard", + RANDOMIZE_CARD_ORDER: "Aleatorizar a ordem das cartas durante a revis\xE3o?", + DISABLE_CLOZE_CARDS: "Desabilitar cartas que usam omiss\xE3o de palavras?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "Converter ==marca-texto== em omiss\xF5es?", + CONVERT_BOLD_TEXT_TO_CLOZES: "Converter **texto em negrito** em omiss\xF5es?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "Converter {{chaves}} em omiss\xF5es?", + INLINE_CARDS_SEPARATOR: "Separador para flashcards inline", + FIX_SEPARATORS_MANUALLY_WARNING: "Note que depois de mudar isso voc\xEA vai ter que manualmente mudar quaisquer flashcards que voc\xEA tenha.", + INLINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards inline reversos", + MULTILINE_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas", + MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas reversos", + NOTES: "Notas", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "Etiquetas para revisar", + TAGS_TO_REVIEW_DESC: "Ensira etiquetas separadas por espa\xE7os ou quebra de linhas ex: #revisar #etiqueta2 #etiqueta3.", + OPEN_RANDOM_NOTE: "Abrir uma nota aleat\xF3ria para revisar", + OPEN_RANDOM_NOTE_DESC: "Quando voc\xEA desabilitar isso, as notas v\xE3o ser ordenadas por import\xE2ncia (PageRank).", + AUTO_NEXT_NOTE: "Abrir a pr\xF3xima nota automaticamente depois de uma revis\xE3o", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "Desabilitar op\xE7\xF5es de revis\xE3o no menu de arquivos ex: Revis\xE3o: F\xE1cil OK Dif\xEDcil", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Depois de desabilitar, voc\xEA pode revisar usando os atalhos de comando. Reinicie Obsidian depois de mudar isso.", + MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de dias para exibir no painel direito", + MIN_ONE_DAY: "O n\xFAmero de dias deve ser pelo menos 1.", + VALID_NUMBER_WARNING: "Por favor ensira um n\xFAmero v\xE1lido.", + UI_PREFERENCES: "Prefer\xEAncias de UI", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\xC1rvores de baralhos devem inicialmente serem exibidas como expandidas", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desabilite isso para colapsar baralhos que est\xE3o um dentro do outro na mesma carta. \xDAtil se voc\xEA tem cartas que pertencem a muitos baralhos em um mesmo arquivo.", + ALGORITHM: "Algor\xEDtmo", + CHECK_ALGORITHM_WIKI: 'Para mais informa\xE7\xF5es, cheque a implementa\xE7\xE3o do algor\xEDtmo.', + BASE_EASE: "Facilidade base", + BASE_EASE_DESC: "m\xEDnimo = 130, preferivelmente aproximadamente 250.", + BASE_EASE_MIN_WARNING: "A facilidade base deve ser pelo menos 130.", + LAPSE_INTERVAL_CHANGE: "Mudan\xE7a de intervalo quando voc\xEA revisa um(a) flashcard/nota como dif\xEDcil", + LAPSE_INTERVAL_CHANGE_DESC: "novoIntervalo = velhoIntervalo * mudancaIntervalo / 100.", + EASY_BONUS: "B\xF4nus de F\xE1cil", + EASY_BONUS_DESC: "O b\xF4nus de f\xE1cil te permite mudar a difer\xEAncia entre intervalos de responder OK e F\xE1cil em um(a) flashcard/nota (m\xEDnimo = 100%).", + EASY_BONUS_MIN_WARNING: "O b\xF4nus de f\xE1cil deve ser pelo menos 100.", + MAX_INTERVAL: "Intervalo M\xE1ximo", + MAX_INTERVAL_DESC: "Te permite colocar um limite m\xE1ximo no intervalo (pr\xE9-defini\xE7\xE3o = 100 anos).", + MAX_INTERVAL_MIN_WARNING: "O intervalo m\xE1ximo deve ser pelo menos 1 dia.", + MAX_LINK_CONTRIB: "Contribui\xE7\xE3o M\xE1xima de Links", + MAX_LINK_CONTRIB_DESC: "Contribui\xE7\xE3o m\xE1xima da facilidade ponderada das notas linkadas \xE0 facilidade inicial.", + LOGGING: "Logging", + DISPLAY_DEBUG_INFO: "Mostrar informa\xE7\xE3o de debugging no console de desenvolvimento?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", + CLOSE: "Fechar", + NEW: "Novo", + YESTERDAY: "Ontem", + TODAY: "Hoje", + TOMORROW: "Amanh\xE3", + // stats-modal.tsx + STATS_TITLE: "Estat\xEDsticas", + MONTH: "M\xEAs", + QUARTER: "Quarto", + YEAR: "Ano", + LIFETIME: "Tempo Total", + FORECAST: "Previs\xE3o", + FORECAST_DESC: "O n\xFAmero de cartas a serem colocadas em dia no futuro", + SCHEDULED: "Agendado", + DAYS: "Dias", + NUMBER_OF_CARDS: "N\xFAmero de cartas", + REVIEWS_PER_DAY: "M\xE9dia: ${avg} revis\xF5es/dia", + INTERVALS: "Intervalos", + INTERVALS_DESC: "Atrasos at\xE9 que as revis\xF5es sejam exibidas de novo", + COUNT: "Contagem", + INTERVALS_SUMMARY: "Intervalo em m\xE9dia: ${avg}, Maior intervalo: ${longest}", + EASES: "Facilidades", + EASES_SUMMARY: "Facilidade em m\xE9dia: ${avgEase}", + CARD_TYPES: "Tipos de Cartas", + CARD_TYPES_DESC: "Isso tamb\xE9m inclui cartas enterrados, caso existam", + CARD_TYPE_NEW: "Novo", + CARD_TYPE_YOUNG: "Jovem", + CARD_TYPE_MATURE: "Amadurecido", + CARD_TYPES_SUMMARY: "Total de cartas: ${totalCardsCount}" +}; + +// src/lang/locale/ro.ts +var ro_default = {}; + +// src/lang/locale/ru.ts +var ru_default = { + // flashcard-modal.tsx + DECKS: "\u0423\u0440\u043E\u0432\u043D\u0438", + DUE_CARDS: "\u041F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + NEW_CARDS: "\u041D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + TOTAL_CARDS: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + HARD: "\u0421\u043B\u043E\u0436\u043D\u043E", + GOOD: "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E", + EASY: "\u041B\u0435\u0433\u043A\u043E", + SHOW_ANSWER: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442", + CARD_PROGRESS_RESET: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + REVIEW_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + REVIEW_EASY_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E", + REVIEW_GOOD_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E", + REVIEW_HARD_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u0421\u043B\u043E\u0436\u043D\u043E", + REVIEW_NOTE_EASY_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u041B\u0451\u0433\u043A\u0443\u044E", + REVIEW_NOTE_GOOD_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u0443\u044E", + REVIEW_NOTE_HARD_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u0421\u043B\u043E\u0436\u043D\u0443\u044E", + REVIEW_ALL_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043C\u0435\u0442\u043A\u0430\u0445", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435", + CRAM_CARDS_IN_NOTE: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435", + VIEW_STATS: "\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443", + STATUS_BAR: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C: ${dueNotesCount} \u0437\u0430\u043C\u0435\u0442\u043E\u043A(-\u043A\u0438), ${dueFlashcardsCount} \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A(-\u043A\u0438) \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u0438\u0442", + SYNC_TIME_TAKEN: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0437\u0430\u043D\u044F\u043B\u0430 ${t}\u043C\u0441", + NOTE_IN_IGNORED_FOLDER: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0432 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 (\u0441\u043C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).", + PLEASE_TAG_NOTE: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u043F\u043E\u043C\u0435\u0442\u044C\u0442\u0435 \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u043D\u0430\u0434\u043E \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F (\u0441\u043C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).", + RESPONSE_RECEIVED: "\u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0435\u043D.", + NO_DECK_EXISTS: "\u041D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u044F ${deckName}", + ALL_CAUGHT_UP: "\u0415\u0441\u0442\u044C! \u0422\u044B \u0441\u043F\u0440\u0430\u0432\u0438\u043B\u0441\u044F! :D.", + // scheduling.ts + DAYS_STR_IVL: "${interval} \u0434\u043D\u0435\u0439", + MONTHS_STR_IVL: "${interval} \u043C\u0435\u0441\u044F\u0446\u043E\u0432", + YEARS_STR_IVL: "${interval} \u0433\u043E\u0434\u0430(\u043B\u0435\u0442)", + DAYS_STR_IVL_MOBILE: "${interval}\u0434", + MONTHS_STR_IVL_MOBILE: "${interval}\u043C", + YEARS_STR_IVL_MOBILE: "${interval}\u0433", + // settings.ts + SETTINGS_HEADER: "Spaced Repetition \u041F\u043B\u0430\u0433\u0438\u043D - \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", + CHECK_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043F \u0438\u043D\u0444\u044B, \u0441\u043C\u043E\u0442\u0440\u0438 wiki. \u0421\u043A\u043E\u0440\u043E \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0432\u043E\u0434 :3', + FOLDERS_TO_IGNORE: "\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u0430\u043F\u043A\u0438", + FOLDERS_TO_IGNORE_DESC: "\u0412\u0435\u0434\u0438\u0442\u0435 \u043F\u0443\u0442\u0438 \u043F\u0430\u043F\u043E\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 enter'\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u0440: Templates Meta/Scripts", + FLASHCARDS: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + FLASHCARD_EASY_LABEL: "Easy Button Text", + FLASHCARD_GOOD_LABEL: "Good Button Text", + FLASHCARD_HARD_LABEL: "Hard Button Text", + FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', + FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', + FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', + FLASHCARD_TAGS: "\u0422\u044D\u0433\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + FLASHCARD_TAGS_DESC: "\u0412\u0435\u0434\u0438\u0442\u0435 \u0442\u044D\u0433\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 enter'\u043E\u043C \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u0440: #flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0438 \u0432 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043F\u043E\u0434\u0443\u0440\u043E\u0432\u043D\u0438?", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u042D\u0442\u043E \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u0442\u044D\u0433\u0430\u043C \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0441\u0432\u0435\u0440\u0445\u0443.", + INLINE_SCHEDULING_COMMENTS: "\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0435 \u043F\u043E\u0441\u043B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A?", + INLINE_SCHEDULING_COMMENTS_DESC: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u0441\u0434\u0435\u043B\u0430\u0435\u0442 \u0442\u0430\u043A, \u0447\u0442\u043E HTML \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043B\u043E\u043C\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043F\u0438\u0441\u043A\u0430.", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u041F\u0440\u044F\u0442\u0430\u0442\u044C \u0440\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0434\u043E \u0441\u043B\u0435\u0434. \u0434\u043D\u044F?", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u0420\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 - \u0442\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u044B \u0438\u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438([...])", + SHOW_CARD_CONTEXT: "\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442(\u0443\u0440\u043E\u0432\u0435\u043D\u044C) \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430\u0445(\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F)?", + SHOW_CARD_CONTEXT_DESC: "\u043F\u0440\u0438\u043C\u0435\u0440: Title > Heading 1 > Subheading > ... > Subheading", + CARD_MODAL_HEIGHT_PERCENT: "\u0412\u044B\u0441\u043E\u0442\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445", + CARD_MODAL_SIZE_PERCENT_DESC: "\u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435\u0441\u044C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u043E\u043C, \u0432\u044B\u0441\u0442\u0430\u0432\u044C\u0442\u0435 100% \u0438\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043E\u0433\u0440\u043E\u043C\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", + RESET_DEFAULT: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E", + CARD_MODAL_WIDTH_PERCENT: "\u0428\u0438\u0440\u0438\u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445", + RANDOMIZE_CARD_ORDER: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F?", + DISABLE_CLOZE_CARDS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u044B \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C ==\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442== \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + CONVERT_BOLD_TEXT_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C **\u0436\u0438\u0440\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442** \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C {{\u0444\u0438\u0433\u0443\u0440\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438}} \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", + INLINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + FIX_SEPARATORS_MANUALLY_WARNING: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E \u0432\u0430\u043C \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", + INLINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + MULTILINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + NOTES: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "\u0422\u044D\u0433\u0438 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + TAGS_TO_REVIEW_DESC: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u044D\u0433\u0438, \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C\u0438 \u0438\u043B\u0438 enter`\u0430\u043C\u0438, \u043F\u0440\u0438\u043C\u0435\u0440: #review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + OPEN_RANDOM_NOTE_DESC: "\u0415\u0441\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0442\u043E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u044C \u043F\u043E \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u0438 (PageRank).", + AUTO_NEXT_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u0444\u0430\u0439\u043B\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u0421\u043B\u043E\u0436\u043D\u043E", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u041F\u043E\u0441\u043B\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u043F\u0440\u0438 \u043F\u043E\u043C\u043E\u0449\u0438 \u0445\u043E\u0442\u043A\u0435\u0435\u0432. \u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Obsidian \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E.", + MAX_N_DAYS_REVIEW_QUEUE: "\u041D\u0430\u0438\u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0441\u043F\u0440\u0430\u0432\u0430", + MIN_ONE_DAY: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.", + VALID_NUMBER_WARNING: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E.", + UI_PREFERENCES: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u0414\u0435\u0440\u0435\u0432\u044C\u044F \u043A\u043E\u043B\u043E\u0434 \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u0437\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440, \u0447\u0442\u043E\u0431\u044B \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043A\u043E\u043B\u043E\u0434\u044B \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041F\u043E\u043B\u0435\u0437\u043D\u043E, \u0435\u0441\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0440\u0438\u043D\u0430\u0434\u043B\u0435\u0436\u0430\u0442 \u043C\u043D\u043E\u0433\u0438\u043C \u043A\u043E\u043B\u043E\u0434\u0430\u043C \u0432 \u043E\u0434\u043D\u043E\u043C \u0444\u0430\u0439\u043B\u0435.", + ALGORITHM: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C", + CHECK_ALGORITHM_WIKI: '\u0417\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430(\u0441\u043A\u043E\u0440\u043E \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0432\u043E\u0434).', + BASE_EASE: "\u0411\u0430\u0437\u043E\u0432\u0430\u044F \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C", + BASE_EASE_DESC: "\u043C\u0438\u043D\u0438\u043C\u0443\u043C = 130, \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u043A\u043E\u043B\u043E 250.", + BASE_EASE_MIN_WARNING: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043C\u0438\u043D\u0438\u043C\u0443\u043C 130.", + LAPSE_INTERVAL_CHANGE: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 \u043A\u043E\u0433\u0434\u0430 \u0432\u044B \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442\u0435 \u0421\u043B\u043E\u0436\u043D\u043E \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438/\u0437\u0430\u043C\u0435\u0442\u043A\u0438", + LAPSE_INTERVAL_CHANGE_DESC: "\u043D\u043E\u0432\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A = \u0441\u0442\u0430\u0440\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A * \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 / 100.", + EASY_BONUS: "\u041B\u0435\u0433\u043A\u043E: \u0431\u043E\u043D\u0443\u0441", + EASY_BONUS_DESC: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u043D\u0438\u0446\u0443 \u0432 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430\u0445 \u043C\u0435\u0436\u0434\u0443 \u043E\u0442\u0432\u0435\u0442\u0430\u043C\u0438 \u0425\u043E\u0440\u043E\u0448\u043E \u0438 \u041B\u0435\u0433\u043A\u043E \u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435/\u0437\u0430\u043C\u0435\u0442\u043A\u0435 (\u043C\u0438\u043D. = 100%).", + EASY_BONUS_MIN_WARNING: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 100.", + MAX_INTERVAL: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A(\u043E\u0442\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438)", + MAX_INTERVAL_DESC: "\u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u0432\u0435\u0440\u0445\u043D\u044E\u044E \u0433\u0440\u0430\u043D\u0438\u0446\u0443 \u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = 100 years).", + MAX_INTERVAL_MIN_WARNING: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.", + MAX_LINK_CONTRIB: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0432\u044F\u0437\u0438(\u0441\u0441\u044B\u043B\u043A\u0438)", + MAX_LINK_CONTRIB_DESC: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0432\u0437\u0432\u0435\u0448\u0435\u043D\u043D\u043E\u0439 \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u0432 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C.", + LOGGING: "\u0412\u0435\u0434\u0435\u043D\u0438\u0435 \u043B\u043E\u0433\u0430", + DISPLAY_DEBUG_INFO: "\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u043E\u0442\u043B\u0430\u0434\u043A\u0438 \u043D\u0430 \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430(developer console)?", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435", + CLOSE: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C", + NEW: "\u041D\u043E\u0432\u044B\u0435", + YESTERDAY: "\u0412\u0447\u0435\u0440\u0430\u0448\u043D\u0438\u0435", + TODAY: "\u0421\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0435", + TOMORROW: "\u0417\u0430\u0432\u0442\u0440\u0430\u0448\u043D\u0438\u0435", + // stats-modal.tsx + STATS_TITLE: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430", + MONTH: "\u041C\u0435\u0441\u044F\u0446", + QUARTER: "\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044C", + YEAR: "\u0413\u043E\u0434", + LIFETIME: "\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F", + FORECAST: "\u041F\u0440\u043E\u0433\u043D\u043E\u0437", + FORECAST_DESC: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0445 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043C", + SCHEDULED: "\u0417\u0430\u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043E", + DAYS: "\u0414\u043D\u0435\u0439", + NUMBER_OF_CARDS: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + REVIEWS_PER_DAY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0441\u0442\u0432\u043E: ${avg} \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0439/\u0434\u0435\u043D\u044C", + //!!! + INTERVALS: "\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u044B", + INTERVALS_DESC: "\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", + COUNT: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E", + INTERVALS_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${avg}, \u0421\u0430\u043C\u044B\u0439 \u0434\u043B\u0438\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${longest}", + EASES: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C(\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u043B\u0438\u044F\u0435\u0442 \u043D\u0430 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0438 \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A) \n (\u043E\u0442 \u0430\u043D\u0433\u043B. ease, \u0441\u043C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430)", + EASES_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438: ${avgEase}", + CARD_TYPES: "\u0422\u0438\u043F\u044B \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", + CARD_TYPES_DESC: "\u042D\u0442\u043E \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043F\u0440\u044F\u0442\u0430\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u0447\u0442\u043E:", + CARD_TYPE_NEW: "\u041D\u043E\u0432\u044B\u0445", + CARD_TYPE_YOUNG: "\u041C\u043E\u043B\u043E\u0434\u044B\u0445", + CARD_TYPE_MATURE: "\u0412\u0437\u0440\u043E\u0441\u043B\u044B\u0445", + CARD_TYPES_SUMMARY: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A: ${totalCardsCount}" +}; + +// src/lang/locale/ta.ts +var ta_default = {}; + +// src/lang/locale/te.ts +var te_default = {}; + +// src/lang/locale/th.ts +var th_default = {}; + +// src/lang/locale/tr.ts +var tr_default = {}; + +// src/lang/locale/uk.ts +var uk_default = {}; + +// src/lang/locale/ur.ts +var ur_default = {}; + +// src/lang/locale/vi.ts +var vi_default = {}; + +// src/lang/locale/zh-cn.ts +var zh_cn_default = { + // flashcard-modal.tsx + DECKS: "\u5361\u7EC4", + DUE_CARDS: "\u5230\u671F\u5361\u7247", + NEW_CARDS: "\u65B0\u5361\u7247", + TOTAL_CARDS: "\u5168\u90E8\u5361\u7247", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247", + HARD: "\u8F83\u96BE", + GOOD: "\u8BB0\u5F97", + EASY: "\u7B80\u5355", + SHOW_ANSWER: "\u663E\u793A\u7B54\u6848", + CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u6253\u5F00\u4E00\u4E2A\u7B14\u8BB0\u5F00\u59CB\u590D\u4E60", + REVIEW_CARDS: "\u590D\u4E60\u5361\u7247", + REVIEW_EASY_FILE_MENU: "\u590D\u4E60\uFF1A\u7B80\u5355", + REVIEW_GOOD_FILE_MENU: "\u590D\u4E60\uFF1A\u8BB0\u5F97", + REVIEW_HARD_FILE_MENU: "\u590D\u4E60\uFF1A\u8F83\u96BE", + REVIEW_NOTE_EASY_CMD: "\u6807\u8BB0\u4E3A\u201C\u7B80\u5355\u201D", + REVIEW_NOTE_GOOD_CMD: "\u6807\u8BB0\u4E3A\u201C\u8BB0\u5F97\u201D", + REVIEW_NOTE_HARD_CMD: "\u6807\u8BB0\u4E3A\u201C\u8F83\u96BE\u201D", + REVIEW_ALL_CARDS: "\u590D\u4E60\u6240\u6709\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", + CRAM_ALL_CARDS: "Select a deck to cram", + REVIEW_CARDS_IN_NOTE: "\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", + CRAM_CARDS_IN_NOTE: "\u96C6\u4E2D\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", + VIEW_STATS: "\u67E5\u770B\u6570\u636E", + STATUS_BAR: "\u590D\u4E60: ${dueNotesCount} \u7B14\u8BB0, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F", + SYNC_TIME_TAKEN: "\u540C\u6B65\u65F6\u95F4 ${t}ms", + NOTE_IN_IGNORED_FOLDER: "\u7B14\u8BB0\u4FDD\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F84\u4E2D\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002", + PLEASE_TAG_NOTE: "\u8BF7\u5C06\u9700\u8981\u590D\u4E60\u7684\u7B14\u8BB0\u4E2D\u52A0\u5165\u6B63\u786E\u7684\u6807\u7B7E\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002", + RESPONSE_RECEIVED: "\u53CD\u9988\u5DF2\u6536\u5230", + NO_DECK_EXISTS: "\u6CA1\u6709 ${deckName} \u5361\u7EC4", + ALL_CAUGHT_UP: "\u90FD\u590D\u4E60\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01", + // scheduling.ts + DAYS_STR_IVL: "${interval} \u5929", + MONTHS_STR_IVL: "${interval} \u6708", + YEARS_STR_IVL: "${interval} \u5E74", + DAYS_STR_IVL_MOBILE: "${interval}\u5929", + MONTHS_STR_IVL_MOBILE: "${interval}\u6708", + YEARS_STR_IVL_MOBILE: "${interval}\u5E74", + // settings.ts + SETTINGS_HEADER: "\u95F4\u9694\u91CD\u590D\u63D2\u4EF6 - \u8BBE\u7F6E", + CHECK_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB wiki.', + FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u6587\u4EF6\u5939", + FOLDERS_TO_IGNORE_DESC: "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84\uFF0C\u7528\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts", + FLASHCARDS: "\u5361\u7247", + FLASHCARD_EASY_LABEL: "\u201C\u7B80\u5355\u201D\u6309\u94AE\u6587\u672C", + FLASHCARD_GOOD_LABEL: "\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u6587\u672C", + FLASHCARD_HARD_LABEL: "\u201C\u8F83\u96BE\u201D\u6309\u94AE\u6587\u672C", + FLASHCARD_EASY_DESC: "\u81EA\u5B9A\u4E49\u201C\u7B80\u5355\u201D\u6309\u94AE\u7684\u6807\u7B7E", + FLASHCARD_GOOD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u7684\u6807\u7B7E", + FLASHCARD_HARD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8F83\u96BE\u201D\u6309\u94AE\u7684\u6807\u7B7E", + FLASHCARD_TAGS: "\u5361\u7247\u6807\u7B7E", + FLASHCARD_TAGS_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C06\u6587\u4EF6\u5939\u5185\u5BB9\u8F6C\u6362\u4E3A\u5361\u7247\u7EC4\u548C\u5B50\u5361\u7247\u7EC4\uFF1F", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9009\u9879\u4E3A\u5361\u7247\u6807\u7B7E\u9009\u9879\u7684\u66FF\u4EE3\u9009\u9879\u3002", + INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C06\u8BA1\u5212\u91CD\u590D\u65F6\u95F4\u4FDD\u5B58\u5728\u5361\u7247\u6700\u540E\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F", + INLINE_SCHEDULING_COMMENTS_DESC: "HTML\u6CE8\u91CA\u4E0D\u518D\u7834\u574F\u5217\u8868\u683C\u5F0F", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C06\u5173\u8054\u5361\u7247\u9690\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u5173\u8054\u5361\u7247\u662F\u6765\u81EA\u540C\u4E00\u5361\u7247\u7684\u4E0D\u540C\u5F62\u5F0F\uFF0C \u4F8B\u5982\uFF1A\u5B8C\u5F62\u586B\u7A7A\u5361\u7247", + SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u663E\u793A\u4E0A\u4E0B\u6587\uFF1F", + SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6807\u9898 > \u526F\u6807\u9898 > \u5C0F\u6807\u9898 > ... > \u5C0F\u6807\u9898", + CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4", + CARD_MODAL_SIZE_PERCENT_DESC: "\u8BF7\u5728\u79FB\u52A8\u7AEF\u4F7F\u7528\u5E76\u9700\u8981\u6D4F\u89C8\u8F83\u5927\u56FE\u7247\u65F6\u8BBE\u4E3A100%", + RESET_DEFAULT: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4", + CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BBD\u5EA6\u767E\u5206\u6BD4", + RANDOMIZE_CARD_ORDER: "\u590D\u4E60\u65F6\u968F\u673A\u663E\u793A\u5361\u7247\uFF1F", + DISABLE_CLOZE_CARDS: "\u4E0D\u8FDB\u884C\u5B8C\u5F62\u586B\u7A7A\uFF1F", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C06 ==\u9AD8\u4EAE== \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", + CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C06 **\u7C97\u4F53** \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C06 {{\u5927\u62EC\u53F7}} \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", + INLINE_CARDS_SEPARATOR: "\u5355\u884C\u5361\u7247\u7684\u5206\u9694\u7B26", + FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9009\u9879\u540E\u4F60\u5C06\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u7B26\u3002", + INLINE_REVERSED_CARDS_SEPARATOR: "\u5355\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26", + MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u7B26", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26", + NOTES: "\u7B14\u8BB0", + REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", + TAGS_TO_REVIEW: "\u590D\u4E60\u6807\u7B7E", + TAGS_TO_REVIEW_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "\u590D\u4E60\u968F\u673A\u7B14\u8BB0", + OPEN_RANDOM_NOTE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\uFF0C\u7B14\u8BB0\u5C06\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002", + AUTO_NEXT_NOTE: "\u590D\u4E60\u540E\u81EA\u52A8\u6253\u5F00\u4E0B\u4E00\u4E2A\u7B14\u8BB0", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u5173\u95ED\u6587\u4EF6\u9009\u5355\u4E2D\u7684\u590D\u4E60\u9009\u9879 \u4F8B\u5982\uFF1A\u590D\u4E60\uFF1A\u7B80\u5355 \u8BB0\u5F97 \u8F83\u96BE", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u540E\u4F60\u53EF\u4EE5\u4F7F\u7528\u5FEB\u6377\u952E\u5F00\u59CB\u590D\u4E60\u3002\u91CD\u65B0\u542F\u52A8Obsidian\u4F7F\u672C\u9009\u9879\u751F\u6548\u3002", + MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u8FB9\u680F\u4E2D\u663E\u793A\u7684\u6700\u5927\u5929\u6570", + MIN_ONE_DAY: "\u5929\u6570\u6700\u5C0F\u503C\u4E3A1", + VALID_NUMBER_WARNING: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57\u3002", + UI_PREFERENCES: "\u7528\u6237\u754C\u9762\u9996\u9009\u9879", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u7532\u677F\u6811\u6700\u521D\u5E94\u663E\u793A\u4E3A\u5C55\u5F00", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u6298\u53E0\u540C\u4E00\u5F20\u5361\u7247\u4E2D\u7684\u5D4C\u5957\u724C\u7EC4\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C5E\u4E8E\u540C\u4E00\u6587\u4EF6\u4E2D\u7684\u8BB8\u591A\u5957\u724C\uFF0C\u5219\u5F88\u6709\u7528\u3002", + ALGORITHM: "\u7B97\u6CD5", + CHECK_ALGORITHM_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB algorithm implementation.', + BASE_EASE: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6", + BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u8350\u503C\u7EA6250.", + BASE_EASE_MIN_WARNING: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u4E3A130\u3002", + LAPSE_INTERVAL_CHANGE: "\u5C06\u590D\u4E60\u65F6\u6807\u6CE8\u4E3A\u201C\u8F83\u96BE\u201D\u7684\u5361\u7247\u6216\u7B14\u8BB0\u590D\u4E60\u95F4\u9694\u7F29\u77ED", + LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u590D\u4E60\u95F4\u9694 = \u539F\u590D\u4E60\u95F4\u9694 * \u95F4\u9694\u6539\u53D8\u7CFB\u6570 / 100.", + EASY_BONUS: "\u7B80\u5355\u5956\u52B1", + EASY_BONUS_DESC: "\u7B80\u5355\u5956\u52B1\u8BBE\u5B9A\u201C\u8BB0\u5F97\u201D\u548C\u201C\u7B80\u5355\u201D\u5361\u7247\u6216\u7B14\u8BB0\u7684\u590D\u4E60\u95F4\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002", + EASY_BONUS_MIN_WARNING: "\u7B80\u5355\u5956\u52B1\u81F3\u5C11\u4E3A100\u3002", + MAX_INTERVAL: "\u6700\u5927\u95F4\u9694", + MAX_INTERVAL_DESC: "\u8BBE\u5B9A\u590D\u4E60\u7684\u6700\u5927\u95F4\u9694\u65F6\u95F4\uFF08\u9ED8\u8BA4\u503C100\u5E74\uFF09\u3002", + MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u95F4\u9694\u81F3\u5C11\u4E3A1\u5929", + MAX_LINK_CONTRIB: "\u6700\u5927\u94FE\u63A5\u6536\u76CA", + MAX_LINK_CONTRIB_DESC: "\u7531\u539F\u638C\u63E1\u7A0B\u5EA6\u94FE\u63A5\u7684\u7B14\u8BB0\u7ED9\u4E0E\u7684\u6700\u5927\u52A0\u6743\u638C\u63E1\u5EA6\u6536\u76CA\u3002", + LOGGING: "\u8BB0\u5F55\u4E2D", + DISPLAY_DEBUG_INFO: "\u5728\u5F00\u53D1\u8005\u63A7\u5236\u53F0\u4E2D\u663E\u793A\u8C03\u8BD5\u4FE1\u606F\uFF1F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u7B14\u8BB0\u590D\u4E60\u5E8F\u5217", + CLOSE: "\u4E34\u8FD1", + NEW: "\u65B0", + YESTERDAY: "\u6628\u5929", + TODAY: "\u4ECA\u5929", + TOMORROW: "\u660E\u5929", + // stats-modal.tsx + STATS_TITLE: "\u6570\u636E", + MONTH: "\u6708", + QUARTER: "\u5B63", + YEAR: "\u5E74", + LIFETIME: "\u5168\u90E8", + FORECAST: "\u9884\u671F", + FORECAST_DESC: "\u5C06\u8981\u5230\u671F\u7684\u5361\u7247\u6570\u91CF", + SCHEDULED: "\u5DF2\u6392\u671F", + DAYS: "\u5929", + NUMBER_OF_CARDS: "\u5361\u7247\u6570\u91CF", + REVIEWS_PER_DAY: "\u5E73\u5747: \u590D\u4E60${avg} /\u5929", + INTERVALS: "\u95F4\u9694", + INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u590D\u4E60\u7684\u65F6\u95F4\u95F4\u9694", + COUNT: "\u8BA1\u6570", + INTERVALS_SUMMARY: "\u5E73\u5747\u95F4\u9694\u65F6\u95F4: ${avg}, \u6700\u957F\u95F4\u9694\u65F6\u95F4: ${longest}", + EASES: "Eases", + EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}", + CARD_TYPES: "\u5361\u7247\u7C7B\u578B", + CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C06\u663E\u793A\u9690\u85CF\u7684\u5361\u7247", + CARD_TYPE_NEW: "\u65B0", + CARD_TYPE_YOUNG: "\u8F83\u65B0", + CARD_TYPE_MATURE: "\u719F\u6089", + CARD_TYPES_SUMMARY: "\u603B\u5361\u7247\u6570: ${totalCardsCount}" +}; + +// src/lang/locale/zh-tw.ts +var zh_tw_default = { + // flashcard-modal.tsx + DECKS: "\u724C\u7D44", + DUE_CARDS: "\u5230\u671F\u5361\u7247", + NEW_CARDS: "\u65B0\u5361\u7247", + TOTAL_CARDS: "\u5168\u90E8\u5361\u7247", + BACK: "Back", + SKIP: "Skip", + EDIT_CARD: "Edit Card", + RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247", + HARD: "\u8F03\u96E3", + GOOD: "\u8A18\u5F97", + EASY: "\u7C21\u55AE", + SHOW_ANSWER: "\u986F\u793A\u7B54\u6848", + CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002", + SAVE: "Save", + CANCEL: "Cancel", + NO_INPUT: "No input provided.", + CURRENT_EASE_HELP_TEXT: "Current Ease: ", + CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", + CARD_GENERATED_FROM: "Generated from: ${notePath}", + // main.ts + OPEN_NOTE_FOR_REVIEW: "\u6253\u958B\u4E00\u500B\u7B46\u8A18\u958B\u59CB\u5FA9\u7FD2", + REVIEW_CARDS: "\u5FA9\u7FD2\u5361\u7247", + REVIEW_EASY_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u7C21\u55AE", + REVIEW_GOOD_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u8A18\u5F97", + REVIEW_HARD_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u8F03\u96E3", + REVIEW_NOTE_EASY_CMD: "\u6A19\u8A18\u70BA\u300C\u7C21\u55AE\u300D", + REVIEW_NOTE_GOOD_CMD: "\u6A19\u8A18\u70BA\u300C\u8A18\u5F97\u300D", + REVIEW_NOTE_HARD_CMD: "\u6A19\u8A18\u70BA\u300C\u8F03\u96E3\u300D", + REVIEW_CARDS_IN_NOTE: "\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247", + CRAM_CARDS_IN_NOTE: "\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247", + REVIEW_ALL_CARDS: "\u5FA9\u7FD2\u6240\u6709\u7B46\u8A18\u4E2D\u7684\u5361\u7247", + CRAM_ALL_CARDS: "Select a deck to cram", + VIEW_STATS: "\u6AA2\u8996\u6578\u64DA", + STATUS_BAR: "\u5FA9\u7FD2: ${dueNotesCount} \u7B46\u8A18, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F", + SYNC_TIME_TAKEN: "\u540C\u6B65\u6642\u9593 ${t}ms", + NOTE_IN_IGNORED_FOLDER: "\u7B46\u8A18\u5132\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F91\u4E2D\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002", + PLEASE_TAG_NOTE: "\u8ACB\u5C07\u9700\u8981\u5FA9\u7FD2\u7684\u7B46\u8A18\u4E2D\u52A0\u5165\u6B63\u78BA\u7684\u6A19\u7C64\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002", + RESPONSE_RECEIVED: "\u56DE\u994B\u5DF2\u6536\u5230", + NO_DECK_EXISTS: "\u6C92\u6709 ${deckName} \u724C\u7D44", + ALL_CAUGHT_UP: "\u90FD\u5FA9\u7FD2\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01", + // scheduling.ts + DAYS_STR_IVL: "${interval} \u5929", + MONTHS_STR_IVL: "${interval} \u6708", + YEARS_STR_IVL: "${interval} \u5E74", + DAYS_STR_IVL_MOBILE: "${interval}\u5929", + MONTHS_STR_IVL_MOBILE: "${interval}\u6708", + YEARS_STR_IVL_MOBILE: "${interval}\u5E74", + // settings.ts + SETTINGS_HEADER: "\u9593\u9694\u91CD\u8907\u5916\u639B - \u8A2D\u5B9A", + CHECK_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078 wiki.', + FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u8CC7\u6599\u593E", + FOLDERS_TO_IGNORE_DESC: "\u8F38\u5165\u8CC7\u6599\u593E\u8DEF\u5F91\uFF08\u7528\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts", + FLASHCARDS: "\u5361\u7247", + FLASHCARD_EASY_LABEL: "\u7C21\u55AE\u6309\u9215\u6587\u5B57", + FLASHCARD_GOOD_LABEL: "\u8A18\u5F97\u6309\u9215\u6587\u5B57", + FLASHCARD_HARD_LABEL: "\u8F03\u96E3\u6309\u9215\u6587\u5B57", + FLASHCARD_EASY_DESC: "\u81EA\u8A02\u300C\u7C21\u55AE\u300D\u6309\u9215\u7684\u6A19\u7C64", + FLASHCARD_GOOD_DESC: "\u81EA\u8A02\u300C\u8A18\u5F97\u300D\u6309\u9215\u7684\u6A19\u7C64", + FLASHCARD_HARD_DESC: "\u81EA\u8A02\u300C\u8F03\u96E3\u300D\u6309\u9215\u7684\u6A19\u7C64", + FLASHCARD_TAGS: "\u5361\u7247\u6A19\u7C64", + FLASHCARD_TAGS_DESC: "\u8F38\u5165\u6A19\u7C64\uFF08\u7528\u7A7A\u767D\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.", + CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C07\u8CC7\u6599\u593E\u5167\u5BB9\u8F49\u63DB\u70BA\u724C\u7D44\u548C\u5B50\u724C\u7D44\uFF1F", + CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9078\u9805\u70BA\u5361\u7247\u6A19\u7C64\u9078\u9805\u7684\u66FF\u4EE3\u9078\u9805\u3002", + INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C07\u8A08\u5283\u91CD\u8907\u6642\u9593\u5132\u5B58\u5728\u5361\u7247\u6700\u5F8C\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F", + INLINE_SCHEDULING_COMMENTS_DESC: "\u52FE\u9078\u5F8CHTML\u8A3B\u89E3\u4E0D\u6703\u7834\u58DE\u5217\u8868\u683C\u5F0F\u554F\u984C\u3002", + BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C07\u53CD\u8F49\u5361\u7247\u96B1\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F", + BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u53CD\u8F49\u5361\u7247\u7531\u540C\u4E00\u5361\u7247\u6587\u5B57\u7522\u751F\uFF0C\u4F8B\u5982\uFF1A\u586B\u7A7A\u514B\u6F0F\u5B57", + SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u986F\u793A\u4E0A\u4E0B\u6587\uFF1F", + SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6A19\u984C > \u526F\u6A19\u984C > \u5C0F\u6A19\u984C > ... > \u5C0F\u6A19\u984C", + CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4", + CARD_MODAL_SIZE_PERCENT_DESC: "\u5728\u79FB\u52D5\u7AEF\u6216\u9700\u8981\u8F03\u5927\u5716\u7247\u6642\u61C9\u8A2D\u5B9A\u70BA100%", + RESET_DEFAULT: "\u91CD\u7F6E\u70BA\u9810\u8A2D\u503C", + CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BEC\u5EA6\u767E\u5206\u6BD4", + RANDOMIZE_CARD_ORDER: "\u5FA9\u7FD2\u6642\u96A8\u6A5F\u986F\u793A\u5361\u7247\uFF1F", + DISABLE_CLOZE_CARDS: "\u505C\u7528\u586B\u7A7A\u514B\u6F0F\u5B57\u5361\u7247\uFF1F", + CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C07 ==\u9AD8\u4EAE== \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", + CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C07 **\u7C97\u9AD4** \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", + CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C07 {{\u5927\u62EC\u865F}} \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", + INLINE_CARDS_SEPARATOR: "\u55AE\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9078\u9805\u5F8C\u4F60\u5C07\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u5B57\u5143\u3002", + INLINE_REVERSED_CARDS_SEPARATOR: "\u55AE\u884C\u53CD\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", + NOTES: "\u7B46\u8A18", + REVIEW_PANE_ON_STARTUP: "\u555F\u52D5\u6642\u958B\u555F\u7B46\u8A18\u5FA9\u7FD2\u7A97\u683C", + TAGS_TO_REVIEW: "\u5FA9\u7FD2\u6A19\u7C64", + TAGS_TO_REVIEW_DESC: "\u8F38\u5165\u6A19\u7C64\uFF0C\u7528\u7A7A\u683C\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.", + OPEN_RANDOM_NOTE: "\u5FA9\u7FD2\u96A8\u6A5F\u7B46\u8A18", + OPEN_RANDOM_NOTE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u7B46\u8A18\u5C07\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002", + AUTO_NEXT_NOTE: "\u5FA9\u7FD2\u5F8C\u81EA\u52D5\u6253\u958B\u4E0B\u4E00\u500B\u7B46\u8A18", + DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u4E2D\u7684\u5FA9\u7FD2\u9078\u9805 \u4F8B\u5982\uFF1A\u5FA9\u7FD2\uFF1A\u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3", + DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u7684\u5FA9\u7FD2\u9078\u9805\uFF0C\u4F8B\u5982\uFF1A\u5FA9\u7FD2: \u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3\u3002", + MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u908A\u9762\u677F\u986F\u793A\u7684\u6700\u5927\u5929\u6578", + MIN_ONE_DAY: "\u5929\u6578\u6700\u5C0F\u503C\u70BA1", + VALID_NUMBER_WARNING: "\u8ACB\u8F38\u5165\u6709\u6548\u7684\u6578\u5B57\u3002", + UI_PREFERENCES: "\u7528\u6236\u4ECB\u9762\u9996\u9078\u9805", + INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u724C\u7D44\u6A39\u6700\u521D\u61C9\u986F\u793A\u70BA\u5C55\u958B", + INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\u53EF\u647A\u758A\u540C\u4E00\u5F35\u5361\u7247\u4E2D\u7684\u5DE2\u72C0\u724C\u7D44\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C6C\u65BC\u540C\u4E00\u6A94\u6848\u4E2D\u7684\u8A31\u591A\u5957\u724C\uFF0C\u5247\u5F88\u6709\u7528\u3002", + ALGORITHM: "\u6F14\u7B97\u6CD5", + CHECK_ALGORITHM_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078 algorithm implementation.', + BASE_EASE: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6", + BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u85A6\u503C\u7D04250.", + BASE_EASE_MIN_WARNING: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u70BA130\u3002", + LAPSE_INTERVAL_CHANGE: "\u5C07\u5FA9\u7FD2\u6642\u6A19\u8A3B\u70BA\u300C\u8F03\u96E3\u300D\u7684\u5361\u7247\u6216\u7B46\u8A18\u5FA9\u7FD2\u9593\u9694\u7E2E\u77ED", + LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u5FA9\u7FD2\u9593\u9694 = \u539F\u5FA9\u7FD2\u9593\u9694 * \u9593\u9694\u6539\u8B8A\u4FC2\u6578 / 100.", + EASY_BONUS: "\u7C21\u55AE\u734E\u52F5", + EASY_BONUS_DESC: "\u7C21\u55AE\u734E\u52F5\u8A2D\u5B9A\u300C\u8A18\u5F97\u300D\u548C\u300C\u7C21\u55AE\u300D\u5361\u7247\u6216\u7B46\u8A18\u7684\u5FA9\u7FD2\u9593\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002", + EASY_BONUS_MIN_WARNING: "\u7C21\u55AE\u734E\u52F5\u81F3\u5C11\u70BA100\u3002", + MAX_INTERVAL: "\u6700\u5927\u9593\u9694", + MAX_INTERVAL_DESC: "\u8A2D\u5B9A\u5FA9\u7FD2\u7684\u6700\u5927\u9593\u9694\u6642\u9593\uFF08\u9810\u8A2D\u503C100\u5E74\uFF09\u3002", + MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u9593\u9694\u81F3\u5C11\u70BA1\u5929", + MAX_LINK_CONTRIB: "\u6700\u5927\u93C8\u63A5\u8CA2\u737B", + MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", + LOGGING: "\u8A18\u9304\u4E2D", + DISPLAY_DEBUG_INFO: "\u5728\u958B\u767C\u8005\u63A7\u5236\u53F0\u4E2D\u986F\u793A\u9664\u932F\u8CC7\u8A0A\uFF1F", + // sidebar.ts + NOTES_REVIEW_QUEUE: "\u7B46\u8A18\u5FA9\u7FD2\u5E8F\u5217", + CLOSE: "\u81E8\u8FD1", + NEW: "\u65B0", + YESTERDAY: "\u6628\u5929", + TODAY: "\u4ECA\u5929", + TOMORROW: "\u660E\u5929", + // stats-modal.tsx + STATS_TITLE: "\u7D71\u8A08", + MONTH: "\u6708", + QUARTER: "\u5B63", + YEAR: "\u5E74", + LIFETIME: "\u5168\u90E8", + FORECAST: "\u9810\u6E2C", + FORECAST_DESC: "\u5C07\u8981\u5230\u671F\u7684\u5361\u7247\u6578\u91CF", + SCHEDULED: "\u5DF2\u6392\u7A0B", + DAYS: "\u5929", + NUMBER_OF_CARDS: "\u5361\u7247\u6578\u91CF", + REVIEWS_PER_DAY: "\u5E73\u5747: \u5FA9\u7FD2${avg} /\u5929", + INTERVALS: "\u9593\u9694", + INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u5FA9\u7FD2\u7684\u6642\u9593\u9593\u9694", + COUNT: "\u8A08\u6578", + INTERVALS_SUMMARY: "\u5E73\u5747\u9593\u9694\u6642\u9593: ${avg}, \u6700\u9577\u9593\u9694\u6642\u9593: ${longest}", + EASES: "Eases", + EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}", + CARD_TYPES: "\u5361\u7247\u578B\u5225", + CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C07\u986F\u793A\u96B1\u85CF\u7684\u5361\u7247", + CARD_TYPE_NEW: "\u65B0", + CARD_TYPE_YOUNG: "\u8F03\u65B0", + CARD_TYPE_MATURE: "\u719F\u6089", + CARD_TYPES_SUMMARY: "\u7E3D\u5361\u7247\u6578: ${totalCardsCount}" +}; + +// src/lang/helpers.ts +var localeMap = { + af: af_default, + ar: ar_default, + bn: bn_default, + cs: cz_default, + da: da_default, + de: de_default, + en: en_default, + "en-gb": en_gb_default, + es: es_default, + fr: fr_default, + hi: hi_default, + id: id_default, + it: it_default, + ja: ja_default, + ko: ko_default, + mr: mr_default, + nl: nl_default, + nn: no_default, + pl: pl_default, + pt: pt_default, + "pt-br": pt_br_default, + ro: ro_default, + ru: ru_default, + ta: ta_default, + te: te_default, + th: th_default, + tr: tr_default, + uk: uk_default, + ur: ur_default, + vi: vi_default, + "zh-cn": zh_cn_default, + "zh-tw": zh_tw_default +}; +var locale = localeMap[import_obsidian.moment.locale()]; +function interpolate(str, params) { + const names2 = Object.keys(params); + const vals = Object.values(params); + return new Function(...names2, `return \`${str}\`;`)(...vals); +} +function t(str, params) { + if (!locale) { + console.error(`SRS error: Locale ${import_obsidian.moment.locale()} not found.`); + } + const result = locale && locale[str] || en_default[str]; + if (params) { + return interpolate(result, params); + } + return result; +} + +// src/settings.ts +var DEFAULT_SETTINGS = { + // flashcards + flashcardEasyText: t("EASY"), + flashcardGoodText: t("GOOD"), + flashcardHardText: t("HARD"), + flashcardTags: ["#flashcards"], + convertFoldersToDecks: false, + cardCommentOnSameLine: false, + burySiblingCards: false, + showContextInCards: true, + flashcardHeightPercentage: import_obsidian2.Platform.isMobile ? 100 : 80, + flashcardWidthPercentage: import_obsidian2.Platform.isMobile ? 100 : 40, + randomizeCardOrder: true, + convertHighlightsToClozes: true, + convertBoldTextToClozes: false, + convertCurlyBracketsToClozes: false, + singleLineCardSeparator: "::", + singleLineReversedCardSeparator: ":::", + multilineCardSeparator: "?", + multilineReversedCardSeparator: "??", + editLaterTag: "#edit-later", + // notes + enableNoteReviewPaneOnStartup: true, + tagsToReview: ["#review"], + noteFoldersToIgnore: [], + openRandomNote: false, + autoNextNote: false, + disableFileMenuReviewOptions: false, + maxNDaysNotesReviewQueue: 365, + // UI settings + initiallyExpandAllSubdecksInTree: false, + // algorithm + baseEase: 250, + lapsesIntervalChange: 0.5, + easyBonus: 1.3, + maximumInterval: 36525, + maxLinkFactor: 1, + // logging + showDebugMessages: false +}; +var applyDebounceTimer = 0; +function applySettingsUpdate(callback2) { + clearTimeout(applyDebounceTimer); + applyDebounceTimer = window.setTimeout(callback2, 512); +} +var SRSettingTab = class extends import_obsidian2.PluginSettingTab { + constructor(app2, plugin) { + super(app2, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + const header = containerEl.createEl("h1", { text: `${t("SETTINGS_HEADER")}` }); + header.addClass("sr-centered"); + containerEl.createDiv().innerHTML = t("CHECK_WIKI", { + wiki_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/" + }); + new import_obsidian2.Setting(containerEl).setName(t("FOLDERS_TO_IGNORE")).setDesc(t("FOLDERS_TO_IGNORE_DESC")).addTextArea( + (text) => text.setValue(this.plugin.data.settings.noteFoldersToIgnore.join("\n")).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.noteFoldersToIgnore = value.split(/\n+/).map((v) => v.trim()).filter((v) => v); + await this.plugin.savePluginData(); + }); + }) + ); + containerEl.createEl("h3", { text: `${t("FLASHCARDS")}` }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_TAGS")).setDesc(t("FLASHCARD_TAGS_DESC")).addTextArea( + (text) => text.setValue(this.plugin.data.settings.flashcardTags.join(" ")).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardTags = value.split(/\s+/); + await this.plugin.savePluginData(); + }); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_FOLDERS_TO_DECKS")).setDesc(t("CONVERT_FOLDERS_TO_DECKS_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertFoldersToDecks).onChange(async (value) => { + this.plugin.data.settings.convertFoldersToDecks = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("INLINE_SCHEDULING_COMMENTS")).setDesc(t("INLINE_SCHEDULING_COMMENTS_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.cardCommentOnSameLine).onChange(async (value) => { + this.plugin.data.settings.cardCommentOnSameLine = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")).setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.burySiblingCards).onChange(async (value) => { + this.plugin.data.settings.burySiblingCards = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("SHOW_CARD_CONTEXT")).setDesc(t("SHOW_CARD_CONTEXT_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.showContextInCards).onChange(async (value) => { + this.plugin.data.settings.showContextInCards = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_HEIGHT_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider( + (slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardHeightPercentage).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.flashcardHeightPercentage = value; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardHeightPercentage = DEFAULT_SETTINGS.flashcardHeightPercentage; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_WIDTH_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider( + (slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardWidthPercentage).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.flashcardWidthPercentage = value; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardWidthPercentage = DEFAULT_SETTINGS.flashcardWidthPercentage; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("RANDOMIZE_CARD_ORDER")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.randomizeCardOrder).onChange(async (value) => { + this.plugin.data.settings.randomizeCardOrder = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_HIGHLIGHTS_TO_CLOZES")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertHighlightsToClozes).onChange(async (value) => { + this.plugin.data.settings.convertHighlightsToClozes = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_BOLD_TEXT_TO_CLOZES")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertBoldTextToClozes).onChange(async (value) => { + this.plugin.data.settings.convertBoldTextToClozes = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("CONVERT_CURLY_BRACKETS_TO_CLOZES")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.convertCurlyBracketsToClozes).onChange(async (value) => { + this.plugin.data.settings.convertCurlyBracketsToClozes = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("INLINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.singleLineCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.singleLineCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.singleLineCardSeparator = DEFAULT_SETTINGS.singleLineCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("INLINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.singleLineReversedCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.singleLineReversedCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.singleLineReversedCardSeparator = DEFAULT_SETTINGS.singleLineReversedCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.multilineCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.multilineCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.multilineCardSeparator = DEFAULT_SETTINGS.multilineCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( + (text) => text.setValue(this.plugin.data.settings.multilineReversedCardSeparator).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.multilineReversedCardSeparator = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.multilineReversedCardSeparator = DEFAULT_SETTINGS.multilineReversedCardSeparator; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_EASY_LABEL")).setDesc(t("FLASHCARD_EASY_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.flashcardEasyText).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardEasyText = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardEasyText = DEFAULT_SETTINGS.flashcardEasyText; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_GOOD_LABEL")).setDesc(t("FLASHCARD_GOOD_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.flashcardGoodText).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardGoodText = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardGoodText = DEFAULT_SETTINGS.flashcardGoodText; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_HARD_LABEL")).setDesc(t("FLASHCARD_HARD_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.flashcardHardText).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.flashcardHardText = value; + await this.plugin.savePluginData(); + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.flashcardHardText = DEFAULT_SETTINGS.flashcardHardText; + await this.plugin.savePluginData(); + this.display(); + }); + }); + containerEl.createEl("h3", { text: `${t("NOTES")}` }); + new import_obsidian2.Setting(containerEl).setName(t("REVIEW_PANE_ON_STARTUP")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.enableNoteReviewPaneOnStartup).onChange(async (value) => { + this.plugin.data.settings.enableNoteReviewPaneOnStartup = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("TAGS_TO_REVIEW")).setDesc(t("TAGS_TO_REVIEW_DESC")).addTextArea( + (text) => text.setValue(this.plugin.data.settings.tagsToReview.join(" ")).onChange((value) => { + applySettingsUpdate(async () => { + this.plugin.data.settings.tagsToReview = value.split(/\s+/); + await this.plugin.savePluginData(); + }); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("OPEN_RANDOM_NOTE")).setDesc(t("OPEN_RANDOM_NOTE_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.openRandomNote).onChange(async (value) => { + this.plugin.data.settings.openRandomNote = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("AUTO_NEXT_NOTE")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.autoNextNote).onChange(async (value) => { + this.plugin.data.settings.autoNextNote = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("DISABLE_FILE_MENU_REVIEW_OPTIONS")).setDesc(t("DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.disableFileMenuReviewOptions).onChange(async (value) => { + this.plugin.data.settings.disableFileMenuReviewOptions = value; + await this.plugin.savePluginData(); + }) + ); + new import_obsidian2.Setting(containerEl).setName(t("MAX_N_DAYS_REVIEW_QUEUE")).addText( + (text) => text.setValue(this.plugin.data.settings.maxNDaysNotesReviewQueue.toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value); + if (!isNaN(numValue)) { + if (numValue < 1) { + new import_obsidian2.Notice(t("MIN_ONE_DAY")); + text.setValue( + this.plugin.data.settings.maxNDaysNotesReviewQueue.toString() + ); + return; + } + this.plugin.data.settings.maxNDaysNotesReviewQueue = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.maxNDaysNotesReviewQueue = DEFAULT_SETTINGS.maxNDaysNotesReviewQueue; + await this.plugin.savePluginData(); + this.display(); + }); + }); + containerEl.createEl("h3", { text: `${t("UI_PREFERENCES")}` }); + new import_obsidian2.Setting(containerEl).setName(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE")).setDesc(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.initiallyExpandAllSubdecksInTree).onChange(async (value) => { + this.plugin.data.settings.initiallyExpandAllSubdecksInTree = value; + await this.plugin.savePluginData(); + }) + ); + containerEl.createEl("h3", { text: `${t("ALGORITHM")}` }); + containerEl.createDiv().innerHTML = t("CHECK_ALGORITHM_WIKI", { + algo_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/" + }); + new import_obsidian2.Setting(containerEl).setName(t("BASE_EASE")).setDesc(t("BASE_EASE_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.baseEase.toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value); + if (!isNaN(numValue)) { + if (numValue < 130) { + new import_obsidian2.Notice(t("BASE_EASE_MIN_WARNING")); + text.setValue(this.plugin.data.settings.baseEase.toString()); + return; + } + this.plugin.data.settings.baseEase = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.baseEase = DEFAULT_SETTINGS.baseEase; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("LAPSE_INTERVAL_CHANGE")).setDesc(t("LAPSE_INTERVAL_CHANGE_DESC")).addSlider( + (slider) => slider.setLimits(1, 99, 1).setValue(this.plugin.data.settings.lapsesIntervalChange * 100).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.lapsesIntervalChange = value / 100; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.lapsesIntervalChange = DEFAULT_SETTINGS.lapsesIntervalChange; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("EASY_BONUS")).setDesc(t("EASY_BONUS_DESC")).addText( + (text) => text.setValue((this.plugin.data.settings.easyBonus * 100).toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value) / 100; + if (!isNaN(numValue)) { + if (numValue < 1) { + new import_obsidian2.Notice(t("EASY_BONUS_MIN_WARNING")); + text.setValue( + (this.plugin.data.settings.easyBonus * 100).toString() + ); + return; + } + this.plugin.data.settings.easyBonus = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.easyBonus = DEFAULT_SETTINGS.easyBonus; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MAX_INTERVAL")).setDesc(t("MAX_INTERVAL_DESC")).addText( + (text) => text.setValue(this.plugin.data.settings.maximumInterval.toString()).onChange((value) => { + applySettingsUpdate(async () => { + const numValue = Number.parseInt(value); + if (!isNaN(numValue)) { + if (numValue < 1) { + new import_obsidian2.Notice(t("MAX_INTERVAL_MIN_WARNING")); + text.setValue( + this.plugin.data.settings.maximumInterval.toString() + ); + return; + } + this.plugin.data.settings.maximumInterval = numValue; + await this.plugin.savePluginData(); + } else { + new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); + } + }); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.maximumInterval = DEFAULT_SETTINGS.maximumInterval; + await this.plugin.savePluginData(); + this.display(); + }); + }); + new import_obsidian2.Setting(containerEl).setName(t("MAX_LINK_CONTRIB")).setDesc(t("MAX_LINK_CONTRIB_DESC")).addSlider( + (slider) => slider.setLimits(0, 100, 1).setValue(this.plugin.data.settings.maxLinkFactor * 100).setDynamicTooltip().onChange(async (value) => { + this.plugin.data.settings.maxLinkFactor = value / 100; + await this.plugin.savePluginData(); + }) + ).addExtraButton((button) => { + button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { + this.plugin.data.settings.maxLinkFactor = DEFAULT_SETTINGS.maxLinkFactor; + await this.plugin.savePluginData(); + this.display(); + }); + }); + containerEl.createEl("h3", { text: `${t("LOGGING")}` }); + new import_obsidian2.Setting(containerEl).setName(t("DISPLAY_DEBUG_INFO")).addToggle( + (toggle) => toggle.setValue(this.plugin.data.settings.showDebugMessages).onChange(async (value) => { + this.plugin.data.settings.showDebugMessages = value; + await this.plugin.savePluginData(); + }) + ); + } +}; + +// src/flashcard-modal.tsx +var import_obsidian3 = require("obsidian"); +var import_vhtml = __toESM(require_vhtml()); + +// src/scheduling.ts +function schedule(response, interval, ease, delayBeforeReview, settingsObj, dueDates) { + delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1e3))); + if (response === 0 /* Easy */) { + ease += 20; + interval = (interval + delayBeforeReview) * ease / 100; + interval *= settingsObj.easyBonus; + } else if (response === 1 /* Good */) { + interval = (interval + delayBeforeReview / 2) * ease / 100; + } else if (response === 2 /* Hard */) { + ease = Math.max(130, ease - 20); + interval = Math.max( + 1, + (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange + ); + } + if (dueDates !== void 0) { + interval = Math.round(interval); + if (!Object.prototype.hasOwnProperty.call(dueDates, interval)) { + dueDates[interval] = 0; + } else { + if (interval > 4) { + let fuzz = 0; + if (interval < 7) + fuzz = 1; + else if (interval < 30) + fuzz = Math.max(2, Math.floor(interval * 0.15)); + else + fuzz = Math.max(4, Math.floor(interval * 0.05)); + const originalInterval = interval; + outer: + for (let i = 1; i <= fuzz; i++) { + for (const ivl of [originalInterval - i, originalInterval + i]) { + if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) { + dueDates[ivl] = 0; + interval = ivl; + break outer; + } + if (dueDates[ivl] < dueDates[interval]) + interval = ivl; + } + } + } + } + dueDates[interval]++; + } + interval = Math.min(interval, settingsObj.maximumInterval); + return { interval: Math.round(interval * 10) / 10, ease }; +} +function textInterval(interval, isMobile) { + if (interval === void 0) { + return t("NEW"); + } + const m = Math.round(interval / 3.04375) / 10, y = Math.round(interval / 36.525) / 10; + if (isMobile) { + if (m < 1) + return t("DAYS_STR_IVL_MOBILE", { interval }); + else if (y < 1) + return t("MONTHS_STR_IVL_MOBILE", { interval: m }); + else + return t("YEARS_STR_IVL_MOBILE", { interval: y }); + } else { + if (m < 1) + return t("DAYS_STR_IVL", { interval }); + else if (y < 1) + return t("MONTHS_STR_IVL", { interval: m }); + else + return t("YEARS_STR_IVL", { interval: y }); + } +} + +// src/constants.ts +var SCHEDULING_INFO_REGEX = /^---\n((?:.*\n)*)sr-due: (.+)\nsr-interval: (\d+)\nsr-ease: (\d+)\n((?:.*\n)?)---/; +var YAML_FRONT_MATTER_REGEX = /^---\n((?:.*\n)*?)---/; +var MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm; +var LEGACY_SCHEDULING_EXTRACTOR = //gm; +var IMAGE_FORMATS = [ + "jpg", + "jpeg", + "gif", + "png", + "svg", + "webp", + "apng", + "avif", + "jfif", + "pjpeg", + "pjp", + "bmp" +]; +var AUDIO_FORMATS = ["mp3", "webm", "m4a", "wav", "ogg"]; +var VIDEO_FORMATS = ["mp4", "mkv", "avi", "mov"]; +var COLLAPSE_ICON = ''; + +// src/utils.ts +function getTypedObjectEntries(obj) { + return Object.entries(obj); +} +var getKeysPreserveType = Object.keys; +var escapeRegexString = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); +function cyrb53(str, seed = 0) { + let h12 = 3735928559 ^ seed, h22 = 1103547991 ^ seed; + for (let i = 0, ch; i < str.length; i++) { + ch = str.charCodeAt(i); + h12 = Math.imul(h12 ^ ch, 2654435761); + h22 = Math.imul(h22 ^ ch, 1597334677); + } + h12 = Math.imul(h12 ^ h12 >>> 16, 2246822507) ^ Math.imul(h22 ^ h22 >>> 13, 3266489909); + h22 = Math.imul(h22 ^ h22 >>> 16, 2246822507) ^ Math.imul(h12 ^ h12 >>> 13, 3266489909); + return (4294967296 * (2097151 & h22) + (h12 >>> 0)).toString(16); +} + +// src/flashcard-modal.tsx +var FlashcardEditModal = class extends import_obsidian3.Modal { + constructor(app2, plugin, existingText) { + super(app2); + this.didSubmit = false; + this.submitClickCallback = (_) => this.submit(); + this.cancelClickCallback = (_) => this.cancel(); + this.submitEnterCallback = (evt) => { + if ((evt.ctrlKey || evt.metaKey) && evt.key === "Enter") { + evt.preventDefault(); + this.submit(); + } + }; + this.plugin = plugin; + this.titleEl.setText(t("EDIT_CARD")); + this.titleEl.addClass("sr-centered"); + this.modalText = existingText; + this.waitForClose = new Promise((resolve2, reject) => { + this.resolvePromise = resolve2; + this.rejectPromise = reject; + }); + this.display(); + this.open(); + } + static Prompt(app2, plugin, placeholder) { + const newPromptModal = new FlashcardEditModal(app2, plugin, placeholder); + return newPromptModal.waitForClose; + } + display() { + this.contentEl.empty(); + this.modalEl.addClass("sr-flashcard-input-modal"); + const mainContentContainer = this.contentEl.createDiv(); + mainContentContainer.addClass("sr-flashcard-input-area"); + this.inputComponent = this.createInputField(mainContentContainer, this.modalText); + this.createButtonBar(mainContentContainer); + } + createButton(container, text, callback2) { + const btn = new import_obsidian3.ButtonComponent(container); + btn.setButtonText(text).onClick(callback2); + return btn; + } + createButtonBar(mainContentContainer) { + const buttonBarContainer = mainContentContainer.createDiv(); + buttonBarContainer.addClass("sr-flashcard-edit-button-bar"); + this.createButton( + buttonBarContainer, + t("SAVE"), + this.submitClickCallback + ).setCta().buttonEl.style.marginRight = "0"; + this.createButton(buttonBarContainer, t("CANCEL"), this.cancelClickCallback); + } + createInputField(container, value) { + const textComponent = new import_obsidian3.TextAreaComponent(container); + textComponent.inputEl.style.width = "100%"; + textComponent.setValue(value != null ? value : "").onChange((value2) => this.input = value2).inputEl.addEventListener("keydown", this.submitEnterCallback); + return textComponent; + } + submit() { + this.didSubmit = true; + this.close(); + } + cancel() { + this.close(); + } + onOpen() { + super.onOpen(); + this.inputComponent.inputEl.focus(); + } + onClose() { + super.onClose(); + this.resolveInput(); + this.removeInputListener(); + } + resolveInput() { + if (!this.didSubmit) + this.rejectPromise(t("NO_INPUT")); + else + this.resolvePromise(this.input); + } + removeInputListener() { + this.inputComponent.inputEl.removeEventListener("keydown", this.submitEnterCallback); + } +}; +var FlashcardModal = class extends import_obsidian3.Modal { + constructor(app2, plugin, ignoreStats = false) { + super(app2); + this.plugin = plugin; + this.ignoreStats = ignoreStats; + this.titleEl.setText(t("DECKS")); + this.titleEl.addClass("sr-centered"); + if (import_obsidian3.Platform.isMobile) { + this.contentEl.style.display = "block"; + } + this.modalEl.style.height = this.plugin.data.settings.flashcardHeightPercentage + "%"; + this.modalEl.style.width = this.plugin.data.settings.flashcardWidthPercentage + "%"; + this.contentEl.style.position = "relative"; + this.contentEl.style.height = "92%"; + this.contentEl.addClass("sr-modal-content"); + document.body.onkeydown = (e) => { + if (document.activeElement.nodeName != "TEXTAREA" && document.activeElement.nodeName !== "INPUT" && this.mode !== 0 /* DecksList */) { + const consume = () => { + e.preventDefault(); + e.stopPropagation(); + }; + if (this.mode !== 3 /* Closed */ && e.code === "KeyS") { + this.skipCurrentCard(); + consume(); + } else if (this.mode === 1 /* Front */ && (e.code === "Space" || e.code === "Enter")) { + this.showAnswer(); + consume(); + } else if (this.mode === 2 /* Back */) { + if (e.code === "Numpad1" || e.code === "Digit1") { + this.processReview(2 /* Hard */); + consume(); + } else if (e.code === "Numpad2" || e.code === "Digit2" || e.code === "Space") { + this.processReview(1 /* Good */); + consume(); + } else if (e.code === "Numpad3" || e.code === "Digit3") { + this.processReview(0 /* Easy */); + consume(); + } else if (e.code === "Numpad0" || e.code === "Digit0") { + this.processReview(3 /* Reset */); + consume(); + } + } + } + }; + } + onOpen() { + this.decksList(); + } + onClose() { + this.mode = 3 /* Closed */; + } + decksList() { + const aimDeck = this.plugin.deckTree.subdecks.filter( + (deck) => deck.deckName === this.plugin.data.historyDeck + ); + if (this.plugin.data.historyDeck && aimDeck.length > 0) { + const deck = aimDeck[0]; + this.currentDeck = deck; + this.checkDeck = deck.parent; + this.setupCardsView(); + deck.nextCard(this); + return; + } + this.mode = 0 /* DecksList */; + this.titleEl.setText(t("DECKS")); + this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("p", { style: "margin:0px;line-height:12px;" }, /* @__PURE__ */ (0, import_vhtml.default)( + "span", + { + style: "background-color:#4caf50;color:#ffffff;", + "aria-label": t("DUE_CARDS"), + class: "tag-pane-tag-count tree-item-flair sr-deck-counts" + }, + this.plugin.deckTree.dueFlashcardsCount.toString() + ), /* @__PURE__ */ (0, import_vhtml.default)( + "span", + { + style: "background-color:#2196f3;", + "aria-label": t("NEW_CARDS"), + class: "tag-pane-tag-count tree-item-flair sr-deck-counts" + }, + this.plugin.deckTree.newFlashcardsCount.toString() + ), /* @__PURE__ */ (0, import_vhtml.default)( + "span", + { + style: "background-color:#ff7043;", + "aria-label": t("TOTAL_CARDS"), + class: "tag-pane-tag-count tree-item-flair sr-deck-counts" + }, + this.plugin.deckTree.totalFlashcards.toString() + )); + this.contentEl.empty(); + this.contentEl.setAttribute("id", "sr-flashcard-view"); + for (const deck of this.plugin.deckTree.subdecks) { + deck.render(this.contentEl, this); + } + } + setupCardsView() { + this.contentEl.empty(); + const flashCardMenu = this.contentEl.createDiv("sr-flashcard-menu"); + const backButton = flashCardMenu.createEl("button"); + backButton.addClass("sr-flashcard-menu-item"); + (0, import_obsidian3.setIcon)(backButton, "arrow-left"); + backButton.setAttribute("aria-label", t("BACK")); + backButton.addEventListener("click", () => { + this.plugin.data.historyDeck = ""; + this.decksList(); + }); + this.editButton = flashCardMenu.createEl("button"); + this.editButton.addClass("sr-flashcard-menu-item"); + (0, import_obsidian3.setIcon)(this.editButton, "edit"); + this.editButton.setAttribute("aria-label", t("EDIT_CARD")); + this.editButton.addEventListener("click", async () => { + const textPromptArr = this.currentCard.cardText.split("\n"); + let textPrompt = ""; + if (textPromptArr[textPromptArr.length - 1].startsWith("`; + } else { + let scheduling = [ + ...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR) + ]; + if (scheduling.length === 0) { + scheduling = [...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; + } + const currCardSched = ["0", dueString, interval.toString(), ease.toString()]; + if (this.currentCard.isDue) { + scheduling[this.currentCard.siblingIdx] = currCardSched; + } else { + scheduling.push(currCardSched); + } + this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); + this.currentCard.cardText += ""; + } + fileText = fileText.replace(replacementRegex, () => this.currentCard.cardText); + for (const sibling of this.currentCard.siblings) { + sibling.cardText = this.currentCard.cardText; + } + if (this.plugin.data.settings.burySiblingCards) { + this.burySiblingCards(true); + } + await this.app.vault.modify(this.currentCard.note, fileText); + this.currentDeck.nextCard(this); + } + async burySiblingCards(tillNextDay) { + if (tillNextDay) { + this.plugin.data.buryList.push(cyrb53(this.currentCard.cardText)); + await this.plugin.savePluginData(); + } + for (const sibling of this.currentCard.siblings) { + const dueIdx = this.currentDeck.dueFlashcards.indexOf(sibling); + const newIdx = this.currentDeck.newFlashcards.indexOf(sibling); + if (dueIdx !== -1) { + this.currentDeck.deleteFlashcardAtIndex( + dueIdx, + this.currentDeck.dueFlashcards[dueIdx].isDue + ); + } else if (newIdx !== -1) { + this.currentDeck.deleteFlashcardAtIndex( + newIdx, + this.currentDeck.newFlashcards[newIdx].isDue + ); + } + } + } + skipCurrentCard() { + this.currentDeck.deleteFlashcardAtIndex(this.currentCardIdx, this.currentCard.isDue); + this.burySiblingCards(false); + this.currentDeck.nextCard(this); + } + // slightly modified version of the renderMarkdown function in + // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx + async renderMarkdownWrapper(markdownString, containerEl, recursiveDepth = 0) { + if (recursiveDepth > 4) + return; + import_obsidian3.MarkdownRenderer.renderMarkdown( + markdownString, + containerEl, + this.currentCard.note.path, + this.plugin + ); + containerEl.findAll(".internal-embed").forEach((el) => { + const link2 = this.parseLink(el.getAttribute("src")); + if (!link2.target) { + el.innerText = link2.text; + } else if (link2.target instanceof import_obsidian3.TFile) { + if (link2.target.extension !== "md") { + this.embedMediaFile(el, link2.target); + } else { + el.innerText = ""; + this.renderTransclude(el, link2, recursiveDepth); + } + } + }); + } + parseLink(src) { + const linkComponentsRegex = /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; + const matched = typeof src === "string" && src.match(linkComponentsRegex); + const file = matched.groups.file || this.currentCard.note.path; + const target = this.plugin.app.metadataCache.getFirstLinkpathDest( + file, + this.currentCard.note.path + ); + return { + text: matched[0], + file: matched.groups.file, + heading: matched.groups.heading, + blockId: matched.groups.blockId, + target + }; + } + embedMediaFile(el, target) { + el.innerText = ""; + if (IMAGE_FORMATS.includes(target.extension)) { + el.createEl( + "img", + { + attr: { + src: this.plugin.app.vault.getResourcePath(target) + } + }, + (img) => { + if (el.hasAttribute("width")) + img.setAttribute("width", el.getAttribute("width")); + else + img.setAttribute("width", "100%"); + if (el.hasAttribute("alt")) + img.setAttribute("alt", el.getAttribute("alt")); + el.addEventListener( + "click", + (ev) => ev.target.style.minWidth = ev.target.style.minWidth === "100%" ? null : "100%" + ); + } + ); + el.addClasses(["image-embed", "is-loaded"]); + } else if (AUDIO_FORMATS.includes(target.extension) || VIDEO_FORMATS.includes(target.extension)) { + el.createEl( + AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", + { + attr: { + controls: "", + src: this.plugin.app.vault.getResourcePath(target) + } + }, + (audio) => { + if (el.hasAttribute("alt")) + audio.setAttribute("alt", el.getAttribute("alt")); + } + ); + el.addClasses(["media-embed", "is-loaded"]); + } else { + el.innerText = target.path; + } + } + async renderTransclude(el, link2, recursiveDepth) { + var _a, _b, _c, _d; + const cache = this.app.metadataCache.getCache(link2.target.path); + const text = await this.app.vault.cachedRead(link2.target); + let blockText; + if (link2.heading) { + const clean = (s) => s.replace(/[\W\s]/g, ""); + const headingIndex = (_a = cache.headings) == null ? void 0 : _a.findIndex( + (h4) => clean(h4.heading) === clean(link2.heading) + ); + const heading = cache.headings[headingIndex]; + const startAt = heading.position.start.offset; + const endAt = ((_d = (_c = (_b = cache.headings.slice(headingIndex + 1).find((h4) => h4.level <= heading.level)) == null ? void 0 : _b.position) == null ? void 0 : _c.start) == null ? void 0 : _d.offset) || text.length; + blockText = text.substring(startAt, endAt); + } else if (link2.blockId) { + const block = cache.blocks[link2.blockId]; + const startAt = block.position.start.offset; + const endAt = block.position.end.offset; + blockText = text.substring(startAt, endAt); + } else { + blockText = text; + } + this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); + } +}; +var Deck = class { + constructor(deckName, parent) { + this.newFlashcardsCount = 0; + this.dueFlashcardsCount = 0; + // counts those in subdecks too + this.totalFlashcards = 0; + this.deckName = deckName; + this.newFlashcards = []; + this.newFlashcardsCount = 0; + this.dueFlashcards = []; + this.dueFlashcardsCount = 0; + this.totalFlashcards = 0; + this.subdecks = []; + this.parent = parent; + } + createDeck(deckPath) { + if (deckPath.length === 0) { + return; + } + const deckName = deckPath.shift(); + for (const deck2 of this.subdecks) { + if (deckName === deck2.deckName) { + deck2.createDeck(deckPath); + return; + } + } + const deck = new Deck(deckName, this); + this.subdecks.push(deck); + deck.createDeck(deckPath); + } + insertFlashcard(deckPath, cardObj) { + if (cardObj.isDue) { + this.dueFlashcardsCount++; + } else { + this.newFlashcardsCount++; + } + this.totalFlashcards++; + if (deckPath.length === 0) { + if (cardObj.isDue) { + this.dueFlashcards.push(cardObj); + } else { + this.newFlashcards.push(cardObj); + } + return; + } + const deckName = deckPath.shift(); + for (const deck of this.subdecks) { + if (deckName === deck.deckName) { + deck.insertFlashcard(deckPath, cardObj); + return; + } + } + } + // count flashcards that have either been buried + // or aren't due yet + countFlashcard(deckPath, n = 1) { + this.totalFlashcards += n; + const deckName = deckPath.shift(); + for (const deck of this.subdecks) { + if (deckName === deck.deckName) { + deck.countFlashcard(deckPath, n); + return; + } + } + } + deleteFlashcardAtIndex(index, cardIsDue) { + if (cardIsDue) { + this.dueFlashcards.splice(index, 1); + this.dueFlashcardsCount--; + } else { + this.newFlashcards.splice(index, 1); + this.newFlashcardsCount--; + } + let deck = this.parent; + while (deck !== null) { + if (cardIsDue) { + deck.dueFlashcardsCount--; + } else { + deck.newFlashcardsCount--; + } + deck = deck.parent; + } + } + sortSubdecksList() { + this.subdecks.sort((a, b) => { + if (a.deckName < b.deckName) { + return -1; + } else if (a.deckName > b.deckName) { + return 1; + } + return 0; + }); + for (const deck of this.subdecks) { + deck.sortSubdecksList(); + } + } + render(containerEl, modal) { + const deckView = containerEl.createDiv("tree-item"); + const deckViewSelf = deckView.createDiv( + "tree-item-self tag-pane-tag is-clickable" + ); + const shouldBeInitiallyExpanded = modal.plugin.data.settings.initiallyExpandAllSubdecksInTree; + let collapsed = shouldBeInitiallyExpanded; + let collapseIconEl = null; + if (this.subdecks.length > 0) { + collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon"); + collapseIconEl.innerHTML = COLLAPSE_ICON; + collapseIconEl.childNodes[0].style.transform = shouldBeInitiallyExpanded ? "" : "rotate(-90deg)"; + } + const deckViewInner = deckViewSelf.createDiv("tree-item-inner"); + deckViewInner.addEventListener("click", () => { + modal.plugin.data.historyDeck = this.deckName; + modal.currentDeck = this; + modal.checkDeck = this.parent; + modal.setupCardsView(); + this.nextCard(modal); + }); + const deckViewInnerText = deckViewInner.createDiv("tag-pane-tag-text"); + deckViewInnerText.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", { class: "tag-pane-tag-self" }, this.deckName); + const deckViewOuter = deckViewSelf.createDiv("tree-item-flair-outer"); + deckViewOuter.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", null, /* @__PURE__ */ (0, import_vhtml.default)( + "span", + { + style: "background-color:#4caf50;", + class: "tag-pane-tag-count tree-item-flair sr-deck-counts" + }, + this.dueFlashcardsCount.toString() + ), /* @__PURE__ */ (0, import_vhtml.default)( + "span", + { + style: "background-color:#2196f3;", + class: "tag-pane-tag-count tree-item-flair sr-deck-counts" + }, + this.newFlashcardsCount.toString() + ), /* @__PURE__ */ (0, import_vhtml.default)( + "span", + { + style: "background-color:#ff7043;", + class: "tag-pane-tag-count tree-item-flair sr-deck-counts" + }, + this.totalFlashcards.toString() + )); + const deckViewChildren = deckView.createDiv("tree-item-children"); + deckViewChildren.style.display = shouldBeInitiallyExpanded ? "block" : "none"; + if (this.subdecks.length > 0) { + collapseIconEl.addEventListener("click", () => { + if (collapsed) { + collapseIconEl.childNodes[0].style.transform = ""; + deckViewChildren.style.display = "block"; + } else { + collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; + deckViewChildren.style.display = "none"; + } + collapsed = !collapsed; + }); + } + for (const deck of this.subdecks) { + deck.render(deckViewChildren, modal); + } + } + nextCard(modal) { + if (this.newFlashcards.length + this.dueFlashcards.length === 0) { + if (this.dueFlashcardsCount + this.newFlashcardsCount > 0) { + for (const deck of this.subdecks) { + if (deck.dueFlashcardsCount + deck.newFlashcardsCount > 0) { + modal.currentDeck = deck; + deck.nextCard(modal); + return; + } + } + } + if (this.parent == modal.checkDeck) { + modal.plugin.data.historyDeck = ""; + modal.decksList(); + } else { + this.parent.nextCard(modal); + } + return; + } + modal.responseDiv.style.display = "none"; + modal.resetButton.disabled = true; + modal.titleEl.setText( + `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}` + ); + modal.answerBtn.style.display = "initial"; + modal.flashcardView.empty(); + modal.mode = 1 /* Front */; + let interval = 1, ease = modal.plugin.data.settings.baseEase, delayBeforeReview = 0; + if (this.dueFlashcards.length > 0) { + if (modal.plugin.data.settings.randomizeCardOrder) { + modal.currentCardIdx = Math.floor(Math.random() * this.dueFlashcards.length); + } else { + modal.currentCardIdx = 0; + } + modal.currentCard = this.dueFlashcards[modal.currentCardIdx]; + modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); + interval = modal.currentCard.interval; + ease = modal.currentCard.ease; + delayBeforeReview = modal.currentCard.delayBeforeReview; + } else if (this.newFlashcards.length > 0) { + if (modal.plugin.data.settings.randomizeCardOrder) { + const pickedCardIdx = Math.floor(Math.random() * this.newFlashcards.length); + modal.currentCardIdx = pickedCardIdx; + const pickedCard = this.newFlashcards[pickedCardIdx]; + let idx = pickedCardIdx; + while (idx >= 0 && pickedCard.siblings.includes(this.newFlashcards[idx])) { + if (!this.newFlashcards[idx].isDue) { + modal.currentCardIdx = idx; + } + idx--; + } + } else { + modal.currentCardIdx = 0; + } + modal.currentCard = this.newFlashcards[modal.currentCardIdx]; + modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); + if (Object.prototype.hasOwnProperty.call( + modal.plugin.easeByPath, + modal.currentCard.note.path + )) { + ease = modal.plugin.easeByPath[modal.currentCard.note.path]; + } + } + const hardInterval = schedule( + 2 /* Hard */, + interval, + ease, + delayBeforeReview, + modal.plugin.data.settings + ).interval; + const goodInterval = schedule( + 1 /* Good */, + interval, + ease, + delayBeforeReview, + modal.plugin.data.settings + ).interval; + const easyInterval = schedule( + 0 /* Easy */, + interval, + ease, + delayBeforeReview, + modal.plugin.data.settings + ).interval; + if (modal.ignoreStats) { + modal.hardBtn.setText(`${modal.plugin.data.settings.flashcardHardText}`); + modal.easyBtn.setText(`${modal.plugin.data.settings.flashcardEasyText}`); + } else if (import_obsidian3.Platform.isMobile) { + modal.hardBtn.setText(textInterval(hardInterval, true)); + modal.goodBtn.setText(textInterval(goodInterval, true)); + modal.easyBtn.setText(textInterval(easyInterval, true)); + } else { + modal.hardBtn.setText( + `${modal.plugin.data.settings.flashcardHardText} - ${textInterval( + hardInterval, + false + )}` + ); + modal.goodBtn.setText( + `${modal.plugin.data.settings.flashcardGoodText} - ${textInterval( + goodInterval, + false + )}` + ); + modal.easyBtn.setText( + `${modal.plugin.data.settings.flashcardEasyText} - ${textInterval( + easyInterval, + false + )}` + ); + } + if (modal.plugin.data.settings.showContextInCards) + modal.contextView.setText(modal.currentCard.context); + } +}; + +// src/stats-modal.tsx +var import_obsidian4 = require("obsidian"); +var import_vhtml2 = __toESM(require_vhtml()); + +// node_modules/@kurkle/color/dist/color.esm.js +function round(v) { + return v + 0.5 | 0; +} +var lim = (v, l, h4) => Math.max(Math.min(v, h4), l); +function p2b(v) { + return lim(round(v * 2.55), 0, 255); +} +function n2b(v) { + return lim(round(v * 255), 0, 255); +} +function b2n(v) { + return lim(round(v / 2.55) / 100, 0, 1); +} +function n2p(v) { + return lim(round(v * 100), 0, 100); +} +var map$1 = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15 }; +var hex = [..."0123456789ABCDEF"]; +var h1 = (b) => hex[b & 15]; +var h2 = (b) => hex[(b & 240) >> 4] + hex[b & 15]; +var eq = (b) => (b & 240) >> 4 === (b & 15); +var isShort = (v) => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a); +function hexParse(str) { + var len = str.length; + var ret; + if (str[0] === "#") { + if (len === 4 || len === 5) { + ret = { + r: 255 & map$1[str[1]] * 17, + g: 255 & map$1[str[2]] * 17, + b: 255 & map$1[str[3]] * 17, + a: len === 5 ? map$1[str[4]] * 17 : 255 + }; + } else if (len === 7 || len === 9) { + ret = { + r: map$1[str[1]] << 4 | map$1[str[2]], + g: map$1[str[3]] << 4 | map$1[str[4]], + b: map$1[str[5]] << 4 | map$1[str[6]], + a: len === 9 ? map$1[str[7]] << 4 | map$1[str[8]] : 255 + }; + } + } + return ret; +} +var alpha = (a, f) => a < 255 ? f(a) : ""; +function hexString(v) { + var f = isShort(v) ? h1 : h2; + return v ? "#" + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f) : void 0; +} +var HUE_RE = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/; +function hsl2rgbn(h4, s, l) { + const a = s * Math.min(l, 1 - l); + const f = (n, k = (n + h4 / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); + return [f(0), f(8), f(4)]; +} +function hsv2rgbn(h4, s, v) { + const f = (n, k = (n + h4 / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); + return [f(5), f(3), f(1)]; +} +function hwb2rgbn(h4, w, b) { + const rgb = hsl2rgbn(h4, 1, 0.5); + let i; + if (w + b > 1) { + i = 1 / (w + b); + w *= i; + b *= i; + } + for (i = 0; i < 3; i++) { + rgb[i] *= 1 - w - b; + rgb[i] += w; + } + return rgb; +} +function hueValue(r, g, b, d, max) { + if (r === max) { + return (g - b) / d + (g < b ? 6 : 0); + } + if (g === max) { + return (b - r) / d + 2; + } + return (r - g) / d + 4; +} +function rgb2hsl(v) { + const range = 255; + const r = v.r / range; + const g = v.g / range; + const b = v.b / range; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const l = (max + min) / 2; + let h4, s, d; + if (max !== min) { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + h4 = hueValue(r, g, b, d, max); + h4 = h4 * 60 + 0.5; + } + return [h4 | 0, s || 0, l]; +} +function calln(f, a, b, c) { + return (Array.isArray(a) ? f(a[0], a[1], a[2]) : f(a, b, c)).map(n2b); +} +function hsl2rgb(h4, s, l) { + return calln(hsl2rgbn, h4, s, l); +} +function hwb2rgb(h4, w, b) { + return calln(hwb2rgbn, h4, w, b); +} +function hsv2rgb(h4, s, v) { + return calln(hsv2rgbn, h4, s, v); +} +function hue(h4) { + return (h4 % 360 + 360) % 360; +} +function hueParse(str) { + const m = HUE_RE.exec(str); + let a = 255; + let v; + if (!m) { + return; + } + if (m[5] !== v) { + a = m[6] ? p2b(+m[5]) : n2b(+m[5]); + } + const h4 = hue(+m[2]); + const p1 = +m[3] / 100; + const p2 = +m[4] / 100; + if (m[1] === "hwb") { + v = hwb2rgb(h4, p1, p2); + } else if (m[1] === "hsv") { + v = hsv2rgb(h4, p1, p2); + } else { + v = hsl2rgb(h4, p1, p2); + } + return { + r: v[0], + g: v[1], + b: v[2], + a + }; +} +function rotate(v, deg) { + var h4 = rgb2hsl(v); + h4[0] = hue(h4[0] + deg); + h4 = hsl2rgb(h4); + v.r = h4[0]; + v.g = h4[1]; + v.b = h4[2]; +} +function hslString(v) { + if (!v) { + return; + } + const a = rgb2hsl(v); + const h4 = a[0]; + const s = n2p(a[1]); + const l = n2p(a[2]); + return v.a < 255 ? `hsla(${h4}, ${s}%, ${l}%, ${b2n(v.a)})` : `hsl(${h4}, ${s}%, ${l}%)`; +} +var map = { + x: "dark", + Z: "light", + Y: "re", + X: "blu", + W: "gr", + V: "medium", + U: "slate", + A: "ee", + T: "ol", + S: "or", + B: "ra", + C: "lateg", + D: "ights", + R: "in", + Q: "turquois", + E: "hi", + P: "ro", + O: "al", + N: "le", + M: "de", + L: "yello", + F: "en", + K: "ch", + G: "arks", + H: "ea", + I: "ightg", + J: "wh" +}; +var names$1 = { + OiceXe: "f0f8ff", + antiquewEte: "faebd7", + aqua: "ffff", + aquamarRe: "7fffd4", + azuY: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "0", + blanKedOmond: "ffebcd", + Xe: "ff", + XeviTet: "8a2be2", + bPwn: "a52a2a", + burlywood: "deb887", + caMtXe: "5f9ea0", + KartYuse: "7fff00", + KocTate: "d2691e", + cSO: "ff7f50", + cSnflowerXe: "6495ed", + cSnsilk: "fff8dc", + crimson: "dc143c", + cyan: "ffff", + xXe: "8b", + xcyan: "8b8b", + xgTMnPd: "b8860b", + xWay: "a9a9a9", + xgYF: "6400", + xgYy: "a9a9a9", + xkhaki: "bdb76b", + xmagFta: "8b008b", + xTivegYF: "556b2f", + xSange: "ff8c00", + xScEd: "9932cc", + xYd: "8b0000", + xsOmon: "e9967a", + xsHgYF: "8fbc8f", + xUXe: "483d8b", + xUWay: "2f4f4f", + xUgYy: "2f4f4f", + xQe: "ced1", + xviTet: "9400d3", + dAppRk: "ff1493", + dApskyXe: "bfff", + dimWay: "696969", + dimgYy: "696969", + dodgerXe: "1e90ff", + fiYbrick: "b22222", + flSOwEte: "fffaf0", + foYstWAn: "228b22", + fuKsia: "ff00ff", + gaRsbSo: "dcdcdc", + ghostwEte: "f8f8ff", + gTd: "ffd700", + gTMnPd: "daa520", + Way: "808080", + gYF: "8000", + gYFLw: "adff2f", + gYy: "808080", + honeyMw: "f0fff0", + hotpRk: "ff69b4", + RdianYd: "cd5c5c", + Rdigo: "4b0082", + ivSy: "fffff0", + khaki: "f0e68c", + lavFMr: "e6e6fa", + lavFMrXsh: "fff0f5", + lawngYF: "7cfc00", + NmoncEffon: "fffacd", + ZXe: "add8e6", + ZcSO: "f08080", + Zcyan: "e0ffff", + ZgTMnPdLw: "fafad2", + ZWay: "d3d3d3", + ZgYF: "90ee90", + ZgYy: "d3d3d3", + ZpRk: "ffb6c1", + ZsOmon: "ffa07a", + ZsHgYF: "20b2aa", + ZskyXe: "87cefa", + ZUWay: "778899", + ZUgYy: "778899", + ZstAlXe: "b0c4de", + ZLw: "ffffe0", + lime: "ff00", + limegYF: "32cd32", + lRF: "faf0e6", + magFta: "ff00ff", + maPon: "800000", + VaquamarRe: "66cdaa", + VXe: "cd", + VScEd: "ba55d3", + VpurpN: "9370db", + VsHgYF: "3cb371", + VUXe: "7b68ee", + VsprRggYF: "fa9a", + VQe: "48d1cc", + VviTetYd: "c71585", + midnightXe: "191970", + mRtcYam: "f5fffa", + mistyPse: "ffe4e1", + moccasR: "ffe4b5", + navajowEte: "ffdead", + navy: "80", + Tdlace: "fdf5e6", + Tive: "808000", + TivedBb: "6b8e23", + Sange: "ffa500", + SangeYd: "ff4500", + ScEd: "da70d6", + pOegTMnPd: "eee8aa", + pOegYF: "98fb98", + pOeQe: "afeeee", + pOeviTetYd: "db7093", + papayawEp: "ffefd5", + pHKpuff: "ffdab9", + peru: "cd853f", + pRk: "ffc0cb", + plum: "dda0dd", + powMrXe: "b0e0e6", + purpN: "800080", + YbeccapurpN: "663399", + Yd: "ff0000", + Psybrown: "bc8f8f", + PyOXe: "4169e1", + saddNbPwn: "8b4513", + sOmon: "fa8072", + sandybPwn: "f4a460", + sHgYF: "2e8b57", + sHshell: "fff5ee", + siFna: "a0522d", + silver: "c0c0c0", + skyXe: "87ceeb", + UXe: "6a5acd", + UWay: "708090", + UgYy: "708090", + snow: "fffafa", + sprRggYF: "ff7f", + stAlXe: "4682b4", + tan: "d2b48c", + teO: "8080", + tEstN: "d8bfd8", + tomato: "ff6347", + Qe: "40e0d0", + viTet: "ee82ee", + JHt: "f5deb3", + wEte: "ffffff", + wEtesmoke: "f5f5f5", + Lw: "ffff00", + LwgYF: "9acd32" +}; +function unpack() { + const unpacked = {}; + const keys = Object.keys(names$1); + const tkeys = Object.keys(map); + let i, j, k, ok, nk; + for (i = 0; i < keys.length; i++) { + ok = nk = keys[i]; + for (j = 0; j < tkeys.length; j++) { + k = tkeys[j]; + nk = nk.replace(k, map[k]); + } + k = parseInt(names$1[ok], 16); + unpacked[nk] = [k >> 16 & 255, k >> 8 & 255, k & 255]; + } + return unpacked; +} +var names; +function nameParse(str) { + if (!names) { + names = unpack(); + names.transparent = [0, 0, 0, 0]; + } + const a = names[str.toLowerCase()]; + return a && { + r: a[0], + g: a[1], + b: a[2], + a: a.length === 4 ? a[3] : 255 + }; +} +var RGB_RE = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/; +function rgbParse(str) { + const m = RGB_RE.exec(str); + let a = 255; + let r, g, b; + if (!m) { + return; + } + if (m[7] !== r) { + const v = +m[7]; + a = m[8] ? p2b(v) : lim(v * 255, 0, 255); + } + r = +m[1]; + g = +m[3]; + b = +m[5]; + r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255)); + g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255)); + b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255)); + return { + r, + g, + b, + a + }; +} +function rgbString(v) { + return v && (v.a < 255 ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})` : `rgb(${v.r}, ${v.g}, ${v.b})`); +} +var to = (v) => v <= 31308e-7 ? v * 12.92 : Math.pow(v, 1 / 2.4) * 1.055 - 0.055; +var from = (v) => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); +function interpolate2(rgb1, rgb2, t2) { + const r = from(b2n(rgb1.r)); + const g = from(b2n(rgb1.g)); + const b = from(b2n(rgb1.b)); + return { + r: n2b(to(r + t2 * (from(b2n(rgb2.r)) - r))), + g: n2b(to(g + t2 * (from(b2n(rgb2.g)) - g))), + b: n2b(to(b + t2 * (from(b2n(rgb2.b)) - b))), + a: rgb1.a + t2 * (rgb2.a - rgb1.a) + }; +} +function modHSL(v, i, ratio) { + if (v) { + let tmp = rgb2hsl(v); + tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1)); + tmp = hsl2rgb(tmp); + v.r = tmp[0]; + v.g = tmp[1]; + v.b = tmp[2]; + } +} +function clone(v, proto) { + return v ? Object.assign(proto || {}, v) : v; +} +function fromObject(input) { + var v = { r: 0, g: 0, b: 0, a: 255 }; + if (Array.isArray(input)) { + if (input.length >= 3) { + v = { r: input[0], g: input[1], b: input[2], a: 255 }; + if (input.length > 3) { + v.a = n2b(input[3]); + } + } + } else { + v = clone(input, { r: 0, g: 0, b: 0, a: 1 }); + v.a = n2b(v.a); + } + return v; +} +function functionParse(str) { + if (str.charAt(0) === "r") { + return rgbParse(str); + } + return hueParse(str); +} +var Color = class { + constructor(input) { + if (input instanceof Color) { + return input; + } + const type = typeof input; + let v; + if (type === "object") { + v = fromObject(input); + } else if (type === "string") { + v = hexParse(input) || nameParse(input) || functionParse(input); + } + this._rgb = v; + this._valid = !!v; + } + get valid() { + return this._valid; + } + get rgb() { + var v = clone(this._rgb); + if (v) { + v.a = b2n(v.a); + } + return v; + } + set rgb(obj) { + this._rgb = fromObject(obj); + } + rgbString() { + return this._valid ? rgbString(this._rgb) : void 0; + } + hexString() { + return this._valid ? hexString(this._rgb) : void 0; + } + hslString() { + return this._valid ? hslString(this._rgb) : void 0; + } + mix(color2, weight) { + if (color2) { + const c1 = this.rgb; + const c2 = color2.rgb; + let w2; + const p = weight === w2 ? 0.5 : weight; + const w = 2 * p - 1; + const a = c1.a - c2.a; + const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2; + w2 = 1 - w1; + c1.r = 255 & w1 * c1.r + w2 * c2.r + 0.5; + c1.g = 255 & w1 * c1.g + w2 * c2.g + 0.5; + c1.b = 255 & w1 * c1.b + w2 * c2.b + 0.5; + c1.a = p * c1.a + (1 - p) * c2.a; + this.rgb = c1; + } + return this; + } + interpolate(color2, t2) { + if (color2) { + this._rgb = interpolate2(this._rgb, color2._rgb, t2); + } + return this; + } + clone() { + return new Color(this.rgb); + } + alpha(a) { + this._rgb.a = n2b(a); + return this; + } + clearer(ratio) { + const rgb = this._rgb; + rgb.a *= 1 - ratio; + return this; + } + greyscale() { + const rgb = this._rgb; + const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11); + rgb.r = rgb.g = rgb.b = val; + return this; + } + opaquer(ratio) { + const rgb = this._rgb; + rgb.a *= 1 + ratio; + return this; + } + negate() { + const v = this._rgb; + v.r = 255 - v.r; + v.g = 255 - v.g; + v.b = 255 - v.b; + return this; + } + lighten(ratio) { + modHSL(this._rgb, 2, ratio); + return this; + } + darken(ratio) { + modHSL(this._rgb, 2, -ratio); + return this; + } + saturate(ratio) { + modHSL(this._rgb, 1, ratio); + return this; + } + desaturate(ratio) { + modHSL(this._rgb, 1, -ratio); + return this; + } + rotate(deg) { + rotate(this._rgb, deg); + return this; + } +}; + +// node_modules/chart.js/dist/chunks/helpers.segment.js +function noop() { +} +var uid = (() => { + let id = 0; + return () => id++; +})(); +function isNullOrUndef(value) { + return value === null || typeof value === "undefined"; +} +function isArray(value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + const type = Object.prototype.toString.call(value); + if (type.slice(0, 7) === "[object" && type.slice(-6) === "Array]") { + return true; + } + return false; +} +function isObject(value) { + return value !== null && Object.prototype.toString.call(value) === "[object Object]"; +} +function isNumberFinite(value) { + return (typeof value === "number" || value instanceof Number) && isFinite(+value); +} +function finiteOrDefault(value, defaultValue) { + return isNumberFinite(value) ? value : defaultValue; +} +function valueOrDefault(value, defaultValue) { + return typeof value === "undefined" ? defaultValue : value; +} +var toPercentage = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 : +value / dimension; +var toDimension = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 * dimension : +value; +function callback(fn, args, thisArg) { + if (fn && typeof fn.call === "function") { + return fn.apply(thisArg, args); + } +} +function each(loopable, fn, thisArg, reverse) { + let i, len, keys; + if (isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } +} +function _elementsEqual(a0, a1) { + let i, ilen, v0, v1; + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) { + return false; + } + } + return true; +} +function clone2(source) { + if (isArray(source)) { + return source.map(clone2); + } + if (isObject(source)) { + const target = /* @__PURE__ */ Object.create(null); + const keys = Object.keys(source); + const klen = keys.length; + let k = 0; + for (; k < klen; ++k) { + target[keys[k]] = clone2(source[keys[k]]); + } + return target; + } + return source; +} +function isValidKey(key) { + return [ + "__proto__", + "prototype", + "constructor" + ].indexOf(key) === -1; +} +function _merger(key, target, source, options) { + if (!isValidKey(key)) { + return; + } + const tval = target[key]; + const sval = source[key]; + if (isObject(tval) && isObject(sval)) { + merge(tval, sval, options); + } else { + target[key] = clone2(sval); + } +} +function merge(target, source, options) { + const sources = isArray(source) ? source : [ + source + ]; + const ilen = sources.length; + if (!isObject(target)) { + return target; + } + options = options || {}; + const merger = options.merger || _merger; + let current; + for (let i = 0; i < ilen; ++i) { + current = sources[i]; + if (!isObject(current)) { + continue; + } + const keys = Object.keys(current); + for (let k = 0, klen = keys.length; k < klen; ++k) { + merger(keys[k], target, current, options); + } + } + return target; +} +function mergeIf(target, source) { + return merge(target, source, { + merger: _mergerIf + }); +} +function _mergerIf(key, target, source) { + if (!isValidKey(key)) { + return; + } + const tval = target[key]; + const sval = source[key]; + if (isObject(tval) && isObject(sval)) { + mergeIf(tval, sval); + } else if (!Object.prototype.hasOwnProperty.call(target, key)) { + target[key] = clone2(sval); + } +} +var keyResolvers = { + // Chart.helpers.core resolveObjectKey should resolve empty key to root object + "": (v) => v, + // default resolvers + x: (o) => o.x, + y: (o) => o.y +}; +function _splitKey(key) { + const parts = key.split("."); + const keys = []; + let tmp = ""; + for (const part of parts) { + tmp += part; + if (tmp.endsWith("\\")) { + tmp = tmp.slice(0, -1) + "."; + } else { + keys.push(tmp); + tmp = ""; + } + } + return keys; +} +function _getKeyResolver(key) { + const keys = _splitKey(key); + return (obj) => { + for (const k of keys) { + if (k === "") { + break; + } + obj = obj && obj[k]; + } + return obj; + }; +} +function resolveObjectKey(obj, key) { + const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key)); + return resolver(obj); +} +function _capitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} +var defined = (value) => typeof value !== "undefined"; +var isFunction = (value) => typeof value === "function"; +var setsEqual = (a, b) => { + if (a.size !== b.size) { + return false; + } + for (const item of a) { + if (!b.has(item)) { + return false; + } + } + return true; +}; +function _isClickEvent(e) { + return e.type === "mouseup" || e.type === "click" || e.type === "contextmenu"; +} +var PI = Math.PI; +var TAU = 2 * PI; +var PITAU = TAU + PI; +var INFINITY = Number.POSITIVE_INFINITY; +var RAD_PER_DEG = PI / 180; +var HALF_PI = PI / 2; +var QUARTER_PI = PI / 4; +var TWO_THIRDS_PI = PI * 2 / 3; +var log10 = Math.log10; +var sign = Math.sign; +function almostEquals(x, y, epsilon) { + return Math.abs(x - y) < epsilon; +} +function niceNum(range) { + const roundedRange = Math.round(range); + range = almostEquals(range, roundedRange, range / 1e3) ? roundedRange : range; + const niceRange = Math.pow(10, Math.floor(log10(range))); + const fraction = range / niceRange; + const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10; + return niceFraction * niceRange; +} +function _factorize(value) { + const result = []; + const sqrt = Math.sqrt(value); + let i; + for (i = 1; i < sqrt; i++) { + if (value % i === 0) { + result.push(i); + result.push(value / i); + } + } + if (sqrt === (sqrt | 0)) { + result.push(sqrt); + } + result.sort((a, b) => a - b).pop(); + return result; +} +function isNumber(n) { + return !isNaN(parseFloat(n)) && isFinite(n); +} +function almostWhole(x, epsilon) { + const rounded = Math.round(x); + return rounded - epsilon <= x && rounded + epsilon >= x; +} +function _setMinAndMaxByKey(array, target, property) { + let i, ilen, value; + for (i = 0, ilen = array.length; i < ilen; i++) { + value = array[i][property]; + if (!isNaN(value)) { + target.min = Math.min(target.min, value); + target.max = Math.max(target.max, value); + } + } +} +function toRadians(degrees) { + return degrees * (PI / 180); +} +function toDegrees(radians) { + return radians * (180 / PI); +} +function _decimalPlaces(x) { + if (!isNumberFinite(x)) { + return; + } + let e = 1; + let p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; +} +function getAngleFromPoint(centrePoint, anglePoint) { + const distanceFromXCenter = anglePoint.x - centrePoint.x; + const distanceFromYCenter = anglePoint.y - centrePoint.y; + const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + if (angle < -0.5 * PI) { + angle += TAU; + } + return { + angle, + distance: radialDistanceFromCenter + }; +} +function distanceBetweenPoints(pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); +} +function _normalizeAngle(a) { + return (a % TAU + TAU) % TAU; +} +function _angleBetween(angle, start, end, sameAngleIsFullCircle) { + const a = _normalizeAngle(angle); + const s = _normalizeAngle(start); + const e = _normalizeAngle(end); + const angleToStart = _normalizeAngle(s - a); + const angleToEnd = _normalizeAngle(e - a); + const startToAngle = _normalizeAngle(a - s); + const endToAngle = _normalizeAngle(a - e); + return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle; +} +function _limitValue(value, min, max) { + return Math.max(min, Math.min(max, value)); +} +function _int16Range(value) { + return _limitValue(value, -32768, 32767); +} +function _isBetween(value, start, end, epsilon = 1e-6) { + return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon; +} +function _lookup(table, value, cmp) { + cmp = cmp || ((index) => table[index] < value); + let hi = table.length - 1; + let lo = 0; + let mid; + while (hi - lo > 1) { + mid = lo + hi >> 1; + if (cmp(mid)) { + lo = mid; + } else { + hi = mid; + } + } + return { + lo, + hi + }; +} +var _lookupByKey = (table, key, value, last) => _lookup(table, value, last ? (index) => { + const ti = table[index][key]; + return ti < value || ti === value && table[index + 1][key] === value; +} : (index) => table[index][key] < value); +var _rlookupByKey = (table, key, value) => _lookup(table, value, (index) => table[index][key] >= value); +function _filterBetween(values, min, max) { + let start = 0; + let end = values.length; + while (start < end && values[start] < min) { + start++; + } + while (end > start && values[end - 1] > max) { + end--; + } + return start > 0 || end < values.length ? values.slice(start, end) : values; +} +var arrayEvents = [ + "push", + "pop", + "shift", + "splice", + "unshift" +]; +function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + Object.defineProperty(array, "_chartjs", { + configurable: true, + enumerable: false, + value: { + listeners: [ + listener + ] + } + }); + arrayEvents.forEach((key) => { + const method = "_onData" + _capitalize(key); + const base = array[key]; + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value(...args) { + const res = base.apply(this, args); + array._chartjs.listeners.forEach((object) => { + if (typeof object[method] === "function") { + object[method](...args); + } + }); + return res; + } + }); + }); +} +function unlistenArrayEvents(array, listener) { + const stub = array._chartjs; + if (!stub) { + return; + } + const listeners = stub.listeners; + const index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + if (listeners.length > 0) { + return; + } + arrayEvents.forEach((key) => { + delete array[key]; + }); + delete array._chartjs; +} +function _arrayUnique(items) { + const set2 = /* @__PURE__ */ new Set(); + let i, ilen; + for (i = 0, ilen = items.length; i < ilen; ++i) { + set2.add(items[i]); + } + if (set2.size === ilen) { + return items; + } + return Array.from(set2); +} +var requestAnimFrame = function() { + if (typeof window === "undefined") { + return function(callback2) { + return callback2(); + }; + } + return window.requestAnimationFrame; +}(); +function throttled(fn, thisArg) { + let argsToUse = []; + let ticking = false; + return function(...args) { + argsToUse = args; + if (!ticking) { + ticking = true; + requestAnimFrame.call(window, () => { + ticking = false; + fn.apply(thisArg, argsToUse); + }); + } + }; +} +function debounce(fn, delay) { + let timeout; + return function(...args) { + if (delay) { + clearTimeout(timeout); + timeout = setTimeout(fn, delay, args); + } else { + fn.apply(this, args); + } + return delay; + }; +} +var _toLeftRightCenter = (align) => align === "start" ? "left" : align === "end" ? "right" : "center"; +var _alignStartEnd = (align, start, end) => align === "start" ? start : align === "end" ? end : (start + end) / 2; +var _textX = (align, left, right, rtl) => { + const check = rtl ? "left" : "right"; + return align === check ? right : align === "center" ? (left + right) / 2 : left; +}; +var atEdge = (t2) => t2 === 0 || t2 === 1; +var elasticIn = (t2, s, p) => -(Math.pow(2, 10 * (t2 -= 1)) * Math.sin((t2 - s) * TAU / p)); +var elasticOut = (t2, s, p) => Math.pow(2, -10 * t2) * Math.sin((t2 - s) * TAU / p) + 1; +var effects = { + linear: (t2) => t2, + easeInQuad: (t2) => t2 * t2, + easeOutQuad: (t2) => -t2 * (t2 - 2), + easeInOutQuad: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 : -0.5 * (--t2 * (t2 - 2) - 1), + easeInCubic: (t2) => t2 * t2 * t2, + easeOutCubic: (t2) => (t2 -= 1) * t2 * t2 + 1, + easeInOutCubic: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 + 2), + easeInQuart: (t2) => t2 * t2 * t2 * t2, + easeOutQuart: (t2) => -((t2 -= 1) * t2 * t2 * t2 - 1), + easeInOutQuart: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 : -0.5 * ((t2 -= 2) * t2 * t2 * t2 - 2), + easeInQuint: (t2) => t2 * t2 * t2 * t2 * t2, + easeOutQuint: (t2) => (t2 -= 1) * t2 * t2 * t2 * t2 + 1, + easeInOutQuint: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 * t2 * t2 + 2), + easeInSine: (t2) => -Math.cos(t2 * HALF_PI) + 1, + easeOutSine: (t2) => Math.sin(t2 * HALF_PI), + easeInOutSine: (t2) => -0.5 * (Math.cos(PI * t2) - 1), + easeInExpo: (t2) => t2 === 0 ? 0 : Math.pow(2, 10 * (t2 - 1)), + easeOutExpo: (t2) => t2 === 1 ? 1 : -Math.pow(2, -10 * t2) + 1, + easeInOutExpo: (t2) => atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * Math.pow(2, 10 * (t2 * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t2 * 2 - 1)) + 2), + easeInCirc: (t2) => t2 >= 1 ? t2 : -(Math.sqrt(1 - t2 * t2) - 1), + easeOutCirc: (t2) => Math.sqrt(1 - (t2 -= 1) * t2), + easeInOutCirc: (t2) => (t2 /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t2 * t2) - 1) : 0.5 * (Math.sqrt(1 - (t2 -= 2) * t2) + 1), + easeInElastic: (t2) => atEdge(t2) ? t2 : elasticIn(t2, 0.075, 0.3), + easeOutElastic: (t2) => atEdge(t2) ? t2 : elasticOut(t2, 0.075, 0.3), + easeInOutElastic(t2) { + const s = 0.1125; + const p = 0.45; + return atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * elasticIn(t2 * 2, s, p) : 0.5 + 0.5 * elasticOut(t2 * 2 - 1, s, p); + }, + easeInBack(t2) { + const s = 1.70158; + return t2 * t2 * ((s + 1) * t2 - s); + }, + easeOutBack(t2) { + const s = 1.70158; + return (t2 -= 1) * t2 * ((s + 1) * t2 + s) + 1; + }, + easeInOutBack(t2) { + let s = 1.70158; + if ((t2 /= 0.5) < 1) { + return 0.5 * (t2 * t2 * (((s *= 1.525) + 1) * t2 - s)); + } + return 0.5 * ((t2 -= 2) * t2 * (((s *= 1.525) + 1) * t2 + s) + 2); + }, + easeInBounce: (t2) => 1 - effects.easeOutBounce(1 - t2), + easeOutBounce(t2) { + const m = 7.5625; + const d = 2.75; + if (t2 < 1 / d) { + return m * t2 * t2; + } + if (t2 < 2 / d) { + return m * (t2 -= 1.5 / d) * t2 + 0.75; + } + if (t2 < 2.5 / d) { + return m * (t2 -= 2.25 / d) * t2 + 0.9375; + } + return m * (t2 -= 2.625 / d) * t2 + 0.984375; + }, + easeInOutBounce: (t2) => t2 < 0.5 ? effects.easeInBounce(t2 * 2) * 0.5 : effects.easeOutBounce(t2 * 2 - 1) * 0.5 + 0.5 +}; +function isPatternOrGradient(value) { + if (value && typeof value === "object") { + const type = value.toString(); + return type === "[object CanvasPattern]" || type === "[object CanvasGradient]"; + } + return false; +} +function color(value) { + return isPatternOrGradient(value) ? value : new Color(value); +} +function getHoverColor(value) { + return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString(); +} +var numbers = [ + "x", + "y", + "borderWidth", + "radius", + "tension" +]; +var colors = [ + "color", + "borderColor", + "backgroundColor" +]; +function applyAnimationsDefaults(defaults2) { + defaults2.set("animation", { + delay: void 0, + duration: 1e3, + easing: "easeOutQuart", + fn: void 0, + from: void 0, + loop: void 0, + to: void 0, + type: void 0 + }); + defaults2.describe("animation", { + _fallback: false, + _indexable: false, + _scriptable: (name2) => name2 !== "onProgress" && name2 !== "onComplete" && name2 !== "fn" + }); + defaults2.set("animations", { + colors: { + type: "color", + properties: colors + }, + numbers: { + type: "number", + properties: numbers + } + }); + defaults2.describe("animations", { + _fallback: "animation" + }); + defaults2.set("transitions", { + active: { + animation: { + duration: 400 + } + }, + resize: { + animation: { + duration: 0 + } + }, + show: { + animations: { + colors: { + from: "transparent" + }, + visible: { + type: "boolean", + duration: 0 + } + } + }, + hide: { + animations: { + colors: { + to: "transparent" + }, + visible: { + type: "boolean", + easing: "linear", + fn: (v) => v | 0 + } + } + } + }); +} +function applyLayoutsDefaults(defaults2) { + defaults2.set("layout", { + autoPadding: true, + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + }); +} +var intlCache = /* @__PURE__ */ new Map(); +function getNumberFormat(locale2, options) { + options = options || {}; + const cacheKey = locale2 + JSON.stringify(options); + let formatter = intlCache.get(cacheKey); + if (!formatter) { + formatter = new Intl.NumberFormat(locale2, options); + intlCache.set(cacheKey, formatter); + } + return formatter; +} +function formatNumber(num, locale2, options) { + return getNumberFormat(locale2, options).format(num); +} +var formatters = { + values(value) { + return isArray(value) ? value : "" + value; + }, + numeric(tickValue, index, ticks) { + if (tickValue === 0) { + return "0"; + } + const locale2 = this.chart.options.locale; + let notation; + let delta = tickValue; + if (ticks.length > 1) { + const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value)); + if (maxTick < 1e-4 || maxTick > 1e15) { + notation = "scientific"; + } + delta = calculateDelta(tickValue, ticks); + } + const logDelta = log10(Math.abs(delta)); + const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0); + const options = { + notation, + minimumFractionDigits: numDecimal, + maximumFractionDigits: numDecimal + }; + Object.assign(options, this.options.ticks.format); + return formatNumber(tickValue, locale2, options); + }, + logarithmic(tickValue, index, ticks) { + if (tickValue === 0) { + return "0"; + } + const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue))); + if ([ + 1, + 2, + 3, + 5, + 10, + 15 + ].includes(remain) || index > 0.8 * ticks.length) { + return formatters.numeric.call(this, tickValue, index, ticks); + } + return ""; + } +}; +function calculateDelta(tickValue, ticks) { + let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value; + if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) { + delta = tickValue - Math.floor(tickValue); + } + return delta; +} +var Ticks = { + formatters +}; +function applyScaleDefaults(defaults2) { + defaults2.set("scale", { + display: true, + offset: false, + reverse: false, + beginAtZero: false, + bounds: "ticks", + grace: 0, + grid: { + display: true, + lineWidth: 1, + drawOnChartArea: true, + drawTicks: true, + tickLength: 8, + tickWidth: (_ctx, options) => options.lineWidth, + tickColor: (_ctx, options) => options.color, + offset: false + }, + border: { + display: true, + dash: [], + dashOffset: 0, + width: 1 + }, + title: { + display: false, + text: "", + padding: { + top: 4, + bottom: 4 + } + }, + ticks: { + minRotation: 0, + maxRotation: 50, + mirror: false, + textStrokeWidth: 0, + textStrokeColor: "", + padding: 3, + display: true, + autoSkip: true, + autoSkipPadding: 3, + labelOffset: 0, + callback: Ticks.formatters.values, + minor: {}, + major: {}, + align: "center", + crossAlign: "near", + showLabelBackdrop: false, + backdropColor: "rgba(255, 255, 255, 0.75)", + backdropPadding: 2 + } + }); + defaults2.route("scale.ticks", "color", "", "color"); + defaults2.route("scale.grid", "color", "", "borderColor"); + defaults2.route("scale.border", "color", "", "borderColor"); + defaults2.route("scale.title", "color", "", "color"); + defaults2.describe("scale", { + _fallback: false, + _scriptable: (name2) => !name2.startsWith("before") && !name2.startsWith("after") && name2 !== "callback" && name2 !== "parser", + _indexable: (name2) => name2 !== "borderDash" && name2 !== "tickBorderDash" && name2 !== "dash" + }); + defaults2.describe("scales", { + _fallback: "scale" + }); + defaults2.describe("scale.ticks", { + _scriptable: (name2) => name2 !== "backdropPadding" && name2 !== "callback", + _indexable: (name2) => name2 !== "backdropPadding" + }); +} +var overrides = /* @__PURE__ */ Object.create(null); +var descriptors = /* @__PURE__ */ Object.create(null); +function getScope$1(node, key) { + if (!key) { + return node; + } + const keys = key.split("."); + for (let i = 0, n = keys.length; i < n; ++i) { + const k = keys[i]; + node = node[k] || (node[k] = /* @__PURE__ */ Object.create(null)); + } + return node; +} +function set(root, scope, values) { + if (typeof scope === "string") { + return merge(getScope$1(root, scope), values); + } + return merge(getScope$1(root, ""), scope); +} +var Defaults = class { + constructor(_descriptors2, _appliers) { + this.animation = void 0; + this.backgroundColor = "rgba(0,0,0,0.1)"; + this.borderColor = "rgba(0,0,0,0.1)"; + this.color = "#666"; + this.datasets = {}; + this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio(); + this.elements = {}; + this.events = [ + "mousemove", + "mouseout", + "click", + "touchstart", + "touchmove" + ]; + this.font = { + family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + size: 12, + style: "normal", + lineHeight: 1.2, + weight: null + }; + this.hover = {}; + this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor); + this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor); + this.hoverColor = (ctx, options) => getHoverColor(options.color); + this.indexAxis = "x"; + this.interaction = { + mode: "nearest", + intersect: true, + includeInvisible: false + }; + this.maintainAspectRatio = true; + this.onHover = null; + this.onClick = null; + this.parsing = true; + this.plugins = {}; + this.responsive = true; + this.scale = void 0; + this.scales = {}; + this.showLine = true; + this.drawActiveElementsOnTop = true; + this.describe(_descriptors2); + this.apply(_appliers); + } + set(scope, values) { + return set(this, scope, values); + } + get(scope) { + return getScope$1(this, scope); + } + describe(scope, values) { + return set(descriptors, scope, values); + } + override(scope, values) { + return set(overrides, scope, values); + } + route(scope, name2, targetScope, targetName) { + const scopeObject = getScope$1(this, scope); + const targetScopeObject = getScope$1(this, targetScope); + const privateName = "_" + name2; + Object.defineProperties(scopeObject, { + [privateName]: { + value: scopeObject[name2], + writable: true + }, + [name2]: { + enumerable: true, + get() { + const local = this[privateName]; + const target = targetScopeObject[targetName]; + if (isObject(local)) { + return Object.assign({}, target, local); + } + return valueOrDefault(local, target); + }, + set(value) { + this[privateName] = value; + } + } + }); + } + apply(appliers) { + appliers.forEach((apply) => apply(this)); + } +}; +var defaults = /* @__PURE__ */ new Defaults({ + _scriptable: (name2) => !name2.startsWith("on"), + _indexable: (name2) => name2 !== "events", + hover: { + _fallback: "interaction" + }, + interaction: { + _scriptable: false, + _indexable: false + } +}, [ + applyAnimationsDefaults, + applyLayoutsDefaults, + applyScaleDefaults +]); +function toFontString(font) { + if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) { + return null; + } + return (font.style ? font.style + " " : "") + (font.weight ? font.weight + " " : "") + font.size + "px " + font.family; +} +function _measureText(ctx, data, gc, longest, string) { + let textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; +} +function _longestText(ctx, font, arrayOfThings, cache) { + cache = cache || {}; + let data = cache.data = cache.data || {}; + let gc = cache.garbageCollect = cache.garbageCollect || []; + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + ctx.save(); + ctx.font = font; + let longest = 0; + const ilen = arrayOfThings.length; + let i, j, jlen, thing, nestedThing; + for (i = 0; i < ilen; i++) { + thing = arrayOfThings[i]; + if (thing !== void 0 && thing !== null && isArray(thing) !== true) { + longest = _measureText(ctx, data, gc, longest, thing); + } else if (isArray(thing)) { + for (j = 0, jlen = thing.length; j < jlen; j++) { + nestedThing = thing[j]; + if (nestedThing !== void 0 && nestedThing !== null && !isArray(nestedThing)) { + longest = _measureText(ctx, data, gc, longest, nestedThing); + } + } + } + } + ctx.restore(); + const gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; +} +function _alignPixel(chart, pixel, width) { + const devicePixelRatio = chart.currentDevicePixelRatio; + const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; +} +function clearCanvas(canvas, ctx) { + ctx = ctx || canvas.getContext("2d"); + ctx.save(); + ctx.resetTransform(); + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.restore(); +} +function drawPoint(ctx, options, x, y) { + drawPointLegend(ctx, options, x, y, null); +} +function drawPointLegend(ctx, options, x, y, w) { + let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW; + const style = options.pointStyle; + const rotation = options.rotation; + const radius = options.radius; + let rad = (rotation || 0) * RAD_PER_DEG; + if (style && typeof style === "object") { + type = style.toString(); + if (type === "[object HTMLImageElement]" || type === "[object HTMLCanvasElement]") { + ctx.save(); + ctx.translate(x, y); + ctx.rotate(rad); + ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); + ctx.restore(); + return; + } + } + if (isNaN(radius) || radius <= 0) { + return; + } + ctx.beginPath(); + switch (style) { + default: + if (w) { + ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU); + } else { + ctx.arc(x, y, radius, 0, TAU); + } + ctx.closePath(); + break; + case "triangle": + width = w ? w / 2 : radius; + ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case "rectRounded": + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); + yOffset = Math.sin(rad + QUARTER_PI) * size; + yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); + ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case "rect": + if (!rotation) { + size = Math.SQRT1_2 * radius; + width = w ? w / 2 : size; + ctx.rect(x - width, y - size, 2 * width, 2 * size); + break; + } + rad += QUARTER_PI; + case "rectRot": + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + ctx.closePath(); + break; + case "crossRot": + rad += QUARTER_PI; + case "cross": + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + break; + case "star": + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + rad += QUARTER_PI; + xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); + ctx.moveTo(x - xOffsetW, y - yOffset); + ctx.lineTo(x + xOffsetW, y + yOffset); + ctx.moveTo(x + yOffsetW, y - xOffset); + ctx.lineTo(x - yOffsetW, y + xOffset); + break; + case "line": + xOffset = w ? w / 2 : Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case "dash": + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius); + break; + case false: + ctx.closePath(); + break; + } + ctx.fill(); + if (options.borderWidth > 0) { + ctx.stroke(); + } +} +function _isPointInArea(point, area, margin) { + margin = margin || 0.5; + return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin; +} +function clipArea(ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); +} +function unclipArea(ctx) { + ctx.restore(); +} +function renderText(ctx, text, x, y, font, opts = {}) { + const lines = isArray(text) ? text : [ + text + ]; + const stroke = opts.strokeWidth > 0 && opts.strokeColor !== ""; + let i, line; + ctx.save(); + ctx.font = font.string; + setRenderOpts(ctx, opts); + for (i = 0; i < lines.length; ++i) { + line = lines[i]; + if (opts.backdrop) { + drawBackdrop(ctx, opts.backdrop); + } + if (stroke) { + if (opts.strokeColor) { + ctx.strokeStyle = opts.strokeColor; + } + if (!isNullOrUndef(opts.strokeWidth)) { + ctx.lineWidth = opts.strokeWidth; + } + ctx.strokeText(line, x, y, opts.maxWidth); + } + ctx.fillText(line, x, y, opts.maxWidth); + decorateText(ctx, x, y, line, opts); + y += font.lineHeight; + } + ctx.restore(); +} +function setRenderOpts(ctx, opts) { + if (opts.translation) { + ctx.translate(opts.translation[0], opts.translation[1]); + } + if (!isNullOrUndef(opts.rotation)) { + ctx.rotate(opts.rotation); + } + if (opts.color) { + ctx.fillStyle = opts.color; + } + if (opts.textAlign) { + ctx.textAlign = opts.textAlign; + } + if (opts.textBaseline) { + ctx.textBaseline = opts.textBaseline; + } +} +function decorateText(ctx, x, y, line, opts) { + if (opts.strikethrough || opts.underline) { + const metrics = ctx.measureText(line); + const left = x - metrics.actualBoundingBoxLeft; + const right = x + metrics.actualBoundingBoxRight; + const top = y - metrics.actualBoundingBoxAscent; + const bottom = y + metrics.actualBoundingBoxDescent; + const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom; + ctx.strokeStyle = ctx.fillStyle; + ctx.beginPath(); + ctx.lineWidth = opts.decorationWidth || 2; + ctx.moveTo(left, yDecoration); + ctx.lineTo(right, yDecoration); + ctx.stroke(); + } +} +function drawBackdrop(ctx, opts) { + const oldColor = ctx.fillStyle; + ctx.fillStyle = opts.color; + ctx.fillRect(opts.left, opts.top, opts.width, opts.height); + ctx.fillStyle = oldColor; +} +function addRoundedRectPath(ctx, rect) { + const { x, y, w, h: h4, radius } = rect; + ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true); + ctx.lineTo(x, y + h4 - radius.bottomLeft); + ctx.arc(x + radius.bottomLeft, y + h4 - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true); + ctx.lineTo(x + w - radius.bottomRight, y + h4); + ctx.arc(x + w - radius.bottomRight, y + h4 - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true); + ctx.lineTo(x + w, y + radius.topRight); + ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true); + ctx.lineTo(x + radius.topLeft, y); +} +var LINE_HEIGHT = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/; +var FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/; +function toLineHeight(value, size) { + const matches = ("" + value).match(LINE_HEIGHT); + if (!matches || matches[1] === "normal") { + return size * 1.2; + } + value = +matches[2]; + switch (matches[3]) { + case "px": + return value; + case "%": + value /= 100; + break; + } + return size * value; +} +var numberOrZero = (v) => +v || 0; +function _readValueToProps(value, props) { + const ret = {}; + const objProps = isObject(props); + const keys = objProps ? Object.keys(props) : props; + const read = isObject(value) ? objProps ? (prop) => valueOrDefault(value[prop], value[props[prop]]) : (prop) => value[prop] : () => value; + for (const prop of keys) { + ret[prop] = numberOrZero(read(prop)); + } + return ret; +} +function toTRBL(value) { + return _readValueToProps(value, { + top: "y", + right: "x", + bottom: "y", + left: "x" + }); +} +function toTRBLCorners(value) { + return _readValueToProps(value, [ + "topLeft", + "topRight", + "bottomLeft", + "bottomRight" + ]); +} +function toPadding(value) { + const obj = toTRBL(value); + obj.width = obj.left + obj.right; + obj.height = obj.top + obj.bottom; + return obj; +} +function toFont(options, fallback) { + options = options || {}; + fallback = fallback || defaults.font; + let size = valueOrDefault(options.size, fallback.size); + if (typeof size === "string") { + size = parseInt(size, 10); + } + let style = valueOrDefault(options.style, fallback.style); + if (style && !("" + style).match(FONT_STYLE)) { + console.warn('Invalid font style specified: "' + style + '"'); + style = void 0; + } + const font = { + family: valueOrDefault(options.family, fallback.family), + lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size), + size, + style, + weight: valueOrDefault(options.weight, fallback.weight), + string: "" + }; + font.string = toFontString(font); + return font; +} +function resolve(inputs, context, index, info) { + let cacheable = true; + let i, ilen, value; + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === void 0) { + continue; + } + if (context !== void 0 && typeof value === "function") { + value = value(context); + cacheable = false; + } + if (index !== void 0 && isArray(value)) { + value = value[index % value.length]; + cacheable = false; + } + if (value !== void 0) { + if (info && !cacheable) { + info.cacheable = false; + } + return value; + } + } +} +function _addGrace(minmax, grace, beginAtZero) { + const { min, max } = minmax; + const change = toDimension(grace, (max - min) / 2); + const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add; + return { + min: keepZero(min, -Math.abs(change)), + max: keepZero(max, change) + }; +} +function createContext(parentContext, context) { + return Object.assign(Object.create(parentContext), context); +} +function _createResolver(scopes, prefixes = [ + "" +], rootScopes = scopes, fallback, getTarget = () => scopes[0]) { + if (!defined(fallback)) { + fallback = _resolve("_fallback", scopes); + } + const cache = { + [Symbol.toStringTag]: "Object", + _cacheable: true, + _scopes: scopes, + _rootScopes: rootScopes, + _fallback: fallback, + _getTarget: getTarget, + override: (scope) => _createResolver([ + scope, + ...scopes + ], prefixes, rootScopes, fallback) + }; + return new Proxy(cache, { + deleteProperty(target, prop) { + delete target[prop]; + delete target._keys; + delete scopes[0][prop]; + return true; + }, + get(target, prop) { + return _cached(target, prop, () => _resolveWithPrefixes(prop, prefixes, scopes, target)); + }, + getOwnPropertyDescriptor(target, prop) { + return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop); + }, + getPrototypeOf() { + return Reflect.getPrototypeOf(scopes[0]); + }, + has(target, prop) { + return getKeysFromAllScopes(target).includes(prop); + }, + ownKeys(target) { + return getKeysFromAllScopes(target); + }, + set(target, prop, value) { + const storage = target._storage || (target._storage = getTarget()); + target[prop] = storage[prop] = value; + delete target._keys; + return true; + } + }); +} +function _attachContext(proxy, context, subProxy, descriptorDefaults) { + const cache = { + _cacheable: false, + _proxy: proxy, + _context: context, + _subProxy: subProxy, + _stack: /* @__PURE__ */ new Set(), + _descriptors: _descriptors(proxy, descriptorDefaults), + setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults), + override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults) + }; + return new Proxy(cache, { + deleteProperty(target, prop) { + delete target[prop]; + delete proxy[prop]; + return true; + }, + get(target, prop, receiver) { + return _cached(target, prop, () => _resolveWithContext(target, prop, receiver)); + }, + getOwnPropertyDescriptor(target, prop) { + return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? { + enumerable: true, + configurable: true + } : void 0 : Reflect.getOwnPropertyDescriptor(proxy, prop); + }, + getPrototypeOf() { + return Reflect.getPrototypeOf(proxy); + }, + has(target, prop) { + return Reflect.has(proxy, prop); + }, + ownKeys() { + return Reflect.ownKeys(proxy); + }, + set(target, prop, value) { + proxy[prop] = value; + delete target[prop]; + return true; + } + }); +} +function _descriptors(proxy, defaults2 = { + scriptable: true, + indexable: true +}) { + const { _scriptable = defaults2.scriptable, _indexable = defaults2.indexable, _allKeys = defaults2.allKeys } = proxy; + return { + allKeys: _allKeys, + scriptable: _scriptable, + indexable: _indexable, + isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable, + isIndexable: isFunction(_indexable) ? _indexable : () => _indexable + }; +} +var readKey = (prefix, name2) => prefix ? prefix + _capitalize(name2) : name2; +var needsSubResolver = (prop, value) => isObject(value) && prop !== "adapters" && (Object.getPrototypeOf(value) === null || value.constructor === Object); +function _cached(target, prop, resolve2) { + if (Object.prototype.hasOwnProperty.call(target, prop)) { + return target[prop]; + } + const value = resolve2(); + target[prop] = value; + return value; +} +function _resolveWithContext(target, prop, receiver) { + const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target; + let value = _proxy[prop]; + if (isFunction(value) && descriptors2.isScriptable(prop)) { + value = _resolveScriptable(prop, value, target, receiver); + } + if (isArray(value) && value.length) { + value = _resolveArray(prop, value, target, descriptors2.isIndexable); + } + if (needsSubResolver(prop, value)) { + value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors2); + } + return value; +} +function _resolveScriptable(prop, value, target, receiver) { + const { _proxy, _context, _subProxy, _stack } = target; + if (_stack.has(prop)) { + throw new Error("Recursion detected: " + Array.from(_stack).join("->") + "->" + prop); + } + _stack.add(prop); + value = value(_context, _subProxy || receiver); + _stack.delete(prop); + if (needsSubResolver(prop, value)) { + value = createSubResolver(_proxy._scopes, _proxy, prop, value); + } + return value; +} +function _resolveArray(prop, value, target, isIndexable) { + const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target; + if (defined(_context.index) && isIndexable(prop)) { + value = value[_context.index % value.length]; + } else if (isObject(value[0])) { + const arr = value; + const scopes = _proxy._scopes.filter((s) => s !== arr); + value = []; + for (const item of arr) { + const resolver = createSubResolver(scopes, _proxy, prop, item); + value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors2)); + } + } + return value; +} +function resolveFallback(fallback, prop, value) { + return isFunction(fallback) ? fallback(prop, value) : fallback; +} +var getScope = (key, parent) => key === true ? parent : typeof key === "string" ? resolveObjectKey(parent, key) : void 0; +function addScopes(set2, parentScopes, key, parentFallback, value) { + for (const parent of parentScopes) { + const scope = getScope(key, parent); + if (scope) { + set2.add(scope); + const fallback = resolveFallback(scope._fallback, key, value); + if (defined(fallback) && fallback !== key && fallback !== parentFallback) { + return fallback; + } + } else if (scope === false && defined(parentFallback) && key !== parentFallback) { + return null; + } + } + return false; +} +function createSubResolver(parentScopes, resolver, prop, value) { + const rootScopes = resolver._rootScopes; + const fallback = resolveFallback(resolver._fallback, prop, value); + const allScopes = [ + ...parentScopes, + ...rootScopes + ]; + const set2 = /* @__PURE__ */ new Set(); + set2.add(value); + let key = addScopesFromKey(set2, allScopes, prop, fallback || prop, value); + if (key === null) { + return false; + } + if (defined(fallback) && fallback !== prop) { + key = addScopesFromKey(set2, allScopes, fallback, key, value); + if (key === null) { + return false; + } + } + return _createResolver(Array.from(set2), [ + "" + ], rootScopes, fallback, () => subGetTarget(resolver, prop, value)); +} +function addScopesFromKey(set2, allScopes, key, fallback, item) { + while (key) { + key = addScopes(set2, allScopes, key, fallback, item); + } + return key; +} +function subGetTarget(resolver, prop, value) { + const parent = resolver._getTarget(); + if (!(prop in parent)) { + parent[prop] = {}; + } + const target = parent[prop]; + if (isArray(target) && isObject(value)) { + return value; + } + return target || {}; +} +function _resolveWithPrefixes(prop, prefixes, scopes, proxy) { + let value; + for (const prefix of prefixes) { + value = _resolve(readKey(prefix, prop), scopes); + if (defined(value)) { + return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value; + } + } +} +function _resolve(key, scopes) { + for (const scope of scopes) { + if (!scope) { + continue; + } + const value = scope[key]; + if (defined(value)) { + return value; + } + } +} +function getKeysFromAllScopes(target) { + let keys = target._keys; + if (!keys) { + keys = target._keys = resolveKeysFromAllScopes(target._scopes); + } + return keys; +} +function resolveKeysFromAllScopes(scopes) { + const set2 = /* @__PURE__ */ new Set(); + for (const scope of scopes) { + for (const key of Object.keys(scope).filter((k) => !k.startsWith("_"))) { + set2.add(key); + } + } + return Array.from(set2); +} +var EPSILON = Number.EPSILON || 1e-14; +function _isDomSupported() { + return typeof window !== "undefined" && typeof document !== "undefined"; +} +function _getParentNode(domNode) { + let parent = domNode.parentNode; + if (parent && parent.toString() === "[object ShadowRoot]") { + parent = parent.host; + } + return parent; +} +function parseMaxStyle(styleValue, node, parentProperty) { + let valueInPixels; + if (typeof styleValue === "string") { + valueInPixels = parseInt(styleValue, 10); + if (styleValue.indexOf("%") !== -1) { + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + return valueInPixels; +} +var getComputedStyle2 = (element) => element.ownerDocument.defaultView.getComputedStyle(element, null); +function getStyle(el, property) { + return getComputedStyle2(el).getPropertyValue(property); +} +var positions = [ + "top", + "right", + "bottom", + "left" +]; +function getPositionedStyle(styles, style, suffix) { + const result = {}; + suffix = suffix ? "-" + suffix : ""; + for (let i = 0; i < 4; i++) { + const pos = positions[i]; + result[pos] = parseFloat(styles[style + "-" + pos + suffix]) || 0; + } + result.width = result.left + result.right; + result.height = result.top + result.bottom; + return result; +} +var useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot); +function getCanvasPosition(e, canvas) { + const touches = e.touches; + const source = touches && touches.length ? touches[0] : e; + const { offsetX, offsetY } = source; + let box = false; + let x, y; + if (useOffsetPos(offsetX, offsetY, e.target)) { + x = offsetX; + y = offsetY; + } else { + const rect = canvas.getBoundingClientRect(); + x = source.clientX - rect.left; + y = source.clientY - rect.top; + box = true; + } + return { + x, + y, + box + }; +} +function getRelativePosition(event, chart) { + if ("native" in event) { + return event; + } + const { canvas, currentDevicePixelRatio } = chart; + const style = getComputedStyle2(canvas); + const borderBox = style.boxSizing === "border-box"; + const paddings = getPositionedStyle(style, "padding"); + const borders = getPositionedStyle(style, "border", "width"); + const { x, y, box } = getCanvasPosition(event, canvas); + const xOffset = paddings.left + (box && borders.left); + const yOffset = paddings.top + (box && borders.top); + let { width, height } = chart; + if (borderBox) { + width -= paddings.width + borders.width; + height -= paddings.height + borders.height; + } + return { + x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio), + y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio) + }; +} +function getContainerSize(canvas, width, height) { + let maxWidth, maxHeight; + if (width === void 0 || height === void 0) { + const container = _getParentNode(canvas); + if (!container) { + width = canvas.clientWidth; + height = canvas.clientHeight; + } else { + const rect = container.getBoundingClientRect(); + const containerStyle = getComputedStyle2(container); + const containerBorder = getPositionedStyle(containerStyle, "border", "width"); + const containerPadding = getPositionedStyle(containerStyle, "padding"); + width = rect.width - containerPadding.width - containerBorder.width; + height = rect.height - containerPadding.height - containerBorder.height; + maxWidth = parseMaxStyle(containerStyle.maxWidth, container, "clientWidth"); + maxHeight = parseMaxStyle(containerStyle.maxHeight, container, "clientHeight"); + } + } + return { + width, + height, + maxWidth: maxWidth || INFINITY, + maxHeight: maxHeight || INFINITY + }; +} +var round1 = (v) => Math.round(v * 10) / 10; +function getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) { + const style = getComputedStyle2(canvas); + const margins = getPositionedStyle(style, "margin"); + const maxWidth = parseMaxStyle(style.maxWidth, canvas, "clientWidth") || INFINITY; + const maxHeight = parseMaxStyle(style.maxHeight, canvas, "clientHeight") || INFINITY; + const containerSize = getContainerSize(canvas, bbWidth, bbHeight); + let { width, height } = containerSize; + if (style.boxSizing === "content-box") { + const borders = getPositionedStyle(style, "border", "width"); + const paddings = getPositionedStyle(style, "padding"); + width -= paddings.width + borders.width; + height -= paddings.height + borders.height; + } + width = Math.max(0, width - margins.width); + height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height); + width = round1(Math.min(width, maxWidth, containerSize.maxWidth)); + height = round1(Math.min(height, maxHeight, containerSize.maxHeight)); + if (width && !height) { + height = round1(width / 2); + } + const maintainHeight = bbWidth !== void 0 || bbHeight !== void 0; + if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) { + height = containerSize.height; + width = round1(Math.floor(height * aspectRatio)); + } + return { + width, + height + }; +} +function retinaScale(chart, forceRatio, forceStyle) { + const pixelRatio = forceRatio || 1; + const deviceHeight = Math.floor(chart.height * pixelRatio); + const deviceWidth = Math.floor(chart.width * pixelRatio); + chart.height = Math.floor(chart.height); + chart.width = Math.floor(chart.width); + const canvas = chart.canvas; + if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) { + canvas.style.height = `${chart.height}px`; + canvas.style.width = `${chart.width}px`; + } + if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) { + chart.currentDevicePixelRatio = pixelRatio; + canvas.height = deviceHeight; + canvas.width = deviceWidth; + chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0); + return true; + } + return false; +} +var supportsEventListenerOptions = function() { + let passiveSupported = false; + try { + const options = { + get passive() { + passiveSupported = true; + return false; + } + }; + window.addEventListener("test", null, options); + window.removeEventListener("test", null, options); + } catch (e) { + } + return passiveSupported; +}(); +function readUsedSize(element, property) { + const value = getStyle(element, property); + const matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? +matches[1] : void 0; +} +var getRightToLeftAdapter = function(rectX, width) { + return { + x(x) { + return rectX + rectX + width - x; + }, + setWidth(w) { + width = w; + }, + textAlign(align) { + if (align === "center") { + return align; + } + return align === "right" ? "left" : "right"; + }, + xPlus(x, value) { + return x - value; + }, + leftForLtr(x, itemWidth) { + return x - itemWidth; + } + }; +}; +var getLeftToRightAdapter = function() { + return { + x(x) { + return x; + }, + setWidth(w) { + }, + textAlign(align) { + return align; + }, + xPlus(x, value) { + return x + value; + }, + leftForLtr(x, _itemWidth) { + return x; + } + }; +}; +function getRtlAdapter(rtl, rectX, width) { + return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter(); +} +function overrideTextDirection(ctx, direction) { + let style, original; + if (direction === "ltr" || direction === "rtl") { + style = ctx.canvas.style; + original = [ + style.getPropertyValue("direction"), + style.getPropertyPriority("direction") + ]; + style.setProperty("direction", direction, "important"); + ctx.prevTextDirection = original; + } +} +function restoreTextDirection(ctx, original) { + if (original !== void 0) { + delete ctx.prevTextDirection; + ctx.canvas.style.setProperty("direction", original[0], original[1]); + } +} + +// node_modules/chart.js/dist/chart.js +var Animator = class { + constructor() { + this._request = null; + this._charts = /* @__PURE__ */ new Map(); + this._running = false; + this._lastDate = void 0; + } + _notify(chart, anims, date, type) { + const callbacks = anims.listeners[type]; + const numSteps = anims.duration; + callbacks.forEach((fn) => fn({ + chart, + initial: anims.initial, + numSteps, + currentStep: Math.min(date - anims.start, numSteps) + })); + } + _refresh() { + if (this._request) { + return; + } + this._running = true; + this._request = requestAnimFrame.call(window, () => { + this._update(); + this._request = null; + if (this._running) { + this._refresh(); + } + }); + } + _update(date = Date.now()) { + let remaining = 0; + this._charts.forEach((anims, chart) => { + if (!anims.running || !anims.items.length) { + return; + } + const items = anims.items; + let i = items.length - 1; + let draw = false; + let item; + for (; i >= 0; --i) { + item = items[i]; + if (item._active) { + if (item._total > anims.duration) { + anims.duration = item._total; + } + item.tick(date); + draw = true; + } else { + items[i] = items[items.length - 1]; + items.pop(); + } + } + if (draw) { + chart.draw(); + this._notify(chart, anims, date, "progress"); + } + if (!items.length) { + anims.running = false; + this._notify(chart, anims, date, "complete"); + anims.initial = false; + } + remaining += items.length; + }); + this._lastDate = date; + if (remaining === 0) { + this._running = false; + } + } + _getAnims(chart) { + const charts = this._charts; + let anims = charts.get(chart); + if (!anims) { + anims = { + running: false, + initial: true, + items: [], + listeners: { + complete: [], + progress: [] + } + }; + charts.set(chart, anims); + } + return anims; + } + listen(chart, event, cb) { + this._getAnims(chart).listeners[event].push(cb); + } + add(chart, items) { + if (!items || !items.length) { + return; + } + this._getAnims(chart).items.push(...items); + } + has(chart) { + return this._getAnims(chart).items.length > 0; + } + start(chart) { + const anims = this._charts.get(chart); + if (!anims) { + return; + } + anims.running = true; + anims.start = Date.now(); + anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0); + this._refresh(); + } + running(chart) { + if (!this._running) { + return false; + } + const anims = this._charts.get(chart); + if (!anims || !anims.running || !anims.items.length) { + return false; + } + return true; + } + stop(chart) { + const anims = this._charts.get(chart); + if (!anims || !anims.items.length) { + return; + } + const items = anims.items; + let i = items.length - 1; + for (; i >= 0; --i) { + items[i].cancel(); + } + anims.items = []; + this._notify(chart, anims, Date.now(), "complete"); + } + remove(chart) { + return this._charts.delete(chart); + } +}; +var animator = /* @__PURE__ */ new Animator(); +var transparent = "transparent"; +var interpolators = { + boolean(from2, to2, factor) { + return factor > 0.5 ? to2 : from2; + }, + color(from2, to2, factor) { + const c0 = color(from2 || transparent); + const c1 = c0.valid && color(to2 || transparent); + return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to2; + }, + number(from2, to2, factor) { + return from2 + (to2 - from2) * factor; + } +}; +var Animation = class { + constructor(cfg, target, prop, to2) { + const currentValue = target[prop]; + to2 = resolve([ + cfg.to, + to2, + currentValue, + cfg.from + ]); + const from2 = resolve([ + cfg.from, + currentValue, + to2 + ]); + this._active = true; + this._fn = cfg.fn || interpolators[cfg.type || typeof from2]; + this._easing = effects[cfg.easing] || effects.linear; + this._start = Math.floor(Date.now() + (cfg.delay || 0)); + this._duration = this._total = Math.floor(cfg.duration); + this._loop = !!cfg.loop; + this._target = target; + this._prop = prop; + this._from = from2; + this._to = to2; + this._promises = void 0; + } + active() { + return this._active; + } + update(cfg, to2, date) { + if (this._active) { + this._notify(false); + const currentValue = this._target[this._prop]; + const elapsed = date - this._start; + const remain = this._duration - elapsed; + this._start = date; + this._duration = Math.floor(Math.max(remain, cfg.duration)); + this._total += elapsed; + this._loop = !!cfg.loop; + this._to = resolve([ + cfg.to, + to2, + currentValue, + cfg.from + ]); + this._from = resolve([ + cfg.from, + currentValue, + to2 + ]); + } + } + cancel() { + if (this._active) { + this.tick(Date.now()); + this._active = false; + this._notify(false); + } + } + tick(date) { + const elapsed = date - this._start; + const duration = this._duration; + const prop = this._prop; + const from2 = this._from; + const loop = this._loop; + const to2 = this._to; + let factor; + this._active = from2 !== to2 && (loop || elapsed < duration); + if (!this._active) { + this._target[prop] = to2; + this._notify(true); + return; + } + if (elapsed < 0) { + this._target[prop] = from2; + return; + } + factor = elapsed / duration % 2; + factor = loop && factor > 1 ? 2 - factor : factor; + factor = this._easing(Math.min(1, Math.max(0, factor))); + this._target[prop] = this._fn(from2, to2, factor); + } + wait() { + const promises = this._promises || (this._promises = []); + return new Promise((res, rej) => { + promises.push({ + res, + rej + }); + }); + } + _notify(resolved) { + const method = resolved ? "res" : "rej"; + const promises = this._promises || []; + for (let i = 0; i < promises.length; i++) { + promises[i][method](); + } + } +}; +var Animations = class { + constructor(chart, config) { + this._chart = chart; + this._properties = /* @__PURE__ */ new Map(); + this.configure(config); + } + configure(config) { + if (!isObject(config)) { + return; + } + const animationOptions = Object.keys(defaults.animation); + const animatedProps = this._properties; + Object.getOwnPropertyNames(config).forEach((key) => { + const cfg = config[key]; + if (!isObject(cfg)) { + return; + } + const resolved = {}; + for (const option of animationOptions) { + resolved[option] = cfg[option]; + } + (isArray(cfg.properties) && cfg.properties || [ + key + ]).forEach((prop) => { + if (prop === key || !animatedProps.has(prop)) { + animatedProps.set(prop, resolved); + } + }); + }); + } + _animateOptions(target, values) { + const newOptions = values.options; + const options = resolveTargetOptions(target, newOptions); + if (!options) { + return []; + } + const animations = this._createAnimations(options, newOptions); + if (newOptions.$shared) { + awaitAll(target.options.$animations, newOptions).then(() => { + target.options = newOptions; + }, () => { + }); + } + return animations; + } + _createAnimations(target, values) { + const animatedProps = this._properties; + const animations = []; + const running = target.$animations || (target.$animations = {}); + const props = Object.keys(values); + const date = Date.now(); + let i; + for (i = props.length - 1; i >= 0; --i) { + const prop = props[i]; + if (prop.charAt(0) === "$") { + continue; + } + if (prop === "options") { + animations.push(...this._animateOptions(target, values)); + continue; + } + const value = values[prop]; + let animation = running[prop]; + const cfg = animatedProps.get(prop); + if (animation) { + if (cfg && animation.active()) { + animation.update(cfg, value, date); + continue; + } else { + animation.cancel(); + } + } + if (!cfg || !cfg.duration) { + target[prop] = value; + continue; + } + running[prop] = animation = new Animation(cfg, target, prop, value); + animations.push(animation); + } + return animations; + } + update(target, values) { + if (this._properties.size === 0) { + Object.assign(target, values); + return; + } + const animations = this._createAnimations(target, values); + if (animations.length) { + animator.add(this._chart, animations); + return true; + } + } +}; +function awaitAll(animations, properties) { + const running = []; + const keys = Object.keys(properties); + for (let i = 0; i < keys.length; i++) { + const anim = animations[keys[i]]; + if (anim && anim.active()) { + running.push(anim.wait()); + } + } + return Promise.all(running); +} +function resolveTargetOptions(target, newOptions) { + if (!newOptions) { + return; + } + let options = target.options; + if (!options) { + target.options = newOptions; + return; + } + if (options.$shared) { + target.options = options = Object.assign({}, options, { + $shared: false, + $animations: {} + }); + } + return options; +} +function scaleClip(scale, allowedOverflow) { + const opts = scale && scale.options || {}; + const reverse = opts.reverse; + const min = opts.min === void 0 ? allowedOverflow : 0; + const max = opts.max === void 0 ? allowedOverflow : 0; + return { + start: reverse ? max : min, + end: reverse ? min : max + }; +} +function defaultClip(xScale, yScale, allowedOverflow) { + if (allowedOverflow === false) { + return false; + } + const x = scaleClip(xScale, allowedOverflow); + const y = scaleClip(yScale, allowedOverflow); + return { + top: y.end, + right: x.end, + bottom: y.start, + left: x.start + }; +} +function toClip(value) { + let t2, r, b, l; + if (isObject(value)) { + t2 = value.top; + r = value.right; + b = value.bottom; + l = value.left; + } else { + t2 = r = b = l = value; + } + return { + top: t2, + right: r, + bottom: b, + left: l, + disabled: value === false + }; +} +function getSortedDatasetIndices(chart, filterVisible) { + const keys = []; + const metasets = chart._getSortedDatasetMetas(filterVisible); + let i, ilen; + for (i = 0, ilen = metasets.length; i < ilen; ++i) { + keys.push(metasets[i].index); + } + return keys; +} +function applyStack(stack, value, dsIndex, options = {}) { + const keys = stack.keys; + const singleMode = options.mode === "single"; + let i, ilen, datasetIndex, otherValue; + if (value === null) { + return; + } + for (i = 0, ilen = keys.length; i < ilen; ++i) { + datasetIndex = +keys[i]; + if (datasetIndex === dsIndex) { + if (options.all) { + continue; + } + break; + } + otherValue = stack.values[datasetIndex]; + if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) { + value += otherValue; + } + } + return value; +} +function convertObjectDataToArray(data) { + const keys = Object.keys(data); + const adata = new Array(keys.length); + let i, ilen, key; + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + adata[i] = { + x: key, + y: data[key] + }; + } + return adata; +} +function isStacked(scale, meta) { + const stacked = scale && scale.options.stacked; + return stacked || stacked === void 0 && meta.stack !== void 0; +} +function getStackKey(indexScale, valueScale, meta) { + return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`; +} +function getUserBounds(scale) { + const { min, max, minDefined, maxDefined } = scale.getUserBounds(); + return { + min: minDefined ? min : Number.NEGATIVE_INFINITY, + max: maxDefined ? max : Number.POSITIVE_INFINITY + }; +} +function getOrCreateStack(stacks, stackKey, indexValue) { + const subStack = stacks[stackKey] || (stacks[stackKey] = {}); + return subStack[indexValue] || (subStack[indexValue] = {}); +} +function getLastIndexInStack(stack, vScale, positive, type) { + for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) { + const value = stack[meta.index]; + if (positive && value > 0 || !positive && value < 0) { + return meta.index; + } + } + return null; +} +function updateStacks(controller, parsed) { + const { chart, _cachedMeta: meta } = controller; + const stacks = chart._stacks || (chart._stacks = {}); + const { iScale, vScale, index: datasetIndex } = meta; + const iAxis = iScale.axis; + const vAxis = vScale.axis; + const key = getStackKey(iScale, vScale, meta); + const ilen = parsed.length; + let stack; + for (let i = 0; i < ilen; ++i) { + const item = parsed[i]; + const { [iAxis]: index, [vAxis]: value } = item; + const itemStacks = item._stacks || (item._stacks = {}); + stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index); + stack[datasetIndex] = value; + stack._top = getLastIndexInStack(stack, vScale, true, meta.type); + stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type); + const visualValues = stack._visualValues || (stack._visualValues = {}); + visualValues[datasetIndex] = value; + } +} +function getFirstScaleId(chart, axis) { + const scales = chart.scales; + return Object.keys(scales).filter((key) => scales[key].axis === axis).shift(); +} +function createDatasetContext(parent, index) { + return createContext(parent, { + active: false, + dataset: void 0, + datasetIndex: index, + index, + mode: "default", + type: "dataset" + }); +} +function createDataContext(parent, index, element) { + return createContext(parent, { + active: false, + dataIndex: index, + parsed: void 0, + raw: void 0, + element, + index, + mode: "default", + type: "data" + }); +} +function clearStacks(meta, items) { + const datasetIndex = meta.controller.index; + const axis = meta.vScale && meta.vScale.axis; + if (!axis) { + return; + } + items = items || meta._parsed; + for (const parsed of items) { + const stacks = parsed._stacks; + if (!stacks || stacks[axis] === void 0 || stacks[axis][datasetIndex] === void 0) { + return; + } + delete stacks[axis][datasetIndex]; + if (stacks[axis]._visualValues !== void 0 && stacks[axis]._visualValues[datasetIndex] !== void 0) { + delete stacks[axis]._visualValues[datasetIndex]; + } + } +} +var isDirectUpdateMode = (mode) => mode === "reset" || mode === "none"; +var cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached); +var createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked && { + keys: getSortedDatasetIndices(chart, true), + values: null +}; +var DatasetController = class { + constructor(chart, datasetIndex) { + this.chart = chart; + this._ctx = chart.ctx; + this.index = datasetIndex; + this._cachedDataOpts = {}; + this._cachedMeta = this.getMeta(); + this._type = this._cachedMeta.type; + this.options = void 0; + this._parsing = false; + this._data = void 0; + this._objectData = void 0; + this._sharedOptions = void 0; + this._drawStart = void 0; + this._drawCount = void 0; + this.enableOptionSharing = false; + this.supportsDecimation = false; + this.$context = void 0; + this._syncList = []; + this.datasetElementType = new.target.datasetElementType; + this.dataElementType = new.target.dataElementType; + this.initialize(); + } + initialize() { + const meta = this._cachedMeta; + this.configure(); + this.linkScales(); + meta._stacked = isStacked(meta.vScale, meta); + this.addElements(); + if (this.options.fill && !this.chart.isPluginEnabled("filler")) { + console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options"); + } + } + updateIndex(datasetIndex) { + if (this.index !== datasetIndex) { + clearStacks(this._cachedMeta); + } + this.index = datasetIndex; + } + linkScales() { + const chart = this.chart; + const meta = this._cachedMeta; + const dataset = this.getDataset(); + const chooseId = (axis, x, y, r) => axis === "x" ? x : axis === "r" ? r : y; + const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, "x")); + const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, "y")); + const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, "r")); + const indexAxis = meta.indexAxis; + const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid); + const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid); + meta.xScale = this.getScaleForId(xid); + meta.yScale = this.getScaleForId(yid); + meta.rScale = this.getScaleForId(rid); + meta.iScale = this.getScaleForId(iid); + meta.vScale = this.getScaleForId(vid); + } + getDataset() { + return this.chart.data.datasets[this.index]; + } + getMeta() { + return this.chart.getDatasetMeta(this.index); + } + getScaleForId(scaleID) { + return this.chart.scales[scaleID]; + } + _getOtherScale(scale) { + const meta = this._cachedMeta; + return scale === meta.iScale ? meta.vScale : meta.iScale; + } + reset() { + this._update("reset"); + } + _destroy() { + const meta = this._cachedMeta; + if (this._data) { + unlistenArrayEvents(this._data, this); + } + if (meta._stacked) { + clearStacks(meta); + } + } + _dataCheck() { + const dataset = this.getDataset(); + const data = dataset.data || (dataset.data = []); + const _data = this._data; + if (isObject(data)) { + this._data = convertObjectDataToArray(data); + } else if (_data !== data) { + if (_data) { + unlistenArrayEvents(_data, this); + const meta = this._cachedMeta; + clearStacks(meta); + meta._parsed = []; + } + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, this); + } + this._syncList = []; + this._data = data; + } + } + addElements() { + const meta = this._cachedMeta; + this._dataCheck(); + if (this.datasetElementType) { + meta.dataset = new this.datasetElementType(); + } + } + buildOrUpdateElements(resetNewElements) { + const meta = this._cachedMeta; + const dataset = this.getDataset(); + let stackChanged = false; + this._dataCheck(); + const oldStacked = meta._stacked; + meta._stacked = isStacked(meta.vScale, meta); + if (meta.stack !== dataset.stack) { + stackChanged = true; + clearStacks(meta); + meta.stack = dataset.stack; + } + this._resyncElements(resetNewElements); + if (stackChanged || oldStacked !== meta._stacked) { + updateStacks(this, meta._parsed); + } + } + configure() { + const config = this.chart.config; + const scopeKeys = config.datasetScopeKeys(this._type); + const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true); + this.options = config.createResolver(scopes, this.getContext()); + this._parsing = this.options.parsing; + this._cachedDataOpts = {}; + } + parse(start, count) { + const { _cachedMeta: meta, _data: data } = this; + const { iScale, _stacked } = meta; + const iAxis = iScale.axis; + let sorted = start === 0 && count === data.length ? true : meta._sorted; + let prev = start > 0 && meta._parsed[start - 1]; + let i, cur, parsed; + if (this._parsing === false) { + meta._parsed = data; + meta._sorted = true; + parsed = data; + } else { + if (isArray(data[start])) { + parsed = this.parseArrayData(meta, data, start, count); + } else if (isObject(data[start])) { + parsed = this.parseObjectData(meta, data, start, count); + } else { + parsed = this.parsePrimitiveData(meta, data, start, count); + } + const isNotInOrderComparedToPrev = () => cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis]; + for (i = 0; i < count; ++i) { + meta._parsed[i + start] = cur = parsed[i]; + if (sorted) { + if (isNotInOrderComparedToPrev()) { + sorted = false; + } + prev = cur; + } + } + meta._sorted = sorted; + } + if (_stacked) { + updateStacks(this, parsed); + } + } + parsePrimitiveData(meta, data, start, count) { + const { iScale, vScale } = meta; + const iAxis = iScale.axis; + const vAxis = vScale.axis; + const labels = iScale.getLabels(); + const singleScale = iScale === vScale; + const parsed = new Array(count); + let i, ilen, index; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + parsed[i] = { + [iAxis]: singleScale || iScale.parse(labels[index], index), + [vAxis]: vScale.parse(data[index], index) + }; + } + return parsed; + } + parseArrayData(meta, data, start, count) { + const { xScale, yScale } = meta; + const parsed = new Array(count); + let i, ilen, index, item; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + x: xScale.parse(item[0], index), + y: yScale.parse(item[1], index) + }; + } + return parsed; + } + parseObjectData(meta, data, start, count) { + const { xScale, yScale } = meta; + const { xAxisKey = "x", yAxisKey = "y" } = this._parsing; + const parsed = new Array(count); + let i, ilen, index, item; + for (i = 0, ilen = count; i < ilen; ++i) { + index = i + start; + item = data[index]; + parsed[i] = { + x: xScale.parse(resolveObjectKey(item, xAxisKey), index), + y: yScale.parse(resolveObjectKey(item, yAxisKey), index) + }; + } + return parsed; + } + getParsed(index) { + return this._cachedMeta._parsed[index]; + } + getDataElement(index) { + return this._cachedMeta.data[index]; + } + applyStack(scale, parsed, mode) { + const chart = this.chart; + const meta = this._cachedMeta; + const value = parsed[scale.axis]; + const stack = { + keys: getSortedDatasetIndices(chart, true), + values: parsed._stacks[scale.axis]._visualValues + }; + return applyStack(stack, value, meta.index, { + mode + }); + } + updateRangeFromParsed(range, scale, parsed, stack) { + const parsedValue = parsed[scale.axis]; + let value = parsedValue === null ? NaN : parsedValue; + const values = stack && parsed._stacks[scale.axis]; + if (stack && values) { + stack.values = values; + value = applyStack(stack, parsedValue, this._cachedMeta.index); + } + range.min = Math.min(range.min, value); + range.max = Math.max(range.max, value); + } + getMinMax(scale, canStack) { + const meta = this._cachedMeta; + const _parsed = meta._parsed; + const sorted = meta._sorted && scale === meta.iScale; + const ilen = _parsed.length; + const otherScale = this._getOtherScale(scale); + const stack = createStack(canStack, meta, this.chart); + const range = { + min: Number.POSITIVE_INFINITY, + max: Number.NEGATIVE_INFINITY + }; + const { min: otherMin, max: otherMax } = getUserBounds(otherScale); + let i, parsed; + function _skip() { + parsed = _parsed[i]; + const otherValue = parsed[otherScale.axis]; + return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue; + } + for (i = 0; i < ilen; ++i) { + if (_skip()) { + continue; + } + this.updateRangeFromParsed(range, scale, parsed, stack); + if (sorted) { + break; + } + } + if (sorted) { + for (i = ilen - 1; i >= 0; --i) { + if (_skip()) { + continue; + } + this.updateRangeFromParsed(range, scale, parsed, stack); + break; + } + } + return range; + } + getAllParsedValues(scale) { + const parsed = this._cachedMeta._parsed; + const values = []; + let i, ilen, value; + for (i = 0, ilen = parsed.length; i < ilen; ++i) { + value = parsed[i][scale.axis]; + if (isNumberFinite(value)) { + values.push(value); + } + } + return values; + } + getMaxOverflow() { + return false; + } + getLabelAndValue(index) { + const meta = this._cachedMeta; + const iScale = meta.iScale; + const vScale = meta.vScale; + const parsed = this.getParsed(index); + return { + label: iScale ? "" + iScale.getLabelForValue(parsed[iScale.axis]) : "", + value: vScale ? "" + vScale.getLabelForValue(parsed[vScale.axis]) : "" + }; + } + _update(mode) { + const meta = this._cachedMeta; + this.update(mode || "default"); + meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow()))); + } + update(mode) { + } + draw() { + const ctx = this._ctx; + const chart = this.chart; + const meta = this._cachedMeta; + const elements = meta.data || []; + const area = chart.chartArea; + const active = []; + const start = this._drawStart || 0; + const count = this._drawCount || elements.length - start; + const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop; + let i; + if (meta.dataset) { + meta.dataset.draw(ctx, area, start, count); + } + for (i = start; i < start + count; ++i) { + const element = elements[i]; + if (element.hidden) { + continue; + } + if (element.active && drawActiveElementsOnTop) { + active.push(element); + } else { + element.draw(ctx, area); + } + } + for (i = 0; i < active.length; ++i) { + active[i].draw(ctx, area); + } + } + getStyle(index, active) { + const mode = active ? "active" : "default"; + return index === void 0 && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode); + } + getContext(index, active, mode) { + const dataset = this.getDataset(); + let context; + if (index >= 0 && index < this._cachedMeta.data.length) { + const element = this._cachedMeta.data[index]; + context = element.$context || (element.$context = createDataContext(this.getContext(), index, element)); + context.parsed = this.getParsed(index); + context.raw = dataset.data[index]; + context.index = context.dataIndex = index; + } else { + context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index)); + context.dataset = dataset; + context.index = context.datasetIndex = this.index; + } + context.active = !!active; + context.mode = mode; + return context; + } + resolveDatasetElementOptions(mode) { + return this._resolveElementOptions(this.datasetElementType.id, mode); + } + resolveDataElementOptions(index, mode) { + return this._resolveElementOptions(this.dataElementType.id, mode, index); + } + _resolveElementOptions(elementType, mode = "default", index) { + const active = mode === "active"; + const cache = this._cachedDataOpts; + const cacheKey = elementType + "-" + mode; + const cached = cache[cacheKey]; + const sharing = this.enableOptionSharing && defined(index); + if (cached) { + return cloneIfNotShared(cached, sharing); + } + const config = this.chart.config; + const scopeKeys = config.datasetElementScopeKeys(this._type, elementType); + const prefixes = active ? [ + `${elementType}Hover`, + "hover", + elementType, + "" + ] : [ + elementType, + "" + ]; + const scopes = config.getOptionScopes(this.getDataset(), scopeKeys); + const names2 = Object.keys(defaults.elements[elementType]); + const context = () => this.getContext(index, active, mode); + const values = config.resolveNamedOptions(scopes, names2, context, prefixes); + if (values.$shared) { + values.$shared = sharing; + cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing)); + } + return values; + } + _resolveAnimations(index, transition, active) { + const chart = this.chart; + const cache = this._cachedDataOpts; + const cacheKey = `animation-${transition}`; + const cached = cache[cacheKey]; + if (cached) { + return cached; + } + let options; + if (chart.options.animation !== false) { + const config = this.chart.config; + const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition); + const scopes = config.getOptionScopes(this.getDataset(), scopeKeys); + options = config.createResolver(scopes, this.getContext(index, active, transition)); + } + const animations = new Animations(chart, options && options.animations); + if (options && options._cacheable) { + cache[cacheKey] = Object.freeze(animations); + } + return animations; + } + getSharedOptions(options) { + if (!options.$shared) { + return; + } + return this._sharedOptions || (this._sharedOptions = Object.assign({}, options)); + } + includeOptions(mode, sharedOptions) { + return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled; + } + _getSharedOptions(start, mode) { + const firstOpts = this.resolveDataElementOptions(start, mode); + const previouslySharedOptions = this._sharedOptions; + const sharedOptions = this.getSharedOptions(firstOpts); + const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions; + this.updateSharedOptions(sharedOptions, mode, firstOpts); + return { + sharedOptions, + includeOptions + }; + } + updateElement(element, index, properties, mode) { + if (isDirectUpdateMode(mode)) { + Object.assign(element, properties); + } else { + this._resolveAnimations(index, mode).update(element, properties); + } + } + updateSharedOptions(sharedOptions, mode, newOptions) { + if (sharedOptions && !isDirectUpdateMode(mode)) { + this._resolveAnimations(void 0, mode).update(sharedOptions, newOptions); + } + } + _setStyle(element, index, mode, active) { + element.active = active; + const options = this.getStyle(index, active); + this._resolveAnimations(index, mode, active).update(element, { + options: !active && this.getSharedOptions(options) || options + }); + } + removeHoverStyle(element, datasetIndex, index) { + this._setStyle(element, index, "active", false); + } + setHoverStyle(element, datasetIndex, index) { + this._setStyle(element, index, "active", true); + } + _removeDatasetHoverStyle() { + const element = this._cachedMeta.dataset; + if (element) { + this._setStyle(element, void 0, "active", false); + } + } + _setDatasetHoverStyle() { + const element = this._cachedMeta.dataset; + if (element) { + this._setStyle(element, void 0, "active", true); + } + } + _resyncElements(resetNewElements) { + const data = this._data; + const elements = this._cachedMeta.data; + for (const [method, arg1, arg2] of this._syncList) { + this[method](arg1, arg2); + } + this._syncList = []; + const numMeta = elements.length; + const numData = data.length; + const count = Math.min(numData, numMeta); + if (count) { + this.parse(0, count); + } + if (numData > numMeta) { + this._insertElements(numMeta, numData - numMeta, resetNewElements); + } else if (numData < numMeta) { + this._removeElements(numData, numMeta - numData); + } + } + _insertElements(start, count, resetNewElements = true) { + const meta = this._cachedMeta; + const data = meta.data; + const end = start + count; + let i; + const move = (arr) => { + arr.length += count; + for (i = arr.length - 1; i >= end; i--) { + arr[i] = arr[i - count]; + } + }; + move(data); + for (i = start; i < end; ++i) { + data[i] = new this.dataElementType(); + } + if (this._parsing) { + move(meta._parsed); + } + this.parse(start, count); + if (resetNewElements) { + this.updateElements(data, start, count, "reset"); + } + } + updateElements(element, start, count, mode) { + } + _removeElements(start, count) { + const meta = this._cachedMeta; + if (this._parsing) { + const removed = meta._parsed.splice(start, count); + if (meta._stacked) { + clearStacks(meta, removed); + } + } + meta.data.splice(start, count); + } + _sync(args) { + if (this._parsing) { + this._syncList.push(args); + } else { + const [method, arg1, arg2] = args; + this[method](arg1, arg2); + } + this.chart._dataChanges.push([ + this.index, + ...args + ]); + } + _onDataPush() { + const count = arguments.length; + this._sync([ + "_insertElements", + this.getDataset().data.length - count, + count + ]); + } + _onDataPop() { + this._sync([ + "_removeElements", + this._cachedMeta.data.length - 1, + 1 + ]); + } + _onDataShift() { + this._sync([ + "_removeElements", + 0, + 1 + ]); + } + _onDataSplice(start, count) { + if (count) { + this._sync([ + "_removeElements", + start, + count + ]); + } + const newCount = arguments.length - 2; + if (newCount) { + this._sync([ + "_insertElements", + start, + newCount + ]); + } + } + _onDataUnshift() { + this._sync([ + "_insertElements", + 0, + arguments.length + ]); + } +}; +__publicField(DatasetController, "defaults", {}); +__publicField(DatasetController, "datasetElementType", null); +__publicField(DatasetController, "dataElementType", null); +function getAllScaleValues(scale, type) { + if (!scale._cache.$bar) { + const visibleMetas = scale.getMatchingVisibleMetas(type); + let values = []; + for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) { + values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale)); + } + scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b)); + } + return scale._cache.$bar; +} +function computeMinSampleSize(meta) { + const scale = meta.iScale; + const values = getAllScaleValues(scale, meta.type); + let min = scale._length; + let i, ilen, curr, prev; + const updateMinAndPrev = () => { + if (curr === 32767 || curr === -32768) { + return; + } + if (defined(prev)) { + min = Math.min(min, Math.abs(curr - prev) || min); + } + prev = curr; + }; + for (i = 0, ilen = values.length; i < ilen; ++i) { + curr = scale.getPixelForValue(values[i]); + updateMinAndPrev(); + } + prev = void 0; + for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + updateMinAndPrev(); + } + return min; +} +function computeFitCategoryTraits(index, ruler, options, stackCount) { + const thickness = options.barThickness; + let size, ratio; + if (isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + size = thickness * stackCount; + ratio = 1; + } + return { + chunk: size / stackCount, + ratio, + start: ruler.pixels[index] - size / 2 + }; +} +function computeFlexCategoryTraits(index, ruler, options, stackCount) { + const pixels = ruler.pixels; + const curr = pixels[index]; + let prev = index > 0 ? pixels[index - 1] : null; + let next = index < pixels.length - 1 ? pixels[index + 1] : null; + const percent = options.categoryPercentage; + if (prev === null) { + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + if (next === null) { + next = curr + curr - prev; + } + const start = curr - (curr - Math.min(prev, next)) / 2 * percent; + const size = Math.abs(next - prev) / 2 * percent; + return { + chunk: size / stackCount, + ratio: options.barPercentage, + start + }; +} +function parseFloatBar(entry, item, vScale, i) { + const startValue = vScale.parse(entry[0], i); + const endValue = vScale.parse(entry[1], i); + const min = Math.min(startValue, endValue); + const max = Math.max(startValue, endValue); + let barStart = min; + let barEnd = max; + if (Math.abs(min) > Math.abs(max)) { + barStart = max; + barEnd = min; + } + item[vScale.axis] = barEnd; + item._custom = { + barStart, + barEnd, + start: startValue, + end: endValue, + min, + max + }; +} +function parseValue(entry, item, vScale, i) { + if (isArray(entry)) { + parseFloatBar(entry, item, vScale, i); + } else { + item[vScale.axis] = vScale.parse(entry, i); + } + return item; +} +function parseArrayOrPrimitive(meta, data, start, count) { + const iScale = meta.iScale; + const vScale = meta.vScale; + const labels = iScale.getLabels(); + const singleScale = iScale === vScale; + const parsed = []; + let i, ilen, item, entry; + for (i = start, ilen = start + count; i < ilen; ++i) { + entry = data[i]; + item = {}; + item[iScale.axis] = singleScale || iScale.parse(labels[i], i); + parsed.push(parseValue(entry, item, vScale, i)); + } + return parsed; +} +function isFloatBar(custom) { + return custom && custom.barStart !== void 0 && custom.barEnd !== void 0; +} +function barSign(size, vScale, actualBase) { + if (size !== 0) { + return sign(size); + } + return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1); +} +function borderProps(properties) { + let reverse, start, end, top, bottom; + if (properties.horizontal) { + reverse = properties.base > properties.x; + start = "left"; + end = "right"; + } else { + reverse = properties.base < properties.y; + start = "bottom"; + end = "top"; + } + if (reverse) { + top = "end"; + bottom = "start"; + } else { + top = "start"; + bottom = "end"; + } + return { + start, + end, + reverse, + top, + bottom + }; +} +function setBorderSkipped(properties, options, stack, index) { + let edge = options.borderSkipped; + const res = {}; + if (!edge) { + properties.borderSkipped = res; + return; + } + if (edge === true) { + properties.borderSkipped = { + top: true, + right: true, + bottom: true, + left: true + }; + return; + } + const { start, end, reverse, top, bottom } = borderProps(properties); + if (edge === "middle" && stack) { + properties.enableBorderRadius = true; + if ((stack._top || 0) === index) { + edge = top; + } else if ((stack._bottom || 0) === index) { + edge = bottom; + } else { + res[parseEdge(bottom, start, end, reverse)] = true; + edge = top; + } + } + res[parseEdge(edge, start, end, reverse)] = true; + properties.borderSkipped = res; +} +function parseEdge(edge, a, b, reverse) { + if (reverse) { + edge = swap(edge, a, b); + edge = startEnd(edge, b, a); + } else { + edge = startEnd(edge, a, b); + } + return edge; +} +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} +function startEnd(v, start, end) { + return v === "start" ? start : v === "end" ? end : v; +} +function setInflateAmount(properties, { inflateAmount }, ratio) { + properties.inflateAmount = inflateAmount === "auto" ? ratio === 1 ? 0.33 : 0 : inflateAmount; +} +var BarController = class extends DatasetController { + parsePrimitiveData(meta, data, start, count) { + return parseArrayOrPrimitive(meta, data, start, count); + } + parseArrayData(meta, data, start, count) { + return parseArrayOrPrimitive(meta, data, start, count); + } + parseObjectData(meta, data, start, count) { + const { iScale, vScale } = meta; + const { xAxisKey = "x", yAxisKey = "y" } = this._parsing; + const iAxisKey = iScale.axis === "x" ? xAxisKey : yAxisKey; + const vAxisKey = vScale.axis === "x" ? xAxisKey : yAxisKey; + const parsed = []; + let i, ilen, item, obj; + for (i = start, ilen = start + count; i < ilen; ++i) { + obj = data[i]; + item = {}; + item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i); + parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i)); + } + return parsed; + } + updateRangeFromParsed(range, scale, parsed, stack) { + super.updateRangeFromParsed(range, scale, parsed, stack); + const custom = parsed._custom; + if (custom && scale === this._cachedMeta.vScale) { + range.min = Math.min(range.min, custom.min); + range.max = Math.max(range.max, custom.max); + } + } + getMaxOverflow() { + return 0; + } + getLabelAndValue(index) { + const meta = this._cachedMeta; + const { iScale, vScale } = meta; + const parsed = this.getParsed(index); + const custom = parsed._custom; + const value = isFloatBar(custom) ? "[" + custom.start + ", " + custom.end + "]" : "" + vScale.getLabelForValue(parsed[vScale.axis]); + return { + label: "" + iScale.getLabelForValue(parsed[iScale.axis]), + value + }; + } + initialize() { + this.enableOptionSharing = true; + super.initialize(); + const meta = this._cachedMeta; + meta.stack = this.getDataset().stack; + } + update(mode) { + const meta = this._cachedMeta; + this.updateElements(meta.data, 0, meta.data.length, mode); + } + updateElements(bars, start, count, mode) { + const reset2 = mode === "reset"; + const { index, _cachedMeta: { vScale } } = this; + const base = vScale.getBasePixel(); + const horizontal = vScale.isHorizontal(); + const ruler = this._getRuler(); + const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode); + for (let i = start; i < start + count; i++) { + const parsed = this.getParsed(i); + const vpixels = reset2 || isNullOrUndef(parsed[vScale.axis]) ? { + base, + head: base + } : this._calculateBarValuePixels(i); + const ipixels = this._calculateBarIndexPixels(i, ruler); + const stack = (parsed._stacks || {})[vScale.axis]; + const properties = { + horizontal, + base: vpixels.base, + enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom, + x: horizontal ? vpixels.head : ipixels.center, + y: horizontal ? ipixels.center : vpixels.head, + height: horizontal ? ipixels.size : Math.abs(vpixels.size), + width: horizontal ? Math.abs(vpixels.size) : ipixels.size + }; + if (includeOptions) { + properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? "active" : mode); + } + const options = properties.options || bars[i].options; + setBorderSkipped(properties, options, stack, index); + setInflateAmount(properties, options, ruler.ratio); + this.updateElement(bars[i], i, properties, mode); + } + } + _getStacks(last, dataIndex) { + const { iScale } = this._cachedMeta; + const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta) => meta.controller.options.grouped); + const stacked = iScale.options.stacked; + const stacks = []; + const skipNull = (meta) => { + const parsed = meta.controller.getParsed(dataIndex); + const val = parsed && parsed[meta.vScale.axis]; + if (isNullOrUndef(val) || isNaN(val)) { + return true; + } + }; + for (const meta of metasets) { + if (dataIndex !== void 0 && skipNull(meta)) { + continue; + } + if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === void 0 && meta.stack === void 0) { + stacks.push(meta.stack); + } + if (meta.index === last) { + break; + } + } + if (!stacks.length) { + stacks.push(void 0); + } + return stacks; + } + _getStackCount(index) { + return this._getStacks(void 0, index).length; + } + _getStackIndex(datasetIndex, name2, dataIndex) { + const stacks = this._getStacks(datasetIndex, dataIndex); + const index = name2 !== void 0 ? stacks.indexOf(name2) : -1; + return index === -1 ? stacks.length - 1 : index; + } + _getRuler() { + const opts = this.options; + const meta = this._cachedMeta; + const iScale = meta.iScale; + const pixels = []; + let i, ilen; + for (i = 0, ilen = meta.data.length; i < ilen; ++i) { + pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i)); + } + const barThickness = opts.barThickness; + const min = barThickness || computeMinSampleSize(meta); + return { + min, + pixels, + start: iScale._startPixel, + end: iScale._endPixel, + stackCount: this._getStackCount(), + scale: iScale, + grouped: opts.grouped, + ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage + }; + } + _calculateBarValuePixels(index) { + const { _cachedMeta: { vScale, _stacked, index: datasetIndex }, options: { base: baseValue, minBarLength } } = this; + const actualBase = baseValue || 0; + const parsed = this.getParsed(index); + const custom = parsed._custom; + const floating = isFloatBar(custom); + let value = parsed[vScale.axis]; + let start = 0; + let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value; + let head, size; + if (length !== value) { + start = length - value; + length = value; + } + if (floating) { + value = custom.barStart; + length = custom.barEnd - custom.barStart; + if (value !== 0 && sign(value) !== sign(custom.barEnd)) { + start = 0; + } + start += value; + } + const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start; + let base = vScale.getPixelForValue(startValue); + if (this.chart.getDataVisibility(index)) { + head = vScale.getPixelForValue(start + length); + } else { + head = base; + } + size = head - base; + if (Math.abs(size) < minBarLength) { + size = barSign(size, vScale, actualBase) * minBarLength; + if (value === actualBase) { + base -= size / 2; + } + const startPixel = vScale.getPixelForDecimal(0); + const endPixel = vScale.getPixelForDecimal(1); + const min = Math.min(startPixel, endPixel); + const max = Math.max(startPixel, endPixel); + base = Math.max(Math.min(base, max), min); + head = base + size; + if (_stacked && !floating) { + parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base); + } + } + if (base === vScale.getPixelForValue(actualBase)) { + const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2; + base += halfGrid; + size -= halfGrid; + } + return { + size, + base, + head, + center: head + size / 2 + }; + } + _calculateBarIndexPixels(index, ruler) { + const scale = ruler.scale; + const options = this.options; + const skipNull = options.skipNull; + const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity); + let center, size; + if (ruler.grouped) { + const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount; + const range = options.barThickness === "flex" ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount); + const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : void 0); + center = range.start + range.chunk * stackIndex + range.chunk / 2; + size = Math.min(maxBarThickness, range.chunk * range.ratio); + } else { + center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index); + size = Math.min(maxBarThickness, ruler.min * ruler.ratio); + } + return { + base: center - size / 2, + head: center + size / 2, + center, + size + }; + } + draw() { + const meta = this._cachedMeta; + const vScale = meta.vScale; + const rects = meta.data; + const ilen = rects.length; + let i = 0; + for (; i < ilen; ++i) { + if (this.getParsed(i)[vScale.axis] !== null) { + rects[i].draw(this._ctx); + } + } + } +}; +__publicField(BarController, "id", "bar"); +__publicField(BarController, "defaults", { + datasetElementType: false, + dataElementType: "bar", + categoryPercentage: 0.8, + barPercentage: 0.9, + grouped: true, + animations: { + numbers: { + type: "number", + properties: [ + "x", + "y", + "base", + "width", + "height" + ] + } + } +}); +__publicField(BarController, "overrides", { + scales: { + _index_: { + type: "category", + offset: true, + grid: { + offset: true + } + }, + _value_: { + type: "linear", + beginAtZero: true + } + } +}); +function getRatioAndOffset(rotation, circumference, cutout) { + let ratioX = 1; + let ratioY = 1; + let offsetX = 0; + let offsetY = 0; + if (circumference < TAU) { + const startAngle = rotation; + const endAngle = startAngle + circumference; + const startX = Math.cos(startAngle); + const startY = Math.sin(startAngle); + const endX = Math.cos(endAngle); + const endY = Math.sin(endAngle); + const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout); + const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout); + const maxX = calcMax(0, startX, endX); + const maxY = calcMax(HALF_PI, startY, endY); + const minX = calcMin(PI, startX, endX); + const minY = calcMin(PI + HALF_PI, startY, endY); + ratioX = (maxX - minX) / 2; + ratioY = (maxY - minY) / 2; + offsetX = -(maxX + minX) / 2; + offsetY = -(maxY + minY) / 2; + } + return { + ratioX, + ratioY, + offsetX, + offsetY + }; +} +var DoughnutController = class extends DatasetController { + constructor(chart, datasetIndex) { + super(chart, datasetIndex); + this.enableOptionSharing = true; + this.innerRadius = void 0; + this.outerRadius = void 0; + this.offsetX = void 0; + this.offsetY = void 0; + } + linkScales() { + } + parse(start, count) { + const data = this.getDataset().data; + const meta = this._cachedMeta; + if (this._parsing === false) { + meta._parsed = data; + } else { + let getter = (i2) => +data[i2]; + if (isObject(data[start])) { + const { key = "value" } = this._parsing; + getter = (i2) => +resolveObjectKey(data[i2], key); + } + let i, ilen; + for (i = start, ilen = start + count; i < ilen; ++i) { + meta._parsed[i] = getter(i); + } + } + } + _getRotation() { + return toRadians(this.options.rotation - 90); + } + _getCircumference() { + return toRadians(this.options.circumference); + } + _getRotationExtents() { + let min = TAU; + let max = -TAU; + for (let i = 0; i < this.chart.data.datasets.length; ++i) { + if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) { + const controller = this.chart.getDatasetMeta(i).controller; + const rotation = controller._getRotation(); + const circumference = controller._getCircumference(); + min = Math.min(min, rotation); + max = Math.max(max, rotation + circumference); + } + } + return { + rotation: min, + circumference: max - min + }; + } + update(mode) { + const chart = this.chart; + const { chartArea } = chart; + const meta = this._cachedMeta; + const arcs = meta.data; + const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing; + const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0); + const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1); + const chartWeight = this._getRingWeight(this.index); + const { circumference, rotation } = this._getRotationExtents(); + const { ratioX, ratioY, offsetX, offsetY } = getRatioAndOffset(rotation, circumference, cutout); + const maxWidth = (chartArea.width - spacing) / ratioX; + const maxHeight = (chartArea.height - spacing) / ratioY; + const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); + const outerRadius = toDimension(this.options.radius, maxRadius); + const innerRadius = Math.max(outerRadius * cutout, 0); + const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal(); + this.offsetX = offsetX * outerRadius; + this.offsetY = offsetY * outerRadius; + meta.total = this.calculateTotal(); + this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index); + this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0); + this.updateElements(arcs, 0, arcs.length, mode); + } + _circumference(i, reset2) { + const opts = this.options; + const meta = this._cachedMeta; + const circumference = this._getCircumference(); + if (reset2 && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) { + return 0; + } + return this.calculateCircumference(meta._parsed[i] * circumference / TAU); + } + updateElements(arcs, start, count, mode) { + const reset2 = mode === "reset"; + const chart = this.chart; + const chartArea = chart.chartArea; + const opts = chart.options; + const animationOpts = opts.animation; + const centerX = (chartArea.left + chartArea.right) / 2; + const centerY = (chartArea.top + chartArea.bottom) / 2; + const animateScale = reset2 && animationOpts.animateScale; + const innerRadius = animateScale ? 0 : this.innerRadius; + const outerRadius = animateScale ? 0 : this.outerRadius; + const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode); + let startAngle = this._getRotation(); + let i; + for (i = 0; i < start; ++i) { + startAngle += this._circumference(i, reset2); + } + for (i = start; i < start + count; ++i) { + const circumference = this._circumference(i, reset2); + const arc = arcs[i]; + const properties = { + x: centerX + this.offsetX, + y: centerY + this.offsetY, + startAngle, + endAngle: startAngle + circumference, + circumference, + outerRadius, + innerRadius + }; + if (includeOptions) { + properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? "active" : mode); + } + startAngle += circumference; + this.updateElement(arc, i, properties, mode); + } + } + calculateTotal() { + const meta = this._cachedMeta; + const metaData = meta.data; + let total = 0; + let i; + for (i = 0; i < metaData.length; i++) { + const value = meta._parsed[i]; + if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) { + total += Math.abs(value); + } + } + return total; + } + calculateCircumference(value) { + const total = this._cachedMeta.total; + if (total > 0 && !isNaN(value)) { + return TAU * (Math.abs(value) / total); + } + return 0; + } + getLabelAndValue(index) { + const meta = this._cachedMeta; + const chart = this.chart; + const labels = chart.data.labels || []; + const value = formatNumber(meta._parsed[index], chart.options.locale); + return { + label: labels[index] || "", + value + }; + } + getMaxBorderWidth(arcs) { + let max = 0; + const chart = this.chart; + let i, ilen, meta, controller, options; + if (!arcs) { + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + controller = meta.controller; + break; + } + } + } + if (!arcs) { + return 0; + } + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + options = controller.resolveDataElementOptions(i); + if (options.borderAlign !== "inner") { + max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0); + } + } + return max; + } + getMaxOffset(arcs) { + let max = 0; + for (let i = 0, ilen = arcs.length; i < ilen; ++i) { + const options = this.resolveDataElementOptions(i); + max = Math.max(max, options.offset || 0, options.hoverOffset || 0); + } + return max; + } + _getRingWeightOffset(datasetIndex) { + let ringWeightOffset = 0; + for (let i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + return ringWeightOffset; + } + _getRingWeight(datasetIndex) { + return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0); + } + _getVisibleDatasetWeightTotal() { + return this._getRingWeightOffset(this.chart.data.datasets.length) || 1; + } +}; +__publicField(DoughnutController, "id", "doughnut"); +__publicField(DoughnutController, "defaults", { + datasetElementType: false, + dataElementType: "arc", + animation: { + animateRotate: true, + animateScale: false + }, + animations: { + numbers: { + type: "number", + properties: [ + "circumference", + "endAngle", + "innerRadius", + "outerRadius", + "startAngle", + "x", + "y", + "offset", + "borderWidth", + "spacing" + ] + } + }, + cutout: "50%", + rotation: 0, + circumference: 360, + radius: "100%", + spacing: 0, + indexAxis: "r" +}); +__publicField(DoughnutController, "descriptors", { + _scriptable: (name2) => name2 !== "spacing", + _indexable: (name2) => name2 !== "spacing" +}); +__publicField(DoughnutController, "overrides", { + aspectRatio: 1, + plugins: { + legend: { + labels: { + generateLabels(chart) { + const data = chart.data; + if (data.labels.length && data.datasets.length) { + const { labels: { pointStyle, color: color2 } } = chart.legend.options; + return data.labels.map((label, i) => { + const meta = chart.getDatasetMeta(0); + const style = meta.controller.getStyle(i); + return { + text: label, + fillStyle: style.backgroundColor, + strokeStyle: style.borderColor, + fontColor: color2, + lineWidth: style.borderWidth, + pointStyle, + hidden: !chart.getDataVisibility(i), + index: i + }; + }); + } + return []; + } + }, + onClick(e, legendItem, legend) { + legend.chart.toggleDataVisibility(legendItem.index); + legend.chart.update(); + } + } + } +}); +var PieController = class extends DoughnutController { +}; +__publicField(PieController, "id", "pie"); +__publicField(PieController, "defaults", { + cutout: 0, + rotation: 0, + circumference: 360, + radius: "100%" +}); +function abstract() { + throw new Error("This method is not implemented: Check that a complete date adapter is provided."); +} +var DateAdapterBase = class { + /** + * Override default date adapter methods. + * Accepts type parameter to define options type. + * @example + * Chart._adapters._date.override<{myAdapterOption: string}>({ + * init() { + * console.log(this.options.myAdapterOption); + * } + * }) + */ + static override(members) { + Object.assign(DateAdapterBase.prototype, members); + } + constructor(options) { + this.options = options || {}; + } + // eslint-disable-next-line @typescript-eslint/no-empty-function + init() { + } + formats() { + return abstract(); + } + parse() { + return abstract(); + } + format() { + return abstract(); + } + add() { + return abstract(); + } + diff() { + return abstract(); + } + startOf() { + return abstract(); + } + endOf() { + return abstract(); + } +}; +var adapters = { + _date: DateAdapterBase +}; +function binarySearch(metaset, axis, value, intersect) { + const { controller, data, _sorted } = metaset; + const iScale = controller._cachedMeta.iScale; + if (iScale && axis === iScale.axis && axis !== "r" && _sorted && data.length) { + const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey; + if (!intersect) { + return lookupMethod(data, axis, value); + } else if (controller._sharedOptions) { + const el = data[0]; + const range = typeof el.getRange === "function" && el.getRange(axis); + if (range) { + const start = lookupMethod(data, axis, value - range); + const end = lookupMethod(data, axis, value + range); + return { + lo: start.lo, + hi: end.hi + }; + } + } + } + return { + lo: 0, + hi: data.length - 1 + }; +} +function evaluateInteractionItems(chart, axis, position, handler, intersect) { + const metasets = chart.getSortedVisibleDatasetMetas(); + const value = position[axis]; + for (let i = 0, ilen = metasets.length; i < ilen; ++i) { + const { index, data } = metasets[i]; + const { lo, hi } = binarySearch(metasets[i], axis, value, intersect); + for (let j = lo; j <= hi; ++j) { + const element = data[j]; + if (!element.skip) { + handler(element, index, j); + } + } + } +} +function getDistanceMetricForAxis(axis) { + const useX = axis.indexOf("x") !== -1; + const useY = axis.indexOf("y") !== -1; + return function(pt1, pt2) { + const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; +} +function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) { + const items = []; + if (!includeInvisible && !chart.isPointInArea(position)) { + return items; + } + const evaluationFunc = function(element, datasetIndex, index) { + if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) { + return; + } + if (element.inRange(position.x, position.y, useFinalPosition)) { + items.push({ + element, + datasetIndex, + index + }); + } + }; + evaluateInteractionItems(chart, axis, position, evaluationFunc, true); + return items; +} +function getNearestRadialItems(chart, position, axis, useFinalPosition) { + let items = []; + function evaluationFunc(element, datasetIndex, index) { + const { startAngle, endAngle } = element.getProps([ + "startAngle", + "endAngle" + ], useFinalPosition); + const { angle } = getAngleFromPoint(element, { + x: position.x, + y: position.y + }); + if (_angleBetween(angle, startAngle, endAngle)) { + items.push({ + element, + datasetIndex, + index + }); + } + } + evaluateInteractionItems(chart, axis, position, evaluationFunc); + return items; +} +function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { + let items = []; + const distanceMetric = getDistanceMetricForAxis(axis); + let minDistance = Number.POSITIVE_INFINITY; + function evaluationFunc(element, datasetIndex, index) { + const inRange2 = element.inRange(position.x, position.y, useFinalPosition); + if (intersect && !inRange2) { + return; + } + const center = element.getCenterPoint(useFinalPosition); + const pointInArea = !!includeInvisible || chart.isPointInArea(center); + if (!pointInArea && !inRange2) { + return; + } + const distance = distanceMetric(position, center); + if (distance < minDistance) { + items = [ + { + element, + datasetIndex, + index + } + ]; + minDistance = distance; + } else if (distance === minDistance) { + items.push({ + element, + datasetIndex, + index + }); + } + } + evaluateInteractionItems(chart, axis, position, evaluationFunc); + return items; +} +function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { + if (!includeInvisible && !chart.isPointInArea(position)) { + return []; + } + return axis === "r" && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible); +} +function getAxisItems(chart, position, axis, intersect, useFinalPosition) { + const items = []; + const rangeMethod = axis === "x" ? "inXRange" : "inYRange"; + let intersectsItem = false; + evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => { + if (element[rangeMethod](position[axis], useFinalPosition)) { + items.push({ + element, + datasetIndex, + index + }); + intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition); + } + }); + if (intersect && !intersectsItem) { + return []; + } + return items; +} +var Interaction = { + evaluateInteractionItems, + modes: { + index(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "x"; + const includeInvisible = options.includeInvisible || false; + const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); + const elements = []; + if (!items.length) { + return []; + } + chart.getSortedVisibleDatasetMetas().forEach((meta) => { + const index = items[0].index; + const element = meta.data[index]; + if (element && !element.skip) { + elements.push({ + element, + datasetIndex: meta.index, + index + }); + } + }); + return elements; + }, + dataset(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "xy"; + const includeInvisible = options.includeInvisible || false; + let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); + if (items.length > 0) { + const datasetIndex = items[0].datasetIndex; + const data = chart.getDatasetMeta(datasetIndex).data; + items = []; + for (let i = 0; i < data.length; ++i) { + items.push({ + element: data[i], + datasetIndex, + index: i + }); + } + } + return items; + }, + point(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "xy"; + const includeInvisible = options.includeInvisible || false; + return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible); + }, + nearest(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + const axis = options.axis || "xy"; + const includeInvisible = options.includeInvisible || false; + return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible); + }, + x(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + return getAxisItems(chart, position, "x", options.intersect, useFinalPosition); + }, + y(chart, e, options, useFinalPosition) { + const position = getRelativePosition(e, chart); + return getAxisItems(chart, position, "y", options.intersect, useFinalPosition); + } + } +}; +var STATIC_POSITIONS = [ + "left", + "top", + "right", + "bottom" +]; +function filterByPosition(array, position) { + return array.filter((v) => v.pos === position); +} +function filterDynamicPositionByAxis(array, axis) { + return array.filter((v) => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis); +} +function sortByWeight(array, reverse) { + return array.sort((a, b) => { + const v0 = reverse ? b : a; + const v1 = reverse ? a : b; + return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight; + }); +} +function wrapBoxes(boxes) { + const layoutBoxes = []; + let i, ilen, box, pos, stack, stackWeight; + for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { + box = boxes[i]; + ({ position: pos, options: { stack, stackWeight = 1 } } = box); + layoutBoxes.push({ + index: i, + box, + pos, + horizontal: box.isHorizontal(), + weight: box.weight, + stack: stack && pos + stack, + stackWeight + }); + } + return layoutBoxes; +} +function buildStacks(layouts2) { + const stacks = {}; + for (const wrap of layouts2) { + const { stack, pos, stackWeight } = wrap; + if (!stack || !STATIC_POSITIONS.includes(pos)) { + continue; + } + const _stack = stacks[stack] || (stacks[stack] = { + count: 0, + placed: 0, + weight: 0, + size: 0 + }); + _stack.count++; + _stack.weight += stackWeight; + } + return stacks; +} +function setLayoutDims(layouts2, params) { + const stacks = buildStacks(layouts2); + const { vBoxMaxWidth, hBoxMaxHeight } = params; + let i, ilen, layout; + for (i = 0, ilen = layouts2.length; i < ilen; ++i) { + layout = layouts2[i]; + const { fullSize } = layout.box; + const stack = stacks[layout.stack]; + const factor = stack && layout.stackWeight / stack.weight; + if (layout.horizontal) { + layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth; + layout.height = hBoxMaxHeight; + } else { + layout.width = vBoxMaxWidth; + layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight; + } + } + return stacks; +} +function buildLayoutBoxes(boxes) { + const layoutBoxes = wrapBoxes(boxes); + const fullSize = sortByWeight(layoutBoxes.filter((wrap) => wrap.box.fullSize), true); + const left = sortByWeight(filterByPosition(layoutBoxes, "left"), true); + const right = sortByWeight(filterByPosition(layoutBoxes, "right")); + const top = sortByWeight(filterByPosition(layoutBoxes, "top"), true); + const bottom = sortByWeight(filterByPosition(layoutBoxes, "bottom")); + const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, "x"); + const centerVertical = filterDynamicPositionByAxis(layoutBoxes, "y"); + return { + fullSize, + leftAndTop: left.concat(top), + rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal), + chartArea: filterByPosition(layoutBoxes, "chartArea"), + vertical: left.concat(right).concat(centerVertical), + horizontal: top.concat(bottom).concat(centerHorizontal) + }; +} +function getCombinedMax(maxPadding, chartArea, a, b) { + return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); +} +function updateMaxPadding(maxPadding, boxPadding) { + maxPadding.top = Math.max(maxPadding.top, boxPadding.top); + maxPadding.left = Math.max(maxPadding.left, boxPadding.left); + maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); + maxPadding.right = Math.max(maxPadding.right, boxPadding.right); +} +function updateDims(chartArea, params, layout, stacks) { + const { pos, box } = layout; + const maxPadding = chartArea.maxPadding; + if (!isObject(pos)) { + if (layout.size) { + chartArea[pos] -= layout.size; + } + const stack = stacks[layout.stack] || { + size: 0, + count: 1 + }; + stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width); + layout.size = stack.size / stack.count; + chartArea[pos] += layout.size; + } + if (box.getPadding) { + updateMaxPadding(maxPadding, box.getPadding()); + } + const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, "left", "right")); + const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, "top", "bottom")); + const widthChanged = newWidth !== chartArea.w; + const heightChanged = newHeight !== chartArea.h; + chartArea.w = newWidth; + chartArea.h = newHeight; + return layout.horizontal ? { + same: widthChanged, + other: heightChanged + } : { + same: heightChanged, + other: widthChanged + }; +} +function handleMaxPadding(chartArea) { + const maxPadding = chartArea.maxPadding; + function updatePos(pos) { + const change = Math.max(maxPadding[pos] - chartArea[pos], 0); + chartArea[pos] += change; + return change; + } + chartArea.y += updatePos("top"); + chartArea.x += updatePos("left"); + updatePos("right"); + updatePos("bottom"); +} +function getMargins(horizontal, chartArea) { + const maxPadding = chartArea.maxPadding; + function marginForPositions(positions2) { + const margin = { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; + positions2.forEach((pos) => { + margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); + }); + return margin; + } + return horizontal ? marginForPositions([ + "left", + "right" + ]) : marginForPositions([ + "top", + "bottom" + ]); +} +function fitBoxes(boxes, chartArea, params, stacks) { + const refitBoxes = []; + let i, ilen, layout, box, refit, changed; + for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) { + layout = boxes[i]; + box = layout.box; + box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea)); + const { same, other } = updateDims(chartArea, params, layout, stacks); + refit |= same && refitBoxes.length; + changed = changed || other; + if (!box.fullSize) { + refitBoxes.push(layout); + } + } + return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed; +} +function setBoxDims(box, left, top, width, height) { + box.top = top; + box.left = left; + box.right = left + width; + box.bottom = top + height; + box.width = width; + box.height = height; +} +function placeBoxes(boxes, chartArea, params, stacks) { + const userPadding = params.padding; + let { x, y } = chartArea; + for (const layout of boxes) { + const box = layout.box; + const stack = stacks[layout.stack] || { + count: 1, + placed: 0, + weight: 1 + }; + const weight = layout.stackWeight / stack.weight || 1; + if (layout.horizontal) { + const width = chartArea.w * weight; + const height = stack.size || box.height; + if (defined(stack.start)) { + y = stack.start; + } + if (box.fullSize) { + setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height); + } else { + setBoxDims(box, chartArea.left + stack.placed, y, width, height); + } + stack.start = y; + stack.placed += width; + y = box.bottom; + } else { + const height1 = chartArea.h * weight; + const width1 = stack.size || box.width; + if (defined(stack.start)) { + x = stack.start; + } + if (box.fullSize) { + setBoxDims(box, x, userPadding.top, width1, params.outerHeight - userPadding.bottom - userPadding.top); + } else { + setBoxDims(box, x, chartArea.top + stack.placed, width1, height1); + } + stack.start = x; + stack.placed += height1; + x = box.right; + } + } + chartArea.x = x; + chartArea.y = y; +} +var layouts = { + addBox(chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + item.fullSize = item.fullSize || false; + item.position = item.position || "top"; + item.weight = item.weight || 0; + item._layers = item._layers || function() { + return [ + { + z: 0, + draw(chartArea) { + item.draw(chartArea); + } + } + ]; + }; + chart.boxes.push(item); + }, + removeBox(chart, layoutItem) { + const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + configure(chart, item, options) { + item.fullSize = options.fullSize; + item.position = options.position; + item.weight = options.weight; + }, + update(chart, width, height, minPadding) { + if (!chart) { + return; + } + const padding = toPadding(chart.options.layout.padding); + const availableWidth = Math.max(width - padding.width, 0); + const availableHeight = Math.max(height - padding.height, 0); + const boxes = buildLayoutBoxes(chart.boxes); + const verticalBoxes = boxes.vertical; + const horizontalBoxes = boxes.horizontal; + each(chart.boxes, (box) => { + if (typeof box.beforeLayout === "function") { + box.beforeLayout(); + } + }); + const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) => wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1; + const params = Object.freeze({ + outerWidth: width, + outerHeight: height, + padding, + availableWidth, + availableHeight, + vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount, + hBoxMaxHeight: availableHeight / 2 + }); + const maxPadding = Object.assign({}, padding); + updateMaxPadding(maxPadding, toPadding(minPadding)); + const chartArea = Object.assign({ + maxPadding, + w: availableWidth, + h: availableHeight, + x: padding.left, + y: padding.top + }, padding); + const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); + fitBoxes(boxes.fullSize, chartArea, params, stacks); + fitBoxes(verticalBoxes, chartArea, params, stacks); + if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) { + fitBoxes(verticalBoxes, chartArea, params, stacks); + } + handleMaxPadding(chartArea); + placeBoxes(boxes.leftAndTop, chartArea, params, stacks); + chartArea.x += chartArea.w; + chartArea.y += chartArea.h; + placeBoxes(boxes.rightAndBottom, chartArea, params, stacks); + chart.chartArea = { + left: chartArea.left, + top: chartArea.top, + right: chartArea.left + chartArea.w, + bottom: chartArea.top + chartArea.h, + height: chartArea.h, + width: chartArea.w + }; + each(boxes.chartArea, (layout) => { + const box = layout.box; + Object.assign(box, chart.chartArea); + box.update(chartArea.w, chartArea.h, { + left: 0, + top: 0, + right: 0, + bottom: 0 + }); + }); + } +}; +var BasePlatform = class { + acquireContext(canvas, aspectRatio) { + } + releaseContext(context) { + return false; + } + addEventListener(chart, type, listener) { + } + removeEventListener(chart, type, listener) { + } + getDevicePixelRatio() { + return 1; + } + getMaximumSize(element, width, height, aspectRatio) { + width = Math.max(0, width || element.width); + height = height || element.height; + return { + width, + height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height) + }; + } + isAttached(canvas) { + return true; + } + updateConfig(config) { + } +}; +var BasicPlatform = class extends BasePlatform { + acquireContext(item) { + return item && item.getContext && item.getContext("2d") || null; + } + updateConfig(config) { + config.options.animation = false; + } +}; +var EXPANDO_KEY = "$chartjs"; +var EVENT_TYPES = { + touchstart: "mousedown", + touchmove: "mousemove", + touchend: "mouseup", + pointerenter: "mouseenter", + pointerdown: "mousedown", + pointermove: "mousemove", + pointerup: "mouseup", + pointerleave: "mouseout", + pointerout: "mouseout" +}; +var isNullOrEmpty = (value) => value === null || value === ""; +function initCanvas(canvas, aspectRatio) { + const style = canvas.style; + const renderHeight = canvas.getAttribute("height"); + const renderWidth = canvas.getAttribute("width"); + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + style.display = style.display || "block"; + style.boxSizing = style.boxSizing || "border-box"; + if (isNullOrEmpty(renderWidth)) { + const displayWidth = readUsedSize(canvas, "width"); + if (displayWidth !== void 0) { + canvas.width = displayWidth; + } + } + if (isNullOrEmpty(renderHeight)) { + if (canvas.style.height === "") { + canvas.height = canvas.width / (aspectRatio || 2); + } else { + const displayHeight = readUsedSize(canvas, "height"); + if (displayHeight !== void 0) { + canvas.height = displayHeight; + } + } + } + return canvas; +} +var eventListenerOptions = supportsEventListenerOptions ? { + passive: true +} : false; +function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); +} +function removeListener(chart, type, listener) { + chart.canvas.removeEventListener(type, listener, eventListenerOptions); +} +function fromNativeEvent(event, chart) { + const type = EVENT_TYPES[event.type] || event.type; + const { x, y } = getRelativePosition(event, chart); + return { + type, + chart, + native: event, + x: x !== void 0 ? x : null, + y: y !== void 0 ? y : null + }; +} +function nodeListContains(nodeList, canvas) { + for (const node of nodeList) { + if (node === canvas || node.contains(canvas)) { + return true; + } + } +} +function createAttachObserver(chart, type, listener) { + const canvas = chart.canvas; + const observer = new MutationObserver((entries) => { + let trigger = false; + for (const entry of entries) { + trigger = trigger || nodeListContains(entry.addedNodes, canvas); + trigger = trigger && !nodeListContains(entry.removedNodes, canvas); + } + if (trigger) { + listener(); + } + }); + observer.observe(document, { + childList: true, + subtree: true + }); + return observer; +} +function createDetachObserver(chart, type, listener) { + const canvas = chart.canvas; + const observer = new MutationObserver((entries) => { + let trigger = false; + for (const entry of entries) { + trigger = trigger || nodeListContains(entry.removedNodes, canvas); + trigger = trigger && !nodeListContains(entry.addedNodes, canvas); + } + if (trigger) { + listener(); + } + }); + observer.observe(document, { + childList: true, + subtree: true + }); + return observer; +} +var drpListeningCharts = /* @__PURE__ */ new Map(); +var oldDevicePixelRatio = 0; +function onWindowResize() { + const dpr = window.devicePixelRatio; + if (dpr === oldDevicePixelRatio) { + return; + } + oldDevicePixelRatio = dpr; + drpListeningCharts.forEach((resize, chart) => { + if (chart.currentDevicePixelRatio !== dpr) { + resize(); + } + }); +} +function listenDevicePixelRatioChanges(chart, resize) { + if (!drpListeningCharts.size) { + window.addEventListener("resize", onWindowResize); + } + drpListeningCharts.set(chart, resize); +} +function unlistenDevicePixelRatioChanges(chart) { + drpListeningCharts.delete(chart); + if (!drpListeningCharts.size) { + window.removeEventListener("resize", onWindowResize); + } +} +function createResizeObserver(chart, type, listener) { + const canvas = chart.canvas; + const container = canvas && _getParentNode(canvas); + if (!container) { + return; + } + const resize = throttled((width, height) => { + const w = container.clientWidth; + listener(width, height); + if (w < container.clientWidth) { + listener(); + } + }, window); + const observer = new ResizeObserver((entries) => { + const entry = entries[0]; + const width = entry.contentRect.width; + const height = entry.contentRect.height; + if (width === 0 && height === 0) { + return; + } + resize(width, height); + }); + observer.observe(container); + listenDevicePixelRatioChanges(chart, resize); + return observer; +} +function releaseObserver(chart, type, observer) { + if (observer) { + observer.disconnect(); + } + if (type === "resize") { + unlistenDevicePixelRatioChanges(chart); + } +} +function createProxyAndListen(chart, type, listener) { + const canvas = chart.canvas; + const proxy = throttled((event) => { + if (chart.ctx !== null) { + listener(fromNativeEvent(event, chart)); + } + }, chart); + addListener(canvas, type, proxy); + return proxy; +} +var DomPlatform = class extends BasePlatform { + acquireContext(canvas, aspectRatio) { + const context = canvas && canvas.getContext && canvas.getContext("2d"); + if (context && context.canvas === canvas) { + initCanvas(canvas, aspectRatio); + return context; + } + return null; + } + releaseContext(context) { + const canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return false; + } + const initial = canvas[EXPANDO_KEY].initial; + [ + "height", + "width" + ].forEach((prop) => { + const value = initial[prop]; + if (isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + const style = initial.style || {}; + Object.keys(style).forEach((key) => { + canvas.style[key] = style[key]; + }); + canvas.width = canvas.width; + delete canvas[EXPANDO_KEY]; + return true; + } + addEventListener(chart, type, listener) { + this.removeEventListener(chart, type); + const proxies = chart.$proxies || (chart.$proxies = {}); + const handlers = { + attach: createAttachObserver, + detach: createDetachObserver, + resize: createResizeObserver + }; + const handler = handlers[type] || createProxyAndListen; + proxies[type] = handler(chart, type, listener); + } + removeEventListener(chart, type) { + const proxies = chart.$proxies || (chart.$proxies = {}); + const proxy = proxies[type]; + if (!proxy) { + return; + } + const handlers = { + attach: releaseObserver, + detach: releaseObserver, + resize: releaseObserver + }; + const handler = handlers[type] || removeListener; + handler(chart, type, proxy); + proxies[type] = void 0; + } + getDevicePixelRatio() { + return window.devicePixelRatio; + } + getMaximumSize(canvas, width, height, aspectRatio) { + return getMaximumSize(canvas, width, height, aspectRatio); + } + isAttached(canvas) { + const container = _getParentNode(canvas); + return !!(container && container.isConnected); + } +}; +function _detectPlatform(canvas) { + if (!_isDomSupported() || typeof OffscreenCanvas !== "undefined" && canvas instanceof OffscreenCanvas) { + return BasicPlatform; + } + return DomPlatform; +} +var Element = class { + constructor() { + __publicField(this, "active", false); + } + tooltipPosition(useFinalPosition) { + const { x, y } = this.getProps([ + "x", + "y" + ], useFinalPosition); + return { + x, + y + }; + } + hasValue() { + return isNumber(this.x) && isNumber(this.y); + } + getProps(props, final) { + const anims = this.$animations; + if (!final || !anims) { + return this; + } + const ret = {}; + props.forEach((prop) => { + ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop]; + }); + return ret; + } +}; +__publicField(Element, "defaults", {}); +__publicField(Element, "defaultRoutes"); +function autoSkip(scale, ticks) { + const tickOpts = scale.options.ticks; + const determinedMaxTicks = determineMaxTicks(scale); + const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks); + const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : []; + const numMajorIndices = majorIndices.length; + const first = majorIndices[0]; + const last = majorIndices[numMajorIndices - 1]; + const newTicks = []; + if (numMajorIndices > ticksLimit) { + skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit); + return newTicks; + } + const spacing = calculateSpacing(majorIndices, ticks, ticksLimit); + if (numMajorIndices > 0) { + let i, ilen; + const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null; + skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first); + for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) { + skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]); + } + skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing); + return newTicks; + } + skip(ticks, newTicks, spacing); + return newTicks; +} +function determineMaxTicks(scale) { + const offset = scale.options.offset; + const tickLength = scale._tickSize(); + const maxScale = scale._length / tickLength + (offset ? 0 : 1); + const maxChart = scale._maxLength / tickLength; + return Math.floor(Math.min(maxScale, maxChart)); +} +function calculateSpacing(majorIndices, ticks, ticksLimit) { + const evenMajorSpacing = getEvenSpacing(majorIndices); + const spacing = ticks.length / ticksLimit; + if (!evenMajorSpacing) { + return Math.max(spacing, 1); + } + const factors = _factorize(evenMajorSpacing); + for (let i = 0, ilen = factors.length - 1; i < ilen; i++) { + const factor = factors[i]; + if (factor > spacing) { + return factor; + } + } + return Math.max(spacing, 1); +} +function getMajorIndices(ticks) { + const result = []; + let i, ilen; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + if (ticks[i].major) { + result.push(i); + } + } + return result; +} +function skipMajors(ticks, newTicks, majorIndices, spacing) { + let count = 0; + let next = majorIndices[0]; + let i; + spacing = Math.ceil(spacing); + for (i = 0; i < ticks.length; i++) { + if (i === next) { + newTicks.push(ticks[i]); + count++; + next = majorIndices[count * spacing]; + } + } +} +function skip(ticks, newTicks, spacing, majorStart, majorEnd) { + const start = valueOrDefault(majorStart, 0); + const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length); + let count = 0; + let length, i, next; + spacing = Math.ceil(spacing); + if (majorEnd) { + length = majorEnd - majorStart; + spacing = length / Math.floor(length / spacing); + } + next = start; + while (next < 0) { + count++; + next = Math.round(start + count * spacing); + } + for (i = Math.max(start, 0); i < end; i++) { + if (i === next) { + newTicks.push(ticks[i]); + count++; + next = Math.round(start + count * spacing); + } + } +} +function getEvenSpacing(arr) { + const len = arr.length; + let i, diff; + if (len < 2) { + return false; + } + for (diff = arr[0], i = 1; i < len; ++i) { + if (arr[i] - arr[i - 1] !== diff) { + return false; + } + } + return diff; +} +var reverseAlign = (align) => align === "left" ? "right" : align === "right" ? "left" : align; +var offsetFromEdge = (scale, edge, offset) => edge === "top" || edge === "left" ? scale[edge] + offset : scale[edge] - offset; +var getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength); +function sample(arr, numItems) { + const result = []; + const increment = arr.length / numItems; + const len = arr.length; + let i = 0; + for (; i < len; i += increment) { + result.push(arr[Math.floor(i)]); + } + return result; +} +function getPixelForGridLine(scale, index, offsetGridLines) { + const length = scale.ticks.length; + const validIndex2 = Math.min(index, length - 1); + const start = scale._startPixel; + const end = scale._endPixel; + const epsilon = 1e-6; + let lineValue = scale.getPixelForTick(validIndex2); + let offset; + if (offsetGridLines) { + if (length === 1) { + offset = Math.max(lineValue - start, end - lineValue); + } else if (index === 0) { + offset = (scale.getPixelForTick(1) - lineValue) / 2; + } else { + offset = (lineValue - scale.getPixelForTick(validIndex2 - 1)) / 2; + } + lineValue += validIndex2 < index ? offset : -offset; + if (lineValue < start - epsilon || lineValue > end + epsilon) { + return; + } + } + return lineValue; +} +function garbageCollect(caches, length) { + each(caches, (cache) => { + const gc = cache.gc; + const gcLen = gc.length / 2; + let i; + if (gcLen > length) { + for (i = 0; i < gcLen; ++i) { + delete cache.data[gc[i]]; + } + gc.splice(0, gcLen); + } + }); +} +function getTickMarkLength(options) { + return options.drawTicks ? options.tickLength : 0; +} +function getTitleHeight(options, fallback) { + if (!options.display) { + return 0; + } + const font = toFont(options.font, fallback); + const padding = toPadding(options.padding); + const lines = isArray(options.text) ? options.text.length : 1; + return lines * font.lineHeight + padding.height; +} +function createScaleContext(parent, scale) { + return createContext(parent, { + scale, + type: "scale" + }); +} +function createTickContext(parent, index, tick) { + return createContext(parent, { + tick, + index, + type: "tick" + }); +} +function titleAlign(align, position, reverse) { + let ret = _toLeftRightCenter(align); + if (reverse && position !== "right" || !reverse && position === "right") { + ret = reverseAlign(ret); + } + return ret; +} +function titleArgs(scale, offset, position, align) { + const { top, left, bottom, right, chart } = scale; + const { chartArea, scales } = chart; + let rotation = 0; + let maxWidth, titleX, titleY; + const height = bottom - top; + const width = right - left; + if (scale.isHorizontal()) { + titleX = _alignStartEnd(align, left, right); + if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + titleY = scales[positionAxisID].getPixelForValue(value) + height - offset; + } else if (position === "center") { + titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset; + } else { + titleY = offsetFromEdge(scale, position, offset); + } + maxWidth = right - left; + } else { + if (isObject(position)) { + const positionAxisID1 = Object.keys(position)[0]; + const value1 = position[positionAxisID1]; + titleX = scales[positionAxisID1].getPixelForValue(value1) - width + offset; + } else if (position === "center") { + titleX = (chartArea.left + chartArea.right) / 2 - width + offset; + } else { + titleX = offsetFromEdge(scale, position, offset); + } + titleY = _alignStartEnd(align, bottom, top); + rotation = position === "left" ? -HALF_PI : HALF_PI; + } + return { + titleX, + titleY, + maxWidth, + rotation + }; +} +var Scale = class extends Element { + constructor(cfg) { + super(); + this.id = cfg.id; + this.type = cfg.type; + this.options = void 0; + this.ctx = cfg.ctx; + this.chart = cfg.chart; + this.top = void 0; + this.bottom = void 0; + this.left = void 0; + this.right = void 0; + this.width = void 0; + this.height = void 0; + this._margins = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + this.maxWidth = void 0; + this.maxHeight = void 0; + this.paddingTop = void 0; + this.paddingBottom = void 0; + this.paddingLeft = void 0; + this.paddingRight = void 0; + this.axis = void 0; + this.labelRotation = void 0; + this.min = void 0; + this.max = void 0; + this._range = void 0; + this.ticks = []; + this._gridLineItems = null; + this._labelItems = null; + this._labelSizes = null; + this._length = 0; + this._maxLength = 0; + this._longestTextCache = {}; + this._startPixel = void 0; + this._endPixel = void 0; + this._reversePixels = false; + this._userMax = void 0; + this._userMin = void 0; + this._suggestedMax = void 0; + this._suggestedMin = void 0; + this._ticksLength = 0; + this._borderValue = 0; + this._cache = {}; + this._dataLimitsCached = false; + this.$context = void 0; + } + init(options) { + this.options = options.setContext(this.getContext()); + this.axis = options.axis; + this._userMin = this.parse(options.min); + this._userMax = this.parse(options.max); + this._suggestedMin = this.parse(options.suggestedMin); + this._suggestedMax = this.parse(options.suggestedMax); + } + parse(raw, index) { + return raw; + } + getUserBounds() { + let { _userMin, _userMax, _suggestedMin, _suggestedMax } = this; + _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY); + _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY); + _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY); + _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY); + return { + min: finiteOrDefault(_userMin, _suggestedMin), + max: finiteOrDefault(_userMax, _suggestedMax), + minDefined: isNumberFinite(_userMin), + maxDefined: isNumberFinite(_userMax) + }; + } + getMinMax(canStack) { + let { min, max, minDefined, maxDefined } = this.getUserBounds(); + let range; + if (minDefined && maxDefined) { + return { + min, + max + }; + } + const metas = this.getMatchingVisibleMetas(); + for (let i = 0, ilen = metas.length; i < ilen; ++i) { + range = metas[i].controller.getMinMax(this, canStack); + if (!minDefined) { + min = Math.min(min, range.min); + } + if (!maxDefined) { + max = Math.max(max, range.max); + } + } + min = maxDefined && min > max ? max : min; + max = minDefined && min > max ? min : max; + return { + min: finiteOrDefault(min, finiteOrDefault(max, min)), + max: finiteOrDefault(max, finiteOrDefault(min, max)) + }; + } + getPadding() { + return { + left: this.paddingLeft || 0, + top: this.paddingTop || 0, + right: this.paddingRight || 0, + bottom: this.paddingBottom || 0 + }; + } + getTicks() { + return this.ticks; + } + getLabels() { + const data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || []; + } + getLabelItems(chartArea = this.chart.chartArea) { + const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea)); + return items; + } + beforeLayout() { + this._cache = {}; + this._dataLimitsCached = false; + } + beforeUpdate() { + callback(this.options.beforeUpdate, [ + this + ]); + } + update(maxWidth, maxHeight, margins) { + const { beginAtZero, grace, ticks: tickOpts } = this.options; + const sampleSize = tickOpts.sampleSize; + this.beforeUpdate(); + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + this._margins = margins = Object.assign({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + this.ticks = null; + this._labelSizes = null; + this._gridLineItems = null; + this._labelItems = null; + this.beforeSetDimensions(); + this.setDimensions(); + this.afterSetDimensions(); + this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom; + if (!this._dataLimitsCached) { + this.beforeDataLimits(); + this.determineDataLimits(); + this.afterDataLimits(); + this._range = _addGrace(this, grace, beginAtZero); + this._dataLimitsCached = true; + } + this.beforeBuildTicks(); + this.ticks = this.buildTicks() || []; + this.afterBuildTicks(); + const samplingEnabled = sampleSize < this.ticks.length; + this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks); + this.configure(); + this.beforeCalculateLabelRotation(); + this.calculateLabelRotation(); + this.afterCalculateLabelRotation(); + if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === "auto")) { + this.ticks = autoSkip(this, this.ticks); + this._labelSizes = null; + this.afterAutoSkip(); + } + if (samplingEnabled) { + this._convertTicksToLabels(this.ticks); + } + this.beforeFit(); + this.fit(); + this.afterFit(); + this.afterUpdate(); + } + configure() { + let reversePixels = this.options.reverse; + let startPixel, endPixel; + if (this.isHorizontal()) { + startPixel = this.left; + endPixel = this.right; + } else { + startPixel = this.top; + endPixel = this.bottom; + reversePixels = !reversePixels; + } + this._startPixel = startPixel; + this._endPixel = endPixel; + this._reversePixels = reversePixels; + this._length = endPixel - startPixel; + this._alignToPixels = this.options.alignToPixels; + } + afterUpdate() { + callback(this.options.afterUpdate, [ + this + ]); + } + beforeSetDimensions() { + callback(this.options.beforeSetDimensions, [ + this + ]); + } + setDimensions() { + if (this.isHorizontal()) { + this.width = this.maxWidth; + this.left = 0; + this.right = this.width; + } else { + this.height = this.maxHeight; + this.top = 0; + this.bottom = this.height; + } + this.paddingLeft = 0; + this.paddingTop = 0; + this.paddingRight = 0; + this.paddingBottom = 0; + } + afterSetDimensions() { + callback(this.options.afterSetDimensions, [ + this + ]); + } + _callHooks(name2) { + this.chart.notifyPlugins(name2, this.getContext()); + callback(this.options[name2], [ + this + ]); + } + beforeDataLimits() { + this._callHooks("beforeDataLimits"); + } + determineDataLimits() { + } + afterDataLimits() { + this._callHooks("afterDataLimits"); + } + beforeBuildTicks() { + this._callHooks("beforeBuildTicks"); + } + buildTicks() { + return []; + } + afterBuildTicks() { + this._callHooks("afterBuildTicks"); + } + beforeTickToLabelConversion() { + callback(this.options.beforeTickToLabelConversion, [ + this + ]); + } + generateTickLabels(ticks) { + const tickOpts = this.options.ticks; + let i, ilen, tick; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + tick = ticks[i]; + tick.label = callback(tickOpts.callback, [ + tick.value, + i, + ticks + ], this); + } + } + afterTickToLabelConversion() { + callback(this.options.afterTickToLabelConversion, [ + this + ]); + } + beforeCalculateLabelRotation() { + callback(this.options.beforeCalculateLabelRotation, [ + this + ]); + } + calculateLabelRotation() { + const options = this.options; + const tickOpts = options.ticks; + const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit); + const minRotation = tickOpts.minRotation || 0; + const maxRotation = tickOpts.maxRotation; + let labelRotation = minRotation; + let tickWidth, maxHeight, maxLabelDiagonal; + if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) { + this.labelRotation = minRotation; + return; + } + const labelSizes = this._getLabelSizes(); + const maxLabelWidth = labelSizes.widest.width; + const maxLabelHeight = labelSizes.highest.height; + const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth); + tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1); + if (maxLabelWidth + 6 > tickWidth) { + tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1)); + maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font); + maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight); + labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1)))); + labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation)); + } + this.labelRotation = labelRotation; + } + afterCalculateLabelRotation() { + callback(this.options.afterCalculateLabelRotation, [ + this + ]); + } + afterAutoSkip() { + } + beforeFit() { + callback(this.options.beforeFit, [ + this + ]); + } + fit() { + const minSize = { + width: 0, + height: 0 + }; + const { chart, options: { ticks: tickOpts, title: titleOpts, grid: gridOpts } } = this; + const display = this._isVisible(); + const isHorizontal = this.isHorizontal(); + if (display) { + const titleHeight = getTitleHeight(titleOpts, chart.options.font); + if (isHorizontal) { + minSize.width = this.maxWidth; + minSize.height = getTickMarkLength(gridOpts) + titleHeight; + } else { + minSize.height = this.maxHeight; + minSize.width = getTickMarkLength(gridOpts) + titleHeight; + } + if (tickOpts.display && this.ticks.length) { + const { first, last, widest, highest } = this._getLabelSizes(); + const tickPadding = tickOpts.padding * 2; + const angleRadians = toRadians(this.labelRotation); + const cos = Math.cos(angleRadians); + const sin = Math.sin(angleRadians); + if (isHorizontal) { + const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height; + minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding); + } else { + const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height; + minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding); + } + this._calculatePadding(first, last, sin, cos); + } + } + this._handleMargins(); + if (isHorizontal) { + this.width = this._length = chart.width - this._margins.left - this._margins.right; + this.height = minSize.height; + } else { + this.width = minSize.width; + this.height = this._length = chart.height - this._margins.top - this._margins.bottom; + } + } + _calculatePadding(first, last, sin, cos) { + const { ticks: { align, padding }, position } = this.options; + const isRotated = this.labelRotation !== 0; + const labelsBelowTicks = position !== "top" && this.axis === "x"; + if (this.isHorizontal()) { + const offsetLeft = this.getPixelForTick(0) - this.left; + const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1); + let paddingLeft = 0; + let paddingRight = 0; + if (isRotated) { + if (labelsBelowTicks) { + paddingLeft = cos * first.width; + paddingRight = sin * last.height; + } else { + paddingLeft = sin * first.height; + paddingRight = cos * last.width; + } + } else if (align === "start") { + paddingRight = last.width; + } else if (align === "end") { + paddingLeft = first.width; + } else if (align !== "inner") { + paddingLeft = first.width / 2; + paddingRight = last.width / 2; + } + this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0); + this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0); + } else { + let paddingTop = last.height / 2; + let paddingBottom = first.height / 2; + if (align === "start") { + paddingTop = 0; + paddingBottom = first.height; + } else if (align === "end") { + paddingTop = last.height; + paddingBottom = 0; + } + this.paddingTop = paddingTop + padding; + this.paddingBottom = paddingBottom + padding; + } + } + _handleMargins() { + if (this._margins) { + this._margins.left = Math.max(this.paddingLeft, this._margins.left); + this._margins.top = Math.max(this.paddingTop, this._margins.top); + this._margins.right = Math.max(this.paddingRight, this._margins.right); + this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom); + } + } + afterFit() { + callback(this.options.afterFit, [ + this + ]); + } + isHorizontal() { + const { axis, position } = this.options; + return position === "top" || position === "bottom" || axis === "x"; + } + isFullSize() { + return this.options.fullSize; + } + _convertTicksToLabels(ticks) { + this.beforeTickToLabelConversion(); + this.generateTickLabels(ticks); + let i, ilen; + for (i = 0, ilen = ticks.length; i < ilen; i++) { + if (isNullOrUndef(ticks[i].label)) { + ticks.splice(i, 1); + ilen--; + i--; + } + } + this.afterTickToLabelConversion(); + } + _getLabelSizes() { + let labelSizes = this._labelSizes; + if (!labelSizes) { + const sampleSize = this.options.ticks.sampleSize; + let ticks = this.ticks; + if (sampleSize < ticks.length) { + ticks = sample(ticks, sampleSize); + } + this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit); + } + return labelSizes; + } + _computeLabelSizes(ticks, length, maxTicksLimit) { + const { ctx, _longestTextCache: caches } = this; + const widths = []; + const heights = []; + const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit)); + let widestLabelSize = 0; + let highestLabelSize = 0; + let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel; + for (i = 0; i < length; i += increment) { + label = ticks[i].label; + tickFont = this._resolveTickFontOptions(i); + ctx.font = fontString = tickFont.string; + cache = caches[fontString] = caches[fontString] || { + data: {}, + gc: [] + }; + lineHeight = tickFont.lineHeight; + width = height = 0; + if (!isNullOrUndef(label) && !isArray(label)) { + width = _measureText(ctx, cache.data, cache.gc, width, label); + height = lineHeight; + } else if (isArray(label)) { + for (j = 0, jlen = label.length; j < jlen; ++j) { + nestedLabel = label[j]; + if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) { + width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel); + height += lineHeight; + } + } + } + widths.push(width); + heights.push(height); + widestLabelSize = Math.max(width, widestLabelSize); + highestLabelSize = Math.max(height, highestLabelSize); + } + garbageCollect(caches, length); + const widest = widths.indexOf(widestLabelSize); + const highest = heights.indexOf(highestLabelSize); + const valueAt = (idx) => ({ + width: widths[idx] || 0, + height: heights[idx] || 0 + }); + return { + first: valueAt(0), + last: valueAt(length - 1), + widest: valueAt(widest), + highest: valueAt(highest), + widths, + heights + }; + } + getLabelForValue(value) { + return value; + } + getPixelForValue(value, index) { + return NaN; + } + getValueForPixel(pixel) { + } + getPixelForTick(index) { + const ticks = this.ticks; + if (index < 0 || index > ticks.length - 1) { + return null; + } + return this.getPixelForValue(ticks[index].value); + } + getPixelForDecimal(decimal) { + if (this._reversePixels) { + decimal = 1 - decimal; + } + const pixel = this._startPixel + decimal * this._length; + return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel); + } + getDecimalForPixel(pixel) { + const decimal = (pixel - this._startPixel) / this._length; + return this._reversePixels ? 1 - decimal : decimal; + } + getBasePixel() { + return this.getPixelForValue(this.getBaseValue()); + } + getBaseValue() { + const { min, max } = this; + return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0; + } + getContext(index) { + const ticks = this.ticks || []; + if (index >= 0 && index < ticks.length) { + const tick = ticks[index]; + return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick)); + } + return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this)); + } + _tickSize() { + const optionTicks = this.options.ticks; + const rot = toRadians(this.labelRotation); + const cos = Math.abs(Math.cos(rot)); + const sin = Math.abs(Math.sin(rot)); + const labelSizes = this._getLabelSizes(); + const padding = optionTicks.autoSkipPadding || 0; + const w = labelSizes ? labelSizes.widest.width + padding : 0; + const h4 = labelSizes ? labelSizes.highest.height + padding : 0; + return this.isHorizontal() ? h4 * cos > w * sin ? w / cos : h4 / sin : h4 * sin < w * cos ? h4 / cos : w / sin; + } + _isVisible() { + const display = this.options.display; + if (display !== "auto") { + return !!display; + } + return this.getMatchingVisibleMetas().length > 0; + } + _computeGridLineItems(chartArea) { + const axis = this.axis; + const chart = this.chart; + const options = this.options; + const { grid, position, border } = options; + const offset = grid.offset; + const isHorizontal = this.isHorizontal(); + const ticks = this.ticks; + const ticksLength = ticks.length + (offset ? 1 : 0); + const tl = getTickMarkLength(grid); + const items = []; + const borderOpts = border.setContext(this.getContext()); + const axisWidth = borderOpts.display ? borderOpts.width : 0; + const axisHalfWidth = axisWidth / 2; + const alignBorderValue = function(pixel) { + return _alignPixel(chart, pixel, axisWidth); + }; + let borderValue, i, lineValue, alignedLineValue; + let tx1, ty1, tx2, ty2, x1, y1, x2, y2; + if (position === "top") { + borderValue = alignBorderValue(this.bottom); + ty1 = this.bottom - tl; + ty2 = borderValue - axisHalfWidth; + y1 = alignBorderValue(chartArea.top) + axisHalfWidth; + y2 = chartArea.bottom; + } else if (position === "bottom") { + borderValue = alignBorderValue(this.top); + y1 = chartArea.top; + y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth; + ty1 = borderValue + axisHalfWidth; + ty2 = this.top + tl; + } else if (position === "left") { + borderValue = alignBorderValue(this.right); + tx1 = this.right - tl; + tx2 = borderValue - axisHalfWidth; + x1 = alignBorderValue(chartArea.left) + axisHalfWidth; + x2 = chartArea.right; + } else if (position === "right") { + borderValue = alignBorderValue(this.left); + x1 = chartArea.left; + x2 = alignBorderValue(chartArea.right) - axisHalfWidth; + tx1 = borderValue + axisHalfWidth; + tx2 = this.left + tl; + } else if (axis === "x") { + if (position === "center") { + borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5); + } else if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value)); + } + y1 = chartArea.top; + y2 = chartArea.bottom; + ty1 = borderValue + axisHalfWidth; + ty2 = ty1 + tl; + } else if (axis === "y") { + if (position === "center") { + borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2); + } else if (isObject(position)) { + const positionAxisID1 = Object.keys(position)[0]; + const value1 = position[positionAxisID1]; + borderValue = alignBorderValue(this.chart.scales[positionAxisID1].getPixelForValue(value1)); + } + tx1 = borderValue - axisHalfWidth; + tx2 = tx1 - tl; + x1 = chartArea.left; + x2 = chartArea.right; + } + const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength); + const step = Math.max(1, Math.ceil(ticksLength / limit)); + for (i = 0; i < ticksLength; i += step) { + const context = this.getContext(i); + const optsAtIndex = grid.setContext(context); + const optsAtIndexBorder = border.setContext(context); + const lineWidth = optsAtIndex.lineWidth; + const lineColor = optsAtIndex.color; + const borderDash = optsAtIndexBorder.dash || []; + const borderDashOffset = optsAtIndexBorder.dashOffset; + const tickWidth = optsAtIndex.tickWidth; + const tickColor = optsAtIndex.tickColor; + const tickBorderDash = optsAtIndex.tickBorderDash || []; + const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset; + lineValue = getPixelForGridLine(this, i, offset); + if (lineValue === void 0) { + continue; + } + alignedLineValue = _alignPixel(chart, lineValue, lineWidth); + if (isHorizontal) { + tx1 = tx2 = x1 = x2 = alignedLineValue; + } else { + ty1 = ty2 = y1 = y2 = alignedLineValue; + } + items.push({ + tx1, + ty1, + tx2, + ty2, + x1, + y1, + x2, + y2, + width: lineWidth, + color: lineColor, + borderDash, + borderDashOffset, + tickWidth, + tickColor, + tickBorderDash, + tickBorderDashOffset + }); + } + this._ticksLength = ticksLength; + this._borderValue = borderValue; + return items; + } + _computeLabelItems(chartArea) { + const axis = this.axis; + const options = this.options; + const { position, ticks: optionTicks } = options; + const isHorizontal = this.isHorizontal(); + const ticks = this.ticks; + const { align, crossAlign, padding, mirror } = optionTicks; + const tl = getTickMarkLength(options.grid); + const tickAndPadding = tl + padding; + const hTickAndPadding = mirror ? -padding : tickAndPadding; + const rotation = -toRadians(this.labelRotation); + const items = []; + let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset; + let textBaseline = "middle"; + if (position === "top") { + y = this.bottom - hTickAndPadding; + textAlign = this._getXAxisLabelAlignment(); + } else if (position === "bottom") { + y = this.top + hTickAndPadding; + textAlign = this._getXAxisLabelAlignment(); + } else if (position === "left") { + const ret = this._getYAxisLabelAlignment(tl); + textAlign = ret.textAlign; + x = ret.x; + } else if (position === "right") { + const ret1 = this._getYAxisLabelAlignment(tl); + textAlign = ret1.textAlign; + x = ret1.x; + } else if (axis === "x") { + if (position === "center") { + y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding; + } else if (isObject(position)) { + const positionAxisID = Object.keys(position)[0]; + const value = position[positionAxisID]; + y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding; + } + textAlign = this._getXAxisLabelAlignment(); + } else if (axis === "y") { + if (position === "center") { + x = (chartArea.left + chartArea.right) / 2 - tickAndPadding; + } else if (isObject(position)) { + const positionAxisID1 = Object.keys(position)[0]; + const value1 = position[positionAxisID1]; + x = this.chart.scales[positionAxisID1].getPixelForValue(value1); + } + textAlign = this._getYAxisLabelAlignment(tl).textAlign; + } + if (axis === "y") { + if (align === "start") { + textBaseline = "top"; + } else if (align === "end") { + textBaseline = "bottom"; + } + } + const labelSizes = this._getLabelSizes(); + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + tick = ticks[i]; + label = tick.label; + const optsAtIndex = optionTicks.setContext(this.getContext(i)); + pixel = this.getPixelForTick(i) + optionTicks.labelOffset; + font = this._resolveTickFontOptions(i); + lineHeight = font.lineHeight; + lineCount = isArray(label) ? label.length : 1; + const halfCount = lineCount / 2; + const color2 = optsAtIndex.color; + const strokeColor = optsAtIndex.textStrokeColor; + const strokeWidth = optsAtIndex.textStrokeWidth; + let tickTextAlign = textAlign; + if (isHorizontal) { + x = pixel; + if (textAlign === "inner") { + if (i === ilen - 1) { + tickTextAlign = !this.options.reverse ? "right" : "left"; + } else if (i === 0) { + tickTextAlign = !this.options.reverse ? "left" : "right"; + } else { + tickTextAlign = "center"; + } + } + if (position === "top") { + if (crossAlign === "near" || rotation !== 0) { + textOffset = -lineCount * lineHeight + lineHeight / 2; + } else if (crossAlign === "center") { + textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight; + } else { + textOffset = -labelSizes.highest.height + lineHeight / 2; + } + } else { + if (crossAlign === "near" || rotation !== 0) { + textOffset = lineHeight / 2; + } else if (crossAlign === "center") { + textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight; + } else { + textOffset = labelSizes.highest.height - lineCount * lineHeight; + } + } + if (mirror) { + textOffset *= -1; + } + if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) { + x += lineHeight / 2 * Math.sin(rotation); + } + } else { + y = pixel; + textOffset = (1 - lineCount) * lineHeight / 2; + } + let backdrop; + if (optsAtIndex.showLabelBackdrop) { + const labelPadding = toPadding(optsAtIndex.backdropPadding); + const height = labelSizes.heights[i]; + const width = labelSizes.widths[i]; + let top = textOffset - labelPadding.top; + let left = 0 - labelPadding.left; + switch (textBaseline) { + case "middle": + top -= height / 2; + break; + case "bottom": + top -= height; + break; + } + switch (textAlign) { + case "center": + left -= width / 2; + break; + case "right": + left -= width; + break; + } + backdrop = { + left, + top, + width: width + labelPadding.width, + height: height + labelPadding.height, + color: optsAtIndex.backdropColor + }; + } + items.push({ + label, + font, + textOffset, + options: { + rotation, + color: color2, + strokeColor, + strokeWidth, + textAlign: tickTextAlign, + textBaseline, + translation: [ + x, + y + ], + backdrop + } + }); + } + return items; + } + _getXAxisLabelAlignment() { + const { position, ticks } = this.options; + const rotation = -toRadians(this.labelRotation); + if (rotation) { + return position === "top" ? "left" : "right"; + } + let align = "center"; + if (ticks.align === "start") { + align = "left"; + } else if (ticks.align === "end") { + align = "right"; + } else if (ticks.align === "inner") { + align = "inner"; + } + return align; + } + _getYAxisLabelAlignment(tl) { + const { position, ticks: { crossAlign, mirror, padding } } = this.options; + const labelSizes = this._getLabelSizes(); + const tickAndPadding = tl + padding; + const widest = labelSizes.widest.width; + let textAlign; + let x; + if (position === "left") { + if (mirror) { + x = this.right + padding; + if (crossAlign === "near") { + textAlign = "left"; + } else if (crossAlign === "center") { + textAlign = "center"; + x += widest / 2; + } else { + textAlign = "right"; + x += widest; + } + } else { + x = this.right - tickAndPadding; + if (crossAlign === "near") { + textAlign = "right"; + } else if (crossAlign === "center") { + textAlign = "center"; + x -= widest / 2; + } else { + textAlign = "left"; + x = this.left; + } + } + } else if (position === "right") { + if (mirror) { + x = this.left + padding; + if (crossAlign === "near") { + textAlign = "right"; + } else if (crossAlign === "center") { + textAlign = "center"; + x -= widest / 2; + } else { + textAlign = "left"; + x -= widest; + } + } else { + x = this.left + tickAndPadding; + if (crossAlign === "near") { + textAlign = "left"; + } else if (crossAlign === "center") { + textAlign = "center"; + x += widest / 2; + } else { + textAlign = "right"; + x = this.right; + } + } + } else { + textAlign = "right"; + } + return { + textAlign, + x + }; + } + _computeLabelArea() { + if (this.options.ticks.mirror) { + return; + } + const chart = this.chart; + const position = this.options.position; + if (position === "left" || position === "right") { + return { + top: 0, + left: this.left, + bottom: chart.height, + right: this.right + }; + } + if (position === "top" || position === "bottom") { + return { + top: this.top, + left: 0, + bottom: this.bottom, + right: chart.width + }; + } + } + drawBackground() { + const { ctx, options: { backgroundColor }, left, top, width, height } = this; + if (backgroundColor) { + ctx.save(); + ctx.fillStyle = backgroundColor; + ctx.fillRect(left, top, width, height); + ctx.restore(); + } + } + getLineWidthForValue(value) { + const grid = this.options.grid; + if (!this._isVisible() || !grid.display) { + return 0; + } + const ticks = this.ticks; + const index = ticks.findIndex((t2) => t2.value === value); + if (index >= 0) { + const opts = grid.setContext(this.getContext(index)); + return opts.lineWidth; + } + return 0; + } + drawGrid(chartArea) { + const grid = this.options.grid; + const ctx = this.ctx; + const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea)); + let i, ilen; + const drawLine = (p1, p2, style) => { + if (!style.width || !style.color) { + return; + } + ctx.save(); + ctx.lineWidth = style.width; + ctx.strokeStyle = style.color; + ctx.setLineDash(style.borderDash || []); + ctx.lineDashOffset = style.borderDashOffset; + ctx.beginPath(); + ctx.moveTo(p1.x, p1.y); + ctx.lineTo(p2.x, p2.y); + ctx.stroke(); + ctx.restore(); + }; + if (grid.display) { + for (i = 0, ilen = items.length; i < ilen; ++i) { + const item = items[i]; + if (grid.drawOnChartArea) { + drawLine({ + x: item.x1, + y: item.y1 + }, { + x: item.x2, + y: item.y2 + }, item); + } + if (grid.drawTicks) { + drawLine({ + x: item.tx1, + y: item.ty1 + }, { + x: item.tx2, + y: item.ty2 + }, { + color: item.tickColor, + width: item.tickWidth, + borderDash: item.tickBorderDash, + borderDashOffset: item.tickBorderDashOffset + }); + } + } + } + } + drawBorder() { + const { chart, ctx, options: { border, grid } } = this; + const borderOpts = border.setContext(this.getContext()); + const axisWidth = border.display ? borderOpts.width : 0; + if (!axisWidth) { + return; + } + const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth; + const borderValue = this._borderValue; + let x1, x2, y1, y2; + if (this.isHorizontal()) { + x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2; + x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2; + y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + ctx.save(); + ctx.lineWidth = borderOpts.width; + ctx.strokeStyle = borderOpts.color; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + ctx.restore(); + } + drawLabels(chartArea) { + const optionTicks = this.options.ticks; + if (!optionTicks.display) { + return; + } + const ctx = this.ctx; + const area = this._computeLabelArea(); + if (area) { + clipArea(ctx, area); + } + const items = this.getLabelItems(chartArea); + for (const item of items) { + const renderTextOptions = item.options; + const tickFont = item.font; + const label = item.label; + const y = item.textOffset; + renderText(ctx, label, 0, y, tickFont, renderTextOptions); + } + if (area) { + unclipArea(ctx); + } + } + drawTitle() { + const { ctx, options: { position, title, reverse } } = this; + if (!title.display) { + return; + } + const font = toFont(title.font); + const padding = toPadding(title.padding); + const align = title.align; + let offset = font.lineHeight / 2; + if (position === "bottom" || position === "center" || isObject(position)) { + offset += padding.bottom; + if (isArray(title.text)) { + offset += font.lineHeight * (title.text.length - 1); + } + } else { + offset += padding.top; + } + const { titleX, titleY, maxWidth, rotation } = titleArgs(this, offset, position, align); + renderText(ctx, title.text, 0, 0, font, { + color: title.color, + maxWidth, + rotation, + textAlign: titleAlign(align, position, reverse), + textBaseline: "middle", + translation: [ + titleX, + titleY + ] + }); + } + draw(chartArea) { + if (!this._isVisible()) { + return; + } + this.drawBackground(); + this.drawGrid(chartArea); + this.drawBorder(); + this.drawTitle(); + this.drawLabels(chartArea); + } + _layers() { + const opts = this.options; + const tz = opts.ticks && opts.ticks.z || 0; + const gz = valueOrDefault(opts.grid && opts.grid.z, -1); + const bz = valueOrDefault(opts.border && opts.border.z, 0); + if (!this._isVisible() || this.draw !== Scale.prototype.draw) { + return [ + { + z: tz, + draw: (chartArea) => { + this.draw(chartArea); + } + } + ]; + } + return [ + { + z: gz, + draw: (chartArea) => { + this.drawBackground(); + this.drawGrid(chartArea); + this.drawTitle(); + } + }, + { + z: bz, + draw: () => { + this.drawBorder(); + } + }, + { + z: tz, + draw: (chartArea) => { + this.drawLabels(chartArea); + } + } + ]; + } + getMatchingVisibleMetas(type) { + const metas = this.chart.getSortedVisibleDatasetMetas(); + const axisID = this.axis + "AxisID"; + const result = []; + let i, ilen; + for (i = 0, ilen = metas.length; i < ilen; ++i) { + const meta = metas[i]; + if (meta[axisID] === this.id && (!type || meta.type === type)) { + result.push(meta); + } + } + return result; + } + _resolveTickFontOptions(index) { + const opts = this.options.ticks.setContext(this.getContext(index)); + return toFont(opts.font); + } + _maxDigits() { + const fontSize = this._resolveTickFontOptions(0).lineHeight; + return (this.isHorizontal() ? this.width : this.height) / fontSize; + } +}; +var TypedRegistry = class { + constructor(type, scope, override) { + this.type = type; + this.scope = scope; + this.override = override; + this.items = /* @__PURE__ */ Object.create(null); + } + isForType(type) { + return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype); + } + register(item) { + const proto = Object.getPrototypeOf(item); + let parentScope; + if (isIChartComponent(proto)) { + parentScope = this.register(proto); + } + const items = this.items; + const id = item.id; + const scope = this.scope + "." + id; + if (!id) { + throw new Error("class does not have id: " + item); + } + if (id in items) { + return scope; + } + items[id] = item; + registerDefaults(item, scope, parentScope); + if (this.override) { + defaults.override(item.id, item.overrides); + } + return scope; + } + get(id) { + return this.items[id]; + } + unregister(item) { + const items = this.items; + const id = item.id; + const scope = this.scope; + if (id in items) { + delete items[id]; + } + if (scope && id in defaults[scope]) { + delete defaults[scope][id]; + if (this.override) { + delete overrides[id]; + } + } + } +}; +function registerDefaults(item, scope, parentScope) { + const itemDefaults = merge(/* @__PURE__ */ Object.create(null), [ + parentScope ? defaults.get(parentScope) : {}, + defaults.get(scope), + item.defaults + ]); + defaults.set(scope, itemDefaults); + if (item.defaultRoutes) { + routeDefaults(scope, item.defaultRoutes); + } + if (item.descriptors) { + defaults.describe(scope, item.descriptors); + } +} +function routeDefaults(scope, routes) { + Object.keys(routes).forEach((property) => { + const propertyParts = property.split("."); + const sourceName = propertyParts.pop(); + const sourceScope = [ + scope + ].concat(propertyParts).join("."); + const parts = routes[property].split("."); + const targetName = parts.pop(); + const targetScope = parts.join("."); + defaults.route(sourceScope, sourceName, targetScope, targetName); + }); +} +function isIChartComponent(proto) { + return "id" in proto && "defaults" in proto; +} +var Registry = class { + constructor() { + this.controllers = new TypedRegistry(DatasetController, "datasets", true); + this.elements = new TypedRegistry(Element, "elements"); + this.plugins = new TypedRegistry(Object, "plugins"); + this.scales = new TypedRegistry(Scale, "scales"); + this._typedRegistries = [ + this.controllers, + this.scales, + this.elements + ]; + } + add(...args) { + this._each("register", args); + } + remove(...args) { + this._each("unregister", args); + } + addControllers(...args) { + this._each("register", args, this.controllers); + } + addElements(...args) { + this._each("register", args, this.elements); + } + addPlugins(...args) { + this._each("register", args, this.plugins); + } + addScales(...args) { + this._each("register", args, this.scales); + } + getController(id) { + return this._get(id, this.controllers, "controller"); + } + getElement(id) { + return this._get(id, this.elements, "element"); + } + getPlugin(id) { + return this._get(id, this.plugins, "plugin"); + } + getScale(id) { + return this._get(id, this.scales, "scale"); + } + removeControllers(...args) { + this._each("unregister", args, this.controllers); + } + removeElements(...args) { + this._each("unregister", args, this.elements); + } + removePlugins(...args) { + this._each("unregister", args, this.plugins); + } + removeScales(...args) { + this._each("unregister", args, this.scales); + } + _each(method, args, typedRegistry) { + [ + ...args + ].forEach((arg) => { + const reg = typedRegistry || this._getRegistryForType(arg); + if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) { + this._exec(method, reg, arg); + } else { + each(arg, (item) => { + const itemReg = typedRegistry || this._getRegistryForType(item); + this._exec(method, itemReg, item); + }); + } + }); + } + _exec(method, registry2, component) { + const camelMethod = _capitalize(method); + callback(component["before" + camelMethod], [], component); + registry2[method](component); + callback(component["after" + camelMethod], [], component); + } + _getRegistryForType(type) { + for (let i = 0; i < this._typedRegistries.length; i++) { + const reg = this._typedRegistries[i]; + if (reg.isForType(type)) { + return reg; + } + } + return this.plugins; + } + _get(id, typedRegistry, type) { + const item = typedRegistry.get(id); + if (item === void 0) { + throw new Error('"' + id + '" is not a registered ' + type + "."); + } + return item; + } +}; +var registry = /* @__PURE__ */ new Registry(); +var PluginService = class { + constructor() { + this._init = []; + } + notify(chart, hook, args, filter) { + if (hook === "beforeInit") { + this._init = this._createDescriptors(chart, true); + this._notify(this._init, chart, "install"); + } + const descriptors2 = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart); + const result = this._notify(descriptors2, chart, hook, args); + if (hook === "afterDestroy") { + this._notify(descriptors2, chart, "stop"); + this._notify(this._init, chart, "uninstall"); + } + return result; + } + _notify(descriptors2, chart, hook, args) { + args = args || {}; + for (const descriptor of descriptors2) { + const plugin = descriptor.plugin; + const method = plugin[hook]; + const params = [ + chart, + args, + descriptor.options + ]; + if (callback(method, params, plugin) === false && args.cancelable) { + return false; + } + } + return true; + } + invalidate() { + if (!isNullOrUndef(this._cache)) { + this._oldCache = this._cache; + this._cache = void 0; + } + } + _descriptors(chart) { + if (this._cache) { + return this._cache; + } + const descriptors2 = this._cache = this._createDescriptors(chart); + this._notifyStateChanges(chart); + return descriptors2; + } + _createDescriptors(chart, all) { + const config = chart && chart.config; + const options = valueOrDefault(config.options && config.options.plugins, {}); + const plugins = allPlugins(config); + return options === false && !all ? [] : createDescriptors(chart, plugins, options, all); + } + _notifyStateChanges(chart) { + const previousDescriptors = this._oldCache || []; + const descriptors2 = this._cache; + const diff = (a, b) => a.filter((x) => !b.some((y) => x.plugin.id === y.plugin.id)); + this._notify(diff(previousDescriptors, descriptors2), chart, "stop"); + this._notify(diff(descriptors2, previousDescriptors), chart, "start"); + } +}; +function allPlugins(config) { + const localIds = {}; + const plugins = []; + const keys = Object.keys(registry.plugins.items); + for (let i = 0; i < keys.length; i++) { + plugins.push(registry.getPlugin(keys[i])); + } + const local = config.plugins || []; + for (let i1 = 0; i1 < local.length; i1++) { + const plugin = local[i1]; + if (plugins.indexOf(plugin) === -1) { + plugins.push(plugin); + localIds[plugin.id] = true; + } + } + return { + plugins, + localIds + }; +} +function getOpts(options, all) { + if (!all && options === false) { + return null; + } + if (options === true) { + return {}; + } + return options; +} +function createDescriptors(chart, { plugins, localIds }, options, all) { + const result = []; + const context = chart.getContext(); + for (const plugin of plugins) { + const id = plugin.id; + const opts = getOpts(options[id], all); + if (opts === null) { + continue; + } + result.push({ + plugin, + options: pluginOpts(chart.config, { + plugin, + local: localIds[id] + }, opts, context) + }); + } + return result; +} +function pluginOpts(config, { plugin, local }, opts, context) { + const keys = config.pluginScopeKeys(plugin); + const scopes = config.getOptionScopes(opts, keys); + if (local && plugin.defaults) { + scopes.push(plugin.defaults); + } + return config.createResolver(scopes, context, [ + "" + ], { + scriptable: false, + indexable: false, + allKeys: true + }); +} +function getIndexAxis(type, options) { + const datasetDefaults = defaults.datasets[type] || {}; + const datasetOptions = (options.datasets || {})[type] || {}; + return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || "x"; +} +function getAxisFromDefaultScaleID(id, indexAxis) { + let axis = id; + if (id === "_index_") { + axis = indexAxis; + } else if (id === "_value_") { + axis = indexAxis === "x" ? "y" : "x"; + } + return axis; +} +function getDefaultScaleIDFromAxis(axis, indexAxis) { + return axis === indexAxis ? "_index_" : "_value_"; +} +function axisFromPosition(position) { + if (position === "top" || position === "bottom") { + return "x"; + } + if (position === "left" || position === "right") { + return "y"; + } +} +function determineAxis(id, scaleOptions) { + if (id === "x" || id === "y" || id === "r") { + return id; + } + id = scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.length > 1 && determineAxis(id[0].toLowerCase(), scaleOptions); + if (id) { + return id; + } + throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`); +} +function mergeScaleConfig(config, options) { + const chartDefaults = overrides[config.type] || { + scales: {} + }; + const configScales = options.scales || {}; + const chartIndexAxis = getIndexAxis(config.type, options); + const scales = /* @__PURE__ */ Object.create(null); + Object.keys(configScales).forEach((id) => { + const scaleConf = configScales[id]; + if (!isObject(scaleConf)) { + return console.error(`Invalid scale configuration for scale: ${id}`); + } + if (scaleConf._proxy) { + return console.warn(`Ignoring resolver passed as options for scale: ${id}`); + } + const axis = determineAxis(id, scaleConf); + const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis); + const defaultScaleOptions = chartDefaults.scales || {}; + scales[id] = mergeIf(/* @__PURE__ */ Object.create(null), [ + { + axis + }, + scaleConf, + defaultScaleOptions[axis], + defaultScaleOptions[defaultId] + ]); + }); + config.data.datasets.forEach((dataset) => { + const type = dataset.type || config.type; + const indexAxis = dataset.indexAxis || getIndexAxis(type, options); + const datasetDefaults = overrides[type] || {}; + const defaultScaleOptions = datasetDefaults.scales || {}; + Object.keys(defaultScaleOptions).forEach((defaultID) => { + const axis = getAxisFromDefaultScaleID(defaultID, indexAxis); + const id = dataset[axis + "AxisID"] || axis; + scales[id] = scales[id] || /* @__PURE__ */ Object.create(null); + mergeIf(scales[id], [ + { + axis + }, + configScales[id], + defaultScaleOptions[defaultID] + ]); + }); + }); + Object.keys(scales).forEach((key) => { + const scale = scales[key]; + mergeIf(scale, [ + defaults.scales[scale.type], + defaults.scale + ]); + }); + return scales; +} +function initOptions(config) { + const options = config.options || (config.options = {}); + options.plugins = valueOrDefault(options.plugins, {}); + options.scales = mergeScaleConfig(config, options); +} +function initData(data) { + data = data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; + return data; +} +function initConfig(config) { + config = config || {}; + config.data = initData(config.data); + initOptions(config); + return config; +} +var keyCache = /* @__PURE__ */ new Map(); +var keysCached = /* @__PURE__ */ new Set(); +function cachedKeys(cacheKey, generate) { + let keys = keyCache.get(cacheKey); + if (!keys) { + keys = generate(); + keyCache.set(cacheKey, keys); + keysCached.add(keys); + } + return keys; +} +var addIfFound = (set2, obj, key) => { + const opts = resolveObjectKey(obj, key); + if (opts !== void 0) { + set2.add(opts); + } +}; +var Config = class { + constructor(config) { + this._config = initConfig(config); + this._scopeCache = /* @__PURE__ */ new Map(); + this._resolverCache = /* @__PURE__ */ new Map(); + } + get platform() { + return this._config.platform; + } + get type() { + return this._config.type; + } + set type(type) { + this._config.type = type; + } + get data() { + return this._config.data; + } + set data(data) { + this._config.data = initData(data); + } + get options() { + return this._config.options; + } + set options(options) { + this._config.options = options; + } + get plugins() { + return this._config.plugins; + } + update() { + const config = this._config; + this.clearCache(); + initOptions(config); + } + clearCache() { + this._scopeCache.clear(); + this._resolverCache.clear(); + } + datasetScopeKeys(datasetType) { + return cachedKeys(datasetType, () => [ + [ + `datasets.${datasetType}`, + "" + ] + ]); + } + datasetAnimationScopeKeys(datasetType, transition) { + return cachedKeys(`${datasetType}.transition.${transition}`, () => [ + [ + `datasets.${datasetType}.transitions.${transition}`, + `transitions.${transition}` + ], + [ + `datasets.${datasetType}`, + "" + ] + ]); + } + datasetElementScopeKeys(datasetType, elementType) { + return cachedKeys(`${datasetType}-${elementType}`, () => [ + [ + `datasets.${datasetType}.elements.${elementType}`, + `datasets.${datasetType}`, + `elements.${elementType}`, + "" + ] + ]); + } + pluginScopeKeys(plugin) { + const id = plugin.id; + const type = this.type; + return cachedKeys(`${type}-plugin-${id}`, () => [ + [ + `plugins.${id}`, + ...plugin.additionalOptionScopes || [] + ] + ]); + } + _cachedScopes(mainScope, resetCache) { + const _scopeCache = this._scopeCache; + let cache = _scopeCache.get(mainScope); + if (!cache || resetCache) { + cache = /* @__PURE__ */ new Map(); + _scopeCache.set(mainScope, cache); + } + return cache; + } + getOptionScopes(mainScope, keyLists, resetCache) { + const { options, type } = this; + const cache = this._cachedScopes(mainScope, resetCache); + const cached = cache.get(keyLists); + if (cached) { + return cached; + } + const scopes = /* @__PURE__ */ new Set(); + keyLists.forEach((keys) => { + if (mainScope) { + scopes.add(mainScope); + keys.forEach((key) => addIfFound(scopes, mainScope, key)); + } + keys.forEach((key) => addIfFound(scopes, options, key)); + keys.forEach((key) => addIfFound(scopes, overrides[type] || {}, key)); + keys.forEach((key) => addIfFound(scopes, defaults, key)); + keys.forEach((key) => addIfFound(scopes, descriptors, key)); + }); + const array = Array.from(scopes); + if (array.length === 0) { + array.push(/* @__PURE__ */ Object.create(null)); + } + if (keysCached.has(keyLists)) { + cache.set(keyLists, array); + } + return array; + } + chartOptionScopes() { + const { options, type } = this; + return [ + options, + overrides[type] || {}, + defaults.datasets[type] || {}, + { + type + }, + defaults, + descriptors + ]; + } + resolveNamedOptions(scopes, names2, context, prefixes = [ + "" + ]) { + const result = { + $shared: true + }; + const { resolver, subPrefixes } = getResolver(this._resolverCache, scopes, prefixes); + let options = resolver; + if (needContext(resolver, names2)) { + result.$shared = false; + context = isFunction(context) ? context() : context; + const subResolver = this.createResolver(scopes, context, subPrefixes); + options = _attachContext(resolver, context, subResolver); + } + for (const prop of names2) { + result[prop] = options[prop]; + } + return result; + } + createResolver(scopes, context, prefixes = [ + "" + ], descriptorDefaults) { + const { resolver } = getResolver(this._resolverCache, scopes, prefixes); + return isObject(context) ? _attachContext(resolver, context, void 0, descriptorDefaults) : resolver; + } +}; +function getResolver(resolverCache, scopes, prefixes) { + let cache = resolverCache.get(scopes); + if (!cache) { + cache = /* @__PURE__ */ new Map(); + resolverCache.set(scopes, cache); + } + const cacheKey = prefixes.join(); + let cached = cache.get(cacheKey); + if (!cached) { + const resolver = _createResolver(scopes, prefixes); + cached = { + resolver, + subPrefixes: prefixes.filter((p) => !p.toLowerCase().includes("hover")) + }; + cache.set(cacheKey, cached); + } + return cached; +} +var hasFunction = (value) => isObject(value) && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false); +function needContext(proxy, names2) { + const { isScriptable, isIndexable } = _descriptors(proxy); + for (const prop of names2) { + const scriptable = isScriptable(prop); + const indexable = isIndexable(prop); + const value = (indexable || scriptable) && proxy[prop]; + if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) { + return true; + } + } + return false; +} +var version = "4.2.1"; +var KNOWN_POSITIONS = [ + "top", + "bottom", + "left", + "right", + "chartArea" +]; +function positionIsHorizontal(position, axis) { + return position === "top" || position === "bottom" || KNOWN_POSITIONS.indexOf(position) === -1 && axis === "x"; +} +function compare2Level(l1, l2) { + return function(a, b) { + return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1]; + }; +} +function onAnimationsComplete(context) { + const chart = context.chart; + const animationOptions = chart.options.animation; + chart.notifyPlugins("afterRender"); + callback(animationOptions && animationOptions.onComplete, [ + context + ], chart); +} +function onAnimationProgress(context) { + const chart = context.chart; + const animationOptions = chart.options.animation; + callback(animationOptions && animationOptions.onProgress, [ + context + ], chart); +} +function getCanvas(item) { + if (_isDomSupported() && typeof item === "string") { + item = document.getElementById(item); + } else if (item && item.length) { + item = item[0]; + } + if (item && item.canvas) { + item = item.canvas; + } + return item; +} +var instances = {}; +var getChart = (key) => { + const canvas = getCanvas(key); + return Object.values(instances).filter((c) => c.canvas === canvas).pop(); +}; +function moveNumericKeys(obj, start, move) { + const keys = Object.keys(obj); + for (const key of keys) { + const intKey = +key; + if (intKey >= start) { + const value = obj[key]; + delete obj[key]; + if (move > 0 || intKey > start) { + obj[intKey + move] = value; + } + } + } +} +function determineLastEvent(e, lastEvent, inChartArea, isClick) { + if (!inChartArea || e.type === "mouseout") { + return null; + } + if (isClick) { + return lastEvent; + } + return e; +} +function getDatasetArea(meta) { + const { xScale, yScale } = meta; + if (xScale && yScale) { + return { + left: xScale.left, + right: xScale.right, + top: yScale.top, + bottom: yScale.bottom + }; + } +} +var Chart = class { + static register(...items) { + registry.add(...items); + invalidatePlugins(); + } + static unregister(...items) { + registry.remove(...items); + invalidatePlugins(); + } + constructor(item, userConfig) { + const config = this.config = new Config(userConfig); + const initialCanvas = getCanvas(item); + const existingChart = getChart(initialCanvas); + if (existingChart) { + throw new Error("Canvas is already in use. Chart with ID '" + existingChart.id + "' must be destroyed before the canvas with ID '" + existingChart.canvas.id + "' can be reused."); + } + const options = config.createResolver(config.chartOptionScopes(), this.getContext()); + this.platform = new (config.platform || _detectPlatform(initialCanvas))(); + this.platform.updateConfig(config); + const context = this.platform.acquireContext(initialCanvas, options.aspectRatio); + const canvas = context && context.canvas; + const height = canvas && canvas.height; + const width = canvas && canvas.width; + this.id = uid(); + this.ctx = context; + this.canvas = canvas; + this.width = width; + this.height = height; + this._options = options; + this._aspectRatio = this.aspectRatio; + this._layers = []; + this._metasets = []; + this._stacks = void 0; + this.boxes = []; + this.currentDevicePixelRatio = void 0; + this.chartArea = void 0; + this._active = []; + this._lastEvent = void 0; + this._listeners = {}; + this._responsiveListeners = void 0; + this._sortedMetasets = []; + this.scales = {}; + this._plugins = new PluginService(); + this.$proxies = {}; + this._hiddenIndices = {}; + this.attached = false; + this._animationsDisabled = void 0; + this.$context = void 0; + this._doResize = debounce((mode) => this.update(mode), options.resizeDelay || 0); + this._dataChanges = []; + instances[this.id] = this; + if (!context || !canvas) { + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } + animator.listen(this, "complete", onAnimationsComplete); + animator.listen(this, "progress", onAnimationProgress); + this._initialize(); + if (this.attached) { + this.update(); + } + } + get aspectRatio() { + const { options: { aspectRatio, maintainAspectRatio }, width, height, _aspectRatio } = this; + if (!isNullOrUndef(aspectRatio)) { + return aspectRatio; + } + if (maintainAspectRatio && _aspectRatio) { + return _aspectRatio; + } + return height ? width / height : null; + } + get data() { + return this.config.data; + } + set data(data) { + this.config.data = data; + } + get options() { + return this._options; + } + set options(options) { + this.config.options = options; + } + get registry() { + return registry; + } + _initialize() { + this.notifyPlugins("beforeInit"); + if (this.options.responsive) { + this.resize(); + } else { + retinaScale(this, this.options.devicePixelRatio); + } + this.bindEvents(); + this.notifyPlugins("afterInit"); + return this; + } + clear() { + clearCanvas(this.canvas, this.ctx); + return this; + } + stop() { + animator.stop(this); + return this; + } + resize(width, height) { + if (!animator.running(this)) { + this._resize(width, height); + } else { + this._resizeBeforeDraw = { + width, + height + }; + } + } + _resize(width, height) { + const options = this.options; + const canvas = this.canvas; + const aspectRatio = options.maintainAspectRatio && this.aspectRatio; + const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio); + const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio(); + const mode = this.width ? "resize" : "attach"; + this.width = newSize.width; + this.height = newSize.height; + this._aspectRatio = this.aspectRatio; + if (!retinaScale(this, newRatio, true)) { + return; + } + this.notifyPlugins("resize", { + size: newSize + }); + callback(options.onResize, [ + this, + newSize + ], this); + if (this.attached) { + if (this._doResize(mode)) { + this.render(); + } + } + } + ensureScalesHaveIDs() { + const options = this.options; + const scalesOptions = options.scales || {}; + each(scalesOptions, (axisOptions, axisID) => { + axisOptions.id = axisID; + }); + } + buildOrUpdateScales() { + const options = this.options; + const scaleOpts = options.scales; + const scales = this.scales; + const updated = Object.keys(scales).reduce((obj, id) => { + obj[id] = false; + return obj; + }, {}); + let items = []; + if (scaleOpts) { + items = items.concat(Object.keys(scaleOpts).map((id) => { + const scaleOptions = scaleOpts[id]; + const axis = determineAxis(id, scaleOptions); + const isRadial = axis === "r"; + const isHorizontal = axis === "x"; + return { + options: scaleOptions, + dposition: isRadial ? "chartArea" : isHorizontal ? "bottom" : "left", + dtype: isRadial ? "radialLinear" : isHorizontal ? "category" : "linear" + }; + })); + } + each(items, (item) => { + const scaleOptions = item.options; + const id = scaleOptions.id; + const axis = determineAxis(id, scaleOptions); + const scaleType = valueOrDefault(scaleOptions.type, item.dtype); + if (scaleOptions.position === void 0 || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } + updated[id] = true; + let scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + } else { + const scaleClass = registry.getScale(scaleType); + scale = new scaleClass({ + id, + type: scaleType, + ctx: this.ctx, + chart: this + }); + scales[scale.id] = scale; + } + scale.init(scaleOptions, options); + }); + each(updated, (hasUpdated, id) => { + if (!hasUpdated) { + delete scales[id]; + } + }); + each(scales, (scale) => { + layouts.configure(this, scale, scale.options); + layouts.addBox(this, scale); + }); + } + _updateMetasets() { + const metasets = this._metasets; + const numData = this.data.datasets.length; + const numMeta = metasets.length; + metasets.sort((a, b) => a.index - b.index); + if (numMeta > numData) { + for (let i = numData; i < numMeta; ++i) { + this._destroyDatasetMeta(i); + } + metasets.splice(numData, numMeta - numData); + } + this._sortedMetasets = metasets.slice(0).sort(compare2Level("order", "index")); + } + _removeUnreferencedMetasets() { + const { _metasets: metasets, data: { datasets } } = this; + if (metasets.length > datasets.length) { + delete this._stacks; + } + metasets.forEach((meta, index) => { + if (datasets.filter((x) => x === meta._dataset).length === 0) { + this._destroyDatasetMeta(index); + } + }); + } + buildOrUpdateControllers() { + const newControllers = []; + const datasets = this.data.datasets; + let i, ilen; + this._removeUnreferencedMetasets(); + for (i = 0, ilen = datasets.length; i < ilen; i++) { + const dataset = datasets[i]; + let meta = this.getDatasetMeta(i); + const type = dataset.type || this.config.type; + if (meta.type && meta.type !== type) { + this._destroyDatasetMeta(i); + meta = this.getDatasetMeta(i); + } + meta.type = type; + meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options); + meta.order = dataset.order || 0; + meta.index = i; + meta.label = "" + dataset.label; + meta.visible = this.isDatasetVisible(i); + if (meta.controller) { + meta.controller.updateIndex(i); + meta.controller.linkScales(); + } else { + const ControllerClass = registry.getController(type); + const { datasetElementType, dataElementType } = defaults.datasets[type]; + Object.assign(ControllerClass, { + dataElementType: registry.getElement(dataElementType), + datasetElementType: datasetElementType && registry.getElement(datasetElementType) + }); + meta.controller = new ControllerClass(this, i); + newControllers.push(meta.controller); + } + } + this._updateMetasets(); + return newControllers; + } + _resetElements() { + each(this.data.datasets, (dataset, datasetIndex) => { + this.getDatasetMeta(datasetIndex).controller.reset(); + }, this); + } + reset() { + this._resetElements(); + this.notifyPlugins("reset"); + } + update(mode) { + const config = this.config; + config.update(); + const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext()); + const animsDisabled = this._animationsDisabled = !options.animation; + this._updateScales(); + this._checkEventBindings(); + this._updateHiddenIndices(); + this._plugins.invalidate(); + if (this.notifyPlugins("beforeUpdate", { + mode, + cancelable: true + }) === false) { + return; + } + const newControllers = this.buildOrUpdateControllers(); + this.notifyPlugins("beforeElementsUpdate"); + let minPadding = 0; + for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) { + const { controller } = this.getDatasetMeta(i); + const reset2 = !animsDisabled && newControllers.indexOf(controller) === -1; + controller.buildOrUpdateElements(reset2); + minPadding = Math.max(+controller.getMaxOverflow(), minPadding); + } + minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0; + this._updateLayout(minPadding); + if (!animsDisabled) { + each(newControllers, (controller) => { + controller.reset(); + }); + } + this._updateDatasets(mode); + this.notifyPlugins("afterUpdate", { + mode + }); + this._layers.sort(compare2Level("z", "_idx")); + const { _active, _lastEvent } = this; + if (_lastEvent) { + this._eventHandler(_lastEvent, true); + } else if (_active.length) { + this._updateHoverStyles(_active, _active, true); + } + this.render(); + } + _updateScales() { + each(this.scales, (scale) => { + layouts.removeBox(this, scale); + }); + this.ensureScalesHaveIDs(); + this.buildOrUpdateScales(); + } + _checkEventBindings() { + const options = this.options; + const existingEvents = new Set(Object.keys(this._listeners)); + const newEvents = new Set(options.events); + if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) { + this.unbindEvents(); + this.bindEvents(); + } + } + _updateHiddenIndices() { + const { _hiddenIndices } = this; + const changes = this._getUniformDataChanges() || []; + for (const { method, start, count } of changes) { + const move = method === "_removeElements" ? -count : count; + moveNumericKeys(_hiddenIndices, start, move); + } + } + _getUniformDataChanges() { + const _dataChanges = this._dataChanges; + if (!_dataChanges || !_dataChanges.length) { + return; + } + this._dataChanges = []; + const datasetCount = this.data.datasets.length; + const makeSet = (idx) => new Set(_dataChanges.filter((c) => c[0] === idx).map((c, i) => i + "," + c.splice(1).join(","))); + const changeSet = makeSet(0); + for (let i = 1; i < datasetCount; i++) { + if (!setsEqual(changeSet, makeSet(i))) { + return; + } + } + return Array.from(changeSet).map((c) => c.split(",")).map((a) => ({ + method: a[1], + start: +a[2], + count: +a[3] + })); + } + _updateLayout(minPadding) { + if (this.notifyPlugins("beforeLayout", { + cancelable: true + }) === false) { + return; + } + layouts.update(this, this.width, this.height, minPadding); + const area = this.chartArea; + const noArea = area.width <= 0 || area.height <= 0; + this._layers = []; + each(this.boxes, (box) => { + if (noArea && box.position === "chartArea") { + return; + } + if (box.configure) { + box.configure(); + } + this._layers.push(...box._layers()); + }, this); + this._layers.forEach((item, index) => { + item._idx = index; + }); + this.notifyPlugins("afterLayout"); + } + _updateDatasets(mode) { + if (this.notifyPlugins("beforeDatasetsUpdate", { + mode, + cancelable: true + }) === false) { + return; + } + for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this.getDatasetMeta(i).controller.configure(); + } + for (let i1 = 0, ilen1 = this.data.datasets.length; i1 < ilen1; ++i1) { + this._updateDataset(i1, isFunction(mode) ? mode({ + datasetIndex: i1 + }) : mode); + } + this.notifyPlugins("afterDatasetsUpdate", { + mode + }); + } + _updateDataset(index, mode) { + const meta = this.getDatasetMeta(index); + const args = { + meta, + index, + mode, + cancelable: true + }; + if (this.notifyPlugins("beforeDatasetUpdate", args) === false) { + return; + } + meta.controller._update(mode); + args.cancelable = false; + this.notifyPlugins("afterDatasetUpdate", args); + } + render() { + if (this.notifyPlugins("beforeRender", { + cancelable: true + }) === false) { + return; + } + if (animator.has(this)) { + if (this.attached && !animator.running(this)) { + animator.start(this); + } + } else { + this.draw(); + onAnimationsComplete({ + chart: this + }); + } + } + draw() { + let i; + if (this._resizeBeforeDraw) { + const { width, height } = this._resizeBeforeDraw; + this._resize(width, height); + this._resizeBeforeDraw = null; + } + this.clear(); + if (this.width <= 0 || this.height <= 0) { + return; + } + if (this.notifyPlugins("beforeDraw", { + cancelable: true + }) === false) { + return; + } + const layers = this._layers; + for (i = 0; i < layers.length && layers[i].z <= 0; ++i) { + layers[i].draw(this.chartArea); + } + this._drawDatasets(); + for (; i < layers.length; ++i) { + layers[i].draw(this.chartArea); + } + this.notifyPlugins("afterDraw"); + } + _getSortedDatasetMetas(filterVisible) { + const metasets = this._sortedMetasets; + const result = []; + let i, ilen; + for (i = 0, ilen = metasets.length; i < ilen; ++i) { + const meta = metasets[i]; + if (!filterVisible || meta.visible) { + result.push(meta); + } + } + return result; + } + getSortedVisibleDatasetMetas() { + return this._getSortedDatasetMetas(true); + } + _drawDatasets() { + if (this.notifyPlugins("beforeDatasetsDraw", { + cancelable: true + }) === false) { + return; + } + const metasets = this.getSortedVisibleDatasetMetas(); + for (let i = metasets.length - 1; i >= 0; --i) { + this._drawDataset(metasets[i]); + } + this.notifyPlugins("afterDatasetsDraw"); + } + _drawDataset(meta) { + const ctx = this.ctx; + const clip = meta._clip; + const useClip = !clip.disabled; + const area = getDatasetArea(meta) || this.chartArea; + const args = { + meta, + index: meta.index, + cancelable: true + }; + if (this.notifyPlugins("beforeDatasetDraw", args) === false) { + return; + } + if (useClip) { + clipArea(ctx, { + left: clip.left === false ? 0 : area.left - clip.left, + right: clip.right === false ? this.width : area.right + clip.right, + top: clip.top === false ? 0 : area.top - clip.top, + bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom + }); + } + meta.controller.draw(); + if (useClip) { + unclipArea(ctx); + } + args.cancelable = false; + this.notifyPlugins("afterDatasetDraw", args); + } + isPointInArea(point) { + return _isPointInArea(point, this.chartArea, this._minPadding); + } + getElementsAtEventForMode(e, mode, options, useFinalPosition) { + const method = Interaction.modes[mode]; + if (typeof method === "function") { + return method(this, e, options, useFinalPosition); + } + return []; + } + getDatasetMeta(datasetIndex) { + const dataset = this.data.datasets[datasetIndex]; + const metasets = this._metasets; + let meta = metasets.filter((x) => x && x._dataset === dataset).pop(); + if (!meta) { + meta = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, + xAxisID: null, + yAxisID: null, + order: dataset && dataset.order || 0, + index: datasetIndex, + _dataset: dataset, + _parsed: [], + _sorted: false + }; + metasets.push(meta); + } + return meta; + } + getContext() { + return this.$context || (this.$context = createContext(null, { + chart: this, + type: "chart" + })); + } + getVisibleDatasetCount() { + return this.getSortedVisibleDatasetMetas().length; + } + isDatasetVisible(datasetIndex) { + const dataset = this.data.datasets[datasetIndex]; + if (!dataset) { + return false; + } + const meta = this.getDatasetMeta(datasetIndex); + return typeof meta.hidden === "boolean" ? !meta.hidden : !dataset.hidden; + } + setDatasetVisibility(datasetIndex, visible) { + const meta = this.getDatasetMeta(datasetIndex); + meta.hidden = !visible; + } + toggleDataVisibility(index) { + this._hiddenIndices[index] = !this._hiddenIndices[index]; + } + getDataVisibility(index) { + return !this._hiddenIndices[index]; + } + _updateVisibility(datasetIndex, dataIndex, visible) { + const mode = visible ? "show" : "hide"; + const meta = this.getDatasetMeta(datasetIndex); + const anims = meta.controller._resolveAnimations(void 0, mode); + if (defined(dataIndex)) { + meta.data[dataIndex].hidden = !visible; + this.update(); + } else { + this.setDatasetVisibility(datasetIndex, visible); + anims.update(meta, { + visible + }); + this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : void 0); + } + } + hide(datasetIndex, dataIndex) { + this._updateVisibility(datasetIndex, dataIndex, false); + } + show(datasetIndex, dataIndex) { + this._updateVisibility(datasetIndex, dataIndex, true); + } + _destroyDatasetMeta(datasetIndex) { + const meta = this._metasets[datasetIndex]; + if (meta && meta.controller) { + meta.controller._destroy(); + } + delete this._metasets[datasetIndex]; + } + _stop() { + let i, ilen; + this.stop(); + animator.remove(this); + for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + this._destroyDatasetMeta(i); + } + } + destroy() { + this.notifyPlugins("beforeDestroy"); + const { canvas, ctx } = this; + this._stop(); + this.config.clearCache(); + if (canvas) { + this.unbindEvents(); + clearCanvas(canvas, ctx); + this.platform.releaseContext(ctx); + this.canvas = null; + this.ctx = null; + } + delete instances[this.id]; + this.notifyPlugins("afterDestroy"); + } + toBase64Image(...args) { + return this.canvas.toDataURL(...args); + } + bindEvents() { + this.bindUserEvents(); + if (this.options.responsive) { + this.bindResponsiveEvents(); + } else { + this.attached = true; + } + } + bindUserEvents() { + const listeners = this._listeners; + const platform = this.platform; + const _add = (type, listener2) => { + platform.addEventListener(this, type, listener2); + listeners[type] = listener2; + }; + const listener = (e, x, y) => { + e.offsetX = x; + e.offsetY = y; + this._eventHandler(e); + }; + each(this.options.events, (type) => _add(type, listener)); + } + bindResponsiveEvents() { + if (!this._responsiveListeners) { + this._responsiveListeners = {}; + } + const listeners = this._responsiveListeners; + const platform = this.platform; + const _add = (type, listener2) => { + platform.addEventListener(this, type, listener2); + listeners[type] = listener2; + }; + const _remove = (type, listener2) => { + if (listeners[type]) { + platform.removeEventListener(this, type, listener2); + delete listeners[type]; + } + }; + const listener = (width, height) => { + if (this.canvas) { + this.resize(width, height); + } + }; + let detached; + const attached = () => { + _remove("attach", attached); + this.attached = true; + this.resize(); + _add("resize", listener); + _add("detach", detached); + }; + detached = () => { + this.attached = false; + _remove("resize", listener); + this._stop(); + this._resize(0, 0); + _add("attach", attached); + }; + if (platform.isAttached(this.canvas)) { + attached(); + } else { + detached(); + } + } + unbindEvents() { + each(this._listeners, (listener, type) => { + this.platform.removeEventListener(this, type, listener); + }); + this._listeners = {}; + each(this._responsiveListeners, (listener, type) => { + this.platform.removeEventListener(this, type, listener); + }); + this._responsiveListeners = void 0; + } + updateHoverStyle(items, mode, enabled) { + const prefix = enabled ? "set" : "remove"; + let meta, item, i, ilen; + if (mode === "dataset") { + meta = this.getDatasetMeta(items[0].datasetIndex); + meta.controller["_" + prefix + "DatasetHoverStyle"](); + } + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + const controller = item && this.getDatasetMeta(item.datasetIndex).controller; + if (controller) { + controller[prefix + "HoverStyle"](item.element, item.datasetIndex, item.index); + } + } + } + getActiveElements() { + return this._active || []; + } + setActiveElements(activeElements) { + const lastActive = this._active || []; + const active = activeElements.map(({ datasetIndex, index }) => { + const meta = this.getDatasetMeta(datasetIndex); + if (!meta) { + throw new Error("No dataset found at index " + datasetIndex); + } + return { + datasetIndex, + element: meta.data[index], + index + }; + }); + const changed = !_elementsEqual(active, lastActive); + if (changed) { + this._active = active; + this._lastEvent = null; + this._updateHoverStyles(active, lastActive); + } + } + notifyPlugins(hook, args, filter) { + return this._plugins.notify(this, hook, args, filter); + } + isPluginEnabled(pluginId) { + return this._plugins._cache.filter((p) => p.plugin.id === pluginId).length === 1; + } + _updateHoverStyles(active, lastActive, replay) { + const hoverOptions = this.options.hover; + const diff = (a, b) => a.filter((x) => !b.some((y) => x.datasetIndex === y.datasetIndex && x.index === y.index)); + const deactivated = diff(lastActive, active); + const activated = replay ? active : diff(active, lastActive); + if (deactivated.length) { + this.updateHoverStyle(deactivated, hoverOptions.mode, false); + } + if (activated.length && hoverOptions.mode) { + this.updateHoverStyle(activated, hoverOptions.mode, true); + } + } + _eventHandler(e, replay) { + const args = { + event: e, + replay, + cancelable: true, + inChartArea: this.isPointInArea(e) + }; + const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type); + if (this.notifyPlugins("beforeEvent", args, eventFilter) === false) { + return; + } + const changed = this._handleEvent(e, replay, args.inChartArea); + args.cancelable = false; + this.notifyPlugins("afterEvent", args, eventFilter); + if (changed || args.changed) { + this.render(); + } + return this; + } + _handleEvent(e, replay, inChartArea) { + const { _active: lastActive = [], options } = this; + const useFinalPosition = replay; + const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition); + const isClick = _isClickEvent(e); + const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick); + if (inChartArea) { + this._lastEvent = null; + callback(options.onHover, [ + e, + active, + this + ], this); + if (isClick) { + callback(options.onClick, [ + e, + active, + this + ], this); + } + } + const changed = !_elementsEqual(active, lastActive); + if (changed || replay) { + this._active = active; + this._updateHoverStyles(active, lastActive, replay); + } + this._lastEvent = lastEvent; + return changed; + } + _getActiveElements(e, lastActive, inChartArea, useFinalPosition) { + if (e.type === "mouseout") { + return []; + } + if (!inChartArea) { + return lastActive; + } + const hoverOptions = this.options.hover; + return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition); + } +}; +__publicField(Chart, "defaults", defaults); +__publicField(Chart, "instances", instances); +__publicField(Chart, "overrides", overrides); +__publicField(Chart, "registry", registry); +__publicField(Chart, "version", version); +__publicField(Chart, "getChart", getChart); +function invalidatePlugins() { + return each(Chart.instances, (chart) => chart._plugins.invalidate()); +} +function clipArc(ctx, element, endAngle) { + const { startAngle, pixelMargin, x, y, outerRadius, innerRadius } = element; + let angleMargin = pixelMargin / outerRadius; + ctx.beginPath(); + ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin); + if (innerRadius > pixelMargin) { + angleMargin = pixelMargin / innerRadius; + ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true); + } else { + ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI); + } + ctx.closePath(); + ctx.clip(); +} +function toRadiusCorners(value) { + return _readValueToProps(value, [ + "outerStart", + "outerEnd", + "innerStart", + "innerEnd" + ]); +} +function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) { + const o = toRadiusCorners(arc.options.borderRadius); + const halfThickness = (outerRadius - innerRadius) / 2; + const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2); + const computeOuterLimit = (val) => { + const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2; + return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit)); + }; + return { + outerStart: computeOuterLimit(o.outerStart), + outerEnd: computeOuterLimit(o.outerEnd), + innerStart: _limitValue(o.innerStart, 0, innerLimit), + innerEnd: _limitValue(o.innerEnd, 0, innerLimit) + }; +} +function rThetaToXY(r, theta, x, y) { + return { + x: x + r * Math.cos(theta), + y: y + r * Math.sin(theta) + }; +} +function pathArc(ctx, element, offset, spacing, end, circular) { + const { x, y, startAngle: start, pixelMargin, innerRadius: innerR } = element; + const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0); + const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0; + let spacingOffset = 0; + const alpha2 = end - start; + if (spacing) { + const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0; + const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0; + const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2; + const adjustedAngle = avNogSpacingRadius !== 0 ? alpha2 * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha2; + spacingOffset = (alpha2 - adjustedAngle) / 2; + } + const beta = Math.max(1e-3, alpha2 * outerRadius - offset / PI) / outerRadius; + const angleOffset = (alpha2 - beta) / 2; + const startAngle = start + angleOffset + spacingOffset; + const endAngle = end - angleOffset - spacingOffset; + const { outerStart, outerEnd, innerStart, innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle); + const outerStartAdjustedRadius = outerRadius - outerStart; + const outerEndAdjustedRadius = outerRadius - outerEnd; + const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius; + const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius; + const innerStartAdjustedRadius = innerRadius + innerStart; + const innerEndAdjustedRadius = innerRadius + innerEnd; + const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius; + const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius; + ctx.beginPath(); + if (circular) { + const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2; + ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle); + ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle); + if (outerEnd > 0) { + const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y); + ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI); + } + const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y); + ctx.lineTo(p4.x, p4.y); + if (innerEnd > 0) { + const pCenter1 = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y); + ctx.arc(pCenter1.x, pCenter1.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI); + } + const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2; + ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true); + ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true); + if (innerStart > 0) { + const pCenter2 = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y); + ctx.arc(pCenter2.x, pCenter2.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI); + } + const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y); + ctx.lineTo(p8.x, p8.y); + if (outerStart > 0) { + const pCenter3 = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y); + ctx.arc(pCenter3.x, pCenter3.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle); + } + } else { + ctx.moveTo(x, y); + const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x; + const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y; + ctx.lineTo(outerStartX, outerStartY); + const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x; + const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y; + ctx.lineTo(outerEndX, outerEndY); + } + ctx.closePath(); +} +function drawArc(ctx, element, offset, spacing, circular) { + const { fullCircles, startAngle, circumference } = element; + let endAngle = element.endAngle; + if (fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + for (let i = 0; i < fullCircles; ++i) { + ctx.fill(); + } + if (!isNaN(circumference)) { + endAngle = startAngle + (circumference % TAU || TAU); + } + } + pathArc(ctx, element, offset, spacing, endAngle, circular); + ctx.fill(); + return endAngle; +} +function drawBorder(ctx, element, offset, spacing, circular) { + const { fullCircles, startAngle, circumference, options } = element; + const { borderWidth, borderJoinStyle } = options; + const inner = options.borderAlign === "inner"; + if (!borderWidth) { + return; + } + if (inner) { + ctx.lineWidth = borderWidth * 2; + ctx.lineJoin = borderJoinStyle || "round"; + } else { + ctx.lineWidth = borderWidth; + ctx.lineJoin = borderJoinStyle || "bevel"; + } + let endAngle = element.endAngle; + if (fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + for (let i = 0; i < fullCircles; ++i) { + ctx.stroke(); + } + if (!isNaN(circumference)) { + endAngle = startAngle + (circumference % TAU || TAU); + } + } + if (inner) { + clipArc(ctx, element, endAngle); + } + if (!fullCircles) { + pathArc(ctx, element, offset, spacing, endAngle, circular); + ctx.stroke(); + } +} +var ArcElement = class extends Element { + constructor(cfg) { + super(); + this.options = void 0; + this.circumference = void 0; + this.startAngle = void 0; + this.endAngle = void 0; + this.innerRadius = void 0; + this.outerRadius = void 0; + this.pixelMargin = 0; + this.fullCircles = 0; + if (cfg) { + Object.assign(this, cfg); + } + } + inRange(chartX, chartY, useFinalPosition) { + const point = this.getProps([ + "x", + "y" + ], useFinalPosition); + const { angle, distance } = getAngleFromPoint(point, { + x: chartX, + y: chartY + }); + const { startAngle, endAngle, innerRadius, outerRadius, circumference } = this.getProps([ + "startAngle", + "endAngle", + "innerRadius", + "outerRadius", + "circumference" + ], useFinalPosition); + const rAdjust = this.options.spacing / 2; + const _circumference = valueOrDefault(circumference, endAngle - startAngle); + const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle); + const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust); + return betweenAngles && withinRadius; + } + getCenterPoint(useFinalPosition) { + const { x, y, startAngle, endAngle, innerRadius, outerRadius } = this.getProps([ + "x", + "y", + "startAngle", + "endAngle", + "innerRadius", + "outerRadius" + ], useFinalPosition); + const { offset, spacing } = this.options; + const halfAngle = (startAngle + endAngle) / 2; + const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2; + return { + x: x + Math.cos(halfAngle) * halfRadius, + y: y + Math.sin(halfAngle) * halfRadius + }; + } + tooltipPosition(useFinalPosition) { + return this.getCenterPoint(useFinalPosition); + } + draw(ctx) { + const { options, circumference } = this; + const offset = (options.offset || 0) / 4; + const spacing = (options.spacing || 0) / 2; + const circular = options.circular; + this.pixelMargin = options.borderAlign === "inner" ? 0.33 : 0; + this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0; + if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) { + return; + } + ctx.save(); + const halfAngle = (this.startAngle + this.endAngle) / 2; + ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset); + const fix = 1 - Math.sin(Math.min(PI, circumference || 0)); + const radiusOffset = offset * fix; + ctx.fillStyle = options.backgroundColor; + ctx.strokeStyle = options.borderColor; + drawArc(ctx, this, radiusOffset, spacing, circular); + drawBorder(ctx, this, radiusOffset, spacing, circular); + ctx.restore(); + } +}; +__publicField(ArcElement, "id", "arc"); +__publicField(ArcElement, "defaults", { + borderAlign: "center", + borderColor: "#fff", + borderJoinStyle: void 0, + borderRadius: 0, + borderWidth: 2, + offset: 0, + spacing: 0, + angle: void 0, + circular: true +}); +__publicField(ArcElement, "defaultRoutes", { + backgroundColor: "backgroundColor" +}); +function getBarBounds(bar, useFinalPosition) { + const { x, y, base, width, height } = bar.getProps([ + "x", + "y", + "base", + "width", + "height" + ], useFinalPosition); + let left, right, top, bottom, half; + if (bar.horizontal) { + half = height / 2; + left = Math.min(x, base); + right = Math.max(x, base); + top = y - half; + bottom = y + half; + } else { + half = width / 2; + left = x - half; + right = x + half; + top = Math.min(y, base); + bottom = Math.max(y, base); + } + return { + left, + top, + right, + bottom + }; +} +function skipOrLimit(skip2, value, min, max) { + return skip2 ? 0 : _limitValue(value, min, max); +} +function parseBorderWidth(bar, maxW, maxH) { + const value = bar.options.borderWidth; + const skip2 = bar.borderSkipped; + const o = toTRBL(value); + return { + t: skipOrLimit(skip2.top, o.top, 0, maxH), + r: skipOrLimit(skip2.right, o.right, 0, maxW), + b: skipOrLimit(skip2.bottom, o.bottom, 0, maxH), + l: skipOrLimit(skip2.left, o.left, 0, maxW) + }; +} +function parseBorderRadius(bar, maxW, maxH) { + const { enableBorderRadius } = bar.getProps([ + "enableBorderRadius" + ]); + const value = bar.options.borderRadius; + const o = toTRBLCorners(value); + const maxR = Math.min(maxW, maxH); + const skip2 = bar.borderSkipped; + const enableBorder = enableBorderRadius || isObject(value); + return { + topLeft: skipOrLimit(!enableBorder || skip2.top || skip2.left, o.topLeft, 0, maxR), + topRight: skipOrLimit(!enableBorder || skip2.top || skip2.right, o.topRight, 0, maxR), + bottomLeft: skipOrLimit(!enableBorder || skip2.bottom || skip2.left, o.bottomLeft, 0, maxR), + bottomRight: skipOrLimit(!enableBorder || skip2.bottom || skip2.right, o.bottomRight, 0, maxR) + }; +} +function boundingRects(bar) { + const bounds = getBarBounds(bar); + const width = bounds.right - bounds.left; + const height = bounds.bottom - bounds.top; + const border = parseBorderWidth(bar, width / 2, height / 2); + const radius = parseBorderRadius(bar, width / 2, height / 2); + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height, + radius + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b, + radius: { + topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)), + topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)), + bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)), + bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)) + } + } + }; +} +function inRange(bar, x, y, useFinalPosition) { + const skipX = x === null; + const skipY = y === null; + const skipBoth = skipX && skipY; + const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition); + return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom)); +} +function hasRadius(radius) { + return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight; +} +function addNormalRectPath(ctx, rect) { + ctx.rect(rect.x, rect.y, rect.w, rect.h); +} +function inflateRect(rect, amount, refRect = {}) { + const x = rect.x !== refRect.x ? -amount : 0; + const y = rect.y !== refRect.y ? -amount : 0; + const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x; + const h4 = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y; + return { + x: rect.x + x, + y: rect.y + y, + w: rect.w + w, + h: rect.h + h4, + radius: rect.radius + }; +} +var BarElement = class extends Element { + constructor(cfg) { + super(); + this.options = void 0; + this.horizontal = void 0; + this.base = void 0; + this.width = void 0; + this.height = void 0; + this.inflateAmount = void 0; + if (cfg) { + Object.assign(this, cfg); + } + } + draw(ctx) { + const { inflateAmount, options: { borderColor, backgroundColor } } = this; + const { inner, outer } = boundingRects(this); + const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath; + ctx.save(); + if (outer.w !== inner.w || outer.h !== inner.h) { + ctx.beginPath(); + addRectPath(ctx, inflateRect(outer, inflateAmount, inner)); + ctx.clip(); + addRectPath(ctx, inflateRect(inner, -inflateAmount, outer)); + ctx.fillStyle = borderColor; + ctx.fill("evenodd"); + } + ctx.beginPath(); + addRectPath(ctx, inflateRect(inner, inflateAmount)); + ctx.fillStyle = backgroundColor; + ctx.fill(); + ctx.restore(); + } + inRange(mouseX, mouseY, useFinalPosition) { + return inRange(this, mouseX, mouseY, useFinalPosition); + } + inXRange(mouseX, useFinalPosition) { + return inRange(this, mouseX, null, useFinalPosition); + } + inYRange(mouseY, useFinalPosition) { + return inRange(this, null, mouseY, useFinalPosition); + } + getCenterPoint(useFinalPosition) { + const { x, y, base, horizontal } = this.getProps([ + "x", + "y", + "base", + "horizontal" + ], useFinalPosition); + return { + x: horizontal ? (x + base) / 2 : x, + y: horizontal ? y : (y + base) / 2 + }; + } + getRange(axis) { + return axis === "x" ? this.width / 2 : this.height / 2; + } +}; +__publicField(BarElement, "id", "bar"); +__publicField(BarElement, "defaults", { + borderSkipped: "start", + borderWidth: 0, + borderRadius: 0, + inflateAmount: "auto", + pointStyle: void 0 +}); +__publicField(BarElement, "defaultRoutes", { + backgroundColor: "backgroundColor", + borderColor: "borderColor" +}); +var getBoxSize = (labelOpts, fontSize) => { + let { boxHeight = fontSize, boxWidth = fontSize } = labelOpts; + if (labelOpts.usePointStyle) { + boxHeight = Math.min(boxHeight, fontSize); + boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize); + } + return { + boxWidth, + boxHeight, + itemHeight: Math.max(fontSize, boxHeight) + }; +}; +var itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index; +var Legend = class extends Element { + constructor(config) { + super(); + this._added = false; + this.legendHitBoxes = []; + this._hoveredItem = null; + this.doughnutMode = false; + this.chart = config.chart; + this.options = config.options; + this.ctx = config.ctx; + this.legendItems = void 0; + this.columnSizes = void 0; + this.lineWidths = void 0; + this.maxHeight = void 0; + this.maxWidth = void 0; + this.top = void 0; + this.bottom = void 0; + this.left = void 0; + this.right = void 0; + this.height = void 0; + this.width = void 0; + this._margins = void 0; + this.position = void 0; + this.weight = void 0; + this.fullSize = void 0; + } + update(maxWidth, maxHeight, margins) { + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + this._margins = margins; + this.setDimensions(); + this.buildLabels(); + this.fit(); + } + setDimensions() { + if (this.isHorizontal()) { + this.width = this.maxWidth; + this.left = this._margins.left; + this.right = this.width; + } else { + this.height = this.maxHeight; + this.top = this._margins.top; + this.bottom = this.height; + } + } + buildLabels() { + const labelOpts = this.options.labels || {}; + let legendItems = callback(labelOpts.generateLabels, [ + this.chart + ], this) || []; + if (labelOpts.filter) { + legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data)); + } + if (labelOpts.sort) { + legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data)); + } + if (this.options.reverse) { + legendItems.reverse(); + } + this.legendItems = legendItems; + } + fit() { + const { options, ctx } = this; + if (!options.display) { + this.width = this.height = 0; + return; + } + const labelOpts = options.labels; + const labelFont = toFont(labelOpts.font); + const fontSize = labelFont.size; + const titleHeight = this._computeTitleHeight(); + const { boxWidth, itemHeight } = getBoxSize(labelOpts, fontSize); + let width, height; + ctx.font = labelFont.string; + if (this.isHorizontal()) { + width = this.maxWidth; + height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10; + } else { + height = this.maxHeight; + width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10; + } + this.width = Math.min(width, options.maxWidth || this.maxWidth); + this.height = Math.min(height, options.maxHeight || this.maxHeight); + } + _fitRows(titleHeight, fontSize, boxWidth, itemHeight) { + const { ctx, maxWidth, options: { labels: { padding } } } = this; + const hitboxes = this.legendHitBoxes = []; + const lineWidths = this.lineWidths = [ + 0 + ]; + const lineHeight = itemHeight + padding; + let totalHeight = titleHeight; + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + let row = -1; + let top = -lineHeight; + this.legendItems.forEach((legendItem, i) => { + const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width; + if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) { + totalHeight += lineHeight; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0; + top += lineHeight; + row++; + } + hitboxes[i] = { + left: 0, + top, + row, + width: itemWidth, + height: itemHeight + }; + lineWidths[lineWidths.length - 1] += itemWidth + padding; + }); + return totalHeight; + } + _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) { + const { ctx, maxHeight, options: { labels: { padding } } } = this; + const hitboxes = this.legendHitBoxes = []; + const columnSizes = this.columnSizes = []; + const heightLimit = maxHeight - titleHeight; + let totalWidth = padding; + let currentColWidth = 0; + let currentColHeight = 0; + let left = 0; + let col = 0; + this.legendItems.forEach((legendItem, i) => { + const { itemWidth, itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight); + if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) { + totalWidth += currentColWidth + padding; + columnSizes.push({ + width: currentColWidth, + height: currentColHeight + }); + left += currentColWidth + padding; + col++; + currentColWidth = currentColHeight = 0; + } + hitboxes[i] = { + left, + top: currentColHeight, + col, + width: itemWidth, + height: itemHeight + }; + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight + padding; + }); + totalWidth += currentColWidth; + columnSizes.push({ + width: currentColWidth, + height: currentColHeight + }); + return totalWidth; + } + adjustHitBoxes() { + if (!this.options.display) { + return; + } + const titleHeight = this._computeTitleHeight(); + const { legendHitBoxes: hitboxes, options: { align, labels: { padding }, rtl } } = this; + const rtlHelper = getRtlAdapter(rtl, this.left, this.width); + if (this.isHorizontal()) { + let row = 0; + let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); + for (const hitbox of hitboxes) { + if (row !== hitbox.row) { + row = hitbox.row; + left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); + } + hitbox.top += this.top + titleHeight + padding; + hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width); + left += hitbox.width + padding; + } + } else { + let col = 0; + let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); + for (const hitbox1 of hitboxes) { + if (hitbox1.col !== col) { + col = hitbox1.col; + top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); + } + hitbox1.top = top; + hitbox1.left += this.left + padding; + hitbox1.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox1.left), hitbox1.width); + top += hitbox1.height + padding; + } + } + } + isHorizontal() { + return this.options.position === "top" || this.options.position === "bottom"; + } + draw() { + if (this.options.display) { + const ctx = this.ctx; + clipArea(ctx, this); + this._draw(); + unclipArea(ctx); + } + } + _draw() { + const { options: opts, columnSizes, lineWidths, ctx } = this; + const { align, labels: labelOpts } = opts; + const defaultColor = defaults.color; + const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); + const labelFont = toFont(labelOpts.font); + const { padding } = labelOpts; + const fontSize = labelFont.size; + const halfFontSize = fontSize / 2; + let cursor; + this.drawTitle(); + ctx.textAlign = rtlHelper.textAlign("left"); + ctx.textBaseline = "middle"; + ctx.lineWidth = 0.5; + ctx.font = labelFont.string; + const { boxWidth, boxHeight, itemHeight } = getBoxSize(labelOpts, fontSize); + const drawLegendBox = function(x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) { + return; + } + ctx.save(); + const lineWidth = valueOrDefault(legendItem.lineWidth, 1); + ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault(legendItem.lineCap, "butt"); + ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0); + ctx.lineJoin = valueOrDefault(legendItem.lineJoin, "miter"); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor); + ctx.setLineDash(valueOrDefault(legendItem.lineDash, [])); + if (labelOpts.usePointStyle) { + const drawOptions = { + radius: boxHeight * Math.SQRT2 / 2, + pointStyle: legendItem.pointStyle, + rotation: legendItem.rotation, + borderWidth: lineWidth + }; + const centerX = rtlHelper.xPlus(x, boxWidth / 2); + const centerY = y + halfFontSize; + drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth); + } else { + const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0); + const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth); + const borderRadius = toTRBLCorners(legendItem.borderRadius); + ctx.beginPath(); + if (Object.values(borderRadius).some((v) => v !== 0)) { + addRoundedRectPath(ctx, { + x: xBoxLeft, + y: yBoxTop, + w: boxWidth, + h: boxHeight, + radius: borderRadius + }); + } else { + ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight); + } + ctx.fill(); + if (lineWidth !== 0) { + ctx.stroke(); + } + } + ctx.restore(); + }; + const fillText = function(x, y, legendItem) { + renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, { + strikethrough: legendItem.hidden, + textAlign: rtlHelper.textAlign(legendItem.textAlign) + }); + }; + const isHorizontal = this.isHorizontal(); + const titleHeight = this._computeTitleHeight(); + if (isHorizontal) { + cursor = { + x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]), + y: this.top + padding + titleHeight, + line: 0 + }; + } else { + cursor = { + x: this.left + padding, + y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height), + line: 0 + }; + } + overrideTextDirection(this.ctx, opts.textDirection); + const lineHeight = itemHeight + padding; + this.legendItems.forEach((legendItem, i) => { + ctx.strokeStyle = legendItem.fontColor; + ctx.fillStyle = legendItem.fontColor; + const textWidth = ctx.measureText(legendItem.text).width; + const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign)); + const width = boxWidth + halfFontSize + textWidth; + let x = cursor.x; + let y = cursor.y; + rtlHelper.setWidth(this.width); + if (isHorizontal) { + if (i > 0 && x + width + padding > this.right) { + y = cursor.y += lineHeight; + cursor.line++; + x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]); + } + } else if (i > 0 && y + lineHeight > this.bottom) { + x = cursor.x = x + columnSizes[cursor.line].width + padding; + cursor.line++; + y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height); + } + const realX = rtlHelper.x(x); + drawLegendBox(realX, y, legendItem); + x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl); + fillText(rtlHelper.x(x), y, legendItem); + if (isHorizontal) { + cursor.x += width + padding; + } else if (typeof legendItem.text !== "string") { + const fontLineHeight = labelFont.lineHeight; + cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight); + } else { + cursor.y += lineHeight; + } + }); + restoreTextDirection(this.ctx, opts.textDirection); + } + drawTitle() { + const opts = this.options; + const titleOpts = opts.title; + const titleFont = toFont(titleOpts.font); + const titlePadding = toPadding(titleOpts.padding); + if (!titleOpts.display) { + return; + } + const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); + const ctx = this.ctx; + const position = titleOpts.position; + const halfFontSize = titleFont.size / 2; + const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize; + let y; + let left = this.left; + let maxWidth = this.width; + if (this.isHorizontal()) { + maxWidth = Math.max(...this.lineWidths); + y = this.top + topPaddingPlusHalfFontSize; + left = _alignStartEnd(opts.align, left, this.right - maxWidth); + } else { + const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0); + y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight()); + } + const x = _alignStartEnd(position, left, left + maxWidth); + ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position)); + ctx.textBaseline = "middle"; + ctx.strokeStyle = titleOpts.color; + ctx.fillStyle = titleOpts.color; + ctx.font = titleFont.string; + renderText(ctx, titleOpts.text, x, y, titleFont); + } + _computeTitleHeight() { + const titleOpts = this.options.title; + const titleFont = toFont(titleOpts.font); + const titlePadding = toPadding(titleOpts.padding); + return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0; + } + _getLegendItemAt(x, y) { + let i, hitBox, lh; + if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) { + lh = this.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) { + return this.legendItems[i]; + } + } + } + return null; + } + handleEvent(e) { + const opts = this.options; + if (!isListened(e.type, opts)) { + return; + } + const hoveredItem = this._getLegendItemAt(e.x, e.y); + if (e.type === "mousemove" || e.type === "mouseout") { + const previous = this._hoveredItem; + const sameItem = itemsEqual(previous, hoveredItem); + if (previous && !sameItem) { + callback(opts.onLeave, [ + e, + previous, + this + ], this); + } + this._hoveredItem = hoveredItem; + if (hoveredItem && !sameItem) { + callback(opts.onHover, [ + e, + hoveredItem, + this + ], this); + } + } else if (hoveredItem) { + callback(opts.onClick, [ + e, + hoveredItem, + this + ], this); + } + } +}; +function calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) { + const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx); + const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight); + return { + itemWidth, + itemHeight + }; +} +function calculateItemWidth(legendItem, boxWidth, labelFont, ctx) { + let legendItemText = legendItem.text; + if (legendItemText && typeof legendItemText !== "string") { + legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b); + } + return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width; +} +function calculateItemHeight(_itemHeight, legendItem, fontLineHeight) { + let itemHeight = _itemHeight; + if (typeof legendItem.text !== "string") { + itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight); + } + return itemHeight; +} +function calculateLegendItemHeight(legendItem, fontLineHeight) { + const labelHeight = legendItem.text ? legendItem.text.length + 0.5 : 0; + return fontLineHeight * labelHeight; +} +function isListened(type, opts) { + if ((type === "mousemove" || type === "mouseout") && (opts.onHover || opts.onLeave)) { + return true; + } + if (opts.onClick && (type === "click" || type === "mouseup")) { + return true; + } + return false; +} +var plugin_legend = { + id: "legend", + _element: Legend, + start(chart, _args, options) { + const legend = chart.legend = new Legend({ + ctx: chart.ctx, + options, + chart + }); + layouts.configure(chart, legend, options); + layouts.addBox(chart, legend); + }, + stop(chart) { + layouts.removeBox(chart, chart.legend); + delete chart.legend; + }, + beforeUpdate(chart, _args, options) { + const legend = chart.legend; + layouts.configure(chart, legend, options); + legend.options = options; + }, + afterUpdate(chart) { + const legend = chart.legend; + legend.buildLabels(); + legend.adjustHitBoxes(); + }, + afterEvent(chart, args) { + if (!args.replay) { + chart.legend.handleEvent(args.event); + } + }, + defaults: { + display: true, + position: "top", + align: "center", + fullSize: true, + reverse: false, + weight: 1e3, + onClick(e, legendItem, legend) { + const index = legendItem.datasetIndex; + const ci = legend.chart; + if (ci.isDatasetVisible(index)) { + ci.hide(index); + legendItem.hidden = true; + } else { + ci.show(index); + legendItem.hidden = false; + } + }, + onHover: null, + onLeave: null, + labels: { + color: (ctx) => ctx.chart.options.color, + boxWidth: 40, + padding: 10, + generateLabels(chart) { + const datasets = chart.data.datasets; + const { labels: { usePointStyle, pointStyle, textAlign, color: color2, useBorderRadius, borderRadius } } = chart.legend.options; + return chart._getSortedDatasetMetas().map((meta) => { + const style = meta.controller.getStyle(usePointStyle ? 0 : void 0); + const borderWidth = toPadding(style.borderWidth); + return { + text: datasets[meta.index].label, + fillStyle: style.backgroundColor, + fontColor: color2, + hidden: !meta.visible, + lineCap: style.borderCapStyle, + lineDash: style.borderDash, + lineDashOffset: style.borderDashOffset, + lineJoin: style.borderJoinStyle, + lineWidth: (borderWidth.width + borderWidth.height) / 4, + strokeStyle: style.borderColor, + pointStyle: pointStyle || style.pointStyle, + rotation: style.rotation, + textAlign: textAlign || style.textAlign, + borderRadius: useBorderRadius && (borderRadius || style.borderRadius), + datasetIndex: meta.index + }; + }, this); + } + }, + title: { + color: (ctx) => ctx.chart.options.color, + display: false, + position: "center", + text: "" + } + }, + descriptors: { + _scriptable: (name2) => !name2.startsWith("on"), + labels: { + _scriptable: (name2) => ![ + "generateLabels", + "filter", + "sort" + ].includes(name2) + } + } +}; +var Title = class extends Element { + constructor(config) { + super(); + this.chart = config.chart; + this.options = config.options; + this.ctx = config.ctx; + this._padding = void 0; + this.top = void 0; + this.bottom = void 0; + this.left = void 0; + this.right = void 0; + this.width = void 0; + this.height = void 0; + this.position = void 0; + this.weight = void 0; + this.fullSize = void 0; + } + update(maxWidth, maxHeight) { + const opts = this.options; + this.left = 0; + this.top = 0; + if (!opts.display) { + this.width = this.height = this.right = this.bottom = 0; + return; + } + this.width = this.right = maxWidth; + this.height = this.bottom = maxHeight; + const lineCount = isArray(opts.text) ? opts.text.length : 1; + this._padding = toPadding(opts.padding); + const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height; + if (this.isHorizontal()) { + this.height = textSize; + } else { + this.width = textSize; + } + } + isHorizontal() { + const pos = this.options.position; + return pos === "top" || pos === "bottom"; + } + _drawArgs(offset) { + const { top, left, bottom, right, options } = this; + const align = options.align; + let rotation = 0; + let maxWidth, titleX, titleY; + if (this.isHorizontal()) { + titleX = _alignStartEnd(align, left, right); + titleY = top + offset; + maxWidth = right - left; + } else { + if (options.position === "left") { + titleX = left + offset; + titleY = _alignStartEnd(align, bottom, top); + rotation = PI * -0.5; + } else { + titleX = right - offset; + titleY = _alignStartEnd(align, top, bottom); + rotation = PI * 0.5; + } + maxWidth = bottom - top; + } + return { + titleX, + titleY, + maxWidth, + rotation + }; + } + draw() { + const ctx = this.ctx; + const opts = this.options; + if (!opts.display) { + return; + } + const fontOpts = toFont(opts.font); + const lineHeight = fontOpts.lineHeight; + const offset = lineHeight / 2 + this._padding.top; + const { titleX, titleY, maxWidth, rotation } = this._drawArgs(offset); + renderText(ctx, opts.text, 0, 0, fontOpts, { + color: opts.color, + maxWidth, + rotation, + textAlign: _toLeftRightCenter(opts.align), + textBaseline: "middle", + translation: [ + titleX, + titleY + ] + }); + } +}; +function createTitle(chart, titleOpts) { + const title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart + }); + layouts.configure(chart, title, titleOpts); + layouts.addBox(chart, title); + chart.titleBlock = title; +} +var plugin_title = { + id: "title", + _element: Title, + start(chart, _args, options) { + createTitle(chart, options); + }, + stop(chart) { + const titleBlock = chart.titleBlock; + layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + }, + beforeUpdate(chart, _args, options) { + const title = chart.titleBlock; + layouts.configure(chart, title, options); + title.options = options; + }, + defaults: { + align: "center", + display: false, + font: { + weight: "bold" + }, + fullSize: true, + padding: 10, + position: "top", + text: "", + weight: 2e3 + }, + defaultRoutes: { + color: "color" + }, + descriptors: { + _scriptable: true, + _indexable: false + } +}; +var map2 = /* @__PURE__ */ new WeakMap(); +var plugin_subtitle = { + id: "subtitle", + start(chart, _args, options) { + const title = new Title({ + ctx: chart.ctx, + options, + chart + }); + layouts.configure(chart, title, options); + layouts.addBox(chart, title); + map2.set(chart, title); + }, + stop(chart) { + layouts.removeBox(chart, map2.get(chart)); + map2.delete(chart); + }, + beforeUpdate(chart, _args, options) { + const title = map2.get(chart); + layouts.configure(chart, title, options); + title.options = options; + }, + defaults: { + align: "center", + display: false, + font: { + weight: "normal" + }, + fullSize: true, + padding: 0, + position: "top", + text: "", + weight: 1500 + }, + defaultRoutes: { + color: "color" + }, + descriptors: { + _scriptable: true, + _indexable: false + } +}; +var positioners = { + average(items) { + if (!items.length) { + return false; + } + let i, len; + let x = 0; + let y = 0; + let count = 0; + for (i = 0, len = items.length; i < len; ++i) { + const el = items[i].element; + if (el && el.hasValue()) { + const pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + return { + x: x / count, + y: y / count + }; + }, + nearest(items, eventPosition) { + if (!items.length) { + return false; + } + let x = eventPosition.x; + let y = eventPosition.y; + let minDistance = Number.POSITIVE_INFINITY; + let i, len, nearestElement; + for (i = 0, len = items.length; i < len; ++i) { + const el = items[i].element; + if (el && el.hasValue()) { + const center = el.getCenterPoint(); + const d = distanceBetweenPoints(eventPosition, center); + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + if (nearestElement) { + const tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + return { + x, + y + }; + } +}; +function pushOrConcat(base, toPush) { + if (toPush) { + if (isArray(toPush)) { + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + return base; +} +function splitNewlines(str) { + if ((typeof str === "string" || str instanceof String) && str.indexOf("\n") > -1) { + return str.split("\n"); + } + return str; +} +function createTooltipItem(chart, item) { + const { element, datasetIndex, index } = item; + const controller = chart.getDatasetMeta(datasetIndex).controller; + const { label, value } = controller.getLabelAndValue(index); + return { + chart, + label, + parsed: controller.getParsed(index), + raw: chart.data.datasets[datasetIndex].data[index], + formattedValue: value, + dataset: controller.getDataset(), + dataIndex: index, + datasetIndex, + element + }; +} +function getTooltipSize(tooltip, options) { + const ctx = tooltip.chart.ctx; + const { body, footer, title } = tooltip; + const { boxWidth, boxHeight } = options; + const bodyFont = toFont(options.bodyFont); + const titleFont = toFont(options.titleFont); + const footerFont = toFont(options.footerFont); + const titleLineCount = title.length; + const footerLineCount = footer.length; + const bodyLineItemCount = body.length; + const padding = toPadding(options.padding); + let height = padding.height; + let width = 0; + let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0); + combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length; + if (titleLineCount) { + height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom; + } + if (combinedBodyLength) { + const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight; + height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing; + } + if (footerLineCount) { + height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing; + } + let widthPadding = 0; + const maxLineWidth = function(line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + ctx.save(); + ctx.font = titleFont.string; + each(tooltip.title, maxLineWidth); + ctx.font = bodyFont.string; + each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth); + widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0; + each(body, (bodyItem) => { + each(bodyItem.before, maxLineWidth); + each(bodyItem.lines, maxLineWidth); + each(bodyItem.after, maxLineWidth); + }); + widthPadding = 0; + ctx.font = footerFont.string; + each(tooltip.footer, maxLineWidth); + ctx.restore(); + width += padding.width; + return { + width, + height + }; +} +function determineYAlign(chart, size) { + const { y, height } = size; + if (y < height / 2) { + return "top"; + } else if (y > chart.height - height / 2) { + return "bottom"; + } + return "center"; +} +function doesNotFitWithAlign(xAlign, chart, options, size) { + const { x, width } = size; + const caret = options.caretSize + options.caretPadding; + if (xAlign === "left" && x + width + caret > chart.width) { + return true; + } + if (xAlign === "right" && x - width - caret < 0) { + return true; + } +} +function determineXAlign(chart, options, size, yAlign) { + const { x, width } = size; + const { width: chartWidth, chartArea: { left, right } } = chart; + let xAlign = "center"; + if (yAlign === "center") { + xAlign = x <= (left + right) / 2 ? "left" : "right"; + } else if (x <= width / 2) { + xAlign = "left"; + } else if (x >= chartWidth - width / 2) { + xAlign = "right"; + } + if (doesNotFitWithAlign(xAlign, chart, options, size)) { + xAlign = "center"; + } + return xAlign; +} +function determineAlignment(chart, options, size) { + const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size); + return { + xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign), + yAlign + }; +} +function alignX(size, xAlign) { + let { x, width } = size; + if (xAlign === "right") { + x -= width; + } else if (xAlign === "center") { + x -= width / 2; + } + return x; +} +function alignY(size, yAlign, paddingAndSize) { + let { y, height } = size; + if (yAlign === "top") { + y += paddingAndSize; + } else if (yAlign === "bottom") { + y -= height + paddingAndSize; + } else { + y -= height / 2; + } + return y; +} +function getBackgroundPoint(options, size, alignment, chart) { + const { caretSize, caretPadding, cornerRadius } = options; + const { xAlign, yAlign } = alignment; + const paddingAndSize = caretSize + caretPadding; + const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius); + let x = alignX(size, xAlign); + const y = alignY(size, yAlign, paddingAndSize); + if (yAlign === "center") { + if (xAlign === "left") { + x += paddingAndSize; + } else if (xAlign === "right") { + x -= paddingAndSize; + } + } else if (xAlign === "left") { + x -= Math.max(topLeft, bottomLeft) + caretSize; + } else if (xAlign === "right") { + x += Math.max(topRight, bottomRight) + caretSize; + } + return { + x: _limitValue(x, 0, chart.width - size.width), + y: _limitValue(y, 0, chart.height - size.height) + }; +} +function getAlignedX(tooltip, align, options) { + const padding = toPadding(options.padding); + return align === "center" ? tooltip.x + tooltip.width / 2 : align === "right" ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left; +} +function getBeforeAfterBodyLines(callback2) { + return pushOrConcat([], splitNewlines(callback2)); +} +function createTooltipContext(parent, tooltip, tooltipItems) { + return createContext(parent, { + tooltip, + tooltipItems, + type: "tooltip" + }); +} +function overrideCallbacks(callbacks, context) { + const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks; + return override ? callbacks.override(override) : callbacks; +} +var defaultCallbacks = { + beforeTitle: noop, + title(tooltipItems) { + if (tooltipItems.length > 0) { + const item = tooltipItems[0]; + const labels = item.chart.data.labels; + const labelCount = labels ? labels.length : 0; + if (this && this.options && this.options.mode === "dataset") { + return item.dataset.label || ""; + } else if (item.label) { + return item.label; + } else if (labelCount > 0 && item.dataIndex < labelCount) { + return labels[item.dataIndex]; + } + } + return ""; + }, + afterTitle: noop, + beforeBody: noop, + beforeLabel: noop, + label(tooltipItem) { + if (this && this.options && this.options.mode === "dataset") { + return tooltipItem.label + ": " + tooltipItem.formattedValue || tooltipItem.formattedValue; + } + let label = tooltipItem.dataset.label || ""; + if (label) { + label += ": "; + } + const value = tooltipItem.formattedValue; + if (!isNullOrUndef(value)) { + label += value; + } + return label; + }, + labelColor(tooltipItem) { + const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); + const options = meta.controller.getStyle(tooltipItem.dataIndex); + return { + borderColor: options.borderColor, + backgroundColor: options.backgroundColor, + borderWidth: options.borderWidth, + borderDash: options.borderDash, + borderDashOffset: options.borderDashOffset, + borderRadius: 0 + }; + }, + labelTextColor() { + return this.options.bodyColor; + }, + labelPointStyle(tooltipItem) { + const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); + const options = meta.controller.getStyle(tooltipItem.dataIndex); + return { + pointStyle: options.pointStyle, + rotation: options.rotation + }; + }, + afterLabel: noop, + afterBody: noop, + beforeFooter: noop, + footer: noop, + afterFooter: noop +}; +function invokeCallbackWithFallback(callbacks, name2, ctx, arg) { + const result = callbacks[name2].call(ctx, arg); + if (typeof result === "undefined") { + return defaultCallbacks[name2].call(ctx, arg); + } + return result; +} +var Tooltip = class extends Element { + constructor(config) { + super(); + this.opacity = 0; + this._active = []; + this._eventPosition = void 0; + this._size = void 0; + this._cachedAnimations = void 0; + this._tooltipItems = []; + this.$animations = void 0; + this.$context = void 0; + this.chart = config.chart; + this.options = config.options; + this.dataPoints = void 0; + this.title = void 0; + this.beforeBody = void 0; + this.body = void 0; + this.afterBody = void 0; + this.footer = void 0; + this.xAlign = void 0; + this.yAlign = void 0; + this.x = void 0; + this.y = void 0; + this.height = void 0; + this.width = void 0; + this.caretX = void 0; + this.caretY = void 0; + this.labelColors = void 0; + this.labelPointStyles = void 0; + this.labelTextColors = void 0; + } + initialize(options) { + this.options = options; + this._cachedAnimations = void 0; + this.$context = void 0; + } + _resolveAnimations() { + const cached = this._cachedAnimations; + if (cached) { + return cached; + } + const chart = this.chart; + const options = this.options.setContext(this.getContext()); + const opts = options.enabled && chart.options.animation && options.animations; + const animations = new Animations(this.chart, opts); + if (opts._cacheable) { + this._cachedAnimations = Object.freeze(animations); + } + return animations; + } + getContext() { + return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems)); + } + getTitle(context, options) { + const { callbacks } = options; + const beforeTitle = invokeCallbackWithFallback(callbacks, "beforeTitle", this, context); + const title = invokeCallbackWithFallback(callbacks, "title", this, context); + const afterTitle = invokeCallbackWithFallback(callbacks, "afterTitle", this, context); + let lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + return lines; + } + getBeforeBody(tooltipItems, options) { + return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "beforeBody", this, tooltipItems)); + } + getBody(tooltipItems, options) { + const { callbacks } = options; + const bodyItems = []; + each(tooltipItems, (context) => { + const bodyItem = { + before: [], + lines: [], + after: [] + }; + const scoped = overrideCallbacks(callbacks, context); + pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, "beforeLabel", this, context))); + pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, "label", this, context)); + pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, "afterLabel", this, context))); + bodyItems.push(bodyItem); + }); + return bodyItems; + } + getAfterBody(tooltipItems, options) { + return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "afterBody", this, tooltipItems)); + } + getFooter(tooltipItems, options) { + const { callbacks } = options; + const beforeFooter = invokeCallbackWithFallback(callbacks, "beforeFooter", this, tooltipItems); + const footer = invokeCallbackWithFallback(callbacks, "footer", this, tooltipItems); + const afterFooter = invokeCallbackWithFallback(callbacks, "afterFooter", this, tooltipItems); + let lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + return lines; + } + _createItems(options) { + const active = this._active; + const data = this.chart.data; + const labelColors = []; + const labelPointStyles = []; + const labelTextColors = []; + let tooltipItems = []; + let i, len; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(this.chart, active[i])); + } + if (options.filter) { + tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data)); + } + if (options.itemSort) { + tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data)); + } + each(tooltipItems, (context) => { + const scoped = overrideCallbacks(options.callbacks, context); + labelColors.push(invokeCallbackWithFallback(scoped, "labelColor", this, context)); + labelPointStyles.push(invokeCallbackWithFallback(scoped, "labelPointStyle", this, context)); + labelTextColors.push(invokeCallbackWithFallback(scoped, "labelTextColor", this, context)); + }); + this.labelColors = labelColors; + this.labelPointStyles = labelPointStyles; + this.labelTextColors = labelTextColors; + this.dataPoints = tooltipItems; + return tooltipItems; + } + update(changed, replay) { + const options = this.options.setContext(this.getContext()); + const active = this._active; + let properties; + let tooltipItems = []; + if (!active.length) { + if (this.opacity !== 0) { + properties = { + opacity: 0 + }; + } + } else { + const position = positioners[options.position].call(this, active, this._eventPosition); + tooltipItems = this._createItems(options); + this.title = this.getTitle(tooltipItems, options); + this.beforeBody = this.getBeforeBody(tooltipItems, options); + this.body = this.getBody(tooltipItems, options); + this.afterBody = this.getAfterBody(tooltipItems, options); + this.footer = this.getFooter(tooltipItems, options); + const size = this._size = getTooltipSize(this, options); + const positionAndSize = Object.assign({}, position, size); + const alignment = determineAlignment(this.chart, options, positionAndSize); + const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart); + this.xAlign = alignment.xAlign; + this.yAlign = alignment.yAlign; + properties = { + opacity: 1, + x: backgroundPoint.x, + y: backgroundPoint.y, + width: size.width, + height: size.height, + caretX: position.x, + caretY: position.y + }; + } + this._tooltipItems = tooltipItems; + this.$context = void 0; + if (properties) { + this._resolveAnimations().update(this, properties); + } + if (changed && options.external) { + options.external.call(this, { + chart: this.chart, + tooltip: this, + replay + }); + } + } + drawCaret(tooltipPoint, ctx, size, options) { + const caretPosition = this.getCaretPosition(tooltipPoint, size, options); + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + } + getCaretPosition(tooltipPoint, size, options) { + const { xAlign, yAlign } = this; + const { caretSize, cornerRadius } = options; + const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius); + const { x: ptX, y: ptY } = tooltipPoint; + const { width, height } = size; + let x1, x2, x3, y1, y2, y3; + if (yAlign === "center") { + y2 = ptY + height / 2; + if (xAlign === "left") { + x1 = ptX; + x2 = x1 - caretSize; + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + x3 = x1; + } else { + if (xAlign === "left") { + x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize; + } else if (xAlign === "right") { + x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize; + } else { + x2 = this.caretX; + } + if (yAlign === "top") { + y1 = ptY; + y2 = y1 - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + x1 = x2 + caretSize; + x3 = x2 - caretSize; + } + y3 = y1; + } + return { + x1, + x2, + x3, + y1, + y2, + y3 + }; + } + drawTitle(pt, ctx, options) { + const title = this.title; + const length = title.length; + let titleFont, titleSpacing, i; + if (length) { + const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + pt.x = getAlignedX(this, options.titleAlign, options); + ctx.textAlign = rtlHelper.textAlign(options.titleAlign); + ctx.textBaseline = "middle"; + titleFont = toFont(options.titleFont); + titleSpacing = options.titleSpacing; + ctx.fillStyle = options.titleColor; + ctx.font = titleFont.string; + for (i = 0; i < length; ++i) { + ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2); + pt.y += titleFont.lineHeight + titleSpacing; + if (i + 1 === length) { + pt.y += options.titleMarginBottom - titleSpacing; + } + } + } + } + _drawColorBox(ctx, pt, i, rtlHelper, options) { + const labelColors = this.labelColors[i]; + const labelPointStyle = this.labelPointStyles[i]; + const { boxHeight, boxWidth, boxPadding } = options; + const bodyFont = toFont(options.bodyFont); + const colorX = getAlignedX(this, "left", options); + const rtlColorX = rtlHelper.x(colorX); + const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0; + const colorY = pt.y + yOffSet; + if (options.usePointStyle) { + const drawOptions = { + radius: Math.min(boxWidth, boxHeight) / 2, + pointStyle: labelPointStyle.pointStyle, + rotation: labelPointStyle.rotation, + borderWidth: 1 + }; + const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2; + const centerY = colorY + boxHeight / 2; + ctx.strokeStyle = options.multiKeyBackground; + ctx.fillStyle = options.multiKeyBackground; + drawPoint(ctx, drawOptions, centerX, centerY); + ctx.strokeStyle = labelColors.borderColor; + ctx.fillStyle = labelColors.backgroundColor; + drawPoint(ctx, drawOptions, centerX, centerY); + } else { + ctx.lineWidth = isObject(labelColors.borderWidth) ? Math.max(...Object.values(labelColors.borderWidth)) : labelColors.borderWidth || 1; + ctx.strokeStyle = labelColors.borderColor; + ctx.setLineDash(labelColors.borderDash || []); + ctx.lineDashOffset = labelColors.borderDashOffset || 0; + const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding); + const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2); + const borderRadius = toTRBLCorners(labelColors.borderRadius); + if (Object.values(borderRadius).some((v) => v !== 0)) { + ctx.beginPath(); + ctx.fillStyle = options.multiKeyBackground; + addRoundedRectPath(ctx, { + x: outerX, + y: colorY, + w: boxWidth, + h: boxHeight, + radius: borderRadius + }); + ctx.fill(); + ctx.stroke(); + ctx.fillStyle = labelColors.backgroundColor; + ctx.beginPath(); + addRoundedRectPath(ctx, { + x: innerX, + y: colorY + 1, + w: boxWidth - 2, + h: boxHeight - 2, + radius: borderRadius + }); + ctx.fill(); + } else { + ctx.fillStyle = options.multiKeyBackground; + ctx.fillRect(outerX, colorY, boxWidth, boxHeight); + ctx.strokeRect(outerX, colorY, boxWidth, boxHeight); + ctx.fillStyle = labelColors.backgroundColor; + ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2); + } + } + ctx.fillStyle = this.labelTextColors[i]; + } + drawBody(pt, ctx, options) { + const { body } = this; + const { bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding } = options; + const bodyFont = toFont(options.bodyFont); + let bodyLineHeight = bodyFont.lineHeight; + let xLinePadding = 0; + const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + const fillLineOfText = function(line) { + ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2); + pt.y += bodyLineHeight + bodySpacing; + }; + const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign); + let bodyItem, textColor, lines, i, j, ilen, jlen; + ctx.textAlign = bodyAlign; + ctx.textBaseline = "middle"; + ctx.font = bodyFont.string; + pt.x = getAlignedX(this, bodyAlignForCalculation, options); + ctx.fillStyle = options.bodyColor; + each(this.beforeBody, fillLineOfText); + xLinePadding = displayColors && bodyAlignForCalculation !== "right" ? bodyAlign === "center" ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0; + for (i = 0, ilen = body.length; i < ilen; ++i) { + bodyItem = body[i]; + textColor = this.labelTextColors[i]; + ctx.fillStyle = textColor; + each(bodyItem.before, fillLineOfText); + lines = bodyItem.lines; + if (displayColors && lines.length) { + this._drawColorBox(ctx, pt, i, rtlHelper, options); + bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight); + } + for (j = 0, jlen = lines.length; j < jlen; ++j) { + fillLineOfText(lines[j]); + bodyLineHeight = bodyFont.lineHeight; + } + each(bodyItem.after, fillLineOfText); + } + xLinePadding = 0; + bodyLineHeight = bodyFont.lineHeight; + each(this.afterBody, fillLineOfText); + pt.y -= bodySpacing; + } + drawFooter(pt, ctx, options) { + const footer = this.footer; + const length = footer.length; + let footerFont, i; + if (length) { + const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); + pt.x = getAlignedX(this, options.footerAlign, options); + pt.y += options.footerMarginTop; + ctx.textAlign = rtlHelper.textAlign(options.footerAlign); + ctx.textBaseline = "middle"; + footerFont = toFont(options.footerFont); + ctx.fillStyle = options.footerColor; + ctx.font = footerFont.string; + for (i = 0; i < length; ++i) { + ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2); + pt.y += footerFont.lineHeight + options.footerSpacing; + } + } + } + drawBackground(pt, ctx, tooltipSize, options) { + const { xAlign, yAlign } = this; + const { x, y } = pt; + const { width, height } = tooltipSize; + const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(options.cornerRadius); + ctx.fillStyle = options.backgroundColor; + ctx.strokeStyle = options.borderColor; + ctx.lineWidth = options.borderWidth; + ctx.beginPath(); + ctx.moveTo(x + topLeft, y); + if (yAlign === "top") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x + width - topRight, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + topRight); + if (yAlign === "center" && xAlign === "right") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x + width, y + height - bottomRight); + ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height); + if (yAlign === "bottom") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x + bottomLeft, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft); + if (yAlign === "center" && xAlign === "left") { + this.drawCaret(pt, ctx, tooltipSize, options); + } + ctx.lineTo(x, y + topLeft); + ctx.quadraticCurveTo(x, y, x + topLeft, y); + ctx.closePath(); + ctx.fill(); + if (options.borderWidth > 0) { + ctx.stroke(); + } + } + _updateAnimationTarget(options) { + const chart = this.chart; + const anims = this.$animations; + const animX = anims && anims.x; + const animY = anims && anims.y; + if (animX || animY) { + const position = positioners[options.position].call(this, this._active, this._eventPosition); + if (!position) { + return; + } + const size = this._size = getTooltipSize(this, options); + const positionAndSize = Object.assign({}, position, this._size); + const alignment = determineAlignment(chart, options, positionAndSize); + const point = getBackgroundPoint(options, positionAndSize, alignment, chart); + if (animX._to !== point.x || animY._to !== point.y) { + this.xAlign = alignment.xAlign; + this.yAlign = alignment.yAlign; + this.width = size.width; + this.height = size.height; + this.caretX = position.x; + this.caretY = position.y; + this._resolveAnimations().update(this, point); + } + } + } + _willRender() { + return !!this.opacity; + } + draw(ctx) { + const options = this.options.setContext(this.getContext()); + let opacity = this.opacity; + if (!opacity) { + return; + } + this._updateAnimationTarget(options); + const tooltipSize = { + width: this.width, + height: this.height + }; + const pt = { + x: this.x, + y: this.y + }; + opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity; + const padding = toPadding(options.padding); + const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length; + if (options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + this.drawBackground(pt, ctx, tooltipSize, options); + overrideTextDirection(ctx, options.textDirection); + pt.y += padding.top; + this.drawTitle(pt, ctx, options); + this.drawBody(pt, ctx, options); + this.drawFooter(pt, ctx, options); + restoreTextDirection(ctx, options.textDirection); + ctx.restore(); + } + } + getActiveElements() { + return this._active || []; + } + setActiveElements(activeElements, eventPosition) { + const lastActive = this._active; + const active = activeElements.map(({ datasetIndex, index }) => { + const meta = this.chart.getDatasetMeta(datasetIndex); + if (!meta) { + throw new Error("Cannot find a dataset at index " + datasetIndex); + } + return { + datasetIndex, + element: meta.data[index], + index + }; + }); + const changed = !_elementsEqual(lastActive, active); + const positionChanged = this._positionChanged(active, eventPosition); + if (changed || positionChanged) { + this._active = active; + this._eventPosition = eventPosition; + this._ignoreReplayEvents = true; + this.update(true); + } + } + handleEvent(e, replay, inChartArea = true) { + if (replay && this._ignoreReplayEvents) { + return false; + } + this._ignoreReplayEvents = false; + const options = this.options; + const lastActive = this._active || []; + const active = this._getActiveElements(e, lastActive, replay, inChartArea); + const positionChanged = this._positionChanged(active, e); + const changed = replay || !_elementsEqual(active, lastActive) || positionChanged; + if (changed) { + this._active = active; + if (options.enabled || options.external) { + this._eventPosition = { + x: e.x, + y: e.y + }; + this.update(true, replay); + } + } + return changed; + } + _getActiveElements(e, lastActive, replay, inChartArea) { + const options = this.options; + if (e.type === "mouseout") { + return []; + } + if (!inChartArea) { + return lastActive; + } + const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay); + if (options.reverse) { + active.reverse(); + } + return active; + } + _positionChanged(active, e) { + const { caretX, caretY, options } = this; + const position = positioners[options.position].call(this, active, e); + return position !== false && (caretX !== position.x || caretY !== position.y); + } +}; +__publicField(Tooltip, "positioners", positioners); +var plugin_tooltip = { + id: "tooltip", + _element: Tooltip, + positioners, + afterInit(chart, _args, options) { + if (options) { + chart.tooltip = new Tooltip({ + chart, + options + }); + } + }, + beforeUpdate(chart, _args, options) { + if (chart.tooltip) { + chart.tooltip.initialize(options); + } + }, + reset(chart, _args, options) { + if (chart.tooltip) { + chart.tooltip.initialize(options); + } + }, + afterDraw(chart) { + const tooltip = chart.tooltip; + if (tooltip && tooltip._willRender()) { + const args = { + tooltip + }; + if (chart.notifyPlugins("beforeTooltipDraw", { + ...args, + cancelable: true + }) === false) { + return; + } + tooltip.draw(chart.ctx); + chart.notifyPlugins("afterTooltipDraw", args); + } + }, + afterEvent(chart, args) { + if (chart.tooltip) { + const useFinalPosition = args.replay; + if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) { + args.changed = true; + } + } + }, + defaults: { + enabled: true, + external: null, + position: "average", + backgroundColor: "rgba(0,0,0,0.8)", + titleColor: "#fff", + titleFont: { + weight: "bold" + }, + titleSpacing: 2, + titleMarginBottom: 6, + titleAlign: "left", + bodyColor: "#fff", + bodySpacing: 2, + bodyFont: {}, + bodyAlign: "left", + footerColor: "#fff", + footerSpacing: 2, + footerMarginTop: 6, + footerFont: { + weight: "bold" + }, + footerAlign: "left", + padding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + boxHeight: (ctx, opts) => opts.bodyFont.size, + boxWidth: (ctx, opts) => opts.bodyFont.size, + multiKeyBackground: "#fff", + displayColors: true, + boxPadding: 0, + borderColor: "rgba(0,0,0,0)", + borderWidth: 0, + animation: { + duration: 400, + easing: "easeOutQuart" + }, + animations: { + numbers: { + type: "number", + properties: [ + "x", + "y", + "width", + "height", + "caretX", + "caretY" + ] + }, + opacity: { + easing: "linear", + duration: 200 + } + }, + callbacks: defaultCallbacks + }, + defaultRoutes: { + bodyFont: "font", + footerFont: "font", + titleFont: "font" + }, + descriptors: { + _scriptable: (name2) => name2 !== "filter" && name2 !== "itemSort" && name2 !== "external", + _indexable: false, + callbacks: { + _scriptable: false, + _indexable: false + }, + animation: { + _fallback: false + }, + animations: { + _fallback: "animation" + } + }, + additionalOptionScopes: [ + "interaction" + ] +}; +var addIfString = (labels, raw, index, addedLabels) => { + if (typeof raw === "string") { + index = labels.push(raw) - 1; + addedLabels.unshift({ + index, + label: raw + }); + } else if (isNaN(raw)) { + index = null; + } + return index; +}; +function findOrAddLabel(labels, raw, index, addedLabels) { + const first = labels.indexOf(raw); + if (first === -1) { + return addIfString(labels, raw, index, addedLabels); + } + const last = labels.lastIndexOf(raw); + return first !== last ? index : first; +} +var validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max); +function _getLabelForValue(value) { + const labels = this.getLabels(); + if (value >= 0 && value < labels.length) { + return labels[value]; + } + return value; +} +var CategoryScale = class extends Scale { + constructor(cfg) { + super(cfg); + this._startValue = void 0; + this._valueRange = 0; + this._addedLabels = []; + } + init(scaleOptions) { + const added = this._addedLabels; + if (added.length) { + const labels = this.getLabels(); + for (const { index, label } of added) { + if (labels[index] === label) { + labels.splice(index, 1); + } + } + this._addedLabels = []; + } + super.init(scaleOptions); + } + parse(raw, index) { + if (isNullOrUndef(raw)) { + return null; + } + const labels = this.getLabels(); + index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels); + return validIndex(index, labels.length - 1); + } + determineDataLimits() { + const { minDefined, maxDefined } = this.getUserBounds(); + let { min, max } = this.getMinMax(true); + if (this.options.bounds === "ticks") { + if (!minDefined) { + min = 0; + } + if (!maxDefined) { + max = this.getLabels().length - 1; + } + } + this.min = min; + this.max = max; + } + buildTicks() { + const min = this.min; + const max = this.max; + const offset = this.options.offset; + const ticks = []; + let labels = this.getLabels(); + labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1); + this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1); + this._startValue = this.min - (offset ? 0.5 : 0); + for (let value = min; value <= max; value++) { + ticks.push({ + value + }); + } + return ticks; + } + getLabelForValue(value) { + return _getLabelForValue.call(this, value); + } + configure() { + super.configure(); + if (!this.isHorizontal()) { + this._reversePixels = !this._reversePixels; + } + } + getPixelForValue(value) { + if (typeof value !== "number") { + value = this.parse(value); + } + return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); + } + getPixelForTick(index) { + const ticks = this.ticks; + if (index < 0 || index > ticks.length - 1) { + return null; + } + return this.getPixelForValue(ticks[index].value); + } + getValueForPixel(pixel) { + return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange); + } + getBasePixel() { + return this.bottom; + } +}; +__publicField(CategoryScale, "id", "category"); +__publicField(CategoryScale, "defaults", { + ticks: { + callback: _getLabelForValue + } +}); +function generateTicks$1(generationOptions, dataRange) { + const ticks = []; + const MIN_SPACING = 1e-14; + const { bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds } = generationOptions; + const unit = step || 1; + const maxSpaces = maxTicks - 1; + const { min: rmin, max: rmax } = dataRange; + const minDefined = !isNullOrUndef(min); + const maxDefined = !isNullOrUndef(max); + const countDefined = !isNullOrUndef(count); + const minSpacing = (rmax - rmin) / (maxDigits + 1); + let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit; + let factor, niceMin, niceMax, numSpaces; + if (spacing < MIN_SPACING && !minDefined && !maxDefined) { + return [ + { + value: rmin + }, + { + value: rmax + } + ]; + } + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxSpaces) { + spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit; + } + if (!isNullOrUndef(precision)) { + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + if (bounds === "ticks") { + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + } else { + niceMin = rmin; + niceMax = rmax; + } + if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1e3)) { + numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks)); + spacing = (max - min) / numSpaces; + niceMin = min; + niceMax = max; + } else if (countDefined) { + niceMin = minDefined ? min : niceMin; + niceMax = maxDefined ? max : niceMax; + numSpaces = count - 1; + spacing = (niceMax - niceMin) / numSpaces; + } else { + numSpaces = (niceMax - niceMin) / spacing; + if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1e3)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + } + const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin)); + factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision); + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + let j = 0; + if (minDefined) { + if (includeBounds && niceMin !== min) { + ticks.push({ + value: min + }); + if (niceMin < min) { + j++; + } + if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) { + j++; + } + } else if (niceMin < min) { + j++; + } + } + for (; j < numSpaces; ++j) { + ticks.push({ + value: Math.round((niceMin + j * spacing) * factor) / factor + }); + } + if (maxDefined && includeBounds && niceMax !== max) { + if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) { + ticks[ticks.length - 1].value = max; + } else { + ticks.push({ + value: max + }); + } + } else if (!maxDefined || niceMax === max) { + ticks.push({ + value: niceMax + }); + } + return ticks; +} +function relativeLabelSize(value, minSpacing, { horizontal, minRotation }) { + const rad = toRadians(minRotation); + const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 1e-3; + const length = 0.75 * minSpacing * ("" + value).length; + return Math.min(minSpacing / ratio, length); +} +var LinearScaleBase = class extends Scale { + constructor(cfg) { + super(cfg); + this.start = void 0; + this.end = void 0; + this._startValue = void 0; + this._endValue = void 0; + this._valueRange = 0; + } + parse(raw, index) { + if (isNullOrUndef(raw)) { + return null; + } + if ((typeof raw === "number" || raw instanceof Number) && !isFinite(+raw)) { + return null; + } + return +raw; + } + handleTickRangeOptions() { + const { beginAtZero } = this.options; + const { minDefined, maxDefined } = this.getUserBounds(); + let { min, max } = this; + const setMin = (v) => min = minDefined ? min : v; + const setMax = (v) => max = maxDefined ? max : v; + if (beginAtZero) { + const minSign = sign(min); + const maxSign = sign(max); + if (minSign < 0 && maxSign < 0) { + setMax(0); + } else if (minSign > 0 && maxSign > 0) { + setMin(0); + } + } + if (min === max) { + let offset = max === 0 ? 1 : Math.abs(max * 0.05); + setMax(max + offset); + if (!beginAtZero) { + setMin(min - offset); + } + } + this.min = min; + this.max = max; + } + getTickLimit() { + const tickOpts = this.options.ticks; + let { maxTicksLimit, stepSize } = tickOpts; + let maxTicks; + if (stepSize) { + maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1; + if (maxTicks > 1e3) { + console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`); + maxTicks = 1e3; + } + } else { + maxTicks = this.computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + return maxTicks; + } + computeTickLimit() { + return Number.POSITIVE_INFINITY; + } + buildTicks() { + const opts = this.options; + const tickOpts = opts.ticks; + let maxTicks = this.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + const numericGeneratorOptions = { + maxTicks, + bounds: opts.bounds, + min: opts.min, + max: opts.max, + precision: tickOpts.precision, + step: tickOpts.stepSize, + count: tickOpts.count, + maxDigits: this._maxDigits(), + horizontal: this.isHorizontal(), + minRotation: tickOpts.minRotation || 0, + includeBounds: tickOpts.includeBounds !== false + }; + const dataRange = this._range || this; + const ticks = generateTicks$1(numericGeneratorOptions, dataRange); + if (opts.bounds === "ticks") { + _setMinAndMaxByKey(ticks, this, "value"); + } + if (opts.reverse) { + ticks.reverse(); + this.start = this.max; + this.end = this.min; + } else { + this.start = this.min; + this.end = this.max; + } + return ticks; + } + configure() { + const ticks = this.ticks; + let start = this.min; + let end = this.max; + super.configure(); + if (this.options.offset && ticks.length) { + const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2; + start -= offset; + end += offset; + } + this._startValue = start; + this._endValue = end; + this._valueRange = end - start; + } + getLabelForValue(value) { + return formatNumber(value, this.chart.options.locale, this.options.ticks.format); + } +}; +var LinearScale = class extends LinearScaleBase { + determineDataLimits() { + const { min, max } = this.getMinMax(true); + this.min = isNumberFinite(min) ? min : 0; + this.max = isNumberFinite(max) ? max : 1; + this.handleTickRangeOptions(); + } + computeTickLimit() { + const horizontal = this.isHorizontal(); + const length = horizontal ? this.width : this.height; + const minRotation = toRadians(this.options.ticks.minRotation); + const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 1e-3; + const tickFont = this._resolveTickFontOptions(0); + return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio)); + } + getPixelForValue(value) { + return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); + } + getValueForPixel(pixel) { + return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange; + } +}; +__publicField(LinearScale, "id", "linear"); +__publicField(LinearScale, "defaults", { + ticks: { + callback: Ticks.formatters.numeric + } +}); +var log10Floor = (v) => Math.floor(log10(v)); +var changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m); +function isMajor(tickVal) { + const remain = tickVal / Math.pow(10, log10Floor(tickVal)); + return remain === 1; +} +function steps(min, max, rangeExp) { + const rangeStep = Math.pow(10, rangeExp); + const start = Math.floor(min / rangeStep); + const end = Math.ceil(max / rangeStep); + return end - start; +} +function startExp(min, max) { + const range = max - min; + let rangeExp = log10Floor(range); + while (steps(min, max, rangeExp) > 10) { + rangeExp++; + } + while (steps(min, max, rangeExp) < 10) { + rangeExp--; + } + return Math.min(rangeExp, log10Floor(min)); +} +function generateTicks(generationOptions, { min, max }) { + min = finiteOrDefault(generationOptions.min, min); + const ticks = []; + const minExp = log10Floor(min); + let exp = startExp(min, max); + let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + const stepSize = Math.pow(10, exp); + const base = minExp > exp ? Math.pow(10, minExp) : 0; + const start = Math.round((min - base) * precision) / precision; + const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10; + let significand = Math.floor((start - offset) / Math.pow(10, exp)); + let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision); + while (value < max) { + ticks.push({ + value, + major: isMajor(value), + significand + }); + if (significand >= 10) { + significand = significand < 15 ? 15 : 20; + } else { + significand++; + } + if (significand >= 20) { + exp++; + significand = 2; + precision = exp >= 0 ? 1 : precision; + } + value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision; + } + const lastTick = finiteOrDefault(generationOptions.max, value); + ticks.push({ + value: lastTick, + major: isMajor(lastTick), + significand + }); + return ticks; +} +var LogarithmicScale = class extends Scale { + constructor(cfg) { + super(cfg); + this.start = void 0; + this.end = void 0; + this._startValue = void 0; + this._valueRange = 0; + } + parse(raw, index) { + const value = LinearScaleBase.prototype.parse.apply(this, [ + raw, + index + ]); + if (value === 0) { + this._zero = true; + return void 0; + } + return isNumberFinite(value) && value > 0 ? value : null; + } + determineDataLimits() { + const { min, max } = this.getMinMax(true); + this.min = isNumberFinite(min) ? Math.max(0, min) : null; + this.max = isNumberFinite(max) ? Math.max(0, max) : null; + if (this.options.beginAtZero) { + this._zero = true; + } + if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) { + this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0); + } + this.handleTickRangeOptions(); + } + handleTickRangeOptions() { + const { minDefined, maxDefined } = this.getUserBounds(); + let min = this.min; + let max = this.max; + const setMin = (v) => min = minDefined ? min : v; + const setMax = (v) => max = maxDefined ? max : v; + if (min === max) { + if (min <= 0) { + setMin(1); + setMax(10); + } else { + setMin(changeExponent(min, -1)); + setMax(changeExponent(max, 1)); + } + } + if (min <= 0) { + setMin(changeExponent(max, -1)); + } + if (max <= 0) { + setMax(changeExponent(min, 1)); + } + this.min = min; + this.max = max; + } + buildTicks() { + const opts = this.options; + const generationOptions = { + min: this._userMin, + max: this._userMax + }; + const ticks = generateTicks(generationOptions, this); + if (opts.bounds === "ticks") { + _setMinAndMaxByKey(ticks, this, "value"); + } + if (opts.reverse) { + ticks.reverse(); + this.start = this.max; + this.end = this.min; + } else { + this.start = this.min; + this.end = this.max; + } + return ticks; + } + getLabelForValue(value) { + return value === void 0 ? "0" : formatNumber(value, this.chart.options.locale, this.options.ticks.format); + } + configure() { + const start = this.min; + super.configure(); + this._startValue = log10(start); + this._valueRange = log10(this.max) - log10(start); + } + getPixelForValue(value) { + if (value === void 0 || value === 0) { + value = this.min; + } + if (value === null || isNaN(value)) { + return NaN; + } + return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange); + } + getValueForPixel(pixel) { + const decimal = this.getDecimalForPixel(pixel); + return Math.pow(10, this._startValue + decimal * this._valueRange); + } +}; +__publicField(LogarithmicScale, "id", "logarithmic"); +__publicField(LogarithmicScale, "defaults", { + ticks: { + callback: Ticks.formatters.logarithmic, + major: { + enabled: true + } + } +}); +function getTickBackdropHeight(opts) { + const tickOpts = opts.ticks; + if (tickOpts.display && opts.display) { + const padding = toPadding(tickOpts.backdropPadding); + return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height; + } + return 0; +} +function measureLabelSize(ctx, font, label) { + label = isArray(label) ? label : [ + label + ]; + return { + w: _longestText(ctx, font.string, label), + h: label.length * font.lineHeight + }; +} +function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - size / 2, + end: pos + size / 2 + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + return { + start: pos, + end: pos + size + }; +} +function fitWithPointLabels(scale) { + const orig = { + l: scale.left + scale._padding.left, + r: scale.right - scale._padding.right, + t: scale.top + scale._padding.top, + b: scale.bottom - scale._padding.bottom + }; + const limits = Object.assign({}, orig); + const labelSizes = []; + const padding = []; + const valueCount = scale._pointLabels.length; + const pointLabelOpts = scale.options.pointLabels; + const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0; + for (let i = 0; i < valueCount; i++) { + const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i)); + padding[i] = opts.padding; + const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle); + const plFont = toFont(opts.font); + const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]); + labelSizes[i] = textSize; + const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle); + const angle = Math.round(toDegrees(angleRadians)); + const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + updateLimits(limits, orig, angleRadians, hLimits, vLimits); + } + scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b); + scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding); +} +function updateLimits(limits, orig, angle, hLimits, vLimits) { + const sin = Math.abs(Math.sin(angle)); + const cos = Math.abs(Math.cos(angle)); + let x = 0; + let y = 0; + if (hLimits.start < orig.l) { + x = (orig.l - hLimits.start) / sin; + limits.l = Math.min(limits.l, orig.l - x); + } else if (hLimits.end > orig.r) { + x = (hLimits.end - orig.r) / sin; + limits.r = Math.max(limits.r, orig.r + x); + } + if (vLimits.start < orig.t) { + y = (orig.t - vLimits.start) / cos; + limits.t = Math.min(limits.t, orig.t - y); + } else if (vLimits.end > orig.b) { + y = (vLimits.end - orig.b) / cos; + limits.b = Math.max(limits.b, orig.b + y); + } +} +function buildPointLabelItems(scale, labelSizes, padding) { + const items = []; + const valueCount = scale._pointLabels.length; + const opts = scale.options; + const extra = getTickBackdropHeight(opts) / 2; + const outerDistance = scale.drawingArea; + const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0; + for (let i = 0; i < valueCount; i++) { + const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle); + const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI))); + const size = labelSizes[i]; + const y = yForAngle(pointLabelPosition.y, size.h, angle); + const textAlign = getTextAlignForAngle(angle); + const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign); + items.push({ + x: pointLabelPosition.x, + y, + textAlign, + left, + top: y, + right: left + size.w, + bottom: y + size.h + }); + } + return items; +} +function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return "center"; + } else if (angle < 180) { + return "left"; + } + return "right"; +} +function leftForTextAlign(x, w, align) { + if (align === "right") { + x -= w; + } else if (align === "center") { + x -= w / 2; + } + return x; +} +function yForAngle(y, h4, angle) { + if (angle === 90 || angle === 270) { + y -= h4 / 2; + } else if (angle > 270 || angle < 90) { + y -= h4; + } + return y; +} +function drawPointLabels(scale, labelCount) { + const { ctx, options: { pointLabels } } = scale; + for (let i = labelCount - 1; i >= 0; i--) { + const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i)); + const plFont = toFont(optsAtIndex.font); + const { x, y, textAlign, left, top, right, bottom } = scale._pointLabelItems[i]; + const { backdropColor } = optsAtIndex; + if (!isNullOrUndef(backdropColor)) { + const borderRadius = toTRBLCorners(optsAtIndex.borderRadius); + const padding = toPadding(optsAtIndex.backdropPadding); + ctx.fillStyle = backdropColor; + const backdropLeft = left - padding.left; + const backdropTop = top - padding.top; + const backdropWidth = right - left + padding.width; + const backdropHeight = bottom - top + padding.height; + if (Object.values(borderRadius).some((v) => v !== 0)) { + ctx.beginPath(); + addRoundedRectPath(ctx, { + x: backdropLeft, + y: backdropTop, + w: backdropWidth, + h: backdropHeight, + radius: borderRadius + }); + ctx.fill(); + } else { + ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight); + } + } + renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, { + color: optsAtIndex.color, + textAlign, + textBaseline: "middle" + }); + } +} +function pathRadiusLine(scale, radius, circular, labelCount) { + const { ctx } = scale; + if (circular) { + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU); + } else { + let pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + for (let i = 1; i < labelCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } +} +function drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) { + const ctx = scale.ctx; + const circular = gridLineOpts.circular; + const { color: color2, lineWidth } = gridLineOpts; + if (!circular && !labelCount || !color2 || !lineWidth || radius < 0) { + return; + } + ctx.save(); + ctx.strokeStyle = color2; + ctx.lineWidth = lineWidth; + ctx.setLineDash(borderOpts.dash); + ctx.lineDashOffset = borderOpts.dashOffset; + ctx.beginPath(); + pathRadiusLine(scale, radius, circular, labelCount); + ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} +function createPointLabelContext(parent, index, label) { + return createContext(parent, { + label, + index, + type: "pointLabel" + }); +} +var RadialLinearScale = class extends LinearScaleBase { + constructor(cfg) { + super(cfg); + this.xCenter = void 0; + this.yCenter = void 0; + this.drawingArea = void 0; + this._pointLabels = []; + this._pointLabelItems = []; + } + setDimensions() { + const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2); + const w = this.width = this.maxWidth - padding.width; + const h4 = this.height = this.maxHeight - padding.height; + this.xCenter = Math.floor(this.left + w / 2 + padding.left); + this.yCenter = Math.floor(this.top + h4 / 2 + padding.top); + this.drawingArea = Math.floor(Math.min(w, h4) / 2); + } + determineDataLimits() { + const { min, max } = this.getMinMax(false); + this.min = isNumberFinite(min) && !isNaN(min) ? min : 0; + this.max = isNumberFinite(max) && !isNaN(max) ? max : 0; + this.handleTickRangeOptions(); + } + computeTickLimit() { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + } + generateTickLabels(ticks) { + LinearScaleBase.prototype.generateTickLabels.call(this, ticks); + this._pointLabels = this.getLabels().map((value, index) => { + const label = callback(this.options.pointLabels.callback, [ + value, + index + ], this); + return label || label === 0 ? label : ""; + }).filter((v, i) => this.chart.getDataVisibility(i)); + } + fit() { + const opts = this.options; + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(this); + } else { + this.setCenterPoint(0, 0, 0, 0); + } + } + setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) { + this.xCenter += Math.floor((leftMovement - rightMovement) / 2); + this.yCenter += Math.floor((topMovement - bottomMovement) / 2); + this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement)); + } + getIndexAngle(index) { + const angleMultiplier = TAU / (this._pointLabels.length || 1); + const startAngle = this.options.startAngle || 0; + return _normalizeAngle(index * angleMultiplier + toRadians(startAngle)); + } + getDistanceFromCenterForValue(value) { + if (isNullOrUndef(value)) { + return NaN; + } + const scalingFactor = this.drawingArea / (this.max - this.min); + if (this.options.reverse) { + return (this.max - value) * scalingFactor; + } + return (value - this.min) * scalingFactor; + } + getValueForDistanceFromCenter(distance) { + if (isNullOrUndef(distance)) { + return NaN; + } + const scaledDistance = distance / (this.drawingArea / (this.max - this.min)); + return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance; + } + getPointLabelContext(index) { + const pointLabels = this._pointLabels || []; + if (index >= 0 && index < pointLabels.length) { + const pointLabel = pointLabels[index]; + return createPointLabelContext(this.getContext(), index, pointLabel); + } + } + getPointPosition(index, distanceFromCenter, additionalAngle = 0) { + const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle; + return { + x: Math.cos(angle) * distanceFromCenter + this.xCenter, + y: Math.sin(angle) * distanceFromCenter + this.yCenter, + angle + }; + } + getPointPositionForValue(index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + } + getBasePosition(index) { + return this.getPointPositionForValue(index || 0, this.getBaseValue()); + } + getPointLabelPosition(index) { + const { left, top, right, bottom } = this._pointLabelItems[index]; + return { + left, + top, + right, + bottom + }; + } + drawBackground() { + const { backgroundColor, grid: { circular } } = this.options; + if (backgroundColor) { + const ctx = this.ctx; + ctx.save(); + ctx.beginPath(); + pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length); + ctx.closePath(); + ctx.fillStyle = backgroundColor; + ctx.fill(); + ctx.restore(); + } + } + drawGrid() { + const ctx = this.ctx; + const opts = this.options; + const { angleLines, grid, border } = opts; + const labelCount = this._pointLabels.length; + let i, offset, position; + if (opts.pointLabels.display) { + drawPointLabels(this, labelCount); + } + if (grid.display) { + this.ticks.forEach((tick, index) => { + if (index !== 0) { + offset = this.getDistanceFromCenterForValue(tick.value); + const context = this.getContext(index); + const optsAtIndex = grid.setContext(context); + const optsAtIndexBorder = border.setContext(context); + drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder); + } + }); + } + if (angleLines.display) { + ctx.save(); + for (i = labelCount - 1; i >= 0; i--) { + const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i)); + const { color: color2, lineWidth } = optsAtIndex; + if (!lineWidth || !color2) { + continue; + } + ctx.lineWidth = lineWidth; + ctx.strokeStyle = color2; + ctx.setLineDash(optsAtIndex.borderDash); + ctx.lineDashOffset = optsAtIndex.borderDashOffset; + offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max); + position = this.getPointPosition(i, offset); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(position.x, position.y); + ctx.stroke(); + } + ctx.restore(); + } + } + drawBorder() { + } + drawLabels() { + const ctx = this.ctx; + const opts = this.options; + const tickOpts = opts.ticks; + if (!tickOpts.display) { + return; + } + const startAngle = this.getIndexAngle(0); + let offset, width; + ctx.save(); + ctx.translate(this.xCenter, this.yCenter); + ctx.rotate(startAngle); + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + this.ticks.forEach((tick, index) => { + if (index === 0 && !opts.reverse) { + return; + } + const optsAtIndex = tickOpts.setContext(this.getContext(index)); + const tickFont = toFont(optsAtIndex.font); + offset = this.getDistanceFromCenterForValue(this.ticks[index].value); + if (optsAtIndex.showLabelBackdrop) { + ctx.font = tickFont.string; + width = ctx.measureText(tick.label).width; + ctx.fillStyle = optsAtIndex.backdropColor; + const padding = toPadding(optsAtIndex.backdropPadding); + ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height); + } + renderText(ctx, tick.label, 0, -offset, tickFont, { + color: optsAtIndex.color + }); + }); + ctx.restore(); + } + drawTitle() { + } +}; +__publicField(RadialLinearScale, "id", "radialLinear"); +__publicField(RadialLinearScale, "defaults", { + display: true, + animate: true, + position: "chartArea", + angleLines: { + display: true, + lineWidth: 1, + borderDash: [], + borderDashOffset: 0 + }, + grid: { + circular: false + }, + startAngle: 0, + ticks: { + showLabelBackdrop: true, + callback: Ticks.formatters.numeric + }, + pointLabels: { + backdropColor: void 0, + backdropPadding: 2, + display: true, + font: { + size: 10 + }, + callback(label) { + return label; + }, + padding: 5, + centerPointLabels: false + } +}); +__publicField(RadialLinearScale, "defaultRoutes", { + "angleLines.color": "borderColor", + "pointLabels.color": "color", + "ticks.color": "color" +}); +__publicField(RadialLinearScale, "descriptors", { + angleLines: { + _fallback: "grid" + } +}); +var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: 1e3 + }, + second: { + common: true, + size: 1e3, + steps: 60 + }, + minute: { + common: true, + size: 6e4, + steps: 60 + }, + hour: { + common: true, + size: 36e5, + steps: 24 + }, + day: { + common: true, + size: 864e5, + steps: 30 + }, + week: { + common: false, + size: 6048e5, + steps: 4 + }, + month: { + common: true, + size: 2628e6, + steps: 12 + }, + quarter: { + common: false, + size: 7884e6, + steps: 4 + }, + year: { + common: true, + size: 3154e7 + } +}; +var UNITS = /* @__PURE__ */ Object.keys(INTERVALS); +function sorter(a, b) { + return a - b; +} +function parse(scale, input) { + if (isNullOrUndef(input)) { + return null; + } + const adapter = scale._adapter; + const { parser, round: round2, isoWeekday } = scale._parseOpts; + let value = input; + if (typeof parser === "function") { + value = parser(value); + } + if (!isNumberFinite(value)) { + value = typeof parser === "string" ? adapter.parse(value, parser) : adapter.parse(value); + } + if (value === null) { + return null; + } + if (round2) { + value = round2 === "week" && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, "isoWeek", isoWeekday) : adapter.startOf(value, round2); + } + return +value; +} +function determineUnitForAutoTicks(minUnit, min, max, capacity) { + const ilen = UNITS.length; + for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + const interval = INTERVALS[UNITS[i]]; + const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER; + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + return UNITS[ilen - 1]; +} +function determineUnitForFormatting(scale, numTicks, minUnit, min, max) { + for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) { + const unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) { + return unit; + } + } + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; +} +function determineMajorUnit(unit) { + for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } +} +function addTick(ticks, time, timestamps) { + if (!timestamps) { + ticks[time] = true; + } else if (timestamps.length) { + const { lo, hi } = _lookup(timestamps, time); + const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi]; + ticks[timestamp] = true; + } +} +function setMajorTicks(scale, ticks, map3, majorUnit) { + const adapter = scale._adapter; + const first = +adapter.startOf(ticks[0].value, majorUnit); + const last = ticks[ticks.length - 1].value; + let major, index; + for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) { + index = map3[major]; + if (index >= 0) { + ticks[index].major = true; + } + } + return ticks; +} +function ticksFromTimestamps(scale, values, majorUnit) { + const ticks = []; + const map3 = {}; + const ilen = values.length; + let i, value; + for (i = 0; i < ilen; ++i) { + value = values[i]; + map3[value] = i; + ticks.push({ + value, + major: false + }); + } + return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map3, majorUnit); +} +var TimeScale = class extends Scale { + constructor(props) { + super(props); + this._cache = { + data: [], + labels: [], + all: [] + }; + this._unit = "day"; + this._majorUnit = void 0; + this._offsets = {}; + this._normalized = false; + this._parseOpts = void 0; + } + init(scaleOpts, opts = {}) { + const time = scaleOpts.time || (scaleOpts.time = {}); + const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date); + adapter.init(opts); + mergeIf(time.displayFormats, adapter.formats()); + this._parseOpts = { + parser: time.parser, + round: time.round, + isoWeekday: time.isoWeekday + }; + super.init(scaleOpts); + this._normalized = opts.normalized; + } + parse(raw, index) { + if (raw === void 0) { + return null; + } + return parse(this, raw); + } + beforeLayout() { + super.beforeLayout(); + this._cache = { + data: [], + labels: [], + all: [] + }; + } + determineDataLimits() { + const options = this.options; + const adapter = this._adapter; + const unit = options.time.unit || "day"; + let { min, max, minDefined, maxDefined } = this.getUserBounds(); + function _applyBounds(bounds) { + if (!minDefined && !isNaN(bounds.min)) { + min = Math.min(min, bounds.min); + } + if (!maxDefined && !isNaN(bounds.max)) { + max = Math.max(max, bounds.max); + } + } + if (!minDefined || !maxDefined) { + _applyBounds(this._getLabelBounds()); + if (options.bounds !== "ticks" || options.ticks.source !== "labels") { + _applyBounds(this.getMinMax(false)); + } + } + min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit); + max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1; + this.min = Math.min(min, max - 1); + this.max = Math.max(min + 1, max); + } + _getLabelBounds() { + const arr = this.getLabelTimestamps(); + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + if (arr.length) { + min = arr[0]; + max = arr[arr.length - 1]; + } + return { + min, + max + }; + } + buildTicks() { + const options = this.options; + const timeOpts = options.time; + const tickOpts = options.ticks; + const timestamps = tickOpts.source === "labels" ? this.getLabelTimestamps() : this._generate(); + if (options.bounds === "ticks" && timestamps.length) { + this.min = this._userMin || timestamps[0]; + this.max = this._userMax || timestamps[timestamps.length - 1]; + } + const min = this.min; + const max = this.max; + const ticks = _filterBetween(timestamps, min, max); + this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max)); + this._majorUnit = !tickOpts.major.enabled || this._unit === "year" ? void 0 : determineMajorUnit(this._unit); + this.initOffsets(timestamps); + if (options.reverse) { + ticks.reverse(); + } + return ticksFromTimestamps(this, ticks, this._majorUnit); + } + afterAutoSkip() { + if (this.options.offsetAfterAutoskip) { + this.initOffsets(this.ticks.map((tick) => +tick.value)); + } + } + initOffsets(timestamps = []) { + let start = 0; + let end = 0; + let first, last; + if (this.options.offset && timestamps.length) { + first = this.getDecimalForValue(timestamps[0]); + if (timestamps.length === 1) { + start = 1 - first; + } else { + start = (this.getDecimalForValue(timestamps[1]) - first) / 2; + } + last = this.getDecimalForValue(timestamps[timestamps.length - 1]); + if (timestamps.length === 1) { + end = last; + } else { + end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2; + } + } + const limit = timestamps.length < 3 ? 0.5 : 0.25; + start = _limitValue(start, 0, limit); + end = _limitValue(end, 0, limit); + this._offsets = { + start, + end, + factor: 1 / (start + 1 + end) + }; + } + _generate() { + const adapter = this._adapter; + const min = this.min; + const max = this.max; + const options = this.options; + const timeOpts = options.time; + const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min)); + const stepSize = valueOrDefault(options.ticks.stepSize, 1); + const weekday = minor === "week" ? timeOpts.isoWeekday : false; + const hasWeekday = isNumber(weekday) || weekday === true; + const ticks = {}; + let first = min; + let time, count; + if (hasWeekday) { + first = +adapter.startOf(first, "isoWeek", weekday); + } + first = +adapter.startOf(first, hasWeekday ? "day" : minor); + if (adapter.diff(max, min, minor) > 1e5 * stepSize) { + throw new Error(min + " and " + max + " are too far apart with stepSize of " + stepSize + " " + minor); + } + const timestamps = options.ticks.source === "data" && this.getDataTimestamps(); + for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) { + addTick(ticks, time, timestamps); + } + if (time === max || options.bounds === "ticks" || count === 1) { + addTick(ticks, time, timestamps); + } + return Object.keys(ticks).sort((a, b) => a - b).map((x) => +x); + } + getLabelForValue(value) { + const adapter = this._adapter; + const timeOpts = this.options.time; + if (timeOpts.tooltipFormat) { + return adapter.format(value, timeOpts.tooltipFormat); + } + return adapter.format(value, timeOpts.displayFormats.datetime); + } + format(value, format) { + const options = this.options; + const formats = options.time.displayFormats; + const unit = this._unit; + const fmt = format || formats[unit]; + return this._adapter.format(value, fmt); + } + _tickFormatFunction(time, index, ticks, format) { + const options = this.options; + const formatter = options.ticks.callback; + if (formatter) { + return callback(formatter, [ + time, + index, + ticks + ], this); + } + const formats = options.time.displayFormats; + const unit = this._unit; + const majorUnit = this._majorUnit; + const minorFormat = unit && formats[unit]; + const majorFormat = majorUnit && formats[majorUnit]; + const tick = ticks[index]; + const major = majorUnit && majorFormat && tick && tick.major; + return this._adapter.format(time, format || (major ? majorFormat : minorFormat)); + } + generateTickLabels(ticks) { + let i, ilen, tick; + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + tick = ticks[i]; + tick.label = this._tickFormatFunction(tick.value, i, ticks); + } + } + getDecimalForValue(value) { + return value === null ? NaN : (value - this.min) / (this.max - this.min); + } + getPixelForValue(value) { + const offsets = this._offsets; + const pos = this.getDecimalForValue(value); + return this.getPixelForDecimal((offsets.start + pos) * offsets.factor); + } + getValueForPixel(pixel) { + const offsets = this._offsets; + const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; + return this.min + pos * (this.max - this.min); + } + _getLabelSize(label) { + const ticksOpts = this.options.ticks; + const tickLabelWidth = this.ctx.measureText(label).width; + const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation); + const cosRotation = Math.cos(angle); + const sinRotation = Math.sin(angle); + const tickFontSize = this._resolveTickFontOptions(0).size; + return { + w: tickLabelWidth * cosRotation + tickFontSize * sinRotation, + h: tickLabelWidth * sinRotation + tickFontSize * cosRotation + }; + } + _getLabelCapacity(exampleTime) { + const timeOpts = this.options.time; + const displayFormats = timeOpts.displayFormats; + const format = displayFormats[timeOpts.unit] || displayFormats.millisecond; + const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [ + exampleTime + ], this._majorUnit), format); + const size = this._getLabelSize(exampleLabel); + const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1; + return capacity > 0 ? capacity : 1; + } + getDataTimestamps() { + let timestamps = this._cache.data || []; + let i, ilen; + if (timestamps.length) { + return timestamps; + } + const metas = this.getMatchingVisibleMetas(); + if (this._normalized && metas.length) { + return this._cache.data = metas[0].controller.getAllParsedValues(this); + } + for (i = 0, ilen = metas.length; i < ilen; ++i) { + timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this)); + } + return this._cache.data = this.normalize(timestamps); + } + getLabelTimestamps() { + const timestamps = this._cache.labels || []; + let i, ilen; + if (timestamps.length) { + return timestamps; + } + const labels = this.getLabels(); + for (i = 0, ilen = labels.length; i < ilen; ++i) { + timestamps.push(parse(this, labels[i])); + } + return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps); + } + normalize(values) { + return _arrayUnique(values.sort(sorter)); + } +}; +__publicField(TimeScale, "id", "time"); +__publicField(TimeScale, "defaults", { + bounds: "data", + adapters: {}, + time: { + parser: false, + unit: false, + round: false, + isoWeekday: false, + minUnit: "millisecond", + displayFormats: {} + }, + ticks: { + source: "auto", + callback: false, + major: { + enabled: false + } + } +}); +function interpolate3(table, val, reverse) { + let lo = 0; + let hi = table.length - 1; + let prevSource, nextSource, prevTarget, nextTarget; + if (reverse) { + if (val >= table[lo].pos && val <= table[hi].pos) { + ({ lo, hi } = _lookupByKey(table, "pos", val)); + } + ({ pos: prevSource, time: prevTarget } = table[lo]); + ({ pos: nextSource, time: nextTarget } = table[hi]); + } else { + if (val >= table[lo].time && val <= table[hi].time) { + ({ lo, hi } = _lookupByKey(table, "time", val)); + } + ({ time: prevSource, pos: prevTarget } = table[lo]); + ({ time: nextSource, pos: nextTarget } = table[hi]); + } + const span = nextSource - prevSource; + return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget; +} +var TimeSeriesScale = class extends TimeScale { + constructor(props) { + super(props); + this._table = []; + this._minPos = void 0; + this._tableRange = void 0; + } + initOffsets() { + const timestamps = this._getTimestampsForTable(); + const table = this._table = this.buildLookupTable(timestamps); + this._minPos = interpolate3(table, this.min); + this._tableRange = interpolate3(table, this.max) - this._minPos; + super.initOffsets(timestamps); + } + buildLookupTable(timestamps) { + const { min, max } = this; + const items = []; + const table = []; + let i, ilen, prev, curr, next; + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr >= min && curr <= max) { + items.push(curr); + } + } + if (items.length < 2) { + return [ + { + time: min, + pos: 0 + }, + { + time: max, + pos: 1 + } + ]; + } + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + if (Math.round((next + prev) / 2) !== curr) { + table.push({ + time: curr, + pos: i / (ilen - 1) + }); + } + } + return table; + } + _getTimestampsForTable() { + let timestamps = this._cache.all || []; + if (timestamps.length) { + return timestamps; + } + const data = this.getDataTimestamps(); + const label = this.getLabelTimestamps(); + if (data.length && label.length) { + timestamps = this.normalize(data.concat(label)); + } else { + timestamps = data.length ? data : label; + } + timestamps = this._cache.all = timestamps; + return timestamps; + } + getDecimalForValue(value) { + return (interpolate3(this._table, value) - this._minPos) / this._tableRange; + } + getValueForPixel(pixel) { + const offsets = this._offsets; + const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; + return interpolate3(this._table, decimal * this._tableRange + this._minPos, true); + } +}; +__publicField(TimeSeriesScale, "id", "timeseries"); +__publicField(TimeSeriesScale, "defaults", TimeScale.defaults); + +// src/stats-modal.tsx +Chart.register( + BarElement, + BarController, + plugin_legend, + plugin_title, + plugin_tooltip, + plugin_subtitle, + CategoryScale, + LinearScale, + PieController, + ArcElement +); +var StatsModal = class extends import_obsidian4.Modal { + constructor(app2, plugin) { + super(app2); + this.plugin = plugin; + this.titleEl.setText(`${t("STATS_TITLE")} `); + this.titleEl.addClass("sr-centered"); + this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("select", { id: "sr-chart-period" }, /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "month", selected: true }, t("MONTH")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "quarter" }, t("QUARTER")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "year" }, t("YEAR")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "lifetime" }, t("LIFETIME"))); + this.modalEl.style.height = "100%"; + this.modalEl.style.width = "100%"; + if (import_obsidian4.Platform.isMobile) { + this.contentEl.style.display = "block"; + } + } + onOpen() { + const { contentEl } = this; + contentEl.style.textAlign = "center"; + let maxN = Math.max(...getKeysPreserveType(this.plugin.dueDatesFlashcards)); + for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) { + if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesFlashcards, dueOffset)) { + this.plugin.dueDatesFlashcards[dueOffset] = 0; + } + } + const dueDatesFlashcardsCopy = { 0: 0 }; + for (const [dueOffset, dueCount] of getTypedObjectEntries(this.plugin.dueDatesFlashcards)) { + if (dueOffset <= 0) { + dueDatesFlashcardsCopy[0] += dueCount; + } else { + dueDatesFlashcardsCopy[dueOffset] = dueCount; + } + } + const cardStats = this.plugin.cardStats; + const scheduledCount = cardStats.youngCount + cardStats.matureCount; + maxN = Math.max(maxN, 1); + contentEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("div", null, /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "forecastChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "forecastChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "intervalsChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "intervalsChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "easesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "easesChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "cardTypesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "cardTypesChartSummary" })); + createStatsChart( + "bar", + "forecastChart", + t("FORECAST"), + t("FORECAST_DESC"), + Object.keys(dueDatesFlashcardsCopy), + Object.values(dueDatesFlashcardsCopy), + t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }), + t("SCHEDULED"), + t("DAYS"), + t("NUMBER_OF_CARDS") + ); + maxN = Math.max(...getKeysPreserveType(cardStats.intervals)); + for (let interval = 0; interval <= maxN; interval++) { + if (!Object.prototype.hasOwnProperty.call(cardStats.intervals, interval)) { + cardStats.intervals[interval] = 0; + } + } + const average_interval = textInterval( + Math.round( + getTypedObjectEntries(cardStats.intervals).map(([interval, count]) => interval * count).reduce((a, b) => a + b, 0) / scheduledCount * 10 + ) / 10 || 0, + false + ), longest_interval = textInterval( + Math.max(...getKeysPreserveType(cardStats.intervals)) || 0, + false + ); + createStatsChart( + "bar", + "intervalsChart", + t("INTERVALS"), + t("INTERVALS_DESC"), + Object.keys(cardStats.intervals), + Object.values(cardStats.intervals), + t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }), + t("COUNT"), + t("DAYS"), + t("NUMBER_OF_CARDS") + ); + const eases = getKeysPreserveType(cardStats.eases); + for (let ease = Math.min(...eases); ease <= Math.max(...eases); ease++) { + if (!Object.prototype.hasOwnProperty.call(cardStats.eases, ease)) { + cardStats.eases[ease] = 0; + } + } + const average_ease = Math.round( + getTypedObjectEntries(cardStats.eases).map(([ease, count]) => ease * count).reduce((a, b) => a + b, 0) / scheduledCount + ) || 0; + createStatsChart( + "bar", + "easesChart", + t("EASES"), + "", + Object.keys(cardStats.eases), + Object.values(cardStats.eases), + t("EASES_SUMMARY", { avgEase: average_ease }), + t("COUNT"), + t("EASES"), + t("NUMBER_OF_CARDS") + ); + const totalCardsCount = this.plugin.deckTree.totalFlashcards; + createStatsChart( + "pie", + "cardTypesChart", + t("CARD_TYPES"), + t("CARD_TYPES_DESC"), + [ + `${t("CARD_TYPE_NEW")} - ${Math.round( + cardStats.newCount / totalCardsCount * 100 + )}%`, + `${t("CARD_TYPE_YOUNG")} - ${Math.round( + cardStats.youngCount / totalCardsCount * 100 + )}%`, + `${t("CARD_TYPE_MATURE")} - ${Math.round( + cardStats.matureCount / totalCardsCount * 100 + )}%` + ], + [cardStats.newCount, cardStats.youngCount, cardStats.matureCount], + t("CARD_TYPES_SUMMARY", { totalCardsCount }) + ); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +}; +function createStatsChart(type, canvasId, title, subtitle, labels, data, summary, seriesTitle = "", xAxisTitle = "", yAxisTitle = "") { + const style = getComputedStyle(document.body); + const textColor = style.getPropertyValue("--text-normal"); + let scales = {}, backgroundColor = ["#2196f3"]; + if (type !== "pie") { + scales = { + x: { + title: { + display: true, + text: xAxisTitle, + color: textColor + } + }, + y: { + title: { + display: true, + text: yAxisTitle, + color: textColor + } + } + }; + } else { + backgroundColor = ["#2196f3", "#4caf50", "green"]; + } + const shouldFilter = canvasId === "forecastChart" || canvasId === "intervalsChart"; + const statsChart = new Chart(document.getElementById(canvasId), { + type, + data: { + labels: shouldFilter ? labels.slice(0, 31) : labels, + datasets: [ + { + label: seriesTitle, + backgroundColor, + data: shouldFilter ? data.slice(0, 31) : data + } + ] + }, + options: { + scales, + plugins: { + title: { + display: true, + text: title, + font: { + size: 22 + }, + color: textColor + }, + subtitle: { + display: true, + text: subtitle, + font: { + size: 16, + style: "italic" + }, + color: textColor + }, + legend: { + display: false + } + }, + aspectRatio: 2 + } + }); + if (shouldFilter) { + const chartPeriodEl = document.getElementById("sr-chart-period"); + chartPeriodEl.addEventListener("click", () => { + let filteredLabels, filteredData; + const chartPeriod = chartPeriodEl.value; + if (chartPeriod === "month") { + filteredLabels = labels.slice(0, 31); + filteredData = data.slice(0, 31); + } else if (chartPeriod === "quarter") { + filteredLabels = labels.slice(0, 91); + filteredData = data.slice(0, 91); + } else if (chartPeriod === "year") { + filteredLabels = labels.slice(0, 366); + filteredData = data.slice(0, 366); + } else { + filteredLabels = labels; + filteredData = data; + } + statsChart.data.labels = filteredLabels; + statsChart.data.datasets[0] = { + label: seriesTitle, + backgroundColor, + data: filteredData + }; + statsChart.update(); + }); + } + document.getElementById(`${canvasId}Summary`).innerText = summary; +} + +// src/sidebar.ts +var import_obsidian5 = require("obsidian"); +var REVIEW_QUEUE_VIEW_TYPE = "review-queue-list-view"; +var ReviewQueueListView = class extends import_obsidian5.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.plugin = plugin; + this.registerEvent(this.app.workspace.on("file-open", () => this.redraw())); + this.registerEvent(this.app.vault.on("rename", () => this.redraw())); + } + getViewType() { + return REVIEW_QUEUE_VIEW_TYPE; + } + getDisplayText() { + return t("NOTES_REVIEW_QUEUE"); + } + getIcon() { + return "SpacedRepIcon"; + } + onHeaderMenu(menu) { + menu.addItem((item) => { + item.setTitle(t("CLOSE")).setIcon("cross").onClick(() => { + this.app.workspace.detachLeavesOfType(REVIEW_QUEUE_VIEW_TYPE); + }); + }); + } + redraw() { + const activeFile = this.app.workspace.getActiveFile(); + const rootEl = createDiv("nav-folder mod-root"); + const childrenEl = rootEl.createDiv("nav-folder-children"); + for (const deckKey in this.plugin.reviewDecks) { + const deck = this.plugin.reviewDecks[deckKey]; + const deckCollapsed = !deck.activeFolders.has(deck.deckName); + const deckFolderEl = this.createRightPaneFolder( + childrenEl, + deckKey, + deckCollapsed, + false, + deck + ).getElementsByClassName("nav-folder-children")[0]; + if (deck.newNotes.length > 0) { + const newNotesFolderEl = this.createRightPaneFolder( + deckFolderEl, + t("NEW"), + !deck.activeFolders.has(t("NEW")), + deckCollapsed, + deck + ); + for (const newFile of deck.newNotes) { + const fileIsOpen = activeFile && newFile.path === activeFile.path; + if (fileIsOpen) { + deck.activeFolders.add(deck.deckName); + deck.activeFolders.add(t("NEW")); + this.changeFolderIconToExpanded(newNotesFolderEl); + this.changeFolderIconToExpanded(deckFolderEl); + } + this.createRightPaneFile( + newNotesFolderEl, + newFile, + fileIsOpen, + !deck.activeFolders.has(t("NEW")), + deck, + this.plugin + ); + } + } + if (deck.scheduledNotes.length > 0) { + const now = Date.now(); + let currUnix = -1; + let schedFolderEl = null, folderTitle = ""; + const maxDaysToRender = this.plugin.data.settings.maxNDaysNotesReviewQueue; + for (const sNote of deck.scheduledNotes) { + if (sNote.dueUnix != currUnix) { + const nDays = Math.ceil((sNote.dueUnix - now) / (24 * 3600 * 1e3)); + if (nDays > maxDaysToRender) { + break; + } + if (nDays === -1) { + folderTitle = t("YESTERDAY"); + } else if (nDays === 0) { + folderTitle = t("TODAY"); + } else if (nDays === 1) { + folderTitle = t("TOMORROW"); + } else { + folderTitle = new Date(sNote.dueUnix).toDateString(); + } + schedFolderEl = this.createRightPaneFolder( + deckFolderEl, + folderTitle, + !deck.activeFolders.has(folderTitle), + deckCollapsed, + deck + ); + currUnix = sNote.dueUnix; + } + const fileIsOpen = activeFile && sNote.note.path === activeFile.path; + if (fileIsOpen) { + deck.activeFolders.add(deck.deckName); + deck.activeFolders.add(folderTitle); + this.changeFolderIconToExpanded(schedFolderEl); + this.changeFolderIconToExpanded(deckFolderEl); + } + this.createRightPaneFile( + schedFolderEl, + sNote.note, + fileIsOpen, + !deck.activeFolders.has(folderTitle), + deck, + this.plugin + ); + } + } + } + const contentEl = this.containerEl.children[1]; + contentEl.empty(); + contentEl.appendChild(rootEl); + } + createRightPaneFolder(parentEl, folderTitle, collapsed, hidden, deck) { + const folderEl = parentEl.createDiv("nav-folder"); + const folderTitleEl = folderEl.createDiv("nav-folder-title"); + const childrenEl = folderEl.createDiv("nav-folder-children"); + const collapseIconEl = folderTitleEl.createDiv( + "nav-folder-collapse-indicator collapse-icon" + ); + collapseIconEl.innerHTML = COLLAPSE_ICON; + if (collapsed) { + collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; + } + folderTitleEl.createDiv("nav-folder-title-content").setText(folderTitle); + if (hidden) { + folderEl.style.display = "none"; + } + folderTitleEl.onClickEvent(() => { + for (const child of childrenEl.childNodes) { + if (child.style.display === "block" || child.style.display === "") { + child.style.display = "none"; + collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; + deck.activeFolders.delete(folderTitle); + } else { + child.style.display = "block"; + collapseIconEl.childNodes[0].style.transform = ""; + deck.activeFolders.add(folderTitle); + } + } + }); + return folderEl; + } + createRightPaneFile(folderEl, file, fileElActive, hidden, deck, plugin) { + const navFileEl = folderEl.getElementsByClassName("nav-folder-children")[0].createDiv("nav-file"); + if (hidden) { + navFileEl.style.display = "none"; + } + const navFileTitle = navFileEl.createDiv("nav-file-title"); + if (fileElActive) { + navFileTitle.addClass("is-active"); + } + navFileTitle.createDiv("nav-file-title-content").setText(file.basename); + navFileTitle.addEventListener( + "click", + async (event) => { + event.preventDefault(); + plugin.lastSelectedReviewDeck = deck.deckName; + await this.app.workspace.getLeaf().openFile(file); + return false; + }, + false + ); + navFileTitle.addEventListener( + "contextmenu", + (event) => { + event.preventDefault(); + const fileMenu = new import_obsidian5.Menu(); + this.app.workspace.trigger("file-menu", fileMenu, file, "my-context-menu", null); + fileMenu.showAtPosition({ + x: event.pageX, + y: event.pageY + }); + return false; + }, + false + ); + } + changeFolderIconToExpanded(folderEl) { + const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator"); + collapseIconEl.childNodes[0].style.transform = ""; + } +}; + +// src/review-deck.ts +var import_obsidian6 = require("obsidian"); +var ReviewDeck = class { + constructor(name2) { + this.newNotes = []; + this.scheduledNotes = []; + this.dueNotesCount = 0; + this.deckName = name2; + this.activeFolders = /* @__PURE__ */ new Set([this.deckName, t("TODAY")]); + } + sortNotes(pageranks) { + this.newNotes = this.newNotes.sort( + (a, b) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0) + ); + this.scheduledNotes = this.scheduledNotes.sort((a, b) => { + const result = a.dueUnix - b.dueUnix; + if (result != 0) { + return result; + } + return (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0); + }); + } +}; +var ReviewDeckSelectionModal = class extends import_obsidian6.FuzzySuggestModal { + constructor(app2, deckKeys) { + super(app2); + this.deckKeys = []; + this.deckKeys = deckKeys; + } + getItems() { + return this.deckKeys; + } + getItemText(item) { + return item; + } + onChooseItem(deckKey, _) { + this.close(); + this.submitCallback(deckKey); + } +}; + +// src/parser.ts +function parse2(text, singlelineCardSeparator, singlelineReversedCardSeparator, multilineCardSeparator, multilineReversedCardSeparator, convertHighlightsToClozes, convertBoldTextToClozes, convertCurlyBracketsToClozes) { + let cardText = ""; + const cards = []; + let cardType = null; + let lineNo = 0; + const lines = text.replaceAll("\r\n", "\n").split("\n"); + for (let i = 0; i < lines.length; i++) { + if (lines[i].length === 0) { + if (cardType) { + cards.push([cardType, cardText, lineNo]); + cardType = null; + } + cardText = ""; + continue; + } else if (lines[i].startsWith("")) + i++; + i++; + continue; + } + if (cardText.length > 0) { + cardText += "\n"; + } + cardText += lines[i]; + if (lines[i].includes(singlelineReversedCardSeparator) || lines[i].includes(singlelineCardSeparator)) { + cardType = lines[i].includes(singlelineReversedCardSeparator) ? 1 /* SingleLineReversed */ : 0 /* SingleLineBasic */; + cardText = lines[i]; + lineNo = i; + if (i + 1 < lines.length && lines[i + 1].startsWith(""; + const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); + fileText = fileText.replace(replacementRegex, () => newCardText); + fileChanged = true; + } + const context = settings.showContextInCards ? getCardContext(lineNo, headings, note.basename) : ""; + const siblings = []; + for (let i = 0; i < siblingMatches.length; i++) { + const front = siblingMatches[i][0].trim(), back = siblingMatches[i][1].trim(); + const cardObj = { + isDue: i < scheduling.length, + note, + lineNo, + front, + back, + cardText, + context, + cardType, + siblingIdx: i, + siblings, + editLater: false + }; + if (ignoreStats) { + this.cardStats.newCount++; + cardObj.isDue = true; + this.deckTree.insertFlashcard([...deckPath], cardObj); + } else if (i < scheduling.length) { + const dueUnix = window.moment(scheduling[i][1], ["YYYY-MM-DD", "DD-MM-YYYY"]).valueOf(); + const nDays = Math.ceil((dueUnix - now) / (24 * 3600 * 1e3)); + if (!Object.prototype.hasOwnProperty.call(this.dueDatesFlashcards, nDays)) { + this.dueDatesFlashcards[nDays] = 0; + } + this.dueDatesFlashcards[nDays]++; + const interval = parseInt(scheduling[i][2]), ease = parseInt(scheduling[i][3]); + if (!Object.prototype.hasOwnProperty.call(this.cardStats.intervals, interval)) { + this.cardStats.intervals[interval] = 0; + } + this.cardStats.intervals[interval]++; + if (!Object.prototype.hasOwnProperty.call(this.cardStats.eases, ease)) { + this.cardStats.eases[ease] = 0; + } + this.cardStats.eases[ease]++; + totalNoteEase += ease; + scheduledCount++; + if (interval >= 32) { + this.cardStats.matureCount++; + } else { + this.cardStats.youngCount++; + } + if (this.data.buryList.includes(cardTextHash)) { + this.deckTree.countFlashcard([...deckPath]); + continue; + } + if (dueUnix <= now) { + cardObj.interval = interval; + cardObj.ease = ease; + cardObj.delayBeforeReview = now - dueUnix; + this.deckTree.insertFlashcard([...deckPath], cardObj); + } else { + this.deckTree.countFlashcard([...deckPath]); + continue; + } + } else { + this.cardStats.newCount++; + if (this.data.buryList.includes(cyrb53(cardText))) { + this.deckTree.countFlashcard([...deckPath]); + continue; + } + this.deckTree.insertFlashcard([...deckPath], cardObj); + } + siblings.push(cardObj); + } + } + if (fileChanged) { + await this.app.vault.modify(note, fileText); + } + if (scheduledCount > 0) { + const flashcardsInNoteAvgEase = totalNoteEase / scheduledCount; + const flashcardContribution = Math.min( + 1, + Math.log(scheduledCount + 0.5) / Math.log(64) + ); + return flashcardsInNoteAvgEase * flashcardContribution + settings.baseEase * (1 - flashcardContribution); + } + return 0; + } + async loadPluginData() { + this.data = Object.assign({}, DEFAULT_DATA, await this.loadData()); + this.data.settings = Object.assign({}, DEFAULT_SETTINGS, this.data.settings); + } + async savePluginData() { + await this.saveData(this.data); + } + initView() { + this.registerView( + REVIEW_QUEUE_VIEW_TYPE, + (leaf) => this.reviewQueueView = new ReviewQueueListView(leaf, this) + ); + if (this.data.settings.enableNoteReviewPaneOnStartup && app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).length == 0) { + this.app.workspace.getRightLeaf(false).setViewState({ + type: REVIEW_QUEUE_VIEW_TYPE, + active: true + }); + } + } +}; +function getCardContext(cardLine, headings, note_title) { + const stack = []; + for (const heading of headings) { + if (heading.position.start.line > cardLine) { + break; + } + while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) { + stack.pop(); + } + stack.push(heading); + } + let context = `${note_title} > `; + for (const headingObj of stack) { + headingObj.heading = headingObj.heading.replace(/\[\^\d+\]/gm, "").trim(); + context += `${headingObj.heading} > `; + } + return context.slice(0, -3); +} +/*! Bundled license information: + +@kurkle/color/dist/color.esm.js: + (*! + * @kurkle/color v0.3.2 + * https://github.com/kurkle/color#readme + * (c) 2023 Jukka Kurkela + * Released under the MIT License + *) + +chart.js/dist/chunks/helpers.segment.js: + (*! + * Chart.js v4.2.1 + * https://www.chartjs.org + * (c) 2023 Chart.js Contributors + * Released under the MIT License + *) + +chart.js/dist/chart.js: + (*! + * Chart.js v4.2.1 + * https://www.chartjs.org + * (c) 2023 Chart.js Contributors + * Released under the MIT License + *) +*/ +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3BhZ2VyYW5rLmpzL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdmh0bWwvc3JjL2VtcHR5LXRhZ3MuanMiLCAibm9kZV9tb2R1bGVzL3ZodG1sL3NyYy92aHRtbC5qcyIsICJzcmMvbWFpbi50cyIsICJzcmMvc2V0dGluZ3MudHMiLCAic3JjL2xhbmcvaGVscGVycy50cyIsICJzcmMvbGFuZy9sb2NhbGUvYWYudHMiLCAic3JjL2xhbmcvbG9jYWxlL2FyLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9jei50cyIsICJzcmMvbGFuZy9sb2NhbGUvYm4udHMiLCAic3JjL2xhbmcvbG9jYWxlL2RhLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9kZS50cyIsICJzcmMvbGFuZy9sb2NhbGUvZW4udHMiLCAic3JjL2xhbmcvbG9jYWxlL2VuLWdiLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9lcy50cyIsICJzcmMvbGFuZy9sb2NhbGUvZnIudHMiLCAic3JjL2xhbmcvbG9jYWxlL2hpLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9pZC50cyIsICJzcmMvbGFuZy9sb2NhbGUvaXQudHMiLCAic3JjL2xhbmcvbG9jYWxlL2phLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9rby50cyIsICJzcmMvbGFuZy9sb2NhbGUvbXIudHMiLCAic3JjL2xhbmcvbG9jYWxlL25sLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9uby50cyIsICJzcmMvbGFuZy9sb2NhbGUvcGwudHMiLCAic3JjL2xhbmcvbG9jYWxlL3B0LnRzIiwgInNyYy9sYW5nL2xvY2FsZS9wdC1ici50cyIsICJzcmMvbGFuZy9sb2NhbGUvcm8udHMiLCAic3JjL2xhbmcvbG9jYWxlL3J1LnRzIiwgInNyYy9sYW5nL2xvY2FsZS90YS50cyIsICJzcmMvbGFuZy9sb2NhbGUvdGUudHMiLCAic3JjL2xhbmcvbG9jYWxlL3RoLnRzIiwgInNyYy9sYW5nL2xvY2FsZS90ci50cyIsICJzcmMvbGFuZy9sb2NhbGUvdWsudHMiLCAic3JjL2xhbmcvbG9jYWxlL3VyLnRzIiwgInNyYy9sYW5nL2xvY2FsZS92aS50cyIsICJzcmMvbGFuZy9sb2NhbGUvemgtY24udHMiLCAic3JjL2xhbmcvbG9jYWxlL3poLXR3LnRzIiwgInNyYy9mbGFzaGNhcmQtbW9kYWwudHN4IiwgInNyYy9zY2hlZHVsaW5nLnRzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL3V0aWxzLnRzIiwgInNyYy9zdGF0cy1tb2RhbC50c3giLCAibm9kZV9tb2R1bGVzL0BrdXJrbGUvY29sb3IvZGlzdC9jb2xvci5lc20uanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuY29yZS50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5tYXRoLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmNvbGxlY3Rpb24udHMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuZXh0cmFzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmVhc2luZy50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jb2xvci50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5hbmltYXRpb25zLmRlZmF1bHRzLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmxheW91dHMuZGVmYXVsdHMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuaW50bC50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS50aWNrcy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5zY2FsZS5kZWZhdWx0cy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5kZWZhdWx0cy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMub3B0aW9ucy50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jb25maWcuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuY3VydmUudHMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuZG9tLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmludGVycG9sYXRpb24udHMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMucnRsLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLnNlZ21lbnQuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmFuaW1hdGlvbnMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb250cm9sbGVycy9jb250cm9sbGVyLmJhci5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIuYnViYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5kb3VnaG51dC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIubGluZS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIucG9sYXJBcmVhLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5waWUuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb250cm9sbGVycy9jb250cm9sbGVyLnJhZGFyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5zY2F0dGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmFkYXB0ZXJzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmludGVyYWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmxheW91dHMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9wbGF0Zm9ybS5iYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGxhdGZvcm0vcGxhdGZvcm0uYmFzaWMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9wbGF0Zm9ybS5kb20uanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5lbGVtZW50LnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnNjYWxlLmF1dG9za2lwLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnNjYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnR5cGVkUmVnaXN0cnkuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUucmVnaXN0cnkuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUucGx1Z2lucy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5jb25maWcuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuY29udHJvbGxlci5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQuYXJjLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvZWxlbWVudHMvZWxlbWVudC5saW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvZWxlbWVudHMvZWxlbWVudC5wb2ludC50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQuYmFyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uY29sb3JzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZGVjaW1hdGlvbi5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmZpbGxlci9maWxsZXIuc2VnbWVudC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmZpbGxlci9maWxsZXIuaGVscGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci5vcHRpb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci50YXJnZXQuc3RhY2suanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvc2ltcGxlQXJjLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci50YXJnZXQuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvZmlsbGVyLmRyYXdpbmcuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5sZWdlbmQuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi50aXRsZS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLnN1YnRpdGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4udG9vbHRpcC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5jYXRlZ29yeS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5saW5lYXJiYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvc2NhbGVzL3NjYWxlLmxpbmVhci5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5sb2dhcml0aG1pYy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5yYWRpYWxMaW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9zY2FsZXMvc2NhbGUudGltZS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS50aW1lc2VyaWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaW5kZXgudHMiLCAic3JjL3NpZGViYXIudHMiLCAic3JjL3Jldmlldy1kZWNrLnRzIiwgInNyYy9wYXJzZXIudHMiLCAic3JjL2ljb25zL2FwcGljb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICBpZiAoKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnKSAmJiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soa2V5LCBvYmplY3Rba2V5XSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0ge1xuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgZWRnZXM6IHt9LFxuICAgICAgICBub2Rlczoge31cbiAgICB9O1xuXG4gICAgc2VsZi5saW5rID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0LCB3ZWlnaHQpIHtcbiAgICAgICAgaWYgKChpc0Zpbml0ZSh3ZWlnaHQpICE9PSB0cnVlKSB8fCAod2VpZ2h0ID09PSBudWxsKSkge1xuICAgICAgICAgICAgd2VpZ2h0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgd2VpZ2h0ID0gcGFyc2VGbG9hdCh3ZWlnaHQpO1xuXG4gICAgICAgIGlmIChzZWxmLm5vZGVzLmhhc093blByb3BlcnR5KHNvdXJjZSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlbGYuY291bnQrKztcbiAgICAgICAgICAgIHNlbGYubm9kZXNbc291cmNlXSA9IHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgb3V0Ym91bmQ6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLm5vZGVzW3NvdXJjZV0ub3V0Ym91bmQgKz0gd2VpZ2h0O1xuXG4gICAgICAgIGlmIChzZWxmLm5vZGVzLmhhc093blByb3BlcnR5KHRhcmdldCkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlbGYuY291bnQrKztcbiAgICAgICAgICAgIHNlbGYubm9kZXNbdGFyZ2V0XSA9IHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgb3V0Ym91bmQ6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5lZGdlcy5oYXNPd25Qcm9wZXJ0eShzb3VyY2UpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBzZWxmLmVkZ2VzW3NvdXJjZV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLmVkZ2VzW3NvdXJjZV0uaGFzT3duUHJvcGVydHkodGFyZ2V0KSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2VsZi5lZGdlc1tzb3VyY2VdW3RhcmdldF0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5lZGdlc1tzb3VyY2VdW3RhcmdldF0gKz0gd2VpZ2h0O1xuICAgIH07XG5cbiAgICBzZWxmLnJhbmsgPSBmdW5jdGlvbiAoYWxwaGEsIGVwc2lsb24sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkZWx0YSA9IDEsXG4gICAgICAgICAgICBpbnZlcnNlID0gMSAvIHNlbGYuY291bnQ7XG5cbiAgICAgICAgZm9yT3duKHNlbGYuZWRnZXMsIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLm5vZGVzW3NvdXJjZV0ub3V0Ym91bmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yT3duKHNlbGYuZWRnZXNbc291cmNlXSwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVkZ2VzW3NvdXJjZV1bdGFyZ2V0XSAvPSBzZWxmLm5vZGVzW3NvdXJjZV0ub3V0Ym91bmQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvck93bihzZWxmLm5vZGVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzW2tleV0ud2VpZ2h0ID0gaW52ZXJzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2hpbGUgKGRlbHRhID4gZXBzaWxvbikge1xuICAgICAgICAgICAgdmFyIGxlYWsgPSAwLFxuICAgICAgICAgICAgICAgIG5vZGVzID0ge307XG5cbiAgICAgICAgICAgIGZvck93bihzZWxmLm5vZGVzLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG5vZGVzW2tleV0gPSB2YWx1ZS53ZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUub3V0Ym91bmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhayArPSB2YWx1ZS53ZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VsZi5ub2Rlc1trZXldLndlaWdodCA9IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGVhayAqPSBhbHBoYTtcblxuICAgICAgICAgICAgZm9yT3duKHNlbGYubm9kZXMsIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmb3JPd24oc2VsZi5lZGdlc1tzb3VyY2VdLCBmdW5jdGlvbiAodGFyZ2V0LCB3ZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub2Rlc1t0YXJnZXRdLndlaWdodCArPSBhbHBoYSAqIG5vZGVzW3NvdXJjZV0gKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZWxmLm5vZGVzW3NvdXJjZV0ud2VpZ2h0ICs9ICgxIC0gYWxwaGEpICogaW52ZXJzZSArIGxlYWsgKiBpbnZlcnNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRlbHRhID0gMDtcblxuICAgICAgICAgICAgZm9yT3duKHNlbGYubm9kZXMsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVsdGEgKz0gTWF0aC5hYnModmFsdWUud2VpZ2h0IC0gbm9kZXNba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvck93bihzZWxmLm5vZGVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soa2V5LCBzZWxmLm5vZGVzW2tleV0ud2VpZ2h0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNlbGYucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuY291bnQgPSAwO1xuICAgICAgICBzZWxmLmVkZ2VzID0ge307XG4gICAgICAgIHNlbGYubm9kZXMgPSB7fTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNlbGY7XG59KSgpO1xuIiwgImV4cG9ydCBkZWZhdWx0IFtcblx0J2FyZWEnLFxuXHQnYmFzZScsXG5cdCdicicsXG5cdCdjb2wnLFxuXHQnY29tbWFuZCcsXG5cdCdlbWJlZCcsXG5cdCdocicsXG5cdCdpbWcnLFxuXHQnaW5wdXQnLFxuXHQna2V5Z2VuJyxcblx0J2xpbmsnLFxuXHQnbWV0YScsXG5cdCdwYXJhbScsXG5cdCdzb3VyY2UnLFxuXHQndHJhY2snLFxuXHQnd2JyJ1xuXTsiLCAiaW1wb3J0IGVtcHR5VGFncyBmcm9tICcuL2VtcHR5LXRhZ3MnO1xuXG4vLyBlc2NhcGUgYW4gYXR0cmlidXRlXG5sZXQgZXNjID0gc3RyID0+IFN0cmluZyhzdHIpLnJlcGxhY2UoL1smPD5cIiddL2csIHM9PmAmJHttYXBbc119O2ApO1xubGV0IG1hcCA9IHsnJic6J2FtcCcsJzwnOidsdCcsJz4nOidndCcsJ1wiJzoncXVvdCcsXCInXCI6J2Fwb3MnfTtcbmxldCBzZXRJbm5lckhUTUxBdHRyID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbmxldCBET01BdHRyaWJ1dGVOYW1lcyA9IHtcblx0Y2xhc3NOYW1lOiAnY2xhc3MnLFxuXHRodG1sRm9yOiAnZm9yJ1xufTtcblxubGV0IHNhbml0aXplZCA9IHt9O1xuXG4vKiogSHlwZXJzY3JpcHQgcmV2aXZlciB0aGF0IGNvbnN0cnVjdHMgYSBzYW5pdGl6ZWQgSFRNTCBzdHJpbmcuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoKG5hbWUsIGF0dHJzKSB7XG5cdGxldCBzdGFjaz1bXSwgcyA9ICcnO1xuXHRhdHRycyA9IGF0dHJzIHx8IHt9O1xuXHRmb3IgKGxldCBpPWFyZ3VtZW50cy5sZW5ndGg7IGktLSA+IDI7ICkge1xuXHRcdHN0YWNrLnB1c2goYXJndW1lbnRzW2ldKTtcblx0fVxuXG5cdC8vIFNvcnRvZiBjb21wb25lbnQgc3VwcG9ydCFcblx0aWYgKHR5cGVvZiBuYW1lPT09J2Z1bmN0aW9uJykge1xuXHRcdGF0dHJzLmNoaWxkcmVuID0gc3RhY2sucmV2ZXJzZSgpO1xuXHRcdHJldHVybiBuYW1lKGF0dHJzKTtcblx0XHQvLyByZXR1cm4gbmFtZShhdHRycywgc3RhY2sucmV2ZXJzZSgpKTtcblx0fVxuXG5cdGlmIChuYW1lKSB7XG5cdFx0cyArPSAnPCcgKyBuYW1lO1xuXHRcdGlmIChhdHRycykgZm9yIChsZXQgaSBpbiBhdHRycykge1xuXHRcdFx0aWYgKGF0dHJzW2ldIT09ZmFsc2UgJiYgYXR0cnNbaV0hPW51bGwgJiYgaSAhPT0gc2V0SW5uZXJIVE1MQXR0cikge1xuXHRcdFx0XHRzICs9IGAgJHtET01BdHRyaWJ1dGVOYW1lc1tpXSA/IERPTUF0dHJpYnV0ZU5hbWVzW2ldIDogZXNjKGkpfT1cIiR7ZXNjKGF0dHJzW2ldKX1cImA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHMgKz0gJz4nO1xuXHR9XG5cblx0aWYgKGVtcHR5VGFncy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuXHRcdGlmIChhdHRyc1tzZXRJbm5lckhUTUxBdHRyXSkge1xuXHRcdFx0cyArPSBhdHRyc1tzZXRJbm5lckhUTUxBdHRyXS5fX2h0bWw7XG5cdFx0fVxuXHRcdGVsc2Ugd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuXHRcdFx0bGV0IGNoaWxkID0gc3RhY2sucG9wKCk7XG5cdFx0XHRpZiAoY2hpbGQpIHtcblx0XHRcdFx0aWYgKGNoaWxkLnBvcCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGk9Y2hpbGQubGVuZ3RoOyBpLS07ICkgc3RhY2sucHVzaChjaGlsZFtpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0cyArPSBzYW5pdGl6ZWRbY2hpbGRdPT09dHJ1ZSA/IGNoaWxkIDogZXNjKGNoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHMgKz0gbmFtZSA/IGA8LyR7bmFtZX0+YCA6ICcnO1xuXHR9XG5cblx0c2FuaXRpemVkW3NdID0gdHJ1ZTtcblx0cmV0dXJuIHM7XG59XG4iLCAiaW1wb3J0IHtcbiAgICBOb3RpY2UsXG4gICAgUGx1Z2luLFxuICAgIFRBYnN0cmFjdEZpbGUsXG4gICAgVEZpbGUsXG4gICAgSGVhZGluZ0NhY2hlLFxuICAgIGdldEFsbFRhZ3MsXG4gICAgRnJvbnRNYXR0ZXJDYWNoZSxcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgKiBhcyBncmFwaCBmcm9tIFwicGFnZXJhbmsuanNcIjtcblxuaW1wb3J0IHsgU1JTZXR0aW5nVGFiLCBTUlNldHRpbmdzLCBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSBcInNyYy9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgRmxhc2hjYXJkTW9kYWwsIERlY2sgfSBmcm9tIFwic3JjL2ZsYXNoY2FyZC1tb2RhbFwiO1xuaW1wb3J0IHsgU3RhdHNNb2RhbCwgU3RhdHMgfSBmcm9tIFwic3JjL3N0YXRzLW1vZGFsXCI7XG5pbXBvcnQgeyBSZXZpZXdRdWV1ZUxpc3RWaWV3LCBSRVZJRVdfUVVFVUVfVklFV19UWVBFIH0gZnJvbSBcInNyYy9zaWRlYmFyXCI7XG5pbXBvcnQgeyBDYXJkLCBDYXJkVHlwZSwgUmV2aWV3UmVzcG9uc2UsIHNjaGVkdWxlIH0gZnJvbSBcInNyYy9zY2hlZHVsaW5nXCI7XG5pbXBvcnQge1xuICAgIFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYLFxuICAgIFNDSEVEVUxJTkdfSU5GT19SRUdFWCxcbiAgICBMRUdBQ1lfU0NIRURVTElOR19FWFRSQUNUT1IsXG4gICAgTVVMVElfU0NIRURVTElOR19FWFRSQUNUT1IsXG59IGZyb20gXCJzcmMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBlc2NhcGVSZWdleFN0cmluZywgY3lyYjUzIH0gZnJvbSBcInNyYy91dGlsc1wiO1xuaW1wb3J0IHsgUmV2aWV3RGVjaywgUmV2aWV3RGVja1NlbGVjdGlvbk1vZGFsIH0gZnJvbSBcInNyYy9yZXZpZXctZGVja1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCJzcmMvbGFuZy9oZWxwZXJzXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCJzcmMvcGFyc2VyXCI7XG5pbXBvcnQgeyBhcHBJY29uIH0gZnJvbSBcInNyYy9pY29ucy9hcHBpY29uXCI7XG5cbmludGVyZmFjZSBQbHVnaW5EYXRhIHtcbiAgICBzZXR0aW5nczogU1JTZXR0aW5ncztcbiAgICBidXJ5RGF0ZTogc3RyaW5nO1xuICAgIC8vIGhhc2hlcyBvZiBjYXJkIHRleHRzXG4gICAgLy8gc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB1c2VyIGRvZXNuJ3QgbW9kaWZ5IGNhcmQncyB0ZXh0XG4gICAgLy8gd2hpY2ggY292ZXJzIG1vc3Qgb2YgdGhlIGNhc2VzXG4gICAgYnVyeUxpc3Q6IHN0cmluZ1tdO1xuICAgIGhpc3RvcnlEZWNrOiBzdHJpbmcgfCBudWxsO1xufVxuXG5jb25zdCBERUZBVUxUX0RBVEE6IFBsdWdpbkRhdGEgPSB7XG4gICAgc2V0dGluZ3M6IERFRkFVTFRfU0VUVElOR1MsXG4gICAgYnVyeURhdGU6IFwiXCIsXG4gICAgYnVyeUxpc3Q6IFtdLFxuICAgIGhpc3RvcnlEZWNrOiBudWxsLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZE5vdGUge1xuICAgIG5vdGU6IFRGaWxlO1xuICAgIGR1ZVVuaXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rU3RhdCB7XG4gICAgc291cmNlUGF0aDogc3RyaW5nO1xuICAgIGxpbmtDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gICAgcHJpdmF0ZSBzdGF0dXNCYXI6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcmV2aWV3UXVldWVWaWV3OiBSZXZpZXdRdWV1ZUxpc3RWaWV3O1xuICAgIHB1YmxpYyBkYXRhOiBQbHVnaW5EYXRhO1xuICAgIHB1YmxpYyBzeW5jTG9jayA9IGZhbHNlO1xuXG4gICAgcHVibGljIHJldmlld0RlY2tzOiB7IFtkZWNrS2V5OiBzdHJpbmddOiBSZXZpZXdEZWNrIH0gPSB7fTtcbiAgICBwdWJsaWMgbGFzdFNlbGVjdGVkUmV2aWV3RGVjazogc3RyaW5nO1xuXG4gICAgcHVibGljIG5ld05vdGVzOiBURmlsZVtdID0gW107XG4gICAgcHVibGljIHNjaGVkdWxlZE5vdGVzOiBTY2hlZE5vdGVbXSA9IFtdO1xuICAgIHB1YmxpYyBlYXNlQnlQYXRoOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHJpdmF0ZSBpbmNvbWluZ0xpbmtzOiBSZWNvcmQ8c3RyaW5nLCBMaW5rU3RhdFtdPiA9IHt9O1xuICAgIHByaXZhdGUgcGFnZXJhbmtzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHJpdmF0ZSBkdWVOb3Rlc0NvdW50ID0gMDtcbiAgICBwdWJsaWMgZHVlRGF0ZXNOb3RlczogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9OyAvLyBSZWNvcmQ8IyBvZiBkYXlzIGluIGZ1dHVyZSwgZHVlIGNvdW50PlxuXG4gICAgcHVibGljIGRlY2tUcmVlOiBEZWNrID0gbmV3IERlY2soXCJyb290XCIsIG51bGwpO1xuICAgIHB1YmxpYyBkdWVEYXRlc0ZsYXNoY2FyZHM6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7fTsgLy8gUmVjb3JkPCMgb2YgZGF5cyBpbiBmdXR1cmUsIGR1ZSBjb3VudD5cbiAgICBwdWJsaWMgY2FyZFN0YXRzOiBTdGF0cztcblxuICAgIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGx1Z2luRGF0YSgpO1xuXG4gICAgICAgIGFwcEljb24oKTtcblxuICAgICAgICB0aGlzLnN0YXR1c0JhciA9IHRoaXMuYWRkU3RhdHVzQmFySXRlbSgpO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhci5jbGFzc0xpc3QuYWRkKFwibW9kLWNsaWNrYWJsZVwiKTtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0KFwiT1BFTl9OT1RFX0ZPUl9SRVZJRVdcIikpO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsLXBvc2l0aW9uXCIsIFwidG9wXCIpO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN5bmNMb2NrKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZpZXdOZXh0Tm90ZU1vZGFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUmliYm9uSWNvbihcIlNwYWNlZFJlcEljb25cIiwgdChcIlJFVklFV19DQVJEU1wiKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN5bmNMb2NrKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgbmV3IEZsYXNoY2FyZE1vZGFsKHRoaXMuYXBwLCB0aGlzKS5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5kYXRhLnNldHRpbmdzLmRpc2FibGVGaWxlTWVudVJldmlld09wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJmaWxlLW1lbnVcIiwgKG1lbnUsIGZpbGVpc2g6IFRBYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVpc2ggaW5zdGFuY2VvZiBURmlsZSAmJiBmaWxlaXNoLmV4dGVuc2lvbiA9PT0gXCJtZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRpdGxlKHQoXCJSRVZJRVdfRUFTWV9GSUxFX01FTlVcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwiU3BhY2VkUmVwSWNvblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXZpZXdSZXNwb25zZShmaWxlaXNoLCBSZXZpZXdSZXNwb25zZS5FYXN5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUaXRsZSh0KFwiUkVWSUVXX0dPT0RfRklMRV9NRU5VXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcIlNwYWNlZFJlcEljb25cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2UoZmlsZWlzaCwgUmV2aWV3UmVzcG9uc2UuR29vZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGl0bGUodChcIlJFVklFV19IQVJEX0ZJTEVfTUVOVVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJTcGFjZWRSZXBJY29uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJldmlld1Jlc3BvbnNlKGZpbGVpc2gsIFJldmlld1Jlc3BvbnNlLkhhcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwic3JzLW5vdGUtcmV2aWV3LW9wZW4tbm90ZVwiLFxuICAgICAgICAgICAgbmFtZTogdChcIk9QRU5fTk9URV9GT1JfUkVWSUVXXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3luY0xvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2aWV3TmV4dE5vdGVNb2RhbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtbm90ZS1yZXZpZXctZWFzeVwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19OT1RFX0VBU1lfQ01EXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2Uob3BlbkZpbGUsIFJldmlld1Jlc3BvbnNlLkVhc3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtbm90ZS1yZXZpZXctZ29vZFwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19OT1RFX0dPT0RfQ01EXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2Uob3BlbkZpbGUsIFJldmlld1Jlc3BvbnNlLkdvb2QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtbm90ZS1yZXZpZXctaGFyZFwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19OT1RFX0hBUkRfQ01EXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2Uob3BlbkZpbGUsIFJldmlld1Jlc3BvbnNlLkhhcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtcmV2aWV3LWZsYXNoY2FyZHNcIixcbiAgICAgICAgICAgIG5hbWU6IHQoXCJSRVZJRVdfQUxMX0NBUkRTXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3luY0xvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGbGFzaGNhcmRNb2RhbCh0aGlzLmFwcCwgdGhpcykub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtY3JhbS1mbGFzaGNhcmRzXCIsXG4gICAgICAgICAgICBuYW1lOiB0KFwiQ1JBTV9BTExfQ0FSRFNcIiksXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luYyh0cnVlKTtcbiAgICAgICAgICAgICAgICBuZXcgRmxhc2hjYXJkTW9kYWwodGhpcy5hcHAsIHRoaXMsIHRydWUpLm9wZW4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtcmV2aWV3LWZsYXNoY2FyZHMtaW4tbm90ZVwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19DQVJEU19JTl9OT1RFXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZSA9IG5ldyBEZWNrKFwicm9vdFwiLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVja1BhdGg6IHN0cmluZ1tdID0gdGhpcy5maW5kRGVja1BhdGgob3BlbkZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmRGbGFzaGNhcmRzSW5Ob3RlKG9wZW5GaWxlLCBkZWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGbGFzaGNhcmRNb2RhbCh0aGlzLmFwcCwgdGhpcykub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtY3JhbS1mbGFzaGNhcmRzLWluLW5vdGVcIixcbiAgICAgICAgICAgIG5hbWU6IHQoXCJDUkFNX0NBUkRTX0lOX05PVEVcIiksXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5GaWxlOiBURmlsZSB8IG51bGwgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuRmlsZSAmJiBvcGVuRmlsZS5leHRlbnNpb24gPT09IFwibWRcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY2tUcmVlID0gbmV3IERlY2soXCJyb290XCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNrUGF0aDogc3RyaW5nW10gPSB0aGlzLmZpbmREZWNrUGF0aChvcGVuRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluZEZsYXNoY2FyZHNJbk5vdGUob3BlbkZpbGUsIGRlY2tQYXRoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGbGFzaGNhcmRNb2RhbCh0aGlzLmFwcCwgdGhpcywgdHJ1ZSkub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtdmlldy1zdGF0c1wiLFxuICAgICAgICAgICAgbmFtZTogdChcIlZJRVdfU1RBVFNcIiksXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zeW5jTG9jaykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRzTW9kYWwodGhpcy5hcHAsIHRoaXMpLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNSU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zeW5jTG9jaykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb251bmxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoUkVWSUVXX1FVRVVFX1ZJRVdfVFlQRSkuZm9yRWFjaCgobGVhZikgPT4gbGVhZi5kZXRhY2goKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3luYyhpZ25vcmVTdGF0cyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNMb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jTG9jayA9IHRydWU7XG5cbiAgICAgICAgLy8gcmVzZXQgbm90ZXMgc3R1ZmZcbiAgICAgICAgZ3JhcGgucmVzZXQoKTtcbiAgICAgICAgdGhpcy5lYXNlQnlQYXRoID0ge307XG4gICAgICAgIHRoaXMuaW5jb21pbmdMaW5rcyA9IHt9O1xuICAgICAgICB0aGlzLnBhZ2VyYW5rcyA9IHt9O1xuICAgICAgICB0aGlzLmR1ZU5vdGVzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmR1ZURhdGVzTm90ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXZpZXdEZWNrcyA9IHt9O1xuXG4gICAgICAgIC8vIHJlc2V0IGZsYXNoY2FyZHMgc3R1ZmZcbiAgICAgICAgdGhpcy5kZWNrVHJlZSA9IG5ldyBEZWNrKFwicm9vdFwiLCBudWxsKTtcbiAgICAgICAgdGhpcy5kdWVEYXRlc0ZsYXNoY2FyZHMgPSB7fTtcbiAgICAgICAgdGhpcy5jYXJkU3RhdHMgPSB7XG4gICAgICAgICAgICBlYXNlczoge30sXG4gICAgICAgICAgICBpbnRlcnZhbHM6IHt9LFxuICAgICAgICAgICAgbmV3Q291bnQ6IDAsXG4gICAgICAgICAgICB5b3VuZ0NvdW50OiAwLFxuICAgICAgICAgICAgbWF0dXJlQ291bnQ6IDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudChEYXRlLm5vdygpKTtcbiAgICAgICAgY29uc3QgdG9kYXlEYXRlOiBzdHJpbmcgPSBub3cuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgICAgLy8gY2xlYXIgYnVyeSBsaXN0IGlmIHdlJ3ZlIGNoYW5nZWQgZGF0ZXNcbiAgICAgICAgaWYgKHRvZGF5RGF0ZSAhPT0gdGhpcy5kYXRhLmJ1cnlEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuYnVyeURhdGUgPSB0b2RheURhdGU7XG4gICAgICAgICAgICB0aGlzLmRhdGEuYnVyeUxpc3QgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vdGVzOiBURmlsZVtdID0gdGhpcy5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3Mubm90ZUZvbGRlcnNUb0lnbm9yZS5zb21lKChmb2xkZXIpID0+XG4gICAgICAgICAgICAgICAgICAgIG5vdGUucGF0aC5zdGFydHNXaXRoKGZvbGRlcilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdMaW5rc1tub3RlLnBhdGhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nTGlua3Nbbm90ZS5wYXRoXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUucmVzb2x2ZWRMaW5rc1tub3RlLnBhdGhdIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIGluIGxpbmtzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdMaW5rc1t0YXJnZXRQYXRoXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nTGlua3NbdGFyZ2V0UGF0aF0gPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIG1hcmtkb3duIGZpbGVzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UGF0aC5zcGxpdChcIi5cIikucG9wKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJtZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdMaW5rc1t0YXJnZXRQYXRoXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IG5vdGUucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtDb3VudDogbGlua3NbdGFyZ2V0UGF0aF0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmxpbmsobm90ZS5wYXRoLCB0YXJnZXRQYXRoLCBsaW5rc1t0YXJnZXRQYXRoXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZWNrUGF0aDogc3RyaW5nW10gPSB0aGlzLmZpbmREZWNrUGF0aChub3RlKTtcbiAgICAgICAgICAgIGlmIChkZWNrUGF0aC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGFzaGNhcmRzSW5Ob3RlQXZnRWFzZTogbnVtYmVyID0gYXdhaXQgdGhpcy5maW5kRmxhc2hjYXJkc0luTm90ZShcbiAgICAgICAgICAgICAgICAgICAgbm90ZSxcbiAgICAgICAgICAgICAgICAgICAgZGVja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVTdGF0c1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmxhc2hjYXJkc0luTm90ZUF2Z0Vhc2UgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdID0gZmxhc2hjYXJkc0luTm90ZUF2Z0Vhc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlQ2FjaGVkRGF0YSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKG5vdGUpIHx8IHt9O1xuXG4gICAgICAgICAgICBjb25zdCBmcm9udG1hdHRlcjogRnJvbnRNYXR0ZXJDYWNoZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgICAgICAgICAgICBmaWxlQ2FjaGVkRGF0YS5mcm9udG1hdHRlciB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRBbGxUYWdzKGZpbGVDYWNoZWREYXRhKSB8fCBbXTtcblxuICAgICAgICAgICAgbGV0IHNob3VsZElnbm9yZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkTm90ZVRhZ3MgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0YWdUb1JldmlldyBvZiB0aGlzLmRhdGEuc2V0dGluZ3MudGFnc1RvUmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ3Muc29tZSgodGFnKSA9PiB0YWcgPT09IHRhZ1RvUmV2aWV3IHx8IHRhZy5zdGFydHNXaXRoKHRhZ1RvUmV2aWV3ICsgXCIvXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnJldmlld0RlY2tzLCB0YWdUb1JldmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV2aWV3RGVja3NbdGFnVG9SZXZpZXddID0gbmV3IFJldmlld0RlY2sodGFnVG9SZXZpZXcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWROb3RlVGFncy5wdXNoKHRhZ1RvUmV2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSWdub3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZmlsZSBoYXMgbm8gc2NoZWR1bGluZyBpbmZvcm1hdGlvblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgXCJzci1kdWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb250bWF0dGVyLCBcInNyLWludGVydmFsXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgXCJzci1lYXNlXCIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGVkTm90ZVRhZyBvZiBtYXRjaGVkTm90ZVRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZpZXdEZWNrc1ttYXRjaGVkTm90ZVRhZ10ubmV3Tm90ZXMucHVzaChub3RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGR1ZVVuaXg6IG51bWJlciA9IHdpbmRvd1xuICAgICAgICAgICAgICAgIC5tb21lbnQoZnJvbnRtYXR0ZXJbXCJzci1kdWVcIl0sIFtcIllZWVktTU0tRERcIiwgXCJERC1NTS1ZWVlZXCIsIFwiZGRkIE1NTSBERCBZWVlZXCJdKVxuICAgICAgICAgICAgICAgIC52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hlZE5vdGVUYWcgb2YgbWF0Y2hlZE5vdGVUYWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZpZXdEZWNrc1ttYXRjaGVkTm90ZVRhZ10uc2NoZWR1bGVkTm90ZXMucHVzaCh7IG5vdGUsIGR1ZVVuaXggfSk7XG4gICAgICAgICAgICAgICAgaWYgKGR1ZVVuaXggPD0gbm93LnZhbHVlT2YoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmlld0RlY2tzW21hdGNoZWROb3RlVGFnXS5kdWVOb3Rlc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZWFzZUJ5UGF0aCwgbm90ZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdID1cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdICsgZnJvbnRtYXR0ZXJbXCJzci1lYXNlXCJdKSAvIDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdID0gZnJvbnRtYXR0ZXJbXCJzci1lYXNlXCJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZHVlVW5peCA8PSBub3cudmFsdWVPZigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kdWVOb3Rlc0NvdW50Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5EYXlzOiBudW1iZXIgPSBNYXRoLmNlaWwoKGR1ZVVuaXggLSBub3cudmFsdWVPZigpKSAvICgyNCAqIDM2MDAgKiAxMDAwKSk7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmR1ZURhdGVzTm90ZXMsIG5EYXlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHVlRGF0ZXNOb3Rlc1tuRGF5c10gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kdWVEYXRlc05vdGVzW25EYXlzXSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JhcGgucmFuaygwLjg1LCAwLjAwMDAwMSwgKG5vZGU6IHN0cmluZywgcmFuazogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VyYW5rc1tub2RlXSA9IHJhbmsgKiAxMDAwMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc29ydCB0aGUgZGVjayBuYW1lc1xuICAgICAgICB0aGlzLmRlY2tUcmVlLnNvcnRTdWJkZWNrc0xpc3QoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5zaG93RGVidWdNZXNzYWdlcykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFNSOiAke3QoXCJFQVNFU1wiKX1gLCB0aGlzLmVhc2VCeVBhdGgpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFNSOiAke3QoXCJERUNLU1wiKX1gLCB0aGlzLmRlY2tUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGVja0tleSBpbiB0aGlzLnJldmlld0RlY2tzKSB7XG4gICAgICAgICAgICB0aGlzLnJldmlld0RlY2tzW2RlY2tLZXldLnNvcnROb3Rlcyh0aGlzLnBhZ2VyYW5rcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhLnNldHRpbmdzLnNob3dEZWJ1Z01lc3NhZ2VzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBcIlNSOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHQoXCJTWU5DX1RJTUVfVEFLRU5cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdDogRGF0ZS5ub3coKSAtIG5vdy52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0VGV4dChcbiAgICAgICAgICAgIHQoXCJTVEFUVVNfQkFSXCIsIHtcbiAgICAgICAgICAgICAgICBkdWVOb3Rlc0NvdW50OiB0aGlzLmR1ZU5vdGVzQ291bnQsXG4gICAgICAgICAgICAgICAgZHVlRmxhc2hjYXJkc0NvdW50OiB0aGlzLmRlY2tUcmVlLmR1ZUZsYXNoY2FyZHNDb3VudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5lbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cCkgdGhpcy5yZXZpZXdRdWV1ZVZpZXcucmVkcmF3KCk7XG4gICAgICAgIHRoaXMuc3luY0xvY2sgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlUmV2aWV3UmVzcG9uc2Uobm90ZTogVEZpbGUsIHJlc3BvbnNlOiBSZXZpZXdSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBmaWxlQ2FjaGVkRGF0YSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKG5vdGUpIHx8IHt9O1xuICAgICAgICBjb25zdCBmcm9udG1hdHRlcjogRnJvbnRNYXR0ZXJDYWNoZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgICAgICAgIGZpbGVDYWNoZWREYXRhLmZyb250bWF0dGVyIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRBbGxUYWdzKGZpbGVDYWNoZWREYXRhKSB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5ub3RlRm9sZGVyc1RvSWdub3JlLnNvbWUoKGZvbGRlcikgPT4gbm90ZS5wYXRoLnN0YXJ0c1dpdGgoZm9sZGVyKSkpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIk5PVEVfSU5fSUdOT1JFRF9GT0xERVJcIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNob3VsZElnbm9yZSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MudGFnc1RvUmV2aWV3LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICh0YWdUb1JldmlldykgPT4gdGFnID09PSB0YWdUb1JldmlldyB8fCB0YWcuc3RhcnRzV2l0aCh0YWdUb1JldmlldyArIFwiL1wiKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNob3VsZElnbm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3VsZElnbm9yZSkge1xuICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiUExFQVNFX1RBR19OT1RFXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlVGV4dDogc3RyaW5nID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZChub3RlKTtcbiAgICAgICAgbGV0IGVhc2U6IG51bWJlciwgaW50ZXJ2YWw6IG51bWJlciwgZGVsYXlCZWZvcmVSZXZpZXc6IG51bWJlcjtcbiAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBuZXcgbm90ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgXCJzci1kdWVcIikgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZnJvbnRtYXR0ZXIsIFwic3ItaW50ZXJ2YWxcIikgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZnJvbnRtYXR0ZXIsIFwic3ItZWFzZVwiKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBsaW5rVG90YWwgPSAwLFxuICAgICAgICAgICAgICAgIGxpbmtQR1RvdGFsID0gMCxcbiAgICAgICAgICAgICAgICB0b3RhbExpbmtDb3VudCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RhdE9iaiBvZiB0aGlzLmluY29taW5nTGlua3Nbbm90ZS5wYXRoXSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVhc2U6IG51bWJlciA9IHRoaXMuZWFzZUJ5UGF0aFtzdGF0T2JqLnNvdXJjZVBhdGhdO1xuICAgICAgICAgICAgICAgIGlmIChlYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtUb3RhbCArPSBzdGF0T2JqLmxpbmtDb3VudCAqIHRoaXMucGFnZXJhbmtzW3N0YXRPYmouc291cmNlUGF0aF0gKiBlYXNlO1xuICAgICAgICAgICAgICAgICAgICBsaW5rUEdUb3RhbCArPSB0aGlzLnBhZ2VyYW5rc1tzdGF0T2JqLnNvdXJjZVBhdGhdICogc3RhdE9iai5saW5rQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTGlua0NvdW50ICs9IHN0YXRPYmoubGlua0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3V0Z29pbmdMaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUucmVzb2x2ZWRMaW5rc1tub3RlLnBhdGhdIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5rZWRGaWxlUGF0aCBpbiBvdXRnb2luZ0xpbmtzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWFzZTogbnVtYmVyID0gdGhpcy5lYXNlQnlQYXRoW2xpbmtlZEZpbGVQYXRoXTtcbiAgICAgICAgICAgICAgICBpZiAoZWFzZSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5rVG90YWwgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nTGlua3NbbGlua2VkRmlsZVBhdGhdICogdGhpcy5wYWdlcmFua3NbbGlua2VkRmlsZVBhdGhdICogZWFzZTtcbiAgICAgICAgICAgICAgICAgICAgbGlua1BHVG90YWwgKz0gdGhpcy5wYWdlcmFua3NbbGlua2VkRmlsZVBhdGhdICogb3V0Z29pbmdMaW5rc1tsaW5rZWRGaWxlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTGlua0NvdW50ICs9IG91dGdvaW5nTGlua3NbbGlua2VkRmlsZVBhdGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua0NvbnRyaWJ1dGlvbjogbnVtYmVyID1cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MubWF4TGlua0ZhY3RvciAqXG4gICAgICAgICAgICAgICAgTWF0aC5taW4oMS4wLCBNYXRoLmxvZyh0b3RhbExpbmtDb3VudCArIDAuNSkgLyBNYXRoLmxvZyg2NCkpO1xuICAgICAgICAgICAgZWFzZSA9XG4gICAgICAgICAgICAgICAgKDEuMCAtIGxpbmtDb250cmlidXRpb24pICogdGhpcy5kYXRhLnNldHRpbmdzLmJhc2VFYXNlICtcbiAgICAgICAgICAgICAgICAodG90YWxMaW5rQ291bnQgPiAwXG4gICAgICAgICAgICAgICAgICAgID8gKGxpbmtDb250cmlidXRpb24gKiBsaW5rVG90YWwpIC8gbGlua1BHVG90YWxcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5rQ29udHJpYnV0aW9uICogdGhpcy5kYXRhLnNldHRpbmdzLmJhc2VFYXNlKTtcbiAgICAgICAgICAgIC8vIGFkZCBub3RlJ3MgYXZlcmFnZSBmbGFzaGNhcmQgZWFzZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5lYXNlQnlQYXRoLCBub3RlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgZWFzZSA9IChlYXNlICsgdGhpcy5lYXNlQnlQYXRoW25vdGUucGF0aF0pIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVhc2UgPSBNYXRoLnJvdW5kKGVhc2UpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSAxLjA7XG4gICAgICAgICAgICBkZWxheUJlZm9yZVJldmlldyA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IGZyb250bWF0dGVyW1wic3ItaW50ZXJ2YWxcIl07XG4gICAgICAgICAgICBlYXNlID0gZnJvbnRtYXR0ZXJbXCJzci1lYXNlXCJdO1xuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcgPVxuICAgICAgICAgICAgICAgIG5vdyAtXG4gICAgICAgICAgICAgICAgd2luZG93XG4gICAgICAgICAgICAgICAgICAgIC5tb21lbnQoZnJvbnRtYXR0ZXJbXCJzci1kdWVcIl0sIFtcIllZWVktTU0tRERcIiwgXCJERC1NTS1ZWVlZXCIsIFwiZGRkIE1NTSBERCBZWVlZXCJdKVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVPZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZWRPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSBzY2hlZHVsZShcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICBlYXNlLFxuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcsXG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MsXG4gICAgICAgICAgICB0aGlzLmR1ZURhdGVzTm90ZXNcbiAgICAgICAgKTtcbiAgICAgICAgaW50ZXJ2YWwgPSBzY2hlZE9iai5pbnRlcnZhbDtcbiAgICAgICAgZWFzZSA9IHNjaGVkT2JqLmVhc2U7XG5cbiAgICAgICAgY29uc3QgZHVlID0gd2luZG93Lm1vbWVudChub3cgKyBpbnRlcnZhbCAqIDI0ICogMzYwMCAqIDEwMDApO1xuICAgICAgICBjb25zdCBkdWVTdHJpbmc6IHN0cmluZyA9IGR1ZS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHNjaGVkdWxpbmcgaW5mbyBleGlzdHNcbiAgICAgICAgaWYgKFNDSEVEVUxJTkdfSU5GT19SRUdFWC50ZXN0KGZpbGVUZXh0KSkge1xuICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGluZ0luZm8gPSBTQ0hFRFVMSU5HX0lORk9fUkVHRVguZXhlYyhmaWxlVGV4dCk7XG4gICAgICAgICAgICBmaWxlVGV4dCA9IGZpbGVUZXh0LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgU0NIRURVTElOR19JTkZPX1JFR0VYLFxuICAgICAgICAgICAgICAgIGAtLS1cXG4ke3NjaGVkdWxpbmdJbmZvWzFdfXNyLWR1ZTogJHtkdWVTdHJpbmd9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBzci1pbnRlcnZhbDogJHtpbnRlcnZhbH1cXG5zci1lYXNlOiAke2Vhc2V9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAke3NjaGVkdWxpbmdJbmZvWzVdfS0tLWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoWUFNTF9GUk9OVF9NQVRURVJfUkVHRVgudGVzdChmaWxlVGV4dCkpIHtcbiAgICAgICAgICAgIC8vIG5ldyBub3RlIHdpdGggZXhpc3RpbmcgWUFNTCBmcm9udCBtYXR0ZXJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nWWFtbCA9IFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYLmV4ZWMoZmlsZVRleHQpO1xuICAgICAgICAgICAgZmlsZVRleHQgPSBmaWxlVGV4dC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYLFxuICAgICAgICAgICAgICAgIGAtLS1cXG4ke2V4aXN0aW5nWWFtbFsxXX1zci1kdWU6ICR7ZHVlU3RyaW5nfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgc3ItaW50ZXJ2YWw6ICR7aW50ZXJ2YWx9XFxuc3ItZWFzZTogJHtlYXNlfVxcbi0tLWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWxlVGV4dCA9XG4gICAgICAgICAgICAgICAgYC0tLVxcbnNyLWR1ZTogJHtkdWVTdHJpbmd9XFxuc3ItaW50ZXJ2YWw6ICR7aW50ZXJ2YWx9XFxuYCArXG4gICAgICAgICAgICAgICAgYHNyLWVhc2U6ICR7ZWFzZX1cXG4tLS1cXG5cXG4ke2ZpbGVUZXh0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhLnNldHRpbmdzLmJ1cnlTaWJsaW5nQ2FyZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluZEZsYXNoY2FyZHNJbk5vdGUobm90ZSwgW10sIHRydWUpOyAvLyBidXJ5IGFsbCBjYXJkcyBpbiBjdXJyZW50IG5vdGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5tb2RpZnkobm90ZSwgZmlsZVRleHQpO1xuXG4gICAgICAgIG5ldyBOb3RpY2UodChcIlJFU1BPTlNFX1JFQ0VJVkVEXCIpKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5hdXRvTmV4dE5vdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmV2aWV3TmV4dE5vdGUodGhpcy5sYXN0U2VsZWN0ZWRSZXZpZXdEZWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJldmlld05leHROb3RlTW9kYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJldmlld0RlY2tOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLnJldmlld0RlY2tzKTtcbiAgICAgICAgaWYgKHJldmlld0RlY2tOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmV2aWV3TmV4dE5vdGUocmV2aWV3RGVja05hbWVzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2tTZWxlY3Rpb25Nb2RhbCA9IG5ldyBSZXZpZXdEZWNrU2VsZWN0aW9uTW9kYWwodGhpcy5hcHAsIHJldmlld0RlY2tOYW1lcyk7XG4gICAgICAgICAgICBkZWNrU2VsZWN0aW9uTW9kYWwuc3VibWl0Q2FsbGJhY2sgPSAoZGVja0tleTogc3RyaW5nKSA9PiB0aGlzLnJldmlld05leHROb3RlKGRlY2tLZXkpO1xuICAgICAgICAgICAgZGVja1NlbGVjdGlvbk1vZGFsLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJldmlld05leHROb3RlKGRlY2tLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnJldmlld0RlY2tzLCBkZWNrS2V5KSkge1xuICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiTk9fREVDS19FWElTVFNcIiwgeyBkZWNrTmFtZTogZGVja0tleSB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFJldmlld0RlY2sgPSBkZWNrS2V5O1xuICAgICAgICBjb25zdCBkZWNrID0gdGhpcy5yZXZpZXdEZWNrc1tkZWNrS2V5XTtcblxuICAgICAgICBpZiAoZGVjay5kdWVOb3Rlc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGVcbiAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRlY2suZHVlTm90ZXNDb3VudClcbiAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLm9wZW5GaWxlKGRlY2suc2NoZWR1bGVkTm90ZXNbaW5kZXhdLm5vdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlY2submV3Tm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGVcbiAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRlY2submV3Tm90ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCkub3BlbkZpbGUoZGVjay5uZXdOb3Rlc1tpbmRleF0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3IE5vdGljZSh0KFwiQUxMX0NBVUdIVF9VUFwiKSk7XG4gICAgfVxuXG4gICAgZmluZERlY2tQYXRoKG5vdGU6IFRGaWxlKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgZGVja1BhdGg6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLmRhdGEuc2V0dGluZ3MuY29udmVydEZvbGRlcnNUb0RlY2tzKSB7XG4gICAgICAgICAgICBkZWNrUGF0aCA9IG5vdGUucGF0aC5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICBkZWNrUGF0aC5wb3AoKTsgLy8gcmVtb3ZlIGZpbGVuYW1lXG4gICAgICAgICAgICBpZiAoZGVja1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVja1BhdGggPSBbXCIvXCJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNhY2hlZERhdGEgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShub3RlKSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRBbGxUYWdzKGZpbGVDYWNoZWREYXRhKSB8fCBbXTtcblxuICAgICAgICAgICAgb3V0ZXI6IGZvciAoY29uc3QgdGFnVG9SZXZpZXcgb2YgdGhpcy5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFRhZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT09IHRhZ1RvUmV2aWV3IHx8IHRhZy5zdGFydHNXaXRoKHRhZ1RvUmV2aWV3ICsgXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrUGF0aCA9IHRhZy5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVja1BhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEZsYXNoY2FyZHNJbk5vdGUoXG4gICAgICAgIG5vdGU6IFRGaWxlLFxuICAgICAgICBkZWNrUGF0aDogc3RyaW5nW10sXG4gICAgICAgIGJ1cnlPbmx5ID0gZmFsc2UsXG4gICAgICAgIGlnbm9yZVN0YXRzID0gZmFsc2VcbiAgICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBsZXQgZmlsZVRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQobm90ZSk7XG4gICAgICAgIGNvbnN0IGZpbGVDYWNoZWREYXRhID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUobm90ZSkgfHwge307XG4gICAgICAgIGNvbnN0IGhlYWRpbmdzOiBIZWFkaW5nQ2FjaGVbXSA9IGZpbGVDYWNoZWREYXRhLmhlYWRpbmdzIHx8IFtdO1xuICAgICAgICBsZXQgZmlsZUNoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICAgIHRvdGFsTm90ZUVhc2UgPSAwLFxuICAgICAgICAgICAgc2NoZWR1bGVkQ291bnQgPSAwO1xuICAgICAgICBjb25zdCBzZXR0aW5nczogU1JTZXR0aW5ncyA9IHRoaXMuZGF0YS5zZXR0aW5ncztcbiAgICAgICAgY29uc3Qgbm90ZURlY2tQYXRoID0gZGVja1BhdGg7XG5cbiAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBwYXJzZWRDYXJkczogW0NhcmRUeXBlLCBzdHJpbmcsIG51bWJlcl1bXSA9IHBhcnNlKFxuICAgICAgICAgICAgZmlsZVRleHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5zaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcixcbiAgICAgICAgICAgIHNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IsXG4gICAgICAgICAgICBzZXR0aW5ncy5tdWx0aWxpbmVDYXJkU2VwYXJhdG9yLFxuICAgICAgICAgICAgc2V0dGluZ3MubXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yLFxuICAgICAgICAgICAgc2V0dGluZ3MuY29udmVydEhpZ2hsaWdodHNUb0Nsb3plcyxcbiAgICAgICAgICAgIHNldHRpbmdzLmNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzLFxuICAgICAgICAgICAgc2V0dGluZ3MuY29udmVydEN1cmx5QnJhY2tldHNUb0Nsb3plc1xuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZENhcmQgb2YgcGFyc2VkQ2FyZHMpIHtcbiAgICAgICAgICAgIGRlY2tQYXRoID0gbm90ZURlY2tQYXRoO1xuICAgICAgICAgICAgY29uc3QgY2FyZFR5cGU6IENhcmRUeXBlID0gcGFyc2VkQ2FyZFswXSxcbiAgICAgICAgICAgICAgICBsaW5lTm86IG51bWJlciA9IHBhcnNlZENhcmRbMl07XG4gICAgICAgICAgICBsZXQgY2FyZFRleHQ6IHN0cmluZyA9IHBhcnNlZENhcmRbMV07XG5cbiAgICAgICAgICAgIGlmIChjYXJkVGV4dC5pbmNsdWRlcyhzZXR0aW5ncy5lZGl0TGF0ZXJUYWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc2V0dGluZ3MuY29udmVydEZvbGRlcnNUb0RlY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnSW5DYXJkUmVnRXggPSAvXiNbXlxccyNdKy9naTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXJkRGVja1BhdGggPSBjYXJkVGV4dFxuICAgICAgICAgICAgICAgICAgICAubWF0Y2godGFnSW5DYXJkUmVnRXgpXG4gICAgICAgICAgICAgICAgICAgID8uc2xpY2UoLTEpWzBdXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiI1wiLCBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjYXJkRGVja1BhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVja1BhdGggPSBjYXJkRGVja1BhdGg7XG4gICAgICAgICAgICAgICAgICAgIGNhcmRUZXh0ID0gY2FyZFRleHQucmVwbGFjZUFsbCh0YWdJbkNhcmRSZWdFeCwgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRlY2tUcmVlLmNyZWF0ZURlY2soWy4uLmRlY2tQYXRoXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhcmRUZXh0SGFzaDogc3RyaW5nID0gY3lyYjUzKGNhcmRUZXh0KTtcblxuICAgICAgICAgICAgaWYgKGJ1cnlPbmx5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmJ1cnlMaXN0LnB1c2goY2FyZFRleHRIYXNoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2libGluZ01hdGNoZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICAgICAgICAgICAgaWYgKGNhcmRUeXBlID09PSBDYXJkVHlwZS5DbG96ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzOiBSZWdFeHBNYXRjaEFycmF5W10gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuY29udmVydEhpZ2hsaWdodHNUb0Nsb3plcykge1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKC4uLmNhcmRUZXh0Lm1hdGNoQWxsKC89PSguKj8pPT0vZ20pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goLi4uY2FyZFRleHQubWF0Y2hBbGwoL1xcKlxcKiguKj8pXFwqXFwqL2dtKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jb252ZXJ0Q3VybHlCcmFja2V0c1RvQ2xvemVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goLi4uY2FyZFRleHQubWF0Y2hBbGwoL3t7KC4qPyl9fS9nbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaWJsaW5ncy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmluZGV4ID4gYi5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IHNpYmxpbmdzLnJlZHVjZSgoYWNjLCBzaWJsaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0SFRNTCA9IGA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNsb3plLWlucHV0XCIgc2l6ZT1cIiR7c2libGluZ1sxXS5sZW5ndGh9XCIgLz5gO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYWNjLnJlcGxhY2Uoc2libGluZ1swXSwgaW5wdXRIVE1MKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhY2MgKyBzaWJsaW5nLmlucHV0LnJlcGxhY2Uoc2libGluZ1swXSwgaW5wdXRIVE1MKTtcbiAgICAgICAgICAgICAgICB9LCBcIlwiKTtcblxuICAgICAgICAgICAgICAgIC8vIGJhY2sgaXMgYmVpbmcgY3JlYXRlZCBpbiBmbGFzaGNhcmQtbW9kYWwudHN4IHdpdGggZ2V0Q2xvemVCYWNrVmlldygpXG4gICAgICAgICAgICAgICAgc2libGluZ01hdGNoZXMucHVzaChbZnJvbnQsIFwiXCJdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICAgIGlmIChjYXJkVHlwZSA9PT0gQ2FyZFR5cGUuU2luZ2xlTGluZUJhc2ljKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGNhcmRUZXh0LmluZGV4T2Yoc2V0dGluZ3Muc2luZ2xlTGluZUNhcmRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRUZXh0LnN1YnN0cmluZygwLCBpZHgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRleHQuc3Vic3RyaW5nKGlkeCArIHNldHRpbmdzLnNpbmdsZUxpbmVDYXJkU2VwYXJhdG9yLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZFR5cGUgPT09IENhcmRUeXBlLlNpbmdsZUxpbmVSZXZlcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZHggPSBjYXJkVGV4dC5pbmRleE9mKHNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWRlMTogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKDAsIGlkeCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlMjogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArIHNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtzaWRlMSwgc2lkZTJdKTtcbiAgICAgICAgICAgICAgICAgICAgc2libGluZ01hdGNoZXMucHVzaChbc2lkZTIsIHNpZGUxXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJkVHlwZSA9PT0gQ2FyZFR5cGUuTXVsdGlMaW5lQmFzaWMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWR4ID0gY2FyZFRleHQuaW5kZXhPZihcIlxcblwiICsgc2V0dGluZ3MubXVsdGlsaW5lQ2FyZFNlcGFyYXRvciArIFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRUZXh0LnN1YnN0cmluZygwLCBpZHgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRleHQuc3Vic3RyaW5nKGlkeCArIDIgKyBzZXR0aW5ncy5tdWx0aWxpbmVDYXJkU2VwYXJhdG9yLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZFR5cGUgPT09IENhcmRUeXBlLk11bHRpTGluZVJldmVyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGNhcmRUZXh0LmluZGV4T2YoXCJcXG5cIiArIHNldHRpbmdzLm11bHRpbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvciArIFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWRlMTogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKDAsIGlkeCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlMjogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArIDIgKyBzZXR0aW5ncy5tdWx0aWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtzaWRlMSwgc2lkZTJdKTtcbiAgICAgICAgICAgICAgICAgICAgc2libGluZ01hdGNoZXMucHVzaChbc2lkZTIsIHNpZGUxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2NoZWR1bGluZzogUmVnRXhwTWF0Y2hBcnJheVtdID0gWy4uLmNhcmRUZXh0Lm1hdGNoQWxsKE1VTFRJX1NDSEVEVUxJTkdfRVhUUkFDVE9SKV07XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGluZy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgc2NoZWR1bGluZyA9IFsuLi5jYXJkVGV4dC5tYXRjaEFsbChMRUdBQ1lfU0NIRURVTElOR19FWFRSQUNUT1IpXTtcblxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBzb21lIGV4dHJhIHNjaGVkdWxpbmcgZGF0ZXMgdG8gZGVsZXRlXG4gICAgICAgICAgICBpZiAoc2NoZWR1bGluZy5sZW5ndGggPiBzaWJsaW5nTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHhTY2hlZDogbnVtYmVyID0gY2FyZFRleHQubGFzdEluZGV4T2YoXCI8IS0tU1I6XCIpICsgNztcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q2FyZFRleHQ6IHN0cmluZyA9IGNhcmRUZXh0LnN1YnN0cmluZygwLCBpZHhTY2hlZCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWJsaW5nTWF0Y2hlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2FyZFRleHQgKz0gYCEke3NjaGVkdWxpbmdbaV1bMV19LCR7c2NoZWR1bGluZ1tpXVsyXX0sJHtzY2hlZHVsaW5nW2ldWzNdfWA7XG4gICAgICAgICAgICAgICAgbmV3Q2FyZFRleHQgKz0gXCItLT5cIjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50UmVnZXggPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ2V4U3RyaW5nKGNhcmRUZXh0KSwgXCJnbVwiKTtcbiAgICAgICAgICAgICAgICBmaWxlVGV4dCA9IGZpbGVUZXh0LnJlcGxhY2UocmVwbGFjZW1lbnRSZWdleCwgKCkgPT4gbmV3Q2FyZFRleHQpO1xuICAgICAgICAgICAgICAgIGZpbGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc2V0dGluZ3Muc2hvd0NvbnRleHRJbkNhcmRzXG4gICAgICAgICAgICAgICAgPyBnZXRDYXJkQ29udGV4dChsaW5lTm8sIGhlYWRpbmdzLCBub3RlLmJhc2VuYW1lKVxuICAgICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzOiBDYXJkW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2libGluZ01hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udDogc3RyaW5nID0gc2libGluZ01hdGNoZXNbaV1bMF0udHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICBiYWNrOiBzdHJpbmcgPSBzaWJsaW5nTWF0Y2hlc1tpXVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYXJkT2JqOiBDYXJkID0ge1xuICAgICAgICAgICAgICAgICAgICBpc0R1ZTogaSA8IHNjaGVkdWxpbmcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBub3RlLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTm8sXG4gICAgICAgICAgICAgICAgICAgIGZyb250LFxuICAgICAgICAgICAgICAgICAgICBiYWNrLFxuICAgICAgICAgICAgICAgICAgICBjYXJkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2FyZFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdJZHg6IGksXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLFxuICAgICAgICAgICAgICAgICAgICBlZGl0TGF0ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyBjYXJkIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgIGlmIChpZ25vcmVTdGF0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdGF0cy5uZXdDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBjYXJkT2JqLmlzRHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZS5pbnNlcnRGbGFzaGNhcmQoWy4uLmRlY2tQYXRoXSwgY2FyZE9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgc2NoZWR1bGluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVlVW5peDogbnVtYmVyID0gd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAubW9tZW50KHNjaGVkdWxpbmdbaV1bMV0sIFtcIllZWVktTU0tRERcIiwgXCJERC1NTS1ZWVlZXCJdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbkRheXM6IG51bWJlciA9IE1hdGguY2VpbCgoZHVlVW5peCAtIG5vdykgLyAoMjQgKiAzNjAwICogMTAwMCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmR1ZURhdGVzRmxhc2hjYXJkcywgbkRheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1ZURhdGVzRmxhc2hjYXJkc1tuRGF5c10gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHVlRGF0ZXNGbGFzaGNhcmRzW25EYXlzXSsrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVydmFsOiBudW1iZXIgPSBwYXJzZUludChzY2hlZHVsaW5nW2ldWzJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVhc2U6IG51bWJlciA9IHBhcnNlSW50KHNjaGVkdWxpbmdbaV1bM10pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNhcmRTdGF0cy5pbnRlcnZhbHMsIGludGVydmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMuaW50ZXJ2YWxzW2ludGVydmFsXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMuaW50ZXJ2YWxzW2ludGVydmFsXSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNhcmRTdGF0cy5lYXNlcywgZWFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FyZFN0YXRzLmVhc2VzW2Vhc2VdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdGF0cy5lYXNlc1tlYXNlXSsrO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbE5vdGVFYXNlICs9IGVhc2U7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZENvdW50Kys7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsID49IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdGF0cy5tYXR1cmVDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMueW91bmdDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5idXJ5TGlzdC5pbmNsdWRlcyhjYXJkVGV4dEhhc2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY2tUcmVlLmNvdW50Rmxhc2hjYXJkKFsuLi5kZWNrUGF0aF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZHVlVW5peCA8PSBub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRPYmouaW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRPYmouZWFzZSA9IGVhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJkT2JqLmRlbGF5QmVmb3JlUmV2aWV3ID0gbm93IC0gZHVlVW5peDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVja1RyZWUuaW5zZXJ0Rmxhc2hjYXJkKFsuLi5kZWNrUGF0aF0sIGNhcmRPYmopO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZS5jb3VudEZsYXNoY2FyZChbLi4uZGVja1BhdGhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMubmV3Q291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5idXJ5TGlzdC5pbmNsdWRlcyhjeXJiNTMoY2FyZFRleHQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZS5jb3VudEZsYXNoY2FyZChbLi4uZGVja1BhdGhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVja1RyZWUuaW5zZXJ0Rmxhc2hjYXJkKFsuLi5kZWNrUGF0aF0sIGNhcmRPYmopO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goY2FyZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0Lm1vZGlmeShub3RlLCBmaWxlVGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZWR1bGVkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFzaGNhcmRzSW5Ob3RlQXZnRWFzZTogbnVtYmVyID0gdG90YWxOb3RlRWFzZSAvIHNjaGVkdWxlZENvdW50O1xuICAgICAgICAgICAgY29uc3QgZmxhc2hjYXJkQ29udHJpYnV0aW9uOiBudW1iZXIgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAxLjAsXG4gICAgICAgICAgICAgICAgTWF0aC5sb2coc2NoZWR1bGVkQ291bnQgKyAwLjUpIC8gTWF0aC5sb2coNjQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBmbGFzaGNhcmRzSW5Ob3RlQXZnRWFzZSAqIGZsYXNoY2FyZENvbnRyaWJ1dGlvbiArXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuYmFzZUVhc2UgKiAoMS4wIC0gZmxhc2hjYXJkQ29udHJpYnV0aW9uKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRQbHVnaW5EYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0RBVEEsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIHRoaXMuZGF0YS5zZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVBsdWdpbkRhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpZXcoXG4gICAgICAgICAgICBSRVZJRVdfUVVFVUVfVklFV19UWVBFLFxuICAgICAgICAgICAgKGxlYWYpID0+ICh0aGlzLnJldmlld1F1ZXVlVmlldyA9IG5ldyBSZXZpZXdRdWV1ZUxpc3RWaWV3KGxlYWYsIHRoaXMpKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5lbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cCAmJlxuICAgICAgICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoUkVWSUVXX1FVRVVFX1ZJRVdfVFlQRSkubGVuZ3RoID09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFJFVklFV19RVUVVRV9WSUVXX1RZUEUsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldENhcmRDb250ZXh0KGNhcmRMaW5lOiBudW1iZXIsIGhlYWRpbmdzOiBIZWFkaW5nQ2FjaGVbXSwgbm90ZV90aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFjazogSGVhZGluZ0NhY2hlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGhlYWRpbmcgb2YgaGVhZGluZ3MpIHtcbiAgICAgICAgaWYgKGhlYWRpbmcucG9zaXRpb24uc3RhcnQubGluZSA+IGNhcmRMaW5lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdLmxldmVsID49IGhlYWRpbmcubGV2ZWwpIHtcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhY2sucHVzaChoZWFkaW5nKTtcbiAgICB9XG5cbiAgICBsZXQgY29udGV4dCA9IGAke25vdGVfdGl0bGV9ID4gYDtcbiAgICBmb3IgKGNvbnN0IGhlYWRpbmdPYmogb2Ygc3RhY2spIHtcbiAgICAgICAgaGVhZGluZ09iai5oZWFkaW5nID0gaGVhZGluZ09iai5oZWFkaW5nLnJlcGxhY2UoL1xcW1xcXlxcZCtcXF0vZ20sIFwiXCIpLnRyaW0oKTtcbiAgICAgICAgY29udGV4dCArPSBgJHtoZWFkaW5nT2JqLmhlYWRpbmd9ID4gYDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQuc2xpY2UoMCwgLTMpO1xufVxuIiwgImltcG9ydCB7IE5vdGljZSwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgQXBwLCBQbGF0Zm9ybSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgU1JQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcInNyYy9sYW5nL2hlbHBlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTUlNldHRpbmdzIHtcbiAgICAvLyBmbGFzaGNhcmRzXG4gICAgZmxhc2hjYXJkRWFzeVRleHQ6IHN0cmluZztcbiAgICBmbGFzaGNhcmRHb29kVGV4dDogc3RyaW5nO1xuICAgIGZsYXNoY2FyZEhhcmRUZXh0OiBzdHJpbmc7XG4gICAgZmxhc2hjYXJkVGFnczogc3RyaW5nW107XG4gICAgY29udmVydEZvbGRlcnNUb0RlY2tzOiBib29sZWFuO1xuICAgIGNhcmRDb21tZW50T25TYW1lTGluZTogYm9vbGVhbjtcbiAgICBidXJ5U2libGluZ0NhcmRzOiBib29sZWFuO1xuICAgIHNob3dDb250ZXh0SW5DYXJkczogYm9vbGVhbjtcbiAgICBmbGFzaGNhcmRIZWlnaHRQZXJjZW50YWdlOiBudW1iZXI7XG4gICAgZmxhc2hjYXJkV2lkdGhQZXJjZW50YWdlOiBudW1iZXI7XG4gICAgcmFuZG9taXplQ2FyZE9yZGVyOiBib29sZWFuO1xuICAgIGNvbnZlcnRIaWdobGlnaHRzVG9DbG96ZXM6IGJvb2xlYW47XG4gICAgY29udmVydEJvbGRUZXh0VG9DbG96ZXM6IGJvb2xlYW47XG4gICAgY29udmVydEN1cmx5QnJhY2tldHNUb0Nsb3plczogYm9vbGVhbjtcbiAgICBzaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcjogc3RyaW5nO1xuICAgIHNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3I6IHN0cmluZztcbiAgICBtdWx0aWxpbmVDYXJkU2VwYXJhdG9yOiBzdHJpbmc7XG4gICAgbXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yOiBzdHJpbmc7XG4gICAgZWRpdExhdGVyVGFnOiBzdHJpbmc7XG4gICAgLy8gbm90ZXNcbiAgICBlbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cDogYm9vbGVhbjtcbiAgICB0YWdzVG9SZXZpZXc6IHN0cmluZ1tdO1xuICAgIG5vdGVGb2xkZXJzVG9JZ25vcmU6IHN0cmluZ1tdO1xuICAgIG9wZW5SYW5kb21Ob3RlOiBib29sZWFuO1xuICAgIGF1dG9OZXh0Tm90ZTogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsZU1lbnVSZXZpZXdPcHRpb25zOiBib29sZWFuO1xuICAgIG1heE5EYXlzTm90ZXNSZXZpZXdRdWV1ZTogbnVtYmVyO1xuICAgIC8vIFVJIHByZWZlcmVuY2VzXG4gICAgaW5pdGlhbGx5RXhwYW5kQWxsU3ViZGVja3NJblRyZWU6IGJvb2xlYW47XG4gICAgLy8gYWxnb3JpdGhtXG4gICAgYmFzZUVhc2U6IG51bWJlcjtcbiAgICBsYXBzZXNJbnRlcnZhbENoYW5nZTogbnVtYmVyO1xuICAgIGVhc3lCb251czogbnVtYmVyO1xuICAgIG1heGltdW1JbnRlcnZhbDogbnVtYmVyO1xuICAgIG1heExpbmtGYWN0b3I6IG51bWJlcjtcbiAgICAvLyBsb2dnaW5nXG4gICAgc2hvd0RlYnVnTWVzc2FnZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBTUlNldHRpbmdzID0ge1xuICAgIC8vIGZsYXNoY2FyZHNcbiAgICBmbGFzaGNhcmRFYXN5VGV4dDogdChcIkVBU1lcIiksXG4gICAgZmxhc2hjYXJkR29vZFRleHQ6IHQoXCJHT09EXCIpLFxuICAgIGZsYXNoY2FyZEhhcmRUZXh0OiB0KFwiSEFSRFwiKSxcbiAgICBmbGFzaGNhcmRUYWdzOiBbXCIjZmxhc2hjYXJkc1wiXSxcbiAgICBjb252ZXJ0Rm9sZGVyc1RvRGVja3M6IGZhbHNlLFxuICAgIGNhcmRDb21tZW50T25TYW1lTGluZTogZmFsc2UsXG4gICAgYnVyeVNpYmxpbmdDYXJkczogZmFsc2UsXG4gICAgc2hvd0NvbnRleHRJbkNhcmRzOiB0cnVlLFxuICAgIGZsYXNoY2FyZEhlaWdodFBlcmNlbnRhZ2U6IFBsYXRmb3JtLmlzTW9iaWxlID8gMTAwIDogODAsXG4gICAgZmxhc2hjYXJkV2lkdGhQZXJjZW50YWdlOiBQbGF0Zm9ybS5pc01vYmlsZSA/IDEwMCA6IDQwLFxuICAgIHJhbmRvbWl6ZUNhcmRPcmRlcjogdHJ1ZSxcbiAgICBjb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzOiB0cnVlLFxuICAgIGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzOiBmYWxzZSxcbiAgICBjb252ZXJ0Q3VybHlCcmFja2V0c1RvQ2xvemVzOiBmYWxzZSxcbiAgICBzaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcjogXCI6OlwiLFxuICAgIHNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3I6IFwiOjo6XCIsXG4gICAgbXVsdGlsaW5lQ2FyZFNlcGFyYXRvcjogXCI/XCIsXG4gICAgbXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yOiBcIj8/XCIsXG4gICAgZWRpdExhdGVyVGFnOiBcIiNlZGl0LWxhdGVyXCIsXG4gICAgLy8gbm90ZXNcbiAgICBlbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cDogdHJ1ZSxcbiAgICB0YWdzVG9SZXZpZXc6IFtcIiNyZXZpZXdcIl0sXG4gICAgbm90ZUZvbGRlcnNUb0lnbm9yZTogW10sXG4gICAgb3BlblJhbmRvbU5vdGU6IGZhbHNlLFxuICAgIGF1dG9OZXh0Tm90ZTogZmFsc2UsXG4gICAgZGlzYWJsZUZpbGVNZW51UmV2aWV3T3B0aW9uczogZmFsc2UsXG4gICAgbWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlOiAzNjUsXG4gICAgLy8gVUkgc2V0dGluZ3NcbiAgICBpbml0aWFsbHlFeHBhbmRBbGxTdWJkZWNrc0luVHJlZTogZmFsc2UsXG4gICAgLy8gYWxnb3JpdGhtXG4gICAgYmFzZUVhc2U6IDI1MCxcbiAgICBsYXBzZXNJbnRlcnZhbENoYW5nZTogMC41LFxuICAgIGVhc3lCb251czogMS4zLFxuICAgIG1heGltdW1JbnRlcnZhbDogMzY1MjUsXG4gICAgbWF4TGlua0ZhY3RvcjogMS4wLFxuICAgIC8vIGxvZ2dpbmdcbiAgICBzaG93RGVidWdNZXNzYWdlczogZmFsc2UsXG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWdtZXllcnMvb2JzaWRpYW4ta2FuYmFuL2Jsb2IvbWFpbi9zcmMvU2V0dGluZ3MudHNcbmxldCBhcHBseURlYm91bmNlVGltZXIgPSAwO1xuZnVuY3Rpb24gYXBwbHlTZXR0aW5nc1VwZGF0ZShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChhcHBseURlYm91bmNlVGltZXIpO1xuICAgIGFwcGx5RGVib3VuY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCA1MTIpO1xufVxuXG5leHBvcnQgY2xhc3MgU1JTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gICAgcHJpdmF0ZSBwbHVnaW46IFNSUGx1Z2luO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogU1JQbHVnaW4pIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVyID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IGAke3QoXCJTRVRUSU5HU19IRUFERVJcIil9YCB9KTtcbiAgICAgICAgaGVhZGVyLmFkZENsYXNzKFwic3ItY2VudGVyZWRcIik7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdChcIkNIRUNLX1dJS0lcIiwge1xuICAgICAgICAgICAgd2lraV91cmw6IFwiaHR0cHM6Ly93d3cuc3RlcGhlbm13YW5naS5jb20vb2JzaWRpYW4tc3BhY2VkLXJlcGV0aXRpb24vXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkZPTERFUlNfVE9fSUdOT1JFXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkZPTERFUlNfVE9fSUdOT1JFX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5ub3RlRm9sZGVyc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Mubm90ZUZvbGRlcnNUb0lnbm9yZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgvXFxuKy8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IHYudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh2KSA9PiB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBgJHt0KFwiRkxBU0hDQVJEU1wiKX1gIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkZMQVNIQ0FSRF9UQUdTXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkZMQVNIQ0FSRF9UQUdTX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRUYWdzLmpvaW4oXCIgXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFRhZ3MgPSB2YWx1ZS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkNPTlZFUlRfRk9MREVSU19UT19ERUNLU19ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0Rm9sZGVyc1RvRGVja3MpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuY29udmVydEZvbGRlcnNUb0RlY2tzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU1wiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jYXJkQ29tbWVudE9uU2FtZUxpbmUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuY2FyZENvbW1lbnRPblNhbWVMaW5lID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVlcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJ1cnlTaWJsaW5nQ2FyZHMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYnVyeVNpYmxpbmdDYXJkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiU0hPV19DQVJEX0NPTlRFWFRcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiU0hPV19DQVJEX0NPTlRFWFRfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Muc2hvd0NvbnRleHRJbkNhcmRzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnNob3dDb250ZXh0SW5DYXJkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQ0FSRF9NT0RBTF9IRUlHSFRfUEVSQ0VOVFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFNsaWRlcigoc2xpZGVyKSA9PlxuICAgICAgICAgICAgICAgIHNsaWRlclxuICAgICAgICAgICAgICAgICAgICAuc2V0TGltaXRzKDEwLCAxMDAsIDUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhlaWdodFBlcmNlbnRhZ2UpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkSGVpZ2h0UGVyY2VudGFnZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkSGVpZ2h0UGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRIZWlnaHRQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkNBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFNsaWRlcigoc2xpZGVyKSA9PlxuICAgICAgICAgICAgICAgIHNsaWRlclxuICAgICAgICAgICAgICAgICAgICAuc2V0TGltaXRzKDEwLCAxMDAsIDUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFdpZHRoUGVyY2VudGFnZSlcbiAgICAgICAgICAgICAgICAgICAgLnNldER5bmFtaWNUb29sdGlwKClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRXaWR0aFBlcmNlbnRhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRUb29sdGlwKHQoXCJSRVNFVF9ERUZBVUxUXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFdpZHRoUGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRXaWR0aFBlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldE5hbWUodChcIlJBTkRPTUlaRV9DQVJEX09SREVSXCIpKS5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnJhbmRvbWl6ZUNhcmRPcmRlcilcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MucmFuZG9taXplQ2FyZE9yZGVyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0TmFtZSh0KFwiQ09OVkVSVF9ISUdITElHSFRTX1RPX0NMT1pFU1wiKSkuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0TmFtZSh0KFwiQ09OVkVSVF9CT0xEX1RFWFRfVE9fQ0xPWkVTXCIpKS5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0Qm9sZFRleHRUb0Nsb3plcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVNcIikpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmNvbnZlcnRDdXJseUJyYWNrZXRzVG9DbG96ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuY29udmVydEN1cmx5QnJhY2tldHNUb0Nsb3plcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiSU5MSU5FX0NBUkRTX1NFUEFSQVRPUlwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaW5nbGVMaW5lQ2FyZFNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Muc2luZ2xlTGluZUNhcmRTZXBhcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1Muc2luZ2xlTGluZUNhcmRTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiSU5MSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUlwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaW5nbGVMaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRUb29sdGlwKHQoXCJSRVNFVF9ERUZBVUxUXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1Muc2luZ2xlTGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkdcIikpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm11bHRpbGluZUNhcmRTZXBhcmF0b3IpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lQ2FyZFNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lQ2FyZFNlcGFyYXRvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5tdWx0aWxpbmVDYXJkU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIk1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1JcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiRklYX1NFUEFSQVRPUlNfTUFOVUFMTFlfV0FSTklOR1wiKSlcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm11bHRpbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NFVFRJTkdTLm11bHRpbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJGTEFTSENBUkRfRUFTWV9MQUJFTFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGTEFTSENBUkRfRUFTWV9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEVhc3lUZXh0KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEVhc3lUZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRFYXN5VGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRFYXN5VGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJGTEFTSENBUkRfR09PRF9MQUJFTFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGTEFTSENBUkRfR09PRF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEdvb2RUZXh0KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEdvb2RUZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRHb29kVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRHb29kVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJGTEFTSENBUkRfSEFSRF9MQUJFTFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGTEFTSENBUkRfSEFSRF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhhcmRUZXh0KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhhcmRUZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRIYXJkVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRIYXJkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogYCR7dChcIk5PVEVTXCIpfWAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldE5hbWUodChcIlJFVklFV19QQU5FX09OX1NUQVJUVVBcIikpLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZW5hYmxlTm90ZVJldmlld1BhbmVPblN0YXJ0dXApXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmVuYWJsZU5vdGVSZXZpZXdQYW5lT25TdGFydHVwID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJUQUdTX1RPX1JFVklFV1wiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJUQUdTX1RPX1JFVklFV19ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MudGFnc1RvUmV2aWV3LmpvaW4oXCIgXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnRhZ3NUb1JldmlldyA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJPUEVOX1JBTkRPTV9OT1RFXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIk9QRU5fUkFORE9NX05PVEVfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXROYW1lKHQoXCJBVVRPX05FWFRfTk9URVwiKSkuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5hdXRvTmV4dE5vdGUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYXV0b05leHROb3RlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZGlzYWJsZUZpbGVNZW51UmV2aWV3T3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5kaXNhYmxlRmlsZU1lbnVSZXZpZXdPcHRpb25zID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJNQVhfTl9EQVlTX1JFVklFV19RVUVVRVwiKSlcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlOiBudW1iZXIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1WYWx1ZSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIk1JTl9PTkVfREFZXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhORGF5c05vdGVzUmV2aWV3UXVldWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlID0gbnVtVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiVkFMSURfTlVNQkVSX1dBUk5JTkdcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhORGF5c05vdGVzUmV2aWV3UXVldWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBgJHt0KFwiVUlfUFJFRkVSRU5DRVNcIil9YCB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmluaXRpYWxseUV4cGFuZEFsbFN1YmRlY2tzSW5UcmVlKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmluaXRpYWxseUV4cGFuZEFsbFN1YmRlY2tzSW5UcmVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogYCR7dChcIkFMR09SSVRITVwiKX1gIH0pO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSB0KFwiQ0hFQ0tfQUxHT1JJVEhNX1dJS0lcIiwge1xuICAgICAgICAgICAgYWxnb191cmw6IFwiaHR0cHM6Ly93d3cuc3RlcGhlbm13YW5naS5jb20vb2JzaWRpYW4tc3BhY2VkLXJlcGV0aXRpb24vYWxnb3JpdGhtcy9cIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQkFTRV9FQVNFXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkJBU0VfRUFTRV9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlLnRvU3RyaW5nKCkpLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlOiBudW1iZXIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW1WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVmFsdWUgPCAxMzApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiQkFTRV9FQVNFX01JTl9XQVJOSU5HXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5iYXNlRWFzZSA9IG51bVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIlZBTElEX05VTUJFUl9XQVJOSU5HXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYmFzZUVhc2UgPSBERUZBVUxUX1NFVFRJTkdTLmJhc2VFYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkxBUFNFX0lOVEVSVkFMX0NIQU5HRVwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJMQVBTRV9JTlRFUlZBTF9DSEFOR0VfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRTbGlkZXIoKHNsaWRlcikgPT5cbiAgICAgICAgICAgICAgICBzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgLnNldExpbWl0cygxLCA5OSwgMSlcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubGFwc2VzSW50ZXJ2YWxDaGFuZ2UgKiAxMDApXG4gICAgICAgICAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5sYXBzZXNJbnRlcnZhbENoYW5nZSA9IHZhbHVlIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubGFwc2VzSW50ZXJ2YWxDaGFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1MubGFwc2VzSW50ZXJ2YWxDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiRUFTWV9CT05VU1wiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJFQVNZX0JPTlVTX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSgodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5lYXN5Qm9udXMgKiAxMDApLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlOiBudW1iZXIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1WYWx1ZSA8IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiRUFTWV9CT05VU19NSU5fV0FSTklOR1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmVhc3lCb251cyAqIDEwMCkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZWFzeUJvbnVzID0gbnVtVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiVkFMSURfTlVNQkVSX1dBUk5JTkdcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5lYXN5Qm9udXMgPSBERUZBVUxUX1NFVFRJTkdTLmVhc3lCb251cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJNQVhfSU5URVJWQUxcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiTUFYX0lOVEVSVkFMX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm1heGltdW1JbnRlcnZhbC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1WYWx1ZTogbnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVmFsdWUgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKHQoXCJNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkdcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm1heGltdW1JbnRlcnZhbC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhpbXVtSW50ZXJ2YWwgPSBudW1WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKHQoXCJWQUxJRF9OVU1CRVJfV0FSTklOR1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRUb29sdGlwKHQoXCJSRVNFVF9ERUZBVUxUXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm1heGltdW1JbnRlcnZhbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5tYXhpbXVtSW50ZXJ2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiTUFYX0xJTktfQ09OVFJJQlwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJNQVhfTElOS19DT05UUklCX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+XG4gICAgICAgICAgICAgICAgc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRMaW1pdHMoMCwgMTAwLCAxKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhMaW5rRmFjdG9yICogMTAwKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TGlua0ZhY3RvciA9IHZhbHVlIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TGlua0ZhY3RvciA9IERFRkFVTFRfU0VUVElOR1MubWF4TGlua0ZhY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogYCR7dChcIkxPR0dJTkdcIil9YCB9KTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldE5hbWUodChcIkRJU1BMQVlfREVCVUdfSU5GT1wiKSkuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaG93RGVidWdNZXNzYWdlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaG93RGVidWdNZXNzYWdlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICIvLyBodHRwczovL2dpdGh1Yi5jb20vbWdtZXllcnMvb2JzaWRpYW4ta2FuYmFuL2Jsb2IvOTMwMTRjMjUxMjUwN2ZkZTllYWZkMjQxZThkNDM2OGE4ZGZkZjg1My9zcmMvbGFuZy9oZWxwZXJzLnRzXG5cbmltcG9ydCB7IG1vbWVudCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IGFmIGZyb20gXCIuL2xvY2FsZS9hZlwiO1xuaW1wb3J0IGFyIGZyb20gXCIuL2xvY2FsZS9hclwiO1xuaW1wb3J0IGN6IGZyb20gXCIuL2xvY2FsZS9jelwiO1xuaW1wb3J0IGJuIGZyb20gXCIuL2xvY2FsZS9iblwiO1xuaW1wb3J0IGRhIGZyb20gXCIuL2xvY2FsZS9kYVwiO1xuaW1wb3J0IGRlIGZyb20gXCIuL2xvY2FsZS9kZVwiO1xuaW1wb3J0IGVuIGZyb20gXCIuL2xvY2FsZS9lblwiO1xuaW1wb3J0IGVuR0IgZnJvbSBcIi4vbG9jYWxlL2VuLWdiXCI7XG5pbXBvcnQgZXMgZnJvbSBcIi4vbG9jYWxlL2VzXCI7XG5pbXBvcnQgZnIgZnJvbSBcIi4vbG9jYWxlL2ZyXCI7XG5pbXBvcnQgaGkgZnJvbSBcIi4vbG9jYWxlL2hpXCI7XG5pbXBvcnQgaWQgZnJvbSBcIi4vbG9jYWxlL2lkXCI7XG5pbXBvcnQgaXQgZnJvbSBcIi4vbG9jYWxlL2l0XCI7XG5pbXBvcnQgamEgZnJvbSBcIi4vbG9jYWxlL2phXCI7XG5pbXBvcnQga28gZnJvbSBcIi4vbG9jYWxlL2tvXCI7XG5pbXBvcnQgbXIgZnJvbSBcIi4vbG9jYWxlL21yXCI7XG5pbXBvcnQgbmwgZnJvbSBcIi4vbG9jYWxlL25sXCI7XG5pbXBvcnQgbm8gZnJvbSBcIi4vbG9jYWxlL25vXCI7XG5pbXBvcnQgcGwgZnJvbSBcIi4vbG9jYWxlL3BsXCI7XG5pbXBvcnQgcHQgZnJvbSBcIi4vbG9jYWxlL3B0XCI7XG5pbXBvcnQgcHRCUiBmcm9tIFwiLi9sb2NhbGUvcHQtYnJcIjtcbmltcG9ydCBybyBmcm9tIFwiLi9sb2NhbGUvcm9cIjtcbmltcG9ydCBydSBmcm9tIFwiLi9sb2NhbGUvcnVcIjtcbmltcG9ydCB0YSBmcm9tIFwiLi9sb2NhbGUvdGFcIjtcbmltcG9ydCB0ZSBmcm9tIFwiLi9sb2NhbGUvdGVcIjtcbmltcG9ydCB0aCBmcm9tIFwiLi9sb2NhbGUvdGhcIjtcbmltcG9ydCB0ciBmcm9tIFwiLi9sb2NhbGUvdHJcIjtcbmltcG9ydCB1ayBmcm9tIFwiLi9sb2NhbGUvdWtcIjtcbmltcG9ydCB1ciBmcm9tIFwiLi9sb2NhbGUvdXJcIjtcbmltcG9ydCB2aSBmcm9tIFwiLi9sb2NhbGUvdmlcIjtcbmltcG9ydCB6aENOIGZyb20gXCIuL2xvY2FsZS96aC1jblwiO1xuaW1wb3J0IHpoVFcgZnJvbSBcIi4vbG9jYWxlL3poLXR3XCI7XG5cbmV4cG9ydCBjb25zdCBsb2NhbGVNYXA6IHsgW2s6IHN0cmluZ106IFBhcnRpYWw8dHlwZW9mIGVuPiB9ID0ge1xuICAgIGFmLFxuICAgIGFyLFxuICAgIGJuLFxuICAgIGNzOiBjeixcbiAgICBkYSxcbiAgICBkZSxcbiAgICBlbixcbiAgICBcImVuLWdiXCI6IGVuR0IsXG4gICAgZXMsXG4gICAgZnIsXG4gICAgaGksXG4gICAgaWQsXG4gICAgaXQsXG4gICAgamEsXG4gICAga28sXG4gICAgbXIsXG4gICAgbmwsXG4gICAgbm46IG5vLFxuICAgIHBsLFxuICAgIHB0LFxuICAgIFwicHQtYnJcIjogcHRCUixcbiAgICBybyxcbiAgICBydSxcbiAgICB0YSxcbiAgICB0ZSxcbiAgICB0aCxcbiAgICB0cixcbiAgICB1ayxcbiAgICB1cixcbiAgICB2aSxcbiAgICBcInpoLWNuXCI6IHpoQ04sXG4gICAgXCJ6aC10d1wiOiB6aFRXLFxufTtcblxuY29uc3QgbG9jYWxlID0gbG9jYWxlTWFwW21vbWVudC5sb2NhbGUoKV07XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTAxNTg0MC9cbmZ1bmN0aW9uIGludGVycG9sYXRlKHN0cjogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhwYXJhbXMpO1xuICAgIGNvbnN0IHZhbHM6IHVua25vd25bXSA9IE9iamVjdC52YWx1ZXMocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLm5hbWVzLCBgcmV0dXJuIFxcYCR7c3RyfVxcYDtgKSguLi52YWxzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHQoc3RyOiBrZXlvZiB0eXBlb2YgZW4sIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBTUlMgZXJyb3I6IExvY2FsZSAke21vbWVudC5sb2NhbGUoKX0gbm90IGZvdW5kLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IChsb2NhbGUgJiYgbG9jYWxlW3N0cl0pIHx8IGVuW3N0cl07XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShyZXN1bHQsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvLyBBZnJpa2FhbnNcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRBXHUwNjI5XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjRGXHUwNjMyXHUwNjQ1XHUwNjRFXHUwNjI3XHUwNjJBXCIsXG4gICAgRFVFX0NBUkRTOiBcIlx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2NDVcdTA2NEZcdTA2MzNcdTA2MkFcdTA2MkRcdTA2NDJcdTA2MjlcIixcbiAgICBORVdfQ0FSRFM6IFwiXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyQ1x1MDYyRlx1MDY0QVx1MDYyRlx1MDYyOVwiLFxuICAgIFRPVEFMX0NBUkRTOiBcIlx1MDYyNVx1MDYyQ1x1MDY0NVx1MDYyN1x1MDY0NFx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkFcIixcbiAgICBCQUNLOiBcIlx1MDYzMVx1MDYyQ1x1MDY0OFx1MDYzOVwiLFxuICAgIFNLSVA6IFwiU2tpcFwiLFxuICAgIEVESVRfQ0FSRDogXCJcdTA2MkFcdTA2MzlcdTA2MkZcdTA2NEFcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5XCIsXG4gICAgUkVTRVRfQ0FSRF9QUk9HUkVTUzogXCJcdTA2MjVcdTA2MzlcdTA2MjdcdTA2MkZcdTA2MjkgXHUwNjJBXHUwNjM5XHUwNjRBXHUwNjRBXHUwNjQ2IFx1MDYyQVx1MDY0Mlx1MDYyRlx1MDY1MVx1MDY0Rlx1MDY0NVx1MDY1MiBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjlcIixcbiAgICBIQVJEOiBcIlx1MDYzNVx1MDYzOVx1MDYyOFwiLFxuICAgIEdPT0Q6IFwiXHUwNjJDXHUwNjRBXHUwNjJGXCIsXG4gICAgRUFTWTogXCJcdTA2MzNcdTA2NDdcdTA2NDRcIixcbiAgICBTSE9XX0FOU1dFUjogXCJcdTA2MjNcdTA2MzhcdTA2NDdcdTA2NTBcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJDXHUwNjI3XHUwNjI4XHUwNjI5XCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCIuXHUwNjJBXHUwNjQ1XHUwNjUxXHUwNjRFXHUwNjJBIFx1MDYyNVx1MDYzOVx1MDYyN1x1MDYyRlx1MDYyOSBcdTA2MkFcdTA2MzlcdTA2NEFcdTA2NEFcdTA2NDYgXHUwNjJBXHUwNjQyXHUwNjJGXHUwNjUxXHUwNjRGXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOVwiLFxuICAgIFNBVkU6IFwiXHUwNjJEXHUwNjQxXHUwNjM4XCIsXG4gICAgQ0FOQ0VMOiBcIlx1MDYyNVx1MDY0NFx1MDYzQVx1MDYyN1x1MDYyMVwiLFxuICAgIE5PX0lOUFVUOiBcIi5cdTA2NDRcdTA2NDUgXHUwNjRBXHUwNjJBXHUwNjUwXHUwNjQ1IFx1MDYyQVx1MDY0Mlx1MDYyRlx1MDY0QVx1MDY0NSBcdTA2MjNcdTA2NEEgXHUwNjQ1XHUwNjRGXHUwNjJGXHUwNjJFXHUwNjQ0XHUwNjI3XHUwNjJBXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCI6XHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjQ3XHUwNjQ4XHUwNjQ0XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyRFx1MDYyN1x1MDY0NFx1MDY0QVx1MDYyOVwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIjpcdTA2MjdcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBIFx1MDYyN1x1MDY0NFx1MDYyRFx1MDYyN1x1MDY0NFx1MDY0QVwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiJHtub3RlUGF0aH0gOlx1MDYyQVx1MDY0NSBcdTA2MjVcdTA2NDZcdTA2MzRcdTA2MjdcdTA2MjRcdTA2NDdcdTA2MjcgXHUwNjQ1XHUwNjQ2XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiXHUwNjI3XHUwNjQxXHUwNjJBXHUwNjJEIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSBcdTA2NDRcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjlcIixcbiAgICBSRVZJRVdfQ0FSRFM6IFwiXHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVwiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2Mjk6IFx1MDYzM1x1MDY0N1x1MDY0NFwiLFxuICAgIFJFVklFV19HT09EX0ZJTEVfTUVOVTogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2Mjk6IFx1MDYyQ1x1MDY0QVx1MDYyRlwiLFxuICAgIFJFVklFV19IQVJEX0ZJTEVfTUVOVTogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2Mjk6IFx1MDYzNVx1MDYzOVx1MDYyOFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjQzXHUwNjQwIFx1MDYzM1x1MDY0N1x1MDY0NFx1MDYyOVwiLFxuICAgIFJFVklFV19OT1RFX0dPT0RfQ01EOiBcIlx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjQzXHUwNjQwIFx1MDYyQ1x1MDY0QVx1MDYyRlx1MDYyOVwiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIlx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjQzXHUwNjQwIFx1MDYzNVx1MDYzOVx1MDYyOFx1MDYyOVwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlx1MDYyRFx1MDYyRlx1MDYyRiBcdTA2MzFcdTA2NEZcdTA2MzJcdTA2NDVcdTA2NEVcdTA2MjkgXHUwNjQ0XHUwNjQ0XHUwNjJEXHUwNjM0XHUwNjMxXCIsXG4gICAgUkVWSUVXX0FMTF9DQVJEUzogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDY0NVx1MDY0NiBcdTA2MkNcdTA2NDVcdTA2NEFcdTA2MzkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBXCIsXG4gICAgUkVWSUVXX0NBUkRTX0lOX05PVEU6IFwiXHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSAgXHUwNjQ1XHUwNjQ2IFx1MDY0N1x1MDYzMFx1MDY0NyBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjlcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiXHUwNjIzXHUwNjJEXHUwNjM0XHUwNjMxIFx1MDYyQ1x1MDY0NVx1MDY0QVx1MDYzOSBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEgXHUwNjQ3XHUwNjMwXHUwNjQ3IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHUwNjM5XHUwNjMxXHUwNjM2IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyRFx1MDYzNVx1MDYyN1x1MDYyNlx1MDY0QVx1MDYyN1x1MDYyQVwiLFxuICAgIFNUQVRVU19CQVI6IFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyQVx1MDYyRFx1MDY0Mlx1MDYyOSAke2R1ZUZsYXNoY2FyZHNDb3VudH0sXHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBICR7ZHVlTm90ZXNDb3VudH06XHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5XCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIiR7dH1tcyBcdTA2MjdcdTA2MzNcdTA2MkFcdTA2M0FcdTA2MzFcdTA2MjdcdTA2NDIgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjMyXHUwNjI3XHUwNjQ1XHUwNjQ2XHUwNjI5XCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCIuXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI5IFx1MDY0QVx1MDYyQVx1MDY0NSBcdTA2MkRcdTA2NDFcdTA2MzhcdTA2NDdcdTA2MjcgXHUwNjM2XHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYyQ1x1MDY0NFx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MzBcdTA2NEEgXHUwNjJBXHUwNjQ1IFx1MDYyQVx1MDYyQ1x1MDYyN1x1MDY0N1x1MDY0NFx1MDY0NyAoXHUwNjJBXHUwNjJEXHUwNjQyXHUwNjQyIFx1MDY0NVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MzlcdTA2MkZcdTA2MjdcdTA2MkZcdTA2MjdcdTA2MkEpXCIsXG4gICAgUExFQVNFX1RBR19OT1RFOiBcIi5cdTA2NEFcdTA2MzFcdTA2MkNcdTA2NDkgXHUwNjQ4XHUwNjM2XHUwNjM5IFx1MDY0OFx1MDYzM1x1MDY0NSBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI5IFx1MDYyOFx1MDYzNFx1MDY0M1x1MDY0NCBcdTA2NDVcdTA2NDZcdTA2MjdcdTA2MzNcdTA2MjggXHUwNjQ0XHUwNjQ0XHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5IChcdTA2NDFcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjM5XHUwNjJGXHUwNjI3XHUwNjJGXHUwNjI3XHUwNjJBKVwiLFxuICAgIFJFU1BPTlNFX1JFQ0VJVkVEOiBcIi5cdTA2MjdcdTA2MzNcdTA2MkFcdTA2NEZcdTA2NDRcdTA2NDVcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjMzXHUwNjJBXHUwNjJDXHUwNjI3XHUwNjI4XHUwNjI5XCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiJHtkZWNrTmFtZX0gXHUwNjQ0XHUwNjI3IFx1MDY0QVx1MDY0OFx1MDYyQ1x1MDYyRiBcdTA2MzFcdTA2NEZcdTA2MzJcdTA2NDVcdTA2NEVcdTA2MjlcIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlx1RDgzRFx1REUwNiBcdTA2NDRcdTA2NDJcdTA2MkYgXHUwNjJBXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYyOFx1MDYzNiBcdTA2MzlcdTA2NDRcdTA2NEFcdTA2NDNcdTA2NDUgXHUwNjJDXHUwNjQ1XHUwNjRBXHUwNjM5XHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYyMlx1MDY0NlwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCJcdTA2NEFcdTA2NDhcdTA2NDUvXHUwNjIzXHUwNjRBXHUwNjI3XHUwNjQ1ICR7aW50ZXJ2YWx9XCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiXHUwNjM0XHUwNjQ3XHUwNjMxL1x1MDYyM1x1MDYzNFx1MDY0N1x1MDYzMSAke2ludGVydmFsfVwiLFxuICAgIFlFQVJTX1NUUl9JVkw6IFwiXHUwNjMzXHUwNjQ2XHUwNjI5L1x1MDYzM1x1MDY0Nlx1MDY0OFx1MDYyN1x1MDYyQSAke2ludGVydmFsfVwiLFxuICAgIERBWVNfU1RSX0lWTF9NT0JJTEU6IFwiXHUwNjRBJHtpbnRlcnZhbH1cIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiXHUwNjM0JHtpbnRlcnZhbH1cIixcbiAgICBZRUFSU19TVFJfSVZMX01PQklMRTogXCJcdTA2MzMke2ludGVydmFsfVwiLFxuXG4gICAgLy8gc2V0dGluZ3MudHNcbiAgICBTRVRUSU5HU19IRUFERVI6IFwiU3BhY2VkIFJlcGV0aXRpb24gUGx1Z2luIC0gU2V0dGluZ3NcIixcbiAgICBDSEVDS19XSUtJOiAnLjxhIGhyZWY9XCIke3dpa2lfdXJsfVwiPndpa2k8L2E+IFx1MDY0NFx1MDY0NVx1MDYzMlx1MDY0QVx1MDYyRiBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM5XHUwNjQ0XHUwNjQ4XHUwNjQ1XHUwNjI3XHUwNjJBIFx1MDYwQyBcdTA2MkFcdTA2MkRcdTA2NDJcdTA2NDIgXHUwNjQ1XHUwNjQ2JyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdTA2NDVcdTA2MkNcdTA2NDRcdTA2MkZcdTA2MjdcdTA2MkEgXHUwNjQ0XHUwNjJBXHUwNjJDXHUwNjI3XHUwNjQ3XHUwNjQ0XHUwNjQ3XHUwNjI3XCIsXG4gICAgRk9MREVSU19UT19JR05PUkVfREVTQzpcbiAgICAgICAgXCJUZW1wbGF0ZXMgTWV0YS9TY3JpcHRzIDogXHUwNjIzXHUwNjJGXHUwNjJFXHUwNjQ0IFx1MDY0NVx1MDYzM1x1MDYyN1x1MDYzMVx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkNcdTA2NDRcdTA2MkYgXHUwNjQ1XHUwNjQxXHUwNjM1XHUwNjQ4XHUwNjQ0XHUwNjI5IFx1MDYyOFx1MDY0OFx1MDYyN1x1MDYzM1x1MDYzN1x1MDYyOSBcdTA2MzNcdTA2MzdcdTA2NDhcdTA2MzEgXHUwNjJDXHUwNjJGXHUwNjRBXHUwNjJGXHUwNjI5LFx1MDY0NVx1MDYyQlx1MDYyN1x1MDY0NFwiLFxuICAgIEZMQVNIQ0FSRFM6IFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBXCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiXHUwNjQ2XHUwNjM1IFx1MDYyN1x1MDY0NFx1MDYzMlx1MDYzMSBcdTA2MzNcdTA2NDdcdTA2NDRcIixcbiAgICBGTEFTSENBUkRfR09PRF9MQUJFTDogXCJcdTA2NDZcdTA2MzUgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjMxIFx1MDYyQ1x1MDY0QVx1MDYyRlwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIlx1MDY0Nlx1MDYzNSBcdTA2MjdcdTA2NDRcdTA2MzJcdTA2MzEgXHUwNjM1XHUwNjM5XHUwNjI4XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogJ1wiXHUwNjJBXHUwNjJFXHUwNjM1XHUwNjRBXHUwNjM1IFx1MDYyN1x1MDY0NFx1MDYyQVx1MDYzM1x1MDY0NVx1MDY0QVx1MDYyOSBcdTA2NDRcdTA2NDRcdTA2MzJcdTA2MzEgXCJcdTA2MzNcdTA2NDdcdTA2NDQnLFxuICAgIEZMQVNIQ0FSRF9HT09EX0RFU0M6ICdcIlx1MDYyQVx1MDYyRVx1MDYzNVx1MDY0QVx1MDYzNSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MzNcdTA2NDVcdTA2NEFcdTA2MjkgXHUwNjQ0XHUwNjQ0XHUwNjMyXHUwNjMxIFwiXHUwNjJDXHUwNjRBXHUwNjJGJyxcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiAnXCJcdTA2MkFcdTA2MkVcdTA2MzVcdTA2NEFcdTA2MzUgXHUwNjI3XHUwNjQ0XHUwNjJBXHUwNjMzXHUwNjQ1XHUwNjRBXHUwNjI5IFx1MDY0NFx1MDY0NFx1MDYzMlx1MDYzMSBcIlx1MDYzNVx1MDYzOVx1MDYyOCcsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiXHUwNjQ4XHUwNjRGXHUwNjMzXHUwNjQ4XHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6IFwiIzJcdTA2MjNcdTA2MkZcdTA2MkVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjQ4XHUwNjRGXHUwNjMzXHUwNjQ4XHUwNjQ1IFx1MDY0NVx1MDY0MVx1MDYzNVx1MDY0OFx1MDY0NFx1MDYyOSBcdTA2MjhcdTA2NDVcdTA2MzNcdTA2MjdcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjIzXHUwNjQ4IFx1MDYyM1x1MDYzM1x1MDYzN1x1MDYzMSBcdTA2MkNcdTA2MkZcdTA2NEFcdTA2MkZcdTA2MjkgXHUwNjBDIFx1MDYyM1x1MDY0QSBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEjIFx1MDYzMVx1MDYzMlx1MDY0NVx1MDYyOTMjIFx1MDYzMVx1MDYzMlx1MDY0NVx1MDYyOVwiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJcdTA2MkFcdTA2MkRcdTA2NDhcdTA2NEFcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJDXHUwNjQ0XHUwNjJGXHUwNjI3XHUwNjJBIFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2NDVcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjIzXHUwNjM1XHUwNjQ0XHUwNjRBXHUwNjI5IFx1MDY0OCBcdTA2NDVcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjM5XHUwNjRBXHUwNjI5XHUwNjFGXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiLlx1MDY0N1x1MDYzMFx1MDYyNyBcdTA2NDdcdTA2NDggXHUwNjI4XHUwNjJGXHUwNjRBXHUwNjQ0IFx1MDY0NFx1MDYyRVx1MDY0QVx1MDYyN1x1MDYzMSBcdTA2NDhcdTA2MzNcdTA2NDhcdTA2NDUgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5IFx1MDYyM1x1MDYzOVx1MDY0NFx1MDYyN1x1MDY0N1wiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTOiBcIlx1MDYyRFx1MDY0MVx1MDYzOCBcdTA2MkFcdTA2MzlcdTA2NDRcdTA2NEFcdTA2NDIgXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjJGXHUwNjQ4XHUwNjQ0XHUwNjI5IFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjM3XHUwNjMxIFx1MDY0NVx1MDYyQlx1MDY0NCBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2MzdcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjJFXHUwNjRBXHUwNjMxIFx1MDY0NFx1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOSBcdTA2MUZcIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDOiBcIlx1MDY0NFx1MDYyNyBcdTA2MkFcdTA2NDNcdTA2MzNcdTA2MzEgXHUwNjJBXHUwNjQ2XHUwNjMzXHUwNjRBXHUwNjQyIFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYyN1x1MDYyNlx1MDY0NVx1MDYyOSBIVE1MIFx1MDYzM1x1MDY0QVx1MDYyNFx1MDYyRlx1MDY0QSBcdTA2MkFcdTA2MzRcdTA2M0FcdTA2NEFcdTA2NDQgXHUwNjQ3XHUwNjMwXHUwNjI3IFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2MkNcdTA2MzlcdTA2NDQgXHUwNjJBXHUwNjM5XHUwNjQ0XHUwNjRBXHUwNjQyXHUwNjI3XHUwNjJBXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZOiBcIlx1MDYyM1x1MDYyRVx1MDY0MVx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjM0XHUwNjQyXHUwNjRBXHUwNjQyXHUwNjI5IFx1MDYyRFx1MDYyQVx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2NEFcdTA2NDhcdTA2NDUgXHUwNjI3XHUwNjQ0XHUwNjJBXHUwNjI3XHUwNjQ0XHUwNjRBXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiY2xvemUgZGVsZXRpb25zIDogXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDYzNFx1MDY0Mlx1MDY0QVx1MDY0Mlx1MDYyOSBcdTA2NDdcdTA2NEEgXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyQVx1MDY0NSBcdTA2MjVcdTA2NDZcdTA2MzRcdTA2MjdcdTA2MjRcdTA2NDdcdTA2MjcgXHUwNjQ1XHUwNjQ2IFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDZcdTA2MzUgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5IFx1MDY0M1x1MDY0MFwiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUOiBcIlx1MDYyNVx1MDYzOFx1MDY0N1x1MDYyN1x1MDYzMSBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NEFcdTA2MjdcdTA2NDIgXHUwNjQxXHUwNjRBIFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVx1MDYxRlwiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUX0RFU0M6IFwiaS5lLiBUaXRsZSA+IEhlYWRpbmcgMSA+IFN1YmhlYWRpbmcgPiAuLi4gPiBTdWJoZWFkaW5nXCIsXG4gICAgQ0FSRF9NT0RBTF9IRUlHSFRfUEVSQ0VOVDogXCJcdTA2NDZcdTA2MzNcdTA2MjhcdTA2MjkgXHUwNjI3XHUwNjMxXHUwNjJBXHUwNjQxXHUwNjI3XHUwNjM5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOVwiLFxuICAgIENBUkRfTU9EQUxfU0laRV9QRVJDRU5UX0RFU0M6XG4gICAgICAgIFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYzNlx1MDYyOFx1MDYzN1x1MDY0N1x1MDYyNyBcdTA2MzlcdTA2NDRcdTA2NDkgMTAwIFx1MDY2QSBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI3XHUwNjQ0XHUwNjQ3XHUwNjI3XHUwNjJBXHUwNjQxIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYyRFx1MDY0NVx1MDY0OFx1MDY0NCBcdTA2MjNcdTA2NDggXHUwNjI1XHUwNjMwXHUwNjI3IFx1MDY0M1x1MDYyN1x1MDY0NiBcdTA2NDRcdTA2MkZcdTA2NEFcdTA2NDMgXHUwNjM1XHUwNjQ4XHUwNjMxIFx1MDY0M1x1MDYyOFx1MDY0QVx1MDYzMVx1MDYyOSBcdTA2MkNcdTA2MkZcdTA2NEJcdTA2MjdcIixcbiAgICBSRVNFVF9ERUZBVUxUOiBcIlx1MDYyNVx1MDYzOVx1MDYyN1x1MDYyRlx1MDYyOSBcdTA2MkFcdTA2MzlcdTA2NEFcdTA2NEFcdTA2NDYgXHUwNjI1XHUwNjQ0XHUwNjQ5IFx1MDYyN1x1MDY0NFx1MDYyN1x1MDY0MVx1MDYyQVx1MDYzMVx1MDYyN1x1MDYzNlx1MDY0QVwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJcdTA2NDZcdTA2MzNcdTA2MjhcdTA2MjkgXHUwNjM5XHUwNjMxXHUwNjM2IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOVwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlx1MDYyQVx1MDYzMVx1MDYyQVx1MDY0QVx1MDYyOCBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjkgXHUwNjM5XHUwNjM0XHUwNjQ4XHUwNjI3XHUwNjI2XHUwNjRBIFx1MDYyM1x1MDYyQlx1MDY0Nlx1MDYyN1x1MDYyMSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjlcdTA2MUZcIixcbiAgICBESVNBQkxFX0NMT1pFX0NBUkRTOiBcIlx1MDYxRmNsb3plIFx1MDYyQVx1MDYzOVx1MDYzN1x1MDY0QVx1MDY0NCBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkFcIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIkNvbnZlcnQgPT1oaWdodGxpZ2h0cz09IHRvIGNsb3plcz9cIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiQ29udmVydCAqKmJvbGRlZCB0ZXh0KiogdG8gY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcIkNvbnZlcnQge3tjdXJseSBicmFja2V0c319IHRvIGNsb3plcz9cIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2NDVcdTA2NDYgXHUwNjIzXHUwNjJDXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzZcdTA2NDVcdTA2NDZcdTA2MjlcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOlxuICAgICAgICBcIlx1MDYzNlx1MDYzOSBcdTA2NDFcdTA2NEEgXHUwNjJEXHUwNjMzXHUwNjI3XHUwNjI4XHUwNjQzIFx1MDYyM1x1MDY0Nlx1MDY0NyBcdTA2MjhcdTA2MzlcdTA2MkYgXHUwNjJBXHUwNjNBXHUwNjRBXHUwNjRBXHUwNjMxIFx1MDY0N1x1MDYzMFx1MDYyNyBcdTA2MEMgXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYzOVx1MDY0NFx1MDY0QVx1MDY0MyBcdTA2MkFcdTA2MzlcdTA2MkZcdTA2NEFcdTA2NDQgXHUwNjIzXHUwNjRBIFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2NDRcdTA2MkZcdTA2NEFcdTA2NDMgXHUwNjI4XHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjM5XHUwNjQ0IFx1MDY0QVx1MDYyRlx1MDY0OFx1MDY0QVx1MDY0Qlx1MDYyN1wiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHUwNjQxXHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDY0NVx1MDY0NiBcdTA2MjNcdTA2MkNcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDY0M1x1MDYzM1x1MDY0QVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzZcdTA2NDVcdTA2NDZcdTA2MjlcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2NDVcdTA2NDYgXHUwNjIzXHUwNjJDXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkFcdTA2MzlcdTA2MkZcdTA2MkZcdTA2MjlcIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2NDVcdTA2NDYgXHUwNjIzXHUwNjJDXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2NDNcdTA2MzNcdTA2NEFcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJBXHUwNjM5XHUwNjJGXHUwNjJGXHUwNjI5XCIsXG4gICAgTk9URVM6IFwiXHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBXCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJcdTA2MkFcdTA2NDVcdTA2NDNcdTA2NEFcdTA2NDYgXHUwNjJDXHUwNjMyXHUwNjIxIFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjdcdTA2MkEgXHUwNjM5XHUwNjQ2XHUwNjJGIFx1MDYyOFx1MDYyRlx1MDYyMSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MzRcdTA2M0FcdTA2NEFcdTA2NDRcIixcbiAgICBUQUdTX1RPX1JFVklFVzogXCJcdTA2NDhcdTA2MzNcdTA2NDhcdTA2NDUgXHUwNjQ0XHUwNjQ0XHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5XCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzogXCIjXHUwNjIzXHUwNjJGXHUwNjJFXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDY0OFx1MDYzM1x1MDY0OFx1MDY0NSBcdTA2NDVcdTA2NDFcdTA2MzVcdTA2NDhcdTA2NDRcdTA2MjkgXHUwNjI4XHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQxXHUwNjI3XHUwNjJBIFx1MDYyM1x1MDY0OCBcdTA2MkVcdTA2MzdcdTA2NDhcdTA2MzcgXHUwNjJDXHUwNjJGXHUwNjRBXHUwNjJGXHUwNjI5IFx1MDYwQyBcdTA2MjNcdTA2NEEgOiBcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkjIFx1MDY0OFx1MDYzM1x1MDY0NTIjIFx1MDY0OFx1MDYzM1x1MDY0NTNcIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFOiBcIlx1MDYyN1x1MDY0MVx1MDYyQVx1MDYyRCBcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjM5XHUwNjM0XHUwNjQ4XHUwNjI3XHUwNjI2XHUwNjRBXHUwNjI5IFx1MDY0NFx1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOVwiLFxuICAgIE9QRU5fUkFORE9NX05PVEVfREVTQzogXCIoUGFnZXJhbmspIFx1MDYzOVx1MDY0Nlx1MDYyRiBcdTA2MkFcdTA2MzlcdTA2MzdcdTA2NEFcdTA2NDQgXHUwNjQ3XHUwNjMwXHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYyRVx1MDY0QVx1MDYyN1x1MDYzMSBcdTA2MENcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjdcdTA2MkEgXHUwNjMzXHUwNjRBXHUwNjJBXHUwNjQ1IFx1MDYyQVx1MDYzMVx1MDYyQVx1MDY0QVx1MDYyOFx1MDY0Rlx1MDY0N1x1MDYyNyBcdTA2MkRcdTA2MzNcdTA2MjggXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjQ3XHUwNjQ1XHUwNjRBXHUwNjI5XCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiXHUwNjI3XHUwNjQxXHUwNjJBXHUwNjJEIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MjdcdTA2NDRcdTA2NEFcdTA2MjkgXHUwNjJBXHUwNjQ0XHUwNjQyXHUwNjI3XHUwNjI2XHUwNjRBXHUwNjRCXHUwNjI3IFx1MDYyOFx1MDYzOVx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjlcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OUzpcbiAgICAgICAgXCJcdTA2MkFcdTA2MzlcdTA2MzdcdTA2NEFcdTA2NDQgXHUwNjJFXHUwNjRBXHUwNjI3XHUwNjMxXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2NDFcdTA2NEEgXHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDY0MVx1MDYyN1x1MDYyQSBcdTA2MEMgXHUwNjIzXHUwNjRBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOTpcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDdcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjM5XHUwNjI4IFx1MDYyN1x1MDY0NFx1MDYyQ1x1MDY0QVx1MDYyRlwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TX0RFU0M6XG4gICAgICAgIFwiXHUwNjM5XHUwNjQ2XHUwNjJGIFx1MDYyQVx1MDYzQVx1MDY0QVx1MDY0QVx1MDYzMSBcdTA2NDdcdTA2MzBcdTA2MjcgXHUwNjI3XHUwNjQ0XHUwNjJFXHUwNjRBXHUwNjI3XHUwNjMxIE9ic2lkaWFuIFx1MDYyM1x1MDYzOVx1MDYyRiBcdTA2MkFcdTA2MzRcdTA2M0FcdTA2NEFcdTA2NDQgLCBjb21tYW5kIGhvdGtleXMuIFx1MDYyOFx1MDYzOVx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MzlcdTA2MzdcdTA2NEFcdTA2NDQgXHUwNjBDIFx1MDY0QVx1MDY0NVx1MDY0M1x1MDY0Nlx1MDY0MyBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkgXHUwNjI4XHUwNjI3XHUwNjMzXHUwNjJBXHUwNjJFXHUwNjJGXHUwNjI3XHUwNjQ1XCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDYzNVx1MDY0OSBcdTA2NDRcdTA2MzlcdTA2MkZcdTA2MkYgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjRBXHUwNjI3XHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDYyQVx1MDY0QSBcdTA2NEFcdTA2MkNcdTA2MjggXHUwNjM5XHUwNjMxXHUwNjM2XHUwNjQ3XHUwNjI3IFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2NDRcdTA2NDhcdTA2MkRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjRBXHUwNjQ1XHUwNjQ2XHUwNjQ5XCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NEFcdTA2NDNcdTA2NDhcdTA2NDYgXHUwNjM5XHUwNjJGXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0QVx1MDYyN1x1MDY0NSAxIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDJcdTA2NDRcIixcbiAgICBWQUxJRF9OVU1CRVJfV0FSTklORzogXCJcdTA2NEFcdTA2MzFcdTA2MkNcdTA2NDkgXHUwNjJBXHUwNjQyXHUwNjJGXHUwNjRBXHUwNjQ1IFx1MDYzMVx1MDY0Mlx1MDY0NSBcdTA2MzVcdTA2MjdcdTA2NDRcdTA2MkRcIixcbiAgICBVSV9QUkVGRVJFTkNFUzogXCJcdTA2MkFcdTA2NDFcdTA2MzZcdTA2NEFcdTA2NDRcdTA2MjdcdTA2MkEgXHUwNjQ4XHUwNjI3XHUwNjJDXHUwNjQ3XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyQVx1MDYyRVx1MDYyRlx1MDY0NVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTpcbiAgICAgICAgXCJcdTA2NEFcdTA2MkNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0QVx1MDY0M1x1MDY0OFx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MzYgXHUwNjI3XHUwNjQ0XHUwNjM0XHUwNjJDXHUwNjMxXHUwNjRBIFx1MDY0NFx1MDY0NFx1MDYzMVx1MDY0Rlx1MDYzMlx1MDY0NSBcdTA2NDVcdTA2NDhcdTA2MzNcdTA2MzkgXHUwNjI4XHUwNjJEXHUwNjRBXHUwNjJCIFx1MDYyQVx1MDYzN1x1MDY0N1x1MDYzMSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjM5XHUwNjRBXHUwNjI5IFx1MDY0M1x1MDY0NFx1MDY0N1x1MDYyN1wiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRV9ERVNDOlxuICAgICAgICBcIiBcdTA2MzlcdTA2MzdcdTA2NDQgXHUwNjQ3XHUwNjMwXHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYyRVx1MDY0QVx1MDYyN1x1MDYzMSBcdTA2NDRcdTA2MzdcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjRGXHUwNjMyXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYyQVx1MDYyRlx1MDYyN1x1MDYyRVx1MDY0NFx1MDYyOSBcdTA2NDFcdTA2NEEgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOSAsIFx1MDY0NVx1MDY0MVx1MDY0QVx1MDYyRiBcdTA2MjVcdTA2MzBcdTA2MjcgXHUwNjQzXHUwNjI3XHUwNjQ2IFx1MDY0NFx1MDYyRlx1MDY0QVx1MDY0MyBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEgXHUwNjJBXHUwNjQ2XHUwNjJBXHUwNjQ1XHUwNjRBIFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MkZcdTA2NEFcdTA2MkYgXHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDYzMVx1MDY0Rlx1MDYzMlx1MDY0NSBcdTA2NDFcdTA2NEEgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDY0MVwiLFxuICAgIEFMR09SSVRITTogXCJcdTA2MkVcdTA2NDhcdTA2MjdcdTA2MzFcdTA2MzJcdTA2NDVcdTA2NEFcdTA2MjlcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTpcbiAgICAgICAgJzxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPmFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbjwvYT4gOlx1MDY0NFx1MDY0NVx1MDYzMlx1MDY0QVx1MDYyRiBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM5XHUwNjQ0XHUwNjQ4XHUwNjQ1XHUwNjI3XHUwNjJBIFx1MDYyQVx1MDYyRFx1MDY0Mlx1MDY0MiBcdTA2NDVcdTA2NDYnLFxuICAgIEJBU0VfRUFTRTogXCJcdTA2MzNcdTA2NDdcdTA2NDhcdTA2NDRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjI3XHUwNjM5XHUwNjJGXHUwNjI5XCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwiXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDYyRlx1MDY0Nlx1MDY0OSA9IDEzMCBcdTA2MEMgXHUwNjQ4XHUwNjRBXHUwNjQxXHUwNjM2XHUwNjQ0IFx1MDYyRFx1MDY0OFx1MDYyN1x1MDY0NFx1MDY0QSAyNTAuXCIsXG4gICAgQkFTRV9FQVNFX01JTl9XQVJOSU5HOiBcIlx1MDY0QVx1MDYyQ1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjJBXHUwNjQzXHUwNjQ4XHUwNjQ2IFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDJcdTA2MjdcdTA2MzlcdTA2MkZcdTA2MjkgMTMwIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDJcdTA2NDQuXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFOiBcIlx1MDYyN1x1MDY0NFx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2MjdcdTA2NDRcdTA2MzJcdTA2NDVcdTA2NDZcdTA2NEEgXHUwNjRBXHUwNjJBXHUwNjNBXHUwNjRBXHUwNjMxIFx1MDYzOVx1MDY0Nlx1MDYyRiBcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkgXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5L1x1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSBcdTA2MzVcdTA2MzlcdTA2MjhcdTA2MjlcIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0VfREVTQzogXCJuZXdJbnRlcnZhbCA9IG9sZEludGVydmFsICogaW50ZXJ2YWxDaGFuZ2UgLyAxMDAuXCIsXG4gICAgRUFTWV9CT05VUzogXCJcdTA2NDVcdTA2NDNcdTA2MjdcdTA2NDFcdTA2MjNcdTA2MjkgXHUwNjMzXHUwNjQ3XHUwNjQ0XHUwNjI5XCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIlx1MDYyQVx1MDYyQVx1MDY0QVx1MDYyRCBcdTA2NDRcdTA2NDMgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQzXHUwNjI3XHUwNjQxXHUwNjIzXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0NFx1MDYyOSBcdTA2MzZcdTA2MjhcdTA2MzcgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjQyIFx1MDY0MVx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2NDFcdTA2NDhcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBXHUwNjI5IFx1MDYyOFx1MDY0QVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MzFcdTA2MkYgXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjRBXHUwNjJGIFx1MDY0OFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0NCBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5L1x1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSAoXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDYyRlx1MDY0Nlx1MDY0OSA9IDEwMCBcdTA2NkEpLlwiLFxuICAgIEVBU1lfQk9OVVNfTUlOX1dBUk5JTkc6IFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2MkFcdTA2NDNcdTA2NDhcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQzXHUwNjI3XHUwNjQxXHUwNjIzXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0NFx1MDYyOSAxMDAgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDY0NC5cIixcbiAgICBNQVhfSU5URVJWQUw6IFwiXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDYzNVx1MDY0OSBcdTA2NDRcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDRcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJcdTA2NEFcdTA2MkFcdTA2NEFcdTA2MkQgXHUwNjQ0XHUwNjQzIFx1MDY0OFx1MDYzNlx1MDYzOSBcdTA2MkRcdTA2MkYgXHUwNjIzXHUwNjM5XHUwNjQ0XHUwNjQ5ICBcdTA2NDRcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBIChcdTA2MjdcdTA2NDFcdTA2MkFcdTA2MzFcdTA2MjdcdTA2MzZcdTA2NEEgPSAxMDAgXHUwNjM5XHUwNjI3XHUwNjQ1KS5cIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NEFcdTA2NDNcdTA2NDhcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDYzNVx1MDY0OSBcdTA2NDRcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBIFx1MDY0NFx1MDY0NVx1MDYyRlx1MDYyOSBcdTA2NEFcdTA2NDhcdTA2NDUgXHUwNjQ4XHUwNjI3XHUwNjJEXHUwNjJGIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDJcdTA2NDQuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJcdTA2MjNcdTA2NDJcdTA2MzVcdTA2NDkgXHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQ3XHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDYzMVx1MDYyQVx1MDYyOFx1MDYyN1x1MDYzN1wiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzogXCJcdTA2MjNcdTA2NDJcdTA2MzVcdTA2NDkgXHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQ3XHUwNjQ1XHUwNjI5IFx1MDY0NFx1MDY0NFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MkNcdTA2MkRcdTA2MjkgXHUwNjQ0XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyQVx1MDYyOFx1MDYzN1x1MDYyOSBcdTA2MjhcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDdcdTA2NDhcdTA2NDRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjQ4XHUwNjQ0XHUwNjRBXHUwNjI5LlwiLFxuICAgIExPR0dJTkc6IFwiXHUwNjJBXHUwNjMzXHUwNjJDXHUwNjRBXHUwNjQ0XCIsXG4gICAgRElTUExBWV9ERUJVR19JTkZPOiBcIlx1MDYzOVx1MDYzMVx1MDYzNiBcdTA2NDVcdTA2MzlcdTA2NDRcdTA2NDhcdTA2NDVcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjJBXHUwNjM1XHUwNjJEXHUwNjRBXHUwNjJEIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDhcdTA2MkRcdTA2MkZcdTA2MjkgXHUwNjJBXHUwNjJEXHUwNjQzXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0OFx1MDYzMVx1MDYxRlwiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjdcdTA2MkEgXHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOVwiLFxuICAgIENMT1NFOiBcIlx1MDYyM1x1MDYzQVx1MDY0NFx1MDY0MlwiLFxuICAgIE5FVzogXCJcdTA2MkNcdTA2MkZcdTA2NEFcdTA2MkZcIixcbiAgICBZRVNURVJEQVk6IFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjI3XHUwNjMxXHUwNjJEXHUwNjI5XCIsXG4gICAgVE9EQVk6IFwiXHUwNjI3XHUwNjQ0XHUwNjRBXHUwNjQ4XHUwNjQ1XCIsXG4gICAgVE9NT1JST1c6IFwiXHUwNjI3XHUwNjQ0XHUwNjNBXHUwNjJGXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJcdTA2MjVcdTA2MkRcdTA2MzVcdTA2MjdcdTA2MjZcdTA2NEFcdTA2MjdcdTA2MkFcIixcbiAgICBNT05USDogXCJcdTA2MzRcdTA2NDdcdTA2MzFcIixcbiAgICBRVUFSVEVSOiBcIlx1MDYzMVx1MDYyOFx1MDYzOSBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDZcdTA2MjlcIixcbiAgICBZRUFSOiBcIlx1MDYzM1x1MDY0Nlx1MDYyOVwiLFxuICAgIExJRkVUSU1FOiBcIlwiLFxuICAgIEZPUkVDQVNUOiBcIlwiLFxuICAgIEZPUkVDQVNUX0RFU0M6IFwiXHUwNjM5XHUwNjJGXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzNcdTA2MkFcdTA2MkRcdTA2NDJcdTA2MjkgXHUwNjQxXHUwNjRBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyQVx1MDY0Mlx1MDYyOFx1MDY0NFwiLFxuICAgIFNDSEVEVUxFRDogXCJcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDJcdTA2MzFcdTA2MzFcIixcbiAgICBEQVlTOiBcIlx1MDYyM1x1MDY0QVx1MDYyN1x1MDY0NVwiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJcdTA2MzlcdTA2MkZcdTA2MkYgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBXCIsXG4gICAgUkVWSUVXU19QRVJfREFZOiBcIlx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyN1x1MDYyQS9cdTA2MjdcdTA2NDRcdTA2NEFcdTA2NDhcdTA2NDUgJHthdmd9IDpcdTA2NDVcdTA2MkFcdTA2NDhcdTA2MzNcdTA2MzdcIixcbiAgICBJTlRFUlZBTFM6IFwiXHUwNjQxXHUwNjQ4XHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDYzMlx1MDY0NVx1MDY0Nlx1MDY0QVx1MDYyOVwiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIlx1MDYyN1x1MDY0NFx1MDYyQVx1MDYyM1x1MDYyRVx1MDY0QVx1MDYzMSBcdTA2MkRcdTA2MkFcdTA2NDkgXHUwNjRBXHUwNjJBXHUwNjQ1IFx1MDYzOVx1MDYzMVx1MDYzNiBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjdcdTA2MkEgXHUwNjQ1XHUwNjMxXHUwNjI5IFx1MDYyM1x1MDYyRVx1MDYzMVx1MDY0OVwiLFxuICAgIENPVU5UOiBcIlx1MDYzOVx1MDYyRlx1MDYyRlwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIiR7bG9uZ2VzdH0gOiBcdTA2MjNcdTA2MzdcdTA2NDhcdTA2NDQgXHUwNjQxXHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDYzMlx1MDY0NVx1MDY0Nlx1MDY0QSAsJHthdmd9IDpcdTA2NDVcdTA2MkFcdTA2NDhcdTA2MzNcdTA2MzcgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYzMlx1MDY0NVx1MDY0Nlx1MDY0QVwiLFxuICAgIEVBU0VTOiBcIlx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOVwiLFxuICAgIEVBU0VTX1NVTU1BUlk6IFwiJHthdmdFYXNlfSA6XHUwNjQ1XHUwNjJBXHUwNjQ4XHUwNjMzXHUwNjM3IFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHUwNjIzXHUwNjQ2XHUwNjQ4XHUwNjI3XHUwNjM5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVwiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdTA2NDhcdTA2NDdcdTA2MzBcdTA2MjcgXHUwNjRBXHUwNjM0XHUwNjQ1XHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkVcdTA2NDFcdTA2NEFcdTA2MjkgXHUwNjQzXHUwNjMwXHUwNjQ0XHUwNjQzIFx1MDYwQyBcdTA2MjVcdTA2NDYgXHUwNjQ4XHUwNjJDXHUwNjJGXHUwNjJBXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJcdTA2MkNcdTA2MkZcdTA2NEFcdTA2MkZcdTA2MjlcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiXHUwNjM1XHUwNjNBXHUwNjRBXHUwNjMxXHUwNjI5XCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJcdTA2NDZcdTA2MjdcdTA2MzZcdTA2MkNcdTA2MjlcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiICR7dG90YWxDYXJkc0NvdW50fSA6XHUwNjI1XHUwNjJDXHUwNjQ1XHUwNjI3XHUwNjQ0XHUwNjRBIFx1MDYzOVx1MDYyRlx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkFcIixcbn07XG4iLCAiLy8gXHUwMTBEZVx1MDE2MXRpbmFcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGZsYXNoY2FyZC1tb2RhbC50c3hcbiAgICBERUNLUzogXCJCYWxcdTAwRURcdTAxMERreVwiLFxuICAgIERVRV9DQVJEUzogXCJLYXJ0aVx1MDEwRGt5IHBvIHRlcm1cdTAwRURudVwiLFxuICAgIE5FV19DQVJEUzogXCJOb3ZcdTAwRTkga2FydGlcdTAxMERreVwiLFxuICAgIFRPVEFMX0NBUkRTOiBcIkthcnRpXHUwMTBEZWsgY2Vsa2VtXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiVnludWxvdmF0IHBva3JvayBrYXJ0aVx1MDEwRGt5XCIsXG4gICAgSEFSRDogXCJUZVx1MDE3RWtcdTAwRTlcIixcbiAgICBHT09EOiBcIkRvYnJcdTAwRTlcIixcbiAgICBFQVNZOiBcIkplZG5vZHVjaFx1MDBFOVwiLFxuICAgIFNIT1dfQU5TV0VSOiBcIlVrXHUwMEUxemF0IG9kcG92XHUwMTFCXHUwMTBGXCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCJQb2tyb2sga2FydGlcdTAxMERreSBieWwgdnludWxvdlx1MDBFMW4uXCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIk90ZXZcdTAxNTlcdTAwRUR0IHBvem5cdTAwRTFta3UgayByZXZpemlcIixcbiAgICBSRVZJRVdfQ0FSRFM6IFwiUG96blx1MDBFMW1layBrIHJldml6aVwiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJSZXZpemU6IEplZG5vZHVjaFx1MDBFOVwiLFxuICAgIFJFVklFV19HT09EX0ZJTEVfTUVOVTogXCJSZXZpemU6IERvYnJcdTAwRTlcIixcbiAgICBSRVZJRVdfSEFSRF9GSUxFX01FTlU6IFwiUmV2aXplOiBUXHUwMTFCXHUwMTdFa1x1MDBFOVwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIk96bmFcdTAxMERpdCBwb3puXHUwMEUxbWt1IGpha28gamVkbm9kdWNob3VcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJPem5hXHUwMTBEaXQgcG96blx1MDBFMW1rdSBqYWtvIGRvYnJvdVwiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIk96bmFcdTAxMERpdCBwb3puXHUwMEUxbWt1IGpha28gdGVcdTAxN0Vrb3VcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlJldmlkb3ZhdCBrYXJ0aVx1MDEwRGt5IHZlIHZcdTAxNjFlY2ggcG96blx1MDBFMW1rXHUwMEUxY2hcIixcbiAgICBDUkFNX0FMTF9DQVJEUzogXCJTZWxlY3QgYSBkZWNrIHRvIGNyYW1cIixcbiAgICBSRVZJRVdfQ0FSRFNfSU5fTk9URTogXCJSZXZpZG92YXQga2FydGlcdTAxMERreSB2IHRcdTAwRTl0byBwb3puXHUwMEUxbWNlLlwiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJDcmFtIGthcnRpXHUwMTBEa3kgdiB0XHUwMEU5dG8gcG96blx1MDBFMW1jZS5cIixcbiAgICBWSUVXX1NUQVRTOiBcIlVrXHUwMEUxemF0IHN0YXRpc3Rpa3lcIixcbiAgICBTVEFUVVNfQkFSOiBcIlJldml6ZTogJHtkdWVOb3Rlc0NvdW50fSBwb3puXHUwMEUxbWVrLCAke2R1ZUZsYXNoY2FyZHNDb3VudH0ga2FydGlcdTAxMERlayBwbyB0ZXJtXHUwMEVEbnVcIixcbiAgICBTWU5DX1RJTUVfVEFLRU46IFwiU3luY2hyb25pemFjZSB0cnZhbGEgJHt0fW1zXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJQb3puXHUwMEUxbWthIGplIHVsb1x1MDE3RWVuYSB2IGlnbm9yb3Zhblx1MDBFOSBzbG9cdTAxN0VjZSAoemtvbnRyb2x1anRlIG5hc3RhdmVuXHUwMEVEKS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiUHJvc1x1MDBFRG0gb3puYVx1MDEwRG5lIHBvem5cdTAwRTFta3Ugb2Rwb3ZcdTAwRURkYWpcdTAwRURjXHUwMEVEbSB0YWdlbSBwcm8gcmV2aXppICh2IG5hc3RhdmVuXHUwMEVEKS5cIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJPZHBvdlx1MDExQlx1MDEwRiBwXHUwMTU5aWphdGEuXCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiTmVleGlzdHVqZSBcdTAxN0VcdTAwRTFkblx1MDBGRCBiYWxcdTAwRURcdTAxMERlayBwcm8gJHtkZWNrTmFtZX1cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlZcdTAxNjFlIHpyZXZpZG92XHUwMEUxbm9cIixcblxuICAgIC8vIHNjaGVkdWxpbmcudHNcbiAgICBEQVlTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gZGVuL2RuXHUwMEVEXCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gbVx1MDExQnNcdTAwRURjKFx1MDE2RilcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IHJvayhcdTAxNkYpXCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfWRcIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1tXCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1yXCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBQbHVnaW4gLSBOYXN0YXZlblx1MDBFRFwiLFxuICAgIENIRUNLX1dJS0k6ICdQcm8gdlx1MDBFRGNlIGluZm9ybWFjXHUwMEVEIGpkXHUwMTFCdGUgbmEgPGEgaHJlZj1cIiR7d2lraV91cmx9XCI+d2lraTwvYT4uJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJJZ25vcm92YW5cdTAwRTkgc2xvXHUwMTdFa3lcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICBcIlphZGVqdGUgY2VzdHkga2Ugc2xvXHUwMTdFa1x1MDBFMW0gb2RkXHUwMTFCbGVuXHUwMEU5IG9kXHUwMTU5XHUwMEUxZGtvdlx1MDBFMW5cdTAwRURtIG5hcFx1MDE1OVx1MDBFRGthZC4gXHUwMTYwYWJsb255IE1ldGEvU2NyaXB0c1wiLFxuICAgIEZMQVNIQ0FSRFM6IFwiS2FydGlcdTAxMERreVwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIkVhc3kgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfR09PRF9MQUJFTDogXCJHb29kIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0hBUkRfTEFCRUw6IFwiSGFyZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJFYXN5XCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfR09PRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiR29vZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0hBUkRfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkhhcmRcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIlRhZyBwcm8ga2FydGlcdTAxMERreVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiWmFkZXRlIHRhZ3kgb29kXHUwMTFCbGVuXHUwMEU5IG1lemVyb3UgbmVibyBvZFx1MDE1OVx1MDBFMWRrb3ZcdTAwRTFuXHUwMEVEbSBuYXBcdTAxNTlcdTAwRURrbGFkLiAja2FydGlcdTAxMERreSAjYmFsXHUwMEVEXHUwMTBEa2UyICNiYWxcdTAwRURcdTAxMERlazMuXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTOiBcIlBcdTAxNTlldlx1MDBFOXN0IHNsb1x1MDE3RWt5IG5hIGJhbFx1MDBFRFx1MDEwRGt5IGEgcG9kYmFsXHUwMEVEXHUwMTBEa3k/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiVG90byBqZSBhbHRlcm5hdGl2YSBrIHRhZ1x1MDE2Rm0ga2FydGlcdTAxMERlayB2aXogbmFzdGF2ZW5cdTAwRUQgdlx1MDBGRFx1MDE2MWUuXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6XG4gICAgICAgIFwiVWxvXHUwMTdFaXQgcGxcdTAwRTFub3ZhY1x1MDBFRCBrb21lbnRcdTAwRTFcdTAxNTkgbmEgc3Rlam5cdTAwRkQgXHUwMTU5XHUwMEUxZGVrIGpha28gcG9zbGVkblx1MDBFRCBwb2xvXHUwMTdFa2Ega2FydGlcdTAxMERreT9cIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDOlxuICAgICAgICBcIlphcG51dFx1MDBFRCB0XHUwMEU5dG8gdm9sYnkgenBcdTAxNkZzb2JcdTAwRUQsIFx1MDE3RWUgSFRNTCBrb21lbnRcdTAwRTFcdTAxNTllIG5lYnVkb3Ugcm96Ylx1MDBFRGpldCBmb3JtXHUwMEUxdG92XHUwMEUxblx1MDBFRCBsaXN0XHUwMTZGLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJPZGxvXHUwMTdFaXQgcFx1MDE1OVx1MDBFRGJ1em5cdTAwRTkga2FydGlcdTAxMERreSBuYSBkYWxcdTAxNjFcdTAwRUQgZGVuP1wiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOlxuICAgICAgICBcIlBcdTAxNTlcdTAwRURidXpuXHUwMEU5IGthcnRpXHUwMTBEa3kganNvdSBrYXJ0aVx1MDEwRGt5IGdlbmVyb3Zhblx1MDBFOSB6IHRleHR1IHN0ZWpuXHUwMEU5IHBvem5cdTAwRTFta3kgbmFwXHUwMTU5XHUwMEVEa2xhZCBjbG96ZSBzbWF6XHUwMEUxblx1MDBFRFwiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUOiBcIlVrXHUwMEUxemF0IGtvbnRleHQgdiBrYXJ0aVx1MDEwRGNlP1wiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUX0RFU0M6IFwibmFwXHUwMTU5XHUwMEVEa2xhZCBUaXR1bGVrID4gTmFkcGlzMSA+IFBvZG5hZHBpcyA+IC4uLiA+IFBvZG5hZHBpc1wiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiVlx1MDBGRFx1MDE2MWthIGthcnRpXHUwMTBEZWsgdiBwcm9jZW50ZWNoXCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzpcbiAgICAgICAgXCJNXHUwMTFCbG8gYnkgYlx1MDBGRHQgbmFzdGF2ZW5vIG5hIDEwMCUgbmEgbW9iaWx1IG5lYm8ga2R5XHUwMTdFIHBvdVx1MDE3RVx1MDBFRHZcdTAwRTF0ZSB2ZWxrXHUwMEU5IG9iclx1MDBFMXpreVwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiUmVzZXRvdmF0IHZcdTAwRkRjaG96XHUwMEVEIG5hc3RhdmVuXHUwMEVEXCIsXG4gICAgQ0FSRF9NT0RBTF9XSURUSF9QRVJDRU5UOiBcIlx1MDE2MFx1MDBFRFx1MDE1OWthIGthcnRpXHUwMTBEZWsgdiBwcm9jZW50ZWNoXCIsXG4gICAgUkFORE9NSVpFX0NBUkRfT1JERVI6IFwiTlx1MDBFMWhvZG5cdTAxMUIgem1cdTAxMUJuaXQgcG9cdTAxNTlhZFx1MDBFRCBrYXJ0aVx1MDEwRGVrIGJcdTAxMUJoZW0gcmV2aXplP1wiLFxuICAgIERJU0FCTEVfQ0xPWkVfQ0FSRFM6IFwiVnlwbm91dCBjbG96ZSBrYXJ0aVx1MDEwRGt5P1wiLFxuICAgIENPTlZFUlRfSElHSExJR0hUU19UT19DTE9aRVM6IFwiUFx1MDE1OWV2XHUwMEU5c3QgPT16dlx1MDBGRHJhem5cdTAxMUJuXHUwMEVEPT0gbmEgY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJQXHUwMTU5ZXZcdTAwRTlzdCAqKnR1XHUwMTBEblx1MDBGRCB0ZXh0KiogbmEgY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcIlBcdTAxNTlldlx1MDBFOXN0IHt7c2xvXHUwMTdFZW5cdTAwRTkgelx1MDBFMXZvcmt5fX0gbmEgY2xvemVzP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiT2RkXHUwMTFCbG92YVx1MDEwRCBwcm8gaW5saW5lIGthcnRpXHUwMTBEa3lcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOlxuICAgICAgICBcIlBvem9yLiBKYWttaWxlIHRvdG8gem1cdTAxMUJuXHUwMEVEdGUsIGJ1ZGV0ZSBtdXNldCBydVx1MDEwRG5cdTAxMUIgdXByYXZpdCB2XHUwMTYxZWNobnkgZXhpc3R1alx1MDBFRGNcdTAwRUQga2FydGlcdTAxMERreS5cIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIk9kZFx1MDExQmxvdmFcdTAxMEQgcHJvIG90b1x1MDEwRGVuXHUwMEU5IGlubGluZSBrYXJ0aVx1MDEwRGt5XCIsXG4gICAgTVVMVElMSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJPZGRcdTAxMUJsb3ZhXHUwMTBEIHBybyB2XHUwMEVEY2VcdTAxNTlcdTAwRTFka292XHUwMEU5IGthcnRpXHUwMTBEa3lcIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIk9kZFx1MDExQmxvdmFcdTAxMEQgcHJvIHZcdTAwRURjZVx1MDE1OVx1MDBFMWRrb3ZlIG90b1x1MDEwRGVuXHUwMEU5IGthcnRpXHUwMTBEa3lcIixcbiAgICBOT1RFUzogXCJQb3puXHUwMEUxbWt5XCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiVGFnIHBybyByZXZpemlcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOlxuICAgICAgICBcIlphZGVqdGUgdGFneSBvZGRcdTAxMUJsZW5cdTAwRTkgbWV6ZXJhbWkgbmVibyBvZFx1MDE1OVx1MDBFMWRrb3ZcdTAwRTFuXHUwMEVEbSBuYXBcdTAxNTlcdTAwRURrbGFkICNyZXZpZXcgI3RhZzIgI3RhZzMuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URTogXCJPdGV2XHUwMTU5XHUwMEVEdCBuXHUwMEUxaG9kbm91IHBvem5cdTAwRTFta3UgcHJvIHJldml6aVwiLFxuICAgIE9QRU5fUkFORE9NX05PVEVfREVTQzogXCJQb2t1ZCB0b3RvIHZ5cG5ldGUsIHBvem5cdTAwRTFta3kgYnVkb3UgXHUwMTU5YXplbnkgZGxlIGRcdTAxNkZsZVx1MDE3RWl0b3N0aSAoUGFnZVJhbmspLlwiLFxuICAgIEFVVE9fTkVYVF9OT1RFOiBcIk90ZXZcdTAxNTlcdTAwRUR0IGF1dG9tYXRpY2t5IGRhbFx1MDE2MVx1MDBFRCBwb3puXHUwMEUxbWt1IHBvIGRva29uXHUwMTBEZW5cdTAwRUQgcmV2aXplXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiVnlwbm91dCB2b2xieSByZXZpemUgdiBtZW51IHNvdWJvcnUgbmFwXHUwMTU5XHUwMEVEa2xhZCAnUmV2aXplOiBKZWRub2R1Y2hcdTAwRTknXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNfREVTQzpcbiAgICAgICAgXCJQbyB2eXBudXRcdTAwRUQgbVx1MDE2Rlx1MDE3RWV0ZSBwb3VcdTAxN0VcdTAwRUR2YXQga2xcdTAwRTF2ZXNvdlx1MDBFOSB6a3JhdGt5LiBSZXN0YXJ0dWp0ZSBPYnNpZGlhbiBwbyB6bVx1MDExQm5cdTAxMUIgbmFzdGF2ZW5cdTAwRUQuXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBwb1x1MDEwRGV0IGRuXHUwMEVEIHpvYnJhemVuXHUwMEZEY2ggdiBwcmF2XHUwMEU5bSBwYW5lbHVcIixcbiAgICBNSU5fT05FX0RBWTogXCJQb1x1MDEwRGV0IGRuXHUwMEVEIG11c1x1MDBFRCBiXHUwMEZEdCBtaW5pbVx1MDBFMWxuXHUwMTFCIDEuXCIsXG4gICAgVkFMSURfTlVNQkVSX1dBUk5JTkc6IFwiUHJvc1x1MDBFRG0gemFkZWp0ZSB2YWxpZG5cdTAwRUQgXHUwMTBEXHUwMEVEc2xvLlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlBcdTAxNTllZHZvbGJ5IHVcdTAxN0VpdmF0ZWxza1x1MDBFOWhvIHJvemhyYW5cdTAwRURcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6XG4gICAgICAgIFwiU3Ryb215IGJhbFx1MDBFRFx1MDEwRGt5IGJ5IG1cdTAxMUJseSBiXHUwMEZEdCB6cG9cdTAxMERcdTAwRTF0a3Ugem9icmF6ZW55IGpha28gcm96YmFsZW5cdTAwRTlcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJWeXBuXHUwMTFCdGUgdG90bywgY2hjZXRlLWxpIHNiYWxpdCB2bm9cdTAxNTllblx1MDBFOSBiYWxcdTAwRURcdTAxMERreSBuYSBzdGVqblx1MDBFOSBrYXJ0XHUwMTFCLiBUbyBqZSB1XHUwMTdFaXRlXHUwMTBEblx1MDBFOSwgcG9rdWQgbVx1MDBFMXRlIGthcnRpXHUwMTBEa3ksIGt0ZXJcdTAwRTkgcGF0XHUwMTU5XHUwMEVEIGsgbW5vaGEgYmFsXHUwMEVEXHUwMTBEa1x1MDE2Rm0gdmUgc3Rlam5cdTAwRTltIHNvdWJvcnUuXCIsXG4gICAgQUxHT1JJVEhNOiBcIkFsZ29yaXRtdXNcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTogJ1BybyB2XHUwMEVEY2UgaW5mb3JtYWNcdTAwRUQgamRcdTAxMUJ0ZSBuYSA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5wb3BpcyBhbGdvcml0bXU8L2E+LicsXG4gICAgQkFTRV9FQVNFOiBcIlpcdTAwRTFrbGFkblx1MDBFRCBzbG9cdTAxN0VpdG9zdFwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIm1pbmltdW0gPSAxMzAsIG5lamxcdTAwRTlwZSBwXHUwMTU5aWJsaVx1MDE3RW5cdTAxMUIgMjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJaXHUwMEUxa2xhZG5cdTAwRUQgc2xvXHUwMTdFaXRvc3QgbXVzXHUwMEVEIGJcdTAwRkR0IG1pbmltXHUwMEUxbG5cdTAxMUIgMTMwLlwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRTogXCJabVx1MDExQm5hIGludGVydmFsdSBwb2t1ZCBrYXJ0aVx1MDEwRGt1L3Bvem5cdTAwRTFta3Ugb3puYVx1MDEwRFx1MDBFRHRlIGpha28gc2xvXHUwMTdFaXRvdVwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIm5vdlx1MDBGRF9pbnRldmFsID0gc3Rhclx1MDBGRF9pbnRlcnZhbCAqIHptXHUwMTFCbmFfaW50ZXZhbHUgLyAxMDAuXCIsXG4gICAgRUFTWV9CT05VUzogXCJCb251cyBwcm8gamVkbm9kdWNoXHUwMEU5XCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIlRlbnRvIGJvbnVzIHVtb1x1MDE3RVx1MDE0OHVqZSBuYXN0YXZpdCByb3pkXHUwMEVEbCBpbnRlcnZhbHUgbWV6aSBqZWRub2R1Y2hcdTAwRkRtaSBhIGRvYnJcdTAwRkRtaSBrYXJ0aVx1MDEwRGthbWkvcG96blx1MDBFMW1rYW1pIChtaW5pbXVtID0gMTAwJSkuXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJCb251cyBwcm8gamVkbm9kdWNob3N0IG11c1x1MDBFRCBiXHUwMEZEdCBtaW5pbVx1MDBFMWxuXHUwMTFCIDEwMC5cIixcbiAgICBNQVhfSU5URVJWQUw6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBpbnRlcnZhbFwiLFxuICAgIE1BWF9JTlRFUlZBTF9ERVNDOiBcIlVtb1x1MDE3RVx1MDE0OHVqZSBuYXN0YXZpdCBob3JuXHUwMEVEIGxpbWl0IHBybyBpbnRlcnZhbCAoZGVmYXVsdG5cdTAxMUIgPSAxMDAgbGV0KS5cIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBpbnRlcnZhbCBtdXNcdTAwRUQgYlx1MDBGRHQgYWxlc3BvXHUwMTQ4IDEgZGVuLlwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUI6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBwXHUwMTU5XHUwMEVEc3BcdTAxMUJ2XHUwMTFCayBwcm9saW5rb3ZcdTAwRTFuXHUwMEVEXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIk1heGltXHUwMEUxbG5cdTAwRUQgcFx1MDE1OVx1MDBFRHNwXHUwMTFCdmVrIHZcdTAwRTFcdTAxN0Vlblx1MDBFOSBzbG9cdTAxN0VpdG9zdGkgcHJvbGlua292YW5cdTAwRkRjaCBwb3puXHUwMEUxbWVrIHBvdVx1MDE3RWl0XHUwMEZEIHBybyB1clx1MDEwRGVuXHUwMEVEIHBvXHUwMTBEXHUwMEUxdGVcdTAxMERuXHUwMEVEIHNsb1x1MDE3RWl0b3N0aS5cIixcbiAgICBMT0dHSU5HOiBcIlphem5hbWVuXHUwMEUxdlx1MDBFMW1cIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiWm9icmF6aXQgaW5mb3JtYWNlIHBybyBsYWRcdTAxMUJuXHUwMEVEIG5hIHZcdTAwRkR2b2pcdTAwRTFcdTAxNTlza1x1MDBFOSBrb256b2xpP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJGcm9udGEgcG96blx1MDBFMW1layBrIHJldml6aVwiLFxuICAgIENMT1NFOiBcIlV6YXZcdTAxNTllblx1MDBFOVwiLFxuICAgIE5FVzogXCJOb3ZcdTAwRTlcIixcbiAgICBZRVNURVJEQVk6IFwiVlx1MDEwRGVyYVwiLFxuICAgIFRPREFZOiBcIkRuZXNcIixcbiAgICBUT01PUlJPVzogXCJaXHUwMEVEdHJhXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJTdGF0aXN0aWt5XCIsXG4gICAgTU9OVEg6IFwiTVx1MDExQnNcdTAwRURjXCIsXG4gICAgUVVBUlRFUjogXCJcdTAxMEN0dnJ0bGV0XHUwMEVEXCIsXG4gICAgWUVBUjogXCJSb2tcIixcbiAgICBMSUZFVElNRTogXCJDZWxrb3ZcdTAxMUJcIixcbiAgICBGT1JFQ0FTVDogXCJQXHUwMTU5ZWRwb3ZcdTAxMUJcdTAxMEZcIixcbiAgICBGT1JFQ0FTVF9ERVNDOiBcIkNlbGtvdlx1MDBGRCBwb1x1MDEwRGV0IGthcnRpXHUwMTBEZWssIGt0ZXJcdTAwRkRtIHZ5cHJcdTAxNjFcdTAwRUQgdGVybVx1MDBFRG5cIixcbiAgICBTQ0hFRFVMRUQ6IFwiTmFwbFx1MDBFMW5vdlx1MDBFMW5vXCIsXG4gICAgREFZUzogXCJEblx1MDBFRFwiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJQb1x1MDEwRGV0IGthcnRpXHUwMTBEZWtcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiUHJcdTAxNkZtXHUwMTFCcjogJHthdmd9IHJldml6ZS9kZW5cIixcbiAgICBJTlRFUlZBTFM6IFwiSW50ZXJ2YWx5XCIsXG4gICAgSU5URVJWQUxTX0RFU0M6IFwiRG9iYSwgemEga3Rlcm91IGJ1ZGUgem5vdnUgem9icmF6ZW5vIGsgcmV2aXplXCIsXG4gICAgQ09VTlQ6IFwiUG9cdTAxMERldFwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIlByXHUwMTZGbVx1MDExQnJuXHUwMEZEIGludGVydmFsOiAke2F2Z30sIE5lamRlbFx1MDE2MVx1MDBFRCBpbnRlcnZhbDogJHtsb25nZXN0fVwiLFxuICAgIEVBU0VTOiBcIlNsb1x1MDE3RWl0b3N0XCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJQclx1MDE2Rm1cdTAxMUJyblx1MDBFMSBzbG9cdTAxN0VpdG9zdDogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiVHlweSBrYXJ0aVx1MDEwRGVrXCIsXG4gICAgQ0FSRF9UWVBFU19ERVNDOiBcIk9ic2FodWplIGkgb2Rsb1x1MDE3RWVuXHUwMEU5IGthcnRpXHUwMTBEa3kgKHBva3VkIGV4aXN0dWpcdTAwRUQpXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOb3ZcdTAwRTFcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiTWxhZFx1MDBFMVwiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiRG9zcFx1MDExQmxcdTAwRTFcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiS2FydGlcdTAxMERlayBjZWxrZW06ICR7dG90YWxDYXJkc0NvdW50fVwiLFxufTtcbiIsICIvLyBCZW5nYWxpXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIERhbnNrXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIERldXRzY2hcblxuLy8gT2JzaWRpYW4gc3BlY2lmaWMgbmFtZXMgKGZvbGRlciwgbm90ZSwgdGFnLCBldGMuKSBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBnZXJtYW4gdHJhbnNsYXRpb246XG4vLyBodHRwczovL2dpdGh1Yi5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi10cmFuc2xhdGlvbnMvYmxvYi9tYXN0ZXIvZGUuanNvblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZmxhc2hjYXJkLW1vZGFsLnRzeFxuICAgIERFQ0tTOiBcIlN0YXBlbFwiLFxuICAgIERVRV9DQVJEUzogXCJBbnN0ZWhlbmRlIEthcnRlblwiLFxuICAgIE5FV19DQVJEUzogXCJOZXVlIEthcnRlblwiLFxuICAgIFRPVEFMX0NBUkRTOiBcIkFsbGUgS2FydGVuXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiS2FydGVuZm9ydHNjaHJpdHQgenVyXHUwMEZDY2tzZXR6dGVuXCIsXG4gICAgSEFSRDogXCJTY2h3ZXJcIixcbiAgICBHT09EOiBcIkd1dFwiLFxuICAgIEVBU1k6IFwiRWluZmFjaFwiLFxuICAgIFNIT1dfQU5TV0VSOiBcIlplaWdlIEFudHdvcnRcIixcbiAgICBDQVJEX1BST0dSRVNTX1JFU0VUOiBcIkthcnRlbmZvcnRzY2hyaXR0IHd1cmRlIHp1clx1MDBGQ2NrZ2VzZXR6dC5cIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiTm90aXogenVyIFdpZWRlcmhvbHVuZyBcdTAwRjZmZm5lblwiLFxuICAgIFJFVklFV19DQVJEUzogXCJMZXJua2FydGVuIHdpZWRlcmhvbGVuXCIsXG4gICAgUkVWSUVXX0VBU1lfRklMRV9NRU5VOiBcIk5vdGl6IGFic2NobGllc3NlbiBhbHM6IEVpbmZhY2hcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiTm90aXogYWJzY2hsaWVzc2VuIGFsczogR3V0XCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIk5vdGl6IGFic2NobGllc3NlbiBhbHM6IFNjaHdlclwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIk5vdGl6IGFic2NobGllc3NlbiBhbHM6IEVpbmZhY2hcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJOb3RpeiBhYnNjaGxpZXNzZW4gYWxzOiBHdXRcIixcbiAgICBSRVZJRVdfTk9URV9IQVJEX0NNRDogXCJOb3RpeiBhYnNjaGxpZXNzZW4gYWxzOiBTY2h3ZXJcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIkFsbGUgTGVybmthcnRlbiB3aWVkZXJob2xlblwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIkxlcm5rYXJ0ZW4gaW4gZGllc2VyIE5vdGl6IHdpZWRlcmhvbGVuXCIsXG4gICAgQ1JBTV9DQVJEU19JTl9OT1RFOiBcIkxlcm5rYXJ0ZW4gaW4gZGllc2VyIE5vdGl6IHBhdWtlbi5cIixcbiAgICBWSUVXX1NUQVRTOiBcIlN0YXRpc3Rpa2VuIGFuemVpZ2VuXCIsXG4gICAgU1RBVFVTX0JBUjpcbiAgICAgICAgXCJXaWVkZXJob2x1bmc6ICR7ZHVlTm90ZXNDb3VudH0gTm90aXooZW4pLCAke2R1ZUZsYXNoY2FyZHNDb3VudH0gS2FydGUobikgYW5zdGVoZW5kXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlN5bmMgZGF1ZXJ0ZSAke3R9bXNcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOlxuICAgICAgICBcIk5vdGl6IGJlZmluZGV0IHNpY2ggaW4gZWluZW0gYXVzZ2VzY2hsb3NzZW5lbiBPcmRuZXIgKHNpZWhlIEVpbnN0ZWxsdW5nZW4pLlwiLFxuICAgIFBMRUFTRV9UQUdfTk9URTpcbiAgICAgICAgXCJCaXR0ZSBkaWUgTm90aXogZlx1MDBGQ3IgV2llZGVyaG9sdW5nZW4gZW50c3ByZWNoZW5kIHRhZ2dlbiAoc2llaGUgRWluc3RlbGx1bmdlbikuXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiQW50d29ydCBlcmhhbHRlbi5cIixcbiAgICBOT19ERUNLX0VYSVNUUzogXCJLZWluIFN0YXBlbCBmXHUwMEZDciAke2RlY2tOYW1lfSBnZWZ1bmRlbi5cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIll1aHUhIEFsbGVzIGdlc2NoYWZmdCEgOkQuXCIsXG5cbiAgICAvLyBzY2hlZHVsaW5nLnRzXG4gICAgREFZU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFRhZyhlKVwiLFxuICAgIE1PTlRIU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IE1vbmF0KGUpXCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfSBKYWhyKGUpXCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfWRcIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1tXCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH15XCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBQbHVnaW4gLSBFaW5zdGVsbHVuZ2VuXCIsXG4gICAgQ0hFQ0tfV0lLSTogJ1dlaXRlcmUgSW5mb3JtYXRpb25lbiBnaWJ0IGVzIGltIDxhIGhyZWY9XCIke3dpa2lfdXJsfVwiPldpa2k8L2E+IChlbmdsaXNoKS4nLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIkF1c2dlc2NobG9zc2VuZSBPcmRuZXJcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICBcIk1laHJlcmUgT3JkbmVyIG1pdCBaZWlsZW51bWJyXHUwMEZDY2hlbiBnZXRyZW5udCBhbmdlYmVuLiBCc3AuIE9yZG5lckFbWmVpbGVudW1icnVjaF1PcmRuZXJCL1VudGVyb3JkbmVyXCIsXG4gICAgRkxBU0hDQVJEUzogXCJMZXJua2FydGVuXCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiRWFzeSBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIkdvb2QgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfSEFSRF9MQUJFTDogXCJIYXJkIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkVhc3lcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9HT09EX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJHb29kXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiSGFyZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiTGVybmthcnRlbiBUYWdzXCIsXG4gICAgRkxBU0hDQVJEX1RBR1NfREVTQzpcbiAgICAgICAgXCJNZWhyZXJlIFRhZ3MgbWl0IExlZXJ6ZWljaGVuIG9kZXIgWmVpbGVudW1iclx1MDBGQ2NoZW4gZ2V0cmVubnQgYW5nZWJlbi4gQnNwLiAja2FydGUgI3N0YXBlbDIgI3N0YXBlbDMuXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTOiBcIk9yZG5lciBpbiBTdGFwZWwgdW5kIFN1YnN0YXBlbCB1bXdhbmRlbG4/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6ICdFaW5lIEFsdGVybmF0aXZlIHp1ciBvYmVyZW4gXCJMZXJua2FydGVuIFRhZ3NcIiBPcHRpb24uJyxcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzpcbiAgICAgICAgXCJEZW4gRm9ydHNjaHJpdHQgaW4gZGVyIGdsZWljaGVuIFplaWxlIHdpZSBkaWUgbGV0enRlIFplaWxlIGVpbmVyIExlcm5rYXJ0ZWkgc3BlaWNoZXJuP1wiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTX0RFU0M6XG4gICAgICAgIFwiV2VubiBha3RpdmllcnQsIHdpcmQgZGVyIEhUTUwgS29tbWVudGFyIGRpZSB1bWdlYmVuZGUgTGlzdGUgbmljaHQgYXVmYnJlY2hlbi5cIixcbiAgICBCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVk6IFwiVmVyd2FuZHRlIEthcnRlbiBhdWYgZGVuIG5cdTAwRTRjaHN0ZW4gVGFnIHZlcmxlZ2VuP1wiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOlxuICAgICAgICBcIlZlcndhbmR0ZSBLYXJ0ZW4gc2luZCBhdXMgZGVyIGdsZWljaGVuIEthcnRlIGdlbmVyaWVydCB3b3JkZW4gKHouQi4gTFx1MDBGQ2NrZW50ZXh0a2FydGVuIG9kZXIgYmVpZHNlaXRpZ2UgS2FydGVuKS5cIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJLb250ZXh0IGluIGRlbiBLYXJ0ZW4gYW56ZWlnZW4/XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJCc3AuIFRpdGVsID4gXHUwMERDYmVyc2NocmlmdCAxID4gU2VrdGlvbiA+IC4uLiA+IFVudGVyc2VrdGlvblwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiSFx1MDBGNmhlIGRlciBMZXJua2FydGVpIGluIFByb3plbnRcIixcbiAgICBDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDOlxuICAgICAgICBcIkF1ZiBrbGVpbmVuIEJpbGRzY2hpcm1lbiAoei5CLiBTbWFydHBob25lcykgb2RlciBiZWkgc2VociBncm9zc2VuIEJpbGRlcm4gc29sbHRlIGRpZXNlciBXZXJ0IGF1ZiAxMDAlIGdlc2V0enQgd2VyZGVuLlwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiU3RhbmRhcmRlaW5zdGVsbHVuZyB3aWVkZXJoZXJzdGVsbGVuXCIsXG4gICAgQ0FSRF9NT0RBTF9XSURUSF9QRVJDRU5UOiBcIkJyZWl0ZSBlaW5lciBMZXJua2FydGUgaW4gUHJvemVudFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIldcdTAwRTRocmVuZCBkZXIgV2llZGVyaG91bmcgZGllIFJlaWhlbmZvbGdlIHp1Zlx1MDBFNGxsaWcgbWlzY2hlbj9cIixcbiAgICBESVNBQkxFX0NMT1pFX0NBUkRTOiBcIkxcdTAwRkNja2VudGV4dGthcnRlbiAoY2xvemUgZGVsZXRpb25zKSBkZWFrdGl2aWVyZW4/XCIsXG4gICAgQ09OVkVSVF9ISUdITElHSFRTX1RPX0NMT1pFUzogXCI9PUhlcnZvcmdlaG9iZW5lbj09IFRleHQgaW4gTFx1MDBGQ2NrZW50ZXh0a2FydGVuIHVtd2FuZGVsbj9cIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiKipGZXR0Z2VkcnVja3RlbioqIFRleHQgaW4gTFx1MDBGQ2NrZW50ZXh0a2FydGVuIHVtd2FuZGVsbj9cIixcbiAgICBDT05WRVJUX0NVUkxZX0JSQUNLRVRTX1RPX0NMT1pFUzpcbiAgICAgICAgXCJ7e0dlc2Nod2VpZnRlIEtsYW1tZXJufX0gVGV4dCBpbiBMXHUwMEZDY2tlbnRleHRrYXJ0ZW4gdW13YW5kZWxuP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiVHJlbm56ZWljaGVuIGZcdTAwRkNyIGVpbnplaWxpZ2UgTGVybmthcnRlblwiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiV2VubiBkaWVzZSBFaW5zdGVsbHVuZyBnZVx1MDBFNG5kZXJ0IHdpcmQsIGRhbm4gbVx1MDBGQ3NzZW4gZGllIGVudHNwcmVjaGVuZGVuIExlcm5rYXJ0ZW4gbWFudWVsbCBhbmdlcGFzc3Qgd2VyZGVuLlwiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiVHJlbm56ZWljaGVuIGZcdTAwRkNyIGVpbnplaWxpZ2UgYmVpZHNlaXRpZ2UgTGVybmthcnRlblwiLFxuICAgIE1VTFRJTElORV9DQVJEU19TRVBBUkFUT1I6IFwiVHJlbm56ZWljaGVuIGZcdTAwRkNyIG1laHJ6ZWlsaWdlIExlcm5rYXJ0ZW5cIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlRyZW5uemVpY2hlbiBmXHUwMEZDciBtZWhyemVpbGlnZSBiZWlkc2VpdGlnZSBMZXJua2FydGVuXCIsXG4gICAgTk9URVM6IFwiTm90aXplblwiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiRW5hYmxlIG5vdGUgcmV2aWV3IHBhbmUgb24gc3RhcnR1cFwiLFxuICAgIFRBR1NfVE9fUkVWSUVXOiBcIlp1IHdpZWRlcmhvbGVuZGUgVGFnc1wiLFxuICAgIFRBR1NfVE9fUkVWSUVXX0RFU0M6XG4gICAgICAgIFwiTWVocmVyZSBUYWdzIGtcdTAwRjZubmVuIG1pdCBMZWVyemVpY2hlbiBvZGVyIFplaWxlbnVtYnJcdTAwRkNjaGVuIGdldHJlbm50IGFuZ2VnZWJlbiB3ZXJkZW4uIEJzcC4gI2thcnRlICN0YWcxICN0YWcyLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiWnVmXHUwMEU0bGxpZ2UgS2FydGVuIHdpZWRlcmhvbGVuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOlxuICAgICAgICBcIldlbm4gZGllcyBkZWFrdGl2aWVydCB3aXJkLCBkYW5uIHdlcmRlbiBkaWUgTm90aXplbiBuYWNoIFdpY2h0aWdrZWl0IHdpZWRlcmhvbHQgKFBhZ2VSYW5rKS5cIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJOYWNoIGVpbmVyIFdpZWRlcmhvbHVuZyBhdXRvbWF0aXNjaCBkaWUgblx1MDBFNGNoc3RlIEthcnRlIFx1MDBGNmZmbmVuXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiT3B0aW9uZW4genVyIFdpZWRlcmhvbHVuZyBpbSBNZW5cdTAwRkMgZWluZXIgRGF0ZWkgZGVha3RpdmllcmVuLiBCc3AuIFdpZWRlcmhvbGVuOiBFaW5mYWNoIEd1dCBTY2h3ZXJcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIk5hY2ggZGVtIERlYWt0aXZpZXJlbiBrXHUwMEY2bm5lbiBkaWUgVGFzdGVua1x1MDBGQ3J6ZWwgenVyIFdpZWRlcmhvbHVuZyB2ZXJ3ZW5kZXQgd2VyZGVuLiBPYnNpZGlhbiBtdXNzIG5hY2ggZWluZXIgXHUwMEM0bmRlcnVuZyBuZXUgZ2VsYWRlbiB3ZXJlbi5cIixcbiAgICBNQVhfTl9EQVlTX1JFVklFV19RVUVVRTpcbiAgICAgICAgXCJNYXhpbWFsZSBBbnphaGwgYW5zdGVoZW5kZXIgTm90aXplbiwgZGllIGltIHJlY2h0ZW4gRmVuc3RlcmJlcmVpY2ggYW5nZXplaWd0IHdlcmRlblwiLFxuICAgIE1JTl9PTkVfREFZOiBcIkFuemFobCBkZXIgVGFnZSBtdXNzIG1pbmRlc3RlbnMgMSBzZWluLlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIkJpdHRlIGVpbmUgZ1x1MDBGQ2x0aWdlIFphaGwgZWluZ2ViZW4uXCIsXG4gICAgVUlfUFJFRkVSRU5DRVM6IFwiRWluc3RlbGx1bmdlbiBkZXIgQmVudXR6ZXJvYmVyZmxcdTAwRTRjaGVcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6IFwiRGVja2JcdTAwRTR1bWUgc29sbHRlbiBhbmZcdTAwRTRuZ2xpY2ggZXJ3ZWl0ZXJ0IGFuZ2V6ZWlndCB3ZXJkZW5cIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJEZWFrdGl2aWVyZW4gU2llIGRpZXMsIHVtIHZlcnNjaGFjaHRlbHRlIERlY2tzIGluIGRlcnNlbGJlbiBLYXJ0ZSB6dSByZWR1emllcmVuLiBOXHUwMEZDdHpsaWNoLCB3ZW5uIFNpZSBLYXJ0ZW4gaGFiZW4sIGRpZSB6dSB2aWVsZW4gRGVja3MgaW4gZGVyc2VsYmVuIERhdGVpIGdlaFx1MDBGNnJlbi5cIixcbiAgICBBTEdPUklUSE06IFwiQWxnb3JpdGhtdXNcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTpcbiAgICAgICAgJ1dlaXRlcmZcdTAwRkNocmVuZGUgSW5mb3JtYXRpb25lbjogPGEgaHJlZj1cIiR7YWxnb191cmx9XCI+SW1wbGVtZW50aWVydW5nIGRlcyBBbGdvcml0aG11czwvYT4gKGVuZ2xpc2gpLicsXG4gICAgQkFTRV9FQVNFOiBcIkJhc2lzIGRlciBFaW5mYWNoaGVpdFwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIk1pbmltdW0gaXN0IDEzMC4gRW1wZm9obGVuIHdpcmQgY2EuIDI1MC5cIixcbiAgICBCQVNFX0VBU0VfTUlOX1dBUk5JTkc6IFwiQmFzaXMgZGVyIEVpbmZhY2hoZWl0IG11c3MgbWluZGVzdGVucyAxMzAgc2Vpbi5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6XG4gICAgICAgIFwiQW5wYXNzdW5nc2Zha3RvciBkZXMgSW50ZXJ2YWxscyB3ZW5uIGVpbmUgTm90aXogLyBLYXJ0ZSAnU2Nod2VyJyBhYmdlc2NobG9zc2VuIHdpcmRcIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0VfREVTQzogXCJuZXVlc0ludGVydmFsbCA9IGFsdGVzSW50ZXJ2YWxsICogYW5wYXNzdW5nc2Zha3RvciAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIkVpbmZhY2hoZWl0LUJvbnVzXCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIkRlciBFaW5mYWNoaGVpdC1Cb251cyBnaWJ0IGFuIHVtIHdlbGNoZW4gRmFrdG9yIChpbiBQcm96ZW50KSBkYXMgSW50ZXJ2YWxsIGxcdTAwRTRuZ2VyIHNlaW4gc29sbCwgd2VubiBlaW5lIE5vdGl6IC8gS2FydGUgJ0VpbmZhY2gnIHN0YXR0ICdHdXQnIGFiZ2VzY2hsb3NzZW4gd2lyZC4gTWluaW11bSBpc3QgMTAwJS5cIixcbiAgICBFQVNZX0JPTlVTX01JTl9XQVJOSU5HOiBcIkRlciBFaW5mYWNoaGVpdC1Cb251cyBtdXNzIG1pbmRlc3RlbnMgMTAwIHNlaW4uXCIsXG4gICAgTUFYX0lOVEVSVkFMOiBcIk1heGltYWxlcyBJbnRlcnZhbGxcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzpcbiAgICAgICAgXCJEYXMgbWF4aW1hbGUgSW50ZXJ2YWxsIChpbiBUYWdlbikgZlx1MDBGQ3IgV2llZGVyaG9sdW5nZW4uIFN0YW5kYXJkIHNpbmQgMTAwIEphaHJlLlwiLFxuICAgIE1BWF9JTlRFUlZBTF9NSU5fV0FSTklORzogXCJEYXMgbWF4aW1hbGUgSW50ZXJhbGwgbXVzcyBtaW5kZXN0ZW5zIGVpbiBUYWcgc2Vpbi5cIixcbiAgICBNQVhfTElOS19DT05UUklCOiBcIk1heGltYWxlciBFaW5mbHVzcyB2b24gTGlua3NcIixcbiAgICBNQVhfTElOS19DT05UUklCX0RFU0M6XG4gICAgICAgIFwiTWF4aW1hbGVyIEVpbmZsdXNzIGRlciBFaW5mYWNoaGVpdGVuIHZlcmxpbmt0ZXIgTm90aXplbiB6dXIgZ2V3aWNodGV0ZW4gaW5pdGlhbGVuIEVpbmZhY2hoZWl0IGVpbmVyIG5ldWVuIExlcm5rYXJ0ZS5cIixcbiAgICBMT0dHSU5HOiBcIkxvZ2dpbmdcIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiSW5mb3JtYXRpb25lbiB6dW0gRGVidWdnaW5nIGluIGRlciBFbnR3aWNrbGVya29uc29sZSBhbnplaWdlbj9cIixcblxuICAgIC8vIHNpZGViYXIudHNcbiAgICBOT1RFU19SRVZJRVdfUVVFVUU6IFwiQW5zdGVoZW5kZSBOb3RpemVuIHp1ciBXaWVkZXJob2x1bmdcIixcbiAgICBDTE9TRTogXCJTY2hsaWVzc2VuXCIsXG4gICAgTkVXOiBcIk5ldVwiLFxuICAgIFlFU1RFUkRBWTogXCJHZXN0ZXJuXCIsXG4gICAgVE9EQVk6IFwiSGV1dGVcIixcbiAgICBUT01PUlJPVzogXCJNb3JnZW5cIixcblxuICAgIC8vIHN0YXRzLW1vZGFsLnRzeFxuICAgIFNUQVRTX1RJVExFOiBcIlN0YXRpc3Rpa2VuXCIsXG4gICAgTU9OVEg6IFwiTW9udGhcIixcbiAgICBRVUFSVEVSOiBcIlF1YXJ0ZXJcIixcbiAgICBZRUFSOiBcIlllYXJcIixcbiAgICBMSUZFVElNRTogXCJMaWZldGltZVwiLFxuICAgIEZPUkVDQVNUOiBcIlByb2dub3NlXCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJBbnphaGwgZGVyIGtcdTAwRkNuZnRpZyBhbnN0ZWhlbmRlbiBLYXJ0ZW5cIixcbiAgICBTQ0hFRFVMRUQ6IFwiQW5zdGVoZW5kXCIsXG4gICAgREFZUzogXCJUYWdlXCIsXG4gICAgTlVNQkVSX09GX0NBUkRTOiBcIkFuemFobCBkZXIgS2FydGVuXCIsXG4gICAgUkVWSUVXU19QRVJfREFZOiBcIkR1cmNoc2Nobml0dDogJHthdmd9IFdpZWRlcmhvbHVuZ2VuL1RhZ1wiLFxuICAgIElOVEVSVkFMUzogXCJJbnRlcnZhbGxlXCIsXG4gICAgSU5URVJWQUxTX0RFU0M6IFwiSW50ZXJ2YWxsZSBiaXMgV2llZGVyaG9sdW5nZW4gYW5zdGVoZW5cIixcbiAgICBDT1VOVDogXCJBbnphaGxcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJEdXJjaHNjaG5pdHRsaWNoZXMgSW50ZXJ2YWxsOiAke2F2Z30sIExcdTAwRTRuZ3N0ZXMgSW50ZXJ2YWxsOiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWluZmFjaGhlaXRcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIkR1cmNoc2Nobml0dGxpY2hlIEVpbmZhY2hoZWl0OiAke2F2Z0Vhc2V9XCIsXG4gICAgQ0FSRF9UWVBFUzogXCJLYXRlZ29yaXNpZXJ1bmdcIixcbiAgICBDQVJEX1RZUEVTX0RFU0M6IFwiVmVybGVndGUgS2FydGVuIGVpbmdlc2NobG9zc2VuXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOZXVcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiSnVuZ1wiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiQXVzZ2VyZWlmdFwiLFxuICAgIENBUkRfVFlQRVNfU1VNTUFSWTogXCJJbnNnZXNhbXQgJHt0b3RhbENhcmRzQ291bnR9IEthcnRlblwiLFxufTtcbiIsICIvLyBFbmdsaXNoXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiRGVja3NcIixcbiAgICBEVUVfQ0FSRFM6IFwiRHVlIENhcmRzXCIsXG4gICAgTkVXX0NBUkRTOiBcIk5ldyBDYXJkc1wiLFxuICAgIFRPVEFMX0NBUkRTOiBcIlRvdGFsIENhcmRzXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiUmVzZXQgY2FyZCdzIHByb2dyZXNzXCIsXG4gICAgSEFSRDogXCJIYXJkXCIsXG4gICAgR09PRDogXCJHb29kXCIsXG4gICAgRUFTWTogXCJFYXN5XCIsXG4gICAgU0hPV19BTlNXRVI6IFwiU2hvdyBBbnN3ZXJcIixcbiAgICBDQVJEX1BST0dSRVNTX1JFU0VUOiBcIkNhcmQncyBwcm9ncmVzcyBoYXMgYmVlbiByZXNldC5cIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiT3BlbiBhIG5vdGUgZm9yIHJldmlld1wiLFxuICAgIFJFVklFV19DQVJEUzogXCJSZXZpZXcgZmxhc2hjYXJkc1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJSZXZpZXc6IEVhc3lcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiUmV2aWV3OiBHb29kXCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlJldmlldzogSGFyZFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlJldmlldyBub3RlIGFzIGVhc3lcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJSZXZpZXcgbm90ZSBhcyBnb29kXCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiUmV2aWV3IG5vdGUgYXMgaGFyZFwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19BTExfQ0FSRFM6IFwiUmV2aWV3IGZsYXNoY2FyZHMgZnJvbSBhbGwgbm90ZXNcIixcbiAgICBSRVZJRVdfQ0FSRFNfSU5fTk9URTogXCJSZXZpZXcgZmxhc2hjYXJkcyBpbiB0aGlzIG5vdGVcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiQ3JhbSBmbGFzaGNhcmRzIGluIHRoaXMgbm90ZVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiVmlldyBzdGF0aXN0aWNzXCIsXG4gICAgU1RBVFVTX0JBUjogXCJSZXZpZXc6ICR7ZHVlTm90ZXNDb3VudH0gbm90ZShzKSwgJHtkdWVGbGFzaGNhcmRzQ291bnR9IGNhcmQocykgZHVlXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlN5bmMgdG9vayAke3R9bXNcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIk5vdGUgaXMgc2F2ZWQgdW5kZXIgaWdub3JlZCBmb2xkZXIgKGNoZWNrIHNldHRpbmdzKS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiUGxlYXNlIHRhZyB0aGUgbm90ZSBhcHByb3ByaWF0ZWx5IGZvciByZXZpZXdpbmcgKGluIHNldHRpbmdzKS5cIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJSZXNwb25zZSByZWNlaXZlZC5cIixcbiAgICBOT19ERUNLX0VYSVNUUzogXCJObyBkZWNrIGV4aXN0cyBmb3IgJHtkZWNrTmFtZX1cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIllvdSdyZSBhbGwgY2F1Z2h0IHVwIG5vdyA6RC5cIixcblxuICAgIC8vIHNjaGVkdWxpbmcudHNcbiAgICBEQVlTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gZGF5KHMpXCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gbW9udGgocylcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IHllYXIocylcIixcbiAgICBEQVlTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9ZFwiLFxuICAgIE1PTlRIU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfW1cIixcbiAgICBZRUFSU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfXlcIixcblxuICAgIC8vIHNldHRpbmdzLnRzXG4gICAgU0VUVElOR1NfSEVBREVSOiBcIlNwYWNlZCBSZXBldGl0aW9uIFBsdWdpbiAtIFNldHRpbmdzXCIsXG4gICAgQ0hFQ0tfV0lLSTogJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgPGEgaHJlZj1cIiR7d2lraV91cmx9XCI+d2lraTwvYT4uJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJGb2xkZXJzIHRvIGlnbm9yZVwiLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFX0RFU0M6IFwiRW50ZXIgZm9sZGVyIHBhdGhzIHNlcGFyYXRlZCBieSBuZXdsaW5lcyBpLmUuIFRlbXBsYXRlcyBNZXRhL1NjcmlwdHNcIixcbiAgICBGTEFTSENBUkRTOiBcIkZsYXNoY2FyZHNcIixcbiAgICBGTEFTSENBUkRfRUFTWV9MQUJFTDogXCJFYXN5IEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfTEFCRUw6IFwiR29vZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIkhhcmQgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfRUFTWV9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiRWFzeVwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkdvb2RcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJIYXJkXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfVEFHUzogXCJGbGFzaGNhcmQgdGFnc1wiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiRW50ZXIgdGFncyBzZXBhcmF0ZWQgYnkgc3BhY2VzIG9yIG5ld2xpbmVzIGkuZS4gI2ZsYXNoY2FyZHMgI2RlY2syICNkZWNrMy5cIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1M6IFwiQ29udmVydCBmb2xkZXJzIHRvIGRlY2tzIGFuZCBzdWJkZWNrcz9cIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1NfREVTQzogXCJUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBGbGFzaGNhcmQgdGFncyBvcHRpb24gYWJvdmUuXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6XG4gICAgICAgIFwiU2F2ZSBzY2hlZHVsaW5nIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZmxhc2hjYXJkJ3MgbGFzdCBsaW5lP1wiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTX0RFU0M6XG4gICAgICAgIFwiVHVybmluZyB0aGlzIG9uIHdpbGwgbWFrZSB0aGUgSFRNTCBjb21tZW50cyBub3QgYnJlYWsgbGlzdCBmb3JtYXR0aW5nLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJCdXJ5IHNpYmxpbmcgY2FyZHMgdW50aWwgdGhlIG5leHQgZGF5P1wiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOlxuICAgICAgICBcIlNpYmxpbmdzIGFyZSBjYXJkcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2FtZSBjYXJkIHRleHQgaS5lLiBjbG96ZSBkZWxldGlvbnNcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJTaG93IGNvbnRleHQgaW4gY2FyZHM/XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJpLmUuIFRpdGxlID4gSGVhZGluZyAxID4gU3ViaGVhZGluZyA+IC4uLiA+IFN1YmhlYWRpbmdcIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIkZsYXNoY2FyZCBIZWlnaHQgUGVyY2VudGFnZVwiLFxuICAgIENBUkRfTU9EQUxfU0laRV9QRVJDRU5UX0RFU0M6XG4gICAgICAgIFwiU2hvdWxkIGJlIHNldCB0byAxMDAlIG9uIG1vYmlsZSBvciBpZiB5b3UgaGF2ZSB2ZXJ5IGxhcmdlIGltYWdlc1wiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiUmVzZXQgdG8gZGVmYXVsdFwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJGbGFzaGNhcmQgV2lkdGggUGVyY2VudGFnZVwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlJhbmRvbWl6ZSBjYXJkIG9yZGVyIGR1cmluZyByZXZpZXc/XCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJEaXNhYmxlIGNsb3plIGNhcmRzP1wiLFxuICAgIENPTlZFUlRfSElHSExJR0hUU19UT19DTE9aRVM6IFwiQ29udmVydCA9PWhpZ2h0bGlnaHRzPT0gdG8gY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJDb252ZXJ0ICoqYm9sZGVkIHRleHQqKiB0byBjbG96ZXM/XCIsXG4gICAgQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVM6IFwiQ29udmVydCB7e2N1cmx5IGJyYWNrZXRzfX0gdG8gY2xvemVzP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBpbmxpbmUgZmxhc2hjYXJkc1wiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiTm90ZSB0aGF0IGFmdGVyIGNoYW5naW5nIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgZWRpdCBhbnkgZmxhc2hjYXJkcyB5b3UgYWxyZWFkeSBoYXZlLlwiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBpbmxpbmUgcmV2ZXJzZWQgZmxhc2hjYXJkc1wiLFxuICAgIE1VTFRJTElORV9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBtdWx0aWxpbmUgZmxhc2hjYXJkc1wiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBtdWx0aWxpbmUgcmV2ZXJzZWQgZmxhc2hjYXJkc1wiLFxuICAgIE5PVEVTOiBcIk5vdGVzXCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiVGFncyB0byByZXZpZXdcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOiBcIkVudGVyIHRhZ3Mgc2VwYXJhdGVkIGJ5IHNwYWNlcyBvciBuZXdsaW5lcyBpLmUuICNyZXZpZXcgI3RhZzIgI3RhZzMuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URTogXCJPcGVuIGEgcmFuZG9tIG5vdGUgZm9yIHJldmlld1wiLFxuICAgIE9QRU5fUkFORE9NX05PVEVfREVTQzogXCJXaGVuIHlvdSB0dXJuIHRoaXMgb2ZmLCBub3RlcyBhcmUgb3JkZXJlZCBieSBpbXBvcnRhbmNlIChQYWdlUmFuaykuXCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiT3BlbiBuZXh0IG5vdGUgYXV0b21hdGljYWxseSBhZnRlciBhIHJldmlld1wiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TOlxuICAgICAgICBcIkRpc2FibGUgcmV2aWV3IG9wdGlvbnMgaW4gdGhlIGZpbGUgbWVudSBpLmUuIFJldmlldzogRWFzeSBHb29kIEhhcmRcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIkFmdGVyIGRpc2FibGluZywgeW91IGNhbiByZXZpZXcgdXNpbmcgdGhlIGNvbW1hbmQgaG90a2V5cy4gUmVsb2FkIE9ic2lkaWFuIGFmdGVyIGNoYW5naW5nIHRoaXMuXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiTWF4aW11bSBudW1iZXIgb2YgZGF5cyB0byBkaXNwbGF5IG9uIHJpZ2h0IHBhbmVsXCIsXG4gICAgTUlOX09ORV9EQVk6IFwiVGhlIG51bWJlciBvZiBkYXlzIG11c3QgYmUgYXQgbGVhc3QgMS5cIixcbiAgICBWQUxJRF9OVU1CRVJfV0FSTklORzogXCJQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIG51bWJlci5cIixcbiAgICBVSV9QUkVGRVJFTkNFUzogXCJVSSBQcmVmZXJlbmNlc1wiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTogXCJEZWNrIHRyZWVzIHNob3VsZCBiZSBpbml0aWFsbHkgZGlzcGxheWVkIGFzIGV4cGFuZGVkXCIsXG4gICAgSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFX0RFU0M6XG4gICAgICAgIFwiVHVybiB0aGlzIG9mZiB0byBjb2xsYXBzZSBuZXN0ZWQgZGVja3MgaW4gdGhlIHNhbWUgY2FyZC4gVXNlZnVsIGlmIHlvdSBoYXZlIGNhcmRzIHdoaWNoIGJlbG9uZyB0byBtYW55IGRlY2tzIGluIHRoZSBzYW1lIGZpbGUuXCIsXG4gICAgQUxHT1JJVEhNOiBcIkFsZ29yaXRobVwiLFxuICAgIENIRUNLX0FMR09SSVRITV9XSUtJOlxuICAgICAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrIHRoZSA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5hbGdvcml0aG0gaW1wbGVtZW50YXRpb248L2E+LicsXG4gICAgQkFTRV9FQVNFOiBcIkJhc2UgZWFzZVwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIm1pbmltdW0gPSAxMzAsIHByZWZlcnJhYmx5IGFwcHJveGltYXRlbHkgMjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJUaGUgYmFzZSBlYXNlIG11c3QgYmUgYXQgbGVhc3QgMTMwLlwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRTogXCJJbnRlcnZhbCBjaGFuZ2Ugd2hlbiB5b3UgcmV2aWV3IGEgZmxhc2hjYXJkL25vdGUgYXMgaGFyZFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIm5ld0ludGVydmFsID0gb2xkSW50ZXJ2YWwgKiBpbnRlcnZhbENoYW5nZSAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIkVhc3kgQm9udXNcIixcbiAgICBFQVNZX0JPTlVTX0RFU0M6XG4gICAgICAgIFwiVGhlIGVhc3kgYm9udXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIGRpZmZlcmVuY2UgaW4gaW50ZXJ2YWxzIGJldHdlZW4gYW5zd2VyaW5nIEdvb2QgYW5kIEVhc3kgb24gYSBmbGFzaGNhcmQvbm90ZSAobWluaW11bSA9IDEwMCUpLlwiLFxuICAgIEVBU1lfQk9OVVNfTUlOX1dBUk5JTkc6IFwiVGhlIGVhc3kgYm9udXMgbXVzdCBiZSBhdCBsZWFzdCAxMDAuXCIsXG4gICAgTUFYX0lOVEVSVkFMOiBcIk1heGltdW0gSW50ZXJ2YWxcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJBbGxvd3MgeW91IHRvIHBsYWNlIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBpbnRlcnZhbCAoZGVmYXVsdCA9IDEwMCB5ZWFycykuXCIsXG4gICAgTUFYX0lOVEVSVkFMX01JTl9XQVJOSU5HOiBcIlRoZSBtYXhpbXVtIGludGVydmFsIG11c3QgYmUgYXQgbGVhc3QgMSBkYXkuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJNYXhpbXVtIGxpbmsgY29udHJpYnV0aW9uXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIk1heGltdW0gY29udHJpYnV0aW9uIG9mIHRoZSB3ZWlnaHRlZCBlYXNlIG9mIGxpbmtlZCBub3RlcyB0byB0aGUgaW5pdGlhbCBlYXNlLlwiLFxuICAgIExPR0dJTkc6IFwiTG9nZ2luZ1wiLFxuICAgIERJU1BMQVlfREVCVUdfSU5GTzogXCJEaXNwbGF5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvbiB0aGUgZGV2ZWxvcGVyIGNvbnNvbGU/XCIsXG5cbiAgICAvLyBzaWRlYmFyLnRzXG4gICAgTk9URVNfUkVWSUVXX1FVRVVFOiBcIk5vdGVzIFJldmlldyBRdWV1ZVwiLFxuICAgIENMT1NFOiBcIkNsb3NlXCIsXG4gICAgTkVXOiBcIk5ld1wiLFxuICAgIFlFU1RFUkRBWTogXCJZZXN0ZXJkYXlcIixcbiAgICBUT0RBWTogXCJUb2RheVwiLFxuICAgIFRPTU9SUk9XOiBcIlRvbW9ycm93XCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJTdGF0aXN0aWNzXCIsXG4gICAgTU9OVEg6IFwiTW9udGhcIixcbiAgICBRVUFSVEVSOiBcIlF1YXJ0ZXJcIixcbiAgICBZRUFSOiBcIlllYXJcIixcbiAgICBMSUZFVElNRTogXCJMaWZldGltZVwiLFxuICAgIEZPUkVDQVNUOiBcIkZvcmVjYXN0XCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJUaGUgbnVtYmVyIG9mIGNhcmRzIGR1ZSBpbiB0aGUgZnV0dXJlXCIsXG4gICAgU0NIRURVTEVEOiBcIlNjaGVkdWxlZFwiLFxuICAgIERBWVM6IFwiRGF5c1wiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJOdW1iZXIgb2YgY2FyZHNcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiQXZlcmFnZTogJHthdmd9IHJldmlld3MvZGF5XCIsXG4gICAgSU5URVJWQUxTOiBcIkludGVydmFsc1wiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIkRlbGF5cyB1bnRpbCByZXZpZXdzIGFyZSBzaG93biBhZ2FpblwiLFxuICAgIENPVU5UOiBcIkNvdW50XCIsXG4gICAgSU5URVJWQUxTX1NVTU1BUlk6IFwiQXZlcmFnZSBpbnRlcnZhbDogJHthdmd9LCBMb25nZXN0IGludGVydmFsOiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWFzZXNcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIkF2ZXJhZ2UgZWFzZTogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiQ2FyZCBUeXBlc1wiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJUaGlzIGluY2x1ZGVzIGJ1cmllZCBjYXJkcyBhcyB3ZWxsLCBpZiBhbnlcIixcbiAgICBDQVJEX1RZUEVfTkVXOiBcIk5ld1wiLFxuICAgIENBUkRfVFlQRV9ZT1VORzogXCJZb3VuZ1wiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiTWF0dXJlXCIsXG4gICAgQ0FSRF9UWVBFU19TVU1NQVJZOiBcIlRvdGFsIGNhcmRzOiAke3RvdGFsQ2FyZHNDb3VudH1cIixcbn07XG4iLCAiLy8gQnJpdGlzaCBFbmdsaXNoXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIEVzcGFcdTAwRjFvbFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBmcmFuXHUwMEU3YWlzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFx1MDkzOVx1MDkzRlx1MDkyOFx1MDk0RFx1MDkyNlx1MDk0MFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBCYWhhc2EgSW5kb25lc2lhXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIEl0YWxpYW5vXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFx1NjVFNVx1NjcyQ1x1OEE5RVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZmxhc2hjYXJkLW1vZGFsLnRzeFxuICAgIERFQ0tTOiBcIlx1MzBDN1x1MzBDM1x1MzBBRFwiLFxuICAgIERVRV9DQVJEUzogXCJcdTY3MUZcdTY1RTVcdTMwNkVcdTMwQUJcdTMwRkNcdTMwQzlcIixcbiAgICBORVdfQ0FSRFM6IFwiXHU2NUIwXHU4OThGXHUzMDZFXHUzMEFCXHUzMEZDXHUzMEM5XCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHU1NDA4XHU4QTA4XCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU5MDMyXHU2MzU3XHUzMDkyXHUzMEVBXHUzMEJCXHUzMEMzXHUzMEM4XCIsXG4gICAgSEFSRDogXCJIYXJkXCIsXG4gICAgR09PRDogXCJHb29kXCIsXG4gICAgRUFTWTogXCJFYXN5XCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHU4OUUzXHU3QjU0XHUzMDkyXHU4ODY4XHU3OTNBXCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCJcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNkVcdTkwMzJcdTYzNTdcdTMwNENcdTMwRUFcdTMwQkJcdTMwQzNcdTMwQzhcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkyXHU5NThCXHUzMDRGXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2RVx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkM6IEVhc3lcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDOiBHb29kXCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQzogSGFyZFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA5MkVhc3lcdTMwNjhcdTMwNTdcdTMwNjZcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTMwNTlcdTMwOEJcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJcdTMwQ0VcdTMwRkNcdTMwQzhcdTMwOTJHb29kXHUzMDY4XHUzMDU3XHUzMDY2XHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkySGFyZFx1MzA2OFx1MzA1N1x1MzA2Nlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA1OVx1MzA4QlwiLFxuICAgIFJFVklFV19BTExfQ0FSRFM6IFwiXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMENFXHUzMEZDXHUzMEM4XHUzMDRCXHUzMDg5XHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDkyXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgQ1JBTV9BTExfQ0FSRFM6IFwiU2VsZWN0IGEgZGVjayB0byBjcmFtXCIsXG4gICAgUkVWSUVXX0NBUkRTX0lOX05PVEU6IFwiXHUzMDUzXHUzMDZFXHUzMENFXHUzMEZDXHUzMEM4XHUzMDZFXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDkyXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgQ1JBTV9DQVJEU19JTl9OT1RFOiBcIlx1MzA1M1x1MzA2RVx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2RVx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA5Mlx1OEE3MFx1MzA4MVx1OEZCQ1x1MzA3Rlx1NUI2Nlx1N0ZEMlx1MzA1OVx1MzA4QlwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHU3RDcxXHU4QTA4XHUzMDkyXHU5NUIyXHU4OUE3XHUzMDU5XHUzMDhCXCIsXG4gICAgU1RBVFVTX0JBUjogXCJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkM6ICR7ZHVlTm90ZXNDb3VudH1cdTMwQ0VcdTMwRkNcdTMwQzgsICR7ZHVlRmxhc2hjYXJkc0NvdW50fVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA0Q1x1NjcxRlx1NjVFNVwiLFxuICAgIFNZTkNfVElNRV9UQUtFTjogXCJcdTU0MENcdTY3MUZcdTMwNkIke3R9bXNcdTMwNEJcdTMwNEJcdTMwOEFcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA0Q1x1NzEyMVx1ODk5Nlx1MzA1OVx1MzA4Qlx1MzBENVx1MzBBOVx1MzBFQlx1MzBDMFx1MzA2Qlx1NEZERFx1NUI1OFx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OShcdThBMkRcdTVCOUFcdTMwOTJcdTc4QkFcdThBOERcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpXHUzMDAyXCIsXG4gICAgUExFQVNFX1RBR19OT1RFOlxuICAgICAgICBcIlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA5Mlx1ODg0Q1x1MzA0Nlx1MzA2Qlx1MzA2Rlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2Qlx1NUJGRVx1MzA1N1x1MzA2Nlx1NkI2M1x1MzA1N1x1MzA0Rlx1MzBCRlx1MzBCMFx1NEVEOFx1MzA1MVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NChcdThBMkRcdTVCOUFcdTMwOTJcdTc4QkFcdThBOERcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpXHUzMDAyXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiXHU3QjU0XHUzMDQ4XHUzMDkyXHU1M0Q3XHUzMDUxXHU1M0Q2XHUzMDhBXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiJHtkZWNrTmFtZX1cdTMwNkJcdTMwNkZcdTMwQzdcdTMwQzNcdTMwQURcdTMwNENcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlx1NEVDQVx1NjVFNVx1MzA2RVx1OEFCMlx1OTg0Q1x1MzA5Mlx1MzA1OVx1MzA3OVx1MzA2Nlx1OTA1NFx1NjIxMFx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1RiA6RFwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCIke2ludGVydmFsfVx1NjVFNVx1NUY4Q1wiLFxuICAgIE1PTlRIU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9XHU2NzA4XHU1RjhDXCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfVx1NUU3NFx1NUY4Q1wiLFxuICAgIERBWVNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1kXCIsXG4gICAgTU9OVEhTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9bVwiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9eVwiLFxuXG4gICAgLy8gc2V0dGluZ3MudHNcbiAgICBTRVRUSU5HU19IRUFERVI6IFwiU3BhY2VkIFJlcGV0aXRpb24gUGx1Z2luIC0gXHU4QTJEXHU1QjlBXCIsXG4gICAgQ0hFQ0tfV0lLSTogJ1x1OEE3M1x1N0QzMFx1MzA2Qlx1MzA2NFx1MzA0NFx1MzA2Nlx1MzA2RjxhIGhyZWY9XCIke3dpa2lfdXJsfVwiPndpa2k8L2E+XHUzMDkyXHU3OEJBXHU4QThEXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdTcxMjFcdTg5OTZcdTMwNTlcdTMwOEJcdTMwRDVcdTMwQTlcdTMwRUJcdTMwQzBcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICAnXHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEMwXHUzMEQxXHUzMEI5XHUzMDkyXHU2NTM5XHU4ODRDXHUzMDY3XHU1MzNBXHU1MjA3XHUzMDYzXHUzMDY2XHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCJUZW1wbGF0ZXMgTWV0YS9TY3JpcHRzXCIgXHUzMDZFXHUzMDg4XHUzMDQ2XHUzMDZBXHUzMEI5XHUzMERBXHUzMEZDXHUzMEI5XHUzMDZCXHUzMDg4XHUzMDhCXHU1MzNBXHU1MjA3XHUzMDhBXHUzMDY3XHUzMDZFXHU2NkY4XHUzMDREXHU2NUI5XHUzMDZGXHU3MTIxXHU1MkI5XHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICBGTEFTSENBUkRTOiBcIlx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIkVhc3kgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfR09PRF9MQUJFTDogXCJHb29kIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0hBUkRfTEFCRUw6IFwiSGFyZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJFYXN5XCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfR09PRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiR29vZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0hBUkRfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkhhcmRcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIlx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2Qlx1NEY3Rlx1NzUyOFx1MzA1OVx1MzA4Qlx1MzBCRlx1MzBCMFwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgICdcdTMwQkZcdTMwQjBcdTMwOTJcdTMwQjlcdTMwREFcdTMwRkNcdTMwQjlcdTMwN0VcdTMwNUZcdTMwNkZcdTY1MzlcdTg4NENcdTMwNjdcdTUzM0FcdTUyMDdcdTMwNjNcdTMwNjZcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTRGOEI6IFwiI2ZsYXNoY2FyZHMgI2RlY2syICNkZWNrM1wiJyxcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1M6IFwiXHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEMwXHUzMDkyXHUzMEM3XHUzMEMzXHUzMEFEXHUzMDY4XHUzMEI1XHUzMEQ2XHUzMEM3XHUzMEMzXHUzMEFEXHUzMDY4XHUzMDU3XHUzMDY2XHU0RjdGXHU3NTI4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6XG4gICAgICAgIFwiXHUzMDUzXHUzMDhDXHUzMDZGXHU0RTBBXHU4QTE4XHUzMDZFXHUzMEJGXHUzMEIwXHUzMDkyXHU0RjdGXHU3NTI4XHUzMDU3XHUzMDVGXHUzMEM3XHUzMEMzXHUzMEFEXHU2OUNCXHU3QkM5XHUzMDZFXHU0RUUzXHU2NkZGXHUzMDY4XHUzMDZBXHUzMDhCXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXHUzMDY3XHUzMDU5XHUzMDAyXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6XG4gICAgICAgIFwiXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU2NzAwXHU3RDQyXHU4ODRDXHUzMDY4XHU1NDBDXHU0RTAwXHUzMDZFXHU4ODRDXHUzMDZCXHUzMEI5XHUzMEIxXHUzMEI4XHUzMEU1XHUzMEZDXHUzMEVBXHUzMEYzXHUzMEIwXHUzMEIzXHUzMEUxXHUzMEYzXHUzMEM4XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJcdTMwNTNcdTMwNkVcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjNcdTMwOTJcdTY3MDlcdTUyQjlcdTUzMTZcdTMwNTlcdTMwOEJcdTMwNjhcdTMwMDFIVE1MXHUzMEIzXHUzMEUxXHUzMEYzXHUzMEM4XHUzMDZCXHUzMDg4XHUzMDYzXHUzMDY2TWFya2Rvd25cdTMwNkVcdTMwRUFcdTMwQjlcdTMwQzhcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwQzNcdTMwQzhcdTMwNENcdTVEMjlcdTMwOENcdTMwNkFcdTMwNEZcdTMwNkFcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcIixcbiAgICBCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVk6IFwiXHU2QjIxXHUzMDZFXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDdFXHUzMDY3XHUzMEI3XHUzMEQ2XHUzMEVBXHUzMEYzXHUzMEIwXHUzMDkyXHU1RUY2XHU2NzFGXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiXHUzMEI3XHUzMEQ2XHUzMEVBXHUzMEYzXHUzMEIwXHUzMDZGXHU1NDBDXHU0RTAwXHUzMDZFXHUzMEFCXHUzMEZDXHUzMEM5XHUzMEM2XHUzMEFEXHUzMEI5XHUzMEM4XHUzMDRCXHUzMDg5XHU3NTFGXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDVGXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDAxXHUzMDY0XHUzMDdFXHUzMDhBXHU3QTc0XHU1N0NCXHUzMDgxXHU1NTRGXHU5ODRDXHUzMDZFXHU2RDNFXHU3NTFGXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDY3XHUzMDU5XHUzMDAyXCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFQ6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZCXHUzMEIzXHUzMEYzXHUzMEM2XHUzMEFEXHUzMEI5XHUzMEM4XHUzMDkyXHU4ODY4XHU3OTNBXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzpcbiAgICAgICAgXCJcdUZGNjJcdTMwQkZcdTMwQTRcdTMwQzhcdTMwRUIgPiBcdTg5OEJcdTUxRkFcdTMwNTcgMSA+IFx1NTI2Rlx1ODk4Qlx1NTFGQVx1MzA1NyA+IC4uLiA+IFx1NTI2Rlx1ODk4Qlx1NTFGQVx1MzA1N1x1RkY2M1x1MzA2RVx1ODg2OFx1NzkzQVx1MzA5Mlx1ODg0Q1x1MzA0Nlx1MzA0Qlx1MzA2OVx1MzA0Nlx1MzA0Qlx1MzA5Mlx1NkM3QVx1MzA4MVx1MzA3RVx1MzA1OVx1MzAwMlwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU3RTI2XHUzMEI1XHUzMEE0XHUzMEJBXHUzMDZFXHUzMEQxXHUzMEZDXHUzMEJCXHUzMEYzXHUzMEM2XHUzMEZDXHUzMEI4XCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzpcbiAgICAgICAgXCJcdTMwRTJcdTMwRDBcdTMwQTRcdTMwRUJcdTcyNDhcdTMwMDFcdTMwN0VcdTMwNUZcdTMwNkZcdTk3NUVcdTVFMzhcdTMwNkJcdTU5MjdcdTMwNERcdTMwNkFcdTMwQjVcdTMwQTRcdTMwQkFcdTMwNkVcdTc1M0JcdTUwQ0ZcdTMwNENcdTMwNDJcdTMwOEJcdTU4MzRcdTU0MDhcdTMwNkJcdTMwNkYxMDAlXHUzMDZCXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyXCIsXG4gICAgUkVTRVRfREVGQVVMVDogXCJcdTMwQzdcdTMwRDVcdTMwQTlcdTMwRUJcdTMwQzhcdTUwMjRcdTMwNkJcdTMwRUFcdTMwQkJcdTMwQzNcdTMwQzhcdTMwNTlcdTMwOEJcIixcbiAgICBDQVJEX01PREFMX1dJRFRIX1BFUkNFTlQ6IFwiXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU2QTJBXHUzMEI1XHUzMEE0XHUzMEJBXHUzMDZFXHUzMEQxXHUzMEZDXHUzMEJCXHUzMEYzXHUzMEM2XHUzMEZDXHUzMEI4XCIsXG4gICAgUkFORE9NSVpFX0NBUkRfT1JERVI6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHU0RTJEXHUzMDZFXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU5ODA2XHU3NTZBXHUzMDkyXHUzMEU5XHUzMEYzXHUzMEMwXHUzMEUwXHUzMDZCXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJcdTdBNzRcdTU3Q0JcdTMwODFcdTMwQUJcdTMwRkNcdTMwQzlcdTMwOTJcdTcxMjFcdTUyQjlcdTUzMTZcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUZcIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIj09XHUzMENGXHUzMEE0XHUzMEU5XHUzMEE0XHUzMEM4PT1cdTMwOTJcdTdBNzRcdTU3Q0JcdTMwODFcdTMwNjhcdTMwNTdcdTMwNjZcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUZcIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiKipcdTMwRENcdTMwRkNcdTMwRUJcdTMwQzlcdTRGNTMqKlx1MzA5Mlx1N0E3NFx1NTdDQlx1MzA4MVx1MzA2OFx1MzA1N1x1MzA2Nlx1NEY3Rlx1NzUyOFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRlwiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcInt7XHU0RTJEXHU2MkVDXHU1RjI3fX1cdTMwOTJcdTdBNzRcdTU3Q0JcdTMwODFcdTMwNjhcdTMwNTdcdTMwNjZcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUZcIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MzBBNFx1MzBGM1x1MzBFOVx1MzBBNFx1MzBGM1x1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2Qlx1NEY3Rlx1NzUyOFx1MzA1OVx1MzA4Qlx1MzBCQlx1MzBEMVx1MzBFQ1x1MzBGQ1x1MzBCRlx1MzBGQ1wiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiXHUzMDUzXHUzMDZFXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZCXHUzMDZGXHUzMDAxXHU0RjVDXHU2MjEwXHU2RTA4XHUzMDdGXHUzMDZFXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDkyXHU2MjRCXHU1MkQ1XHUzMDY3XHU3REU4XHU5NkM2XHUzMDU3XHU3NkY0XHUzMDU5XHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZCXHU2Q0U4XHU2MTBGXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgSU5MSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUjogXCJcdTMwQTRcdTMwRjNcdTMwRTlcdTMwQTRcdTMwRjNcdTMwNkVcdTg4NjhcdTg4Q0ZcdTUzQ0RcdThFRTJcdTMwRDVcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNkJcdTRGN0ZcdTc1MjhcdTMwNTlcdTMwOEJcdTMwQkJcdTMwRDFcdTMwRUNcdTMwRkNcdTMwQkZcdTMwRkNcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1ODkwN1x1NjU3MFx1ODg0Q1x1MzA2RVx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2Qlx1NEY3Rlx1NzUyOFx1MzA1OVx1MzA4Qlx1MzBCQlx1MzBEMVx1MzBFQ1x1MzBGQ1x1MzBCRlx1MzBGQ1wiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHU4OTA3XHU2NTcwXHU4ODRDXHUzMDZFXHU4ODY4XHU4OENGXHU1M0NEXHU4RUUyXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZCXHU0RjdGXHU3NTI4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMEQxXHUzMEVDXHUzMEZDXHUzMEJGXHUzMEZDXCIsXG4gICAgTk9URVM6IFwiXHUzMENFXHUzMEZDXHUzMEM4XCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDZCXHU0RjdGXHU3NTI4XHUzMDU5XHUzMDhCXHUzMEJGXHUzMEIwXCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzpcbiAgICAgICAgJ1x1MzBCRlx1MzBCMFx1MzA5Mlx1MzBCOVx1MzBEQVx1MzBGQ1x1MzBCOVx1MzA3RVx1MzA1Rlx1MzA2Rlx1NjUzOVx1ODg0Q1x1MzA2N1x1NTMzQVx1NTIwN1x1MzA2M1x1MzA2Nlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NEY4QjogXCIjcmV2aWV3ICN0YWcyICN0YWczXCInLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiXHUzMEU5XHUzMEYzXHUzMEMwXHUzMEUwXHUzMDZCXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkyXHU5NThCXHUzMDQ0XHUzMDY2XHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOlxuICAgICAgICBcIlx1MzA1M1x1MzA2RVx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM1x1MzA0Q1x1NzEyMVx1NTJCOVx1NTMxNlx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NzJCNlx1NjE0Qlx1MzA2N1x1MzA2Rlx1MzAwMVx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2Rlx1OTFDRFx1ODk4MVx1NUVBNihcdTMwREFcdTMwRkNcdTMwQjhcdTMwRTlcdTMwRjNcdTMwQUYpXHUzMDZCXHUzMDg4XHUzMDhCXHU5ODA2XHU3NTZBXHUzMDY3XHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHU1RjhDXHUzMDZCXHU2QjIxXHUzMDZFXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkyXHU4MUVBXHU1MkQ1XHU3Njg0XHUzMDZCXHU5NThCXHUzMDRGXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMEUxXHUzMENCXHUzMEU1XHUzMEZDXHUzMDY3XHUzMDZFXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXHUzMDkyXHU3MTIxXHU1MkI5XHU1MzE2KFx1RkY2Mlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQzogRWFzeVx1RkY2M1x1N0I0OVx1MzA2RVx1OTgwNVx1NzZFRVx1MzA5Mlx1OTc1RVx1ODg2OFx1NzkzQVx1MzA2Qlx1MzA1OVx1MzA4QilcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIlx1NzEyMVx1NTJCOVx1NTMxNlx1MzA1N1x1MzA1Rlx1NUY4Q1x1MzAwMVx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzBEQlx1MzBDM1x1MzBDOFx1MzBBRFx1MzBGQ1x1MzA5Mlx1NEY3Rlx1MzA2M1x1MzA2Nlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA1OVx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA0Q1x1NTNFRlx1ODBGRFx1MzA2Qlx1MzA2QVx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMlx1MzA1M1x1MzA2RVx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM1x1MzA5Mlx1NTkwOVx1NjZGNFx1MzA1N1x1MzA1Rlx1NTgzNFx1NTQwOFx1MzA2Qlx1MzA2Rk9ic2lkaWFuXHUzMDkyXHUzMEVBXHUzMEVEXHUzMEZDXHUzMEM5XHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHU1M0YzXHUzMEQxXHUzMENEXHUzMEVCXHUzMDZCXHU4ODY4XHU3OTNBXHUzMDU5XHUzMDhCXHU2NzAwXHU1OTI3XHUzMDZFXHU2NUU1XHU2NTcwXCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHU2NUU1XHU2NTcwXHUzMDZCXHUzMDZGMVx1NEVFNVx1NEUwQVx1MzA2RVx1NjU3MFx1NUI1N1x1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1NjcwOVx1NTJCOVx1MzA2QVx1NjU3MFx1NUI1N1x1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlx1MzBFNlx1MzBGQ1x1MzBCNlx1MzBGQyBcdTMwQTRcdTMwRjNcdTMwQkZcdTMwRkNcdTMwRDVcdTMwQTdcdTMwQTRcdTMwQjlcdTMwNkVcdThBMkRcdTVCOUFcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6IFwiXHUzMEM3XHUzMEMzXHUzMEFEIFx1MzBDNFx1MzBFQVx1MzBGQ1x1MzA2Rlx1NjcwMFx1NTIxRFx1MzA2Rlx1NUM1NVx1OTU4Qlx1MzA1N1x1MzA2Nlx1ODg2OFx1NzkzQVx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRV9ERVNDOlxuICAgICAgICBcIlx1MzA1M1x1MzA4Q1x1MzA5Mlx1MzBBQVx1MzBENVx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzA2OFx1MzAwMVx1NTQwQ1x1MzA1OFx1MzBBQlx1MzBGQ1x1MzBDOVx1NTE4NVx1MzA2RVx1MzBDRFx1MzBCOVx1MzBDOFx1MzA1NVx1MzA4Q1x1MzA1Rlx1MzBDN1x1MzBDM1x1MzBBRFx1MzA0Q1x1NjI5OFx1MzA4QVx1MzA1Rlx1MzA1Rlx1MzA3RVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NTQwQ1x1MzA1OFx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2Qlx1NTkxQVx1MzA0Rlx1MzA2RVx1MzBDN1x1MzBDM1x1MzBBRFx1MzA2Qlx1NUM1RVx1MzA1OVx1MzA4Qlx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA0Q1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1NEZCRlx1NTIyOVx1MzA2N1x1MzA1OVx1MzAwMlwiLFxuICAgIEFMR09SSVRITTogXCJcdTMwQTJcdTMwRUJcdTMwQjRcdTMwRUFcdTMwQkFcdTMwRTBcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTpcbiAgICAgICAgJ1x1OEE3M1x1N0QzMFx1MzA2Qlx1MzA2NFx1MzA0NFx1MzA2Nlx1MzA2RjxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPlx1MzBBMlx1MzBFQlx1MzBCNFx1MzBFQVx1MzBCQVx1MzBFMFx1MzA2RVx1NUI5Rlx1ODhDNTwvYT5cdTMwOTJcdTc4QkFcdThBOERcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDInLFxuICAgIEJBU0VfRUFTRTogXCJcdTMwRDlcdTMwRkNcdTMwQjlcdTMwNkVcdTY2MTNcdTMwNTdcdTMwNTVcIixcbiAgICBCQVNFX0VBU0VfREVTQzogXCJcdTY3MDBcdTVDMEZcdTUwMjRcdTMwNkYxMzBcdTMwNjdcdTMwNTlcdTMwNENcdTMwMDEgXHU5MDY5XHU2QjYzXHU1MDI0XHUzMDZGXHUzMDRBXHUzMDRBXHUzMDg4XHUzMDVEMjUwXHUzMDY3XHUzMDU5XHUzMDAyXCIsXG4gICAgQkFTRV9FQVNFX01JTl9XQVJOSU5HOiBcIlx1MzBEOVx1MzBGQ1x1MzBCOVx1MzA2RVx1NjYxM1x1MzA1N1x1MzA1NVx1MzA2Qlx1MzA2RjEzMFx1NEVFNVx1NEUwQVx1MzA2RVx1NjU3MFx1NUI1N1x1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRTogXCJcdTMwRDVcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTMwQUJcdTMwRkNcdTMwQzkvXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkySGFyZFx1MzA2OFx1MzA1N1x1MzA2Nlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA1N1x1MzA1Rlx1OTY5Qlx1MzA2RVx1OTU5M1x1OTY5NFx1NTkwOVx1NjZGNFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiAnXCJcdTY1QjBcdTMwNTdcdTMwNDRcdTk1OTNcdTk2OTQgPSBcdTRFRTVcdTUyNERcdTMwNkVcdTk1OTNcdTk2OTQgKiBcdTk1OTNcdTk2OTRcdTU5MDlcdTY2RjQgLyAxMDBcIiBcdTMwNjhcdTMwNTdcdTMwNjZcdThBMDhcdTdCOTdcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgIEVBU1lfQk9OVVM6IFwiRWFzeVx1MzBEQ1x1MzBGQ1x1MzBDQVx1MzBCOVwiLFxuICAgIEVBU1lfQk9OVVNfREVTQzpcbiAgICAgICAgXCJFYXN5XHUzMERDXHUzMEZDXHUzMENBXHUzMEI5XHUzMDZCXHUzMDg4XHUzMDYzXHUzMDY2XHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5L1x1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2Qlx1MzA0QVx1MzA1MVx1MzA4Qlx1OTU5M1x1OTY5NFx1MzA2RVx1NURFRVx1NTIwNlx1MzA5Mlx1OEEyRFx1NUI5QVx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1OShcdTY3MDBcdTVDMEZcdTUwMjQgPSAxMDAlKVx1MzAwMlwiLFxuICAgIEVBU1lfQk9OVVNfTUlOX1dBUk5JTkc6IFwiRWFzeVx1MzBEQ1x1MzBGQ1x1MzBDQVx1MzBCOVx1MzA2Qlx1MzA2RjEwMFx1NEVFNVx1NEUwQVx1MzA2RVx1NjU3MFx1NUI1N1x1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIE1BWF9JTlRFUlZBTDogXCJcdTk1OTNcdTk2OTRcdTMwNkVcdTY3MDBcdTU5MjdcdTUwMjRcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJcdTk1OTNcdTk2OTRcdTMwNkJcdTRFMEFcdTk2NTBcdTUwMjRcdTMwOTJcdThBMkRcdTVCOUFcdTMwNTlcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNENcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTkoXHUzMEM3XHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEM4XHU1MDI0ID0gMTAwXHU1RTc0KVx1MzAwMlwiLFxuICAgIE1BWF9JTlRFUlZBTF9NSU5fV0FSTklORzogXCJcdTk1OTNcdTk2OTRcdTMwNkVcdTY3MDBcdTU5MjdcdTUwMjRcdTMwNkJcdTMwNkYxXHU0RUU1XHU0RTBBXHUzMDZFXHU2NTcwXHU1QjU3XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJcdTMwRUFcdTMwRjNcdTMwQUZcdTMwQjNcdTMwRjNcdTMwQzhcdTMwRUFcdTMwRDNcdTMwRTVcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNkVcdTY3MDBcdTU5MjdcdTUwMjRcIixcbiAgICBNQVhfTElOS19DT05UUklCX0RFU0M6XG4gICAgICAgIFwiXHU2NzAwXHU1MjFEXHUzMDZFXHU2NjEzXHUzMDU3XHUzMDU1XHUzMDZCXHU1QkZFXHUzMDU3XHUzMDY2XHUzMDAxXHUzMEVBXHUzMEYzXHUzMEFGXHUzMDU1XHUzMDhDXHUzMDVGXHUzMENFXHUzMEZDXHUzMEM4XHUzMDZFXHU5MUNEXHUzMDdGXHU0RUQ4XHUzMDUxXHUzMDU1XHUzMDhDXHUzMDVGXHU2NjEzXHUzMDU3XHUzMDU1XHUzMDRDXHU1QkM0XHU0RTBFXHUzMDU5XHUzMDhCXHU2NzAwXHU1OTI3XHU1MDI0XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgTE9HR0lORzogXCJcdTMwRURcdTMwQjBcdTdCQTFcdTc0MDZcIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiXHUzMEM3XHUzMEQ5XHUzMEVEXHUzMEMzXHUzMEQxXHUzMEZDXHUzMEIzXHUzMEYzXHUzMEJEXHUzMEZDXHUzMEVCXHUzMDZCXHUzMDY2XHUzMEM3XHUzMEQwXHUzMEMzXHUzMEIwXHU2MEM1XHU1ODMxXHUzMDkyXHU4ODY4XHU3OTNBXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG5cbiAgICAvLyBzaWRlYmFyLnRzXG4gICAgTk9URVNfUkVWSUVXX1FVRVVFOiBcIlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA2RVx1MzBBRFx1MzBFNVx1MzBGQ1wiLFxuICAgIENMT1NFOiBcIlx1OTU4OVx1MzA1OFx1MzA4QlwiLFxuICAgIE5FVzogXCJcdTY1QjBcdTg5OEZcIixcbiAgICBZRVNURVJEQVk6IFwiXHU2NjI4XHU2NUU1XCIsXG4gICAgVE9EQVk6IFwiXHU0RUNBXHU2NUU1XCIsXG4gICAgVE9NT1JST1c6IFwiXHU2NjBFXHU2NUU1XCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJcdTdENzFcdThBMDhcIixcbiAgICBNT05USDogXCJNb250aFwiLFxuICAgIFFVQVJURVI6IFwiUXVhcnRlclwiLFxuICAgIFlFQVI6IFwiWWVhclwiLFxuICAgIExJRkVUSU1FOiBcIkxpZmV0aW1lXCIsXG4gICAgRk9SRUNBU1Q6IFwiXHU0RTg4XHU2RTJDXCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJcdTVGQTlcdTdGRDJcdTY3MUZcdTY1RTVcdTMwNENcdTY3NjVcdTMwOEJcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNkVcdTY3OUFcdTY1NzBcIixcbiAgICBTQ0hFRFVMRUQ6IFwiXHUzMEI5XHUzMEIxXHUzMEI4XHUzMEU1XHUzMEZDXHUzMEVBXHUzMEYzXHUzMEIwXHU2RTA4XHUzMDdGXCIsXG4gICAgREFZUzogXCJcdTY1RTVcIixcbiAgICBOVU1CRVJfT0ZfQ0FSRFM6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHU2NTcwXCIsXG4gICAgUkVWSUVXU19QRVJfREFZOiBcIlx1NUU3M1x1NTc0NzogJHthdmd9XHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDL1x1NjVFNVwiLFxuICAgIElOVEVSVkFMUzogXCJcdTk1OTNcdTk2OTRcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJcdTZCMjFcdTMwNkVcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTRFODhcdTVCOUFcdTY1RTVcIixcbiAgICBDT1VOVDogXCJcdTMwQUJcdTMwQTZcdTMwRjNcdTMwQzhcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJcdTk1OTNcdTk2OTRcdTMwNkVcdTVFNzNcdTU3NDdcdTUwMjQ6ICR7YXZnfSwgXHU2NzAwXHU5NTc3XHUzMDZFXHU5NTkzXHU5Njk0OiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiXHU2NjEzXHUzMDU3XHUzMDU1XCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJcdTY2MTNcdTMwNTdcdTMwNTVcdTMwNkVcdTVFNzNcdTU3NDdcdTUwMjQ6ICR7YXZnRWFzZX1cIixcbiAgICBDQVJEX1RZUEVTOiBcIlx1MzBBQlx1MzBGQ1x1MzBDOVx1MzBCRlx1MzBBNFx1MzBEN1wiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdTVFRjZcdTY3MUZcdTMwNkVcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNENcdTMwNDJcdTMwOEJcdTU4MzRcdTU0MDhcdTMwNkJcdTMwNkZcdTMwNTNcdTMwOENcdTMwNkJcdTU0MkJcdTMwN0VcdTMwOENcdTMwN0VcdTMwNTlcIixcbiAgICBDQVJEX1RZUEVfTkVXOiBcIlx1NjVCMFx1ODk4RlwiLFxuICAgIENBUkRfVFlQRV9ZT1VORzogXCJcdTVGQTlcdTdGRDIoXHU1MjFEXHU2NzFGKVwiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiXHU1RkE5XHU3RkQyKFx1NUY4Q1x1NjcxRilcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU1NDA4XHU4QTA4OiAke3RvdGFsQ2FyZHNDb3VudH1cdTY3OUFcIixcbn07XG4iLCAiLy8gXHVENTVDXHVBRDZEXHVDNUI0XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiXHVCMzcxXCIsXG4gICAgRFVFX0NBUkRTOiBcIlx1QjJFNFx1QzJEQyBcdUJDRkMgXHVDRTc0XHVCNERDXHVCNEU0XCIsXG4gICAgTkVXX0NBUkRTOiBcIlx1QzBDOFx1Qjg1Q1x1QzZCNCBcdUNFNzRcdUI0RENcdUI0RTRcIixcbiAgICBUT1RBTF9DQVJEUzogXCJcdUM4MDRcdUNDQjQgXHVDRTc0XHVCNERDXHVCNEU0XCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiXHVDRTc0XHVCNERDXHVDNzU4IFx1QzlDNFx1RDU4OVx1QzBDMVx1RDY2OVx1Qzc0NCBcdUNEMDhcdUFFMzBcdUQ2NTRcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgSEFSRDogXCJcdUM1QjRcdUI4MjRcdUM2QzAoSGFyZClcIixcbiAgICBHT09EOiBcIlx1Qzg4Qlx1Qzc0QyhHb29kKVwiLFxuICAgIEVBU1k6IFwiXHVDMjZDXHVDNkMwKEVhc3kpXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHVDODE1XHVCMkY1IFx1RDY1NVx1Qzc3OFx1RDU1OFx1QUUzMFwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiXHVDRTc0XHVCNERDXHVDNzU4IFx1QzlDNFx1RDU4OVx1QzBDMVx1RDY2OVx1Qzc3NCBcdUNEMDhcdUFFMzBcdUQ2NTRcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuXCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIlx1QjlBQ1x1QkRGMFx1RDU2MCBcdUIxNzhcdUQyQjggXHVDNUY0XHVBRTMwXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQyBcdUI5QUNcdUJERjBcIixcbiAgICBSRVZJRVdfRUFTWV9GSUxFX01FTlU6IFwiXHVCOUFDXHVCREYwOiBcdUMyNkNcdUM2QzAoRWFzeSlcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiXHVCOUFDXHVCREYwOiBcdUM4OEJcdUM3NEMoR29vZClcIixcbiAgICBSRVZJRVdfSEFSRF9GSUxFX01FTlU6IFwiXHVCOUFDXHVCREYwOiBcdUM1QjRcdUI4MjRcdUM2QzAoSGFyZClcIixcbiAgICBSRVZJRVdfTk9URV9FQVNZX0NNRDogXCJcdUIxNzhcdUQyQjhcdUI5N0MgXHVDMjZDXHVDNkMwKGVhc3kpXHVDNzNDXHVCODVDIFx1QjlBQ1x1QkRGMFx1RDU2OVx1QjJDOFx1QjJFNFwiLFxuICAgIFJFVklFV19OT1RFX0dPT0RfQ01EOiBcIlx1QjE3OFx1RDJCOFx1Qjk3QyBcdUM4OEJcdUM3NEMoZ29vZClcdUM3M0NcdUI4NUMgXHVCOUFDXHVCREYwXHVENTY5XHVCMkM4XHVCMkU0XCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiXHVCMTc4XHVEMkI4XHVCOTdDIFx1QzVCNFx1QjgyNFx1QzZDMChoYXJkKVx1QzczQ1x1Qjg1QyBcdUI5QUNcdUJERjBcdUQ1NjlcdUIyQzhcdUIyRTRcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlx1QkFBOFx1QjRFMCBcdUIxNzhcdUQyQjhcdUI0RTRcdUM3NTggXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXHVCNEU0XHVDNzQ0IFx1QjlBQ1x1QkRGMFx1RDU2OVx1QjJDOFx1QjJFNFwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1Qzc3NCBcdUIxNzhcdUQyQjhcdUM3NTggXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXHVCNEU0XHVDNzQ0IFx1QjlBQ1x1QkRGMFx1RDU2OVx1QjJDOFx1QjJFNFwiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJcdUM3NzQgXHVCMTc4XHVEMkI4XHVDNzU4IFx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQ1x1QjRFNFx1Qzc0NCBcdUJDQkNcdUI3N0RcdUNFNThcdUFFMzBcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgVklFV19TVEFUUzogXCJcdUQxQjVcdUFDQzQgXHVENjU1XHVDNzc4XCIsXG4gICAgU1RBVFVTX0JBUjogXCItLVx1QjlBQ1x1QkRGMDogJHtkdWVOb3Rlc0NvdW50fSBcdUIxNzhcdUQyQjgsICR7ZHVlRmxhc2hjYXJkc0NvdW50fSBcdUNFNzRcdUI0REMgXHVCMEE4XHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LlwiLFxuICAgIFNZTkNfVElNRV9UQUtFTjogXCJcdUIzRDlcdUFFMzBcdUQ2NTRcdUM1RDAgJHt0fVx1QkMwMFx1QjlBQ1x1Q0QwOCBcdUFDNzhcdUI4MzhcdUMyQjVcdUIyQzhcdUIyRTRcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIlx1QjE3OFx1RDJCOFx1QUMwMCBcdUJCMzRcdUMyRENcdUI0MUMgXHVEM0Y0XHVCMzU0IFx1QzU0NFx1Qjc5OFx1QzVEMCBcdUM4MDBcdUM3QTVcdUI0MThcdUM1QjQgXHVDNzg4XHVDMkI1XHVCMkM4XHVCMkU0LiAoXHVDMTI0XHVDODE1XHVDNzQ0IFx1RDY1NVx1Qzc3OFx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NClcIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiXHVCOUFDXHVCREYwXHVCOTdDIFx1RDU1OFx1QUUzMFx1QzcwNFx1RDU3NCBcdUIxNzhcdUQyQjhcdUM1RDAgXHVDODAxXHVDODA4XHVENzg4IFx1RDBEQ1x1QURGOFx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4gKFx1QzEyNFx1QzgxNVx1Qzc0NCBcdUQ2NTVcdUM3NzhcdUQ1NzRcdUM4RkNcdUMxMzhcdUM2OTQpXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiXHVDNjk0XHVDQ0FEXHVDNzc0IFx1QzY0NFx1QjhDQ1x1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNFwiLFxuICAgIE5PX0RFQ0tfRVhJU1RTOiBcIiR7ZGVja05hbWV9XHVDNzc0XHVCNzdDXHVCMjk0IFx1Qzc3NFx1Qjk4NFx1Qzc1OCBcdUIzNzFcdUM3NzQgXHVDODc0XHVDN0FDXHVENTU4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC5cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlx1QkFBOFx1QjQ1MCBcdUQ2NTVcdUM3NzhcdUQ1ODhcdUMyQjVcdUIyQzhcdUIyRTQuIDpEXCIsXG5cbiAgICAvLyBzY2hlZHVsaW5nLnRzXG4gICAgREFZU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1Qzc3QyBcdUQ2QzRcIixcbiAgICBNT05USFNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdUFDMUNcdUM2RDQgXHVENkM0XCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdUIxNDQgXHVENkM0XCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfWRcIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1tXCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH15XCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBQbHVnaW4gLSBcdUMxMjRcdUM4MTVcIixcbiAgICBDSEVDS19XSUtJOiAnXHVCMzU0IFx1QjlDRVx1Qzc0MCBcdUM4MTVcdUJDRjRcdUI5N0MgXHVDNkQwXHVENTU4XHVDMkRDXHVCQTc0LCA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPlx1Qjk3QyBcdUQ2NTVcdUM3NzhcdUQ1NzRcdUM4RkNcdUMxMzhcdUM2OTQuJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdUJCMzRcdUMyRENcdUQ1NjAgXHVEM0Y0XHVCMzU0XHVCNEU0XCIsXG4gICAgRk9MREVSU19UT19JR05PUkVfREVTQzpcbiAgICAgICAgXCJcdUQzRjRcdUIzNTQgXHVBQ0JEXHVCODVDXHVCOTdDIFx1QkU0OCBcdUM5MDRcdUI4NUMgXHVBRDZDXHVCRDg0XHVENTc0XHVDMTFDIFx1Qzc4NVx1QjgyNVx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4gJ1RlbXBsYXRlcyBNZXRhL1NjcmlwdHMnIFx1QzY0MCBcdUFDMTlcdUM3NzQgXHVDNzg1XHVCODI1XHVENTU4XHVCMjk0IFx1QUM4M1x1Qzc0MCBcdUM3MjBcdUQ2QThcdUQ1NThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LlwiLFxuICAgIEZMQVNIQ0FSRFM6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiRWFzeSBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIkdvb2QgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfSEFSRF9MQUJFTDogXCJIYXJkIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkVhc3lcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9HT09EX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJHb29kXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiSGFyZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1RDBEQ1x1QURGOFwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiXHVEMERDXHVBREY4XHVCOTdDIFx1QUNGNVx1QkMzMSBcdUI2MTBcdUIyOTQgXHVCRTQ4IFx1QzkwNFx1Qjg1QyBcdUFENkNcdUJEODRcdUQ1NzRcdUMxMUMgXHVDNzg1XHVCODI1XHVENTc0XHVDOEZDXHVDMTM4XHVDNjk0LiBcdUM2MDgpICcjZmxhc2hjYXJkcyAjZGVjazIgI2RlY2szJ1wiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJcdUQzRjRcdUIzNTRcdUI5N0MgXHVCMzcxXHVBQ0ZDIFx1QzExQ1x1QkUwQ1x1QjM3MVx1QzczQ1x1Qjg1QyBcdUMwQUNcdUM2QTlcdUQ1NjBcdUFFNENcdUM2OTQ/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiXHVDNzc0IFx1QUUzMFx1QjJBNVx1Qzc0MCBcdUM3MDRcdUM3NTggXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1RDBEQ1x1QURGOCBcdUM2MzVcdUMxNThcdUM3NDQgXHVCMzAwXHVDQ0I0XHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTOlxuICAgICAgICBcIlx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQ1x1Qzc1OCBcdUI5QzhcdUM5QzBcdUI5QzkgXHVDOTA0XHVBQ0ZDIFx1QjNEOVx1Qzc3Q1x1RDU1QyBcdUM5MDRcdUM1RDAgXHVDMkE0XHVDRjAwXHVDOTA0XHVCOUMxIFx1Q0Y1NFx1QkE1OFx1RDJCOFx1Qjk3QyBcdUM4MDBcdUM3QTVcdUQ1NThcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJcdUM3NzQgXHVDNjM1XHVDMTU4XHVDNzQ0IFx1QzBBQ1x1QzZBOVx1RDU1OFx1QkE3NCBIVE1MIFx1QzhGQ1x1QzExRFx1Qzc3NCBcdUJBQTlcdUI4NURcdUM3NTggXHVEM0VDXHVCOUU0XHVEMzA1XHVDNzQ0IFx1QkIzNFx1QjEwOFx1RDJCOFx1QjlBQ1x1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZOiBcIlNpYmxpbmcgXHVDRTc0XHVCNERDXHVCOTdDIFx1QjJFNFx1Qzc0Q1x1QjBBMFx1QUU0Q1x1QzlDMCBcdUJCM0JcdUM1QjRcdUI0NTBcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiU2libGluZyBcdUNFNzRcdUI0RENcdUIyOTQgXHVCM0Q5XHVDNzdDXHVENTVDIFx1Q0U3NFx1QjREQyBcdUQxNERcdUMyQTRcdUQyQjhcdUM1RDBcdUMxMUMgXHVDMEREXHVDMTMxXHVCNDFDIFx1Q0U3NFx1QjREQ1x1Qzc4NVx1QjJDOFx1QjJFNC4gaS5lLiBjbG96ZSBkZWxldGlvbnNcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJcdUNFNzRcdUI0RENcdUM3NTggXHVCQjM4XHVCOUU1KGNvbnRleHQpXHVDNzQ0IFx1RDQ1Q1x1QzJEQ1x1RDU1OFx1QzJEQ1x1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz9cIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVF9ERVNDOlxuICAgICAgICBcIlx1Q0U3NFx1QjREQ1x1QzVEMFx1QzExQyAnVGl0bGUgPiBIZWFkaW5nIDEgPiBTdWJoZWFkaW5nID4gLi4uID4gU3ViaGVhZGluZycgXHVDNzU4IFx1RDQ1Q1x1QzJEQ1x1Qjk3QyBcdUQ1NjBcdUM5QzAgXHVDMTI0XHVDODE1XHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1QjE5Mlx1Qzc3NCBcdUJFNDRcdUM3MjhcIixcbiAgICBDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDOlxuICAgICAgICBcIlx1QkFBOFx1QkMxNFx1Qzc3QyBcdUJDODRcdUM4MDQgXHVENjM5XHVDNzQwIFx1QjlFNFx1QzZCMCBcdUQwNzAgXHVDNzc0XHVCQkY4XHVDOUMwXHVBQzAwIFx1Qzc4OFx1QjI5NCBcdUFDQkRcdUM2QjAgMTAwJVx1Qjg1QyBcdUMxMjRcdUM4MTVcdUQ1NzRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiXHVBRTMwXHVCQ0Y4XHVBQzEyXHVDNzNDXHVCODVDIFx1Q0QwOFx1QUUzMFx1RDY1NFwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJcdUQ1MENcdUI3OThcdUMyRENcdUNFNzRcdUI0REMgXHVCMTA4XHVCRTQ0IFx1QkU0NFx1QzcyOFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlx1QjlBQ1x1QkRGMFx1QzkxMVx1Qzc3OCBcdUNFNzRcdUI0RENcdUM3NTggXHVDMjFDXHVDMTFDXHVCOTdDIFx1Qjc5Q1x1QjM2NFx1QzczQ1x1Qjg1QyBcdUI0NTBcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJcdUJFNDggXHVDRTc4IFx1Q0M0NFx1QzZCMFx1QUUzMCBcdUNFNzRcdUI0RENcdUI5N0MgXHVCRTQ0XHVENjVDXHVDMTMxXHVENjU0XHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuICAgIENPTlZFUlRfSElHSExJR0hUU19UT19DTE9aRVM6IFwiPT1oaWdodGxpZ2h0cz09IFx1Qjk3QyBcdUJFNDggXHVDRTc4IFx1Q0M0NFx1QzZCMFx1QUUzMFx1Qjg1QyBcdUM4MDRcdUQ2NThcdUQ1NThcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgQ09OVkVSVF9CT0xEX1RFWFRfVE9fQ0xPWkVTOiBcIioqYm9sZGVkIHRleHQqKiBcdUI5N0MgXHVCRTQ4IFx1Q0U3OCBcdUNDNDRcdUM2QjBcdUFFMzBcdUI4NUMgXHVDODA0XHVENjU4XHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcInt7Y3VybHkgYnJhY2tldHN9fSBcdUI5N0MgXHVCRTQ4IFx1Q0U3OCBcdUNDNDRcdUM2QjBcdUFFMzBcdUI4NUMgXHVDODA0XHVENjU4XHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiXHVDNzc4XHVCNzdDXHVDNzc4IFx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQyBcdUFENkNcdUJEODRcdUM3OTBcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOlxuICAgICAgICBcIlx1QzhGQ1x1Qzc1ODogXHVDNzc0IFx1QzYzNVx1QzE1OFx1Qzc0NCBcdUMyMThcdUM4MTVcdUQ1NUMgXHVENkM0XHVDNUQwXHVCMjk0IFx1Qzc3NFx1QkJGOCBcdUM3OTFcdUMxMzFcdUI0MUMgXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXHVCOTdDIFx1QzIxOFx1QjNEOVx1QzczQ1x1Qjg1QyBcdUMyMThcdUM4MTVcdUQ1NzRcdUM1N0MgXHVENTY4XHVDNzQ0IFx1QzhGQ1x1Qzc1OFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC5cIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1Qzc3OFx1Qjc3Q1x1Qzc3OCBcdUJDMThcdUM4MDQgXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1QUQ2Q1x1QkQ4NFx1Qzc5MFwiLFxuICAgIE1VTFRJTElORV9DQVJEU19TRVBBUkFUT1I6IFwiXHVDNUVDXHVCN0VDIFx1QzkwNCBcdUQ1MENcdUI3OThcdUMyRENcdUNFNzRcdUI0REMgXHVBRDZDXHVCRDg0XHVDNzkwXCIsXG4gICAgTVVMVElMSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUjogXCJcdUM1RUNcdUI3RUMgXHVDOTA0IFx1QkMxOFx1QzgwNCBcdUQ1MENcdUI3OThcdUMyRENcdUNFNzRcdUI0REMgXHVBRDZDXHVCRDg0XHVDNzkwXCIsXG4gICAgTk9URVM6IFwiXHVCMTc4XHVEMkI4XCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHVCOUFDXHVCREYwXHVDNUQwIFx1QzBBQ1x1QzZBOVx1RDU2MCBcdUQwRENcdUFERjhcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOlxuICAgICAgICBcIlx1RDBEQ1x1QURGOFx1Qjk3QyBcdUFDRjVcdUJDMzEgXHVCNjEwXHVCMjk0IFx1QkU0OCBcdUM5MDRcdUI4NUMgXHVBRDZDXHVCRDg0XHVENTc0XHVDMTFDIFx1Qzc4NVx1QjgyNVx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4gXHVDNjA4KSAnI3JldmlldyAjdGFnMiAjdGFnMydcIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFOiBcIlx1QjlBQ1x1QkRGMFx1Qjk3QyBcdUM3MDRcdUQ1NzQgXHVCNzlDXHVCMzY0IFx1QjE3OFx1RDJCOFx1Qjk3QyBcdUM1RkRcdUIyQzhcdUIyRTQuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOiBcIlx1Qzc3NCBcdUM2MzVcdUMxNThcdUM3NzQgXHVBRUJDXHVDODM4XHVDNzg4XHVDNzNDXHVCQTc0LCBcdUIxNzhcdUQyQjhcdUIyOTQgXHVDOTExXHVDNjk0XHVCM0M0KFx1RDM5OFx1Qzc3NFx1QzlDMCBcdUI3QURcdUQwNkMpXHVDNUQwIFx1QjUzMFx1Qjc3QyBcdUM4MTVcdUI4MkNcdUI0MjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiXHVCOUFDXHVCREYwIFx1RDZDNFx1QzVEMCBcdUIyRTRcdUM3NEMgXHVCMTc4XHVEMkI4XHVCOTdDIFx1Qzc5MFx1QjNEOVx1QzczQ1x1Qjg1QyBcdUM1RkRcdUIyQzhcdUIyRTQuXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiXHVEMzBDXHVDNzdDIFx1QkE1NFx1QjI3NFx1QzVEMFx1QzExQ1x1Qzc1OCBcdUI5QUNcdUJERjAgXHVDNjM1XHVDMTU4XHVDNzQ0IFx1QkU0NFx1RDY1Q1x1QzEzMVx1RDY1NCBcdUQ1NjlcdUIyQzhcdUIyRTQuIFx1QzYwOCkgXHVCOUFDXHVCREYwOiBFYXN5IEdvb2QgSGFyZFwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TX0RFU0M6XG4gICAgICAgIFwiXHVDNzc0IFx1QzYzNVx1QzE1OFx1Qzc0NCBcdUJFNDRcdUQ2NUNcdUMxMzFcdUQ2NTQgXHVENTVDIFx1RDZDNCwgXHVCQTg1XHVCODM5IFx1QjJFOFx1Q0Q5NVx1RDBBNFx1Qjk3QyBcdUM3NzRcdUM2QTlcdUQ1NzQgXHVCOUFDXHVCREYwXHVENTU4XHVDMkU0IFx1QzIxOCBcdUM3ODhcdUMyQjVcdUIyQzhcdUIyRTQuIFx1Qzc3NCBcdUM2MzVcdUMxNThcdUM3NDQgXHVCQ0MwXHVBQ0JEXHVENTVDIFx1RDZDNFx1QzVEMCBcdUM2MzVcdUMyRENcdUI1MTRcdUM1QjhcdUM3NDQgXHVDMEM4XHVCODVDXHVBQ0UwXHVDRTY4IFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC5cIixcbiAgICBNQVhfTl9EQVlTX1JFVklFV19RVUVVRTogXCJcdUM2MjRcdUI5NzhcdUNBQkQgXHVEMzI4XHVCMTEwXHVDNUQwIFx1RDQ1Q1x1QzJEQ1x1RDU2MCBcdUNENUNcdUIzMDAgXHVDNzdDXHVDMjE4XCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHVDODAxXHVDNUI0XHVCM0M0IDFcdUM3NzRcdUMwQzFcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1QzcyMFx1RDZBOFx1RDU1QyBcdUMyMkJcdUM3OTBcdUI5N0MgXHVDNzg1XHVCODI1XHVENTc0XHVDOEZDXHVDMTM4XHVDNjk0LlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlx1QzBBQ1x1QzZBOVx1Qzc5MCBcdUM3NzhcdUQxMzBcdUQzOThcdUM3NzRcdUMyQTQgXHVBRTMwXHVCQ0Y4IFx1QzEyNFx1QzgxNVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTogXCJcdUIzNzEgXHVEMkI4XHVCOUFDXHVCMjk0IFx1Q0M5OFx1Qzc0Q1x1QzVEMCBcdUQ2NTVcdUM3QTVcdUI0MUMgXHVBQzgzXHVDNzNDXHVCODVDIFx1RDQ1Q1x1QzJEQ1x1QjQxOFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFX0RFU0M6XG4gICAgICAgIFwiXHVBQzE5XHVDNzQwIFx1Q0U3NFx1QjREQ1x1QzVEMCBcdUM5MTFcdUNDQTlcdUI0MUMgXHVCMzcxXHVDNzQ0IFx1QzgxMVx1QzczQ1x1QjgyNFx1QkE3NCBcdUM3NzQgXHVDNjM1XHVDMTU4XHVDNzQ0IFx1QjA0NFx1QzJFRFx1QzJEQ1x1QzYyNC4gXHVBQzE5XHVDNzQwIFx1RDMwQ1x1Qzc3Q1x1QzVEMCBcdUM1RUNcdUI3RUMgXHVCMzcxXHVDNUQwIFx1QzE4RFx1RDU1QyBcdUNFNzRcdUI0RENcdUFDMDAgXHVDNzg4XHVCMjk0IFx1QUNCRFx1QzZCMCBcdUM3MjBcdUM2QTlcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgQUxHT1JJVEhNOiBcIlx1QzU0Q1x1QUNFMFx1QjlBQ1x1Qzk5OFwiLFxuICAgIENIRUNLX0FMR09SSVRITV9XSUtJOlxuICAgICAgICAnXHVCMzU0IFx1QjlDRVx1Qzc0MCBcdUM4MTVcdUJDRjRcdUI5N0MgXHVDNkQwXHVENTU4XHVDMkRDXHVCQTc0LCA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5hbGdvcml0aG0gaW1wbGVtZW50YXRpb248L2E+XHVDNzQ0IFx1RDY1NVx1Qzc3OFx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4nLFxuICAgIEJBU0VfRUFTRTogXCJcdUFFMzBcdUJDRjggZWFzZVwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIlx1Q0Q1Q1x1QzE5Rlx1QUMxMiA9IDEzMCwgXHVDODAxXHVDODE1XHVDRTU4XHVCMjk0IFx1QjMwMFx1QjdCNSAyNTBcdUM3ODVcdUIyQzhcdUIyRTQuXCIsXG4gICAgQkFTRV9FQVNFX01JTl9XQVJOSU5HOiBcIlx1QUUzMFx1QkNGOCBlYXNlXHVCMjk0IFx1QzgwMVx1QzVCNFx1QjNDNCAxMzAgXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDL1x1QjE3OFx1RDJCOFx1Qjk3QyBcdUM1QjRcdUI4MjRcdUM2QzAoSGFyZClcdUM3M0NcdUI4NUMgXHVCOUFDXHVCREYwXHVENTg4XHVDNzQ0IFx1QjU0Q1x1Qzc1OCBcdUFDMDRcdUFDQTkgXHVCQ0MwXHVBQ0JEXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFX0RFU0M6IFwiXHVDMEM4XHVCODVDXHVDNkI0IFx1QUMwNFx1QUNBOSA9IFx1Qzc3NFx1QzgwNCBcdUFDMDRcdUFDQTkgKiBcdUFDMDRcdUFDQTlcdUJDQzBcdUFDQkQgXHVBQzEyIC8gMTAwLlwiLFxuICAgIEVBU1lfQk9OVVM6IFwiXHVDMjZDXHVDNkMwKEVhc3kpIFx1QkNGNFx1QjEwOFx1QzJBNFwiLFxuICAgIEVBU1lfQk9OVVNfREVTQzpcbiAgICAgICAgXCJcdUMyNkNcdUM2QzAoRWFzeSkgXHVCQ0Y0XHVCMTA4XHVDMkE0XHVCMjk0IFx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQy9cdUIxNzhcdUQyQjhcdUM1RDBcdUMxMUMgXHVDODhCXHVDNzRDKEdvb2QpXHVBQ0ZDIFx1QzI2Q1x1QzZDMChFYXN5KSBcdUMwQUNcdUM3NzRcdUM3NTggXHVBQzA0XHVBQ0E5IFx1Q0MyOFx1Qzc3NFx1Qjk3QyBcdUMxMjRcdUM4MTVcdUQ1NjAgXHVDMjE4IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4gKFx1Q0Q1Q1x1QzE4QyA9IDEwMCUpXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJcdUMyNkNcdUM2QzAoRWFzeSkgXHVCQ0Y0XHVCMTA4XHVDMkE0XHVCMjk0IFx1QzgwMVx1QzVCNFx1QjNDNCAxMDBcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIE1BWF9JTlRFUlZBTDogXCJcdUNENUNcdUIzMDAgXHVBQzA0XHVBQ0E5XCIsXG4gICAgTUFYX0lOVEVSVkFMX0RFU0M6IFwiXHVBQzA0XHVBQ0E5XHVDNzU4IFx1QzBDMVx1RDU1Q1x1QzEyMFx1Qzc0NCBcdUI0NTggXHVDMjE4IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4gKFx1QUUzMFx1QkNGOFx1QUMxMiA9IDEwMFx1QjE0NClcIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiXHVDRDVDXHVCMzAwIFx1QUMwNFx1QUNBOVx1Qzc0MCBcdUM4MDFcdUM1QjRcdUIzQzQgMVx1Qzc3Q1x1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJcdUNENUNcdUIzMDAgXHVDNUYwXHVBQ0IwIFx1QUUzMFx1QzVFQ1x1QjNDNFwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzpcbiAgICAgICAgXCJcdUI5QzFcdUQwNkNcdUI0MUMgXHVCMTc4XHVEMkI4XHVDNzU4IFx1Q0QwOFx1QUUzMCBlYXNlXHVDNUQwIFx1QjMwMFx1RDU1QyBcdUFDMDBcdUM5MTFcdUNFNThcdUFDMDAgXHVDODAxXHVDNkE5XHVCNDFDIGVhc2VcdUM3NTggXHVDRDVDXHVCMzAwIFx1QUUzMFx1QzVFQ1x1QjNDNFx1Qzc4NVx1QjJDOFx1QjJFNC5cIixcbiAgICBMT0dHSU5HOiBcIlx1Qjg1Q1x1QUU0NVwiLFxuICAgIERJU1BMQVlfREVCVUdfSU5GTzogXCJcdUI1MTRcdUJDODRcdUFFNDUgXHVDODE1XHVCQ0Y0XHVCOTdDIFx1QUMxQ1x1QkMxQ1x1Qzc5MCBcdUNGNThcdUMxOTRcdUM1RDAgXHVENDVDXHVDMkRDXHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdUI5QUNcdUJERjBcdUQ1NjAgXHVCMTc4XHVEMkI4IFx1QjMwMFx1QUUzMFx1QzVGNFwiLFxuICAgIENMT1NFOiBcIlx1QjJFQlx1QUUzMFwiLFxuICAgIE5FVzogXCJOZXdcIixcbiAgICBZRVNURVJEQVk6IFwiXHVDNUI0XHVDODFDXCIsXG4gICAgVE9EQVk6IFwiXHVDNjI0XHVCMjk4XCIsXG4gICAgVE9NT1JST1c6IFwiXHVCMEI0XHVDNzdDXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJcdUQxQjVcdUFDQzRcIixcbiAgICBNT05USDogXCJcdUM2RDRcIixcbiAgICBRVUFSVEVSOiBcIlx1QkQ4NFx1QUUzMFwiLFxuICAgIFlFQVI6IFwiXHVCMTQ0XCIsXG4gICAgTElGRVRJTUU6IFwiXHVEM0M5XHVDMEREXCIsXG4gICAgRk9SRUNBU1Q6IFwiXHVDNjA4XHVDRTIxXCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJcdUM3NzRcdUQ2QzRcdUM1RDAgXHVENTU5XHVDMkI1XHVENTYwIFx1Q0U3NFx1QjREQ1x1Qzc1OCBcdUMyMThcIixcbiAgICBTQ0hFRFVMRUQ6IFwiU2NoZWR1bGVkXCIsXG4gICAgREFZUzogXCJcdUM3N0NcIixcbiAgICBOVU1CRVJfT0ZfQ0FSRFM6IFwiXHVDRTc0XHVCNERDXHVDNzU4IFx1QzIxOFwiLFxuICAgIFJFVklFV1NfUEVSX0RBWTogXCJcdUQzQzlcdUFERTA6ICR7YXZnfSBcdUI5QUNcdUJERjAvXHVDNzdDXCIsXG4gICAgSU5URVJWQUxTOiBcIlx1QUMwNFx1QUNBOVwiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIlx1QjlBQ1x1QkRGMFx1Qjk3QyBcdUIyRTRcdUMyREMgXHVENTYwIFx1QjU0QyBcdUFFNENcdUM5QzBcdUM3NTggXHVBRTMwXHVBQzA0XCIsXG4gICAgQ09VTlQ6IFwiQ291bnRcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJcdUQzQzlcdUFERTAgXHVBQzA0XHVBQ0E5OiAke2F2Z30sIFx1QUMwMFx1QzdBNSBcdUFFMzQgXHVBQzA0XHVBQ0E5OiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWFzZXNcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIkF2ZXJhZ2UgZWFzZTogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHVDRTc0XHVCNERDIFx1RDBDMFx1Qzc4NVwiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdUM1RUNcdUFFMzBcdUM1RDBcdUIyOTQgXHVCQjNCXHVDNUI0XHVCNDU0IFx1Q0U3NFx1QjREQ1x1QjNDNCBcdUQzRUNcdUQ1NjhcdUI0MjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOZXdcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiWW91bmdcIixcbiAgICBDQVJEX1RZUEVfTUFUVVJFOiBcIk1hdHVyZVwiLFxuICAgIENBUkRfVFlQRVNfU1VNTUFSWTogXCJcdUM4MDRcdUNDQjQgXHVDRTc0XHVCNERDIFx1QzIxODogJHt0b3RhbENhcmRzQ291bnR9XCIsXG59O1xuIiwgIi8vIE1hcmF0aGlcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gTmVkZXJsYW5kc1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBOb3Jza1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBqXHUwMTE5enlrIHBvbHNraVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBQb3J0dWd1XHUwMEVBc1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBQb3J0dWd1XHUwMEVBcyBkbyBCcmFzaWxcbi8vIEJyYXppbGlhbiBQb3J0dWd1ZXNlXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiQmFyYWxob3NcIixcbiAgICBEVUVfQ0FSRFM6IFwiQ2FydGFzIHBhcmEgQ29sb2NhciBlbSBEaWFcIixcbiAgICBORVdfQ0FSRFM6IFwiTm92YXMgQ2FydGFzXCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiVG90YWwgZGUgQ2FydGFzXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiUmVpbmljaWFyIG8gUHJvZ3Jlc3NvIGRhIENhcnRhXCIsXG4gICAgSEFSRDogXCJEaWZcdTAwRURjaWxcIixcbiAgICBHT09EOiBcIk9LXCIsXG4gICAgRUFTWTogXCJGXHUwMEUxY2lsXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiTW9zdHJhciBSZXNwb3N0YVwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiTyBQcm9ncmVzc28gZGEgQ2FydGEgZm9pIHJlaW5pY2lhZG9cIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiQWJyaXIgdW1hIG5vdGEgcGFyYSByZXZpc2FyXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlJldmlzYXIgZmxhc2hjYXJkc1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJSZXZpc1x1MDBFM286IEZcdTAwRTFjaWxcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiUmV2aXNcdTAwRTNvOiBPS1wiLFxuICAgIFJFVklFV19IQVJEX0ZJTEVfTUVOVTogXCJSZXZpc1x1MDBFM286IERpZlx1MDBFRGNpbFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlJldmlzYXIgbm90YSBjb21vIGZcdTAwRTFjaWxcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJSZXZpc2FyIG5vdGEgY29tbyBPS1wiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIlJldmlzYXIgbm90YSBjb21vIGRpZlx1MDBFRGNpbFwiLFxuICAgIFJFVklFV19BTExfQ0FSRFM6IFwiUmV2aXNhciBmbGFzaGNhcmRzIGRlIHRvZGFzIGFzIG5vdGFzXCIsXG4gICAgQ1JBTV9BTExfQ0FSRFM6IFwiU2VsZWN0IGEgZGVjayB0byBjcmFtXCIsXG4gICAgUkVWSUVXX0NBUkRTX0lOX05PVEU6IFwiUmV2aXNhciBmbGFzaGNhcmRzIG5lc3NhIG5vdGFcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiUmV2aXNhciB0b2RhcyBhcyBmbGFzaGNhcmRzIG5lc3NhIG5vdGFcIixcbiAgICBWSUVXX1NUQVRTOiBcIlZlciBlc3RhdFx1MDBFRHN0aWNhc1wiLFxuICAgIFNUQVRVU19CQVI6XG4gICAgICAgIFwiUmV2aXNcdTAwRTNvOiAke2R1ZU5vdGVzQ291bnR9IG5vdGEocyksICR7ZHVlRmxhc2hjYXJkc0NvdW50fSBDYXJ0YShzKSBwYXJhIGNvbG9jYXIgZW0gZGlhXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlNpY3Jvbml6YVx1MDBFN1x1MDBFM28gbGV2b3UgJHt0fW1zXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJOb3RhIFx1MDBFOSBzYWx2YSBuYSBwYXN0YSBpZ25vcmFkYSAoY2hlcXVlIGFzIGNvbmZpZ3VyYVx1MDBFN1x1MDBGNWVzKS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiUG9yIGZhdm9yIGV0aXF1ZXRlIGEgbm90YSBhcHJvcHJpYWRhbWVudGUgcGFyYSByZXZpc2FyIChuYXMgY29uZmlndXJhXHUwMEU3XHUwMEY1ZXMpLlwiLFxuICAgIFJFU1BPTlNFX1JFQ0VJVkVEOiBcIlJlc3Bvc3RhIHJlY2ViaWRhLlwiLFxuICAgIE5PX0RFQ0tfRVhJU1RTOiBcIk5lbmh1bSBiYXJhbGhvIGV4aXN0ZSBwYXJhICR7ZGVja05hbWV9XCIsXG4gICAgQUxMX0NBVUdIVF9VUDogXCJWb2NcdTAwRUEgY29sb2NvdSB0dWRvIGVtIHByYXpvIGFnb3JhIDpELlwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCIke2ludGVydmFsfSBkaWEocylcIixcbiAgICBNT05USFNfU1RSX0lWTDogXCIke2ludGVydmFsfSBtXHUwMEVBcyhlcylcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IGFubyhzKVwiLFxuICAgIERBWVNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1kXCIsXG4gICAgTU9OVEhTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9bVwiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9YVwiLFxuXG4gICAgLy8gc2V0dGluZ3MudHNcbiAgICBTRVRUSU5HU19IRUFERVI6IFwiUGxndWluIFNwYWNlZCBSZXBldGl0aW9uIC0gQ29uZmlndXJhXHUwMEU3XHUwMEUzb1wiLFxuICAgIENIRUNLX1dJS0k6ICdQYXJhIG1haXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzLCBjaGVja2UgbyA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPi4nLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIlBhc3RhcyBwYXJhIGlnbm9yYXJcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICBcIkVuc2lyYSBvIGNhbWluaG8gZGFzIHBhc3RhcyBzZXBhcmFkbyBwb3IgcXVlYnJhcyBkZSBsaW5oYSBleDogVGVtcGxhdGVzIE1ldGEvU2NyaXB0c1wiLFxuICAgIEZMQVNIQ0FSRFM6IFwiRmxhc2hjYXJkc1wiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIlRleHRvIGRvIEJvdFx1MDBFM28gZGUgRlx1MDBFMWNpbFwiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIlRleHRvIGRvIEJvdFx1MDBFM28gZGUgT0tcIixcbiAgICBGTEFTSENBUkRfSEFSRF9MQUJFTDogXCJUZXh0byBkbyBCb3RcdTAwRTNvIGRlIERpZlx1MDBFRGNpbFwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6ICdDb3N0dW1pemUgbyByXHUwMEYzdHVsbyBwYXJhIG8gYm90XHUwMEUzbyBkZSBcIkZcdTAwRTFjaWxcIicsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogJ0Nvc3R1bWl6ZSBvIHJcdTAwRjN0dWxvIHBhcmEgbyBib3RcdTAwRTNvIGRlIFwiT0tcIicsXG4gICAgRkxBU0hDQVJEX0hBUkRfREVTQzogJ0N1c3RvbWl6ZSBvIHJcdTAwRjN0dWxvIHBhcmEgbyBib3RcdTAwRTNvIGRlIFwiRGlmXHUwMEVEY2lsXCInLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIkV0aXF1ZXRhcyBkb3MgRmxhc2hjYXJkc1wiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiRW5zaXJhIGV0aXF1ZXRhcyBzZXBhcmFkYXMgcG9yIGVzcGFcdTAwRTdvcyBvdSBxdWVicmFzIGRlIGxpbmhhIGV4OiAjZmxhc2hjYXJkcyAjYmFyYWxobzIgI2JhcmFsaG8zLlwiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJDb252ZXJ0ZXIgcGFzdGFzIHBhcmEgYmFyYWxob3MgZSBzdWItYmFyYWxob3M/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6XG4gICAgICAgIFwiSXNzbyBcdTAwRTkgdW1hIGFsdGVybmF0aXZhIHBhcmEgYSBvcFx1MDBFN1x1MDBFM28gZGUgZXRpcXVldGEgZG9zIEZsYXNoY2FyZHMgZW0gY2ltYS5cIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzpcbiAgICAgICAgXCJTYWx2YXIgY29tZW50XHUwMEUxcmlvcyBkZSBhZ2VuZGFtZW50byBuYSBtZXNtYSBsaW5oYSBxdWUgYSBcdTAwRkFsdGltYSBsaW5oYSBkbyBmbGFzaGNhcmQ/XCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJMaWdhciBpc3NvIHZhaSBmYXplciBjb20gcXVlIG9zIGNvbWVudFx1MDBFMXJpb3MgZW0gSFRNTCBuXHUwMEUzbyBxdWVicmVtIGEgZm9ybWF0YVx1MDBFN1x1MDBFM28gZGUgbGlzdGFzLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJFbnRlcnJhciBjYXJ0YXMgaXJtXHUwMEUzcyBhdFx1MDBFOSBvIHByXHUwMEYzeGltbyBkaWE/XCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiQ2FydGFzIGlybVx1MDBFM3Mgc1x1MDBFM28gZ2VyYWRhcyBwZWxvIHRleHRvIGRhIG1lc21hIGNhcnRhIGV4OiBvbWlzc1x1MDBFM28gZGUgcGFsYXZyYXNcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJNb3N0cmFyIGNvbnh0ZXh0byBuYXMgY2FydGFzP1wiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUX0RFU0M6IFwiZXg6IFRcdTAwRUR0dWxvID4gQ2FiZVx1MDBFN2FsaG8gMSA+IFN1YmNhYmVcdTAwRTdhbGhvID4gLi4uID4gU3ViY2FiZVx1MDBFN2FsaG9cIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIlBvcmNlbnRhZ2VtIGRhIEFsdHVyYSBkbyBGbGFzaGNhcmRcIixcbiAgICBDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDOlxuICAgICAgICBcIkRldmVyaWEgZXN0YXIgY29uZmlndXJhZG8gZW0gMTAwJSBlbSBkaXNwb3NpdGl2b3MgbVx1MDBGM3ZlaXMgb3Ugc2Ugdm9jXHUwMEVBIHRlbSBpbWFnZW5zIG11aXRvIGdyYW5kZXNcIixcbiAgICBSRVNFVF9ERUZBVUxUOiBcIlJlaW5pY2lhciBwYXJhIGEgcHJcdTAwRTktZGVmaW5pXHUwMEU3XHUwMEUzb1wiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJQb3JjZW50YWdlbSBkZSBMYXJndXJhIGRvIEZsYXNoY2FyZFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIkFsZWF0b3JpemFyIGEgb3JkZW0gZGFzIGNhcnRhcyBkdXJhbnRlIGEgcmV2aXNcdTAwRTNvP1wiLFxuICAgIERJU0FCTEVfQ0xPWkVfQ0FSRFM6IFwiRGVzYWJpbGl0YXIgY2FydGFzIHF1ZSB1c2FtIG9taXNzXHUwMEUzbyBkZSBwYWxhdnJhcz9cIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIkNvbnZlcnRlciA9PW1hcmNhLXRleHRvPT0gZW0gb21pc3NcdTAwRjVlcz9cIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiQ29udmVydGVyICoqdGV4dG8gZW0gbmVncml0byoqIGVtIG9taXNzXHUwMEY1ZXM/XCIsXG4gICAgQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVM6IFwiQ29udmVydGVyIHt7Y2hhdmVzfX0gZW0gb21pc3NcdTAwRjVlcz9cIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlNlcGFyYWRvciBwYXJhIGZsYXNoY2FyZHMgaW5saW5lXCIsXG4gICAgRklYX1NFUEFSQVRPUlNfTUFOVUFMTFlfV0FSTklORzpcbiAgICAgICAgXCJOb3RlIHF1ZSBkZXBvaXMgZGUgbXVkYXIgaXNzbyB2b2NcdTAwRUEgdmFpIHRlciBxdWUgbWFudWFsbWVudGUgbXVkYXIgcXVhaXNxdWVyIGZsYXNoY2FyZHMgcXVlIHZvY1x1MDBFQSB0ZW5oYS5cIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlNlcGFyYWRvciBwYXJhIGZsYXNoY2FyZHMgaW5saW5lIHJldmVyc29zXCIsXG4gICAgTVVMVElMSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJTZXBhcmFkb3IgcGFyYSBmbGFzaGNhcmRzIGRlIG1cdTAwRkFsdGlwbGFzIGxpbmhhc1wiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhZG9yIHBhcmEgZmxhc2hjYXJkcyBkZSBtXHUwMEZBbHRpcGxhcyBsaW5oYXMgcmV2ZXJzb3NcIixcbiAgICBOT1RFUzogXCJOb3Rhc1wiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiRW5hYmxlIG5vdGUgcmV2aWV3IHBhbmUgb24gc3RhcnR1cFwiLFxuICAgIFRBR1NfVE9fUkVWSUVXOiBcIkV0aXF1ZXRhcyBwYXJhIHJldmlzYXJcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOlxuICAgICAgICBcIkVuc2lyYSBldGlxdWV0YXMgc2VwYXJhZGFzIHBvciBlc3BhXHUwMEU3b3Mgb3UgcXVlYnJhIGRlIGxpbmhhcyBleDogI3JldmlzYXIgI2V0aXF1ZXRhMiAjZXRpcXVldGEzLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiQWJyaXIgdW1hIG5vdGEgYWxlYXRcdTAwRjNyaWEgcGFyYSByZXZpc2FyXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOlxuICAgICAgICBcIlF1YW5kbyB2b2NcdTAwRUEgZGVzYWJpbGl0YXIgaXNzbywgYXMgbm90YXMgdlx1MDBFM28gc2VyIG9yZGVuYWRhcyBwb3IgaW1wb3J0XHUwMEUybmNpYSAoUGFnZVJhbmspLlwiLFxuICAgIEFVVE9fTkVYVF9OT1RFOiBcIkFicmlyIGEgcHJcdTAwRjN4aW1hIG5vdGEgYXV0b21hdGljYW1lbnRlIGRlcG9pcyBkZSB1bWEgcmV2aXNcdTAwRTNvXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiRGVzYWJpbGl0YXIgb3BcdTAwRTdcdTAwRjVlcyBkZSByZXZpc1x1MDBFM28gbm8gbWVudSBkZSBhcnF1aXZvcyBleDogUmV2aXNcdTAwRTNvOiBGXHUwMEUxY2lsIE9LIERpZlx1MDBFRGNpbFwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TX0RFU0M6XG4gICAgICAgIFwiRGVwb2lzIGRlIGRlc2FiaWxpdGFyLCB2b2NcdTAwRUEgcG9kZSByZXZpc2FyIHVzYW5kbyBvcyBhdGFsaG9zIGRlIGNvbWFuZG8uIFJlaW5pY2llIE9ic2lkaWFuIGRlcG9pcyBkZSBtdWRhciBpc3NvLlwiLFxuICAgIE1BWF9OX0RBWVNfUkVWSUVXX1FVRVVFOiBcIk5cdTAwRkFtZXJvIG1cdTAwRTF4aW1vIGRlIGRpYXMgcGFyYSBleGliaXIgbm8gcGFpbmVsIGRpcmVpdG9cIixcbiAgICBNSU5fT05FX0RBWTogXCJPIG5cdTAwRkFtZXJvIGRlIGRpYXMgZGV2ZSBzZXIgcGVsbyBtZW5vcyAxLlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlBvciBmYXZvciBlbnNpcmEgdW0gblx1MDBGQW1lcm8gdlx1MDBFMWxpZG8uXCIsXG4gICAgVUlfUFJFRkVSRU5DRVM6IFwiUHJlZmVyXHUwMEVBbmNpYXMgZGUgVUlcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6XG4gICAgICAgIFwiXHUwMEMxcnZvcmVzIGRlIGJhcmFsaG9zIGRldmVtIGluaWNpYWxtZW50ZSBzZXJlbSBleGliaWRhcyBjb21vIGV4cGFuZGlkYXNcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJEZXNhYmlsaXRlIGlzc28gcGFyYSBjb2xhcHNhciBiYXJhbGhvcyBxdWUgZXN0XHUwMEUzbyB1bSBkZW50cm8gZG8gb3V0cm8gbmEgbWVzbWEgY2FydGEuIFx1MDBEQXRpbCBzZSB2b2NcdTAwRUEgdGVtIGNhcnRhcyBxdWUgcGVydGVuY2VtIGEgbXVpdG9zIGJhcmFsaG9zIGVtIHVtIG1lc21vIGFycXVpdm8uXCIsXG4gICAgQUxHT1JJVEhNOiBcIkFsZ29yXHUwMEVEdG1vXCIsXG4gICAgQ0hFQ0tfQUxHT1JJVEhNX1dJS0k6XG4gICAgICAgICdQYXJhIG1haXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzLCBjaGVxdWUgYSA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5pbXBsZW1lbnRhXHUwMEU3XHUwMEUzbyBkbyBhbGdvclx1MDBFRHRtbzwvYT4uJyxcbiAgICBCQVNFX0VBU0U6IFwiRmFjaWxpZGFkZSBiYXNlXCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwibVx1MDBFRG5pbW8gPSAxMzAsIHByZWZlcml2ZWxtZW50ZSBhcHJveGltYWRhbWVudGUgMjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJBIGZhY2lsaWRhZGUgYmFzZSBkZXZlIHNlciBwZWxvIG1lbm9zIDEzMC5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6XG4gICAgICAgIFwiTXVkYW5cdTAwRTdhIGRlIGludGVydmFsbyBxdWFuZG8gdm9jXHUwMEVBIHJldmlzYSB1bShhKSBmbGFzaGNhcmQvbm90YSBjb21vIGRpZlx1MDBFRGNpbFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIm5vdm9JbnRlcnZhbG8gPSB2ZWxob0ludGVydmFsbyAqIG11ZGFuY2FJbnRlcnZhbG8gLyAxMDAuXCIsXG4gICAgRUFTWV9CT05VUzogXCJCXHUwMEY0bnVzIGRlIEZcdTAwRTFjaWxcIixcbiAgICBFQVNZX0JPTlVTX0RFU0M6XG4gICAgICAgIFwiTyBiXHUwMEY0bnVzIGRlIGZcdTAwRTFjaWwgdGUgcGVybWl0ZSBtdWRhciBhIGRpZmVyXHUwMEVBbmNpYSBlbnRyZSBpbnRlcnZhbG9zIGRlIHJlc3BvbmRlciBPSyBlIEZcdTAwRTFjaWwgZW0gdW0oYSkgZmxhc2hjYXJkL25vdGEgKG1cdTAwRURuaW1vID0gMTAwJSkuXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJPIGJcdTAwRjRudXMgZGUgZlx1MDBFMWNpbCBkZXZlIHNlciBwZWxvIG1lbm9zIDEwMC5cIixcbiAgICBNQVhfSU5URVJWQUw6IFwiSW50ZXJ2YWxvIE1cdTAwRTF4aW1vXCIsXG4gICAgTUFYX0lOVEVSVkFMX0RFU0M6XG4gICAgICAgIFwiVGUgcGVybWl0ZSBjb2xvY2FyIHVtIGxpbWl0ZSBtXHUwMEUxeGltbyBubyBpbnRlcnZhbG8gKHByXHUwMEU5LWRlZmluaVx1MDBFN1x1MDBFM28gPSAxMDAgYW5vcykuXCIsXG4gICAgTUFYX0lOVEVSVkFMX01JTl9XQVJOSU5HOiBcIk8gaW50ZXJ2YWxvIG1cdTAwRTF4aW1vIGRldmUgc2VyIHBlbG8gbWVub3MgMSBkaWEuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJDb250cmlidWlcdTAwRTdcdTAwRTNvIE1cdTAwRTF4aW1hIGRlIExpbmtzXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIkNvbnRyaWJ1aVx1MDBFN1x1MDBFM28gbVx1MDBFMXhpbWEgZGEgZmFjaWxpZGFkZSBwb25kZXJhZGEgZGFzIG5vdGFzIGxpbmthZGFzIFx1MDBFMCBmYWNpbGlkYWRlIGluaWNpYWwuXCIsXG4gICAgTE9HR0lORzogXCJMb2dnaW5nXCIsXG4gICAgRElTUExBWV9ERUJVR19JTkZPOiBcIk1vc3RyYXIgaW5mb3JtYVx1MDBFN1x1MDBFM28gZGUgZGVidWdnaW5nIG5vIGNvbnNvbGUgZGUgZGVzZW52b2x2aW1lbnRvP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJGaWxhIGRlIE5vdGFzIHBhcmEgUmV2aXNhclwiLFxuICAgIENMT1NFOiBcIkZlY2hhclwiLFxuICAgIE5FVzogXCJOb3ZvXCIsXG4gICAgWUVTVEVSREFZOiBcIk9udGVtXCIsXG4gICAgVE9EQVk6IFwiSG9qZVwiLFxuICAgIFRPTU9SUk9XOiBcIkFtYW5oXHUwMEUzXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJFc3RhdFx1MDBFRHN0aWNhc1wiLFxuICAgIE1PTlRIOiBcIk1cdTAwRUFzXCIsXG4gICAgUVVBUlRFUjogXCJRdWFydG9cIixcbiAgICBZRUFSOiBcIkFub1wiLFxuICAgIExJRkVUSU1FOiBcIlRlbXBvIFRvdGFsXCIsXG4gICAgRk9SRUNBU1Q6IFwiUHJldmlzXHUwMEUzb1wiLFxuICAgIEZPUkVDQVNUX0RFU0M6IFwiTyBuXHUwMEZBbWVybyBkZSBjYXJ0YXMgYSBzZXJlbSBjb2xvY2FkYXMgZW0gZGlhIG5vIGZ1dHVyb1wiLFxuICAgIFNDSEVEVUxFRDogXCJBZ2VuZGFkb1wiLFxuICAgIERBWVM6IFwiRGlhc1wiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJOXHUwMEZBbWVybyBkZSBjYXJ0YXNcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiTVx1MDBFOWRpYTogJHthdmd9IHJldmlzXHUwMEY1ZXMvZGlhXCIsXG4gICAgSU5URVJWQUxTOiBcIkludGVydmFsb3NcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJBdHJhc29zIGF0XHUwMEU5IHF1ZSBhcyByZXZpc1x1MDBGNWVzIHNlamFtIGV4aWJpZGFzIGRlIG5vdm9cIixcbiAgICBDT1VOVDogXCJDb250YWdlbVwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIkludGVydmFsbyBlbSBtXHUwMEU5ZGlhOiAke2F2Z30sIE1haW9yIGludGVydmFsbzogJHtsb25nZXN0fVwiLFxuICAgIEVBU0VTOiBcIkZhY2lsaWRhZGVzXCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJGYWNpbGlkYWRlIGVtIG1cdTAwRTlkaWE6ICR7YXZnRWFzZX1cIixcbiAgICBDQVJEX1RZUEVTOiBcIlRpcG9zIGRlIENhcnRhc1wiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJJc3NvIHRhbWJcdTAwRTltIGluY2x1aSBjYXJ0YXMgZW50ZXJyYWRvcywgY2FzbyBleGlzdGFtXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOb3ZvXCIsXG4gICAgQ0FSRF9UWVBFX1lPVU5HOiBcIkpvdmVtXCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJBbWFkdXJlY2lkb1wiLFxuICAgIENBUkRfVFlQRVNfU1VNTUFSWTogXCJUb3RhbCBkZSBjYXJ0YXM6ICR7dG90YWxDYXJkc0NvdW50fVwiLFxufTtcbiIsICIvLyBSb21cdTAwRTJuXHUwMTAzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzOVxuXG4vLyBAeXRhdGljaG5vIFx1MDQyMVx1MDQzMFx1MDQ0NFx1MDQ0MFx1MDQzRVx1MDQzRFx1MDQzRVx1MDQzMiBcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0Ncbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS95dGF0aWNobm9cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGZsYXNoY2FyZC1tb2RhbC50c3hcbiAgICBERUNLUzogXCJcdTA0MjNcdTA0NDBcdTA0M0VcdTA0MzJcdTA0M0RcdTA0MzhcIixcbiAgICBEVUVfQ0FSRFM6IFwiXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOFwiLFxuICAgIE5FV19DQVJEUzogXCJcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiXHUwNDEyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIEJBQ0s6IFwiQmFja1wiLFxuICAgIFNLSVA6IFwiU2tpcFwiLFxuICAgIEVESVRfQ0FSRDogXCJFZGl0IENhcmRcIixcbiAgICBSRVNFVF9DQVJEX1BST0dSRVNTOiBcIlx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzNcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgSEFSRDogXCJcdTA0MjFcdTA0M0JcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0VcIixcbiAgICBHT09EOiBcIlx1MDQxRFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVwiLFxuICAgIEVBU1k6IFwiXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHUwNDFGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MlwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzhcdTA0MzdcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIlx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0NDMgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgIFJFVklFV19DQVJEUzogXCJcdTA0MUZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgUkVWSUVXX0VBU1lfRklMRV9NRU5VOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNTogXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFXCIsXG4gICAgUkVWSUVXX0dPT0RfRklMRV9NRU5VOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNTogXHUwNDFEXHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNTogXHUwNDIxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFXCIsXG4gICAgUkVWSUVXX05PVEVfRUFTWV9DTUQ6IFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDFCXHUwNDUxXHUwNDMzXHUwNDNBXHUwNDQzXHUwNDRFXCIsXG4gICAgUkVWSUVXX05PVEVfR09PRF9DTUQ6IFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDFEXHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDQzXHUwNDRFXCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDIxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDQzXHUwNDRFXCIsXG4gICAgUkVWSUVXX0FMTF9DQVJEUzogXCJcdTA0MUZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzMFx1MDQ0NVwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzggXHUwNDMyIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzVcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiXHUwNDE3XHUwNDQzXHUwNDMxXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCBcdTA0MzIgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzNVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHUwNDFGXHUwNDNFXHUwNDQxXHUwNDNDXHUwNDNFXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQVx1MDQ0M1wiLFxuICAgIFNUQVRVU19CQVI6XG4gICAgICAgIFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRDOiAke2R1ZU5vdGVzQ291bnR9IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzQSgtXHUwNDNBXHUwNDM4KSwgJHtkdWVGbGFzaGNhcmRzQ291bnR9IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSgtXHUwNDNBXHUwNDM4KSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzhcdTA0NDJcIixcbiAgICBTWU5DX1RJTUVfVEFLRU46IFwiXHUwNDIxXHUwNDM4XHUwNDNEXHUwNDQ1XHUwNDQwXHUwNDNFXHUwNDNEXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzQlx1MDQzMCAke3R9XHUwNDNDXHUwNDQxXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJcdTA0MTdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDMwIFx1MDQzMiBcdTA0MzhcdTA0MzNcdTA0M0RcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0NcdTA0NDNcdTA0NEUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDQzIChcdTA0NDFcdTA0M0MgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4KS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiXHUwNDFGXHUwNDNFXHUwNDM2XHUwNDMwXHUwNDNCXHUwNDQzXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMwIFx1MDQzRlx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQ0Q1x1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzRFx1MDQzMFx1MDQzNFx1MDQzRSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIChcdTA0NDFcdTA0M0MgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4KS5cIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJcdTA0MUVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNELlwiLFxuICAgIE5PX0RFQ0tfRVhJU1RTOiBcIlx1MDQxRFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDNEXHUwNDRGICR7ZGVja05hbWV9XCIsXG4gICAgQUxMX0NBVUdIVF9VUDogXCJcdTA0MTVcdTA0NDFcdTA0NDJcdTA0NEMhIFx1MDQyMlx1MDQ0QiBcdTA0NDFcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0NDFcdTA0NEYhIDpELlwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzlcIixcbiAgICBNT05USFNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NEZcdTA0NDZcdTA0M0VcdTA0MzJcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1MDQzM1x1MDQzRVx1MDQzNFx1MDQzMChcdTA0M0JcdTA0MzVcdTA0NDIpXCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1MDQzNFwiLFxuICAgIE1PTlRIU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1MDQzQ1wiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHUwNDMzXCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBcdTA0MUZcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzhcdTA0M0QgLSBcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzhcIixcbiAgICBDSEVDS19XSUtJOiAnXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzNFx1MDQzRVx1MDQzRiBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0NEIsIFx1MDQ0MVx1MDQzQ1x1MDQzRVx1MDQ0Mlx1MDQ0MFx1MDQzOCA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPi4gXHUwNDIxXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDNFIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzJcdTA0M0VcdTA0MzQgOjMnLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIlx1MDQxOFx1MDQzM1x1MDQzRFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQ1x1MDQ0Qlx1MDQzNSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzhcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOiBcIlx1MDQxMlx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0MzggXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNFXHUwNDNBIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBlbnRlcidcdTA0M0VcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBUZW1wbGF0ZXMgTWV0YS9TY3JpcHRzXCIsXG4gICAgRkxBU0hDQVJEUzogXCJcdTA0MUFcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzhcIixcbiAgICBGTEFTSENBUkRfRUFTWV9MQUJFTDogXCJFYXN5IEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfTEFCRUw6IFwiR29vZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIkhhcmQgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfRUFTWV9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiRWFzeVwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkdvb2RcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJIYXJkXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfVEFHUzogXCJcdTA0MjJcdTA0NERcdTA0MzNcdTA0MzggXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDM1XHUwNDNBXCIsXG4gICAgRkxBU0hDQVJEX1RBR1NfREVTQzpcbiAgICAgICAgXCJcdTA0MTJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDREXHUwNDMzXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBlbnRlcidcdTA0M0VcdTA0M0MgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6ICNmbGFzaGNhcmRzICNkZWNrMiAjZGVjazMuXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTOiBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDMyIFx1MDQ0M1x1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzRFx1MDQzOCBcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQzXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDNEXHUwNDM4P1wiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLU19ERVNDOiBcIlx1MDQyRFx1MDQ0Mlx1MDQzRSBcdTA0MzBcdTA0M0JcdTA0NENcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0MzAgXHUwNDQyXHUwNDREXHUwNDMzXHUwNDMwXHUwNDNDIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSwgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NVx1MDQ0My5cIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzogXCJcdTA0MjFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NEZcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDM5IFx1MDQzRlx1MDQzQlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0E/XCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0MzBcdTA0M0EsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBIVE1MIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOCBcdTA0M0RcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzQlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJcdTA0MUZcdTA0NDBcdTA0NEZcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQwXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0UgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0LiBcdTA0MzRcdTA0M0RcdTA0NEY/XCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiXHUwNDIwXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCAtIFx1MDQ0Mlx1MDQzNSwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDM1IFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQ0QiBcdTA0MzhcdTA0MzcgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMCwgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzggXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOChbLi4uXSlcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJcdTA0MUZcdTA0M0VcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyKFx1MDQ0M1x1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQzRFx1MDQ0QykgXHUwNDMyIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzMFx1MDQ0NShcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rik/XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFRpdGxlID4gSGVhZGluZyAxID4gU3ViaGVhZGluZyA+IC4uLiA+IFN1YmhlYWRpbmdcIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIlx1MDQxMlx1MDQ0Qlx1MDQ0MVx1MDQzRVx1MDQ0Mlx1MDQzMCBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzggXHUwNDMyXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHUwNDQ1XCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzpcbiAgICAgICAgXCJcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDM1XHUwNDQxXHUwNDRDIFx1MDQzQ1x1MDQzRVx1MDQzMVx1MDQzOFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzQyBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcdTA0NDRcdTA0M0VcdTA0M0RcdTA0M0VcdTA0M0MsIFx1MDQzMlx1MDQ0Qlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQ0Q1x1MDQ0Mlx1MDQzNSAxMDAlIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0NDMgXHUwNDMyXHUwNDMwXHUwNDQxIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M0VcdTA0MzNcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgUkVTRVRfREVGQVVMVDogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzQ1x1MDQzRVx1MDQzQlx1MDQ0N1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RVwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJcdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzAgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4IFx1MDQzMiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDZcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcdTA0NDVcIixcbiAgICBSQU5ET01JWkVfQ0FSRF9PUkRFUjogXCJcdTA0MjFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzlcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDM0XHUwNDNFXHUwNDNBIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rj9cIixcbiAgICBESVNBQkxFX0NMT1pFX0NBUkRTOiBcIlx1MDQxMlx1MDQ0Qlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0NEIgXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOChcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFsuLi5dKT9cIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyA9PVx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDI9PSBcdTA0MzIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDM4KFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MDogWy4uLl0pP1wiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgKipcdTA0MzZcdTA0MzhcdTA0NDBcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyKiogXHUwNDMyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzOChcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFsuLi5dKT9cIixcbiAgICBDT05WRVJUX0NVUkxZX0JSQUNLRVRTX1RPX0NMT1pFUzpcbiAgICAgICAgXCJcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMge3tcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDMxXHUwNDNBXHUwNDM4fX0gXHUwNDMyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzOChcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFsuLi5dKT9cIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiXHUwNDEyXHUwNDNEXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1ISBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzJcdTA0MzBcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDM0XHUwNDUxXHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzMlx1MDQ0MFx1MDQ0M1x1MDQ0N1x1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzhcIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0FcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIE5PVEVTOiBcIlx1MDQxN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOFwiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiRW5hYmxlIG5vdGUgcmV2aWV3IHBhbmUgb24gc3RhcnR1cFwiLFxuICAgIFRBR1NfVE9fUkVWSUVXOiBcIlx1MDQyMlx1MDQ0RFx1MDQzM1x1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzpcbiAgICAgICAgXCJcdTA0MTJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDREXHUwNDMzXHUwNDM4LCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzOFx1MDQzQlx1MDQzOCBlbnRlcmBcdTA0MzBcdTA0M0NcdTA0MzgsIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MDogI3JldmlldyAjdGFnMiAjdGFnMy5cIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFOiBcIlx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzlcdTA0M0RcdTA0NDNcdTA0NEUgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNBXHUwNDQzIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFX0RFU0M6IFwiXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQ0Qlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QywgXHUwNDQyXHUwNDNFIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQzRSBcdTA0MzJcdTA0MzBcdTA0MzZcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzggKFBhZ2VSYW5rKS5cIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJcdTA0MUVcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDQzXHUwNDRFIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TOlxuICAgICAgICBcIlx1MDQxMlx1MDQ0Qlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDAgXHUwNDQxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRFIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCwgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBcdTA0MUZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzU6IFx1MDQxQlx1MDQzNVx1MDQzM1x1MDQzQVx1MDQzRSBcdTA0MURcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDIxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNfREVTQzpcbiAgICAgICAgXCJcdTA0MUZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMlx1MDQ0QiBcdTA0NDFcdTA0M0NcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0M0NcdTA0M0VcdTA0NDlcdTA0MzggXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDNBXHUwNDM1XHUwNDM1XHUwNDMyLiBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0MzUgT2JzaWRpYW4gXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NERcdTA0NDJcdTA0M0VcdTA0MzNcdTA0M0UuXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHUwNDFEXHUwNDMwXHUwNDM4XHUwNDMxXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDQ4XHUwNDM1XHUwNDM1IFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzkgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMFwiLFxuICAgIE1JTl9PTkVfREFZOiBcIlx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzkgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSAxLlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1MDQxRlx1MDQzRVx1MDQzNlx1MDQzMFx1MDQzQlx1MDQ0M1x1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMCBcdTA0MzJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDRGXHUwNDQ5XHUwNDM1XHUwNDM1IFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzQlx1MDQzRS5cIixcbiAgICBVSV9QUkVGRVJFTkNFUzogXCJcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDM4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOFwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTpcbiAgICAgICAgXCJcdTA0MTRcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzJcdTA0NENcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM0IFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzRFx1MDQ0QiBcdTA0MzhcdTA0MzdcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDQyXHUwNDRDXHUwNDQxXHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NEJcdTA0MzVcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJcdTA0MUVcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDQyIFx1MDQzRlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQ0MCwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM0XHUwNDRCIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0MzRcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM1LiBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0MzVcdTA0MzdcdTA0M0RcdTA0M0UsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDMgXHUwNDMyXHUwNDMwXHUwNDQxIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0NEIsIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQ0Qlx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzBcdTA0MzRcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzBcdTA0NDIgXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDM4XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNFx1MDQzMFx1MDQzQyBcdTA0MzIgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzNS5cIixcbiAgICBBTEdPUklUSE06IFwiXHUwNDEwXHUwNDNCXHUwNDMzXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDNDXCIsXG4gICAgQ0hFQ0tfQUxHT1JJVEhNX1dJS0k6XG4gICAgICAgICdcdTA0MTdcdTA0MzAgXHUwNDM0XHUwNDNFXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzNVx1MDQzOSBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzVcdTA0NDFcdTA0NEMgXHUwNDNBIDxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPlx1MDQ0MFx1MDQzNVx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0MzBcdTA0M0JcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0M0NcdTA0MzA8L2E+KFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzRSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM0KS4nLFxuICAgIEJBU0VfRUFTRTogXCJcdTA0MTFcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDFCXHUwNDUxXHUwNDMzXHUwNDNBXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDXCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDM4XHUwNDNDXHUwNDQzXHUwNDNDID0gMTMwLCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0M0VcdTA0NDdcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDNFIDI1MC5cIixcbiAgICBCQVNFX0VBU0VfTUlOX1dBUk5JTkc6IFwiXHUwNDFCXHUwNDUxXHUwNDMzXHUwNDNBXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzRFx1MDQzMCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDM4XHUwNDNDXHUwNDQzXHUwNDNDIDEzMC5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6XG4gICAgICAgIFwiXHUwNDE4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzQVx1MDQzMCBcdTA0M0FcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzAgXHUwNDMyXHUwNDRCIFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQzNSBcdTA0MjFcdTA0M0JcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDMyXHUwNDNFIFx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzQ1x1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4L1x1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIlx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOVx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzRVx1MDQzQSA9IFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0Qlx1MDQzOVx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzRVx1MDQzQSAqIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzQVx1MDQzMCAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIlx1MDQxQlx1MDQzNVx1MDQzM1x1MDQzQVx1MDQzRTogXHUwNDMxXHUwNDNFXHUwNDNEXHUwNDQzXHUwNDQxXCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIlx1MDQxMVx1MDQzRVx1MDQzRFx1MDQ0M1x1MDQ0MSBcdTA0MzdcdTA0MzAgXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzBcdTA0M0MgXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0MyBcdTA0MzIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDQzXHUwNDQyXHUwNDNBXHUwNDMwXHUwNDQ1IFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDI1XHUwNDNFXHUwNDQwXHUwNDNFXHUwNDQ4XHUwNDNFIFx1MDQzOCBcdTA0MUJcdTA0MzVcdTA0MzNcdTA0M0FcdTA0M0UgXHUwNDNEXHUwNDMwIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzNS9cdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzUgKFx1MDQzQ1x1MDQzOFx1MDQzRC4gPSAxMDAlKS5cIixcbiAgICBFQVNZX0JPTlVTX01JTl9XQVJOSU5HOiBcIlx1MDQxMVx1MDQzRVx1MDQzRFx1MDQ0M1x1MDQ0MSBcdTA0MzdcdTA0MzAgXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSAxMDAuXCIsXG4gICAgTUFYX0lOVEVSVkFMOiBcIlx1MDQxQ1x1MDQzMFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0EoXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDM0XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOClcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzpcbiAgICAgICAgXCJcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDMwXHUwNDNDIFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0M0RcdTA0NEVcdTA0NEUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0EgKFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUgPSAxMDAgeWVhcnMpLlwiLFxuICAgIE1BWF9JTlRFUlZBTF9NSU5fV0FSTklORzogXCJcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDQzXHUwNDQyXHUwNDNFXHUwNDNBIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSAxLlwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUI6IFwiXHUwNDFDXHUwNDMwXHUwNDNBXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzMlx1MDQzQVx1MDQzQlx1MDQzMFx1MDQzNCBcdTA0NDFcdTA0MzJcdTA0NEZcdTA0MzdcdTA0MzgoXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4KVwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzpcbiAgICAgICAgXCJcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDMyXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDM0IFx1MDQzMlx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0MUJcdTA0NTFcdTA0MzNcdTA0M0FcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDRGXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzQSBcdTA0MzIgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQxQlx1MDQ1MVx1MDQzM1x1MDQzQVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0Qy5cIixcbiAgICBMT0dHSU5HOiBcIlx1MDQxMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0JcdTA0M0VcdTA0MzNcdTA0MzBcIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiXHUwNDFFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0VcdTA0NDJcdTA0M0JcdTA0MzBcdTA0MzRcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0QyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0FcdTA0MzAoZGV2ZWxvcGVyIGNvbnNvbGUpP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdTA0MUVcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NEMgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDNBIFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcIixcbiAgICBDTE9TRTogXCJcdTA0MTdcdTA0MzBcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NENcIixcbiAgICBORVc6IFwiXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM1XCIsXG4gICAgWUVTVEVSREFZOiBcIlx1MDQxMlx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQzNVwiLFxuICAgIFRPREFZOiBcIlx1MDQyMVx1MDQzNVx1MDQzM1x1MDQzRVx1MDQzNFx1MDQzRFx1MDQ0Rlx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQzNVwiLFxuICAgIFRPTU9SUk9XOiBcIlx1MDQxN1x1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQzNVwiLFxuXG4gICAgLy8gc3RhdHMtbW9kYWwudHN4XG4gICAgU1RBVFNfVElUTEU6IFwiXHUwNDIxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNBXHUwNDMwXCIsXG4gICAgTU9OVEg6IFwiXHUwNDFDXHUwNDM1XHUwNDQxXHUwNDRGXHUwNDQ2XCIsXG4gICAgUVVBUlRFUjogXCJcdTA0MjdcdTA0MzVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NENcIixcbiAgICBZRUFSOiBcIlx1MDQxM1x1MDQzRVx1MDQzNFwiLFxuICAgIExJRkVUSU1FOiBcIlx1MDQxMlx1MDQ0MVx1MDQ1MSBcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M0NcdTA0NEZcIixcbiAgICBGT1JFQ0FTVDogXCJcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzNcdTA0M0RcdTA0M0VcdTA0MzdcIixcbiAgICBGT1JFQ0FTVF9ERVNDOiBcIlx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0EgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQzMiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDlcdTA0MzVcdTA0M0NcIixcbiAgICBTQ0hFRFVMRUQ6IFwiXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDNCXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNFXCIsXG4gICAgREFZUzogXCJcdTA0MTRcdTA0M0RcdTA0MzVcdTA0MzlcIixcbiAgICBOVU1CRVJfT0ZfQ0FSRFM6IFwiXHUwNDFBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIFJFVklFV1NfUEVSX0RBWTogXCJcdTA0MjFcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFOiAke2F2Z30gXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5L1x1MDQzNFx1MDQzNVx1MDQzRFx1MDQ0Q1wiLCAvLyEhIVxuICAgIElOVEVSVkFMUzogXCJcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzBcdTA0M0JcdTA0NEJcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0FcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4IFx1MDQzNFx1MDQzRSBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NEVcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgIENPVU5UOiBcIlx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRVwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIlx1MDQyMVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRFx1MDQzOFx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0E6ICR7YXZnfSwgXHUwNDIxXHUwNDMwXHUwNDNDXHUwNDRCXHUwNDM5IFx1MDQzNFx1MDQzQlx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0E6ICR7bG9uZ2VzdH1cIixcbiAgICBFQVNFUzogXCJcdTA0MUJcdTA0NTFcdTA0MzNcdTA0M0FcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NEMoXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDQwIFx1MDQzMiBcdTA0MzBcdTA0M0JcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0M0NcdTA0MzUsIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQ0Qlx1MDQzOSBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MiBcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMCBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0EpIFxcbiAoXHUwNDNFXHUwNDQyIFx1MDQzMFx1MDQzRFx1MDQzM1x1MDQzQi4gZWFzZSwgXHUwNDQxXHUwNDNDIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0MzBcdTA0M0JcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0M0NcdTA0MzApXCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJcdTA0MjFcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFIFx1MDQxQlx1MDQ1MVx1MDQzM1x1MDQzQVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzODogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHUwNDIyXHUwNDM4XHUwNDNGXHUwNDRCIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDMyXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQ0Rlx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzgsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDdcdTA0NDJcdTA0M0U6XCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDVcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiXHUwNDFDXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM0XHUwNDRCXHUwNDQ1XCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJcdTA0MTJcdTA0MzdcdTA0NDBcdTA0M0VcdTA0NDFcdTA0M0JcdTA0NEJcdTA0NDVcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiXHUwNDEyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQTogJHt0b3RhbENhcmRzQ291bnR9XCIsXG59O1xuIiwgIi8vIFRhbWlsXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFRlbHVndVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBUaGFpXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFRcdTAwRkNya1x1MDBFN2VcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gVWtyYWluaWFuXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFVyZHVcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gVmlldG5hbWVzZVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODdcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGZsYXNoY2FyZC1tb2RhbC50c3hcbiAgICBERUNLUzogXCJcdTUzNjFcdTdFQzRcIixcbiAgICBEVUVfQ0FSRFM6IFwiXHU1MjMwXHU2NzFGXHU1MzYxXHU3MjQ3XCIsXG4gICAgTkVXX0NBUkRTOiBcIlx1NjVCMFx1NTM2MVx1NzI0N1wiLFxuICAgIFRPVEFMX0NBUkRTOiBcIlx1NTE2OFx1OTBFOFx1NTM2MVx1NzI0N1wiLFxuICAgIEJBQ0s6IFwiQmFja1wiLFxuICAgIFNLSVA6IFwiU2tpcFwiLFxuICAgIEVESVRfQ0FSRDogXCJFZGl0IENhcmRcIixcbiAgICBSRVNFVF9DQVJEX1BST0dSRVNTOiBcIlx1OTFDRFx1N0Y2RVx1NTM2MVx1NzI0N1wiLFxuICAgIEhBUkQ6IFwiXHU4RjgzXHU5NkJFXCIsXG4gICAgR09PRDogXCJcdThCQjBcdTVGOTdcIixcbiAgICBFQVNZOiBcIlx1N0I4MFx1NTM1NVwiLFxuICAgIFNIT1dfQU5TV0VSOiBcIlx1NjYzRVx1NzkzQVx1N0I1NFx1Njg0OFwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiXHU1MzYxXHU3MjQ3XHU1REYyXHU4OEFCXHU5MUNEXHU3RjZFXHUzMDAyXCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIlx1NjI1M1x1NUYwMFx1NEUwMFx1NEUyQVx1N0IxNFx1OEJCMFx1NUYwMFx1NTlDQlx1NTkwRFx1NEU2MFwiLFxuICAgIFJFVklFV19DQVJEUzogXCJcdTU5MERcdTRFNjBcdTUzNjFcdTcyNDdcIixcbiAgICBSRVZJRVdfRUFTWV9GSUxFX01FTlU6IFwiXHU1OTBEXHU0RTYwXHVGRjFBXHU3QjgwXHU1MzU1XCIsXG4gICAgUkVWSUVXX0dPT0RfRklMRV9NRU5VOiBcIlx1NTkwRFx1NEU2MFx1RkYxQVx1OEJCMFx1NUY5N1wiLFxuICAgIFJFVklFV19IQVJEX0ZJTEVfTUVOVTogXCJcdTU5MERcdTRFNjBcdUZGMUFcdThGODNcdTk2QkVcIixcbiAgICBSRVZJRVdfTk9URV9FQVNZX0NNRDogXCJcdTY4MDdcdThCQjBcdTRFM0FcdTIwMUNcdTdCODBcdTUzNTVcdTIwMURcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJcdTY4MDdcdThCQjBcdTRFM0FcdTIwMUNcdThCQjBcdTVGOTdcdTIwMURcIixcbiAgICBSRVZJRVdfTk9URV9IQVJEX0NNRDogXCJcdTY4MDdcdThCQjBcdTRFM0FcdTIwMUNcdThGODNcdTk2QkVcdTIwMURcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlx1NTkwRFx1NEU2MFx1NjI0MFx1NjcwOVx1N0IxNFx1OEJCMFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1NTkwRFx1NEU2MFx1NkI2NFx1N0IxNFx1OEJCMFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJcdTk2QzZcdTRFMkRcdTU5MERcdTRFNjBcdTZCNjRcdTdCMTRcdThCQjBcdTRFMkRcdTc2ODRcdTUzNjFcdTcyNDdcIixcbiAgICBWSUVXX1NUQVRTOiBcIlx1NjdFNVx1NzcwQlx1NjU3MFx1NjM2RVwiLFxuICAgIFNUQVRVU19CQVI6IFwiXHU1OTBEXHU0RTYwOiAke2R1ZU5vdGVzQ291bnR9IFx1N0IxNFx1OEJCMCwgJHtkdWVGbGFzaGNhcmRzQ291bnR9IFx1NTM2MVx1NzI0N1x1NURGMlx1NTIzMFx1NjcxRlwiLFxuICAgIFNZTkNfVElNRV9UQUtFTjogXCJcdTU0MENcdTZCNjVcdTY1RjZcdTk1RjQgJHt0fW1zXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJcdTdCMTRcdThCQjBcdTRGRERcdTVCNThcdTU3MjhcdTVERjJcdTg4QUJcdTVGRkRcdTc1NjVcdTc2ODRcdThERUZcdTVGODRcdTRFMkRcdUZGMDhcdTY4QzBcdTY3RTVcdThCQkVcdTdGNkVcdTkwMDlcdTk4NzlcdUZGMDlcdTMwMDJcIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiXHU4QkY3XHU1QzA2XHU5NzAwXHU4OTgxXHU1OTBEXHU0RTYwXHU3Njg0XHU3QjE0XHU4QkIwXHU0RTJEXHU1MkEwXHU1MTY1XHU2QjYzXHU3ODZFXHU3Njg0XHU2ODA3XHU3QjdFXHVGRjA4XHU2OEMwXHU2N0U1XHU4QkJFXHU3RjZFXHU5MDA5XHU5ODc5XHVGRjA5XHUzMDAyXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiXHU1M0NEXHU5OTg4XHU1REYyXHU2NTM2XHU1MjMwXCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiXHU2Q0ExXHU2NzA5ICR7ZGVja05hbWV9IFx1NTM2MVx1N0VDNFwiLFxuICAgIEFMTF9DQVVHSFRfVVA6IFwiXHU5MEZEXHU1OTBEXHU0RTYwXHU1QjhDXHU1NTY2XHVGRjBDXHU0RjYwXHU3NzFGXHU2OEQyXHVGRjAxXCIsXG5cbiAgICAvLyBzY2hlZHVsaW5nLnRzXG4gICAgREFZU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1NTkyOVwiLFxuICAgIE1PTlRIU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1NjcwOFwiLFxuICAgIFlFQVJTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gXHU1RTc0XCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1NTkyOVwiLFxuICAgIE1PTlRIU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1NjcwOFwiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHU1RTc0XCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJcdTk1RjRcdTk2OTRcdTkxQ0RcdTU5MERcdTYzRDJcdTRFRjYgLSBcdThCQkVcdTdGNkVcIixcbiAgICBDSEVDS19XSUtJOiAnXHU0RTg2XHU4OUUzXHU2NkY0XHU1OTFBLCBcdThCRjdcdTcwQjlcdTUxRkIgPGEgaHJlZj1cIiR7d2lraV91cmx9XCI+d2lraTwvYT4uJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdTVGRkRcdTc1NjVcdTZCNjRcdTY1ODdcdTRFRjZcdTU5MzlcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOiBcIlx1OEY5M1x1NTE2NVx1NjU4N1x1NEVGNlx1NTkzOVx1OERFRlx1NUY4NFx1RkYwQ1x1NzUyOFx1NjVCMFx1NUVGQVx1ODg0Q1x1NTIwNlx1OTY5NFx1RkYwQ1x1NEY4Qlx1NTk4Mlx1RkYxQVRlbXBsYXRlcyBNZXRhL1NjcmlwdHNcIixcbiAgICBGTEFTSENBUkRTOiBcIlx1NTM2MVx1NzI0N1wiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIlx1MjAxQ1x1N0I4MFx1NTM1NVx1MjAxRFx1NjMwOVx1OTRBRVx1NjU4N1x1NjcyQ1wiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIlx1MjAxQ1x1OEJCMFx1NUY5N1x1MjAxRFx1NjMwOVx1OTRBRVx1NjU4N1x1NjcyQ1wiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIlx1MjAxQ1x1OEY4M1x1OTZCRVx1MjAxRFx1NjMwOVx1OTRBRVx1NjU4N1x1NjcyQ1wiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHUyMDFDXHU3QjgwXHU1MzU1XHUyMDFEXHU2MzA5XHU5NEFFXHU3Njg0XHU2ODA3XHU3QjdFXCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTIwMUNcdThCQjBcdTVGOTdcdTIwMURcdTYzMDlcdTk0QUVcdTc2ODRcdTY4MDdcdTdCN0VcIixcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiBcIlx1ODFFQVx1NUI5QVx1NEU0OVx1MjAxQ1x1OEY4M1x1OTZCRVx1MjAxRFx1NjMwOVx1OTRBRVx1NzY4NFx1NjgwN1x1N0I3RVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIlx1NTM2MVx1NzI0N1x1NjgwN1x1N0I3RVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6IFwiXHU4RjkzXHU1MTY1XHU2ODA3XHU3QjdFXHVGRjBDXHU3NTI4XHU3QTdBXHU2ODNDXHU2MjE2XHU2NUIwXHU1RUZBXHU4ODRDXHU1MjA2XHU5Njk0XHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBI2ZsYXNoY2FyZHMgI2RlY2syICNkZWNrMy5cIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1M6IFwiXHU2NjJGXHU1NDI2XHU1QzA2XHU2NTg3XHU0RUY2XHU1OTM5XHU1MTg1XHU1QkI5XHU4RjZDXHU2MzYyXHU0RTNBXHU1MzYxXHU3MjQ3XHU3RUM0XHU1NDhDXHU1QjUwXHU1MzYxXHU3MjQ3XHU3RUM0XHVGRjFGXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiXHU2QjY0XHU5MDA5XHU5ODc5XHU0RTNBXHU1MzYxXHU3MjQ3XHU2ODA3XHU3QjdFXHU5MDA5XHU5ODc5XHU3Njg0XHU2NkZGXHU0RUUzXHU5MDA5XHU5ODc5XHUzMDAyXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6IFwiXHU2NjJGXHU1NDI2XHU1QzA2XHU4QkExXHU1MjEyXHU5MUNEXHU1OTBEXHU2NUY2XHU5NUY0XHU0RkREXHU1QjU4XHU1NzI4XHU1MzYxXHU3MjQ3XHU2NzAwXHU1NDBFXHU0RTAwXHU4ODRDXHU3Njg0XHU1NDBDXHU0RTAwXHU4ODRDXHVGRjFGXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzogXCJIVE1MXHU2Q0U4XHU5MUNBXHU0RTBEXHU1MThEXHU3ODM0XHU1NzRGXHU1MjE3XHU4ODY4XHU2ODNDXHU1RjBGXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZOiBcIlx1NUMwNlx1NTE3M1x1ODA1NFx1NTM2MVx1NzI0N1x1OTY5MFx1ODVDRlx1ODFGM1x1NEUwQlx1NEUwMFx1NTkyOVx1RkYxRlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOiBcIlx1NTE3M1x1ODA1NFx1NTM2MVx1NzI0N1x1NjYyRlx1Njc2NVx1ODFFQVx1NTQwQ1x1NEUwMFx1NTM2MVx1NzI0N1x1NzY4NFx1NEUwRFx1NTQwQ1x1NUY2Mlx1NUYwRlx1RkYwQyBcdTRGOEJcdTU5ODJcdUZGMUFcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdTUzNjFcdTcyNDdcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJcdTU3MjhcdTUzNjFcdTcyNDdcdTRFMkRcdTY2M0VcdTc5M0FcdTRFMEFcdTRFMEJcdTY1ODdcdUZGMUZcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVF9ERVNDOiBcIlx1NEY4Qlx1NTk4Mlx1RkYxQVx1NjgwN1x1OTg5OCA+IFx1NTI2Rlx1NjgwN1x1OTg5OCA+IFx1NUMwRlx1NjgwN1x1OTg5OCA+IC4uLiA+IFx1NUMwRlx1NjgwN1x1OTg5OFwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiXHU1MzYxXHU3MjQ3XHU5QUQ4XHU1RUE2XHU3NjdFXHU1MjA2XHU2QkQ0XCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzogXCJcdThCRjdcdTU3MjhcdTc5RkJcdTUyQThcdTdBRUZcdTRGN0ZcdTc1MjhcdTVFNzZcdTk3MDBcdTg5ODFcdTZENEZcdTg5QzhcdThGODNcdTU5MjdcdTU2RkVcdTcyNDdcdTY1RjZcdThCQkVcdTRFM0ExMDAlXCIsXG4gICAgUkVTRVRfREVGQVVMVDogXCJcdTkxQ0RcdTdGNkVcdTRFM0FcdTlFRDhcdThCQTRcIixcbiAgICBDQVJEX01PREFMX1dJRFRIX1BFUkNFTlQ6IFwiXHU1MzYxXHU3MjQ3XHU1QkJEXHU1RUE2XHU3NjdFXHU1MjA2XHU2QkQ0XCIsXG4gICAgUkFORE9NSVpFX0NBUkRfT1JERVI6IFwiXHU1OTBEXHU0RTYwXHU2NUY2XHU5NjhGXHU2NzNBXHU2NjNFXHU3OTNBXHU1MzYxXHU3MjQ3XHVGRjFGXCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJcdTRFMERcdThGREJcdTg4NENcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdUZGMUZcIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIlx1NUMwNiA9PVx1OUFEOFx1NEVBRT09IFx1OEY2Q1x1NjM2Mlx1NEUzQVx1NUI4Q1x1NUY2Mlx1NTg2Qlx1N0E3QVx1RkYxRlwiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJcdTVDMDYgKipcdTdDOTdcdTRGNTMqKiBcdThGNkNcdTYzNjJcdTRFM0FcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdUZGMUZcIixcbiAgICBDT05WRVJUX0NVUkxZX0JSQUNLRVRTX1RPX0NMT1pFUzogXCJcdTVDMDYge3tcdTU5MjdcdTYyRUNcdTUzRjd9fSBcdThGNkNcdTYzNjJcdTRFM0FcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdUZGMUZcIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1NTM1NVx1ODg0Q1x1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1N0IyNlwiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6IFwiXHU2Q0U4XHU2MTBGXHVGRjFBXHU2NkY0XHU2NTM5XHU2QjY0XHU5MDA5XHU5ODc5XHU1NDBFXHU0RjYwXHU1QzA2XHU5NzAwXHU4OTgxXHU4MUVBXHU4ODRDXHU2NkY0XHU2NTM5XHU1REYyXHU1QjU4XHU1NzI4XHU1MzYxXHU3MjQ3XHU3Njg0XHU1MjA2XHU5Njk0XHU3QjI2XHUzMDAyXCIsXG4gICAgSU5MSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUjogXCJcdTUzNTVcdTg4NENcdTdGRkJcdThGNkNcdTUzNjFcdTcyNDdcdTc2ODRcdTUyMDZcdTk2OTRcdTdCMjZcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1NTkxQVx1ODg0Q1x1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1N0IyNlwiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHU1OTFBXHU4ODRDXHU3RkZCXHU4RjZDXHU1MzYxXHU3MjQ3XHU3Njg0XHU1MjA2XHU5Njk0XHU3QjI2XCIsXG4gICAgTk9URVM6IFwiXHU3QjE0XHU4QkIwXCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHU1OTBEXHU0RTYwXHU2ODA3XHU3QjdFXCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzogXCJcdThGOTNcdTUxNjVcdTY4MDdcdTdCN0VcdUZGMENcdTc1MjhcdTdBN0FcdTY4M0NcdTYyMTZcdTY1QjBcdTVFRkFcdTg4NENcdTUyMDZcdTk2OTRcdUZGMENcdTRGOEJcdTU5ODJcdUZGMUEjcmV2aWV3ICN0YWcyICN0YWczLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiXHU1OTBEXHU0RTYwXHU5NjhGXHU2NzNBXHU3QjE0XHU4QkIwXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOiBcIlx1NTE3M1x1OTVFRFx1NkI2NFx1OTAwOVx1OTg3OVx1RkYwQ1x1N0IxNFx1OEJCMFx1NUMwNlx1NEVFNVx1OTFDRFx1ODk4MVx1NUVBNihQYWdlUmFuaylcdTYzOTJcdTVFOEZcdTMwMDJcIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJcdTU5MERcdTRFNjBcdTU0MEVcdTgxRUFcdTUyQThcdTYyNTNcdTVGMDBcdTRFMEJcdTRFMDBcdTRFMkFcdTdCMTRcdThCQjBcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OUzogXCJcdTUxNzNcdTk1RURcdTY1ODdcdTRFRjZcdTkwMDlcdTUzNTVcdTRFMkRcdTc2ODRcdTU5MERcdTRFNjBcdTkwMDlcdTk4NzkgXHU0RjhCXHU1OTgyXHVGRjFBXHU1OTBEXHU0RTYwXHVGRjFBXHU3QjgwXHU1MzU1IFx1OEJCMFx1NUY5NyBcdThGODNcdTk2QkVcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIlx1NTE3M1x1OTVFRFx1NkI2NFx1OTAwOVx1OTg3OVx1NTQwRVx1NEY2MFx1NTNFRlx1NEVFNVx1NEY3Rlx1NzUyOFx1NUZFQlx1NjM3N1x1OTUyRVx1NUYwMFx1NTlDQlx1NTkwRFx1NEU2MFx1MzAwMlx1OTFDRFx1NjVCMFx1NTQyRlx1NTJBOE9ic2lkaWFuXHU0RjdGXHU2NzJDXHU5MDA5XHU5ODc5XHU3NTFGXHU2NTQ4XHUzMDAyXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHU1M0YzXHU4RkI5XHU2ODBGXHU0RTJEXHU2NjNFXHU3OTNBXHU3Njg0XHU2NzAwXHU1OTI3XHU1OTI5XHU2NTcwXCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHU1OTI5XHU2NTcwXHU2NzAwXHU1QzBGXHU1MDNDXHU0RTNBMVwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1OEJGN1x1OEY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NjU3MFx1NUI1N1x1MzAwMlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlx1NzUyOFx1NjIzN1x1NzU0Q1x1OTc2Mlx1OTk5Nlx1OTAwOVx1OTg3OVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTogXCJcdTc1MzJcdTY3N0ZcdTY4MTFcdTY3MDBcdTUyMURcdTVFOTRcdTY2M0VcdTc5M0FcdTRFM0FcdTVDNTVcdTVGMDBcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJcdTUxNzNcdTk1RURcdTZCNjRcdTkwMDlcdTk4NzlcdTUzRUZcdTYyOThcdTUzRTBcdTU0MENcdTRFMDBcdTVGMjBcdTUzNjFcdTcyNDdcdTRFMkRcdTc2ODRcdTVENENcdTU5NTdcdTcyNENcdTdFQzRcdTMwMDJcdTU5ODJcdTY3OUNcdTYwQThcdTc2ODRcdTUzNjFcdTcyNDdcdTVDNUVcdTRFOEVcdTU0MENcdTRFMDBcdTY1ODdcdTRFRjZcdTRFMkRcdTc2ODRcdThCQjhcdTU5MUFcdTU5NTdcdTcyNENcdUZGMENcdTUyMTlcdTVGODhcdTY3MDlcdTc1MjhcdTMwMDJcIixcbiAgICBBTEdPUklUSE06IFwiXHU3Qjk3XHU2Q0Q1XCIsXG4gICAgQ0hFQ0tfQUxHT1JJVEhNX1dJS0k6ICdcdTRFODZcdTg5RTNcdTY2RjRcdTU5MUEsIFx1OEJGN1x1NzBCOVx1NTFGQiA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5hbGdvcml0aG0gaW1wbGVtZW50YXRpb248L2E+LicsXG4gICAgQkFTRV9FQVNFOiBcIlx1NTdGQVx1Nzg0MFx1NjM4Q1x1NjNFMVx1N0EwQlx1NUVBNlwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIlx1NjcwMFx1NUMwRlx1NTAzQzEzMFx1RkYwQ1x1NjNBOFx1ODM1MFx1NTAzQ1x1N0VBNjI1MC5cIixcbiAgICBCQVNFX0VBU0VfTUlOX1dBUk5JTkc6IFwiXHU1N0ZBXHU3ODQwXHU2MzhDXHU2M0UxXHU3QTBCXHU1RUE2XHU3Njg0XHU2NzAwXHU1QzBGXHU1MDNDXHU0RTNBMTMwXHUzMDAyXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFOiBcIlx1NUMwNlx1NTkwRFx1NEU2MFx1NjVGNlx1NjgwN1x1NkNFOFx1NEUzQVx1MjAxQ1x1OEY4M1x1OTZCRVx1MjAxRFx1NzY4NFx1NTM2MVx1NzI0N1x1NjIxNlx1N0IxNFx1OEJCMFx1NTkwRFx1NEU2MFx1OTVGNFx1OTY5NFx1N0YyOVx1NzdFRFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIlx1NjVCMFx1NTkwRFx1NEU2MFx1OTVGNFx1OTY5NCA9IFx1NTM5Rlx1NTkwRFx1NEU2MFx1OTVGNFx1OTY5NCAqIFx1OTVGNFx1OTY5NFx1NjUzOVx1NTNEOFx1N0NGQlx1NjU3MCAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIlx1N0I4MFx1NTM1NVx1NTk1Nlx1NTJCMVwiLFxuICAgIEVBU1lfQk9OVVNfREVTQzogXCJcdTdCODBcdTUzNTVcdTU5NTZcdTUyQjFcdThCQkVcdTVCOUFcdTIwMUNcdThCQjBcdTVGOTdcdTIwMURcdTU0OENcdTIwMUNcdTdCODBcdTUzNTVcdTIwMURcdTUzNjFcdTcyNDdcdTYyMTZcdTdCMTRcdThCQjBcdTc2ODRcdTU5MERcdTRFNjBcdTk1RjRcdTk2OTRcdTVERUVcdThERERcdUZGMDhcdTY3MDBcdTVDMEZcdTUwM0MxMDAlXHVGRjA5XHUzMDAyXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJcdTdCODBcdTUzNTVcdTU5NTZcdTUyQjFcdTgxRjNcdTVDMTFcdTRFM0ExMDBcdTMwMDJcIixcbiAgICBNQVhfSU5URVJWQUw6IFwiXHU2NzAwXHU1OTI3XHU5NUY0XHU5Njk0XCIsXG4gICAgTUFYX0lOVEVSVkFMX0RFU0M6IFwiXHU4QkJFXHU1QjlBXHU1OTBEXHU0RTYwXHU3Njg0XHU2NzAwXHU1OTI3XHU5NUY0XHU5Njk0XHU2NUY2XHU5NUY0XHVGRjA4XHU5RUQ4XHU4QkE0XHU1MDNDMTAwXHU1RTc0XHVGRjA5XHUzMDAyXCIsXG4gICAgTUFYX0lOVEVSVkFMX01JTl9XQVJOSU5HOiBcIlx1NjcwMFx1NTkyN1x1OTVGNFx1OTY5NFx1ODFGM1x1NUMxMVx1NEUzQTFcdTU5MjlcIixcbiAgICBNQVhfTElOS19DT05UUklCOiBcIlx1NjcwMFx1NTkyN1x1OTRGRVx1NjNBNVx1NjUzNlx1NzZDQVwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzogXCJcdTc1MzFcdTUzOUZcdTYzOENcdTYzRTFcdTdBMEJcdTVFQTZcdTk0RkVcdTYzQTVcdTc2ODRcdTdCMTRcdThCQjBcdTdFRDlcdTRFMEVcdTc2ODRcdTY3MDBcdTU5MjdcdTUyQTBcdTY3NDNcdTYzOENcdTYzRTFcdTVFQTZcdTY1MzZcdTc2Q0FcdTMwMDJcIixcbiAgICBMT0dHSU5HOiBcIlx1OEJCMFx1NUY1NVx1NEUyRFwiLFxuICAgIERJU1BMQVlfREVCVUdfSU5GTzogXCJcdTU3MjhcdTVGMDBcdTUzRDFcdTgwMDVcdTYzQTdcdTUyMzZcdTUzRjBcdTRFMkRcdTY2M0VcdTc5M0FcdThDMDNcdThCRDVcdTRGRTFcdTYwNkZcdUZGMUZcIixcblxuICAgIC8vIHNpZGViYXIudHNcbiAgICBOT1RFU19SRVZJRVdfUVVFVUU6IFwiXHU3QjE0XHU4QkIwXHU1OTBEXHU0RTYwXHU1RThGXHU1MjE3XCIsXG4gICAgQ0xPU0U6IFwiXHU0RTM0XHU4RkQxXCIsXG4gICAgTkVXOiBcIlx1NjVCMFwiLFxuICAgIFlFU1RFUkRBWTogXCJcdTY2MjhcdTU5MjlcIixcbiAgICBUT0RBWTogXCJcdTRFQ0FcdTU5MjlcIixcbiAgICBUT01PUlJPVzogXCJcdTY2MEVcdTU5MjlcIixcblxuICAgIC8vIHN0YXRzLW1vZGFsLnRzeFxuICAgIFNUQVRTX1RJVExFOiBcIlx1NjU3MFx1NjM2RVwiLFxuICAgIE1PTlRIOiBcIlx1NjcwOFwiLFxuICAgIFFVQVJURVI6IFwiXHU1QjYzXCIsXG4gICAgWUVBUjogXCJcdTVFNzRcIixcbiAgICBMSUZFVElNRTogXCJcdTUxNjhcdTkwRThcIixcbiAgICBGT1JFQ0FTVDogXCJcdTk4ODRcdTY3MUZcIixcbiAgICBGT1JFQ0FTVF9ERVNDOiBcIlx1NUMwNlx1ODk4MVx1NTIzMFx1NjcxRlx1NzY4NFx1NTM2MVx1NzI0N1x1NjU3MFx1OTFDRlwiLFxuICAgIFNDSEVEVUxFRDogXCJcdTVERjJcdTYzOTJcdTY3MUZcIixcbiAgICBEQVlTOiBcIlx1NTkyOVwiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJcdTUzNjFcdTcyNDdcdTY1NzBcdTkxQ0ZcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiXHU1RTczXHU1NzQ3OiBcdTU5MERcdTRFNjAke2F2Z30gL1x1NTkyOVwiLFxuICAgIElOVEVSVkFMUzogXCJcdTk1RjRcdTk2OTRcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJcdTUyMzBcdTRFMEJcdTRFMDBcdTZCMjFcdTU5MERcdTRFNjBcdTc2ODRcdTY1RjZcdTk1RjRcdTk1RjRcdTk2OTRcIixcbiAgICBDT1VOVDogXCJcdThCQTFcdTY1NzBcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJcdTVFNzNcdTU3NDdcdTk1RjRcdTk2OTRcdTY1RjZcdTk1RjQ6ICR7YXZnfSwgXHU2NzAwXHU5NTdGXHU5NUY0XHU5Njk0XHU2NUY2XHU5NUY0OiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWFzZXNcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIlx1NUU3M1x1NTc0N1x1NjM4Q1x1NjNFMVx1N0EwQlx1NUVBNjogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHU1MzYxXHU3MjQ3XHU3QzdCXHU1NzhCXCIsXG4gICAgQ0FSRF9UWVBFU19ERVNDOiBcIlx1NTk4Mlx1NjcwOVx1RkYwQ1x1NUMwNlx1NjYzRVx1NzkzQVx1OTY5MFx1ODVDRlx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENBUkRfVFlQRV9ORVc6IFwiXHU2NUIwXCIsXG4gICAgQ0FSRF9UWVBFX1lPVU5HOiBcIlx1OEY4M1x1NjVCMFwiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiXHU3MTlGXHU2MDg5XCIsXG4gICAgQ0FSRF9UWVBFU19TVU1NQVJZOiBcIlx1NjAzQlx1NTM2MVx1NzI0N1x1NjU3MDogJHt0b3RhbENhcmRzQ291bnR9XCIsXG59O1xuIiwgIi8vIFx1N0U0MVx1OUFENFx1NEUyRFx1NjU4N1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZmxhc2hjYXJkLW1vZGFsLnRzeFxuICAgIERFQ0tTOiBcIlx1NzI0Q1x1N0Q0NFwiLFxuICAgIERVRV9DQVJEUzogXCJcdTUyMzBcdTY3MUZcdTUzNjFcdTcyNDdcIixcbiAgICBORVdfQ0FSRFM6IFwiXHU2NUIwXHU1MzYxXHU3MjQ3XCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiXHU1MTY4XHU5MEU4XHU1MzYxXHU3MjQ3XCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiXHU5MUNEXHU3RjZFXHU1MzYxXHU3MjQ3XCIsXG4gICAgSEFSRDogXCJcdThGMDNcdTk2RTNcIixcbiAgICBHT09EOiBcIlx1OEExOFx1NUY5N1wiLFxuICAgIEVBU1k6IFwiXHU3QzIxXHU1NUFFXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHU5ODZGXHU3OTNBXHU3QjU0XHU2ODQ4XCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCJcdTUzNjFcdTcyNDdcdTVERjJcdTg4QUJcdTkxQ0RcdTdGNkVcdTMwMDJcIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiXHU2MjUzXHU5NThCXHU0RTAwXHU1MDBCXHU3QjQ2XHU4QTE4XHU5NThCXHU1OUNCXHU1RkE5XHU3RkQyXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlx1NUZBOVx1N0ZEMlx1NTM2MVx1NzI0N1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJcdTVGQTlcdTdGRDJcdUZGMUFcdTdDMjFcdTU1QUVcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiXHU1RkE5XHU3RkQyXHVGRjFBXHU4QTE4XHU1Rjk3XCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlx1NUZBOVx1N0ZEMlx1RkYxQVx1OEYwM1x1OTZFM1wiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlx1NkExOVx1OEExOFx1NzBCQVx1MzAwQ1x1N0MyMVx1NTVBRVx1MzAwRFwiLFxuICAgIFJFVklFV19OT1RFX0dPT0RfQ01EOiBcIlx1NkExOVx1OEExOFx1NzBCQVx1MzAwQ1x1OEExOFx1NUY5N1x1MzAwRFwiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIlx1NkExOVx1OEExOFx1NzBCQVx1MzAwQ1x1OEYwM1x1OTZFM1x1MzAwRFwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1NUZBOVx1N0ZEMlx1NkI2NFx1N0I0Nlx1OEExOFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJcdTRFMERcdThBMDhcdTk2RTNcdTY2MTNcdTVFQTZcdTVGQTlcdTdGRDJcdTZCNjRcdTdCNDZcdThBMThcdTRFMkRcdTc2ODRcdTUzNjFcdTcyNDdcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlx1NUZBOVx1N0ZEMlx1NjI0MFx1NjcwOVx1N0I0Nlx1OEExOFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHU2QUEyXHU4OTk2XHU2NTc4XHU2NERBXCIsXG4gICAgU1RBVFVTX0JBUjogXCJcdTVGQTlcdTdGRDI6ICR7ZHVlTm90ZXNDb3VudH0gXHU3QjQ2XHU4QTE4LCAke2R1ZUZsYXNoY2FyZHNDb3VudH0gXHU1MzYxXHU3MjQ3XHU1REYyXHU1MjMwXHU2NzFGXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlx1NTQwQ1x1NkI2NVx1NjY0Mlx1OTU5MyAke3R9bXNcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIlx1N0I0Nlx1OEExOFx1NTEzMlx1NUI1OFx1NTcyOFx1NURGMlx1ODhBQlx1NUZGRFx1NzU2NVx1NzY4NFx1OERFRlx1NUY5MVx1NEUyRFx1RkYwOFx1NkFBMlx1NjdFNVx1OEEyRFx1NUI5QVx1OTA3OFx1OTgwNVx1RkYwOVx1MzAwMlwiLFxuICAgIFBMRUFTRV9UQUdfTk9URTogXCJcdThBQ0JcdTVDMDdcdTk3MDBcdTg5ODFcdTVGQTlcdTdGRDJcdTc2ODRcdTdCNDZcdThBMThcdTRFMkRcdTUyQTBcdTUxNjVcdTZCNjNcdTc4QkFcdTc2ODRcdTZBMTlcdTdDNjRcdUZGMDhcdTZBQTJcdTY3RTVcdThBMkRcdTVCOUFcdTkwNzhcdTk4MDVcdUZGMDlcdTMwMDJcIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJcdTU2REVcdTk5NEJcdTVERjJcdTY1MzZcdTUyMzBcIixcbiAgICBOT19ERUNLX0VYSVNUUzogXCJcdTZDOTJcdTY3MDkgJHtkZWNrTmFtZX0gXHU3MjRDXHU3RDQ0XCIsXG4gICAgQUxMX0NBVUdIVF9VUDogXCJcdTkwRkRcdTVGQTlcdTdGRDJcdTVCOENcdTU1NjZcdUZGMENcdTRGNjBcdTc3MUZcdTY4RDJcdUZGMDFcIixcblxuICAgIC8vIHNjaGVkdWxpbmcudHNcbiAgICBEQVlTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gXHU1OTI5XCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gXHU2NzA4XCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdTVFNzRcIixcbiAgICBEQVlTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHU1OTI5XCIsXG4gICAgTU9OVEhTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHU2NzA4XCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1cdTVFNzRcIixcblxuICAgIC8vIHNldHRpbmdzLnRzXG4gICAgU0VUVElOR1NfSEVBREVSOiBcIlx1OTU5M1x1OTY5NFx1OTFDRFx1ODkwN1x1NTkxNlx1NjM5QiAtIFx1OEEyRFx1NUI5QVwiLFxuICAgIENIRUNLX1dJS0k6ICdcdTc3QURcdTg5RTNcdTY2RjRcdTU5MUEsIFx1OEFDQlx1OUVERVx1OTA3OCA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPi4nLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIlx1NUZGRFx1NzU2NVx1NkI2NFx1OENDN1x1NjU5OVx1NTkzRVwiLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFX0RFU0M6IFwiXHU4RjM4XHU1MTY1XHU4Q0M3XHU2NTk5XHU1OTNFXHU4REVGXHU1RjkxXHVGRjA4XHU3NTI4XHU2M0RCXHU4ODRDXHU1QjU3XHU1MTQzXHU1MjA2XHU5Njk0XHVGRjA5XHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBVGVtcGxhdGVzIE1ldGEvU2NyaXB0c1wiLFxuICAgIEZMQVNIQ0FSRFM6IFwiXHU1MzYxXHU3MjQ3XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiXHU3QzIxXHU1NUFFXHU2MzA5XHU5MjE1XHU2NTg3XHU1QjU3XCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfTEFCRUw6IFwiXHU4QTE4XHU1Rjk3XHU2MzA5XHU5MjE1XHU2NTg3XHU1QjU3XCIsXG4gICAgRkxBU0hDQVJEX0hBUkRfTEFCRUw6IFwiXHU4RjAzXHU5NkUzXHU2MzA5XHU5MjE1XHU2NTg3XHU1QjU3XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogXCJcdTgxRUFcdThBMDJcdTMwMENcdTdDMjFcdTU1QUVcdTMwMERcdTYzMDlcdTkyMTVcdTc2ODRcdTZBMTlcdTdDNjRcIixcbiAgICBGTEFTSENBUkRfR09PRF9ERVNDOiBcIlx1ODFFQVx1OEEwMlx1MzAwQ1x1OEExOFx1NUY5N1x1MzAwRFx1NjMwOVx1OTIxNVx1NzY4NFx1NkExOVx1N0M2NFwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0RFU0M6IFwiXHU4MUVBXHU4QTAyXHUzMDBDXHU4RjAzXHU5NkUzXHUzMDBEXHU2MzA5XHU5MjE1XHU3Njg0XHU2QTE5XHU3QzY0XCIsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiXHU1MzYxXHU3MjQ3XHU2QTE5XHU3QzY0XCIsXG4gICAgRkxBU0hDQVJEX1RBR1NfREVTQzogXCJcdThGMzhcdTUxNjVcdTZBMTlcdTdDNjRcdUZGMDhcdTc1MjhcdTdBN0FcdTc2N0RcdTYyMTZcdTYzREJcdTg4NENcdTVCNTdcdTUxNDNcdTUyMDZcdTk2OTRcdUZGMDlcdUZGMENcdTRGOEJcdTU5ODJcdUZGMUEjZmxhc2hjYXJkcyAjZGVjazIgI2RlY2szLlwiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJcdTY2MkZcdTU0MjZcdTVDMDdcdThDQzdcdTY1OTlcdTU5M0VcdTUxNjdcdTVCQjlcdThGNDlcdTYzREJcdTcwQkFcdTcyNENcdTdENDRcdTU0OENcdTVCNTBcdTcyNENcdTdENDRcdUZGMUZcIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1NfREVTQzogXCJcdTZCNjRcdTkwNzhcdTk4MDVcdTcwQkFcdTUzNjFcdTcyNDdcdTZBMTlcdTdDNjRcdTkwNzhcdTk4MDVcdTc2ODRcdTY2RkZcdTRFRTNcdTkwNzhcdTk4MDVcdTMwMDJcIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzogXCJcdTY2MkZcdTU0MjZcdTVDMDdcdThBMDhcdTUyODNcdTkxQ0RcdTg5MDdcdTY2NDJcdTk1OTNcdTUxMzJcdTVCNThcdTU3MjhcdTUzNjFcdTcyNDdcdTY3MDBcdTVGOENcdTRFMDBcdTg4NENcdTc2ODRcdTU0MENcdTRFMDBcdTg4NENcdUZGMUZcIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDOiBcIlx1NTJGRVx1OTA3OFx1NUY4Q0hUTUxcdThBM0JcdTg5RTNcdTRFMERcdTY3MDNcdTc4MzRcdTU4REVcdTUyMTdcdTg4NjhcdTY4M0NcdTVGMEZcdTU1NEZcdTk4NENcdTMwMDJcIixcbiAgICBCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVk6IFwiXHU1QzA3XHU1M0NEXHU4RjQ5XHU1MzYxXHU3MjQ3XHU5NkIxXHU4NUNGXHU4MUYzXHU0RTBCXHU0RTAwXHU1OTI5XHVGRjFGXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6IFwiXHU1M0NEXHU4RjQ5XHU1MzYxXHU3MjQ3XHU3NTMxXHU1NDBDXHU0RTAwXHU1MzYxXHU3MjQ3XHU2NTg3XHU1QjU3XHU3NTIyXHU3NTFGXHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBXHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFQ6IFwiXHU1NzI4XHU1MzYxXHU3MjQ3XHU0RTJEXHU5ODZGXHU3OTNBXHU0RTBBXHU0RTBCXHU2NTg3XHVGRjFGXCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJcdTRGOEJcdTU5ODJcdUZGMUFcdTZBMTlcdTk4NEMgPiBcdTUyNkZcdTZBMTlcdTk4NEMgPiBcdTVDMEZcdTZBMTlcdTk4NEMgPiAuLi4gPiBcdTVDMEZcdTZBMTlcdTk4NENcIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIlx1NTM2MVx1NzI0N1x1OUFEOFx1NUVBNlx1NzY3RVx1NTIwNlx1NkJENFwiLFxuICAgIENBUkRfTU9EQUxfU0laRV9QRVJDRU5UX0RFU0M6IFwiXHU1NzI4XHU3OUZCXHU1MkQ1XHU3QUVGXHU2MjE2XHU5NzAwXHU4OTgxXHU4RjAzXHU1OTI3XHU1NzE2XHU3MjQ3XHU2NjQyXHU2MUM5XHU4QTJEXHU1QjlBXHU3MEJBMTAwJVwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiXHU5MUNEXHU3RjZFXHU3MEJBXHU5ODEwXHU4QTJEXHU1MDNDXCIsXG4gICAgQ0FSRF9NT0RBTF9XSURUSF9QRVJDRU5UOiBcIlx1NTM2MVx1NzI0N1x1NUJFQ1x1NUVBNlx1NzY3RVx1NTIwNlx1NkJENFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlx1NUZBOVx1N0ZEMlx1NjY0Mlx1OTZBOFx1NkE1Rlx1OTg2Rlx1NzkzQVx1NTM2MVx1NzI0N1x1RkYxRlwiLFxuICAgIERJU0FCTEVfQ0xPWkVfQ0FSRFM6IFwiXHU1MDVDXHU3NTI4XHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XHU1MzYxXHU3MjQ3XHVGRjFGXCIsXG4gICAgQ09OVkVSVF9ISUdITElHSFRTX1RPX0NMT1pFUzogXCJcdTVDMDcgPT1cdTlBRDhcdTRFQUU9PSBcdThGNDlcdTYzREJcdTcwQkFcdTU4NkJcdTdBN0FcdTUxNEJcdTZGMEZcdTVCNTdcdUZGMUZcIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiXHU1QzA3ICoqXHU3Qzk3XHU5QUQ0KiogXHU4RjQ5XHU2M0RCXHU3MEJBXHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XHVGRjFGXCIsXG4gICAgQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVM6IFwiXHU1QzA3IHt7XHU1OTI3XHU2MkVDXHU4NjVGfX0gXHU4RjQ5XHU2M0RCXHU3MEJBXHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XHVGRjFGXCIsXG4gICAgSU5MSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJcdTU1QUVcdTg4NENcdTUzNjFcdTcyNDdcdTc2ODRcdTUyMDZcdTk2OTRcdTVCNTdcdTUxNDNcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOiBcIlx1NkNFOFx1NjEwRlx1RkYxQVx1NjZGNFx1NjUzOVx1NkI2NFx1OTA3OFx1OTgwNVx1NUY4Q1x1NEY2MFx1NUMwN1x1OTcwMFx1ODk4MVx1ODFFQVx1ODg0Q1x1NjZGNFx1NjUzOVx1NURGMlx1NUI1OFx1NTcyOFx1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1NUI1N1x1NTE0M1x1MzAwMlwiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHU1NUFFXHU4ODRDXHU1M0NEXHU4RjQ5XHU1MzYxXHU3MjQ3XHU3Njg0XHU1MjA2XHU5Njk0XHU1QjU3XHU1MTQzXCIsXG4gICAgTVVMVElMSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJcdTU5MUFcdTg4NENcdTUzNjFcdTcyNDdcdTc2ODRcdTUyMDZcdTk2OTRcdTVCNTdcdTUxNDNcIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1NTkxQVx1ODg0Q1x1N0ZGQlx1OEY0OVx1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1NUI1N1x1NTE0M1wiLFxuICAgIE5PVEVTOiBcIlx1N0I0Nlx1OEExOFwiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiXHU1NTVGXHU1MkQ1XHU2NjQyXHU5NThCXHU1NTVGXHU3QjQ2XHU4QTE4XHU1RkE5XHU3RkQyXHU3QTk3XHU2ODNDXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHU1RkE5XHU3RkQyXHU2QTE5XHU3QzY0XCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzogXCJcdThGMzhcdTUxNjVcdTZBMTlcdTdDNjRcdUZGMENcdTc1MjhcdTdBN0FcdTY4M0NcdTYyMTZcdTYzREJcdTg4NENcdTVCNTdcdTUxNDNcdTUyMDZcdTk2OTRcdUZGMENcdTRGOEJcdTU5ODJcdUZGMUEjcmV2aWV3ICN0YWcyICN0YWczLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiXHU1RkE5XHU3RkQyXHU5NkE4XHU2QTVGXHU3QjQ2XHU4QTE4XCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOiBcIlx1OTVEQ1x1OTU4OVx1NkI2NFx1OTA3OFx1OTgwNVx1RkYwQ1x1N0I0Nlx1OEExOFx1NUMwN1x1NEVFNVx1OTFDRFx1ODk4MVx1NUVBNihQYWdlUmFuaylcdTYzOTJcdTVFOEZcdTMwMDJcIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJcdTVGQTlcdTdGRDJcdTVGOENcdTgxRUFcdTUyRDVcdTYyNTNcdTk1OEJcdTRFMEJcdTRFMDBcdTUwMEJcdTdCNDZcdThBMThcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OUzogXCJcdTk1RENcdTk1ODlcdTZBOTRcdTY4NDhcdTkwNzhcdTU1QUVcdTRFMkRcdTc2ODRcdTVGQTlcdTdGRDJcdTkwNzhcdTk4MDUgXHU0RjhCXHU1OTgyXHVGRjFBXHU1RkE5XHU3RkQyXHVGRjFBXHU3QzIxXHU1NUFFIFx1OEExOFx1NUY5NyBcdThGMDNcdTk2RTNcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOiBcIlx1OTVEQ1x1OTU4OVx1NkE5NFx1Njg0OFx1OTA3OFx1NTVBRVx1NzY4NFx1NUZBOVx1N0ZEMlx1OTA3OFx1OTgwNVx1RkYwQ1x1NEY4Qlx1NTk4Mlx1RkYxQVx1NUZBOVx1N0ZEMjogXHU3QzIxXHU1NUFFIFx1OEExOFx1NUY5NyBcdThGMDNcdTk2RTNcdTMwMDJcIixcbiAgICBNQVhfTl9EQVlTX1JFVklFV19RVUVVRTogXCJcdTUzRjNcdTkwOEFcdTk3NjJcdTY3N0ZcdTk4NkZcdTc5M0FcdTc2ODRcdTY3MDBcdTU5MjdcdTU5MjlcdTY1NzhcIixcbiAgICBNSU5fT05FX0RBWTogXCJcdTU5MjlcdTY1NzhcdTY3MDBcdTVDMEZcdTUwM0NcdTcwQkExXCIsXG4gICAgVkFMSURfTlVNQkVSX1dBUk5JTkc6IFwiXHU4QUNCXHU4RjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU2NTc4XHU1QjU3XHUzMDAyXCIsXG4gICAgVUlfUFJFRkVSRU5DRVM6IFwiXHU3NTI4XHU2MjM2XHU0RUNCXHU5NzYyXHU5OTk2XHU5MDc4XHU5ODA1XCIsXG4gICAgSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFOiBcIlx1NzI0Q1x1N0Q0NFx1NkEzOVx1NjcwMFx1NTIxRFx1NjFDOVx1OTg2Rlx1NzkzQVx1NzBCQVx1NUM1NVx1OTU4QlwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRV9ERVNDOlxuICAgICAgICBcIlx1OTVEQ1x1OTU4OVx1NkI2NFx1OTA3OFx1OTgwNVx1NTNFRlx1NjQ3QVx1NzU4QVx1NTQwQ1x1NEUwMFx1NUYzNVx1NTM2MVx1NzI0N1x1NEUyRFx1NzY4NFx1NURFMlx1NzJDMFx1NzI0Q1x1N0Q0NFx1MzAwMlx1NTk4Mlx1Njc5Q1x1NjBBOFx1NzY4NFx1NTM2MVx1NzI0N1x1NUM2Q1x1NjVCQ1x1NTQwQ1x1NEUwMFx1NkE5NFx1Njg0OFx1NEUyRFx1NzY4NFx1OEEzMVx1NTkxQVx1NTk1N1x1NzI0Q1x1RkYwQ1x1NTI0N1x1NUY4OFx1NjcwOVx1NzUyOFx1MzAwMlwiLFxuICAgIEFMR09SSVRITTogXCJcdTZGMTRcdTdCOTdcdTZDRDVcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTogJ1x1NzdBRFx1ODlFM1x1NjZGNFx1NTkxQSwgXHU4QUNCXHU5RURFXHU5MDc4IDxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPmFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbjwvYT4uJyxcbiAgICBCQVNFX0VBU0U6IFwiXHU1N0ZBXHU3OTBFXHU2MzhDXHU2M0UxXHU3QTBCXHU1RUE2XCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwiXHU2NzAwXHU1QzBGXHU1MDNDMTMwXHVGRjBDXHU2M0E4XHU4NUE2XHU1MDNDXHU3RDA0MjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJcdTU3RkFcdTc5MEVcdTYzOENcdTYzRTFcdTdBMEJcdTVFQTZcdTc2ODRcdTY3MDBcdTVDMEZcdTUwM0NcdTcwQkExMzBcdTMwMDJcIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6IFwiXHU1QzA3XHU1RkE5XHU3RkQyXHU2NjQyXHU2QTE5XHU4QTNCXHU3MEJBXHUzMDBDXHU4RjAzXHU5NkUzXHUzMDBEXHU3Njg0XHU1MzYxXHU3MjQ3XHU2MjE2XHU3QjQ2XHU4QTE4XHU1RkE5XHU3RkQyXHU5NTkzXHU5Njk0XHU3RTJFXHU3N0VEXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFX0RFU0M6IFwiXHU2NUIwXHU1RkE5XHU3RkQyXHU5NTkzXHU5Njk0ID0gXHU1MzlGXHU1RkE5XHU3RkQyXHU5NTkzXHU5Njk0ICogXHU5NTkzXHU5Njk0XHU2NTM5XHU4QjhBXHU0RkMyXHU2NTc4IC8gMTAwLlwiLFxuICAgIEVBU1lfQk9OVVM6IFwiXHU3QzIxXHU1NUFFXHU3MzRFXHU1MkY1XCIsXG4gICAgRUFTWV9CT05VU19ERVNDOiBcIlx1N0MyMVx1NTVBRVx1NzM0RVx1NTJGNVx1OEEyRFx1NUI5QVx1MzAwQ1x1OEExOFx1NUY5N1x1MzAwRFx1NTQ4Q1x1MzAwQ1x1N0MyMVx1NTVBRVx1MzAwRFx1NTM2MVx1NzI0N1x1NjIxNlx1N0I0Nlx1OEExOFx1NzY4NFx1NUZBOVx1N0ZEMlx1OTU5M1x1OTY5NFx1NURFRVx1OERERFx1RkYwOFx1NjcwMFx1NUMwRlx1NTAzQzEwMCVcdUZGMDlcdTMwMDJcIixcbiAgICBFQVNZX0JPTlVTX01JTl9XQVJOSU5HOiBcIlx1N0MyMVx1NTVBRVx1NzM0RVx1NTJGNVx1ODFGM1x1NUMxMVx1NzBCQTEwMFx1MzAwMlwiLFxuICAgIE1BWF9JTlRFUlZBTDogXCJcdTY3MDBcdTU5MjdcdTk1OTNcdTk2OTRcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJcdThBMkRcdTVCOUFcdTVGQTlcdTdGRDJcdTc2ODRcdTY3MDBcdTU5MjdcdTk1OTNcdTk2OTRcdTY2NDJcdTk1OTNcdUZGMDhcdTk4MTBcdThBMkRcdTUwM0MxMDBcdTVFNzRcdUZGMDlcdTMwMDJcIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiXHU2NzAwXHU1OTI3XHU5NTkzXHU5Njk0XHU4MUYzXHU1QzExXHU3MEJBMVx1NTkyOVwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUI6IFwiXHU2NzAwXHU1OTI3XHU5M0M4XHU2M0E1XHU4Q0EyXHU3MzdCXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIk1heGltdW0gY29udHJpYnV0aW9uIG9mIHRoZSB3ZWlnaHRlZCBlYXNlIG9mIGxpbmtlZCBub3RlcyB0byB0aGUgaW5pdGlhbCBlYXNlLlwiLFxuICAgIExPR0dJTkc6IFwiXHU4QTE4XHU5MzA0XHU0RTJEXCIsXG4gICAgRElTUExBWV9ERUJVR19JTkZPOiBcIlx1NTcyOFx1OTU4Qlx1NzY3Q1x1ODAwNVx1NjNBN1x1NTIzNlx1NTNGMFx1NEUyRFx1OTg2Rlx1NzkzQVx1OTY2NFx1OTMyRlx1OENDN1x1OEEwQVx1RkYxRlwiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdTdCNDZcdThBMThcdTVGQTlcdTdGRDJcdTVFOEZcdTUyMTdcIixcbiAgICBDTE9TRTogXCJcdTgxRThcdThGRDFcIixcbiAgICBORVc6IFwiXHU2NUIwXCIsXG4gICAgWUVTVEVSREFZOiBcIlx1NjYyOFx1NTkyOVwiLFxuICAgIFRPREFZOiBcIlx1NEVDQVx1NTkyOVwiLFxuICAgIFRPTU9SUk9XOiBcIlx1NjYwRVx1NTkyOVwiLFxuXG4gICAgLy8gc3RhdHMtbW9kYWwudHN4XG4gICAgU1RBVFNfVElUTEU6IFwiXHU3RDcxXHU4QTA4XCIsXG4gICAgTU9OVEg6IFwiXHU2NzA4XCIsXG4gICAgUVVBUlRFUjogXCJcdTVCNjNcIixcbiAgICBZRUFSOiBcIlx1NUU3NFwiLFxuICAgIExJRkVUSU1FOiBcIlx1NTE2OFx1OTBFOFwiLFxuICAgIEZPUkVDQVNUOiBcIlx1OTgxMFx1NkUyQ1wiLFxuICAgIEZPUkVDQVNUX0RFU0M6IFwiXHU1QzA3XHU4OTgxXHU1MjMwXHU2NzFGXHU3Njg0XHU1MzYxXHU3MjQ3XHU2NTc4XHU5MUNGXCIsXG4gICAgU0NIRURVTEVEOiBcIlx1NURGMlx1NjM5Mlx1N0EwQlwiLFxuICAgIERBWVM6IFwiXHU1OTI5XCIsXG4gICAgTlVNQkVSX09GX0NBUkRTOiBcIlx1NTM2MVx1NzI0N1x1NjU3OFx1OTFDRlwiLFxuICAgIFJFVklFV1NfUEVSX0RBWTogXCJcdTVFNzNcdTU3NDc6IFx1NUZBOVx1N0ZEMiR7YXZnfSAvXHU1OTI5XCIsXG4gICAgSU5URVJWQUxTOiBcIlx1OTU5M1x1OTY5NFwiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIlx1NTIzMFx1NEUwQlx1NEUwMFx1NkIyMVx1NUZBOVx1N0ZEMlx1NzY4NFx1NjY0Mlx1OTU5M1x1OTU5M1x1OTY5NFwiLFxuICAgIENPVU5UOiBcIlx1OEEwOFx1NjU3OFwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIlx1NUU3M1x1NTc0N1x1OTU5M1x1OTY5NFx1NjY0Mlx1OTU5MzogJHthdmd9LCBcdTY3MDBcdTk1NzdcdTk1OTNcdTk2OTRcdTY2NDJcdTk1OTM6ICR7bG9uZ2VzdH1cIixcbiAgICBFQVNFUzogXCJFYXNlc1wiLFxuICAgIEVBU0VTX1NVTU1BUlk6IFwiXHU1RTczXHU1NzQ3XHU2MzhDXHU2M0UxXHU3QTBCXHU1RUE2OiAke2F2Z0Vhc2V9XCIsXG4gICAgQ0FSRF9UWVBFUzogXCJcdTUzNjFcdTcyNDdcdTU3OEJcdTUyMjVcIixcbiAgICBDQVJEX1RZUEVTX0RFU0M6IFwiXHU1OTgyXHU2NzA5XHVGRjBDXHU1QzA3XHU5ODZGXHU3OTNBXHU5NkIxXHU4NUNGXHU3Njg0XHU1MzYxXHU3MjQ3XCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJcdTY1QjBcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiXHU4RjAzXHU2NUIwXCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJcdTcxOUZcdTYwODlcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiXHU3RTNEXHU1MzYxXHU3MjQ3XHU2NTc4OiAke3RvdGFsQ2FyZHNDb3VudH1cIixcbn07XG4iLCAiaW1wb3J0IHtcbiAgICBCdXR0b25Db21wb25lbnQsXG4gICAgTW9kYWwsXG4gICAgQXBwLFxuICAgIE1hcmtkb3duUmVuZGVyZXIsXG4gICAgTm90aWNlLFxuICAgIFBsYXRmb3JtLFxuICAgIFRGaWxlLFxuICAgIFRleHRBcmVhQ29tcG9uZW50LFxuICAgIHNldEljb24sXG59IGZyb20gXCJvYnNpZGlhblwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IGggZnJvbSBcInZodG1sXCI7XG5cbmltcG9ydCB0eXBlIFNSUGx1Z2luIGZyb20gXCJzcmMvbWFpblwiO1xuaW1wb3J0IHsgQ2FyZCwgQ2FyZFR5cGUsIHNjaGVkdWxlLCB0ZXh0SW50ZXJ2YWwsIFJldmlld1Jlc3BvbnNlIH0gZnJvbSBcInNyYy9zY2hlZHVsaW5nXCI7XG5pbXBvcnQge1xuICAgIENPTExBUFNFX0lDT04sXG4gICAgTVVMVElfU0NIRURVTElOR19FWFRSQUNUT1IsXG4gICAgTEVHQUNZX1NDSEVEVUxJTkdfRVhUUkFDVE9SLFxuICAgIElNQUdFX0ZPUk1BVFMsXG4gICAgQVVESU9fRk9STUFUUyxcbiAgICBWSURFT19GT1JNQVRTLFxufSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZXNjYXBlUmVnZXhTdHJpbmcsIGN5cmI1MyB9IGZyb20gXCJzcmMvdXRpbHNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwic3JjL2xhbmcvaGVscGVyc1wiO1xuXG5leHBvcnQgZW51bSBGbGFzaGNhcmRNb2RhbE1vZGUge1xuICAgIERlY2tzTGlzdCxcbiAgICBGcm9udCxcbiAgICBCYWNrLFxuICAgIENsb3NlZCxcbn1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vY2hob3VtYW5uL3F1aWNrYWRkL2Jsb2IvYmNlMGI0Y2RhYzQ0Yjg2Nzg1NGQ2MjMzNzk2ZTM0MDZkZmQxNjNjNi9zcmMvZ3VpL0dlbmVyaWNJbnB1dFByb21wdC9HZW5lcmljSW5wdXRQcm9tcHQudHMjTDVcbmV4cG9ydCBjbGFzcyBGbGFzaGNhcmRFZGl0TW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgcHVibGljIHBsdWdpbjogU1JQbHVnaW47XG4gICAgcHVibGljIGlucHV0OiBzdHJpbmc7XG4gICAgcHVibGljIHdhaXRGb3JDbG9zZTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgcHJpdmF0ZSByZXNvbHZlUHJvbWlzZTogKGlucHV0OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIHJlamVjdFByb21pc2U6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBkaWRTdWJtaXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlucHV0Q29tcG9uZW50OiBUZXh0QXJlYUNvbXBvbmVudDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsVGV4dDogc3RyaW5nO1xuXG4gICAgcHVibGljIHN0YXRpYyBQcm9tcHQoYXBwOiBBcHAsIHBsdWdpbjogU1JQbHVnaW4sIHBsYWNlaG9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBuZXdQcm9tcHRNb2RhbCA9IG5ldyBGbGFzaGNhcmRFZGl0TW9kYWwoYXBwLCBwbHVnaW4sIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgcmV0dXJuIG5ld1Byb21wdE1vZGFsLndhaXRGb3JDbG9zZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogU1JQbHVnaW4sIGV4aXN0aW5nVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dCh0KFwiRURJVF9DQVJEXCIpKTtcbiAgICAgICAgdGhpcy50aXRsZUVsLmFkZENsYXNzKFwic3ItY2VudGVyZWRcIik7XG4gICAgICAgIHRoaXMubW9kYWxUZXh0ID0gZXhpc3RpbmdUZXh0O1xuXG4gICAgICAgIHRoaXMud2FpdEZvckNsb3NlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3BsYXkoKSB7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMubW9kYWxFbC5hZGRDbGFzcyhcInNyLWZsYXNoY2FyZC1pbnB1dC1tb2RhbFwiKTtcblxuICAgICAgICBjb25zdCBtYWluQ29udGVudENvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgbWFpbkNvbnRlbnRDb250YWluZXIuYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtaW5wdXQtYXJlYVwiKTtcbiAgICAgICAgdGhpcy5pbnB1dENvbXBvbmVudCA9IHRoaXMuY3JlYXRlSW5wdXRGaWVsZChtYWluQ29udGVudENvbnRhaW5lciwgdGhpcy5tb2RhbFRleHQpO1xuICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbkJhcihtYWluQ29udGVudENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgICAgY2FsbGJhY2s6IChldnQ6IE1vdXNlRXZlbnQpID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3QgYnRuID0gbmV3IEJ1dHRvbkNvbXBvbmVudChjb250YWluZXIpO1xuICAgICAgICBidG4uc2V0QnV0dG9uVGV4dCh0ZXh0KS5vbkNsaWNrKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUJ1dHRvbkJhcihtYWluQ29udGVudENvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYnV0dG9uQmFyQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IG1haW5Db250ZW50Q29udGFpbmVyLmNyZWF0ZURpdigpO1xuICAgICAgICBidXR0b25CYXJDb250YWluZXIuYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtZWRpdC1idXR0b24tYmFyXCIpO1xuICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbihcbiAgICAgICAgICAgIGJ1dHRvbkJhckNvbnRhaW5lcixcbiAgICAgICAgICAgIHQoXCJTQVZFXCIpLFxuICAgICAgICAgICAgdGhpcy5zdWJtaXRDbGlja0NhbGxiYWNrXG4gICAgICAgICkuc2V0Q3RhKCkuYnV0dG9uRWwuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjBcIjtcbiAgICAgICAgdGhpcy5jcmVhdGVCdXR0b24oYnV0dG9uQmFyQ29udGFpbmVyLCB0KFwiQ0FOQ0VMXCIpLCB0aGlzLmNhbmNlbENsaWNrQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVJbnB1dEZpZWxkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dENvbXBvbmVudCA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb250YWluZXIpO1xuXG4gICAgICAgIHRleHRDb21wb25lbnQuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICB0ZXh0Q29tcG9uZW50XG4gICAgICAgICAgICAuc2V0VmFsdWUodmFsdWUgPz8gXCJcIilcbiAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+ICh0aGlzLmlucHV0ID0gdmFsdWUpKVxuICAgICAgICAgICAgLmlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5zdWJtaXRFbnRlckNhbGxiYWNrKTtcblxuICAgICAgICByZXR1cm4gdGV4dENvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1Ym1pdENsaWNrQ2FsbGJhY2sgPSAoXzogTW91c2VFdmVudCkgPT4gdGhpcy5zdWJtaXQoKTtcbiAgICBwcml2YXRlIGNhbmNlbENsaWNrQ2FsbGJhY2sgPSAoXzogTW91c2VFdmVudCkgPT4gdGhpcy5jYW5jZWwoKTtcblxuICAgIHByaXZhdGUgc3VibWl0RW50ZXJDYWxsYmFjayA9IChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSkgJiYgZXZ0LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuZGlkU3VibWl0ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHN1cGVyLm9uT3BlbigpO1xuXG4gICAgICAgIHRoaXMuaW5wdXRDb21wb25lbnQuaW5wdXRFbC5mb2N1cygpO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIHN1cGVyLm9uQ2xvc2UoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlSW5wdXQoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVJbnB1dExpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlSW5wdXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5kaWRTdWJtaXQpIHRoaXMucmVqZWN0UHJvbWlzZSh0KFwiTk9fSU5QVVRcIikpO1xuICAgICAgICBlbHNlIHRoaXMucmVzb2x2ZVByb21pc2UodGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVJbnB1dExpc3RlbmVyKCkge1xuICAgICAgICB0aGlzLmlucHV0Q29tcG9uZW50LmlucHV0RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5zdWJtaXRFbnRlckNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGFzaGNhcmRNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBwdWJsaWMgcGx1Z2luOiBTUlBsdWdpbjtcbiAgICBwdWJsaWMgYW5zd2VyQnRuOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZmxhc2hjYXJkVmlldzogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIGhhcmRCdG46IEhUTUxFbGVtZW50O1xuICAgIHB1YmxpYyBnb29kQnRuOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZWFzeUJ0bjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIG5leHRCdG46IEhUTUxFbGVtZW50O1xuICAgIHB1YmxpYyByZXNwb25zZURpdjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIHJlc2V0QnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZWRpdEJ1dHRvbjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIGNvbnRleHRWaWV3OiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgY3VycmVudENhcmQ6IENhcmQ7XG4gICAgcHVibGljIGN1cnJlbnRDYXJkSWR4OiBudW1iZXI7XG4gICAgcHVibGljIGN1cnJlbnREZWNrOiBEZWNrO1xuICAgIHB1YmxpYyBjaGVja0RlY2s6IERlY2s7XG4gICAgcHVibGljIG1vZGU6IEZsYXNoY2FyZE1vZGFsTW9kZTtcbiAgICBwdWJsaWMgaWdub3JlU3RhdHM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTUlBsdWdpbiwgaWdub3JlU3RhdHMgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLmlnbm9yZVN0YXRzID0gaWdub3JlU3RhdHM7XG5cbiAgICAgICAgdGhpcy50aXRsZUVsLnNldFRleHQodChcIkRFQ0tTXCIpKTtcbiAgICAgICAgdGhpcy50aXRsZUVsLmFkZENsYXNzKFwic3ItY2VudGVyZWRcIik7XG5cbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRFbC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kYWxFbC5zdHlsZS5oZWlnaHQgPSB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhlaWdodFBlcmNlbnRhZ2UgKyBcIiVcIjtcbiAgICAgICAgdGhpcy5tb2RhbEVsLnN0eWxlLndpZHRoID0gdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRXaWR0aFBlcmNlbnRhZ2UgKyBcIiVcIjtcblxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAgICAgdGhpcy5jb250ZW50RWwuc3R5bGUuaGVpZ2h0ID0gXCI5MiVcIjtcbiAgICAgICAgdGhpcy5jb250ZW50RWwuYWRkQ2xhc3MoXCJzci1tb2RhbC1jb250ZW50XCIpO1xuXG4gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIGludG8gZXZlbnQgaGFuZGxlcj9cbiAgICAgICAgZG9jdW1lbnQuYm9keS5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETzogUGxlYXNlIGZpeCB0aGlzLiBJdCdzIHVnbHkuXG4gICAgICAgICAgICAvLyBDaGVja3MgaWYgdGhlIGlucHV0IHRleHRib3ggaXMgaW4gZm9jdXMgYmVmb3JlIHByb2Nlc3Npbmcga2V5Ym9hcmQgc2hvcnRjdXRzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQubm9kZU5hbWUgIT0gXCJURVhUQVJFQVwiICYmXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ub2RlTmFtZSAhPT0gXCJJTlBVVFwiICYmXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlICE9PSBGbGFzaGNhcmRNb2RhbE1vZGUuRGVja3NMaXN0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdW1lID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSBGbGFzaGNhcmRNb2RhbE1vZGUuQ2xvc2VkICYmIGUuY29kZSA9PT0gXCJLZXlTXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwQ3VycmVudENhcmQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZSA9PT0gRmxhc2hjYXJkTW9kYWxNb2RlLkZyb250ICYmXG4gICAgICAgICAgICAgICAgICAgIChlLmNvZGUgPT09IFwiU3BhY2VcIiB8fCBlLmNvZGUgPT09IFwiRW50ZXJcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QW5zd2VyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gRmxhc2hjYXJkTW9kYWxNb2RlLkJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJOdW1wYWQxXCIgfHwgZS5jb2RlID09PSBcIkRpZ2l0MVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuSGFyZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcIk51bXBhZDJcIiB8fCBlLmNvZGUgPT09IFwiRGlnaXQyXCIgfHwgZS5jb2RlID09PSBcIlNwYWNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JldmlldyhSZXZpZXdSZXNwb25zZS5Hb29kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT09IFwiTnVtcGFkM1wiIHx8IGUuY29kZSA9PT0gXCJEaWdpdDNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmV2aWV3KFJldmlld1Jlc3BvbnNlLkVhc3kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXCJOdW1wYWQwXCIgfHwgZS5jb2RlID09PSBcIkRpZ2l0MFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuUmVzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG9uT3BlbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZWNrc0xpc3QoKTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGUgPSBGbGFzaGNhcmRNb2RhbE1vZGUuQ2xvc2VkO1xuICAgIH1cblxuICAgIGRlY2tzTGlzdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWltRGVjayA9IHRoaXMucGx1Z2luLmRlY2tUcmVlLnN1YmRlY2tzLmZpbHRlcihcbiAgICAgICAgICAgIChkZWNrKSA9PiBkZWNrLmRlY2tOYW1lID09PSB0aGlzLnBsdWdpbi5kYXRhLmhpc3RvcnlEZWNrXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5kYXRhLmhpc3RvcnlEZWNrICYmIGFpbURlY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZGVjayA9IGFpbURlY2tbMF07XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrID0gZGVjaztcbiAgICAgICAgICAgIHRoaXMuY2hlY2tEZWNrID0gZGVjay5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ2FyZHNWaWV3KCk7XG4gICAgICAgICAgICBkZWNrLm5leHRDYXJkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlID0gRmxhc2hjYXJkTW9kYWxNb2RlLkRlY2tzTGlzdDtcbiAgICAgICAgdGhpcy50aXRsZUVsLnNldFRleHQodChcIkRFQ0tTXCIpKTtcbiAgICAgICAgdGhpcy50aXRsZUVsLmlubmVySFRNTCArPSAoXG4gICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjowcHg7bGluZS1oZWlnaHQ6MTJweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzRjYWY1MDtjb2xvcjojZmZmZmZmO1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJEVUVfQ0FSRFNcIil9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnLXBhbmUtdGFnLWNvdW50IHRyZWUtaXRlbS1mbGFpciBzci1kZWNrLWNvdW50c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wbHVnaW4uZGVja1RyZWUuZHVlRmxhc2hjYXJkc0NvdW50LnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojMjE5NmYzO1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJORVdfQ0FSRFNcIil9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnLXBhbmUtdGFnLWNvdW50IHRyZWUtaXRlbS1mbGFpciBzci1kZWNrLWNvdW50c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wbHVnaW4uZGVja1RyZWUubmV3Rmxhc2hjYXJkc0NvdW50LnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojZmY3MDQzO1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJUT1RBTF9DQVJEU1wiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWctcGFuZS10YWctY291bnQgdHJlZS1pdGVtLWZsYWlyIHNyLWRlY2stY291bnRzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnBsdWdpbi5kZWNrVHJlZS50b3RhbEZsYXNoY2FyZHMudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMuY29udGVudEVsLnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItZmxhc2hjYXJkLXZpZXdcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMucGx1Z2luLmRlY2tUcmVlLnN1YmRlY2tzKSB7XG4gICAgICAgICAgICBkZWNrLnJlbmRlcih0aGlzLmNvbnRlbnRFbCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cENhcmRzVmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZW50RWwuZW1wdHkoKTtcblxuICAgICAgICBjb25zdCBmbGFzaENhcmRNZW51ID0gdGhpcy5jb250ZW50RWwuY3JlYXRlRGl2KFwic3ItZmxhc2hjYXJkLW1lbnVcIik7XG5cbiAgICAgICAgY29uc3QgYmFja0J1dHRvbiA9IGZsYXNoQ2FyZE1lbnUuY3JlYXRlRWwoXCJidXR0b25cIik7XG4gICAgICAgIGJhY2tCdXR0b24uYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtbWVudS1pdGVtXCIpO1xuICAgICAgICBzZXRJY29uKGJhY2tCdXR0b24sIFwiYXJyb3ctbGVmdFwiKTtcbiAgICAgICAgYmFja0J1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQoXCJCQUNLXCIpKTtcbiAgICAgICAgYmFja0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5oaXN0b3J5RGVjayA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmRlY2tzTGlzdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVkaXRCdXR0b24gPSBmbGFzaENhcmRNZW51LmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmVkaXRCdXR0b24uYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtbWVudS1pdGVtXCIpO1xuICAgICAgICBzZXRJY29uKHRoaXMuZWRpdEJ1dHRvbiwgXCJlZGl0XCIpO1xuICAgICAgICB0aGlzLmVkaXRCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0KFwiRURJVF9DQVJEXCIpKTtcbiAgICAgICAgdGhpcy5lZGl0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyByZW1vdmUgU1IgaW5mbyBmcm9tIGlucHV0IG1vZGFsIHByb21wdFxuICAgICAgICAgICAgY29uc3QgdGV4dFByb21wdEFyciA9IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICBsZXQgdGV4dFByb21wdCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAodGV4dFByb21wdEFyclt0ZXh0UHJvbXB0QXJyLmxlbmd0aCAtIDFdLnN0YXJ0c1dpdGgoXCI8IS0tU1I6XCIpKSB7XG4gICAgICAgICAgICAgICAgdGV4dFByb21wdCA9IHRleHRQcm9tcHRBcnIuc2xpY2UoMCwgLTEpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHRQcm9tcHQgPSB0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlZGl0TW9kYWwgPSBGbGFzaGNhcmRFZGl0TW9kYWwuUHJvbXB0KHRoaXMuYXBwLCB0aGlzLnBsdWdpbiwgdGV4dFByb21wdCk7XG4gICAgICAgICAgICBlZGl0TW9kYWxcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAobW9kaWZpZWRDYXJkVGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeUNhcmRUZXh0KHRleHRQcm9tcHQsIG1vZGlmaWVkQ2FyZFRleHQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IGNvbnNvbGUubG9nKHJlYXNvbikpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gZmxhc2hDYXJkTWVudS5jcmVhdGVFbChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbi5hZGRDbGFzcyhcInNyLWZsYXNoY2FyZC1tZW51LWl0ZW1cIik7XG4gICAgICAgIHNldEljb24odGhpcy5yZXNldEJ1dHRvbiwgXCJyZWZyZXNoLWN3XCIpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdChcIlJFU0VUX0NBUkRfUFJPR1JFU1NcIikpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuUmVzZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYXJkSW5mbyA9IGZsYXNoQ2FyZE1lbnUuY3JlYXRlRWwoXCJidXR0b25cIik7XG4gICAgICAgIGNhcmRJbmZvLmFkZENsYXNzKFwic3ItZmxhc2hjYXJkLW1lbnUtaXRlbVwiKTtcbiAgICAgICAgc2V0SWNvbihjYXJkSW5mbywgXCJpbmZvXCIpO1xuICAgICAgICBjYXJkSW5mby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiVmlldyBDYXJkIEluZm9cIik7XG4gICAgICAgIGNhcmRJbmZvLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWFzZVN0ciA9XG4gICAgICAgICAgICAgICAgdChcIkNVUlJFTlRfRUFTRV9IRUxQX1RFWFRcIikgKyAodGhpcy5jdXJyZW50Q2FyZC5lYXNlID8/IHQoXCJORVdcIikpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEludGVydmFsU3RyID1cbiAgICAgICAgICAgICAgICB0KFwiQ1VSUkVOVF9JTlRFUlZBTF9IRUxQX1RFWFRcIikgKyB0ZXh0SW50ZXJ2YWwodGhpcy5jdXJyZW50Q2FyZC5pbnRlcnZhbCwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkRnJvbVN0ciA9IHQoXCJDQVJEX0dFTkVSQVRFRF9GUk9NXCIsIHtcbiAgICAgICAgICAgICAgICBub3RlUGF0aDogdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoY3VycmVudEVhc2VTdHIgKyBcIlxcblwiICsgY3VycmVudEludGVydmFsU3RyICsgXCJcXG5cIiArIGdlbmVyYXRlZEZyb21TdHIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBza2lwQnV0dG9uID0gZmxhc2hDYXJkTWVudS5jcmVhdGVFbChcImJ1dHRvblwiKTtcbiAgICAgICAgc2tpcEJ1dHRvbi5hZGRDbGFzcyhcInNyLWZsYXNoY2FyZC1tZW51LWl0ZW1cIik7XG4gICAgICAgIHNldEljb24oc2tpcEJ1dHRvbiwgXCJjaGV2cm9ucy1yaWdodFwiKTtcbiAgICAgICAgc2tpcEJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQoXCJTS0lQXCIpKTtcbiAgICAgICAgc2tpcEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5za2lwQ3VycmVudENhcmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Muc2hvd0NvbnRleHRJbkNhcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRWaWV3ID0gdGhpcy5jb250ZW50RWwuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRWaWV3LnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItY29udGV4dFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmxhc2hjYXJkVmlldyA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdihcImRpdlwiKTtcbiAgICAgICAgdGhpcy5mbGFzaGNhcmRWaWV3LnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItZmxhc2hjYXJkLXZpZXdcIik7XG5cbiAgICAgICAgdGhpcy5yZXNwb25zZURpdiA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdihcInNyLWZsYXNoY2FyZC1yZXNwb25zZVwiKTtcblxuICAgICAgICB0aGlzLmhhcmRCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmhhcmRCdG4uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzci1oYXJkLWJ0blwiKTtcbiAgICAgICAgdGhpcy5oYXJkQnRuLnNldFRleHQodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRIYXJkVGV4dCk7XG4gICAgICAgIHRoaXMuaGFyZEJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmV2aWV3KFJldmlld1Jlc3BvbnNlLkhhcmQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURpdi5hcHBlbmRDaGlsZCh0aGlzLmhhcmRCdG4pO1xuXG4gICAgICAgIHRoaXMuZ29vZEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuZ29vZEJ0bi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInNyLWdvb2QtYnRuXCIpO1xuICAgICAgICB0aGlzLmdvb2RCdG4uc2V0VGV4dCh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEdvb2RUZXh0KTtcbiAgICAgICAgdGhpcy5nb29kQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuR29vZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGl2LmFwcGVuZENoaWxkKHRoaXMuZ29vZEJ0bik7XG5cbiAgICAgICAgdGhpcy5lYXN5QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5lYXN5QnRuLnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItZWFzeS1idG5cIik7XG4gICAgICAgIHRoaXMuZWFzeUJ0bi5zZXRUZXh0KHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkRWFzeVRleHQpO1xuICAgICAgICB0aGlzLmVhc3lCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JldmlldyhSZXZpZXdSZXNwb25zZS5FYXN5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEaXYuYXBwZW5kQ2hpbGQodGhpcy5lYXN5QnRuKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICAgICAgdGhpcy5hbnN3ZXJCdG4gPSB0aGlzLmNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJCdG4uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzci1zaG93LWFuc3dlclwiKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJCdG4uc2V0VGV4dCh0KFwiU0hPV19BTlNXRVJcIikpO1xuICAgICAgICB0aGlzLmFuc3dlckJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93QW5zd2VyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmlnbm9yZVN0YXRzKSB7XG4gICAgICAgICAgICB0aGlzLmdvb2RCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGl2LmFkZENsYXNzKFwic3ItaWdub3Jlc3RhdHMtcmVzcG9uc2VcIik7XG4gICAgICAgICAgICB0aGlzLmVhc3lCdG4uYWRkQ2xhc3MoXCJzci1pZ25vcmVzdGF0cy1idG5cIik7XG4gICAgICAgICAgICB0aGlzLmhhcmRCdG4uYWRkQ2xhc3MoXCJzci1pZ25vcmVzdGF0cy1idG5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vZGlmeUNhcmRUZXh0KG9yaWdpbmFsVGV4dDogc3RyaW5nLCByZXBsYWNlbWVudFRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXJlcGxhY2VtZW50VGV4dCkgcmV0dXJuO1xuICAgICAgICBpZiAocmVwbGFjZW1lbnRUZXh0ID09IG9yaWdpbmFsVGV4dCkgcmV0dXJuO1xuICAgICAgICBsZXQgZmlsZVRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQodGhpcy5jdXJyZW50Q2FyZC5ub3RlKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0UmVnZXggPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ2V4U3RyaW5nKG9yaWdpbmFsVGV4dCksIFwiZ21cIik7XG4gICAgICAgIGZpbGVUZXh0ID0gZmlsZVRleHQucmVwbGFjZShvcmlnaW5hbFRleHRSZWdleCwgcmVwbGFjZW1lbnRUZXh0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KHRoaXMuY3VycmVudENhcmQubm90ZSwgZmlsZVRleHQpO1xuICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgodGhpcy5jdXJyZW50Q2FyZElkeCwgdGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSk7XG4gICAgICAgIHRoaXMuYnVyeVNpYmxpbmdDYXJkcyhmYWxzZSk7XG4gICAgICAgIHRoaXMuY3VycmVudERlY2submV4dENhcmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDbG96ZUJhY2tWaWV3KGlucHV0czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzLCBjb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzLCBjb252ZXJ0Q3VybHlCcmFja2V0c1RvQ2xvemVzIH0gPVxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncztcblxuICAgICAgICBjb25zdCBjbG96ZU1hdGNoZXMgPSB0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0Lm1hdGNoKC89PVxcdys9PS9nKTtcbiAgICAgICAgY29uc3QgY2xvemVzID0gY2xvemVNYXRjaGVzLm1hcCgobWF0Y2gpID0+IG1hdGNoLnJlcGxhY2VBbGwoXCI9PVwiLCBcIlwiKSk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gY2xvemVzLnJlZHVjZSgoYWNjLCBhbnN3ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWNjLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgY2xvemVNYXRjaGVzW2luZGV4XSxcbiAgICAgICAgICAgICAgICBhbnN3ZXIgPT09IGlucHV0c1tpbmRleF1cbiAgICAgICAgICAgICAgICAgICAgPyBgPHNwYW4gc3R5bGU9XCJjb2xvcjogZ3JlZW5cIj4ke2lucHV0c1tpbmRleF19PC9zcGFuPmBcbiAgICAgICAgICAgICAgICAgICAgOiBgWzxzcGFuIHN0eWxlPVwiY29sb3I6IHJlZDsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XCI+JHtpbnB1dHNbaW5kZXhdfTwvc3Bhbj48c3BhbiBzdHlsZT1cImNvbG9yOiBncmVlblwiPiR7YW5zd2VyfTwvc3Bhbj5dYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgdGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dBbnN3ZXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsb3plSW5wdXRGaWVsZHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjbG96ZS1pbnB1dFwiKSk7XG4gICAgICAgIGNvbnN0IGNsb3plSW5wdXRzID0gY2xvemVJbnB1dEZpZWxkcy5tYXAoKGNsb3plSW5wdXQpID0+IGNsb3plSW5wdXQudmFsdWUpO1xuXG4gICAgICAgIHRoaXMubW9kZSA9IEZsYXNoY2FyZE1vZGFsTW9kZS5CYWNrO1xuXG4gICAgICAgIHRoaXMuYW5zd2VyQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgdGhpcy5yZXNwb25zZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJncmlkXCI7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENhcmQuaXNEdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXJkLmNhcmRUeXBlICE9PSBDYXJkVHlwZS5DbG96ZSkge1xuICAgICAgICAgICAgY29uc3QgaHI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImhyXCIpO1xuICAgICAgICAgICAgaHIuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzci1oci1jYXJkLWRpdmlkZVwiKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hjYXJkVmlldy5hcHBlbmRDaGlsZChocik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmJhY2sgPSB0aGlzLmdldENsb3plQmFja1ZpZXcoY2xvemVJbnB1dHMpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaGNhcmRWaWV3LmVtcHR5KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlck1hcmtkb3duV3JhcHBlcih0aGlzLmN1cnJlbnRDYXJkLmJhY2ssIHRoaXMuZmxhc2hjYXJkVmlldyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzUmV2aWV3KHJlc3BvbnNlOiBSZXZpZXdSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pZ25vcmVTdGF0cykge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IFJldmlld1Jlc3BvbnNlLkVhc3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmRJZHgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuaXNEdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXh0Q2FyZCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnRlcnZhbDogbnVtYmVyLCBlYXNlOiBudW1iZXIsIGR1ZTtcblxuICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgodGhpcy5jdXJyZW50Q2FyZElkeCwgdGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSk7XG4gICAgICAgIGlmIChyZXNwb25zZSAhPT0gUmV2aWV3UmVzcG9uc2UuUmVzZXQpIHtcbiAgICAgICAgICAgIGxldCBzY2hlZE9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgICAgICAgIC8vIHNjaGVkdWxlZCBjYXJkXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSkge1xuICAgICAgICAgICAgICAgIHNjaGVkT2JqID0gc2NoZWR1bGUoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmVhc2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuZGVsYXlCZWZvcmVSZXZpZXcsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmR1ZURhdGVzRmxhc2hjYXJkc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsX2Vhc2U6IG51bWJlciA9IHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYmFzZUVhc2U7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5lYXNlQnlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2Vhc2UgPSBNYXRoLnJvdW5kKHRoaXMucGx1Z2luLmVhc2VCeVBhdGhbdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGhdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY2hlZE9iaiA9IHNjaGVkdWxlKFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgMS4wLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2Vhc2UsXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmR1ZURhdGVzRmxhc2hjYXJkc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBzY2hlZE9iai5pbnRlcnZhbDtcbiAgICAgICAgICAgICAgICBlYXNlID0gc2NoZWRPYmouZWFzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzY2hlZE9iai5pbnRlcnZhbDtcbiAgICAgICAgICAgIGVhc2UgPSBzY2hlZE9iai5lYXNlO1xuICAgICAgICAgICAgZHVlID0gd2luZG93Lm1vbWVudChEYXRlLm5vdygpICsgaW50ZXJ2YWwgKiAyNCAqIDM2MDAgKiAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuaW50ZXJ2YWwgPSAxLjA7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmVhc2UgPSB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhcmQuaXNEdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmR1ZUZsYXNoY2FyZHMucHVzaCh0aGlzLmN1cnJlbnRDYXJkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXdGbGFzaGNhcmRzLnB1c2godGhpcy5jdXJyZW50Q2FyZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkdWUgPSB3aW5kb3cubW9tZW50KERhdGUubm93KCkpO1xuICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiQ0FSRF9QUk9HUkVTU19SRVNFVFwiKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLm5leHRDYXJkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVlU3RyaW5nOiBzdHJpbmcgPSBkdWUuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcblxuICAgICAgICBsZXQgZmlsZVRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQodGhpcy5jdXJyZW50Q2FyZC5ub3RlKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZW1lbnRSZWdleCA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnZXhTdHJpbmcodGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCksIFwiZ21cIik7XG5cbiAgICAgICAgbGV0IHNlcDogc3RyaW5nID0gdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jYXJkQ29tbWVudE9uU2FtZUxpbmUgPyBcIiBcIiA6IFwiXFxuXCI7XG4gICAgICAgIC8vIE92ZXJyaWRlIHNlcGFyYXRvciBpZiBsYXN0IGJsb2NrIGlzIGEgY29kZWJsb2NrXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0LmVuZHNXaXRoKFwiYGBgXCIpICYmIHNlcCAhPT0gXCJcXG5cIikge1xuICAgICAgICAgICAgc2VwID0gXCJcXG5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGFkZGluZyBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBmbGFzaGNhcmRcbiAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0Lmxhc3RJbmRleE9mKFwiPCEtLVNSOlwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQgPVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQgKyBzZXAgKyBgPCEtLVNSOiEke2R1ZVN0cmluZ30sJHtpbnRlcnZhbH0sJHtlYXNlfS0tPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGluZzogKFJlZ0V4cE1hdGNoQXJyYXkgfCBzdHJpbmdbXSlbXSA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0Lm1hdGNoQWxsKE1VTFRJX1NDSEVEVUxJTkdfRVhUUkFDVE9SKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsaW5nID0gWy4uLnRoaXMuY3VycmVudENhcmQuY2FyZFRleHQubWF0Y2hBbGwoTEVHQUNZX1NDSEVEVUxJTkdfRVhUUkFDVE9SKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJDYXJkU2NoZWQ6IHN0cmluZ1tdID0gW1wiMFwiLCBkdWVTdHJpbmcsIGludGVydmFsLnRvU3RyaW5nKCksIGVhc2UudG9TdHJpbmcoKV07XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxpbmdbdGhpcy5jdXJyZW50Q2FyZC5zaWJsaW5nSWR4XSA9IGN1cnJDYXJkU2NoZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcucHVzaChjdXJyQ2FyZFNjaGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCA9IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQucmVwbGFjZSgvPCEtLVNSOi4rLS0+L2dtLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQgKz0gXCI8IS0tU1I6XCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0ICs9IGAhJHtzY2hlZHVsaW5nW2ldWzFdfSwke3NjaGVkdWxpbmdbaV1bMl19LCR7c2NoZWR1bGluZ1tpXVszXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCArPSBcIi0tPlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZmlsZVRleHQgPSBmaWxlVGV4dC5yZXBsYWNlKHJlcGxhY2VtZW50UmVnZXgsICgpID0+IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpYmxpbmcgb2YgdGhpcy5jdXJyZW50Q2FyZC5zaWJsaW5ncykge1xuICAgICAgICAgICAgc2libGluZy5jYXJkVGV4dCA9IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYnVyeVNpYmxpbmdDYXJkcykge1xuICAgICAgICAgICAgdGhpcy5idXJ5U2libGluZ0NhcmRzKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KHRoaXMuY3VycmVudENhcmQubm90ZSwgZmlsZVRleHQpO1xuICAgICAgICB0aGlzLmN1cnJlbnREZWNrLm5leHRDYXJkKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYnVyeVNpYmxpbmdDYXJkcyh0aWxsTmV4dERheTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGlsbE5leHREYXkpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuYnVyeUxpc3QucHVzaChjeXJiNTModGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2libGluZyBvZiB0aGlzLmN1cnJlbnRDYXJkLnNpYmxpbmdzKSB7XG4gICAgICAgICAgICBjb25zdCBkdWVJZHggPSB0aGlzLmN1cnJlbnREZWNrLmR1ZUZsYXNoY2FyZHMuaW5kZXhPZihzaWJsaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0lkeCA9IHRoaXMuY3VycmVudERlY2submV3Rmxhc2hjYXJkcy5pbmRleE9mKHNpYmxpbmcpO1xuXG4gICAgICAgICAgICBpZiAoZHVlSWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERlY2suZGVsZXRlRmxhc2hjYXJkQXRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgZHVlSWR4LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmR1ZUZsYXNoY2FyZHNbZHVlSWR4XS5pc0R1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0lkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXdGbGFzaGNhcmRzW25ld0lkeF0uaXNEdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBza2lwQ3VycmVudENhcmQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudERlY2suZGVsZXRlRmxhc2hjYXJkQXRJbmRleCh0aGlzLmN1cnJlbnRDYXJkSWR4LCB0aGlzLmN1cnJlbnRDYXJkLmlzRHVlKTtcbiAgICAgICAgdGhpcy5idXJ5U2libGluZ0NhcmRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXh0Q2FyZCh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSByZW5kZXJNYXJrZG93biBmdW5jdGlvbiBpblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZ21leWVycy9vYnNpZGlhbi1rYW5iYW4vYmxvYi9tYWluL3NyYy9LYW5iYW5WaWV3LnRzeFxuICAgIGFzeW5jIHJlbmRlck1hcmtkb3duV3JhcHBlcihcbiAgICAgICAgbWFya2Rvd25TdHJpbmc6IHN0cmluZyxcbiAgICAgICAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LFxuICAgICAgICByZWN1cnNpdmVEZXB0aCA9IDBcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHJlY3Vyc2l2ZURlcHRoID4gNCkgcmV0dXJuO1xuXG4gICAgICAgIE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oXG4gICAgICAgICAgICBtYXJrZG93blN0cmluZyxcbiAgICAgICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGgsXG4gICAgICAgICAgICB0aGlzLnBsdWdpblxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmZpbmRBbGwoXCIuaW50ZXJuYWwtZW1iZWRcIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLnBhcnNlTGluayhlbC5nZXRBdHRyaWJ1dGUoXCJzcmNcIikpO1xuXG4gICAgICAgICAgICAvLyBmaWxlIGRvZXMgbm90IGV4aXN0LCBkaXNwbGF5IGRlYWQgbGlua1xuICAgICAgICAgICAgaWYgKCFsaW5rLnRhcmdldCkge1xuICAgICAgICAgICAgICAgIGVsLmlubmVyVGV4dCA9IGxpbmsudGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluay50YXJnZXQgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgIGlmIChsaW5rLnRhcmdldC5leHRlbnNpb24gIT09IFwibWRcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkTWVkaWFGaWxlKGVsLCBsaW5rLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5uZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmFuc2NsdWRlKGVsLCBsaW5rLCByZWN1cnNpdmVEZXB0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTGluayhzcmM6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsaW5rQ29tcG9uZW50c1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKD88ZmlsZT5bXiNeXSspPyg/OiMoPyFcXF4pKD88aGVhZGluZz4uKyl8I1xcXig/PGJsb2NrSWQ+LispfCMpPyQvO1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gdHlwZW9mIHNyYyA9PT0gXCJzdHJpbmdcIiAmJiBzcmMubWF0Y2gobGlua0NvbXBvbmVudHNSZWdleCk7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBtYXRjaGVkLmdyb3Vwcy5maWxlIHx8IHRoaXMuY3VycmVudENhcmQubm90ZS5wYXRoO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLm5vdGUucGF0aFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogbWF0Y2hlZFswXSxcbiAgICAgICAgICAgIGZpbGU6IG1hdGNoZWQuZ3JvdXBzLmZpbGUsXG4gICAgICAgICAgICBoZWFkaW5nOiBtYXRjaGVkLmdyb3Vwcy5oZWFkaW5nLFxuICAgICAgICAgICAgYmxvY2tJZDogbWF0Y2hlZC5ncm91cHMuYmxvY2tJZCxcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1iZWRNZWRpYUZpbGUoZWw6IEhUTUxFbGVtZW50LCB0YXJnZXQ6IFRGaWxlKSB7XG4gICAgICAgIGVsLmlubmVyVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChJTUFHRV9GT1JNQVRTLmluY2x1ZGVzKHRhcmdldC5leHRlbnNpb24pKSB7XG4gICAgICAgICAgICBlbC5jcmVhdGVFbChcbiAgICAgICAgICAgICAgICBcImltZ1wiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0UmVzb3VyY2VQYXRoKHRhcmdldCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoaW1nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoXCJ3aWR0aFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBlbC5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaW1nLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkgaW1nLnNldEF0dHJpYnV0ZShcImFsdFwiLCBlbC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGV2KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zdHlsZS5taW5XaWR0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLm1pbldpZHRoID09PSBcIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiMTAwJVwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbC5hZGRDbGFzc2VzKFtcImltYWdlLWVtYmVkXCIsIFwiaXMtbG9hZGVkXCJdKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIEFVRElPX0ZPUk1BVFMuaW5jbHVkZXModGFyZ2V0LmV4dGVuc2lvbikgfHxcbiAgICAgICAgICAgIFZJREVPX0ZPUk1BVFMuaW5jbHVkZXModGFyZ2V0LmV4dGVuc2lvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbC5jcmVhdGVFbChcbiAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRTLmluY2x1ZGVzKHRhcmdldC5leHRlbnNpb24pID8gXCJhdWRpb1wiIDogXCJ2aWRlb1wiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRSZXNvdXJjZVBhdGgodGFyZ2V0KSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChhdWRpbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSBhdWRpby5zZXRBdHRyaWJ1dGUoXCJhbHRcIiwgZWwuZ2V0QXR0cmlidXRlKFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZWwuYWRkQ2xhc3NlcyhbXCJtZWRpYS1lbWJlZFwiLCBcImlzLWxvYWRlZFwiXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbC5pbm5lclRleHQgPSB0YXJnZXQucGF0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVuZGVyVHJhbnNjbHVkZShcbiAgICAgICAgZWw6IEhUTUxFbGVtZW50LFxuICAgICAgICBsaW5rOiB7XG4gICAgICAgICAgICB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlOiBzdHJpbmc7XG4gICAgICAgICAgICBoZWFkaW5nOiBzdHJpbmc7XG4gICAgICAgICAgICBibG9ja0lkOiBzdHJpbmc7XG4gICAgICAgICAgICB0YXJnZXQ6IFRGaWxlO1xuICAgICAgICB9LFxuICAgICAgICByZWN1cnNpdmVEZXB0aDogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShsaW5rLnRhcmdldC5wYXRoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQobGluay50YXJnZXQpO1xuICAgICAgICBsZXQgYmxvY2tUZXh0O1xuICAgICAgICBpZiAobGluay5oZWFkaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjbGVhbiA9IChzOiBzdHJpbmcpID0+IHMucmVwbGFjZSgvW1xcV1xcc10vZywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCBoZWFkaW5nSW5kZXggPSBjYWNoZS5oZWFkaW5ncz8uZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIChoKSA9PiBjbGVhbihoLmhlYWRpbmcpID09PSBjbGVhbihsaW5rLmhlYWRpbmcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZyA9IGNhY2hlLmhlYWRpbmdzW2hlYWRpbmdJbmRleF07XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0QXQgPSBoZWFkaW5nLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IGVuZEF0ID1cbiAgICAgICAgICAgICAgICBjYWNoZS5oZWFkaW5ncy5zbGljZShoZWFkaW5nSW5kZXggKyAxKS5maW5kKChoKSA9PiBoLmxldmVsIDw9IGhlYWRpbmcubGV2ZWwpXG4gICAgICAgICAgICAgICAgICAgID8ucG9zaXRpb24/LnN0YXJ0Py5vZmZzZXQgfHwgdGV4dC5sZW5ndGg7XG5cbiAgICAgICAgICAgIGJsb2NrVGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0QXQsIGVuZEF0KTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5rLmJsb2NrSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gY2FjaGUuYmxvY2tzW2xpbmsuYmxvY2tJZF07XG4gICAgICAgICAgICBjb25zdCBzdGFydEF0ID0gYmxvY2sucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgZW5kQXQgPSBibG9jay5wb3NpdGlvbi5lbmQub2Zmc2V0O1xuICAgICAgICAgICAgYmxvY2tUZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnRBdCwgZW5kQXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2tUZXh0ID0gdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyTWFya2Rvd25XcmFwcGVyKGJsb2NrVGV4dCwgZWwsIHJlY3Vyc2l2ZURlcHRoICsgMSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVjayB7XG4gICAgcHVibGljIGRlY2tOYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIG5ld0ZsYXNoY2FyZHM6IENhcmRbXTtcbiAgICBwdWJsaWMgbmV3Rmxhc2hjYXJkc0NvdW50ID0gMDsgLy8gY291bnRzIHRob3NlIGluIHN1YmRlY2tzIHRvb1xuICAgIHB1YmxpYyBkdWVGbGFzaGNhcmRzOiBDYXJkW107XG4gICAgcHVibGljIGR1ZUZsYXNoY2FyZHNDb3VudCA9IDA7IC8vIGNvdW50cyB0aG9zZSBpbiBzdWJkZWNrcyB0b29cbiAgICBwdWJsaWMgdG90YWxGbGFzaGNhcmRzID0gMDsgLy8gY291bnRzIHRob3NlIGluIHN1YmRlY2tzIHRvb1xuICAgIHB1YmxpYyBzdWJkZWNrczogRGVja1tdO1xuICAgIHB1YmxpYyBwYXJlbnQ6IERlY2sgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoZGVja05hbWU6IHN0cmluZywgcGFyZW50OiBEZWNrIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmRlY2tOYW1lID0gZGVja05hbWU7XG4gICAgICAgIHRoaXMubmV3Rmxhc2hjYXJkcyA9IFtdO1xuICAgICAgICB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZHVlRmxhc2hjYXJkcyA9IFtdO1xuICAgICAgICB0aGlzLmR1ZUZsYXNoY2FyZHNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMudG90YWxGbGFzaGNhcmRzID0gMDtcbiAgICAgICAgdGhpcy5zdWJkZWNrcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICBjcmVhdGVEZWNrKGRlY2tQYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoZGVja1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNrTmFtZTogc3RyaW5nID0gZGVja1BhdGguc2hpZnQoKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMuc3ViZGVja3MpIHtcbiAgICAgICAgICAgIGlmIChkZWNrTmFtZSA9PT0gZGVjay5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIGRlY2suY3JlYXRlRGVjayhkZWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjazogRGVjayA9IG5ldyBEZWNrKGRlY2tOYW1lLCB0aGlzKTtcbiAgICAgICAgdGhpcy5zdWJkZWNrcy5wdXNoKGRlY2spO1xuICAgICAgICBkZWNrLmNyZWF0ZURlY2soZGVja1BhdGgpO1xuICAgIH1cblxuICAgIGluc2VydEZsYXNoY2FyZChkZWNrUGF0aDogc3RyaW5nW10sIGNhcmRPYmo6IENhcmQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNhcmRPYmouaXNEdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZHVlRmxhc2hjYXJkc0NvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG90YWxGbGFzaGNhcmRzKys7XG5cbiAgICAgICAgaWYgKGRlY2tQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGNhcmRPYmouaXNEdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmR1ZUZsYXNoY2FyZHMucHVzaChjYXJkT2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdGbGFzaGNhcmRzLnB1c2goY2FyZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNrTmFtZTogc3RyaW5nID0gZGVja1BhdGguc2hpZnQoKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMuc3ViZGVja3MpIHtcbiAgICAgICAgICAgIGlmIChkZWNrTmFtZSA9PT0gZGVjay5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIGRlY2suaW5zZXJ0Rmxhc2hjYXJkKGRlY2tQYXRoLCBjYXJkT2JqKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb3VudCBmbGFzaGNhcmRzIHRoYXQgaGF2ZSBlaXRoZXIgYmVlbiBidXJpZWRcbiAgICAvLyBvciBhcmVuJ3QgZHVlIHlldFxuICAgIGNvdW50Rmxhc2hjYXJkKGRlY2tQYXRoOiBzdHJpbmdbXSwgbiA9IDEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3RhbEZsYXNoY2FyZHMgKz0gbjtcblxuICAgICAgICBjb25zdCBkZWNrTmFtZTogc3RyaW5nID0gZGVja1BhdGguc2hpZnQoKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMuc3ViZGVja3MpIHtcbiAgICAgICAgICAgIGlmIChkZWNrTmFtZSA9PT0gZGVjay5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIGRlY2suY291bnRGbGFzaGNhcmQoZGVja1BhdGgsIG4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgoaW5kZXg6IG51bWJlciwgY2FyZElzRHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChjYXJkSXNEdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZHVlRmxhc2hjYXJkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kdWVGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmV3Rmxhc2hjYXJkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5uZXdGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWNrOiBEZWNrID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIHdoaWxlIChkZWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY2FyZElzRHVlKSB7XG4gICAgICAgICAgICAgICAgZGVjay5kdWVGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVjay5uZXdGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY2sgPSBkZWNrLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRTdWJkZWNrc0xpc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3ViZGVja3Muc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKGEuZGVja05hbWUgPCBiLmRlY2tOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLmRlY2tOYW1lID4gYi5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgZGVjayBvZiB0aGlzLnN1YmRlY2tzKSB7XG4gICAgICAgICAgICBkZWNrLnNvcnRTdWJkZWNrc0xpc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcihjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIG1vZGFsOiBGbGFzaGNhcmRNb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWNrVmlldzogSFRNTEVsZW1lbnQgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoXCJ0cmVlLWl0ZW1cIik7XG5cbiAgICAgICAgY29uc3QgZGVja1ZpZXdTZWxmOiBIVE1MRWxlbWVudCA9IGRlY2tWaWV3LmNyZWF0ZURpdihcbiAgICAgICAgICAgIFwidHJlZS1pdGVtLXNlbGYgdGFnLXBhbmUtdGFnIGlzLWNsaWNrYWJsZVwiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlSW5pdGlhbGx5RXhwYW5kZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgbW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MuaW5pdGlhbGx5RXhwYW5kQWxsU3ViZGVja3NJblRyZWU7XG4gICAgICAgIGxldCBjb2xsYXBzZWQgPSBzaG91bGRCZUluaXRpYWxseUV4cGFuZGVkO1xuICAgICAgICBsZXQgY29sbGFwc2VJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnN1YmRlY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbGxhcHNlSWNvbkVsID0gZGVja1ZpZXdTZWxmLmNyZWF0ZURpdihcInRyZWUtaXRlbS1pY29uIGNvbGxhcHNlLWljb25cIik7XG4gICAgICAgICAgICBjb2xsYXBzZUljb25FbC5pbm5lckhUTUwgPSBDT0xMQVBTRV9JQ09OO1xuICAgICAgICAgICAgKGNvbGxhcHNlSWNvbkVsLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnRyYW5zZm9ybSA9XG4gICAgICAgICAgICAgICAgc2hvdWxkQmVJbml0aWFsbHlFeHBhbmRlZCA/IFwiXCIgOiBcInJvdGF0ZSgtOTBkZWcpXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNrVmlld0lubmVyOiBIVE1MRWxlbWVudCA9IGRlY2tWaWV3U2VsZi5jcmVhdGVEaXYoXCJ0cmVlLWl0ZW0taW5uZXJcIik7XG4gICAgICAgIGRlY2tWaWV3SW5uZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIG1vZGFsLnBsdWdpbi5kYXRhLmhpc3RvcnlEZWNrID0gdGhpcy5kZWNrTmFtZTtcbiAgICAgICAgICAgIG1vZGFsLmN1cnJlbnREZWNrID0gdGhpcztcbiAgICAgICAgICAgIG1vZGFsLmNoZWNrRGVjayA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgbW9kYWwuc2V0dXBDYXJkc1ZpZXcoKTtcbiAgICAgICAgICAgIHRoaXMubmV4dENhcmQobW9kYWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGVja1ZpZXdJbm5lclRleHQ6IEhUTUxFbGVtZW50ID0gZGVja1ZpZXdJbm5lci5jcmVhdGVEaXYoXCJ0YWctcGFuZS10YWctdGV4dFwiKTtcbiAgICAgICAgZGVja1ZpZXdJbm5lclRleHQuaW5uZXJIVE1MICs9IDxzcGFuIGNsYXNzPVwidGFnLXBhbmUtdGFnLXNlbGZcIj57dGhpcy5kZWNrTmFtZX08L3NwYW4+O1xuICAgICAgICBjb25zdCBkZWNrVmlld091dGVyOiBIVE1MRWxlbWVudCA9IGRlY2tWaWV3U2VsZi5jcmVhdGVEaXYoXCJ0cmVlLWl0ZW0tZmxhaXItb3V0ZXJcIik7XG4gICAgICAgIGRlY2tWaWV3T3V0ZXIuaW5uZXJIVE1MICs9IChcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNGNhZjUwO1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnLXBhbmUtdGFnLWNvdW50IHRyZWUtaXRlbS1mbGFpciBzci1kZWNrLWNvdW50c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5kdWVGbGFzaGNhcmRzQ291bnQudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMyMTk2ZjM7XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWctcGFuZS10YWctY291bnQgdHJlZS1pdGVtLWZsYWlyIHNyLWRlY2stY291bnRzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudC50b1N0cmluZygpfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6I2ZmNzA0MztcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhZy1wYW5lLXRhZy1jb3VudCB0cmVlLWl0ZW0tZmxhaXIgc3ItZGVjay1jb3VudHNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMudG90YWxGbGFzaGNhcmRzLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlY2tWaWV3Q2hpbGRyZW46IEhUTUxFbGVtZW50ID0gZGVja1ZpZXcuY3JlYXRlRGl2KFwidHJlZS1pdGVtLWNoaWxkcmVuXCIpO1xuICAgICAgICBkZWNrVmlld0NoaWxkcmVuLnN0eWxlLmRpc3BsYXkgPSBzaG91bGRCZUluaXRpYWxseUV4cGFuZGVkID8gXCJibG9ja1wiIDogXCJub25lXCI7XG4gICAgICAgIGlmICh0aGlzLnN1YmRlY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbGxhcHNlSWNvbkVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAoY29sbGFwc2VJY29uRWwuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGVja1ZpZXdDaGlsZHJlbi5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIChjb2xsYXBzZUljb25FbC5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5zdHlsZS50cmFuc2Zvcm0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyb3RhdGUoLTkwZGVnKVwiO1xuICAgICAgICAgICAgICAgICAgICBkZWNrVmlld0NoaWxkcmVuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sbGFwc2VkID0gIWNvbGxhcHNlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgZGVjayBvZiB0aGlzLnN1YmRlY2tzKSB7XG4gICAgICAgICAgICBkZWNrLnJlbmRlcihkZWNrVmlld0NoaWxkcmVuLCBtb2RhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Q2FyZChtb2RhbDogRmxhc2hjYXJkTW9kYWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmV3Rmxhc2hjYXJkcy5sZW5ndGggKyB0aGlzLmR1ZUZsYXNoY2FyZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdWVGbGFzaGNhcmRzQ291bnQgKyB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlY2sgb2YgdGhpcy5zdWJkZWNrcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjay5kdWVGbGFzaGNhcmRzQ291bnQgKyBkZWNrLm5ld0ZsYXNoY2FyZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnREZWNrID0gZGVjaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2submV4dENhcmQobW9kYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgPT0gbW9kYWwuY2hlY2tEZWNrKSB7XG4gICAgICAgICAgICAgICAgbW9kYWwucGx1Z2luLmRhdGEuaGlzdG9yeURlY2sgPSBcIlwiO1xuICAgICAgICAgICAgICAgIG1vZGFsLmRlY2tzTGlzdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5uZXh0Q2FyZChtb2RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtb2RhbC5yZXNwb25zZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIG1vZGFsLnJlc2V0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgbW9kYWwudGl0bGVFbC5zZXRUZXh0KFxuICAgICAgICAgICAgYCR7dGhpcy5kZWNrTmFtZX06ICR7dGhpcy5kdWVGbGFzaGNhcmRzQ291bnQgKyB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudH1gXG4gICAgICAgICk7XG5cbiAgICAgICAgbW9kYWwuYW5zd2VyQnRuLnN0eWxlLmRpc3BsYXkgPSBcImluaXRpYWxcIjtcbiAgICAgICAgbW9kYWwuZmxhc2hjYXJkVmlldy5lbXB0eSgpO1xuICAgICAgICBtb2RhbC5tb2RlID0gRmxhc2hjYXJkTW9kYWxNb2RlLkZyb250O1xuXG4gICAgICAgIGxldCBpbnRlcnZhbCA9IDEuMCxcbiAgICAgICAgICAgIGVhc2U6IG51bWJlciA9IG1vZGFsLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlLFxuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcgPSAwO1xuICAgICAgICBpZiAodGhpcy5kdWVGbGFzaGNhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChtb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5yYW5kb21pemVDYXJkT3JkZXIpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZElkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuZHVlRmxhc2hjYXJkcy5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZElkeCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZCA9IHRoaXMuZHVlRmxhc2hjYXJkc1ttb2RhbC5jdXJyZW50Q2FyZElkeF07XG4gICAgICAgICAgICBtb2RhbC5yZW5kZXJNYXJrZG93bldyYXBwZXIobW9kYWwuY3VycmVudENhcmQuZnJvbnQsIG1vZGFsLmZsYXNoY2FyZFZpZXcpO1xuXG4gICAgICAgICAgICBpbnRlcnZhbCA9IG1vZGFsLmN1cnJlbnRDYXJkLmludGVydmFsO1xuICAgICAgICAgICAgZWFzZSA9IG1vZGFsLmN1cnJlbnRDYXJkLmVhc2U7XG4gICAgICAgICAgICBkZWxheUJlZm9yZVJldmlldyA9IG1vZGFsLmN1cnJlbnRDYXJkLmRlbGF5QmVmb3JlUmV2aWV3O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmV3Rmxhc2hjYXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAobW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MucmFuZG9taXplQ2FyZE9yZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlja2VkQ2FyZElkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubmV3Rmxhc2hjYXJkcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnRDYXJkSWR4ID0gcGlja2VkQ2FyZElkeDtcblxuICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGZpcnN0IHVuc2NoZWR1bGVkIHNpYmxpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBwaWNrZWRDYXJkOiBDYXJkID0gdGhpcy5uZXdGbGFzaGNhcmRzW3BpY2tlZENhcmRJZHhdO1xuICAgICAgICAgICAgICAgIGxldCBpZHggPSBwaWNrZWRDYXJkSWR4O1xuICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPj0gMCAmJiBwaWNrZWRDYXJkLnNpYmxpbmdzLmluY2x1ZGVzKHRoaXMubmV3Rmxhc2hjYXJkc1tpZHhdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmV3Rmxhc2hjYXJkc1tpZHhdLmlzRHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZElkeCA9IGlkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZHgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnRDYXJkSWR4ID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kYWwuY3VycmVudENhcmQgPSB0aGlzLm5ld0ZsYXNoY2FyZHNbbW9kYWwuY3VycmVudENhcmRJZHhdO1xuICAgICAgICAgICAgbW9kYWwucmVuZGVyTWFya2Rvd25XcmFwcGVyKG1vZGFsLmN1cnJlbnRDYXJkLmZyb250LCBtb2RhbC5mbGFzaGNhcmRWaWV3KTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucGx1Z2luLmVhc2VCeVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnRDYXJkLm5vdGUucGF0aFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGVhc2UgPSBtb2RhbC5wbHVnaW4uZWFzZUJ5UGF0aFttb2RhbC5jdXJyZW50Q2FyZC5ub3RlLnBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFyZEludGVydmFsOiBudW1iZXIgPSBzY2hlZHVsZShcbiAgICAgICAgICAgIFJldmlld1Jlc3BvbnNlLkhhcmQsXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIGVhc2UsXG4gICAgICAgICAgICBkZWxheUJlZm9yZVJldmlldyxcbiAgICAgICAgICAgIG1vZGFsLnBsdWdpbi5kYXRhLnNldHRpbmdzXG4gICAgICAgICkuaW50ZXJ2YWw7XG4gICAgICAgIGNvbnN0IGdvb2RJbnRlcnZhbDogbnVtYmVyID0gc2NoZWR1bGUoXG4gICAgICAgICAgICBSZXZpZXdSZXNwb25zZS5Hb29kLFxuICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICBlYXNlLFxuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcsXG4gICAgICAgICAgICBtb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5nc1xuICAgICAgICApLmludGVydmFsO1xuICAgICAgICBjb25zdCBlYXN5SW50ZXJ2YWw6IG51bWJlciA9IHNjaGVkdWxlKFxuICAgICAgICAgICAgUmV2aWV3UmVzcG9uc2UuRWFzeSxcbiAgICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgICAgZWFzZSxcbiAgICAgICAgICAgIGRlbGF5QmVmb3JlUmV2aWV3LFxuICAgICAgICAgICAgbW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3NcbiAgICAgICAgKS5pbnRlcnZhbDtcblxuICAgICAgICBpZiAobW9kYWwuaWdub3JlU3RhdHMpIHtcbiAgICAgICAgICAgIC8vIFNhbWUgZm9yIG1vYmlsZS9kZXNrdG9wXG4gICAgICAgICAgICBtb2RhbC5oYXJkQnRuLnNldFRleHQoYCR7bW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkSGFyZFRleHR9YCk7XG4gICAgICAgICAgICBtb2RhbC5lYXN5QnRuLnNldFRleHQoYCR7bW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkRWFzeVRleHR9YCk7XG4gICAgICAgIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIG1vZGFsLmhhcmRCdG4uc2V0VGV4dCh0ZXh0SW50ZXJ2YWwoaGFyZEludGVydmFsLCB0cnVlKSk7XG4gICAgICAgICAgICBtb2RhbC5nb29kQnRuLnNldFRleHQodGV4dEludGVydmFsKGdvb2RJbnRlcnZhbCwgdHJ1ZSkpO1xuICAgICAgICAgICAgbW9kYWwuZWFzeUJ0bi5zZXRUZXh0KHRleHRJbnRlcnZhbChlYXN5SW50ZXJ2YWwsIHRydWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGFsLmhhcmRCdG4uc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgJHttb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRIYXJkVGV4dH0gLSAke3RleHRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgaGFyZEludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vZGFsLmdvb2RCdG4uc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgJHttb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRHb29kVGV4dH0gLSAke3RleHRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgZ29vZEludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vZGFsLmVhc3lCdG4uc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgJHttb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRFYXN5VGV4dH0gLSAke3RleHRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgZWFzeUludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaG93Q29udGV4dEluQ2FyZHMpXG4gICAgICAgICAgICBtb2RhbC5jb250ZXh0Vmlldy5zZXRUZXh0KG1vZGFsLmN1cnJlbnRDYXJkLmNvbnRleHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyBTUlNldHRpbmdzIH0gZnJvbSBcInNyYy9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCJzcmMvbGFuZy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBlbnVtIFJldmlld1Jlc3BvbnNlIHtcbiAgICBFYXN5LFxuICAgIEdvb2QsXG4gICAgSGFyZCxcbiAgICBSZXNldCxcbn1cblxuLy8gRmxhc2hjYXJkc1xuXG5leHBvcnQgaW50ZXJmYWNlIENhcmQge1xuICAgIGVkaXRMYXRlcjogYm9vbGVhbjtcbiAgICAvLyBzY2hlZHVsaW5nXG4gICAgaXNEdWU6IGJvb2xlYW47XG4gICAgaW50ZXJ2YWw/OiBudW1iZXI7XG4gICAgZWFzZT86IG51bWJlcjtcbiAgICBkZWxheUJlZm9yZVJldmlldz86IG51bWJlcjtcbiAgICAvLyBub3RlXG4gICAgbm90ZTogVEZpbGU7XG4gICAgbGluZU5vOiBudW1iZXI7XG4gICAgLy8gdmlzdWFsc1xuICAgIGZyb250OiBzdHJpbmc7XG4gICAgYmFjazogc3RyaW5nO1xuICAgIGNhcmRUZXh0OiBzdHJpbmc7XG4gICAgY29udGV4dDogc3RyaW5nO1xuICAgIC8vIHR5cGVzXG4gICAgY2FyZFR5cGU6IENhcmRUeXBlO1xuICAgIC8vIGluZm9ybWF0aW9uIGZvciBzaWJsaW5nIGNhcmRzXG4gICAgc2libGluZ0lkeDogbnVtYmVyO1xuICAgIHNpYmxpbmdzOiBDYXJkW107XG59XG5cbmV4cG9ydCBlbnVtIENhcmRUeXBlIHtcbiAgICBTaW5nbGVMaW5lQmFzaWMsXG4gICAgU2luZ2xlTGluZVJldmVyc2VkLFxuICAgIE11bHRpTGluZUJhc2ljLFxuICAgIE11bHRpTGluZVJldmVyc2VkLFxuICAgIENsb3plLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGUoXG4gICAgcmVzcG9uc2U6IFJldmlld1Jlc3BvbnNlLFxuICAgIGludGVydmFsOiBudW1iZXIsXG4gICAgZWFzZTogbnVtYmVyLFxuICAgIGRlbGF5QmVmb3JlUmV2aWV3OiBudW1iZXIsXG4gICAgc2V0dGluZ3NPYmo6IFNSU2V0dGluZ3MsXG4gICAgZHVlRGF0ZXM/OiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+XG4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBkZWxheUJlZm9yZVJldmlldyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoZGVsYXlCZWZvcmVSZXZpZXcgLyAoMjQgKiAzNjAwICogMTAwMCkpKTtcblxuICAgIGlmIChyZXNwb25zZSA9PT0gUmV2aWV3UmVzcG9uc2UuRWFzeSkge1xuICAgICAgICBlYXNlICs9IDIwO1xuICAgICAgICBpbnRlcnZhbCA9ICgoaW50ZXJ2YWwgKyBkZWxheUJlZm9yZVJldmlldykgKiBlYXNlKSAvIDEwMDtcbiAgICAgICAgaW50ZXJ2YWwgKj0gc2V0dGluZ3NPYmouZWFzeUJvbnVzO1xuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UgPT09IFJldmlld1Jlc3BvbnNlLkdvb2QpIHtcbiAgICAgICAgaW50ZXJ2YWwgPSAoKGludGVydmFsICsgZGVsYXlCZWZvcmVSZXZpZXcgLyAyKSAqIGVhc2UpIC8gMTAwO1xuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UgPT09IFJldmlld1Jlc3BvbnNlLkhhcmQpIHtcbiAgICAgICAgZWFzZSA9IE1hdGgubWF4KDEzMCwgZWFzZSAtIDIwKTtcbiAgICAgICAgaW50ZXJ2YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAoaW50ZXJ2YWwgKyBkZWxheUJlZm9yZVJldmlldyAvIDQpICogc2V0dGluZ3NPYmoubGFwc2VzSW50ZXJ2YWxDaGFuZ2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZXBsYWNlcyByYW5kb20gZnV6eiB3aXRoIGxvYWQgYmFsYW5jaW5nIG92ZXIgdGhlIGZ1enogaW50ZXJ2YWxcbiAgICBpZiAoZHVlRGF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnRlcnZhbCA9IE1hdGgucm91bmQoaW50ZXJ2YWwpO1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkdWVEYXRlcywgaW50ZXJ2YWwpKSB7XG4gICAgICAgICAgICBkdWVEYXRlc1tpbnRlcnZhbF0gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlzYWJsZSBmdXp6aW5nIGZvciBzbWFsbCBpbnRlcnZhbHNcbiAgICAgICAgICAgIGlmIChpbnRlcnZhbCA+IDQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnV6eiA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGludGVydmFsIDwgNykgZnV6eiA9IDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaW50ZXJ2YWwgPCAzMCkgZnV6eiA9IE1hdGgubWF4KDIsIE1hdGguZmxvb3IoaW50ZXJ2YWwgKiAwLjE1KSk7XG4gICAgICAgICAgICAgICAgZWxzZSBmdXp6ID0gTWF0aC5tYXgoNCwgTWF0aC5mbG9vcihpbnRlcnZhbCAqIDAuMDUpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgICAgICAgICAgICAgICBvdXRlcjogZm9yIChsZXQgaSA9IDE7IGkgPD0gZnV6ejsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXZsIG9mIFtvcmlnaW5hbEludGVydmFsIC0gaSwgb3JpZ2luYWxJbnRlcnZhbCArIGldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkdWVEYXRlcywgaXZsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZURhdGVzW2l2bF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gaXZsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1ZURhdGVzW2l2bF0gPCBkdWVEYXRlc1tpbnRlcnZhbF0pIGludGVydmFsID0gaXZsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZHVlRGF0ZXNbaW50ZXJ2YWxdKys7XG4gICAgfVxuXG4gICAgaW50ZXJ2YWwgPSBNYXRoLm1pbihpbnRlcnZhbCwgc2V0dGluZ3NPYmoubWF4aW11bUludGVydmFsKTtcblxuICAgIHJldHVybiB7IGludGVydmFsOiBNYXRoLnJvdW5kKGludGVydmFsICogMTApIC8gMTAsIGVhc2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRleHRJbnRlcnZhbChpbnRlcnZhbDogbnVtYmVyLCBpc01vYmlsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGludGVydmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHQoXCJORVdcIik7XG4gICAgfVxuXG4gICAgY29uc3QgbTogbnVtYmVyID0gTWF0aC5yb3VuZChpbnRlcnZhbCAvIDMuMDQzNzUpIC8gMTAsXG4gICAgICAgIHk6IG51bWJlciA9IE1hdGgucm91bmQoaW50ZXJ2YWwgLyAzNi41MjUpIC8gMTA7XG5cbiAgICBpZiAoaXNNb2JpbGUpIHtcbiAgICAgICAgaWYgKG0gPCAxLjApIHJldHVybiB0KFwiREFZU19TVFJfSVZMX01PQklMRVwiLCB7IGludGVydmFsIH0pO1xuICAgICAgICBlbHNlIGlmICh5IDwgMS4wKSByZXR1cm4gdChcIk1PTlRIU19TVFJfSVZMX01PQklMRVwiLCB7IGludGVydmFsOiBtIH0pO1xuICAgICAgICBlbHNlIHJldHVybiB0KFwiWUVBUlNfU1RSX0lWTF9NT0JJTEVcIiwgeyBpbnRlcnZhbDogeSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobSA8IDEuMCkgcmV0dXJuIHQoXCJEQVlTX1NUUl9JVkxcIiwgeyBpbnRlcnZhbCB9KTtcbiAgICAgICAgZWxzZSBpZiAoeSA8IDEuMCkgcmV0dXJuIHQoXCJNT05USFNfU1RSX0lWTFwiLCB7IGludGVydmFsOiBtIH0pO1xuICAgICAgICBlbHNlIHJldHVybiB0KFwiWUVBUlNfU1RSX0lWTFwiLCB7IGludGVydmFsOiB5IH0pO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgU0NIRURVTElOR19JTkZPX1JFR0VYID1cbiAgICAvXi0tLVxcbigoPzouKlxcbikqKXNyLWR1ZTogKC4rKVxcbnNyLWludGVydmFsOiAoXFxkKylcXG5zci1lYXNlOiAoXFxkKylcXG4oKD86LipcXG4pPyktLS0vO1xuZXhwb3J0IGNvbnN0IFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYID0gL14tLS1cXG4oKD86LipcXG4pKj8pLS0tLztcblxuZXhwb3J0IGNvbnN0IE1VTFRJX1NDSEVEVUxJTkdfRVhUUkFDVE9SID0gLyEoW1xcZC1dKyksKFxcZCspLChcXGQrKS9nbTtcbmV4cG9ydCBjb25zdCBMRUdBQ1lfU0NIRURVTElOR19FWFRSQUNUT1IgPSAvPCEtLVNSOihbXFxkLV0rKSwoXFxkKyksKFxcZCspLS0+L2dtO1xuXG5leHBvcnQgY29uc3QgSU1BR0VfRk9STUFUUyA9IFtcbiAgICBcImpwZ1wiLFxuICAgIFwianBlZ1wiLFxuICAgIFwiZ2lmXCIsXG4gICAgXCJwbmdcIixcbiAgICBcInN2Z1wiLFxuICAgIFwid2VicFwiLFxuICAgIFwiYXBuZ1wiLFxuICAgIFwiYXZpZlwiLFxuICAgIFwiamZpZlwiLFxuICAgIFwicGpwZWdcIixcbiAgICBcInBqcFwiLFxuICAgIFwiYm1wXCIsXG5dO1xuZXhwb3J0IGNvbnN0IEFVRElPX0ZPUk1BVFMgPSBbXCJtcDNcIiwgXCJ3ZWJtXCIsIFwibTRhXCIsIFwid2F2XCIsIFwib2dnXCJdO1xuZXhwb3J0IGNvbnN0IFZJREVPX0ZPUk1BVFMgPSBbXCJtcDRcIiwgXCJta3ZcIiwgXCJhdmlcIiwgXCJtb3ZcIl07XG5cbmV4cG9ydCBjb25zdCBDT0xMQVBTRV9JQ09OID1cbiAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgY2xhc3M9XCJyaWdodC10cmlhbmdsZVwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTk0LjksMjAuOGMtMS40LTIuNS00LjEtNC4xLTcuMS00LjFIMTIuMmMtMywwLTUuNywxLjYtNy4xLDQuMWMtMS4zLDIuNC0xLjIsNS4yLDAuMiw3LjZMNDMuMSw4OGMxLjUsMi4zLDQsMy43LDYuOSwzLjcgczUuNC0xLjQsNi45LTMuN2wzNy44LTU5LjZDOTYuMSwyNiw5Ni4yLDIzLjIsOTQuOSwyMC44TDk0LjksMjAuOHpcIj48L3BhdGg+PC9zdmc+JztcbiIsICJ0eXBlIEhleCA9IG51bWJlcjtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY5MDE5ODc0XG50eXBlIE9iamVjdFR5cGUgPSBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+O1xudHlwZSBQaWNrQnlWYWx1ZTxPQkpfVCwgVkFMVUVfVD4gPSAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTUxNTMwMDBcbiAgICBQaWNrPE9CSl9ULCB7IFtLIGluIGtleW9mIE9CSl9UXTogT0JKX1RbS10gZXh0ZW5kcyBWQUxVRV9UID8gSyA6IG5ldmVyIH1ba2V5b2YgT0JKX1RdPjtcbnR5cGUgT2JqZWN0RW50cmllczxPQkpfVD4gPSAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjAxNDIwOTVcbiAgICB7IFtLIGluIGtleW9mIE9CSl9UXTogW2tleW9mIFBpY2tCeVZhbHVlPE9CSl9ULCBPQkpfVFtLXT4sIE9CSl9UW0tdXSB9W2tleW9mIE9CSl9UXVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVkT2JqZWN0RW50cmllczxPQkpfVCBleHRlbmRzIE9iamVjdFR5cGU+KG9iajogT0JKX1QpOiBPYmplY3RFbnRyaWVzPE9CSl9UPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikgYXMgT2JqZWN0RW50cmllczxPQkpfVD47XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUga2V5cyBvZiBhbiBvYmplY3Qgd2l0aCB0eXBlIGAoa2V5b2YgVClbXWBcbiAqIGluc3RlYWQgb2YgYHN0cmluZ1tdYFxuICogUGxlYXNlIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTk0NTkwMDAgZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSBvYmogLSBBbiBvYmplY3RcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHRoZSBrZXlzIG9mIGBvYmpgIHdpdGggdHlwZSBgKGtleW9mIFQpW11gXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRLZXlzUHJlc2VydmVUeXBlID0gT2JqZWN0LmtleXMgYXMgPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgb2JqOiBUXG4pID0+IEFycmF5PGtleW9mIFQ+O1xuXG4vKipcbiAqIEVzY2FwZXMgdGhlIGlucHV0IHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSByZWdleFxuICogd2hpbGUgbWFraW5nIHN1cmUgdGhhdCBzeW1ib2xzIGxpa2UgYD9gIGFuZCBgKmAgYXJlbid0IGludGVycHJldGVkXG4gKiBhcyByZWdleCBzcGVjaWFscy5cbiAqIFBsZWFzZSBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY5Njk0ODYgZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIGJlIGVzY2FwZWRcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgZXNjYXBlUmVnZXhTdHJpbmcgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgdGV4dC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3lyYjUzIGhhc2ggKGhleCBzdHJpbmcpIG9mIHRoZSBpbnB1dCBzdHJpbmdcbiAqIFBsZWFzZSBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUyMTcxNDgwIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBiZSBoYXNoZWRcbiAqIEBwYXJhbSBzZWVkIC0gVGhlIHNlZWQgZm9yIHRoZSBjeXJiNTMgZnVuY3Rpb25cbiAqIEByZXR1cm5zIFRoZSBjeXJiNTMgaGFzaCAoaGV4IHN0cmluZykgb2YgYHN0cmAgc2VlZGVkIHVzaW5nIGBzZWVkYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3lyYjUzKHN0cjogc3RyaW5nLCBzZWVkID0gMCk6IHN0cmluZyB7XG4gICAgbGV0IGgxOiBIZXggPSAweGRlYWRiZWVmIF4gc2VlZCxcbiAgICAgICAgaDI6IEhleCA9IDB4NDFjNmNlNTcgXiBzZWVkO1xuICAgIGZvciAobGV0IGkgPSAwLCBjaDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjaCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoMSA9IE1hdGguaW11bChoMSBeIGNoLCAyNjU0NDM1NzYxKTtcbiAgICAgICAgaDIgPSBNYXRoLmltdWwoaDIgXiBjaCwgMTU5NzMzNDY3Nyk7XG4gICAgfVxuICAgIGgxID0gTWF0aC5pbXVsKGgxIF4gKGgxID4+PiAxNiksIDIyNDY4MjI1MDcpIF4gTWF0aC5pbXVsKGgyIF4gKGgyID4+PiAxMyksIDMyNjY0ODk5MDkpO1xuICAgIGgyID0gTWF0aC5pbXVsKGgyIF4gKGgyID4+PiAxNiksIDIyNDY4MjI1MDcpIF4gTWF0aC5pbXVsKGgxIF4gKGgxID4+PiAxMyksIDMyNjY0ODk5MDkpO1xuICAgIHJldHVybiAoNDI5NDk2NzI5NiAqICgyMDk3MTUxICYgaDIpICsgKGgxID4+PiAwKSkudG9TdHJpbmcoMTYpO1xufVxuIiwgImltcG9ydCB7IE1vZGFsLCBBcHAsIFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbXBvcnQgaCBmcm9tIFwidmh0bWxcIjtcbmltcG9ydCB7XG4gICAgQ2hhcnQsXG4gICAgQmFyRWxlbWVudCxcbiAgICBCYXJDb250cm9sbGVyLFxuICAgIExlZ2VuZCxcbiAgICBUaXRsZSxcbiAgICBUb29sdGlwLFxuICAgIFN1YlRpdGxlLFxuICAgIENoYXJ0VHlwZVJlZ2lzdHJ5LFxuICAgIENhdGVnb3J5U2NhbGUsXG4gICAgTGluZWFyU2NhbGUsXG4gICAgUGllQ29udHJvbGxlcixcbiAgICBBcmNFbGVtZW50LFxufSBmcm9tIFwiY2hhcnQuanNcIjtcblxuaW1wb3J0IHR5cGUgU1JQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyBnZXRLZXlzUHJlc2VydmVUeXBlLCBnZXRUeXBlZE9iamVjdEVudHJpZXMgfSBmcm9tIFwic3JjL3V0aWxzXCI7XG5pbXBvcnQgeyB0ZXh0SW50ZXJ2YWwgfSBmcm9tIFwic3JjL3NjaGVkdWxpbmdcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwic3JjL2xhbmcvaGVscGVyc1wiO1xuXG5DaGFydC5yZWdpc3RlcihcbiAgICBCYXJFbGVtZW50LFxuICAgIEJhckNvbnRyb2xsZXIsXG4gICAgTGVnZW5kLFxuICAgIFRpdGxlLFxuICAgIFRvb2x0aXAsXG4gICAgU3ViVGl0bGUsXG4gICAgQ2F0ZWdvcnlTY2FsZSxcbiAgICBMaW5lYXJTY2FsZSxcbiAgICBQaWVDb250cm9sbGVyLFxuICAgIEFyY0VsZW1lbnRcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHMge1xuICAgIGVhc2VzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+O1xuICAgIGludGVydmFsczogUmVjb3JkPG51bWJlciwgbnVtYmVyPjtcbiAgICBuZXdDb3VudDogbnVtYmVyO1xuICAgIHlvdW5nQ291bnQ6IG51bWJlcjtcbiAgICBtYXR1cmVDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhdHNNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBwcml2YXRlIHBsdWdpbjogU1JQbHVnaW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTUlBsdWdpbikge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG4gICAgICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KGAke3QoXCJTVEFUU19USVRMRVwiKX0gYCk7XG4gICAgICAgIHRoaXMudGl0bGVFbC5hZGRDbGFzcyhcInNyLWNlbnRlcmVkXCIpO1xuICAgICAgICB0aGlzLnRpdGxlRWwuaW5uZXJIVE1MICs9IChcbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzci1jaGFydC1wZXJpb2RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhcIiBzZWxlY3RlZD5cbiAgICAgICAgICAgICAgICAgICAge3QoXCJNT05USFwiKX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicXVhcnRlclwiPnt0KFwiUVVBUlRFUlwiKX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiPnt0KFwiWUVBUlwiKX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGlmZXRpbWVcIj57dChcIkxJRkVUSU1FXCIpfTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5tb2RhbEVsLnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xuICAgICAgICB0aGlzLm1vZGFsRWwuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcblxuICAgICAgICBpZiAoUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk9wZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgICAgICBjb250ZW50RWwuc3R5bGUudGV4dEFsaWduID0gXCJjZW50ZXJcIjtcblxuICAgICAgICAvLyBBZGQgZm9yZWNhc3RcbiAgICAgICAgbGV0IG1heE46IG51bWJlciA9IE1hdGgubWF4KC4uLmdldEtleXNQcmVzZXJ2ZVR5cGUodGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzKSk7XG4gICAgICAgIGZvciAobGV0IGR1ZU9mZnNldCA9IDA7IGR1ZU9mZnNldCA8PSBtYXhOOyBkdWVPZmZzZXQrKykge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzLCBkdWVPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzW2R1ZU9mZnNldF0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVlRGF0ZXNGbGFzaGNhcmRzQ29weTogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHsgMDogMCB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtkdWVPZmZzZXQsIGR1ZUNvdW50XSBvZiBnZXRUeXBlZE9iamVjdEVudHJpZXModGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzKSkge1xuICAgICAgICAgICAgaWYgKGR1ZU9mZnNldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgZHVlRGF0ZXNGbGFzaGNhcmRzQ29weVswXSArPSBkdWVDb3VudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVlRGF0ZXNGbGFzaGNhcmRzQ29weVtkdWVPZmZzZXRdID0gZHVlQ291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJkU3RhdHM6IFN0YXRzID0gdGhpcy5wbHVnaW4uY2FyZFN0YXRzO1xuICAgICAgICBjb25zdCBzY2hlZHVsZWRDb3VudDogbnVtYmVyID0gY2FyZFN0YXRzLnlvdW5nQ291bnQgKyBjYXJkU3RhdHMubWF0dXJlQ291bnQ7XG4gICAgICAgIG1heE4gPSBNYXRoLm1heChtYXhOLCAxKTtcblxuICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MICs9IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGNhbnZhcyBpZD1cImZvcmVjYXN0Q2hhcnRcIj48L2NhbnZhcz5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImZvcmVjYXN0Q2hhcnRTdW1tYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJpbnRlcnZhbHNDaGFydFwiPjwvY2FudmFzPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwiaW50ZXJ2YWxzQ2hhcnRTdW1tYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJlYXNlc0NoYXJ0XCI+PC9jYW52YXM+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJlYXNlc0NoYXJ0U3VtbWFyeVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPVwiY2FyZFR5cGVzQ2hhcnRcIj48L2NhbnZhcz5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImNhcmRUeXBlc0NoYXJ0U3VtbWFyeVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuXG4gICAgICAgIGNyZWF0ZVN0YXRzQ2hhcnQoXG4gICAgICAgICAgICBcImJhclwiLFxuICAgICAgICAgICAgXCJmb3JlY2FzdENoYXJ0XCIsXG4gICAgICAgICAgICB0KFwiRk9SRUNBU1RcIiksXG4gICAgICAgICAgICB0KFwiRk9SRUNBU1RfREVTQ1wiKSxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGR1ZURhdGVzRmxhc2hjYXJkc0NvcHkpLFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhkdWVEYXRlc0ZsYXNoY2FyZHNDb3B5KSxcbiAgICAgICAgICAgIHQoXCJSRVZJRVdTX1BFUl9EQVlcIiwgeyBhdmc6IChzY2hlZHVsZWRDb3VudCAvIG1heE4pLnRvRml4ZWQoMSkgfSksXG4gICAgICAgICAgICB0KFwiU0NIRURVTEVEXCIpLFxuICAgICAgICAgICAgdChcIkRBWVNcIiksXG4gICAgICAgICAgICB0KFwiTlVNQkVSX09GX0NBUkRTXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgbWF4TiA9IE1hdGgubWF4KC4uLmdldEtleXNQcmVzZXJ2ZVR5cGUoY2FyZFN0YXRzLmludGVydmFscykpO1xuICAgICAgICBmb3IgKGxldCBpbnRlcnZhbCA9IDA7IGludGVydmFsIDw9IG1heE47IGludGVydmFsKyspIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhcmRTdGF0cy5pbnRlcnZhbHMsIGludGVydmFsKSkge1xuICAgICAgICAgICAgICAgIGNhcmRTdGF0cy5pbnRlcnZhbHNbaW50ZXJ2YWxdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBpbnRlcnZhbHNcbiAgICAgICAgY29uc3QgYXZlcmFnZV9pbnRlcnZhbDogc3RyaW5nID0gdGV4dEludGVydmFsKFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgIChnZXRUeXBlZE9iamVjdEVudHJpZXMoY2FyZFN0YXRzLmludGVydmFscylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtpbnRlcnZhbCwgY291bnRdKSA9PiBpbnRlcnZhbCAqIGNvdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZENvdW50KSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICkgLyAxMCB8fCAwLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbG9uZ2VzdF9pbnRlcnZhbDogc3RyaW5nID0gdGV4dEludGVydmFsKFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KC4uLmdldEtleXNQcmVzZXJ2ZVR5cGUoY2FyZFN0YXRzLmludGVydmFscykpIHx8IDAsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY3JlYXRlU3RhdHNDaGFydChcbiAgICAgICAgICAgIFwiYmFyXCIsXG4gICAgICAgICAgICBcImludGVydmFsc0NoYXJ0XCIsXG4gICAgICAgICAgICB0KFwiSU5URVJWQUxTXCIpLFxuICAgICAgICAgICAgdChcIklOVEVSVkFMU19ERVNDXCIpLFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY2FyZFN0YXRzLmludGVydmFscyksXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGNhcmRTdGF0cy5pbnRlcnZhbHMpLFxuICAgICAgICAgICAgdChcIklOVEVSVkFMU19TVU1NQVJZXCIsIHsgYXZnOiBhdmVyYWdlX2ludGVydmFsLCBsb25nZXN0OiBsb25nZXN0X2ludGVydmFsIH0pLFxuICAgICAgICAgICAgdChcIkNPVU5UXCIpLFxuICAgICAgICAgICAgdChcIkRBWVNcIiksXG4gICAgICAgICAgICB0KFwiTlVNQkVSX09GX0NBUkRTXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWRkIGVhc2VzXG4gICAgICAgIGNvbnN0IGVhc2VzOiBudW1iZXJbXSA9IGdldEtleXNQcmVzZXJ2ZVR5cGUoY2FyZFN0YXRzLmVhc2VzKTtcbiAgICAgICAgZm9yIChsZXQgZWFzZSA9IE1hdGgubWluKC4uLmVhc2VzKTsgZWFzZSA8PSBNYXRoLm1heCguLi5lYXNlcyk7IGVhc2UrKykge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2FyZFN0YXRzLmVhc2VzLCBlYXNlKSkge1xuICAgICAgICAgICAgICAgIGNhcmRTdGF0cy5lYXNlc1tlYXNlXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZlcmFnZV9lYXNlOiBudW1iZXIgPVxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICBnZXRUeXBlZE9iamVjdEVudHJpZXMoY2FyZFN0YXRzLmVhc2VzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbZWFzZSwgY291bnRdKSA9PiBlYXNlICogY291bnQpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHNjaGVkdWxlZENvdW50XG4gICAgICAgICAgICApIHx8IDA7XG5cbiAgICAgICAgY3JlYXRlU3RhdHNDaGFydChcbiAgICAgICAgICAgIFwiYmFyXCIsXG4gICAgICAgICAgICBcImVhc2VzQ2hhcnRcIixcbiAgICAgICAgICAgIHQoXCJFQVNFU1wiKSxcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXJkU3RhdHMuZWFzZXMpLFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXJkU3RhdHMuZWFzZXMpLFxuICAgICAgICAgICAgdChcIkVBU0VTX1NVTU1BUllcIiwgeyBhdmdFYXNlOiBhdmVyYWdlX2Vhc2UgfSksXG4gICAgICAgICAgICB0KFwiQ09VTlRcIiksXG4gICAgICAgICAgICB0KFwiRUFTRVNcIiksXG4gICAgICAgICAgICB0KFwiTlVNQkVSX09GX0NBUkRTXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWRkIGNhcmQgdHlwZXNcbiAgICAgICAgY29uc3QgdG90YWxDYXJkc0NvdW50OiBudW1iZXIgPSB0aGlzLnBsdWdpbi5kZWNrVHJlZS50b3RhbEZsYXNoY2FyZHM7XG4gICAgICAgIGNyZWF0ZVN0YXRzQ2hhcnQoXG4gICAgICAgICAgICBcInBpZVwiLFxuICAgICAgICAgICAgXCJjYXJkVHlwZXNDaGFydFwiLFxuICAgICAgICAgICAgdChcIkNBUkRfVFlQRVNcIiksXG4gICAgICAgICAgICB0KFwiQ0FSRF9UWVBFU19ERVNDXCIpLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGAke3QoXCJDQVJEX1RZUEVfTkVXXCIpfSAtICR7TWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgKGNhcmRTdGF0cy5uZXdDb3VudCAvIHRvdGFsQ2FyZHNDb3VudCkgKiAxMDBcbiAgICAgICAgICAgICAgICApfSVgLFxuICAgICAgICAgICAgICAgIGAke3QoXCJDQVJEX1RZUEVfWU9VTkdcIil9IC0gJHtNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICAgICAoY2FyZFN0YXRzLnlvdW5nQ291bnQgLyB0b3RhbENhcmRzQ291bnQpICogMTAwXG4gICAgICAgICAgICAgICAgKX0lYCxcbiAgICAgICAgICAgICAgICBgJHt0KFwiQ0FSRF9UWVBFX01BVFVSRVwiKX0gLSAke01hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgIChjYXJkU3RhdHMubWF0dXJlQ291bnQgLyB0b3RhbENhcmRzQ291bnQpICogMTAwXG4gICAgICAgICAgICAgICAgKX0lYCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbY2FyZFN0YXRzLm5ld0NvdW50LCBjYXJkU3RhdHMueW91bmdDb3VudCwgY2FyZFN0YXRzLm1hdHVyZUNvdW50XSxcbiAgICAgICAgICAgIHQoXCJDQVJEX1RZUEVTX1NVTU1BUllcIiwgeyB0b3RhbENhcmRzQ291bnQgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0c0NoYXJ0KFxuICAgIHR5cGU6IGtleW9mIENoYXJ0VHlwZVJlZ2lzdHJ5LFxuICAgIGNhbnZhc0lkOiBzdHJpbmcsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBzdWJ0aXRsZTogc3RyaW5nLFxuICAgIGxhYmVsczogc3RyaW5nW10sXG4gICAgZGF0YTogbnVtYmVyW10sXG4gICAgc3VtbWFyeTogc3RyaW5nLFxuICAgIHNlcmllc1RpdGxlID0gXCJcIixcbiAgICB4QXhpc1RpdGxlID0gXCJcIixcbiAgICB5QXhpc1RpdGxlID0gXCJcIlxuKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xuICAgIGNvbnN0IHRleHRDb2xvciA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXRleHQtbm9ybWFsXCIpO1xuXG4gICAgbGV0IHNjYWxlcyA9IHt9LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBbXCIjMjE5NmYzXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInBpZVwiKSB7XG4gICAgICAgIHNjYWxlcyA9IHtcbiAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB4QXhpc1RpdGxlLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHlBeGlzVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yID0gW1wiIzIxOTZmM1wiLCBcIiM0Y2FmNTBcIiwgXCJncmVlblwiXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRGaWx0ZXIgPSBjYW52YXNJZCA9PT0gXCJmb3JlY2FzdENoYXJ0XCIgfHwgY2FudmFzSWQgPT09IFwiaW50ZXJ2YWxzQ2hhcnRcIjtcblxuICAgIGNvbnN0IHN0YXRzQ2hhcnQgPSBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzSWQpIGFzIEhUTUxDYW52YXNFbGVtZW50LCB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGxhYmVsczogc2hvdWxkRmlsdGVyID8gbGFiZWxzLnNsaWNlKDAsIDMxKSA6IGxhYmVscyxcbiAgICAgICAgICAgIGRhdGFzZXRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogc2VyaWVzVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2hvdWxkRmlsdGVyID8gZGF0YS5zbGljZSgwLCAzMSkgOiBkYXRhLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBzY2FsZXMsXG4gICAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDIyLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VidGl0bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogc3VidGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IFwiaXRhbGljXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3BlY3RSYXRpbzogMixcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChzaG91bGRGaWx0ZXIpIHtcbiAgICAgICAgY29uc3QgY2hhcnRQZXJpb2RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3ItY2hhcnQtcGVyaW9kXCIpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICBjaGFydFBlcmlvZEVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRMYWJlbHMsIGZpbHRlcmVkRGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJ0UGVyaW9kID0gY2hhcnRQZXJpb2RFbC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChjaGFydFBlcmlvZCA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRMYWJlbHMgPSBsYWJlbHMuc2xpY2UoMCwgMzEpO1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGRhdGEuc2xpY2UoMCwgMzEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFydFBlcmlvZCA9PT0gXCJxdWFydGVyXCIpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZExhYmVscyA9IGxhYmVscy5zbGljZSgwLCA5MSk7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZGF0YS5zbGljZSgwLCA5MSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJ0UGVyaW9kID09PSBcInllYXJcIikge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkTGFiZWxzID0gbGFiZWxzLnNsaWNlKDAsIDM2Nik7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZGF0YS5zbGljZSgwLCAzNjYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZExhYmVscyA9IGxhYmVscztcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0c0NoYXJ0LmRhdGEubGFiZWxzID0gZmlsdGVyZWRMYWJlbHM7XG4gICAgICAgICAgICBzdGF0c0NoYXJ0LmRhdGEuZGF0YXNldHNbMF0gPSB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHNlcmllc1RpdGxlLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICBkYXRhOiBmaWx0ZXJlZERhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc3RhdHNDaGFydC51cGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7Y2FudmFzSWR9U3VtbWFyeWApLmlubmVyVGV4dCA9IHN1bW1hcnk7XG59XG4iLCAiLyohXG4gKiBAa3Vya2xlL2NvbG9yIHYwLjMuMlxuICogaHR0cHM6Ly9naXRodWIuY29tL2t1cmtsZS9jb2xvciNyZWFkbWVcbiAqIChjKSAyMDIzIEp1a2thIEt1cmtlbGFcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5mdW5jdGlvbiByb3VuZCh2KSB7XG4gIHJldHVybiB2ICsgMC41IHwgMDtcbn1cbmNvbnN0IGxpbSA9ICh2LCBsLCBoKSA9PiBNYXRoLm1heChNYXRoLm1pbih2LCBoKSwgbCk7XG5mdW5jdGlvbiBwMmIodikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgKiAyLjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpLCAwLCAxMDApO1xufVxuZnVuY3Rpb24gbjJiKHYpIHtcbiAgcmV0dXJuIGxpbShyb3VuZCh2ICogMjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIybih2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpIC8gMTAwLCAwLCAxKTtcbn1cbmZ1bmN0aW9uIG4ycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAqIDEwMCksIDAsIDEwMCk7XG59XG5cbmNvbnN0IG1hcCQxID0gezA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksIEE6IDEwLCBCOiAxMSwgQzogMTIsIEQ6IDEzLCBFOiAxNCwgRjogMTUsIGE6IDEwLCBiOiAxMSwgYzogMTIsIGQ6IDEzLCBlOiAxNCwgZjogMTV9O1xuY29uc3QgaGV4ID0gWy4uLicwMTIzNDU2Nzg5QUJDREVGJ107XG5jb25zdCBoMSA9IGIgPT4gaGV4W2IgJiAweEZdO1xuY29uc3QgaDIgPSBiID0+IGhleFsoYiAmIDB4RjApID4+IDRdICsgaGV4W2IgJiAweEZdO1xuY29uc3QgZXEgPSBiID0+ICgoYiAmIDB4RjApID4+IDQpID09PSAoYiAmIDB4Rik7XG5jb25zdCBpc1Nob3J0ID0gdiA9PiBlcSh2LnIpICYmIGVxKHYuZykgJiYgZXEodi5iKSAmJiBlcSh2LmEpO1xuZnVuY3Rpb24gaGV4UGFyc2Uoc3RyKSB7XG4gIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICB2YXIgcmV0O1xuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAobGVuID09PSA0IHx8IGxlbiA9PT0gNSkge1xuICAgICAgcmV0ID0ge1xuICAgICAgICByOiAyNTUgJiBtYXAkMVtzdHJbMV1dICogMTcsXG4gICAgICAgIGc6IDI1NSAmIG1hcCQxW3N0clsyXV0gKiAxNyxcbiAgICAgICAgYjogMjU1ICYgbWFwJDFbc3RyWzNdXSAqIDE3LFxuICAgICAgICBhOiBsZW4gPT09IDUgPyBtYXAkMVtzdHJbNF1dICogMTcgOiAyNTVcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChsZW4gPT09IDcgfHwgbGVuID09PSA5KSB7XG4gICAgICByZXQgPSB7XG4gICAgICAgIHI6IG1hcCQxW3N0clsxXV0gPDwgNCB8IG1hcCQxW3N0clsyXV0sXG4gICAgICAgIGc6IG1hcCQxW3N0clszXV0gPDwgNCB8IG1hcCQxW3N0cls0XV0sXG4gICAgICAgIGI6IG1hcCQxW3N0cls1XV0gPDwgNCB8IG1hcCQxW3N0cls2XV0sXG4gICAgICAgIGE6IGxlbiA9PT0gOSA/IChtYXAkMVtzdHJbN11dIDw8IDQgfCBtYXAkMVtzdHJbOF1dKSA6IDI1NVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGFscGhhID0gKGEsIGYpID0+IGEgPCAyNTUgPyBmKGEpIDogJyc7XG5mdW5jdGlvbiBoZXhTdHJpbmcodikge1xuICB2YXIgZiA9IGlzU2hvcnQodikgPyBoMSA6IGgyO1xuICByZXR1cm4gdlxuICAgID8gJyMnICsgZih2LnIpICsgZih2LmcpICsgZih2LmIpICsgYWxwaGEodi5hLCBmKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBIVUVfUkUgPSAvXihoc2xhP3xod2J8aHN2KVxcKFxccyooWy0rLmVcXGRdKykoPzpkZWcpP1tcXHMsXSsoWy0rLmVcXGRdKyklW1xccyxdKyhbLSsuZVxcZF0rKSUoPzpbXFxzLF0rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gaHNsMnJnYm4oaCwgcywgbCkge1xuICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcbiAgY29uc3QgZiA9IChuLCBrID0gKG4gKyBoIC8gMzApICUgMTIpID0+IGwgLSBhICogTWF0aC5tYXgoTWF0aC5taW4oayAtIDMsIDkgLSBrLCAxKSwgLTEpO1xuICByZXR1cm4gW2YoMCksIGYoOCksIGYoNCldO1xufVxuZnVuY3Rpb24gaHN2MnJnYm4oaCwgcywgdikge1xuICBjb25zdCBmID0gKG4sIGsgPSAobiArIGggLyA2MCkgJSA2KSA9PiB2IC0gdiAqIHMgKiBNYXRoLm1heChNYXRoLm1pbihrLCA0IC0gaywgMSksIDApO1xuICByZXR1cm4gW2YoNSksIGYoMyksIGYoMSldO1xufVxuZnVuY3Rpb24gaHdiMnJnYm4oaCwgdywgYikge1xuICBjb25zdCByZ2IgPSBoc2wycmdibihoLCAxLCAwLjUpO1xuICBsZXQgaTtcbiAgaWYgKHcgKyBiID4gMSkge1xuICAgIGkgPSAxIC8gKHcgKyBiKTtcbiAgICB3ICo9IGk7XG4gICAgYiAqPSBpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICByZ2JbaV0gKj0gMSAtIHcgLSBiO1xuICAgIHJnYltpXSArPSB3O1xuICB9XG4gIHJldHVybiByZ2I7XG59XG5mdW5jdGlvbiBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpIHtcbiAgaWYgKHIgPT09IG1heCkge1xuICAgIHJldHVybiAoKGcgLSBiKSAvIGQpICsgKGcgPCBiID8gNiA6IDApO1xuICB9XG4gIGlmIChnID09PSBtYXgpIHtcbiAgICByZXR1cm4gKGIgLSByKSAvIGQgKyAyO1xuICB9XG4gIHJldHVybiAociAtIGcpIC8gZCArIDQ7XG59XG5mdW5jdGlvbiByZ2IyaHNsKHYpIHtcbiAgY29uc3QgcmFuZ2UgPSAyNTU7XG4gIGNvbnN0IHIgPSB2LnIgLyByYW5nZTtcbiAgY29uc3QgZyA9IHYuZyAvIHJhbmdlO1xuICBjb25zdCBiID0gdi5iIC8gcmFuZ2U7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgY29uc3QgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgbGV0IGgsIHMsIGQ7XG4gIGlmIChtYXggIT09IG1pbikge1xuICAgIGQgPSBtYXggLSBtaW47XG4gICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgIGggPSBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpO1xuICAgIGggPSBoICogNjAgKyAwLjU7XG4gIH1cbiAgcmV0dXJuIFtoIHwgMCwgcyB8fCAwLCBsXTtcbn1cbmZ1bmN0aW9uIGNhbGxuKGYsIGEsIGIsIGMpIHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KGEpXG4gICAgICA/IGYoYVswXSwgYVsxXSwgYVsyXSlcbiAgICAgIDogZihhLCBiLCBjKVxuICApLm1hcChuMmIpO1xufVxuZnVuY3Rpb24gaHNsMnJnYihoLCBzLCBsKSB7XG4gIHJldHVybiBjYWxsbihoc2wycmdibiwgaCwgcywgbCk7XG59XG5mdW5jdGlvbiBod2IycmdiKGgsIHcsIGIpIHtcbiAgcmV0dXJuIGNhbGxuKGh3YjJyZ2JuLCBoLCB3LCBiKTtcbn1cbmZ1bmN0aW9uIGhzdjJyZ2IoaCwgcywgdikge1xuICByZXR1cm4gY2FsbG4oaHN2MnJnYm4sIGgsIHMsIHYpO1xufVxuZnVuY3Rpb24gaHVlKGgpIHtcbiAgcmV0dXJuIChoICUgMzYwICsgMzYwKSAlIDM2MDtcbn1cbmZ1bmN0aW9uIGh1ZVBhcnNlKHN0cikge1xuICBjb25zdCBtID0gSFVFX1JFLmV4ZWMoc3RyKTtcbiAgbGV0IGEgPSAyNTU7XG4gIGxldCB2O1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1bNV0gIT09IHYpIHtcbiAgICBhID0gbVs2XSA/IHAyYigrbVs1XSkgOiBuMmIoK21bNV0pO1xuICB9XG4gIGNvbnN0IGggPSBodWUoK21bMl0pO1xuICBjb25zdCBwMSA9ICttWzNdIC8gMTAwO1xuICBjb25zdCBwMiA9ICttWzRdIC8gMTAwO1xuICBpZiAobVsxXSA9PT0gJ2h3YicpIHtcbiAgICB2ID0gaHdiMnJnYihoLCBwMSwgcDIpO1xuICB9IGVsc2UgaWYgKG1bMV0gPT09ICdoc3YnKSB7XG4gICAgdiA9IGhzdjJyZ2IoaCwgcDEsIHAyKTtcbiAgfSBlbHNlIHtcbiAgICB2ID0gaHNsMnJnYihoLCBwMSwgcDIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcjogdlswXSxcbiAgICBnOiB2WzFdLFxuICAgIGI6IHZbMl0sXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcm90YXRlKHYsIGRlZykge1xuICB2YXIgaCA9IHJnYjJoc2wodik7XG4gIGhbMF0gPSBodWUoaFswXSArIGRlZyk7XG4gIGggPSBoc2wycmdiKGgpO1xuICB2LnIgPSBoWzBdO1xuICB2LmcgPSBoWzFdO1xuICB2LmIgPSBoWzJdO1xufVxuZnVuY3Rpb24gaHNsU3RyaW5nKHYpIHtcbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGEgPSByZ2IyaHNsKHYpO1xuICBjb25zdCBoID0gYVswXTtcbiAgY29uc3QgcyA9IG4ycChhWzFdKTtcbiAgY29uc3QgbCA9IG4ycChhWzJdKTtcbiAgcmV0dXJuIHYuYSA8IDI1NVxuICAgID8gYGhzbGEoJHtofSwgJHtzfSUsICR7bH0lLCAke2Iybih2LmEpfSlgXG4gICAgOiBgaHNsKCR7aH0sICR7c30lLCAke2x9JSlgO1xufVxuXG5jb25zdCBtYXAgPSB7XG4gIHg6ICdkYXJrJyxcbiAgWjogJ2xpZ2h0JyxcbiAgWTogJ3JlJyxcbiAgWDogJ2JsdScsXG4gIFc6ICdncicsXG4gIFY6ICdtZWRpdW0nLFxuICBVOiAnc2xhdGUnLFxuICBBOiAnZWUnLFxuICBUOiAnb2wnLFxuICBTOiAnb3InLFxuICBCOiAncmEnLFxuICBDOiAnbGF0ZWcnLFxuICBEOiAnaWdodHMnLFxuICBSOiAnaW4nLFxuICBROiAndHVycXVvaXMnLFxuICBFOiAnaGknLFxuICBQOiAncm8nLFxuICBPOiAnYWwnLFxuICBOOiAnbGUnLFxuICBNOiAnZGUnLFxuICBMOiAneWVsbG8nLFxuICBGOiAnZW4nLFxuICBLOiAnY2gnLFxuICBHOiAnYXJrcycsXG4gIEg6ICdlYScsXG4gIEk6ICdpZ2h0ZycsXG4gIEo6ICd3aCdcbn07XG5jb25zdCBuYW1lcyQxID0ge1xuICBPaWNlWGU6ICdmMGY4ZmYnLFxuICBhbnRpcXVld0V0ZTogJ2ZhZWJkNycsXG4gIGFxdWE6ICdmZmZmJyxcbiAgYXF1YW1hclJlOiAnN2ZmZmQ0JyxcbiAgYXp1WTogJ2YwZmZmZicsXG4gIGJlaWdlOiAnZjVmNWRjJyxcbiAgYmlzcXVlOiAnZmZlNGM0JyxcbiAgYmxhY2s6ICcwJyxcbiAgYmxhbktlZE9tb25kOiAnZmZlYmNkJyxcbiAgWGU6ICdmZicsXG4gIFhldmlUZXQ6ICc4YTJiZTInLFxuICBiUHduOiAnYTUyYTJhJyxcbiAgYnVybHl3b29kOiAnZGViODg3JyxcbiAgY2FNdFhlOiAnNWY5ZWEwJyxcbiAgS2FydFl1c2U6ICc3ZmZmMDAnLFxuICBLb2NUYXRlOiAnZDI2OTFlJyxcbiAgY1NPOiAnZmY3ZjUwJyxcbiAgY1NuZmxvd2VyWGU6ICc2NDk1ZWQnLFxuICBjU25zaWxrOiAnZmZmOGRjJyxcbiAgY3JpbXNvbjogJ2RjMTQzYycsXG4gIGN5YW46ICdmZmZmJyxcbiAgeFhlOiAnOGInLFxuICB4Y3lhbjogJzhiOGInLFxuICB4Z1RNblBkOiAnYjg4NjBiJyxcbiAgeFdheTogJ2E5YTlhOScsXG4gIHhnWUY6ICc2NDAwJyxcbiAgeGdZeTogJ2E5YTlhOScsXG4gIHhraGFraTogJ2JkYjc2YicsXG4gIHhtYWdGdGE6ICc4YjAwOGInLFxuICB4VGl2ZWdZRjogJzU1NmIyZicsXG4gIHhTYW5nZTogJ2ZmOGMwMCcsXG4gIHhTY0VkOiAnOTkzMmNjJyxcbiAgeFlkOiAnOGIwMDAwJyxcbiAgeHNPbW9uOiAnZTk5NjdhJyxcbiAgeHNIZ1lGOiAnOGZiYzhmJyxcbiAgeFVYZTogJzQ4M2Q4YicsXG4gIHhVV2F5OiAnMmY0ZjRmJyxcbiAgeFVnWXk6ICcyZjRmNGYnLFxuICB4UWU6ICdjZWQxJyxcbiAgeHZpVGV0OiAnOTQwMGQzJyxcbiAgZEFwcFJrOiAnZmYxNDkzJyxcbiAgZEFwc2t5WGU6ICdiZmZmJyxcbiAgZGltV2F5OiAnNjk2OTY5JyxcbiAgZGltZ1l5OiAnNjk2OTY5JyxcbiAgZG9kZ2VyWGU6ICcxZTkwZmYnLFxuICBmaVlicmljazogJ2IyMjIyMicsXG4gIGZsU093RXRlOiAnZmZmYWYwJyxcbiAgZm9Zc3RXQW46ICcyMjhiMjInLFxuICBmdUtzaWE6ICdmZjAwZmYnLFxuICBnYVJzYlNvOiAnZGNkY2RjJyxcbiAgZ2hvc3R3RXRlOiAnZjhmOGZmJyxcbiAgZ1RkOiAnZmZkNzAwJyxcbiAgZ1RNblBkOiAnZGFhNTIwJyxcbiAgV2F5OiAnODA4MDgwJyxcbiAgZ1lGOiAnODAwMCcsXG4gIGdZRkx3OiAnYWRmZjJmJyxcbiAgZ1l5OiAnODA4MDgwJyxcbiAgaG9uZXlNdzogJ2YwZmZmMCcsXG4gIGhvdHBSazogJ2ZmNjliNCcsXG4gIFJkaWFuWWQ6ICdjZDVjNWMnLFxuICBSZGlnbzogJzRiMDA4MicsXG4gIGl2U3k6ICdmZmZmZjAnLFxuICBraGFraTogJ2YwZTY4YycsXG4gIGxhdkZNcjogJ2U2ZTZmYScsXG4gIGxhdkZNclhzaDogJ2ZmZjBmNScsXG4gIGxhd25nWUY6ICc3Y2ZjMDAnLFxuICBObW9uY0VmZm9uOiAnZmZmYWNkJyxcbiAgWlhlOiAnYWRkOGU2JyxcbiAgWmNTTzogJ2YwODA4MCcsXG4gIFpjeWFuOiAnZTBmZmZmJyxcbiAgWmdUTW5QZEx3OiAnZmFmYWQyJyxcbiAgWldheTogJ2QzZDNkMycsXG4gIFpnWUY6ICc5MGVlOTAnLFxuICBaZ1l5OiAnZDNkM2QzJyxcbiAgWnBSazogJ2ZmYjZjMScsXG4gIFpzT21vbjogJ2ZmYTA3YScsXG4gIFpzSGdZRjogJzIwYjJhYScsXG4gIFpza3lYZTogJzg3Y2VmYScsXG4gIFpVV2F5OiAnNzc4ODk5JyxcbiAgWlVnWXk6ICc3Nzg4OTknLFxuICBac3RBbFhlOiAnYjBjNGRlJyxcbiAgWkx3OiAnZmZmZmUwJyxcbiAgbGltZTogJ2ZmMDAnLFxuICBsaW1lZ1lGOiAnMzJjZDMyJyxcbiAgbFJGOiAnZmFmMGU2JyxcbiAgbWFnRnRhOiAnZmYwMGZmJyxcbiAgbWFQb246ICc4MDAwMDAnLFxuICBWYXF1YW1hclJlOiAnNjZjZGFhJyxcbiAgVlhlOiAnY2QnLFxuICBWU2NFZDogJ2JhNTVkMycsXG4gIFZwdXJwTjogJzkzNzBkYicsXG4gIFZzSGdZRjogJzNjYjM3MScsXG4gIFZVWGU6ICc3YjY4ZWUnLFxuICBWc3ByUmdnWUY6ICdmYTlhJyxcbiAgVlFlOiAnNDhkMWNjJyxcbiAgVnZpVGV0WWQ6ICdjNzE1ODUnLFxuICBtaWRuaWdodFhlOiAnMTkxOTcwJyxcbiAgbVJ0Y1lhbTogJ2Y1ZmZmYScsXG4gIG1pc3R5UHNlOiAnZmZlNGUxJyxcbiAgbW9jY2FzUjogJ2ZmZTRiNScsXG4gIG5hdmFqb3dFdGU6ICdmZmRlYWQnLFxuICBuYXZ5OiAnODAnLFxuICBUZGxhY2U6ICdmZGY1ZTYnLFxuICBUaXZlOiAnODA4MDAwJyxcbiAgVGl2ZWRCYjogJzZiOGUyMycsXG4gIFNhbmdlOiAnZmZhNTAwJyxcbiAgU2FuZ2VZZDogJ2ZmNDUwMCcsXG4gIFNjRWQ6ICdkYTcwZDYnLFxuICBwT2VnVE1uUGQ6ICdlZWU4YWEnLFxuICBwT2VnWUY6ICc5OGZiOTgnLFxuICBwT2VRZTogJ2FmZWVlZScsXG4gIHBPZXZpVGV0WWQ6ICdkYjcwOTMnLFxuICBwYXBheWF3RXA6ICdmZmVmZDUnLFxuICBwSEtwdWZmOiAnZmZkYWI5JyxcbiAgcGVydTogJ2NkODUzZicsXG4gIHBSazogJ2ZmYzBjYicsXG4gIHBsdW06ICdkZGEwZGQnLFxuICBwb3dNclhlOiAnYjBlMGU2JyxcbiAgcHVycE46ICc4MDAwODAnLFxuICBZYmVjY2FwdXJwTjogJzY2MzM5OScsXG4gIFlkOiAnZmYwMDAwJyxcbiAgUHN5YnJvd246ICdiYzhmOGYnLFxuICBQeU9YZTogJzQxNjllMScsXG4gIHNhZGROYlB3bjogJzhiNDUxMycsXG4gIHNPbW9uOiAnZmE4MDcyJyxcbiAgc2FuZHliUHduOiAnZjRhNDYwJyxcbiAgc0hnWUY6ICcyZThiNTcnLFxuICBzSHNoZWxsOiAnZmZmNWVlJyxcbiAgc2lGbmE6ICdhMDUyMmQnLFxuICBzaWx2ZXI6ICdjMGMwYzAnLFxuICBza3lYZTogJzg3Y2VlYicsXG4gIFVYZTogJzZhNWFjZCcsXG4gIFVXYXk6ICc3MDgwOTAnLFxuICBVZ1l5OiAnNzA4MDkwJyxcbiAgc25vdzogJ2ZmZmFmYScsXG4gIHNwclJnZ1lGOiAnZmY3ZicsXG4gIHN0QWxYZTogJzQ2ODJiNCcsXG4gIHRhbjogJ2QyYjQ4YycsXG4gIHRlTzogJzgwODAnLFxuICB0RXN0TjogJ2Q4YmZkOCcsXG4gIHRvbWF0bzogJ2ZmNjM0NycsXG4gIFFlOiAnNDBlMGQwJyxcbiAgdmlUZXQ6ICdlZTgyZWUnLFxuICBKSHQ6ICdmNWRlYjMnLFxuICB3RXRlOiAnZmZmZmZmJyxcbiAgd0V0ZXNtb2tlOiAnZjVmNWY1JyxcbiAgTHc6ICdmZmZmMDAnLFxuICBMd2dZRjogJzlhY2QzMidcbn07XG5mdW5jdGlvbiB1bnBhY2soKSB7XG4gIGNvbnN0IHVucGFja2VkID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhuYW1lcyQxKTtcbiAgY29uc3QgdGtleXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICBsZXQgaSwgaiwgaywgb2ssIG5rO1xuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIG9rID0gbmsgPSBrZXlzW2ldO1xuICAgIGZvciAoaiA9IDA7IGogPCB0a2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgayA9IHRrZXlzW2pdO1xuICAgICAgbmsgPSBuay5yZXBsYWNlKGssIG1hcFtrXSk7XG4gICAgfVxuICAgIGsgPSBwYXJzZUludChuYW1lcyQxW29rXSwgMTYpO1xuICAgIHVucGFja2VkW25rXSA9IFtrID4+IDE2ICYgMHhGRiwgayA+PiA4ICYgMHhGRiwgayAmIDB4RkZdO1xuICB9XG4gIHJldHVybiB1bnBhY2tlZDtcbn1cblxubGV0IG5hbWVzO1xuZnVuY3Rpb24gbmFtZVBhcnNlKHN0cikge1xuICBpZiAoIW5hbWVzKSB7XG4gICAgbmFtZXMgPSB1bnBhY2soKTtcbiAgICBuYW1lcy50cmFuc3BhcmVudCA9IFswLCAwLCAwLCAwXTtcbiAgfVxuICBjb25zdCBhID0gbmFtZXNbc3RyLnRvTG93ZXJDYXNlKCldO1xuICByZXR1cm4gYSAmJiB7XG4gICAgcjogYVswXSxcbiAgICBnOiBhWzFdLFxuICAgIGI6IGFbMl0sXG4gICAgYTogYS5sZW5ndGggPT09IDQgPyBhWzNdIDogMjU1XG4gIH07XG59XG5cbmNvbnN0IFJHQl9SRSA9IC9ecmdiYT9cXChcXHMqKFstKy5cXGRdKykoJSk/W1xccyxdKyhbLSsuZVxcZF0rKSglKT9bXFxzLF0rKFstKy5lXFxkXSspKCUpPyg/OltcXHMsL10rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gcmdiUGFyc2Uoc3RyKSB7XG4gIGNvbnN0IG0gPSBSR0JfUkUuZXhlYyhzdHIpO1xuICBsZXQgYSA9IDI1NTtcbiAgbGV0IHIsIGcsIGI7XG4gIGlmICghbSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobVs3XSAhPT0gcikge1xuICAgIGNvbnN0IHYgPSArbVs3XTtcbiAgICBhID0gbVs4XSA/IHAyYih2KSA6IGxpbSh2ICogMjU1LCAwLCAyNTUpO1xuICB9XG4gIHIgPSArbVsxXTtcbiAgZyA9ICttWzNdO1xuICBiID0gK21bNV07XG4gIHIgPSAyNTUgJiAobVsyXSA/IHAyYihyKSA6IGxpbShyLCAwLCAyNTUpKTtcbiAgZyA9IDI1NSAmIChtWzRdID8gcDJiKGcpIDogbGltKGcsIDAsIDI1NSkpO1xuICBiID0gMjU1ICYgKG1bNl0gPyBwMmIoYikgOiBsaW0oYiwgMCwgMjU1KSk7XG4gIHJldHVybiB7XG4gICAgcjogcixcbiAgICBnOiBnLFxuICAgIGI6IGIsXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcmdiU3RyaW5nKHYpIHtcbiAgcmV0dXJuIHYgJiYgKFxuICAgIHYuYSA8IDI1NVxuICAgICAgPyBgcmdiYSgke3Yucn0sICR7di5nfSwgJHt2LmJ9LCAke2Iybih2LmEpfSlgXG4gICAgICA6IGByZ2IoJHt2LnJ9LCAke3YuZ30sICR7di5ifSlgXG4gICk7XG59XG5cbmNvbnN0IHRvID0gdiA9PiB2IDw9IDAuMDAzMTMwOCA/IHYgKiAxMi45MiA6IE1hdGgucG93KHYsIDEuMCAvIDIuNCkgKiAxLjA1NSAtIDAuMDU1O1xuY29uc3QgZnJvbSA9IHYgPT4gdiA8PSAwLjA0MDQ1ID8gdiAvIDEyLjkyIDogTWF0aC5wb3coKHYgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbmZ1bmN0aW9uIGludGVycG9sYXRlKHJnYjEsIHJnYjIsIHQpIHtcbiAgY29uc3QgciA9IGZyb20oYjJuKHJnYjEucikpO1xuICBjb25zdCBnID0gZnJvbShiMm4ocmdiMS5nKSk7XG4gIGNvbnN0IGIgPSBmcm9tKGIybihyZ2IxLmIpKTtcbiAgcmV0dXJuIHtcbiAgICByOiBuMmIodG8ociArIHQgKiAoZnJvbShiMm4ocmdiMi5yKSkgLSByKSkpLFxuICAgIGc6IG4yYih0byhnICsgdCAqIChmcm9tKGIybihyZ2IyLmcpKSAtIGcpKSksXG4gICAgYjogbjJiKHRvKGIgKyB0ICogKGZyb20oYjJuKHJnYjIuYikpIC0gYikpKSxcbiAgICBhOiByZ2IxLmEgKyB0ICogKHJnYjIuYSAtIHJnYjEuYSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW9kSFNMKHYsIGksIHJhdGlvKSB7XG4gIGlmICh2KSB7XG4gICAgbGV0IHRtcCA9IHJnYjJoc2wodik7XG4gICAgdG1wW2ldID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG1wW2ldICsgdG1wW2ldICogcmF0aW8sIGkgPT09IDAgPyAzNjAgOiAxKSk7XG4gICAgdG1wID0gaHNsMnJnYih0bXApO1xuICAgIHYuciA9IHRtcFswXTtcbiAgICB2LmcgPSB0bXBbMV07XG4gICAgdi5iID0gdG1wWzJdO1xuICB9XG59XG5mdW5jdGlvbiBjbG9uZSh2LCBwcm90bykge1xuICByZXR1cm4gdiA/IE9iamVjdC5hc3NpZ24ocHJvdG8gfHwge30sIHYpIDogdjtcbn1cbmZ1bmN0aW9uIGZyb21PYmplY3QoaW5wdXQpIHtcbiAgdmFyIHYgPSB7cjogMCwgZzogMCwgYjogMCwgYTogMjU1fTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA+PSAzKSB7XG4gICAgICB2ID0ge3I6IGlucHV0WzBdLCBnOiBpbnB1dFsxXSwgYjogaW5wdXRbMl0sIGE6IDI1NX07XG4gICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMykge1xuICAgICAgICB2LmEgPSBuMmIoaW5wdXRbM10pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gY2xvbmUoaW5wdXQsIHtyOiAwLCBnOiAwLCBiOiAwLCBhOiAxfSk7XG4gICAgdi5hID0gbjJiKHYuYSk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5mdW5jdGlvbiBmdW5jdGlvblBhcnNlKHN0cikge1xuICBpZiAoc3RyLmNoYXJBdCgwKSA9PT0gJ3InKSB7XG4gICAgcmV0dXJuIHJnYlBhcnNlKHN0cik7XG4gIH1cbiAgcmV0dXJuIGh1ZVBhcnNlKHN0cik7XG59XG5jbGFzcyBDb2xvciB7XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBpbnB1dDtcbiAgICBsZXQgdjtcbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHYgPSBmcm9tT2JqZWN0KGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2ID0gaGV4UGFyc2UoaW5wdXQpIHx8IG5hbWVQYXJzZShpbnB1dCkgfHwgZnVuY3Rpb25QYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHRoaXMuX3JnYiA9IHY7XG4gICAgdGhpcy5fdmFsaWQgPSAhIXY7XG4gIH1cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZDtcbiAgfVxuICBnZXQgcmdiKCkge1xuICAgIHZhciB2ID0gY2xvbmUodGhpcy5fcmdiKTtcbiAgICBpZiAodikge1xuICAgICAgdi5hID0gYjJuKHYuYSk7XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG4gIHNldCByZ2Iob2JqKSB7XG4gICAgdGhpcy5fcmdiID0gZnJvbU9iamVjdChvYmopO1xuICB9XG4gIHJnYlN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWQgPyByZ2JTdHJpbmcodGhpcy5fcmdiKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBoZXhTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkID8gaGV4U3RyaW5nKHRoaXMuX3JnYikgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaHNsU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZCA/IGhzbFN0cmluZyh0aGlzLl9yZ2IpIDogdW5kZWZpbmVkO1xuICB9XG4gIG1peChjb2xvciwgd2VpZ2h0KSB7XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBjb25zdCBjMSA9IHRoaXMucmdiO1xuICAgICAgY29uc3QgYzIgPSBjb2xvci5yZ2I7XG4gICAgICBsZXQgdzI7XG4gICAgICBjb25zdCBwID0gd2VpZ2h0ID09PSB3MiA/IDAuNSA6IHdlaWdodDtcbiAgICAgIGNvbnN0IHcgPSAyICogcCAtIDE7XG4gICAgICBjb25zdCBhID0gYzEuYSAtIGMyLmE7XG4gICAgICBjb25zdCB3MSA9ICgodyAqIGEgPT09IC0xID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMDtcbiAgICAgIHcyID0gMSAtIHcxO1xuICAgICAgYzEuciA9IDB4RkYgJiB3MSAqIGMxLnIgKyB3MiAqIGMyLnIgKyAwLjU7XG4gICAgICBjMS5nID0gMHhGRiAmIHcxICogYzEuZyArIHcyICogYzIuZyArIDAuNTtcbiAgICAgIGMxLmIgPSAweEZGICYgdzEgKiBjMS5iICsgdzIgKiBjMi5iICsgMC41O1xuICAgICAgYzEuYSA9IHAgKiBjMS5hICsgKDEgLSBwKSAqIGMyLmE7XG4gICAgICB0aGlzLnJnYiA9IGMxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbnRlcnBvbGF0ZShjb2xvciwgdCkge1xuICAgIGlmIChjb2xvcikge1xuICAgICAgdGhpcy5fcmdiID0gaW50ZXJwb2xhdGUodGhpcy5fcmdiLCBjb2xvci5fcmdiLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBDb2xvcih0aGlzLnJnYik7XG4gIH1cbiAgYWxwaGEoYSkge1xuICAgIHRoaXMuX3JnYi5hID0gbjJiKGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNsZWFyZXIocmF0aW8pIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgcmdiLmEgKj0gMSAtIHJhdGlvO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyZXlzY2FsZSgpIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgY29uc3QgdmFsID0gcm91bmQocmdiLnIgKiAwLjMgKyByZ2IuZyAqIDAuNTkgKyByZ2IuYiAqIDAuMTEpO1xuICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IHZhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcGFxdWVyKHJhdGlvKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fcmdiO1xuICAgIHJnYi5hICo9IDEgKyByYXRpbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBuZWdhdGUoKSB7XG4gICAgY29uc3QgdiA9IHRoaXMuX3JnYjtcbiAgICB2LnIgPSAyNTUgLSB2LnI7XG4gICAgdi5nID0gMjU1IC0gdi5nO1xuICAgIHYuYiA9IDI1NSAtIHYuYjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaWdodGVuKHJhdGlvKSB7XG4gICAgbW9kSFNMKHRoaXMuX3JnYiwgMiwgcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRhcmtlbihyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDIsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc2F0dXJhdGUocmF0aW8pIHtcbiAgICBtb2RIU0wodGhpcy5fcmdiLCAxLCByYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYXR1cmF0ZShyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDEsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcm90YXRlKGRlZykge1xuICAgIHJvdGF0ZSh0aGlzLl9yZ2IsIGRlZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhfZXNtKGlucHV0KSB7XG4gIHJldHVybiBuZXcgQ29sb3IoaW5wdXQpO1xufVxuXG5leHBvcnQgeyBDb2xvciwgYjJuLCBiMnAsIGluZGV4X2VzbSBhcyBkZWZhdWx0LCBoZXhQYXJzZSwgaGV4U3RyaW5nLCBoc2wycmdiLCBoc2xTdHJpbmcsIGhzdjJyZ2IsIGh1ZVBhcnNlLCBod2IycmdiLCBsaW0sIG4yYiwgbjJwLCBuYW1lUGFyc2UsIHAyYiwgcmdiMmhzbCwgcmdiUGFyc2UsIHJnYlN0cmluZywgcm90YXRlLCByb3VuZCB9O1xuIiwgIi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzXG4gKi9cblxuaW1wb3J0IHR5cGUge0FueU9iamVjdH0gZnJvbSAnLi4vdHlwZXMvYmFzaWMuanMnO1xuaW1wb3J0IHR5cGUge0FjdGl2ZURhdGFQb2ludCwgQ2hhcnRFdmVudH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG4vKipcbiAqIEFuIGVtcHR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCBmb3Igb3B0aW9uYWwgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub29wKCkge1xuICAvKiBub29wICovXG59XG5cbi8qKlxuICogUmV0dXJucyBhIHVuaXF1ZSBpZCwgc2VxdWVudGlhbGx5IGdlbmVyYXRlZCBmcm9tIGEgZ2xvYmFsIHZhcmlhYmxlLlxuICovXG5leHBvcnQgY29uc3QgdWlkID0gKCgpID0+IHtcbiAgbGV0IGlkID0gMDtcbiAgcmV0dXJuICgpID0+IGlkKys7XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIG5laXRoZXIgbnVsbCBub3IgdW5kZWZpbmVkLCBlbHNlIHJldHVybnMgZmFsc2UuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEBzaW5jZSAyLjcuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JVbmRlZih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSAoaW5jbHVkaW5nIHR5cGVkIGFycmF5cyksIGVsc2UgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5PFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh0eXBlLnNsaWNlKDAsIDcpID09PSAnW29iamVjdCcgJiYgdHlwZS5zbGljZSgtNikgPT09ICdBcnJheV0nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCAoZXhjbHVkaW5nIG51bGwpLCBlbHNlIHJldHVybnMgZmFsc2UuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEBzaW5jZSAyLjcuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBbnlPYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIHJldHVybnMgZmFsc2VcbiAqIEBwYXJhbSB2YWx1ZSAgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXJGaW5pdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpICYmIGlzRmluaXRlKCt2YWx1ZSk7XG59XG5leHBvcnQge1xuICBpc051bWJlckZpbml0ZSBhcyBpc0Zpbml0ZSxcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdmFsdWVgIGlmIGZpbml0ZSwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBkZWZpbmVkLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYHZhbHVlYCBpcyBub3QgZmluaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluaXRlT3JEZWZhdWx0KHZhbHVlOiB1bmtub3duLCBkZWZhdWx0VmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gaXNOdW1iZXJGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBgdmFsdWVgIGlmIGRlZmluZWQsIGVsc2UgcmV0dXJucyBgZGVmYXVsdFZhbHVlYC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgZGVmaW5lZC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVPckRlZmF1bHQ8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogVCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgY29uc3QgdG9QZXJjZW50YWdlID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGRpbWVuc2lvbjogbnVtYmVyKSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCclJykgP1xuICAgIHBhcnNlRmxvYXQodmFsdWUpIC8gMTAwXG4gICAgOiArdmFsdWUgLyBkaW1lbnNpb247XG5cbmV4cG9ydCBjb25zdCB0b0RpbWVuc2lvbiA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBkaW1lbnNpb246IG51bWJlcikgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnJScpID9cbiAgICBwYXJzZUZsb2F0KHZhbHVlKSAvIDEwMCAqIGRpbWVuc2lvblxuICAgIDogK3ZhbHVlO1xuXG4vKipcbiAqIENhbGxzIGBmbmAgd2l0aCB0aGUgZ2l2ZW4gYGFyZ3NgIGluIHRoZSBzY29wZSBkZWZpbmVkIGJ5IGB0aGlzQXJnYCBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIHJldHVybmVkIGJ5IGBmbmAuIElmIGBmbmAgaXMgbm90IGEgZnVuY3Rpb24sIHRoaXMgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgd2l0aCB3aGljaCBgZm5gIHNob3VsZCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0gW3RoaXNBcmddIC0gVGhlIHZhbHVlIG9mIGB0aGlzYCBwcm92aWRlZCBmb3IgdGhlIGNhbGwgdG8gYGZuYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxiYWNrPFQgZXh0ZW5kcyAodGhpczogVEEsIC4uLnJlc3RBcmdzOiB1bmtub3duW10pID0+IFIsIFRBLCBSPihcbiAgZm46IFQgfCB1bmRlZmluZWQsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgdGhpc0FyZz86IFRBXG4pOiBSIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZuICYmIHR5cGVvZiBmbi5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogTm90ZShTQikgZm9yIHBlcmZvcm1hbmNlIHNha2UsIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBsb29wYWJsZSB0eXBlXG4gKiBpcyB1bmtub3duIG9yIGluIG5vbmUgaW50ZW5zaXZlIGNvZGUgKG5vdCBjYWxsZWQgb2Z0ZW4gYW5kIHNtYWxsIGxvb3BhYmxlKS4gRWxzZVxuICogaXQncyBwcmVmZXJhYmxlIHRvIHVzZSBhIHJlZ3VsYXIgZm9yKCkgbG9vcCBhbmQgc2F2ZSBleHRyYSBmdW5jdGlvbiBjYWxscy5cbiAqIEBwYXJhbSBsb29wYWJsZSAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgaXRlcmF0ZWQuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLlxuICogQHBhcmFtIFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXG4gKiBAcGFyYW0gW3JldmVyc2VdIC0gSWYgdHJ1ZSwgaXRlcmF0ZXMgYmFja3dhcmQgb24gdGhlIGxvb3BhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWFjaDxULCBUQT4oXG4gIGxvb3BhYmxlOiBSZWNvcmQ8c3RyaW5nLCBUPixcbiAgZm46ICh0aGlzOiBUQSwgdjogVCwgaTogc3RyaW5nKSA9PiB2b2lkLFxuICB0aGlzQXJnPzogVEEsXG4gIHJldmVyc2U/OiBib29sZWFuXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGVhY2g8VCwgVEE+KFxuICBsb29wYWJsZTogVFtdLFxuICBmbjogKHRoaXM6IFRBLCB2OiBULCBpOiBudW1iZXIpID0+IHZvaWQsXG4gIHRoaXNBcmc/OiBUQSxcbiAgcmV2ZXJzZT86IGJvb2xlYW5cbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gZWFjaDxULCBUQT4oXG4gIGxvb3BhYmxlOiBUW10gfCBSZWNvcmQ8c3RyaW5nLCBUPixcbiAgZm46ICh0aGlzOiBUQSwgdjogVCwgaTogYW55KSA9PiB2b2lkLFxuICB0aGlzQXJnPzogVEEsXG4gIHJldmVyc2U/OiBib29sZWFuXG4pIHtcbiAgbGV0IGk6IG51bWJlciwgbGVuOiBudW1iZXIsIGtleXM6IHN0cmluZ1tdO1xuICBpZiAoaXNBcnJheShsb29wYWJsZSkpIHtcbiAgICBsZW4gPSBsb29wYWJsZS5sZW5ndGg7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZuLmNhbGwodGhpc0FyZywgbG9vcGFibGVbaV0sIGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgZm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxvb3BhYmxlKSkge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyhsb29wYWJsZSk7XG4gICAgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2tleXNbaV1dLCBrZXlzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGBhMGAgYW5kIGBhMWAgYXJyYXlzIGhhdmUgdGhlIHNhbWUgY29udGVudCwgZWxzZSByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIGEwIC0gVGhlIGFycmF5IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBhMSAtIFRoZSBhcnJheSB0byBjb21wYXJlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2VsZW1lbnRzRXF1YWwoYTA6IEFjdGl2ZURhdGFQb2ludFtdLCBhMTogQWN0aXZlRGF0YVBvaW50W10pIHtcbiAgbGV0IGk6IG51bWJlciwgaWxlbjogbnVtYmVyLCB2MDogQWN0aXZlRGF0YVBvaW50LCB2MTogQWN0aXZlRGF0YVBvaW50O1xuXG4gIGlmICghYTAgfHwgIWExIHx8IGEwLmxlbmd0aCAhPT0gYTEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChpID0gMCwgaWxlbiA9IGEwLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgIHYwID0gYTBbaV07XG4gICAgdjEgPSBhMVtpXTtcblxuICAgIGlmICh2MC5kYXRhc2V0SW5kZXggIT09IHYxLmRhdGFzZXRJbmRleCB8fCB2MC5pbmRleCAhPT0gdjEuaW5kZXgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgIHdpdGhvdXQga2VlcGluZyByZWZlcmVuY2VzIG9uIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZTxUPihzb3VyY2U6IFQpOiBUIHtcbiAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2UubWFwKGNsb25lKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgY29uc3Qga2xlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrID0gMDtcblxuICAgIGZvciAoOyBrIDwga2xlbjsgKytrKSB7XG4gICAgICB0YXJnZXRba2V5c1trXV0gPSBjbG9uZShzb3VyY2Vba2V5c1trXV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBbJ19fcHJvdG9fXycsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXS5pbmRleE9mKGtleSkgPT09IC0xO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IG1lcmdlciB3aGVuIENoYXJ0LmhlbHBlcnMubWVyZ2UgaXMgY2FsbGVkIHdpdGhvdXQgbWVyZ2VyIG9wdGlvbi5cbiAqIE5vdGUoU0IpOiBhbHNvIHVzZWQgYnkgbWVyZ2VDb25maWcgYW5kIG1lcmdlU2NhbGVDb25maWcgYXMgZmFsbGJhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX21lcmdlcihrZXk6IHN0cmluZywgdGFyZ2V0OiBBbnlPYmplY3QsIHNvdXJjZTogQW55T2JqZWN0LCBvcHRpb25zOiBBbnlPYmplY3QpIHtcbiAgaWYgKCFpc1ZhbGlkS2V5KGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0dmFsID0gdGFyZ2V0W2tleV07XG4gIGNvbnN0IHN2YWwgPSBzb3VyY2Vba2V5XTtcblxuICBpZiAoaXNPYmplY3QodHZhbCkgJiYgaXNPYmplY3Qoc3ZhbCkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgbWVyZ2UodHZhbCwgc3ZhbCwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0W2tleV0gPSBjbG9uZShzdmFsKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlT3B0aW9ucyB7XG4gIG1lcmdlcj86IChrZXk6IHN0cmluZywgdGFyZ2V0OiBBbnlPYmplY3QsIHNvdXJjZTogQW55T2JqZWN0LCBvcHRpb25zPzogQW55T2JqZWN0KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKiBJTVBPUlRBTlQ6IGB0YXJnZXRgIGlzIG5vdCBjbG9uZWQgYW5kIHdpbGwgYmUgdXBkYXRlZCB3aXRoIGBzb3VyY2VgIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgaW4gd2hpY2ggYWxsIHNvdXJjZXMgYXJlIG1lcmdlZCBpbnRvLlxuICogQHBhcmFtIHNvdXJjZSAtIE9iamVjdChzKSB0byBtZXJnZSBpbnRvIGB0YXJnZXRgLlxuICogQHBhcmFtIFtvcHRpb25zXSAtIE1lcmdpbmcgb3B0aW9uczpcbiAqIEBwYXJhbSBbb3B0aW9ucy5tZXJnZXJdIC0gVGhlIG1lcmdlIG1ldGhvZCAoa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcbiAqIEByZXR1cm5zIFRoZSBgdGFyZ2V0YCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUPih0YXJnZXQ6IFQsIHNvdXJjZTogW10sIG9wdGlvbnM/OiBNZXJnZU9wdGlvbnMpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPFQsIFMxPih0YXJnZXQ6IFQsIHNvdXJjZTogUzEsIG9wdGlvbnM/OiBNZXJnZU9wdGlvbnMpOiBUICYgUzE7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8VCwgUzE+KHRhcmdldDogVCwgc291cmNlOiBbUzFdLCBvcHRpb25zPzogTWVyZ2VPcHRpb25zKTogVCAmIFMxO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPFQsIFMxLCBTMj4odGFyZ2V0OiBULCBzb3VyY2U6IFtTMSwgUzJdLCBvcHRpb25zPzogTWVyZ2VPcHRpb25zKTogVCAmIFMxICYgUzI7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8VCwgUzEsIFMyLCBTMz4odGFyZ2V0OiBULCBzb3VyY2U6IFtTMSwgUzIsIFMzXSwgb3B0aW9ucz86IE1lcmdlT3B0aW9ucyk6IFQgJiBTMSAmIFMyICYgUzM7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8VCwgUzEsIFMyLCBTMywgUzQ+KFxuICB0YXJnZXQ6IFQsXG4gIHNvdXJjZTogW1MxLCBTMiwgUzMsIFM0XSxcbiAgb3B0aW9ucz86IE1lcmdlT3B0aW9uc1xuKTogVCAmIFMxICYgUzIgJiBTMyAmIFM0O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPFQ+KHRhcmdldDogVCwgc291cmNlOiBBbnlPYmplY3RbXSwgb3B0aW9ucz86IE1lcmdlT3B0aW9ucyk6IEFueU9iamVjdDtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUPih0YXJnZXQ6IFQsIHNvdXJjZTogQW55T2JqZWN0W10sIG9wdGlvbnM/OiBNZXJnZU9wdGlvbnMpOiBBbnlPYmplY3Qge1xuICBjb25zdCBzb3VyY2VzID0gaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogW3NvdXJjZV07XG4gIGNvbnN0IGlsZW4gPSBzb3VyY2VzLmxlbmd0aDtcblxuICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0IGFzIEFueU9iamVjdDtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBtZXJnZXIgPSBvcHRpb25zLm1lcmdlciB8fCBfbWVyZ2VyO1xuICBsZXQgY3VycmVudDogQW55T2JqZWN0O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY3VycmVudCA9IHNvdXJjZXNbaV07XG4gICAgaWYgKCFpc09iamVjdChjdXJyZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnQpO1xuICAgIGZvciAobGV0IGsgPSAwLCBrbGVuID0ga2V5cy5sZW5ndGg7IGsgPCBrbGVuOyArK2spIHtcbiAgICAgIG1lcmdlcihrZXlzW2tdLCB0YXJnZXQsIGN1cnJlbnQsIG9wdGlvbnMgYXMgQW55T2JqZWN0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCAqb25seSogaWYgbm90IGRlZmluZWQgaW4gdGFyZ2V0LlxuICogSU1QT1JUQU5UOiBgdGFyZ2V0YCBpcyBub3QgY2xvbmVkIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCBgc291cmNlYCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IGluIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSBtZXJnZWQgaW50by5cbiAqIEBwYXJhbSBzb3VyY2UgLSBPYmplY3QocykgdG8gbWVyZ2UgaW50byBgdGFyZ2V0YC5cbiAqIEByZXR1cm5zIFRoZSBgdGFyZ2V0YCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUlmPFQ+KHRhcmdldDogVCwgc291cmNlOiBbXSk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJZjxULCBTMT4odGFyZ2V0OiBULCBzb3VyY2U6IFMxKTogVCAmIFMxO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VCwgUzE+KHRhcmdldDogVCwgc291cmNlOiBbUzFdKTogVCAmIFMxO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VCwgUzEsIFMyPih0YXJnZXQ6IFQsIHNvdXJjZTogW1MxLCBTMl0pOiBUICYgUzEgJiBTMjtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUlmPFQsIFMxLCBTMiwgUzM+KHRhcmdldDogVCwgc291cmNlOiBbUzEsIFMyLCBTM10pOiBUICYgUzEgJiBTMiAmIFMzO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VCwgUzEsIFMyLCBTMywgUzQ+KHRhcmdldDogVCwgc291cmNlOiBbUzEsIFMyLCBTMywgUzRdKTogVCAmIFMxICYgUzIgJiBTMyAmIFM0O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VD4odGFyZ2V0OiBULCBzb3VyY2U6IEFueU9iamVjdFtdKTogQW55T2JqZWN0O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VD4odGFyZ2V0OiBULCBzb3VyY2U6IEFueU9iamVjdFtdKTogQW55T2JqZWN0IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICByZXR1cm4gbWVyZ2U8VD4odGFyZ2V0LCBzb3VyY2UsIHttZXJnZXI6IF9tZXJnZXJJZn0pO1xufVxuXG4vKipcbiAqIE1lcmdlcyBzb3VyY2Vba2V5XSBpbiB0YXJnZXRba2V5XSBvbmx5IGlmIHRhcmdldFtrZXldIGlzIHVuZGVmaW5lZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbWVyZ2VySWYoa2V5OiBzdHJpbmcsIHRhcmdldDogQW55T2JqZWN0LCBzb3VyY2U6IEFueU9iamVjdCkge1xuICBpZiAoIWlzVmFsaWRLZXkoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHR2YWwgPSB0YXJnZXRba2V5XTtcbiAgY29uc3Qgc3ZhbCA9IHNvdXJjZVtrZXldO1xuXG4gIGlmIChpc09iamVjdCh0dmFsKSAmJiBpc09iamVjdChzdmFsKSkge1xuICAgIG1lcmdlSWYodHZhbCwgc3ZhbCk7XG4gIH0gZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHtcbiAgICB0YXJnZXRba2V5XSA9IGNsb25lKHN2YWwpO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZXByZWNhdGVkKHNjb3BlOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwcmV2aW91czogc3RyaW5nLCBjdXJyZW50OiBzdHJpbmcpIHtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLndhcm4oc2NvcGUgKyAnOiBcIicgKyBwcmV2aW91cyArXG4gICAgICAnXCIgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBcIicgKyBjdXJyZW50ICsgJ1wiIGluc3RlYWQnKTtcbiAgfVxufVxuXG4vLyByZXNvbHZlT2JqZWN0S2V5IHJlc29sdmVyIGNhY2hlXG5jb25zdCBrZXlSZXNvbHZlcnMgPSB7XG4gIC8vIENoYXJ0LmhlbHBlcnMuY29yZSByZXNvbHZlT2JqZWN0S2V5IHNob3VsZCByZXNvbHZlIGVtcHR5IGtleSB0byByb290IG9iamVjdFxuICAnJzogdiA9PiB2LFxuICAvLyBkZWZhdWx0IHJlc29sdmVyc1xuICB4OiBvID0+IG8ueCxcbiAgeTogbyA9PiBvLnlcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zcGxpdEtleShrZXk6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdCgnLicpO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgdG1wID0gJyc7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIHRtcCArPSBwYXJ0O1xuICAgIGlmICh0bXAuZW5kc1dpdGgoJ1xcXFwnKSkge1xuICAgICAgdG1wID0gdG1wLnNsaWNlKDAsIC0xKSArICcuJztcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cy5wdXNoKHRtcCk7XG4gICAgICB0bXAgPSAnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9nZXRLZXlSZXNvbHZlcihrZXk6IHN0cmluZykge1xuICBjb25zdCBrZXlzID0gX3NwbGl0S2V5KGtleSk7XG4gIHJldHVybiBvYmogPT4ge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXlzKSB7XG4gICAgICBpZiAoayA9PT0gJycpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6XG4gICAgICAgIC8vIENoYXJ0LmhlbHBlcnMuY29yZSByZXNvbHZlT2JqZWN0S2V5IHNob3VsZCBicmVhayBhdCBlbXB0eSBrZXlcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvYmogPSBvYmogJiYgb2JqW2tdO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9iamVjdEtleShvYmo6IEFueU9iamVjdCwga2V5OiBzdHJpbmcpOiBBbnlPYmplY3Qge1xuICBjb25zdCByZXNvbHZlciA9IGtleVJlc29sdmVyc1trZXldIHx8IChrZXlSZXNvbHZlcnNba2V5XSA9IF9nZXRLZXlSZXNvbHZlcihrZXkpKTtcbiAgcmV0dXJuIHJlc29sdmVyKG9iaik7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jYXBpdGFsaXplKHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59XG5cblxuZXhwb3J0IGNvbnN0IGRlZmluZWQgPSAodmFsdWU6IHVua25vd24pID0+IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG5cbmV4cG9ydCBjb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPT4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzExMjg4NTUvY29tcGFyaW5nLWVjbWE2LXNldHMtZm9yLWVxdWFsaXR5IzMxMTI5Mzg0XG5leHBvcnQgY29uc3Qgc2V0c0VxdWFsID0gPFQ+KGE6IFNldDxUPiwgYjogU2V0PFQ+KSA9PiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhpdGVtKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZSAtIFRoZSBldmVudFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9pc0NsaWNrRXZlbnQoZTogQ2hhcnRFdmVudCkge1xuICByZXR1cm4gZS50eXBlID09PSAnbW91c2V1cCcgfHwgZS50eXBlID09PSAnY2xpY2snIHx8IGUudHlwZSA9PT0gJ2NvbnRleHRtZW51Jztcbn1cbiIsICJpbXBvcnQgdHlwZSB7UG9pbnR9IGZyb20gJy4uL3R5cGVzL2dlb21ldHJpYy5qcyc7XG5pbXBvcnQge2lzRmluaXRlIGFzIGlzRmluaXRlTnVtYmVyfSBmcm9tICcuL2hlbHBlcnMuY29yZS5qcyc7XG5cbi8qKlxuICogQGFsaWFzIENoYXJ0LmhlbHBlcnMubWF0aFxuICogQG5hbWVzcGFjZVxuICovXG5cbmV4cG9ydCBjb25zdCBQSSA9IE1hdGguUEk7XG5leHBvcnQgY29uc3QgVEFVID0gMiAqIFBJO1xuZXhwb3J0IGNvbnN0IFBJVEFVID0gVEFVICsgUEk7XG5leHBvcnQgY29uc3QgSU5GSU5JVFkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5leHBvcnQgY29uc3QgUkFEX1BFUl9ERUcgPSBQSSAvIDE4MDtcbmV4cG9ydCBjb25zdCBIQUxGX1BJID0gUEkgLyAyO1xuZXhwb3J0IGNvbnN0IFFVQVJURVJfUEkgPSBQSSAvIDQ7XG5leHBvcnQgY29uc3QgVFdPX1RISVJEU19QSSA9IFBJICogMiAvIDM7XG5cbmV4cG9ydCBjb25zdCBsb2cxMCA9IE1hdGgubG9nMTA7XG5leHBvcnQgY29uc3Qgc2lnbiA9IE1hdGguc2lnbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFsbW9zdEVxdWFscyh4OiBudW1iZXIsIHk6IG51bWJlciwgZXBzaWxvbjogbnVtYmVyKSB7XG4gIHJldHVybiBNYXRoLmFicyh4IC0geSkgPCBlcHNpbG9uO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBuaWNlIG51bWJlciBhbGdvcml0aG0gdXNlZCBpbiBkZXRlcm1pbmluZyB3aGVyZSBheGlzIGxhYmVscyB3aWxsIGdvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuaWNlTnVtKHJhbmdlOiBudW1iZXIpIHtcbiAgY29uc3Qgcm91bmRlZFJhbmdlID0gTWF0aC5yb3VuZChyYW5nZSk7XG4gIHJhbmdlID0gYWxtb3N0RXF1YWxzKHJhbmdlLCByb3VuZGVkUmFuZ2UsIHJhbmdlIC8gMTAwMCkgPyByb3VuZGVkUmFuZ2UgOiByYW5nZTtcbiAgY29uc3QgbmljZVJhbmdlID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IobG9nMTAocmFuZ2UpKSk7XG4gIGNvbnN0IGZyYWN0aW9uID0gcmFuZ2UgLyBuaWNlUmFuZ2U7XG4gIGNvbnN0IG5pY2VGcmFjdGlvbiA9IGZyYWN0aW9uIDw9IDEgPyAxIDogZnJhY3Rpb24gPD0gMiA/IDIgOiBmcmFjdGlvbiA8PSA1ID8gNSA6IDEwO1xuICByZXR1cm4gbmljZUZyYWN0aW9uICogbmljZVJhbmdlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmFjdG9ycyBzb3J0ZWQgZnJvbSAxIHRvIHNxcnQodmFsdWUpXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2ZhY3Rvcml6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc3FydCA9IE1hdGguc3FydCh2YWx1ZSk7XG4gIGxldCBpOiBudW1iZXI7XG5cbiAgZm9yIChpID0gMTsgaSA8IHNxcnQ7IGkrKykge1xuICAgIGlmICh2YWx1ZSAlIGkgPT09IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUgLyBpKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNxcnQgPT09IChzcXJ0IHwgMCkpIHsgLy8gaWYgdmFsdWUgaXMgYSBzcXVhcmUgbnVtYmVyXG4gICAgcmVzdWx0LnB1c2goc3FydCk7XG4gIH1cblxuICByZXN1bHQuc29ydCgoYSwgYikgPT4gYSAtIGIpLnBvcCgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIobjogdW5rbm93bik6IG4gaXMgbnVtYmVyIHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4gYXMgc3RyaW5nKSkgJiYgaXNGaW5pdGUobiBhcyBudW1iZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxtb3N0V2hvbGUoeDogbnVtYmVyLCBlcHNpbG9uOiBudW1iZXIpIHtcbiAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQoeCk7XG4gIHJldHVybiAoKHJvdW5kZWQgLSBlcHNpbG9uKSA8PSB4KSAmJiAoKHJvdW5kZWQgKyBlcHNpbG9uKSA+PSB4KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX3NldE1pbkFuZE1heEJ5S2V5KFxuICBhcnJheTogUmVjb3JkPHN0cmluZywgbnVtYmVyPltdLFxuICB0YXJnZXQ6IHsgbWluOiBudW1iZXIsIG1heDogbnVtYmVyIH0sXG4gIHByb3BlcnR5OiBzdHJpbmdcbikge1xuICBsZXQgaTogbnVtYmVyLCBpbGVuOiBudW1iZXIsIHZhbHVlOiBudW1iZXI7XG5cbiAgZm9yIChpID0gMCwgaWxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgIHZhbHVlID0gYXJyYXlbaV1bcHJvcGVydHldO1xuICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICB0YXJnZXQubWluID0gTWF0aC5taW4odGFyZ2V0Lm1pbiwgdmFsdWUpO1xuICAgICAgdGFyZ2V0Lm1heCA9IE1hdGgubWF4KHRhcmdldC5tYXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFkaWFucyhkZWdyZWVzOiBudW1iZXIpIHtcbiAgcmV0dXJuIGRlZ3JlZXMgKiAoUEkgLyAxODApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZWdyZWVzKHJhZGlhbnM6IG51bWJlcikge1xuICByZXR1cm4gcmFkaWFucyAqICgxODAgLyBQSSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gKiBpLmUuIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBOdW1iZXIuXG4gKiBAcGFyYW0geCAtIEEgbnVtYmVyLlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZGVjaW1hbFBsYWNlcyh4OiBudW1iZXIpIHtcbiAgaWYgKCFpc0Zpbml0ZU51bWJlcih4KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZSA9IDE7XG4gIGxldCBwID0gMDtcbiAgd2hpbGUgKE1hdGgucm91bmQoeCAqIGUpIC8gZSAhPT0geCkge1xuICAgIGUgKj0gMTA7XG4gICAgcCsrO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG4vLyBHZXRzIHRoZSBhbmdsZSBmcm9tIHZlcnRpY2FsIHVwcmlnaHQgdG8gdGhlIHBvaW50IGFib3V0IGEgY2VudHJlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlRnJvbVBvaW50KFxuICBjZW50cmVQb2ludDogUG9pbnQsXG4gIGFuZ2xlUG9pbnQ6IFBvaW50XG4pIHtcbiAgY29uc3QgZGlzdGFuY2VGcm9tWENlbnRlciA9IGFuZ2xlUG9pbnQueCAtIGNlbnRyZVBvaW50Lng7XG4gIGNvbnN0IGRpc3RhbmNlRnJvbVlDZW50ZXIgPSBhbmdsZVBvaW50LnkgLSBjZW50cmVQb2ludC55O1xuICBjb25zdCByYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIgPSBNYXRoLnNxcnQoZGlzdGFuY2VGcm9tWENlbnRlciAqIGRpc3RhbmNlRnJvbVhDZW50ZXIgKyBkaXN0YW5jZUZyb21ZQ2VudGVyICogZGlzdGFuY2VGcm9tWUNlbnRlcik7XG5cbiAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMihkaXN0YW5jZUZyb21ZQ2VudGVyLCBkaXN0YW5jZUZyb21YQ2VudGVyKTtcblxuICBpZiAoYW5nbGUgPCAoLTAuNSAqIFBJKSkge1xuICAgIGFuZ2xlICs9IFRBVTsgLy8gbWFrZSBzdXJlIHRoZSByZXR1cm5lZCBhbmdsZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgKC1QSS8yLCAzUEkvMl1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYW5nbGUsXG4gICAgZGlzdGFuY2U6IHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlclxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKHB0MTogUG9pbnQsIHB0MjogUG9pbnQpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwdDIueCAtIHB0MS54LCAyKSArIE1hdGgucG93KHB0Mi55IC0gcHQxLnksIDIpKTtcbn1cblxuLyoqXG4gKiBTaG9ydGVzdCBkaXN0YW5jZSBiZXR3ZWVuIGFuZ2xlcywgaW4gZWl0aGVyIGRpcmVjdGlvbi5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYW5nbGVEaWZmKGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gIHJldHVybiAoYSAtIGIgKyBQSVRBVSkgJSBUQVUgLSBQSTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYW5nbGUgdG8gYmUgYmV0d2VlbiAwIGFuZCAyKlBJXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX25vcm1hbGl6ZUFuZ2xlKGE6IG51bWJlcikge1xuICByZXR1cm4gKGEgJSBUQVUgKyBUQVUpICUgVEFVO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYW5nbGVCZXR3ZWVuKGFuZ2xlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBzYW1lQW5nbGVJc0Z1bGxDaXJjbGU/OiBib29sZWFuKSB7XG4gIGNvbnN0IGEgPSBfbm9ybWFsaXplQW5nbGUoYW5nbGUpO1xuICBjb25zdCBzID0gX25vcm1hbGl6ZUFuZ2xlKHN0YXJ0KTtcbiAgY29uc3QgZSA9IF9ub3JtYWxpemVBbmdsZShlbmQpO1xuICBjb25zdCBhbmdsZVRvU3RhcnQgPSBfbm9ybWFsaXplQW5nbGUocyAtIGEpO1xuICBjb25zdCBhbmdsZVRvRW5kID0gX25vcm1hbGl6ZUFuZ2xlKGUgLSBhKTtcbiAgY29uc3Qgc3RhcnRUb0FuZ2xlID0gX25vcm1hbGl6ZUFuZ2xlKGEgLSBzKTtcbiAgY29uc3QgZW5kVG9BbmdsZSA9IF9ub3JtYWxpemVBbmdsZShhIC0gZSk7XG4gIHJldHVybiBhID09PSBzIHx8IGEgPT09IGUgfHwgKHNhbWVBbmdsZUlzRnVsbENpcmNsZSAmJiBzID09PSBlKVxuICAgIHx8IChhbmdsZVRvU3RhcnQgPiBhbmdsZVRvRW5kICYmIHN0YXJ0VG9BbmdsZSA8IGVuZFRvQW5nbGUpO1xufVxuXG4vKipcbiAqIExpbWl0IGB2YWx1ZWAgYmV0d2VlbiBgbWluYCBhbmQgYG1heGBcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIG1pblxuICogQHBhcmFtIG1heFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9saW1pdFZhbHVlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2ludDE2UmFuZ2UodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gX2xpbWl0VmFsdWUodmFsdWUsIC0zMjc2OCwgMzI3NjcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHN0YXJ0XG4gKiBAcGFyYW0gZW5kXG4gKiBAcGFyYW0gW2Vwc2lsb25dXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2lzQmV0d2Vlbih2YWx1ZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZXBzaWxvbiA9IDFlLTYpIHtcbiAgcmV0dXJuIHZhbHVlID49IE1hdGgubWluKHN0YXJ0LCBlbmQpIC0gZXBzaWxvbiAmJiB2YWx1ZSA8PSBNYXRoLm1heChzdGFydCwgZW5kKSArIGVwc2lsb247XG59XG4iLCAiaW1wb3J0IHtfY2FwaXRhbGl6ZX0gZnJvbSAnLi9oZWxwZXJzLmNvcmUuanMnO1xuXG4vKipcbiAqIEJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIHZhbHVlIC0gdmFsdWUgdG8gZmluZFxuICogQHBhcmFtIGNtcFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9sb29rdXAoXG4gIHRhYmxlOiBudW1iZXJbXSxcbiAgdmFsdWU6IG51bWJlcixcbiAgY21wPzogKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW5cbik6IHtsbzogbnVtYmVyLCBoaTogbnVtYmVyfTtcbmV4cG9ydCBmdW5jdGlvbiBfbG9va3VwPFQ+KFxuICB0YWJsZTogVFtdLFxuICB2YWx1ZTogbnVtYmVyLFxuICBjbXA6ICh2YWx1ZTogbnVtYmVyKSA9PiBib29sZWFuXG4pOiB7bG86IG51bWJlciwgaGk6IG51bWJlcn07XG5leHBvcnQgZnVuY3Rpb24gX2xvb2t1cChcbiAgdGFibGU6IHVua25vd25bXSxcbiAgdmFsdWU6IG51bWJlcixcbiAgY21wPzogKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW5cbikge1xuICBjbXAgPSBjbXAgfHwgKChpbmRleCkgPT4gdGFibGVbaW5kZXhdIDwgdmFsdWUpO1xuICBsZXQgaGkgPSB0YWJsZS5sZW5ndGggLSAxO1xuICBsZXQgbG8gPSAwO1xuICBsZXQgbWlkOiBudW1iZXI7XG5cbiAgd2hpbGUgKGhpIC0gbG8gPiAxKSB7XG4gICAgbWlkID0gKGxvICsgaGkpID4+IDE7XG4gICAgaWYgKGNtcChtaWQpKSB7XG4gICAgICBsbyA9IG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGkgPSBtaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtsbywgaGl9O1xufVxuXG4vKipcbiAqIEJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIGtleSAtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB2YWx1ZSBpbiBlYWNoIGVudHJ5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byBmaW5kXG4gKiBAcGFyYW0gbGFzdCAtIGxvb2t1cCBsYXN0IGluZGV4XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2xvb2t1cEJ5S2V5ID0gKFxuICB0YWJsZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPltdLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IG51bWJlcixcbiAgbGFzdD86IGJvb2xlYW5cbikgPT5cbiAgX2xvb2t1cCh0YWJsZSwgdmFsdWUsIGxhc3RcbiAgICA/IGluZGV4ID0+IHtcbiAgICAgIGNvbnN0IHRpID0gdGFibGVbaW5kZXhdW2tleV07XG4gICAgICByZXR1cm4gdGkgPCB2YWx1ZSB8fCB0aSA9PT0gdmFsdWUgJiYgdGFibGVbaW5kZXggKyAxXVtrZXldID09PSB2YWx1ZTtcbiAgICB9XG4gICAgOiBpbmRleCA9PiB0YWJsZVtpbmRleF1ba2V5XSA8IHZhbHVlKTtcblxuLyoqXG4gKiBSZXZlcnNlIGJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIGtleSAtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB2YWx1ZSBpbiBlYWNoIGVudHJ5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byBmaW5kXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX3Jsb29rdXBCeUtleSA9IChcbiAgdGFibGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5bXSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBudW1iZXJcbikgPT5cbiAgX2xvb2t1cCh0YWJsZSwgdmFsdWUsIGluZGV4ID0+IHRhYmxlW2luZGV4XVtrZXldID49IHZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm4gc3Vic2V0IG9mIGB2YWx1ZXNgIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIGluY2x1c2l2ZS5cbiAqIFZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBzb3J0ZWQgb3JkZXIuXG4gKiBAcGFyYW0gdmFsdWVzIC0gc29ydGVkIGFycmF5IG9mIHZhbHVlc1xuICogQHBhcmFtIG1pbiAtIG1pbiB2YWx1ZVxuICogQHBhcmFtIG1heCAtIG1heCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2ZpbHRlckJldHdlZW4odmFsdWVzOiBudW1iZXJbXSwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBlbmQgPSB2YWx1ZXMubGVuZ3RoO1xuXG4gIHdoaWxlIChzdGFydCA8IGVuZCAmJiB2YWx1ZXNbc3RhcnRdIDwgbWluKSB7XG4gICAgc3RhcnQrKztcbiAgfVxuICB3aGlsZSAoZW5kID4gc3RhcnQgJiYgdmFsdWVzW2VuZCAtIDFdID4gbWF4KSB7XG4gICAgZW5kLS07XG4gIH1cblxuICByZXR1cm4gc3RhcnQgPiAwIHx8IGVuZCA8IHZhbHVlcy5sZW5ndGhcbiAgICA/IHZhbHVlcy5zbGljZShzdGFydCwgZW5kKVxuICAgIDogdmFsdWVzO1xufVxuXG5jb25zdCBhcnJheUV2ZW50cyA9IFsncHVzaCcsICdwb3AnLCAnc2hpZnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBBcnJheUxpc3RlbmVyPFQ+IHtcbiAgX29uRGF0YVB1c2g/KC4uLml0ZW06IFRbXSk6IHZvaWQ7XG4gIF9vbkRhdGFQb3A/KCk6IHZvaWQ7XG4gIF9vbkRhdGFTaGlmdD8oKTogdm9pZDtcbiAgX29uRGF0YVNwbGljZT8oaW5kZXg6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IFRbXSk6IHZvaWQ7XG4gIF9vbkRhdGFVbnNoaWZ0PyguLi5pdGVtOiBUW10pOiB2b2lkO1xufVxuXG4vKipcbiAqIEhvb2tzIHRoZSBhcnJheSBtZXRob2RzIHRoYXQgYWRkIG9yIHJlbW92ZSB2YWx1ZXMgKCdwdXNoJywgcG9wJywgJ3NoaWZ0JywgJ3NwbGljZScsXG4gKiAndW5zaGlmdCcpIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVyIEFGVEVSIHRoZSBhcnJheSBoYXMgYmVlbiBhbHRlcmVkLiBMaXN0ZW5lcnMgYXJlXG4gKiBjYWxsZWQgb24gdGhlICdfb25EYXRhKicgY2FsbGJhY2tzIChlLmcuIF9vbkRhdGFQdXNoLCBldGMuKSB3aXRoIHNhbWUgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQXJyYXlFdmVudHM8VD4oYXJyYXk6IFRbXSwgbGlzdGVuZXI6IEFycmF5TGlzdGVuZXI8VD4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFycmF5RXZlbnRzKGFycmF5LCBsaXN0ZW5lcikge1xuICBpZiAoYXJyYXkuX2NoYXJ0anMpIHtcbiAgICBhcnJheS5fY2hhcnRqcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFycmF5LCAnX2NoYXJ0anMnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiB7XG4gICAgICBsaXN0ZW5lcnM6IFtsaXN0ZW5lcl1cbiAgICB9XG4gIH0pO1xuXG4gIGFycmF5RXZlbnRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdfb25EYXRhJyArIF9jYXBpdGFsaXplKGtleSk7XG4gICAgY29uc3QgYmFzZSA9IGFycmF5W2tleV07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZSguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGJhc2UuYXBwbHkodGhpcywgYXJncyk7XG5cbiAgICAgICAgYXJyYXkuX2NoYXJ0anMubGlzdGVuZXJzLmZvckVhY2goKG9iamVjdCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9iamVjdFttZXRob2RdKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBhcnJheSBldmVudCBsaXN0ZW5lciBhbmQgY2xlYW51cCBleHRyYSBhdHRhY2hlZCBwcm9wZXJ0aWVzIChzdWNoIGFzXG4gKiB0aGUgX2NoYXJ0anMgc3R1YiBhbmQgb3ZlcnJpZGRlbiBtZXRob2RzKSBpZiBhcnJheSBkb2Vzbid0IGhhdmUgYW55IG1vcmUgbGlzdGVuZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5saXN0ZW5BcnJheUV2ZW50czxUPihhcnJheTogVFtdLCBsaXN0ZW5lcjogQXJyYXlMaXN0ZW5lcjxUPik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gdW5saXN0ZW5BcnJheUV2ZW50cyhhcnJheSwgbGlzdGVuZXIpIHtcbiAgY29uc3Qgc3R1YiA9IGFycmF5Ll9jaGFydGpzO1xuICBpZiAoIXN0dWIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBsaXN0ZW5lcnMgPSBzdHViLmxpc3RlbmVycztcbiAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFycmF5RXZlbnRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGRlbGV0ZSBhcnJheVtrZXldO1xuICB9KTtcblxuICBkZWxldGUgYXJyYXkuX2NoYXJ0anM7XG59XG5cbi8qKlxuICogQHBhcmFtIGl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYXJyYXlVbmlxdWU8VD4oaXRlbXM6IFRbXSkge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0PFQ+KCk7XG4gIGxldCBpOiBudW1iZXIsIGlsZW46IG51bWJlcjtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgc2V0LmFkZChpdGVtc1tpXSk7XG4gIH1cblxuICBpZiAoc2V0LnNpemUgPT09IGlsZW4pIHtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShzZXQpO1xufVxuIiwgImltcG9ydCB0eXBlIHtDaGFydE1ldGEsIFBvaW50RWxlbWVudH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG5pbXBvcnQge19saW1pdFZhbHVlfSBmcm9tICcuL2hlbHBlcnMubWF0aC5qcyc7XG5pbXBvcnQge19sb29rdXBCeUtleX0gZnJvbSAnLi9oZWxwZXJzLmNvbGxlY3Rpb24uanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9udFN0cmluZyhwaXhlbFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnRGYW1pbHk6IHN0cmluZykge1xuICByZXR1cm4gZm9udFN0eWxlICsgJyAnICsgcGl4ZWxTaXplICsgJ3B4ICcgKyBmb250RmFtaWx5O1xufVxuXG4vKipcbiogUmVxdWVzdCBhbmltYXRpb24gcG9seWZpbGxcbiovXG5leHBvcnQgY29uc3QgcmVxdWVzdEFuaW1GcmFtZSA9IChmdW5jdGlvbigpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xufSgpKTtcblxuLyoqXG4gKiBUaHJvdHRsZXMgY2FsbGluZyBgZm5gIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuICogTGF0ZXN0IGFyZ3VtZW50cyBhcmUgdXNlZCBvbiB0aGUgYWN0dWFsIGNhbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlZDxUQXJncyBleHRlbmRzIEFycmF5PGFueT4+KFxuICBmbjogKC4uLmFyZ3M6IFRBcmdzKSA9PiB2b2lkLFxuICB0aGlzQXJnOiBhbnksXG4pIHtcbiAgbGV0IGFyZ3NUb1VzZSA9IFtdIGFzIFRBcmdzO1xuICBsZXQgdGlja2luZyA9IGZhbHNlO1xuXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBUQXJncykge1xuICAgIC8vIFNhdmUgdGhlIGFyZ3MgZm9yIHVzZSBsYXRlclxuICAgIGFyZ3NUb1VzZSA9IGFyZ3M7XG4gICAgaWYgKCF0aWNraW5nKSB7XG4gICAgICB0aWNraW5nID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csICgpID0+IHtcbiAgICAgICAgdGlja2luZyA9IGZhbHNlO1xuICAgICAgICBmbi5hcHBseSh0aGlzQXJnLCBhcmdzVG9Vc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIERlYm91bmNlcyBjYWxsaW5nIGBmbmAgZm9yIGBkZWxheWAgbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFRBcmdzIGV4dGVuZHMgQXJyYXk8YW55Pj4oZm46ICguLi5hcmdzOiBUQXJncykgPT4gdm9pZCwgZGVsYXk6IG51bWJlcikge1xuICBsZXQgdGltZW91dDtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IFRBcmdzKSB7XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmbiwgZGVsYXksIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGF5O1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzICdzdGFydCcgdG8gJ2xlZnQnLCAnZW5kJyB0byAncmlnaHQnIGFuZCBvdGhlcnMgdG8gJ2NlbnRlcidcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfdG9MZWZ0UmlnaHRDZW50ZXIgPSAoYWxpZ246ICdzdGFydCcgfCAnZW5kJyB8ICdjZW50ZXInKSA9PiBhbGlnbiA9PT0gJ3N0YXJ0JyA/ICdsZWZ0JyA6IGFsaWduID09PSAnZW5kJyA/ICdyaWdodCcgOiAnY2VudGVyJztcblxuLyoqXG4gKiBSZXR1cm5zIGBzdGFydGAsIGBlbmRgIG9yIGAoc3RhcnQgKyBlbmQpIC8gMmAgZGVwZW5kaW5nIG9uIGBhbGlnbmAuIERlZmF1bHRzIHRvIGBjZW50ZXJgXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2FsaWduU3RhcnRFbmQgPSAoYWxpZ246ICdzdGFydCcgfCAnZW5kJyB8ICdjZW50ZXInLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gYWxpZ24gPT09ICdzdGFydCcgPyBzdGFydCA6IGFsaWduID09PSAnZW5kJyA/IGVuZCA6IChzdGFydCArIGVuZCkgLyAyO1xuXG4vKipcbiAqIFJldHVybnMgYGxlZnRgLCBgcmlnaHRgIG9yIGAobGVmdCArIHJpZ2h0KSAvIDJgIGRlcGVuZGluZyBvbiBgYWxpZ25gLiBEZWZhdWx0cyB0byBgbGVmdGBcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfdGV4dFggPSAoYWxpZ246ICdsZWZ0JyB8ICdyaWdodCcgfCAnY2VudGVyJywgbGVmdDogbnVtYmVyLCByaWdodDogbnVtYmVyLCBydGw6IGJvb2xlYW4pID0+IHtcbiAgY29uc3QgY2hlY2sgPSBydGwgPyAnbGVmdCcgOiAncmlnaHQnO1xuICByZXR1cm4gYWxpZ24gPT09IGNoZWNrID8gcmlnaHQgOiBhbGlnbiA9PT0gJ2NlbnRlcicgPyAobGVmdCArIHJpZ2h0KSAvIDIgOiBsZWZ0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gc3RhcnQgYW5kIGNvdW50IG9mIHZpc2libGUgcG9pbnRzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9nZXRTdGFydEFuZENvdW50T2ZWaXNpYmxlUG9pbnRzKG1ldGE6IENoYXJ0TWV0YTwnbGluZScgfCAnc2NhdHRlcic+LCBwb2ludHM6IFBvaW50RWxlbWVudFtdLCBhbmltYXRpb25zRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgY29uc3QgcG9pbnRDb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGNvdW50ID0gcG9pbnRDb3VudDtcblxuICBpZiAobWV0YS5fc29ydGVkKSB7XG4gICAgY29uc3Qge2lTY2FsZSwgX3BhcnNlZH0gPSBtZXRhO1xuICAgIGNvbnN0IGF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gaVNjYWxlLmdldFVzZXJCb3VuZHMoKTtcblxuICAgIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgICBzdGFydCA9IF9saW1pdFZhbHVlKE1hdGgubWluKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5lZWQgdG8gdHlwZSBfcGFyc2VkXG4gICAgICAgIF9sb29rdXBCeUtleShfcGFyc2VkLCBpU2NhbGUuYXhpcywgbWluKS5sbyxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIGZpeCB0eXBlcyBvbiBfbG9va3VwQnlLZXlcbiAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkID8gcG9pbnRDb3VudCA6IF9sb29rdXBCeUtleShwb2ludHMsIGF4aXMsIGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKG1pbikpLmxvKSxcbiAgICAgIDAsIHBvaW50Q291bnQgLSAxKTtcbiAgICB9XG4gICAgaWYgKG1heERlZmluZWQpIHtcbiAgICAgIGNvdW50ID0gX2xpbWl0VmFsdWUoTWF0aC5tYXgoXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTmVlZCB0byB0eXBlIF9wYXJzZWRcbiAgICAgICAgX2xvb2t1cEJ5S2V5KF9wYXJzZWQsIGlTY2FsZS5heGlzLCBtYXgsIHRydWUpLmhpICsgMSxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIGZpeCB0eXBlcyBvbiBfbG9va3VwQnlLZXlcbiAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkID8gMCA6IF9sb29rdXBCeUtleShwb2ludHMsIGF4aXMsIGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKG1heCksIHRydWUpLmhpICsgMSksXG4gICAgICBzdGFydCwgcG9pbnRDb3VudCkgLSBzdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSBwb2ludENvdW50IC0gc3RhcnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtzdGFydCwgY291bnR9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgc2NhbGUgcmFuZ2VzIGhhdmUgY2hhbmdlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhIC0gZGF0YXNldCBtZXRhLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX3NjYWxlUmFuZ2VzQ2hhbmdlZChtZXRhKSB7XG4gIGNvbnN0IHt4U2NhbGUsIHlTY2FsZSwgX3NjYWxlUmFuZ2VzfSA9IG1ldGE7XG4gIGNvbnN0IG5ld1JhbmdlcyA9IHtcbiAgICB4bWluOiB4U2NhbGUubWluLFxuICAgIHhtYXg6IHhTY2FsZS5tYXgsXG4gICAgeW1pbjogeVNjYWxlLm1pbixcbiAgICB5bWF4OiB5U2NhbGUubWF4XG4gIH07XG4gIGlmICghX3NjYWxlUmFuZ2VzKSB7XG4gICAgbWV0YS5fc2NhbGVSYW5nZXMgPSBuZXdSYW5nZXM7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgY2hhbmdlZCA9IF9zY2FsZVJhbmdlcy54bWluICE9PSB4U2NhbGUubWluXG5cdFx0fHwgX3NjYWxlUmFuZ2VzLnhtYXggIT09IHhTY2FsZS5tYXhcblx0XHR8fCBfc2NhbGVSYW5nZXMueW1pbiAhPT0geVNjYWxlLm1pblxuXHRcdHx8IF9zY2FsZVJhbmdlcy55bWF4ICE9PSB5U2NhbGUubWF4O1xuXG4gIE9iamVjdC5hc3NpZ24oX3NjYWxlUmFuZ2VzLCBuZXdSYW5nZXMpO1xuICByZXR1cm4gY2hhbmdlZDtcbn1cbiIsICJpbXBvcnQge1BJLCBUQVUsIEhBTEZfUEl9IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcblxuY29uc3QgYXRFZGdlID0gKHQ6IG51bWJlcikgPT4gdCA9PT0gMCB8fCB0ID09PSAxO1xuY29uc3QgZWxhc3RpY0luID0gKHQ6IG51bWJlciwgczogbnVtYmVyLCBwOiBudW1iZXIpID0+IC0oTWF0aC5wb3coMiwgMTAgKiAodCAtPSAxKSkgKiBNYXRoLnNpbigodCAtIHMpICogVEFVIC8gcCkpO1xuY29uc3QgZWxhc3RpY091dCA9ICh0OiBudW1iZXIsIHM6IG51bWJlciwgcDogbnVtYmVyKSA9PiBNYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKCh0IC0gcykgKiBUQVUgLyBwKSArIDE7XG5cbi8qKlxuICogRWFzaW5nIGZ1bmN0aW9ucyBhZGFwdGVkIGZyb20gUm9iZXJ0IFBlbm5lcidzIGVhc2luZyBlcXVhdGlvbnMuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuZWFzaW5nLmVmZmVjdHNcbiAqIEBzZWUgaHR0cDovL3d3dy5yb2JlcnRwZW5uZXIuY29tL2Vhc2luZy9cbiAqL1xuY29uc3QgZWZmZWN0cyA9IHtcbiAgbGluZWFyOiAodDogbnVtYmVyKSA9PiB0LFxuXG4gIGVhc2VJblF1YWQ6ICh0OiBudW1iZXIpID0+IHQgKiB0LFxuXG4gIGVhc2VPdXRRdWFkOiAodDogbnVtYmVyKSA9PiAtdCAqICh0IC0gMiksXG5cbiAgZWFzZUluT3V0UXVhZDogKHQ6IG51bWJlcikgPT4gKCh0IC89IDAuNSkgPCAxKVxuICAgID8gMC41ICogdCAqIHRcbiAgICA6IC0wLjUgKiAoKC0tdCkgKiAodCAtIDIpIC0gMSksXG5cbiAgZWFzZUluQ3ViaWM6ICh0OiBudW1iZXIpID0+IHQgKiB0ICogdCxcblxuICBlYXNlT3V0Q3ViaWM6ICh0OiBudW1iZXIpID0+ICh0IC09IDEpICogdCAqIHQgKyAxLFxuXG4gIGVhc2VJbk91dEN1YmljOiAodDogbnVtYmVyKSA9PiAoKHQgLz0gMC41KSA8IDEpXG4gICAgPyAwLjUgKiB0ICogdCAqIHRcbiAgICA6IDAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICsgMiksXG5cbiAgZWFzZUluUXVhcnQ6ICh0OiBudW1iZXIpID0+IHQgKiB0ICogdCAqIHQsXG5cbiAgZWFzZU91dFF1YXJ0OiAodDogbnVtYmVyKSA9PiAtKCh0IC09IDEpICogdCAqIHQgKiB0IC0gMSksXG5cbiAgZWFzZUluT3V0UXVhcnQ6ICh0OiBudW1iZXIpID0+ICgodCAvPSAwLjUpIDwgMSlcbiAgICA/IDAuNSAqIHQgKiB0ICogdCAqIHRcbiAgICA6IC0wLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgLSAyKSxcblxuICBlYXNlSW5RdWludDogKHQ6IG51bWJlcikgPT4gdCAqIHQgKiB0ICogdCAqIHQsXG5cbiAgZWFzZU91dFF1aW50OiAodDogbnVtYmVyKSA9PiAodCAtPSAxKSAqIHQgKiB0ICogdCAqIHQgKyAxLFxuXG4gIGVhc2VJbk91dFF1aW50OiAodDogbnVtYmVyKSA9PiAoKHQgLz0gMC41KSA8IDEpXG4gICAgPyAwLjUgKiB0ICogdCAqIHQgKiB0ICogdFxuICAgIDogMC41ICogKCh0IC09IDIpICogdCAqIHQgKiB0ICogdCArIDIpLFxuXG4gIGVhc2VJblNpbmU6ICh0OiBudW1iZXIpID0+IC1NYXRoLmNvcyh0ICogSEFMRl9QSSkgKyAxLFxuXG4gIGVhc2VPdXRTaW5lOiAodDogbnVtYmVyKSA9PiBNYXRoLnNpbih0ICogSEFMRl9QSSksXG5cbiAgZWFzZUluT3V0U2luZTogKHQ6IG51bWJlcikgPT4gLTAuNSAqIChNYXRoLmNvcyhQSSAqIHQpIC0gMSksXG5cbiAgZWFzZUluRXhwbzogKHQ6IG51bWJlcikgPT4gKHQgPT09IDApID8gMCA6IE1hdGgucG93KDIsIDEwICogKHQgLSAxKSksXG5cbiAgZWFzZU91dEV4cG86ICh0OiBudW1iZXIpID0+ICh0ID09PSAxKSA/IDEgOiAtTWF0aC5wb3coMiwgLTEwICogdCkgKyAxLFxuXG4gIGVhc2VJbk91dEV4cG86ICh0OiBudW1iZXIpID0+IGF0RWRnZSh0KSA/IHQgOiB0IDwgMC41XG4gICAgPyAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh0ICogMiAtIDEpKVxuICAgIDogMC41ICogKC1NYXRoLnBvdygyLCAtMTAgKiAodCAqIDIgLSAxKSkgKyAyKSxcblxuICBlYXNlSW5DaXJjOiAodDogbnVtYmVyKSA9PiAodCA+PSAxKSA/IHQgOiAtKE1hdGguc3FydCgxIC0gdCAqIHQpIC0gMSksXG5cbiAgZWFzZU91dENpcmM6ICh0OiBudW1iZXIpID0+IE1hdGguc3FydCgxIC0gKHQgLT0gMSkgKiB0KSxcblxuICBlYXNlSW5PdXRDaXJjOiAodDogbnVtYmVyKSA9PiAoKHQgLz0gMC41KSA8IDEpXG4gICAgPyAtMC41ICogKE1hdGguc3FydCgxIC0gdCAqIHQpIC0gMSlcbiAgICA6IDAuNSAqIChNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSxcblxuICBlYXNlSW5FbGFzdGljOiAodDogbnVtYmVyKSA9PiBhdEVkZ2UodCkgPyB0IDogZWxhc3RpY0luKHQsIDAuMDc1LCAwLjMpLFxuXG4gIGVhc2VPdXRFbGFzdGljOiAodDogbnVtYmVyKSA9PiBhdEVkZ2UodCkgPyB0IDogZWxhc3RpY091dCh0LCAwLjA3NSwgMC4zKSxcblxuICBlYXNlSW5PdXRFbGFzdGljKHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHMgPSAwLjExMjU7XG4gICAgY29uc3QgcCA9IDAuNDU7XG4gICAgcmV0dXJuIGF0RWRnZSh0KSA/IHQgOlxuICAgICAgdCA8IDAuNVxuICAgICAgICA/IDAuNSAqIGVsYXN0aWNJbih0ICogMiwgcywgcClcbiAgICAgICAgOiAwLjUgKyAwLjUgKiBlbGFzdGljT3V0KHQgKiAyIC0gMSwgcywgcCk7XG4gIH0sXG5cbiAgZWFzZUluQmFjayh0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTtcbiAgfSxcblxuICBlYXNlT3V0QmFjayh0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gKHQgLT0gMSkgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEJhY2sodDogbnVtYmVyKSB7XG4gICAgbGV0IHMgPSAxLjcwMTU4O1xuICAgIGlmICgodCAvPSAwLjUpIDwgMSkge1xuICAgICAgcmV0dXJuIDAuNSAqICh0ICogdCAqICgoKHMgKj0gKDEuNTI1KSkgKyAxKSAqIHQgLSBzKSk7XG4gICAgfVxuICAgIHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogKCgocyAqPSAoMS41MjUpKSArIDEpICogdCArIHMpICsgMik7XG4gIH0sXG5cbiAgZWFzZUluQm91bmNlOiAodDogbnVtYmVyKSA9PiAxIC0gZWZmZWN0cy5lYXNlT3V0Qm91bmNlKDEgLSB0KSxcblxuICBlYXNlT3V0Qm91bmNlKHQ6IG51bWJlcikge1xuICAgIGNvbnN0IG0gPSA3LjU2MjU7XG4gICAgY29uc3QgZCA9IDIuNzU7XG4gICAgaWYgKHQgPCAoMSAvIGQpKSB7XG4gICAgICByZXR1cm4gbSAqIHQgKiB0O1xuICAgIH1cbiAgICBpZiAodCA8ICgyIC8gZCkpIHtcbiAgICAgIHJldHVybiBtICogKHQgLT0gKDEuNSAvIGQpKSAqIHQgKyAwLjc1O1xuICAgIH1cbiAgICBpZiAodCA8ICgyLjUgLyBkKSkge1xuICAgICAgcmV0dXJuIG0gKiAodCAtPSAoMi4yNSAvIGQpKSAqIHQgKyAwLjkzNzU7XG4gICAgfVxuICAgIHJldHVybiBtICogKHQgLT0gKDIuNjI1IC8gZCkpICogdCArIDAuOTg0Mzc1O1xuICB9LFxuXG4gIGVhc2VJbk91dEJvdW5jZTogKHQ6IG51bWJlcikgPT4gKHQgPCAwLjUpXG4gICAgPyBlZmZlY3RzLmVhc2VJbkJvdW5jZSh0ICogMikgKiAwLjVcbiAgICA6IGVmZmVjdHMuZWFzZU91dEJvdW5jZSh0ICogMiAtIDEpICogMC41ICsgMC41LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRWFzaW5nRnVuY3Rpb24gPSBrZXlvZiB0eXBlb2YgZWZmZWN0c1xuXG5leHBvcnQgZGVmYXVsdCBlZmZlY3RzO1xuIiwgImltcG9ydCB7Q29sb3J9IGZyb20gJ0BrdXJrbGUvY29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXR0ZXJuT3JHcmFkaWVudCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENhbnZhc1BhdHRlcm4gfCBDYW52YXNHcmFkaWVudCB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgdHlwZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IENhbnZhc1BhdHRlcm5dJyB8fCB0eXBlID09PSAnW29iamVjdCBDYW52YXNHcmFkaWVudF0nO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sb3IodmFsdWU6IENhbnZhc0dyYWRpZW50KTogQ2FudmFzR3JhZGllbnQ7XG5leHBvcnQgZnVuY3Rpb24gY29sb3IodmFsdWU6IENhbnZhc1BhdHRlcm4pOiBDYW52YXNQYXR0ZXJuO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKFxuICB2YWx1ZTpcbiAgfCBzdHJpbmdcbiAgfCB7IHI6IG51bWJlcjsgZzogbnVtYmVyOyBiOiBudW1iZXI7IGE6IG51bWJlciB9XG4gIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbik6IENvbG9yO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKHZhbHVlKSB7XG4gIHJldHVybiBpc1BhdHRlcm5PckdyYWRpZW50KHZhbHVlKSA/IHZhbHVlIDogbmV3IENvbG9yKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvdmVyQ29sb3IodmFsdWU6IENhbnZhc0dyYWRpZW50KTogQ2FudmFzR3JhZGllbnQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0SG92ZXJDb2xvcih2YWx1ZTogQ2FudmFzUGF0dGVybik6IENhbnZhc1BhdHRlcm47XG5leHBvcnQgZnVuY3Rpb24gZ2V0SG92ZXJDb2xvcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhvdmVyQ29sb3IodmFsdWUpIHtcbiAgcmV0dXJuIGlzUGF0dGVybk9yR3JhZGllbnQodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IENvbG9yKHZhbHVlKS5zYXR1cmF0ZSgwLjUpLmRhcmtlbigwLjEpLmhleFN0cmluZygpO1xufVxuIiwgImNvbnN0IG51bWJlcnMgPSBbJ3gnLCAneScsICdib3JkZXJXaWR0aCcsICdyYWRpdXMnLCAndGVuc2lvbiddO1xuY29uc3QgY29sb3JzID0gWydjb2xvcicsICdib3JkZXJDb2xvcicsICdiYWNrZ3JvdW5kQ29sb3InXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QW5pbWF0aW9uc0RlZmF1bHRzKGRlZmF1bHRzKSB7XG4gIGRlZmF1bHRzLnNldCgnYW5pbWF0aW9uJywge1xuICAgIGRlbGF5OiB1bmRlZmluZWQsXG4gICAgZHVyYXRpb246IDEwMDAsXG4gICAgZWFzaW5nOiAnZWFzZU91dFF1YXJ0JyxcbiAgICBmbjogdW5kZWZpbmVkLFxuICAgIGZyb206IHVuZGVmaW5lZCxcbiAgICBsb29wOiB1bmRlZmluZWQsXG4gICAgdG86IHVuZGVmaW5lZCxcbiAgICB0eXBlOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIGRlZmF1bHRzLmRlc2NyaWJlKCdhbmltYXRpb24nLCB7XG4gICAgX2ZhbGxiYWNrOiBmYWxzZSxcbiAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgICBfc2NyaXB0YWJsZTogKG5hbWUpID0+IG5hbWUgIT09ICdvblByb2dyZXNzJyAmJiBuYW1lICE9PSAnb25Db21wbGV0ZScgJiYgbmFtZSAhPT0gJ2ZuJyxcbiAgfSk7XG5cbiAgZGVmYXVsdHMuc2V0KCdhbmltYXRpb25zJywge1xuICAgIGNvbG9yczoge1xuICAgICAgdHlwZTogJ2NvbG9yJyxcbiAgICAgIHByb3BlcnRpZXM6IGNvbG9yc1xuICAgIH0sXG4gICAgbnVtYmVyczoge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBwcm9wZXJ0aWVzOiBudW1iZXJzXG4gICAgfSxcbiAgfSk7XG5cbiAgZGVmYXVsdHMuZGVzY3JpYmUoJ2FuaW1hdGlvbnMnLCB7XG4gICAgX2ZhbGxiYWNrOiAnYW5pbWF0aW9uJyxcbiAgfSk7XG5cbiAgZGVmYXVsdHMuc2V0KCd0cmFuc2l0aW9ucycsIHtcbiAgICBhY3RpdmU6IHtcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICB9XG4gICAgfSxcbiAgICByZXNpemU6IHtcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgfVxuICAgIH0sXG4gICAgc2hvdzoge1xuICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICBmcm9tOiAndHJhbnNwYXJlbnQnXG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IHtcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgZHVyYXRpb246IDAgLy8gc2hvdyBpbW1lZGlhdGVseVxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0sXG4gICAgaGlkZToge1xuICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICB0bzogJ3RyYW5zcGFyZW50J1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiB7XG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIGVhc2luZzogJ2xpbmVhcicsXG4gICAgICAgICAgZm46IHYgPT4gdiB8IDAgLy8gZm9yIGtlZXBpbmcgdGhlIGRhdGFzZXQgdmlzaWJsZSBhbGwgdGhlIHdheSB0aHJvdWdoIHRoZSBhbmltYXRpb25cbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBhcHBseUxheW91dHNEZWZhdWx0cyhkZWZhdWx0cykge1xuICBkZWZhdWx0cy5zZXQoJ2xheW91dCcsIHtcbiAgICBhdXRvUGFkZGluZzogdHJ1ZSxcbiAgICBwYWRkaW5nOiB7XG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDBcbiAgICB9XG4gIH0pO1xufVxuIiwgIlxuY29uc3QgaW50bENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEludGwuTnVtYmVyRm9ybWF0PigpO1xuXG5mdW5jdGlvbiBnZXROdW1iZXJGb3JtYXQobG9jYWxlOiBzdHJpbmcsIG9wdGlvbnM/OiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGNhY2hlS2V5ID0gbG9jYWxlICsgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gIGxldCBmb3JtYXR0ZXIgPSBpbnRsQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFmb3JtYXR0ZXIpIHtcbiAgICBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKTtcbiAgICBpbnRsQ2FjaGUuc2V0KGNhY2hlS2V5LCBmb3JtYXR0ZXIpO1xuICB9XG4gIHJldHVybiBmb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXIobnVtOiBudW1iZXIsIGxvY2FsZTogc3RyaW5nLCBvcHRpb25zPzogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zKSB7XG4gIHJldHVybiBnZXROdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKS5mb3JtYXQobnVtKTtcbn1cbiIsICJpbXBvcnQge2lzQXJyYXl9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Zm9ybWF0TnVtYmVyfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuaW50bC5qcyc7XG5pbXBvcnQge2xvZzEwfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5cbi8qKlxuICogTmFtZXNwYWNlIHRvIGhvbGQgZm9ybWF0dGVycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRpY2tzXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnNcbiAqL1xuY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLyoqXG4gICAqIEZvcm1hdHRlciBmb3IgdmFsdWUgbGFiZWxzXG4gICAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy52YWx1ZXNcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBkaXNwbGF5XG4gICAqIEByZXR1cm4ge3N0cmluZ3xzdHJpbmdbXX0gdGhlIGxhYmVsIHRvIGRpc3BsYXlcbiAgICovXG4gIHZhbHVlcyh2YWx1ZSkge1xuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IC8qKiBAdHlwZSB7c3RyaW5nW119ICovICh2YWx1ZSkgOiAnJyArIHZhbHVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZXIgZm9yIG51bWVyaWMgdGlja3NcbiAgICogQG1ldGhvZCBDaGFydC5UaWNrcy5mb3JtYXR0ZXJzLm51bWVyaWNcbiAgICogQHBhcmFtIHRpY2tWYWx1ZSB7bnVtYmVyfSB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkXG4gICAqIEBwYXJhbSBpbmRleCB7bnVtYmVyfSB0aGUgcG9zaXRpb24gb2YgdGhlIHRpY2tWYWx1ZSBwYXJhbWV0ZXIgaW4gdGhlIHRpY2tzIGFycmF5XG4gICAqIEBwYXJhbSB0aWNrcyB7b2JqZWN0W119IHRoZSBsaXN0IG9mIHRpY2tzIGJlaW5nIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlclxuICAgKi9cbiAgbnVtZXJpYyh0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuICAgIGlmICh0aWNrVmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybiAnMCc7IC8vIG5ldmVyIHNob3cgZGVjaW1hbCBwbGFjZXMgZm9yIDBcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlO1xuICAgIGxldCBub3RhdGlvbjtcbiAgICBsZXQgZGVsdGEgPSB0aWNrVmFsdWU7IC8vIFRoaXMgaXMgdXNlZCB3aGVuIHRoZXJlIGFyZSBsZXNzIHRoYW4gMiB0aWNrcyBhcyB0aGUgdGljayBpbnRlcnZhbC5cblxuICAgIGlmICh0aWNrcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBhbGwgdGlja3MgYXJlIHNtYWxsIG9yIHRoZXJlIGh1Z2UgbnVtYmVyczsgdXNlIHNjaWVudGlmaWMgbm90YXRpb25cbiAgICAgIGNvbnN0IG1heFRpY2sgPSBNYXRoLm1heChNYXRoLmFicyh0aWNrc1swXS52YWx1ZSksIE1hdGguYWJzKHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlKSk7XG4gICAgICBpZiAobWF4VGljayA8IDFlLTQgfHwgbWF4VGljayA+IDFlKzE1KSB7XG4gICAgICAgIG5vdGF0aW9uID0gJ3NjaWVudGlmaWMnO1xuICAgICAgfVxuXG4gICAgICBkZWx0YSA9IGNhbGN1bGF0ZURlbHRhKHRpY2tWYWx1ZSwgdGlja3MpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ0RlbHRhID0gbG9nMTAoTWF0aC5hYnMoZGVsdGEpKTtcbiAgICBjb25zdCBudW1EZWNpbWFsID0gTWF0aC5tYXgoTWF0aC5taW4oLTEgKiBNYXRoLmZsb29yKGxvZ0RlbHRhKSwgMjApLCAwKTsgLy8gdG9GaXhlZCBoYXMgYSBtYXggb2YgMjAgZGVjaW1hbCBwbGFjZXNcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7bm90YXRpb24sIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbnVtRGVjaW1hbCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBudW1EZWNpbWFsfTtcbiAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpO1xuXG4gICAgcmV0dXJuIGZvcm1hdE51bWJlcih0aWNrVmFsdWUsIGxvY2FsZSwgb3B0aW9ucyk7XG4gIH0sXG5cblxuICAvKipcbiAgICogRm9ybWF0dGVyIGZvciBsb2dhcml0aG1pYyB0aWNrc1xuICAgKiBAbWV0aG9kIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnMubG9nYXJpdGhtaWNcbiAgICogQHBhcmFtIHRpY2tWYWx1ZSB7bnVtYmVyfSB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkXG4gICAqIEBwYXJhbSBpbmRleCB7bnVtYmVyfSB0aGUgcG9zaXRpb24gb2YgdGhlIHRpY2tWYWx1ZSBwYXJhbWV0ZXIgaW4gdGhlIHRpY2tzIGFycmF5XG4gICAqIEBwYXJhbSB0aWNrcyB7b2JqZWN0W119IHRoZSBsaXN0IG9mIHRpY2tzIGJlaW5nIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlclxuICAgKi9cbiAgbG9nYXJpdGhtaWModGlja1ZhbHVlLCBpbmRleCwgdGlja3MpIHtcbiAgICBpZiAodGlja1ZhbHVlID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAnO1xuICAgIH1cbiAgICBjb25zdCByZW1haW4gPSB0aWNrc1tpbmRleF0uc2lnbmlmaWNhbmQgfHwgKHRpY2tWYWx1ZSAvIChNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihsb2cxMCh0aWNrVmFsdWUpKSkpKTtcbiAgICBpZiAoWzEsIDIsIDMsIDUsIDEwLCAxNV0uaW5jbHVkZXMocmVtYWluKSB8fCBpbmRleCA+IDAuOCAqIHRpY2tzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcm1hdHRlcnMubnVtZXJpYy5jYWxsKHRoaXMsIHRpY2tWYWx1ZSwgaW5kZXgsIHRpY2tzKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbn07XG5cblxuZnVuY3Rpb24gY2FsY3VsYXRlRGVsdGEodGlja1ZhbHVlLCB0aWNrcykge1xuICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGRpZ2l0cyB0byBzaG93XG4gIC8vIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gdGlja3MgbWlnaHQgYmUgc21hbGxlciB0aGFuIG5vcm1hbCBzcGFjaW5nXG4gIGxldCBkZWx0YSA9IHRpY2tzLmxlbmd0aCA+IDMgPyB0aWNrc1syXS52YWx1ZSAtIHRpY2tzWzFdLnZhbHVlIDogdGlja3NbMV0udmFsdWUgLSB0aWNrc1swXS52YWx1ZTtcblxuICAvLyBJZiB3ZSBoYXZlIGEgbnVtYmVyIGxpa2UgMi41IGFzIHRoZSBkZWx0YSwgZmlndXJlIG91dCBob3cgbWFueSBkZWNpbWFsIHBsYWNlcyB3ZSBuZWVkXG4gIGlmIChNYXRoLmFicyhkZWx0YSkgPj0gMSAmJiB0aWNrVmFsdWUgIT09IE1hdGguZmxvb3IodGlja1ZhbHVlKSkge1xuICAgIC8vIG5vdCBhbiBpbnRlZ2VyXG4gICAgZGVsdGEgPSB0aWNrVmFsdWUgLSBNYXRoLmZsb29yKHRpY2tWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGRlbHRhO1xufVxuXG4vKipcbiAqIE5hbWVzcGFjZSB0byBob2xkIHN0YXRpYyB0aWNrIGdlbmVyYXRpb24gZnVuY3Rpb25zXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtmb3JtYXR0ZXJzfTtcbiIsICJpbXBvcnQgVGlja3MgZnJvbSAnLi9jb3JlLnRpY2tzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2NhbGVEZWZhdWx0cyhkZWZhdWx0cykge1xuICBkZWZhdWx0cy5zZXQoJ3NjYWxlJywge1xuICAgIGRpc3BsYXk6IHRydWUsXG4gICAgb2Zmc2V0OiBmYWxzZSxcbiAgICByZXZlcnNlOiBmYWxzZSxcbiAgICBiZWdpbkF0WmVybzogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBTY2FsZSBib3VuZGFyeSBzdHJhdGVneSAoYnlwYXNzZWQgYnkgbWluL21heCB0aW1lIG9wdGlvbnMpXG4gICAgICogLSBgZGF0YWA6IG1ha2Ugc3VyZSBkYXRhIGFyZSBmdWxseSB2aXNpYmxlLCB0aWNrcyBvdXRzaWRlIGFyZSByZW1vdmVkXG4gICAgICogLSBgdGlja3NgOiBtYWtlIHN1cmUgdGlja3MgYXJlIGZ1bGx5IHZpc2libGUsIGRhdGEgb3V0c2lkZSBhcmUgdHJ1bmNhdGVkXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1NTZcbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKi9cbiAgICBib3VuZHM6ICd0aWNrcycsXG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbiBncmFjZSBhZGRlZCB0byBtYXggYW5kIHJlZHVjZWQgZnJvbSBtaW4gZGF0YSB2YWx1ZS5cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKi9cbiAgICBncmFjZTogMCxcblxuICAgIC8vIGdyaWQgbGluZSBzZXR0aW5nc1xuICAgIGdyaWQ6IHtcbiAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBkcmF3T25DaGFydEFyZWE6IHRydWUsXG4gICAgICBkcmF3VGlja3M6IHRydWUsXG4gICAgICB0aWNrTGVuZ3RoOiA4LFxuICAgICAgdGlja1dpZHRoOiAoX2N0eCwgb3B0aW9ucykgPT4gb3B0aW9ucy5saW5lV2lkdGgsXG4gICAgICB0aWNrQ29sb3I6IChfY3R4LCBvcHRpb25zKSA9PiBvcHRpb25zLmNvbG9yLFxuICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICB9LFxuXG4gICAgYm9yZGVyOiB7XG4gICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgZGFzaDogW10sXG4gICAgICBkYXNoT2Zmc2V0OiAwLjAsXG4gICAgICB3aWR0aDogMVxuICAgIH0sXG5cbiAgICAvLyBzY2FsZSB0aXRsZVxuICAgIHRpdGxlOiB7XG4gICAgICAvLyBkaXNwbGF5IHByb3BlcnR5XG4gICAgICBkaXNwbGF5OiBmYWxzZSxcblxuICAgICAgLy8gYWN0dWFsIGxhYmVsXG4gICAgICB0ZXh0OiAnJyxcblxuICAgICAgLy8gdG9wL2JvdHRvbSBwYWRkaW5nXG4gICAgICBwYWRkaW5nOiB7XG4gICAgICAgIHRvcDogNCxcbiAgICAgICAgYm90dG9tOiA0XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIGxhYmVsIHNldHRpbmdzXG4gICAgdGlja3M6IHtcbiAgICAgIG1pblJvdGF0aW9uOiAwLFxuICAgICAgbWF4Um90YXRpb246IDUwLFxuICAgICAgbWlycm9yOiBmYWxzZSxcbiAgICAgIHRleHRTdHJva2VXaWR0aDogMCxcbiAgICAgIHRleHRTdHJva2VDb2xvcjogJycsXG4gICAgICBwYWRkaW5nOiAzLFxuICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgIGF1dG9Ta2lwOiB0cnVlLFxuICAgICAgYXV0b1NraXBQYWRkaW5nOiAzLFxuICAgICAgbGFiZWxPZmZzZXQ6IDAsXG4gICAgICAvLyBXZSBwYXNzIHRocm91Z2ggYXJyYXlzIHRvIGJlIHJlbmRlcmVkIGFzIG11bHRpbGluZSBsYWJlbHMsIHdlIGNvbnZlcnQgT3RoZXJzIHRvIHN0cmluZ3MgaGVyZS5cbiAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLnZhbHVlcyxcbiAgICAgIG1pbm9yOiB7fSxcbiAgICAgIG1ham9yOiB7fSxcbiAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgIGNyb3NzQWxpZ246ICduZWFyJyxcblxuICAgICAgc2hvd0xhYmVsQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgYmFja2Ryb3BDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSknLFxuICAgICAgYmFja2Ryb3BQYWRkaW5nOiAyLFxuICAgIH1cbiAgfSk7XG5cbiAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLnRpY2tzJywgJ2NvbG9yJywgJycsICdjb2xvcicpO1xuICBkZWZhdWx0cy5yb3V0ZSgnc2NhbGUuZ3JpZCcsICdjb2xvcicsICcnLCAnYm9yZGVyQ29sb3InKTtcbiAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLmJvcmRlcicsICdjb2xvcicsICcnLCAnYm9yZGVyQ29sb3InKTtcbiAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLnRpdGxlJywgJ2NvbG9yJywgJycsICdjb2xvcicpO1xuXG4gIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZScsIHtcbiAgICBfZmFsbGJhY2s6IGZhbHNlLFxuICAgIF9zY3JpcHRhYmxlOiAobmFtZSkgPT4gIW5hbWUuc3RhcnRzV2l0aCgnYmVmb3JlJykgJiYgIW5hbWUuc3RhcnRzV2l0aCgnYWZ0ZXInKSAmJiBuYW1lICE9PSAnY2FsbGJhY2snICYmIG5hbWUgIT09ICdwYXJzZXInLFxuICAgIF9pbmRleGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnYm9yZGVyRGFzaCcgJiYgbmFtZSAhPT0gJ3RpY2tCb3JkZXJEYXNoJyAmJiBuYW1lICE9PSAnZGFzaCcsXG4gIH0pO1xuXG4gIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZXMnLCB7XG4gICAgX2ZhbGxiYWNrOiAnc2NhbGUnLFxuICB9KTtcblxuICBkZWZhdWx0cy5kZXNjcmliZSgnc2NhbGUudGlja3MnLCB7XG4gICAgX3NjcmlwdGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnYmFja2Ryb3BQYWRkaW5nJyAmJiBuYW1lICE9PSAnY2FsbGJhY2snLFxuICAgIF9pbmRleGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnYmFja2Ryb3BQYWRkaW5nJyxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtnZXRIb3ZlckNvbG9yfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29sb3IuanMnO1xuaW1wb3J0IHtpc09iamVjdCwgbWVyZ2UsIHZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge2FwcGx5QW5pbWF0aW9uc0RlZmF1bHRzfSBmcm9tICcuL2NvcmUuYW5pbWF0aW9ucy5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge2FwcGx5TGF5b3V0c0RlZmF1bHRzfSBmcm9tICcuL2NvcmUubGF5b3V0cy5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge2FwcGx5U2NhbGVEZWZhdWx0c30gZnJvbSAnLi9jb3JlLnNjYWxlLmRlZmF1bHRzLmpzJztcblxuZXhwb3J0IGNvbnN0IG92ZXJyaWRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldFNjb3BlKG5vZGUsIGtleSkge1xuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgZm9yIChsZXQgaSA9IDAsIG4gPSBrZXlzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGNvbnN0IGsgPSBrZXlzW2ldO1xuICAgIG5vZGUgPSBub2RlW2tdIHx8IChub2RlW2tdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIHNldChyb290LCBzY29wZSwgdmFsdWVzKSB7XG4gIGlmICh0eXBlb2Ygc2NvcGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG1lcmdlKGdldFNjb3BlKHJvb3QsIHNjb3BlKSwgdmFsdWVzKTtcbiAgfVxuICByZXR1cm4gbWVyZ2UoZ2V0U2NvcGUocm9vdCwgJycpLCBzY29wZSk7XG59XG5cbi8qKlxuICogUGxlYXNlIHVzZSB0aGUgbW9kdWxlJ3MgZGVmYXVsdCBleHBvcnQgd2hpY2ggcHJvdmlkZXMgYSBzaW5nbGV0b24gaW5zdGFuY2VcbiAqIE5vdGU6IGNsYXNzIGlzIGV4cG9ydGVkIGZvciB0eXBlZG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0cyB7XG4gIGNvbnN0cnVjdG9yKF9kZXNjcmlwdG9ycywgX2FwcGxpZXJzKSB7XG4gICAgdGhpcy5hbmltYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgwLDAsMCwwLjEpJztcbiAgICB0aGlzLmJvcmRlckNvbG9yID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG4gICAgdGhpcy5jb2xvciA9ICcjNjY2JztcbiAgICB0aGlzLmRhdGFzZXRzID0ge307XG4gICAgdGhpcy5kZXZpY2VQaXhlbFJhdGlvID0gKGNvbnRleHQpID0+IGNvbnRleHQuY2hhcnQucGxhdGZvcm0uZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuZWxlbWVudHMgPSB7fTtcbiAgICB0aGlzLmV2ZW50cyA9IFtcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgJ21vdXNlb3V0JyxcbiAgICAgICdjbGljaycsXG4gICAgICAndG91Y2hzdGFydCcsXG4gICAgICAndG91Y2htb3ZlJ1xuICAgIF07XG4gICAgdGhpcy5mb250ID0ge1xuICAgICAgZmFtaWx5OiBcIidIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmXCIsXG4gICAgICBzaXplOiAxMixcbiAgICAgIHN0eWxlOiAnbm9ybWFsJyxcbiAgICAgIGxpbmVIZWlnaHQ6IDEuMixcbiAgICAgIHdlaWdodDogbnVsbFxuICAgIH07XG4gICAgdGhpcy5ob3ZlciA9IHt9O1xuICAgIHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3IgPSAoY3R4LCBvcHRpb25zKSA9PiBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKTtcbiAgICB0aGlzLmhvdmVyQm9yZGVyQ29sb3IgPSAoY3R4LCBvcHRpb25zKSA9PiBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpO1xuICAgIHRoaXMuaG92ZXJDb2xvciA9IChjdHgsIG9wdGlvbnMpID0+IGdldEhvdmVyQ29sb3Iob3B0aW9ucy5jb2xvcik7XG4gICAgdGhpcy5pbmRleEF4aXMgPSAneCc7XG4gICAgdGhpcy5pbnRlcmFjdGlvbiA9IHtcbiAgICAgIG1vZGU6ICduZWFyZXN0JyxcbiAgICAgIGludGVyc2VjdDogdHJ1ZSxcbiAgICAgIGluY2x1ZGVJbnZpc2libGU6IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8gPSB0cnVlO1xuICAgIHRoaXMub25Ib3ZlciA9IG51bGw7XG4gICAgdGhpcy5vbkNsaWNrID0gbnVsbDtcbiAgICB0aGlzLnBhcnNpbmcgPSB0cnVlO1xuICAgIHRoaXMucGx1Z2lucyA9IHt9O1xuICAgIHRoaXMucmVzcG9uc2l2ZSA9IHRydWU7XG4gICAgdGhpcy5zY2FsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNjYWxlcyA9IHt9O1xuICAgIHRoaXMuc2hvd0xpbmUgPSB0cnVlO1xuICAgIHRoaXMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AgPSB0cnVlO1xuXG4gICAgdGhpcy5kZXNjcmliZShfZGVzY3JpcHRvcnMpO1xuICAgIHRoaXMuYXBwbHkoX2FwcGxpZXJzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHNjb3BlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbdmFsdWVzXVxuXHQgKi9cbiAgc2V0KHNjb3BlLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gc2V0KHRoaXMsIHNjb3BlLCB2YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZVxuXHQgKi9cbiAgZ2V0KHNjb3BlKSB7XG4gICAgcmV0dXJuIGdldFNjb3BlKHRoaXMsIHNjb3BlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHNjb3BlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbdmFsdWVzXVxuXHQgKi9cbiAgZGVzY3JpYmUoc2NvcGUsIHZhbHVlcykge1xuICAgIHJldHVybiBzZXQoZGVzY3JpcHRvcnMsIHNjb3BlLCB2YWx1ZXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUoc2NvcGUsIHZhbHVlcykge1xuICAgIHJldHVybiBzZXQob3ZlcnJpZGVzLCBzY29wZSwgdmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSb3V0ZXMgdGhlIG5hbWVkIGRlZmF1bHRzIHRvIGZhbGxiYWNrIHRvIGFub3RoZXIgc2NvcGUvbmFtZS5cblx0ICogVGhpcyByb3V0aW5nIGlzIHVzZWZ1bCB3aGVuIHRob3NlIHRhcmdldCB2YWx1ZXMsIGxpa2UgZGVmYXVsdHMuY29sb3IsIGFyZSBjaGFuZ2VkIHJ1bnRpbWUuXG5cdCAqIElmIHRoZSB2YWx1ZXMgd291bGQgYmUgY29waWVkLCB0aGUgcnVudGltZSBjaGFuZ2Ugd291bGQgbm90IHRha2UgZWZmZWN0LiBCeSByb3V0aW5nLCB0aGVcblx0ICogZmFsbGJhY2sgaXMgZXZhbHVhdGVkIGF0IGVhY2ggYWNjZXNzLCBzbyBpdHMgYWx3YXlzIHVwIHRvIGRhdGUuXG5cdCAqXG5cdCAqIEV4YW1wbGU6XG5cdCAqXG5cdCAqIFx0ZGVmYXVsdHMucm91dGUoJ2VsZW1lbnRzLmFyYycsICdiYWNrZ3JvdW5kQ29sb3InLCAnJywgJ2NvbG9yJylcblx0ICogICAtIHJlYWRzIHRoZSBiYWNrZ3JvdW5kQ29sb3IgZnJvbSBkZWZhdWx0cy5jb2xvciB3aGVuIHVuZGVmaW5lZCBsb2NhbGx5XG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZSBTY29wZSB0aGlzIHJvdXRlIGFwcGxpZXMgdG8uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFByb3BlcnR5IG5hbWUgdGhhdCBzaG91bGQgYmUgcm91dGVkIHRvIGRpZmZlcmVudCBuYW1lc3BhY2Ugd2hlbiBub3QgZGVmaW5lZCBoZXJlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0U2NvcGUgVGhlIG5hbWVzcGFjZSB3aGVyZSB0aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSByb3V0ZWQgdG8uXG5cdCAqIEVtcHR5IHN0cmluZyAoJycpIGlzIHRoZSByb290IG9mIGRlZmF1bHRzLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0TmFtZSBUaGUgdGFyZ2V0IG5hbWUgaW4gdGhlIHRhcmdldCBzY29wZSB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHJvdXRlZCB0by5cblx0ICovXG4gIHJvdXRlKHNjb3BlLCBuYW1lLCB0YXJnZXRTY29wZSwgdGFyZ2V0TmFtZSkge1xuICAgIGNvbnN0IHNjb3BlT2JqZWN0ID0gZ2V0U2NvcGUodGhpcywgc2NvcGUpO1xuICAgIGNvbnN0IHRhcmdldFNjb3BlT2JqZWN0ID0gZ2V0U2NvcGUodGhpcywgdGFyZ2V0U2NvcGUpO1xuICAgIGNvbnN0IHByaXZhdGVOYW1lID0gJ18nICsgbmFtZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNjb3BlT2JqZWN0LCB7XG4gICAgICAvLyBBIHByaXZhdGUgcHJvcGVydHkgaXMgZGVmaW5lZCB0byBob2xkIHRoZSBhY3R1YWwgdmFsdWUsIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQgaW4gaXRzIHNjb3BlIChzZXQgaW4gdGhlIHNldHRlcilcbiAgICAgIFtwcml2YXRlTmFtZV06IHtcbiAgICAgICAgdmFsdWU6IHNjb3BlT2JqZWN0W25hbWVdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFRoZSBhY3R1YWwgcHJvcGVydHkgaXMgZGVmaW5lZCBhcyBnZXR0ZXIvc2V0dGVyIHNvIHdlIGNhbiBkbyB0aGUgcm91dGluZyB3aGVuIHZhbHVlIGlzIG5vdCBsb2NhbGx5IHNldC5cbiAgICAgIFtuYW1lXToge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgbG9jYWwgPSB0aGlzW3ByaXZhdGVOYW1lXTtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRTY29wZU9iamVjdFt0YXJnZXROYW1lXTtcbiAgICAgICAgICBpZiAoaXNPYmplY3QobG9jYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0LCBsb2NhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZU9yRGVmYXVsdChsb2NhbCwgdGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpc1twcml2YXRlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHkoYXBwbGllcnMpIHtcbiAgICBhcHBsaWVycy5mb3JFYWNoKChhcHBseSkgPT4gYXBwbHkodGhpcykpO1xuICB9XG59XG5cbi8vIHNpbmdsZXRvbiBpbnN0YW5jZVxuZXhwb3J0IGRlZmF1bHQgLyogI19fUFVSRV9fICovIG5ldyBEZWZhdWx0cyh7XG4gIF9zY3JpcHRhYmxlOiAobmFtZSkgPT4gIW5hbWUuc3RhcnRzV2l0aCgnb24nKSxcbiAgX2luZGV4YWJsZTogKG5hbWUpID0+IG5hbWUgIT09ICdldmVudHMnLFxuICBob3Zlcjoge1xuICAgIF9mYWxsYmFjazogJ2ludGVyYWN0aW9uJ1xuICB9LFxuICBpbnRlcmFjdGlvbjoge1xuICAgIF9zY3JpcHRhYmxlOiBmYWxzZSxcbiAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgfVxufSwgW2FwcGx5QW5pbWF0aW9uc0RlZmF1bHRzLCBhcHBseUxheW91dHNEZWZhdWx0cywgYXBwbHlTY2FsZURlZmF1bHRzXSk7XG4iLCAiaW1wb3J0IHtpc0FycmF5LCBpc051bGxPclVuZGVmfSBmcm9tICcuL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge1BJLCBUQVUsIEhBTEZfUEksIFFVQVJURVJfUEksIFRXT19USElSRFNfUEksIFJBRF9QRVJfREVHfSBmcm9tICcuL2hlbHBlcnMubWF0aC5qcyc7XG5cbi8qKlxuICogTm90ZTogdHlwZWRlZnMgYXJlIGF1dG8tZXhwb3J0ZWQsIHNvIHVzZSBhIG1hZGUtdXAgYGNhbnZhc2AgbmFtZXNwYWNlIHdoZXJlXG4gKiBuZWNlc3NhcnkgdG8gYXZvaWQgZHVwbGljYXRlcyB3aXRoIGBleHBvcnQgKiBmcm9tICcuL2hlbHBlcnNgOyBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNDYwMTFcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBjYW52YXMuQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLlBvaW50IH0gUG9pbnRcbiAqL1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuaGVscGVycy5jYW52YXNcbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBmb250IG9iamVjdCBpbnRvIGEgQ1NTIGZvbnQgc3RyaW5nLlxuICogQHBhcmFtIHtvYmplY3R9IGZvbnQgLSBBIGZvbnQgb2JqZWN0LlxuICogQHJldHVybiB7c3RyaW5nfG51bGx9IFRoZSBDU1MgZm9udCBzdHJpbmcuIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRm9udFN0cmluZyhmb250KSB7XG4gIGlmICghZm9udCB8fCBpc051bGxPclVuZGVmKGZvbnQuc2l6ZSkgfHwgaXNOdWxsT3JVbmRlZihmb250LmZhbWlseSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoZm9udC5zdHlsZSA/IGZvbnQuc3R5bGUgKyAnICcgOiAnJylcblx0XHQrIChmb250LndlaWdodCA/IGZvbnQud2VpZ2h0ICsgJyAnIDogJycpXG5cdFx0KyBmb250LnNpemUgKyAncHggJ1xuXHRcdCsgZm9udC5mYW1pbHk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBzdHJpbmcpIHtcbiAgbGV0IHRleHRXaWR0aCA9IGRhdGFbc3RyaW5nXTtcbiAgaWYgKCF0ZXh0V2lkdGgpIHtcbiAgICB0ZXh0V2lkdGggPSBkYXRhW3N0cmluZ10gPSBjdHgubWVhc3VyZVRleHQoc3RyaW5nKS53aWR0aDtcbiAgICBnYy5wdXNoKHN0cmluZyk7XG4gIH1cbiAgaWYgKHRleHRXaWR0aCA+IGxvbmdlc3QpIHtcbiAgICBsb25nZXN0ID0gdGV4dFdpZHRoO1xuICB9XG4gIHJldHVybiBsb25nZXN0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbG9uZ2VzdFRleHQoY3R4LCBmb250LCBhcnJheU9mVGhpbmdzLCBjYWNoZSkge1xuICBjYWNoZSA9IGNhY2hlIHx8IHt9O1xuICBsZXQgZGF0YSA9IGNhY2hlLmRhdGEgPSBjYWNoZS5kYXRhIHx8IHt9O1xuICBsZXQgZ2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0IHx8IFtdO1xuXG4gIGlmIChjYWNoZS5mb250ICE9PSBmb250KSB7XG4gICAgZGF0YSA9IGNhY2hlLmRhdGEgPSB7fTtcbiAgICBnYyA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0ID0gW107XG4gICAgY2FjaGUuZm9udCA9IGZvbnQ7XG4gIH1cblxuICBjdHguc2F2ZSgpO1xuXG4gIGN0eC5mb250ID0gZm9udDtcbiAgbGV0IGxvbmdlc3QgPSAwO1xuICBjb25zdCBpbGVuID0gYXJyYXlPZlRoaW5ncy5sZW5ndGg7XG4gIGxldCBpLCBqLCBqbGVuLCB0aGluZywgbmVzdGVkVGhpbmc7XG4gIGZvciAoaSA9IDA7IGkgPCBpbGVuOyBpKyspIHtcbiAgICB0aGluZyA9IGFycmF5T2ZUaGluZ3NbaV07XG5cbiAgICAvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICBpZiAodGhpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGluZyAhPT0gbnVsbCAmJiBpc0FycmF5KHRoaW5nKSAhPT0gdHJ1ZSkge1xuICAgICAgbG9uZ2VzdCA9IF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCB0aGluZyk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHRoaW5nKSkge1xuICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgbGV0cyBtZWFzdXJlIGVhY2ggZWxlbWVudFxuICAgICAgLy8gdG8gZG8gbWF5YmUgc2ltcGxpZnkgdGhpcyBmdW5jdGlvbiBhIGJpdCBzbyB3ZSBjYW4gZG8gdGhpcyBtb3JlIHJlY3Vyc2l2ZWx5P1xuICAgICAgZm9yIChqID0gMCwgamxlbiA9IHRoaW5nLmxlbmd0aDsgaiA8IGpsZW47IGorKykge1xuICAgICAgICBuZXN0ZWRUaGluZyA9IHRoaW5nW2pdO1xuICAgICAgICAvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICAgICAgaWYgKG5lc3RlZFRoaW5nICE9PSB1bmRlZmluZWQgJiYgbmVzdGVkVGhpbmcgIT09IG51bGwgJiYgIWlzQXJyYXkobmVzdGVkVGhpbmcpKSB7XG4gICAgICAgICAgbG9uZ2VzdCA9IF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBuZXN0ZWRUaGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdHgucmVzdG9yZSgpO1xuXG4gIGNvbnN0IGdjTGVuID0gZ2MubGVuZ3RoIC8gMjtcbiAgaWYgKGdjTGVuID4gYXJyYXlPZlRoaW5ncy5sZW5ndGgpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2NMZW47IGkrKykge1xuICAgICAgZGVsZXRlIGRhdGFbZ2NbaV1dO1xuICAgIH1cbiAgICBnYy5zcGxpY2UoMCwgZ2NMZW4pO1xuICB9XG4gIHJldHVybiBsb25nZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFsaWduZWQgcGl4ZWwgdmFsdWUgdG8gYXZvaWQgYW50aS1hbGlhc2luZyBibHVyXG4gKiBAcGFyYW0ge2NhbnZhcy5DaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gcGl4ZWwgLSBBIHBpeGVsIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICogQHJldHVybnMge251bWJlcn0gVGhlIGFsaWduZWQgcGl4ZWwgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2FsaWduUGl4ZWwoY2hhcnQsIHBpeGVsLCB3aWR0aCkge1xuICBjb25zdCBkZXZpY2VQaXhlbFJhdGlvID0gY2hhcnQuY3VycmVudERldmljZVBpeGVsUmF0aW87XG4gIGNvbnN0IGhhbGZXaWR0aCA9IHdpZHRoICE9PSAwID8gTWF0aC5tYXgod2lkdGggLyAyLCAwLjUpIDogMDtcbiAgcmV0dXJuIE1hdGgucm91bmQoKHBpeGVsIC0gaGFsZldpZHRoKSAqIGRldmljZVBpeGVsUmF0aW8pIC8gZGV2aWNlUGl4ZWxSYXRpbyArIGhhbGZXaWR0aDtcbn1cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMuXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBbY3R4XVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpIHtcbiAgY3R4ID0gY3R4IHx8IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIGN0eC5zYXZlKCk7XG4gIC8vIGNhbnZhcy53aWR0aCBhbmQgY2FudmFzLmhlaWdodCBkbyBub3QgY29uc2lkZXIgdGhlIGNhbnZhcyB0cmFuc2Zvcm0sXG4gIC8vIHdoaWxlIGNsZWFyUmVjdCBkb2VzXG4gIGN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIGN0eC5yZXN0b3JlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3UG9pbnQoY3R4LCBvcHRpb25zLCB4LCB5KSB7XG4gIGRyYXdQb2ludExlZ2VuZChjdHgsIG9wdGlvbnMsIHgsIHksIG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd1BvaW50TGVnZW5kKGN0eCwgb3B0aW9ucywgeCwgeSwgdykge1xuICBsZXQgdHlwZSwgeE9mZnNldCwgeU9mZnNldCwgc2l6ZSwgY29ybmVyUmFkaXVzLCB3aWR0aCwgeE9mZnNldFcsIHlPZmZzZXRXO1xuICBjb25zdCBzdHlsZSA9IG9wdGlvbnMucG9pbnRTdHlsZTtcbiAgY29uc3Qgcm90YXRpb24gPSBvcHRpb25zLnJvdGF0aW9uO1xuICBjb25zdCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cztcbiAgbGV0IHJhZCA9IChyb3RhdGlvbiB8fCAwKSAqIFJBRF9QRVJfREVHO1xuXG4gIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgdHlwZSA9IHN0eWxlLnRvU3RyaW5nKCk7XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdJyB8fCB0eXBlID09PSAnW29iamVjdCBIVE1MQ2FudmFzRWxlbWVudF0nKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICAgIGN0eC5yb3RhdGUocmFkKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3R5bGUsIC1zdHlsZS53aWR0aCAvIDIsIC1zdHlsZS5oZWlnaHQgLyAyLCBzdHlsZS53aWR0aCwgc3R5bGUuaGVpZ2h0KTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgc3dpdGNoIChzdHlsZSkge1xuICAvLyBEZWZhdWx0IGluY2x1ZGVzIGNpcmNsZVxuICBkZWZhdWx0OlxuICAgIGlmICh3KSB7XG4gICAgICBjdHguZWxsaXBzZSh4LCB5LCB3IC8gMiwgcmFkaXVzLCAwLCAwLCBUQVUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgMCwgVEFVKTtcbiAgICB9XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGJyZWFrO1xuICBjYXNlICd0cmlhbmdsZSc6XG4gICAgd2lkdGggPSB3ID8gdyAvIDIgOiByYWRpdXM7XG4gICAgY3R4Lm1vdmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgcmFkICs9IFRXT19USElSRFNfUEk7XG4gICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgcmFkICs9IFRXT19USElSRFNfUEk7XG4gICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGJyZWFrO1xuICBjYXNlICdyZWN0Um91bmRlZCc6XG4gICAgLy8gTk9URTogdGhlIHJvdW5kZWQgcmVjdCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIHRvIHVzZSBgYXJjYCBpbnN0ZWFkIG9mXG4gICAgLy8gYHF1YWRyYXRpY0N1cnZlVG9gIHNpbmNlIGl0IGdlbmVyYXRlcyBiZXR0ZXIgcmVzdWx0cyB3aGVuIHJlY3QgaXNcbiAgICAvLyBhbG1vc3QgYSBjaXJjbGUuIDAuNTE2IChpbnN0ZWFkIG9mIDAuNSkgcHJvZHVjZXMgcmVzdWx0cyB3aXRoIHZpc3VhbGx5XG4gICAgLy8gY2xvc2VyIHByb3BvcnRpb24gdG8gdGhlIHByZXZpb3VzIGltcGwgYW5kIGl0IGlzIGluc2NyaWJlZCBpbiB0aGVcbiAgICAvLyBjaXJjbGUgd2l0aCBgcmFkaXVzYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBmb2xsb3dpbmcgUFJzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81NTk3XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzU4NThcbiAgICBjb3JuZXJSYWRpdXMgPSByYWRpdXMgKiAwLjUxNjtcbiAgICBzaXplID0gcmFkaXVzIC0gY29ybmVyUmFkaXVzO1xuICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQgKyBRVUFSVEVSX1BJKSAqIHNpemU7XG4gICAgeE9mZnNldFcgPSBNYXRoLmNvcyhyYWQgKyBRVUFSVEVSX1BJKSAqICh3ID8gdyAvIDIgLSBjb3JuZXJSYWRpdXMgOiBzaXplKTtcbiAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkICsgUVVBUlRFUl9QSSkgKiBzaXplO1xuICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkICsgUVVBUlRFUl9QSSkgKiAodyA/IHcgLyAyIC0gY29ybmVyUmFkaXVzIDogc2l6ZSk7XG4gICAgY3R4LmFyYyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0LCBjb3JuZXJSYWRpdXMsIHJhZCAtIFBJLCByYWQgLSBIQUxGX1BJKTtcbiAgICBjdHguYXJjKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkIC0gSEFMRl9QSSwgcmFkKTtcbiAgICBjdHguYXJjKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkLCByYWQgKyBIQUxGX1BJKTtcbiAgICBjdHguYXJjKHggLSB5T2Zmc2V0VywgeSArIHhPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkICsgSEFMRl9QSSwgcmFkICsgUEkpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICBicmVhaztcbiAgY2FzZSAncmVjdCc6XG4gICAgaWYgKCFyb3RhdGlvbikge1xuICAgICAgc2l6ZSA9IE1hdGguU1FSVDFfMiAqIHJhZGl1cztcbiAgICAgIHdpZHRoID0gdyA/IHcgLyAyIDogc2l6ZTtcbiAgICAgIGN0eC5yZWN0KHggLSB3aWR0aCwgeSAtIHNpemUsIDIgKiB3aWR0aCwgMiAqIHNpemUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJhZCArPSBRVUFSVEVSX1BJO1xuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgY2FzZSAncmVjdFJvdCc6XG4gICAgeE9mZnNldFcgPSBNYXRoLmNvcyhyYWQpICogKHcgPyB3IC8gMiA6IHJhZGl1cyk7XG4gICAgeE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG4gICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgeU9mZnNldFcgPSBNYXRoLnNpbihyYWQpICogKHcgPyB3IC8gMiA6IHJhZGl1cyk7XG4gICAgY3R4Lm1vdmVUbyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgY3R4LmxpbmVUbyh4IC0geU9mZnNldFcsIHkgKyB4T2Zmc2V0KTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2Nyb3NzUm90JzpcbiAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gIGNhc2UgJ2Nyb3NzJzpcbiAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICB4T2Zmc2V0ID0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICBjdHgubW92ZVRvKHggLSB4T2Zmc2V0VywgeSAtIHlPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggLSB5T2Zmc2V0VywgeSArIHhPZmZzZXQpO1xuICAgIGJyZWFrO1xuICBjYXNlICdzdGFyJzpcbiAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICB4T2Zmc2V0ID0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICBjdHgubW92ZVRvKHggLSB4T2Zmc2V0VywgeSAtIHlPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggLSB5T2Zmc2V0VywgeSArIHhPZmZzZXQpO1xuICAgIHJhZCArPSBRVUFSVEVSX1BJO1xuICAgIHhPZmZzZXRXID0gTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgIHlPZmZzZXQgPSBNYXRoLnNpbihyYWQpICogcmFkaXVzO1xuICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXRXLCB5IC0geU9mZnNldCk7XG4gICAgY3R4LmxpbmVUbyh4ICsgeE9mZnNldFcsIHkgKyB5T2Zmc2V0KTtcbiAgICBjdHgubW92ZVRvKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2xpbmUnOlxuICAgIHhPZmZzZXQgPSB3ID8gdyAvIDIgOiBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgIHlPZmZzZXQgPSBNYXRoLnNpbihyYWQpICogcmFkaXVzO1xuICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXQsIHkgLSB5T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0LCB5ICsgeU9mZnNldCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2Rhc2gnOlxuICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpLCB5ICsgTWF0aC5zaW4ocmFkKSAqIHJhZGl1cyk7XG4gICAgYnJlYWs7XG4gIGNhc2UgZmFsc2U6XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY3R4LmZpbGwoKTtcbiAgaWYgKG9wdGlvbnMuYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIHtQb2ludH0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdFxuICogQHBhcmFtIHtvYmplY3R9IGFyZWEgLSBUaGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbl0gLSBhbGxvd2VkIG1hcmdpblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2lzUG9pbnRJbkFyZWEocG9pbnQsIGFyZWEsIG1hcmdpbikge1xuICBtYXJnaW4gPSBtYXJnaW4gfHwgMC41OyAvLyBtYXJnaW4gLSBkZWZhdWx0IGlzIHRvIG1hdGNoIHJvdW5kZWQgZGVjaW1hbHNcblxuICByZXR1cm4gIWFyZWEgfHwgKHBvaW50ICYmIHBvaW50LnggPiBhcmVhLmxlZnQgLSBtYXJnaW4gJiYgcG9pbnQueCA8IGFyZWEucmlnaHQgKyBtYXJnaW4gJiZcblx0XHRwb2ludC55ID4gYXJlYS50b3AgLSBtYXJnaW4gJiYgcG9pbnQueSA8IGFyZWEuYm90dG9tICsgbWFyZ2luKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsaXBBcmVhKGN0eCwgYXJlYSkge1xuICBjdHguc2F2ZSgpO1xuICBjdHguYmVnaW5QYXRoKCk7XG4gIGN0eC5yZWN0KGFyZWEubGVmdCwgYXJlYS50b3AsIGFyZWEucmlnaHQgLSBhcmVhLmxlZnQsIGFyZWEuYm90dG9tIC0gYXJlYS50b3ApO1xuICBjdHguY2xpcCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5jbGlwQXJlYShjdHgpIHtcbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX3N0ZXBwZWRMaW5lVG8oY3R4LCBwcmV2aW91cywgdGFyZ2V0LCBmbGlwLCBtb2RlKSB7XG4gIGlmICghcHJldmlvdXMpIHtcbiAgICByZXR1cm4gY3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICB9XG4gIGlmIChtb2RlID09PSAnbWlkZGxlJykge1xuICAgIGNvbnN0IG1pZHBvaW50ID0gKHByZXZpb3VzLnggKyB0YXJnZXQueCkgLyAyLjA7XG4gICAgY3R4LmxpbmVUbyhtaWRwb2ludCwgcHJldmlvdXMueSk7XG4gICAgY3R4LmxpbmVUbyhtaWRwb2ludCwgdGFyZ2V0LnkpO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09ICdhZnRlcicgIT09ICEhZmxpcCkge1xuICAgIGN0eC5saW5lVG8ocHJldmlvdXMueCwgdGFyZ2V0LnkpO1xuICB9IGVsc2Uge1xuICAgIGN0eC5saW5lVG8odGFyZ2V0LngsIHByZXZpb3VzLnkpO1xuICB9XG4gIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2JlemllckN1cnZlVG8oY3R4LCBwcmV2aW91cywgdGFyZ2V0LCBmbGlwKSB7XG4gIGlmICghcHJldmlvdXMpIHtcbiAgICByZXR1cm4gY3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICB9XG4gIGN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgIGZsaXAgPyBwcmV2aW91cy5jcDF4IDogcHJldmlvdXMuY3AyeCxcbiAgICBmbGlwID8gcHJldmlvdXMuY3AxeSA6IHByZXZpb3VzLmNwMnksXG4gICAgZmxpcCA/IHRhcmdldC5jcDJ4IDogdGFyZ2V0LmNwMXgsXG4gICAgZmxpcCA/IHRhcmdldC5jcDJ5IDogdGFyZ2V0LmNwMXksXG4gICAgdGFyZ2V0LngsXG4gICAgdGFyZ2V0LnkpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0ZXh0IG9udG8gdGhlIGNhbnZhc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVGV4dChjdHgsIHRleHQsIHgsIHksIGZvbnQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBsaW5lcyA9IGlzQXJyYXkodGV4dCkgPyB0ZXh0IDogW3RleHRdO1xuICBjb25zdCBzdHJva2UgPSBvcHRzLnN0cm9rZVdpZHRoID4gMCAmJiBvcHRzLnN0cm9rZUNvbG9yICE9PSAnJztcbiAgbGV0IGksIGxpbmU7XG5cbiAgY3R4LnNhdmUoKTtcbiAgY3R4LmZvbnQgPSBmb250LnN0cmluZztcbiAgc2V0UmVuZGVyT3B0cyhjdHgsIG9wdHMpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgIGxpbmUgPSBsaW5lc1tpXTtcblxuICAgIGlmIChvcHRzLmJhY2tkcm9wKSB7XG4gICAgICBkcmF3QmFja2Ryb3AoY3R4LCBvcHRzLmJhY2tkcm9wKTtcbiAgICB9XG5cbiAgICBpZiAoc3Ryb2tlKSB7XG4gICAgICBpZiAob3B0cy5zdHJva2VDb2xvcikge1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRzLnN0cm9rZUNvbG9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWYob3B0cy5zdHJva2VXaWR0aCkpIHtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGN0eC5zdHJva2VUZXh0KGxpbmUsIHgsIHksIG9wdHMubWF4V2lkdGgpO1xuICAgIH1cblxuICAgIGN0eC5maWxsVGV4dChsaW5lLCB4LCB5LCBvcHRzLm1heFdpZHRoKTtcbiAgICBkZWNvcmF0ZVRleHQoY3R4LCB4LCB5LCBsaW5lLCBvcHRzKTtcblxuICAgIHkgKz0gZm9udC5saW5lSGVpZ2h0O1xuICB9XG5cbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gc2V0UmVuZGVyT3B0cyhjdHgsIG9wdHMpIHtcbiAgaWYgKG9wdHMudHJhbnNsYXRpb24pIHtcbiAgICBjdHgudHJhbnNsYXRlKG9wdHMudHJhbnNsYXRpb25bMF0sIG9wdHMudHJhbnNsYXRpb25bMV0pO1xuICB9XG5cbiAgaWYgKCFpc051bGxPclVuZGVmKG9wdHMucm90YXRpb24pKSB7XG4gICAgY3R4LnJvdGF0ZShvcHRzLnJvdGF0aW9uKTtcbiAgfVxuXG4gIGlmIChvcHRzLmNvbG9yKSB7XG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdHMuY29sb3I7XG4gIH1cblxuICBpZiAob3B0cy50ZXh0QWxpZ24pIHtcbiAgICBjdHgudGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ247XG4gIH1cblxuICBpZiAob3B0cy50ZXh0QmFzZWxpbmUpIHtcbiAgICBjdHgudGV4dEJhc2VsaW5lID0gb3B0cy50ZXh0QmFzZWxpbmU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb3JhdGVUZXh0KGN0eCwgeCwgeSwgbGluZSwgb3B0cykge1xuICBpZiAob3B0cy5zdHJpa2V0aHJvdWdoIHx8IG9wdHMudW5kZXJsaW5lKSB7XG4gICAgLyoqXG4gICAgICogTm93IHRoYXQgSUUxMSBzdXBwb3J0IGhhcyBiZWVuIGRyb3BwZWQsIHdlIGNhbiB1c2UgbW9yZVxuICAgICAqIG9mIHRoZSBUZXh0TWV0cmljcyBvYmplY3QuIFRoZSBhY3R1YWwgYm91bmRpbmcgYm94ZXNcbiAgICAgKiBhcmUgdW5mbGFnZ2VkIGluIENocm9tZSwgRmlyZWZveCwgRWRnZSwgYW5kIFNhZmFyaSBzbyB0aGV5XG4gICAgICogY2FuIGJlIHNhZmVseSB1c2VkLlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dE1ldHJpY3MjQnJvd3Nlcl9jb21wYXRpYmlsaXR5XG4gICAgICovXG4gICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICBjb25zdCBsZWZ0ID0geCAtIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hMZWZ0O1xuICAgIGNvbnN0IHJpZ2h0ID0geCArIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hSaWdodDtcbiAgICBjb25zdCB0b3AgPSB5IC0gbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDtcbiAgICBjb25zdCBib3R0b20gPSB5ICsgbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQ7XG4gICAgY29uc3QgeURlY29yYXRpb24gPSBvcHRzLnN0cmlrZXRocm91Z2ggPyAodG9wICsgYm90dG9tKSAvIDIgOiBib3R0b207XG5cbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubGluZVdpZHRoID0gb3B0cy5kZWNvcmF0aW9uV2lkdGggfHwgMjtcbiAgICBjdHgubW92ZVRvKGxlZnQsIHlEZWNvcmF0aW9uKTtcbiAgICBjdHgubGluZVRvKHJpZ2h0LCB5RGVjb3JhdGlvbik7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZHJvcChjdHgsIG9wdHMpIHtcbiAgY29uc3Qgb2xkQ29sb3IgPSBjdHguZmlsbFN0eWxlO1xuXG4gIGN0eC5maWxsU3R5bGUgPSBvcHRzLmNvbG9yO1xuICBjdHguZmlsbFJlY3Qob3B0cy5sZWZ0LCBvcHRzLnRvcCwgb3B0cy53aWR0aCwgb3B0cy5oZWlnaHQpO1xuICBjdHguZmlsbFN0eWxlID0gb2xkQ29sb3I7XG59XG5cbi8qKlxuICogQWRkIGEgcGF0aCBvZiBhIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVycyB0byB0aGUgY3VycmVudCBzdWItcGF0aFxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCBDb250ZXh0XG4gKiBAcGFyYW0geyp9IHJlY3QgQm91bmRpbmcgcmVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwgcmVjdCkge1xuICBjb25zdCB7eCwgeSwgdywgaCwgcmFkaXVzfSA9IHJlY3Q7XG5cbiAgLy8gdG9wIGxlZnQgYXJjXG4gIGN0eC5hcmMoeCArIHJhZGl1cy50b3BMZWZ0LCB5ICsgcmFkaXVzLnRvcExlZnQsIHJhZGl1cy50b3BMZWZ0LCAtSEFMRl9QSSwgUEksIHRydWUpO1xuXG4gIC8vIGxpbmUgZnJvbSB0b3AgbGVmdCB0byBib3R0b20gbGVmdFxuICBjdHgubGluZVRvKHgsIHkgKyBoIC0gcmFkaXVzLmJvdHRvbUxlZnQpO1xuXG4gIC8vIGJvdHRvbSBsZWZ0IGFyY1xuICBjdHguYXJjKHggKyByYWRpdXMuYm90dG9tTGVmdCwgeSArIGggLSByYWRpdXMuYm90dG9tTGVmdCwgcmFkaXVzLmJvdHRvbUxlZnQsIFBJLCBIQUxGX1BJLCB0cnVlKTtcblxuICAvLyBsaW5lIGZyb20gYm90dG9tIGxlZnQgdG8gYm90dG9tIHJpZ2h0XG4gIGN0eC5saW5lVG8oeCArIHcgLSByYWRpdXMuYm90dG9tUmlnaHQsIHkgKyBoKTtcblxuICAvLyBib3R0b20gcmlnaHQgYXJjXG4gIGN0eC5hcmMoeCArIHcgLSByYWRpdXMuYm90dG9tUmlnaHQsIHkgKyBoIC0gcmFkaXVzLmJvdHRvbVJpZ2h0LCByYWRpdXMuYm90dG9tUmlnaHQsIEhBTEZfUEksIDAsIHRydWUpO1xuXG4gIC8vIGxpbmUgZnJvbSBib3R0b20gcmlnaHQgdG8gdG9wIHJpZ2h0XG4gIGN0eC5saW5lVG8oeCArIHcsIHkgKyByYWRpdXMudG9wUmlnaHQpO1xuXG4gIC8vIHRvcCByaWdodCBhcmNcbiAgY3R4LmFyYyh4ICsgdyAtIHJhZGl1cy50b3BSaWdodCwgeSArIHJhZGl1cy50b3BSaWdodCwgcmFkaXVzLnRvcFJpZ2h0LCAwLCAtSEFMRl9QSSwgdHJ1ZSk7XG5cbiAgLy8gbGluZSBmcm9tIHRvcCByaWdodCB0byB0b3AgbGVmdFxuICBjdHgubGluZVRvKHggKyByYWRpdXMudG9wTGVmdCwgeSk7XG59XG4iLCAiaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2NvcmUvY29yZS5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzT2JqZWN0LCB0b0RpbWVuc2lvbiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4vaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7UG9pbnQsIHRvRm9udFN0cmluZ30gZnJvbSAnLi9oZWxwZXJzLmNhbnZhcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhcnRBcmVhLCBGb250U3BlY30gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1RSQkwsIFRSQkxDb3JuZXJzfSBmcm9tICcuLi90eXBlcy9nZW9tZXRyaWMuanMnO1xuXG5jb25zdCBMSU5FX0hFSUdIVCA9IC9eKG5vcm1hbHwoXFxkKyg/OlxcLlxcZCspPykocHh8ZW18JSk/KSQvO1xuY29uc3QgRk9OVF9TVFlMRSA9IC9eKG5vcm1hbHxpdGFsaWN8aW5pdGlhbHxpbmhlcml0fHVuc2V0fChvYmxpcXVlKCAtP1swLTldP1swLTldZGVnKT8pKSQvO1xuXG4vKipcbiAqIEBhbGlhcyBDaGFydC5oZWxwZXJzLm9wdGlvbnNcbiAqIEBuYW1lc3BhY2VcbiAqL1xuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbGluZSBoZWlnaHQgYHZhbHVlYCBpbiBwaXhlbHMgZm9yIGEgc3BlY2lmaWMgZm9udCBgc2l6ZWAuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbGluZUhlaWdodCB0byBwYXJzZSAoZWcuIDEuNiwgJzE0cHgnLCAnNzUlJywgJzEuNmVtJykuXG4gKiBAcGFyYW0gc2l6ZSAtIFRoZSBmb250IHNpemUgKGluIHBpeGVscykgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIGB2YWx1ZWAuXG4gKiBAcmV0dXJucyBUaGUgZWZmZWN0aXZlIGxpbmUgaGVpZ2h0IGluIHBpeGVscyAoc2l6ZSAqIDEuMiBpZiB2YWx1ZSBpcyBpbnZhbGlkKS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmUtaGVpZ2h0XG4gKiBAc2luY2UgMi43LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGluZUhlaWdodCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBtYXRjaGVzID0gKCcnICsgdmFsdWUpLm1hdGNoKExJTkVfSEVJR0hUKTtcbiAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXNbMV0gPT09ICdub3JtYWwnKSB7XG4gICAgcmV0dXJuIHNpemUgKiAxLjI7XG4gIH1cblxuICB2YWx1ZSA9ICttYXRjaGVzWzJdO1xuXG4gIHN3aXRjaCAobWF0Y2hlc1szXSkge1xuICAgIGNhc2UgJ3B4JzpcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBjYXNlICclJzpcbiAgICAgIHZhbHVlIC89IDEwMDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBzaXplICogdmFsdWU7XG59XG5cbmNvbnN0IG51bWJlck9yWmVybyA9ICh2OiB1bmtub3duKSA9PiArdiB8fCAwO1xuXG4vKipcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVhZFZhbHVlVG9Qcm9wczxLIGV4dGVuZHMgc3RyaW5nPih2YWx1ZTogbnVtYmVyIHwgUmVjb3JkPEssIG51bWJlcj4sIHByb3BzOiBLW10pOiBSZWNvcmQ8SywgbnVtYmVyPjtcbmV4cG9ydCBmdW5jdGlvbiBfcmVhZFZhbHVlVG9Qcm9wczxLIGV4dGVuZHMgc3RyaW5nLCBUIGV4dGVuZHMgc3RyaW5nPih2YWx1ZTogbnVtYmVyIHwgUmVjb3JkPEsgJiBULCBudW1iZXI+LCBwcm9wczogUmVjb3JkPFQsIEs+KTogUmVjb3JkPFQsIG51bWJlcj47XG5leHBvcnQgZnVuY3Rpb24gX3JlYWRWYWx1ZVRvUHJvcHModmFsdWU6IG51bWJlciB8IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIHByb3BzOiBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGNvbnN0IG9ialByb3BzID0gaXNPYmplY3QocHJvcHMpO1xuICBjb25zdCBrZXlzID0gb2JqUHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykgOiBwcm9wcztcbiAgY29uc3QgcmVhZCA9IGlzT2JqZWN0KHZhbHVlKVxuICAgID8gb2JqUHJvcHNcbiAgICAgID8gcHJvcCA9PiB2YWx1ZU9yRGVmYXVsdCh2YWx1ZVtwcm9wXSwgdmFsdWVbcHJvcHNbcHJvcF1dKVxuICAgICAgOiBwcm9wID0+IHZhbHVlW3Byb3BdXG4gICAgOiAoKSA9PiB2YWx1ZTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cykge1xuICAgIHJldFtwcm9wXSA9IG51bWJlck9yWmVybyhyZWFkKHByb3ApKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgVFJCTCBvYmplY3QuXG4gKiBAcGFyYW0gdmFsdWUgLSBJZiBhIG51bWJlciwgc2V0IHRoZSB2YWx1ZSB0byBhbGwgVFJCTCBjb21wb25lbnQsXG4gKiAgZWxzZSwgaWYgYW4gb2JqZWN0LCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCBzZXRzIHVuZGVmaW5lZCBvbmVzIHRvIDAuXG4gKiAgeCAvIHkgYXJlIHNob3J0aGFuZHMgZm9yIHNhbWUgdmFsdWUgZm9yIGxlZnQvcmlnaHQgYW5kIHRvcC9ib3R0b20uXG4gKiBAcmV0dXJucyBUaGUgcGFkZGluZyB2YWx1ZXMgKHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdClcbiAqIEBzaW5jZSAzLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UUkJMKHZhbHVlOiBudW1iZXIgfCBUUkJMIHwgUG9pbnQpIHtcbiAgcmV0dXJuIF9yZWFkVmFsdWVUb1Byb3BzKHZhbHVlLCB7dG9wOiAneScsIHJpZ2h0OiAneCcsIGJvdHRvbTogJ3knLCBsZWZ0OiAneCd9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIFRSQkwgY29ybmVycyBvYmplY3QgKHNpbWlsYXIgd2l0aCBjc3MgYm9yZGVyLXJhZGl1cykuXG4gKiBAcGFyYW0gdmFsdWUgLSBJZiBhIG51bWJlciwgc2V0IHRoZSB2YWx1ZSB0byBhbGwgVFJCTCBjb3JuZXIgY29tcG9uZW50cyxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqIEByZXR1cm5zIFRoZSBUUkJMIGNvcm5lciB2YWx1ZXMgKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodClcbiAqIEBzaW5jZSAzLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UUkJMQ29ybmVycyh2YWx1ZTogbnVtYmVyIHwgVFJCTENvcm5lcnMpIHtcbiAgcmV0dXJuIF9yZWFkVmFsdWVUb1Byb3BzKHZhbHVlLCBbJ3RvcExlZnQnLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCddKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqICB4IC8geSBhcmUgc2hvcnRoYW5kcyBmb3Igc2FtZSB2YWx1ZSBmb3IgbGVmdC9yaWdodCBhbmQgdG9wL2JvdHRvbS5cbiAqIEByZXR1cm5zIFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KVxuICogQHNpbmNlIDIuNy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRpbmcodmFsdWU/OiBudW1iZXIgfCBUUkJMKTogQ2hhcnRBcmVhIHtcbiAgY29uc3Qgb2JqID0gdG9UUkJMKHZhbHVlKSBhcyBDaGFydEFyZWE7XG5cbiAgb2JqLndpZHRoID0gb2JqLmxlZnQgKyBvYmoucmlnaHQ7XG4gIG9iai5oZWlnaHQgPSBvYmoudG9wICsgb2JqLmJvdHRvbTtcblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc0ZvbnRTcGVjIGV4dGVuZHMgRm9udFNwZWMge1xuICBzdHJpbmc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJzZXMgZm9udCBvcHRpb25zIGFuZCByZXR1cm5zIHRoZSBmb250IG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQSBvYmplY3QgdGhhdCBjb250YWlucyBmb250IG9wdGlvbnMgdG8gYmUgcGFyc2VkLlxuICogQHBhcmFtIGZhbGxiYWNrIC0gQSBvYmplY3QgdGhhdCBjb250YWlucyBmYWxsYmFjayBmb250IG9wdGlvbnMuXG4gKiBAcmV0dXJuIFRoZSBmb250IG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRm9udChvcHRpb25zOiBQYXJ0aWFsPEZvbnRTcGVjPiwgZmFsbGJhY2s/OiBQYXJ0aWFsPEZvbnRTcGVjPikge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgZmFsbGJhY2sgPSBmYWxsYmFjayB8fCBkZWZhdWx0cy5mb250IGFzIEZvbnRTcGVjO1xuXG4gIGxldCBzaXplID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5zaXplLCBmYWxsYmFjay5zaXplKTtcblxuICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgc2l6ZSA9IHBhcnNlSW50KHNpemUsIDEwKTtcbiAgfVxuICBsZXQgc3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnN0eWxlLCBmYWxsYmFjay5zdHlsZSk7XG4gIGlmIChzdHlsZSAmJiAhKCcnICsgc3R5bGUpLm1hdGNoKEZPTlRfU1RZTEUpKSB7XG4gICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiBcIicgKyBzdHlsZSArICdcIicpO1xuICAgIHN0eWxlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZm9udCA9IHtcbiAgICBmYW1pbHk6IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuZmFtaWx5LCBmYWxsYmFjay5mYW1pbHkpLFxuICAgIGxpbmVIZWlnaHQ6IHRvTGluZUhlaWdodCh2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmxpbmVIZWlnaHQsIGZhbGxiYWNrLmxpbmVIZWlnaHQpLCBzaXplKSxcbiAgICBzaXplLFxuICAgIHN0eWxlLFxuICAgIHdlaWdodDogdmFsdWVPckRlZmF1bHQob3B0aW9ucy53ZWlnaHQsIGZhbGxiYWNrLndlaWdodCksXG4gICAgc3RyaW5nOiAnJ1xuICB9O1xuXG4gIGZvbnQuc3RyaW5nID0gdG9Gb250U3RyaW5nKGZvbnQpO1xuICByZXR1cm4gZm9udDtcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGBpbnB1dHNgIHNlcXVlbnRpYWxseSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZGVmaW5lZCB2YWx1ZS5cbiAqIEBwYXJhbSBpbnB1dHMgLSBBbiBhcnJheSBvZiB2YWx1ZXMsIGZhbGxpbmcgYmFjayB0byB0aGUgbGFzdCB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gSWYgZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBmdW5jdGlvbiwgdGhlIHZhbHVlXG4gKiBpcyBjYWxsZWQgd2l0aCBgY29udGV4dGAgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHRoZSByZXN1bHQgYmVjb21lcyB0aGUgbmV3IGlucHV0LlxuICogQHBhcmFtIGluZGV4IC0gSWYgZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYW4gYXJyYXksIHRoZSB2YWx1ZVxuICogYXQgYGluZGV4YCBiZWNvbWUgdGhlIG5ldyBpbnB1dC5cbiAqIEBwYXJhbSBpbmZvIC0gb2JqZWN0IHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCByZXNvbHV0aW9uIGluXG4gKiBAcGFyYW0gaW5mby5jYWNoZWFibGUgLSBXaWxsIGJlIHNldCB0byBgZmFsc2VgIGlmIG9wdGlvbiBpcyBub3QgY2FjaGVhYmxlLlxuICogQHNpbmNlIDIuNy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGlucHV0czogQXJyYXk8dW5rbm93bj4sIGNvbnRleHQ/OiBvYmplY3QsIGluZGV4PzogbnVtYmVyLCBpbmZvPzogeyBjYWNoZWFibGU6IGJvb2xlYW4gfSkge1xuICBsZXQgY2FjaGVhYmxlID0gdHJ1ZTtcbiAgbGV0IGk6IG51bWJlciwgaWxlbjogbnVtYmVyLCB2YWx1ZTogdW5rbm93bjtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gaW5wdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgIHZhbHVlID0gaW5wdXRzW2ldO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUoY29udGV4dCk7XG4gICAgICBjYWNoZWFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWVbaW5kZXggJSB2YWx1ZS5sZW5ndGhdO1xuICAgICAgY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaW5mbyAmJiAhY2FjaGVhYmxlKSB7XG4gICAgICAgIGluZm8uY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIG1pbm1heFxuICogQHBhcmFtIGdyYWNlXG4gKiBAcGFyYW0gYmVnaW5BdFplcm9cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYWRkR3JhY2UobWlubWF4OiB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlcjsgfSwgZ3JhY2U6IG51bWJlciB8IHN0cmluZywgYmVnaW5BdFplcm86IGJvb2xlYW4pIHtcbiAgY29uc3Qge21pbiwgbWF4fSA9IG1pbm1heDtcbiAgY29uc3QgY2hhbmdlID0gdG9EaW1lbnNpb24oZ3JhY2UsIChtYXggLSBtaW4pIC8gMik7XG4gIGNvbnN0IGtlZXBaZXJvID0gKHZhbHVlOiBudW1iZXIsIGFkZDogbnVtYmVyKSA9PiBiZWdpbkF0WmVybyAmJiB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSArIGFkZDtcbiAgcmV0dXJuIHtcbiAgICBtaW46IGtlZXBaZXJvKG1pbiwgLU1hdGguYWJzKGNoYW5nZSkpLFxuICAgIG1heDoga2VlcFplcm8obWF4LCBjaGFuZ2UpXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29udGV4dCBpbmhlcml0aW5nIHBhcmVudENvbnRleHRcbiAqIEBwYXJhbSBwYXJlbnRDb250ZXh0XG4gKiBAcGFyYW0gY29udGV4dFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCBleHRlbmRzIG9iamVjdD4ocGFyZW50Q29udGV4dDogbnVsbCwgY29udGV4dDogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUIGV4dGVuZHMgb2JqZWN0LCBQIGV4dGVuZHMgVD4ocGFyZW50Q29udGV4dDogUCwgY29udGV4dDogVCk6IFAgJiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQocGFyZW50Q29udGV4dDogb2JqZWN0LCBjb250ZXh0OiBvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShwYXJlbnRDb250ZXh0KSwgY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHtkZWZpbmVkLCBpc0FycmF5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgcmVzb2x2ZU9iamVjdEtleSwgX2NhcGl0YWxpemV9IGZyb20gJy4vaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgZm9yIHJlc29sdmluZyByYXcgdmFsdWVzIGZvciBvcHRpb25zLlxuICogQHBhcmFtIHtvYmplY3RbXX0gc2NvcGVzIC0gVGhlIG9wdGlvbiBzY29wZXMgdG8gbG9vayBmb3IgdmFsdWVzLCBpbiByZXNvbHV0aW9uIG9yZGVyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbcHJlZml4ZXNdIC0gVGhlIHByZWZpeGVzIGZvciB2YWx1ZXMsIGluIHJlc29sdXRpb24gb3JkZXIuXG4gKiBAcGFyYW0ge29iamVjdFtdfSBbcm9vdFNjb3Blc10gLSBUaGUgcm9vdCBvcHRpb24gc2NvcGVzXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbZmFsbGJhY2tdIC0gUGFyZW50IHNjb3BlcyBmYWxsYmFja1xuICogQHBhcmFtIHtmdW5jdGlvbn0gW2dldFRhcmdldF0gLSBjYWxsYmFjayBmb3IgZ2V0dGluZyB0aGUgdGFyZ2V0IGZvciBjaGFuZ2VkIHZhbHVlc1xuICogQHJldHVybnMgUHJveHlcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCBwcmVmaXhlcyA9IFsnJ10sIHJvb3RTY29wZXMgPSBzY29wZXMsIGZhbGxiYWNrLCBnZXRUYXJnZXQgPSAoKSA9PiBzY29wZXNbMF0pIHtcbiAgaWYgKCFkZWZpbmVkKGZhbGxiYWNrKSkge1xuICAgIGZhbGxiYWNrID0gX3Jlc29sdmUoJ19mYWxsYmFjaycsIHNjb3Blcyk7XG4gIH1cbiAgY29uc3QgY2FjaGUgPSB7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdPYmplY3QnLFxuICAgIF9jYWNoZWFibGU6IHRydWUsXG4gICAgX3Njb3Blczogc2NvcGVzLFxuICAgIF9yb290U2NvcGVzOiByb290U2NvcGVzLFxuICAgIF9mYWxsYmFjazogZmFsbGJhY2ssXG4gICAgX2dldFRhcmdldDogZ2V0VGFyZ2V0LFxuICAgIG92ZXJyaWRlOiAoc2NvcGUpID0+IF9jcmVhdGVSZXNvbHZlcihbc2NvcGUsIC4uLnNjb3Blc10sIHByZWZpeGVzLCByb290U2NvcGVzLCBmYWxsYmFjayksXG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkoY2FjaGUsIHtcbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHRoZSBkZWxldGUgb3BlcmF0b3IuXG4gICAgICovXG4gICAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKSB7XG4gICAgICBkZWxldGUgdGFyZ2V0W3Byb3BdOyAvLyByZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgZGVsZXRlIHRhcmdldC5fa2V5czsgLy8gcmVtb3ZlIGNhY2hlZCBrZXlzXG4gICAgICBkZWxldGUgc2NvcGVzWzBdW3Byb3BdOyAvLyByZW1vdmUgZnJvbSB0b3AgbGV2ZWwgc2NvcGVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIGdldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqL1xuICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBfY2FjaGVkKHRhcmdldCwgcHJvcCxcbiAgICAgICAgKCkgPT4gX3Jlc29sdmVXaXRoUHJlZml4ZXMocHJvcCwgcHJlZml4ZXMsIHNjb3BlcywgdGFyZ2V0KSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5cbiAgICAgKiBBbHNvIHVzZWQgYnkgT2JqZWN0Lmhhc093blByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuX3Njb3Blc1swXSwgcHJvcCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mLlxuICAgICAqL1xuICAgIGdldFByb3RvdHlwZU9mKCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yoc2NvcGVzWzBdKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgaW4gb3BlcmF0b3IuXG4gICAgICovXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIGdldEtleXNGcm9tQWxsU2NvcGVzKHRhcmdldCkuaW5jbHVkZXMocHJvcCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgYW5kIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMuXG4gICAgICovXG4gICAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICAgIHJldHVybiBnZXRLZXlzRnJvbUFsbFNjb3Blcyh0YXJnZXQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHNldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqL1xuICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gdGFyZ2V0Ll9zdG9yYWdlIHx8ICh0YXJnZXQuX3N0b3JhZ2UgPSBnZXRUYXJnZXQoKSk7XG4gICAgICB0YXJnZXRbcHJvcF0gPSBzdG9yYWdlW3Byb3BdID0gdmFsdWU7IC8vIHNldCB0byB0b3AgbGV2ZWwgc2NvcGUgKyBjYWNoZVxuICAgICAgZGVsZXRlIHRhcmdldC5fa2V5czsgLy8gcmVtb3ZlIGNhY2hlZCBrZXlzXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gUHJveHkgZm9yIHJlc29sdmluZyBvcHRpb24gdmFsdWVzIHdpdGggY29udGV4dC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm94eSAtIFRoZSBQcm94eSByZXR1cm5lZCBieSBgX2NyZWF0ZVJlc29sdmVyYFxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgLSBDb250ZXh0IG9iamVjdCBmb3Igc2NyaXB0YWJsZS9pbmRleGFibGUgb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IFtzdWJQcm94eV0gLSBUaGUgcHJveHkgcHJvdmlkZWQgZm9yIHNjcmlwdGFibGUgb3B0aW9uc1xuICogQHBhcmFtIHt7c2NyaXB0YWJsZTogYm9vbGVhbiwgaW5kZXhhYmxlOiBib29sZWFuLCBhbGxLZXlzPzogYm9vbGVhbn19IFtkZXNjcmlwdG9yRGVmYXVsdHNdIC0gRGVmYXVsdHMgZm9yIGRlc2NyaXB0b3JzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2F0dGFjaENvbnRleHQocHJveHksIGNvbnRleHQsIHN1YlByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpIHtcbiAgY29uc3QgY2FjaGUgPSB7XG4gICAgX2NhY2hlYWJsZTogZmFsc2UsXG4gICAgX3Byb3h5OiBwcm94eSxcbiAgICBfY29udGV4dDogY29udGV4dCxcbiAgICBfc3ViUHJveHk6IHN1YlByb3h5LFxuICAgIF9zdGFjazogbmV3IFNldCgpLFxuICAgIF9kZXNjcmlwdG9yczogX2Rlc2NyaXB0b3JzKHByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpLFxuICAgIHNldENvbnRleHQ6IChjdHgpID0+IF9hdHRhY2hDb250ZXh0KHByb3h5LCBjdHgsIHN1YlByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpLFxuICAgIG92ZXJyaWRlOiAoc2NvcGUpID0+IF9hdHRhY2hDb250ZXh0KHByb3h5Lm92ZXJyaWRlKHNjb3BlKSwgY29udGV4dCwgc3ViUHJveHksIGRlc2NyaXB0b3JEZWZhdWx0cylcbiAgfTtcbiAgcmV0dXJuIG5ldyBQcm94eShjYWNoZSwge1xuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRvci5cbiAgICAgKi9cbiAgICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApIHtcbiAgICAgIGRlbGV0ZSB0YXJnZXRbcHJvcF07IC8vIHJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICBkZWxldGUgcHJveHlbcHJvcF07IC8vIHJlbW92ZSBmcm9tIHByb3h5XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBnZXR0aW5nIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKi9cbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgcmV0dXJuIF9jYWNoZWQodGFyZ2V0LCBwcm9wLFxuICAgICAgICAoKSA9PiBfcmVzb2x2ZVdpdGhDb250ZXh0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLlxuICAgICAqIEFsc28gdXNlZCBieSBPYmplY3QuaGFzT3duUHJvcGVydHkuXG4gICAgICovXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIHRhcmdldC5fZGVzY3JpcHRvcnMuYWxsS2V5c1xuICAgICAgICA/IFJlZmxlY3QuaGFzKHByb3h5LCBwcm9wKSA/IHtlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9IDogdW5kZWZpbmVkXG4gICAgICAgIDogUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJveHksIHByb3ApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZi5cbiAgICAgKi9cbiAgICBnZXRQcm90b3R5cGVPZigpIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHByb3h5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgaW4gb3BlcmF0b3IuXG4gICAgICovXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHByb3h5LCBwcm9wKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyBhbmQgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scy5cbiAgICAgKi9cbiAgICBvd25LZXlzKCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhwcm94eSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3Igc2V0dGluZyBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICovXG4gICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgIHByb3h5W3Byb3BdID0gdmFsdWU7IC8vIHNldCB0byBwcm94eVxuICAgICAgZGVsZXRlIHRhcmdldFtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZXNjcmlwdG9ycyhwcm94eSwgZGVmYXVsdHMgPSB7c2NyaXB0YWJsZTogdHJ1ZSwgaW5kZXhhYmxlOiB0cnVlfSkge1xuICBjb25zdCB7X3NjcmlwdGFibGUgPSBkZWZhdWx0cy5zY3JpcHRhYmxlLCBfaW5kZXhhYmxlID0gZGVmYXVsdHMuaW5kZXhhYmxlLCBfYWxsS2V5cyA9IGRlZmF1bHRzLmFsbEtleXN9ID0gcHJveHk7XG4gIHJldHVybiB7XG4gICAgYWxsS2V5czogX2FsbEtleXMsXG4gICAgc2NyaXB0YWJsZTogX3NjcmlwdGFibGUsXG4gICAgaW5kZXhhYmxlOiBfaW5kZXhhYmxlLFxuICAgIGlzU2NyaXB0YWJsZTogaXNGdW5jdGlvbihfc2NyaXB0YWJsZSkgPyBfc2NyaXB0YWJsZSA6ICgpID0+IF9zY3JpcHRhYmxlLFxuICAgIGlzSW5kZXhhYmxlOiBpc0Z1bmN0aW9uKF9pbmRleGFibGUpID8gX2luZGV4YWJsZSA6ICgpID0+IF9pbmRleGFibGVcbiAgfTtcbn1cblxuY29uc3QgcmVhZEtleSA9IChwcmVmaXgsIG5hbWUpID0+IHByZWZpeCA/IHByZWZpeCArIF9jYXBpdGFsaXplKG5hbWUpIDogbmFtZTtcbmNvbnN0IG5lZWRzU3ViUmVzb2x2ZXIgPSAocHJvcCwgdmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSAmJiBwcm9wICE9PSAnYWRhcHRlcnMnICYmXG4gIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpO1xuXG5mdW5jdGlvbiBfY2FjaGVkKHRhcmdldCwgcHJvcCwgcmVzb2x2ZSkge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSByZXNvbHZlKCk7XG4gIC8vIGNhY2hlIHRoZSByZXNvbHZlZCB2YWx1ZVxuICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZVdpdGhDb250ZXh0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgY29uc3Qge19wcm94eSwgX2NvbnRleHQsIF9zdWJQcm94eSwgX2Rlc2NyaXB0b3JzOiBkZXNjcmlwdG9yc30gPSB0YXJnZXQ7XG4gIGxldCB2YWx1ZSA9IF9wcm94eVtwcm9wXTsgLy8gcmVzb2x2ZSBmcm9tIHByb3h5XG5cbiAgLy8gcmVzb2x2ZSB3aXRoIGNvbnRleHRcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpICYmIGRlc2NyaXB0b3JzLmlzU2NyaXB0YWJsZShwcm9wKSkge1xuICAgIHZhbHVlID0gX3Jlc29sdmVTY3JpcHRhYmxlKHByb3AsIHZhbHVlLCB0YXJnZXQsIHJlY2VpdmVyKTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgdmFsdWUgPSBfcmVzb2x2ZUFycmF5KHByb3AsIHZhbHVlLCB0YXJnZXQsIGRlc2NyaXB0b3JzLmlzSW5kZXhhYmxlKTtcbiAgfVxuICBpZiAobmVlZHNTdWJSZXNvbHZlcihwcm9wLCB2YWx1ZSkpIHtcbiAgICAvLyBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYW4gb2JqZWN0LCBjcmVhdGUgYSBzdWIgcmVzb2x2ZXIgZm9yIGl0XG4gICAgdmFsdWUgPSBfYXR0YWNoQ29udGV4dCh2YWx1ZSwgX2NvbnRleHQsIF9zdWJQcm94eSAmJiBfc3ViUHJveHlbcHJvcF0sIGRlc2NyaXB0b3JzKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlU2NyaXB0YWJsZShwcm9wLCB2YWx1ZSwgdGFyZ2V0LCByZWNlaXZlcikge1xuICBjb25zdCB7X3Byb3h5LCBfY29udGV4dCwgX3N1YlByb3h5LCBfc3RhY2t9ID0gdGFyZ2V0O1xuICBpZiAoX3N0YWNrLmhhcyhwcm9wKSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY3Vyc2lvbiBkZXRlY3RlZDogJyArIEFycmF5LmZyb20oX3N0YWNrKS5qb2luKCctPicpICsgJy0+JyArIHByb3ApO1xuICB9XG4gIF9zdGFjay5hZGQocHJvcCk7XG4gIHZhbHVlID0gdmFsdWUoX2NvbnRleHQsIF9zdWJQcm94eSB8fCByZWNlaXZlcik7XG4gIF9zdGFjay5kZWxldGUocHJvcCk7XG4gIGlmIChuZWVkc1N1YlJlc29sdmVyKHByb3AsIHZhbHVlKSkge1xuICAgIC8vIFdoZW4gc2NyaXB0YWJsZSBvcHRpb24gcmV0dXJucyBhbiBvYmplY3QsIGNyZWF0ZSBhIHJlc29sdmVyIG9uIHRoYXQuXG4gICAgdmFsdWUgPSBjcmVhdGVTdWJSZXNvbHZlcihfcHJveHkuX3Njb3BlcywgX3Byb3h5LCBwcm9wLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZUFycmF5KHByb3AsIHZhbHVlLCB0YXJnZXQsIGlzSW5kZXhhYmxlKSB7XG4gIGNvbnN0IHtfcHJveHksIF9jb250ZXh0LCBfc3ViUHJveHksIF9kZXNjcmlwdG9yczogZGVzY3JpcHRvcnN9ID0gdGFyZ2V0O1xuXG4gIGlmIChkZWZpbmVkKF9jb250ZXh0LmluZGV4KSAmJiBpc0luZGV4YWJsZShwcm9wKSkge1xuICAgIHZhbHVlID0gdmFsdWVbX2NvbnRleHQuaW5kZXggJSB2YWx1ZS5sZW5ndGhdO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlWzBdKSkge1xuICAgIC8vIEFycmF5IG9mIG9iamVjdHMsIHJldHVybiBhcnJheSBvciByZXNvbHZlcnNcbiAgICBjb25zdCBhcnIgPSB2YWx1ZTtcbiAgICBjb25zdCBzY29wZXMgPSBfcHJveHkuX3Njb3Blcy5maWx0ZXIocyA9PiBzICE9PSBhcnIpO1xuICAgIHZhbHVlID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgY29uc3QgcmVzb2x2ZXIgPSBjcmVhdGVTdWJSZXNvbHZlcihzY29wZXMsIF9wcm94eSwgcHJvcCwgaXRlbSk7XG4gICAgICB2YWx1ZS5wdXNoKF9hdHRhY2hDb250ZXh0KHJlc29sdmVyLCBfY29udGV4dCwgX3N1YlByb3h5ICYmIF9zdWJQcm94eVtwcm9wXSwgZGVzY3JpcHRvcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmFsbGJhY2soZmFsbGJhY2ssIHByb3AsIHZhbHVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGZhbGxiYWNrKSA/IGZhbGxiYWNrKHByb3AsIHZhbHVlKSA6IGZhbGxiYWNrO1xufVxuXG5jb25zdCBnZXRTY29wZSA9IChrZXksIHBhcmVudCkgPT4ga2V5ID09PSB0cnVlID8gcGFyZW50XG4gIDogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyByZXNvbHZlT2JqZWN0S2V5KHBhcmVudCwga2V5KSA6IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gYWRkU2NvcGVzKHNldCwgcGFyZW50U2NvcGVzLCBrZXksIHBhcmVudEZhbGxiYWNrLCB2YWx1ZSkge1xuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRTY29wZXMpIHtcbiAgICBjb25zdCBzY29wZSA9IGdldFNjb3BlKGtleSwgcGFyZW50KTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHNldC5hZGQoc2NvcGUpO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSByZXNvbHZlRmFsbGJhY2soc2NvcGUuX2ZhbGxiYWNrLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmIChkZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjayAhPT0ga2V5ICYmIGZhbGxiYWNrICE9PSBwYXJlbnRGYWxsYmFjaykge1xuICAgICAgICAvLyBXaGVuIHdlIHJlYWNoIHRoZSBkZXNjcmlwdG9yIHRoYXQgZGVmaW5lcyBhIG5ldyBfZmFsbGJhY2ssIHJldHVybiB0aGF0LlxuICAgICAgICAvLyBUaGUgZmFsbGJhY2sgd2lsbCByZXN1bWUgdG8gdGhhdCBuZXcgc2NvcGUuXG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNjb3BlID09PSBmYWxzZSAmJiBkZWZpbmVkKHBhcmVudEZhbGxiYWNrKSAmJiBrZXkgIT09IHBhcmVudEZhbGxiYWNrKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBgZmFsc2VgIHJlc3VsdHMgdG8gYGZhbHNlYCwgd2hlbiBmYWxsaW5nIGJhY2sgdG8gZGlmZmVyZW50IGtleS5cbiAgICAgIC8vIEZvciBleGFtcGxlIGBpbnRlcmFjdGlvbmAgZnJvbSBgaG92ZXJgIG9yIGBwbHVnaW5zLnRvb2x0aXBgIGFuZCBgYW5pbWF0aW9uYCBmcm9tIGBhbmltYXRpb25zYFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ViUmVzb2x2ZXIocGFyZW50U2NvcGVzLCByZXNvbHZlciwgcHJvcCwgdmFsdWUpIHtcbiAgY29uc3Qgcm9vdFNjb3BlcyA9IHJlc29sdmVyLl9yb290U2NvcGVzO1xuICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVGYWxsYmFjayhyZXNvbHZlci5fZmFsbGJhY2ssIHByb3AsIHZhbHVlKTtcbiAgY29uc3QgYWxsU2NvcGVzID0gWy4uLnBhcmVudFNjb3BlcywgLi4ucm9vdFNjb3Blc107XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoKTtcbiAgc2V0LmFkZCh2YWx1ZSk7XG4gIGxldCBrZXkgPSBhZGRTY29wZXNGcm9tS2V5KHNldCwgYWxsU2NvcGVzLCBwcm9wLCBmYWxsYmFjayB8fCBwcm9wLCB2YWx1ZSk7XG4gIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrICE9PSBwcm9wKSB7XG4gICAga2V5ID0gYWRkU2NvcGVzRnJvbUtleShzZXQsIGFsbFNjb3BlcywgZmFsbGJhY2ssIGtleSwgdmFsdWUpO1xuICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVSZXNvbHZlcihBcnJheS5mcm9tKHNldCksIFsnJ10sIHJvb3RTY29wZXMsIGZhbGxiYWNrLFxuICAgICgpID0+IHN1YkdldFRhcmdldChyZXNvbHZlciwgcHJvcCwgdmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gYWRkU2NvcGVzRnJvbUtleShzZXQsIGFsbFNjb3Blcywga2V5LCBmYWxsYmFjaywgaXRlbSkge1xuICB3aGlsZSAoa2V5KSB7XG4gICAga2V5ID0gYWRkU2NvcGVzKHNldCwgYWxsU2NvcGVzLCBrZXksIGZhbGxiYWNrLCBpdGVtKTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuXG5mdW5jdGlvbiBzdWJHZXRUYXJnZXQocmVzb2x2ZXIsIHByb3AsIHZhbHVlKSB7XG4gIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLl9nZXRUYXJnZXQoKTtcbiAgaWYgKCEocHJvcCBpbiBwYXJlbnQpKSB7XG4gICAgcGFyZW50W3Byb3BdID0ge307XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gcGFyZW50W3Byb3BdO1xuICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIC8vIEZvciBhcnJheSBvZiBvYmplY3RzLCB0aGUgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdXBkYXRlZCB2YWx1ZXNcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRhcmdldCB8fCB7fTtcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVXaXRoUHJlZml4ZXMocHJvcCwgcHJlZml4ZXMsIHNjb3BlcywgcHJveHkpIHtcbiAgbGV0IHZhbHVlO1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBwcmVmaXhlcykge1xuICAgIHZhbHVlID0gX3Jlc29sdmUocmVhZEtleShwcmVmaXgsIHByb3ApLCBzY29wZXMpO1xuICAgIGlmIChkZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG5lZWRzU3ViUmVzb2x2ZXIocHJvcCwgdmFsdWUpXG4gICAgICAgID8gY3JlYXRlU3ViUmVzb2x2ZXIoc2NvcGVzLCBwcm94eSwgcHJvcCwgdmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlKGtleSwgc2NvcGVzKSB7XG4gIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgaWYgKCFzY29wZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gc2NvcGVba2V5XTtcbiAgICBpZiAoZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0Zyb21BbGxTY29wZXModGFyZ2V0KSB7XG4gIGxldCBrZXlzID0gdGFyZ2V0Ll9rZXlzO1xuICBpZiAoIWtleXMpIHtcbiAgICBrZXlzID0gdGFyZ2V0Ll9rZXlzID0gcmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzKHRhcmdldC5fc2NvcGVzKTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzKHNjb3Blcykge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NvcGUpLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoJ18nKSkpIHtcbiAgICAgIHNldC5hZGQoa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgY29uc3Qge2lTY2FsZX0gPSBtZXRhO1xuICBjb25zdCB7a2V5ID0gJ3InfSA9IHRoaXMuX3BhcnNpbmc7XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBBcnJheShjb3VudCk7XG4gIGxldCBpLCBpbGVuLCBpbmRleCwgaXRlbTtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICBpdGVtID0gZGF0YVtpbmRleF07XG4gICAgcGFyc2VkW2ldID0ge1xuICAgICAgcjogaVNjYWxlLnBhcnNlKHJlc29sdmVPYmplY3RLZXkoaXRlbSwga2V5KSwgaW5kZXgpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuIiwgImltcG9ydCB7YWxtb3N0RXF1YWxzLCBkaXN0YW5jZUJldHdlZW5Qb2ludHMsIHNpZ259IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7X2lzUG9pbnRJbkFyZWF9IGZyb20gJy4vaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHR5cGUge0NoYXJ0QXJlYX0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGluZVBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHNraXA/OiBib29sZWFuO1xuXG4gIC8vIEJvdGggQmV6aWVyIGFuZCBtb25vdG9uZSBpbnRlcnBvbGF0aW9ucyBoYXZlIHRoZXNlIGZpZWxkc1xuICAvLyBidXQgdGhleSBhcmUgYWRkZWQgaW4gZGlmZmVyZW50IHNwb3RzXG4gIGNwMXg/OiBudW1iZXI7XG4gIGNwMXk/OiBudW1iZXI7XG4gIGNwMng/OiBudW1iZXI7XG4gIGNwMnk/OiBudW1iZXI7XG59XG5cbmNvbnN0IEVQU0lMT04gPSBOdW1iZXIuRVBTSUxPTiB8fCAxZS0xNDtcblxudHlwZSBPcHRpb25hbFNwbGluZVBvaW50ID0gU3BsaW5lUG9pbnQgfCBmYWxzZVxuY29uc3QgZ2V0UG9pbnQgPSAocG9pbnRzOiBTcGxpbmVQb2ludFtdLCBpOiBudW1iZXIpOiBPcHRpb25hbFNwbGluZVBvaW50ID0+IGkgPCBwb2ludHMubGVuZ3RoICYmICFwb2ludHNbaV0uc2tpcCAmJiBwb2ludHNbaV07XG5jb25zdCBnZXRWYWx1ZUF4aXMgPSAoaW5kZXhBeGlzOiAneCcgfCAneScpID0+IGluZGV4QXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaW5lQ3VydmUoXG4gIGZpcnN0UG9pbnQ6IFNwbGluZVBvaW50LFxuICBtaWRkbGVQb2ludDogU3BsaW5lUG9pbnQsXG4gIGFmdGVyUG9pbnQ6IFNwbGluZVBvaW50LFxuICB0OiBudW1iZXJcbik6IHtcbiAgICBwcmV2aW91czogU3BsaW5lUG9pbnRcbiAgICBuZXh0OiBTcGxpbmVQb2ludFxuICB9IHtcbiAgLy8gUHJvcHMgdG8gUm9iIFNwZW5jZXIgYXQgc2NhbGVkIGlubm92YXRpb24gZm9yIGhpcyBwb3N0IG9uIHNwbGluaW5nIGJldHdlZW4gcG9pbnRzXG4gIC8vIGh0dHA6Ly9zY2FsZWRpbm5vdmF0aW9uLmNvbS9hbmFseXRpY3Mvc3BsaW5lcy9hYm91dFNwbGluZXMuaHRtbFxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHNvIHJlc3BlY3QgXCJza2lwcGVkXCIgcG9pbnRzXG5cbiAgY29uc3QgcHJldmlvdXMgPSBmaXJzdFBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGZpcnN0UG9pbnQ7XG4gIGNvbnN0IGN1cnJlbnQgPSBtaWRkbGVQb2ludDtcbiAgY29uc3QgbmV4dCA9IGFmdGVyUG9pbnQuc2tpcCA/IG1pZGRsZVBvaW50IDogYWZ0ZXJQb2ludDtcbiAgY29uc3QgZDAxID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGN1cnJlbnQsIHByZXZpb3VzKTtcbiAgY29uc3QgZDEyID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKG5leHQsIGN1cnJlbnQpO1xuXG4gIGxldCBzMDEgPSBkMDEgLyAoZDAxICsgZDEyKTtcbiAgbGV0IHMxMiA9IGQxMiAvIChkMDEgKyBkMTIpO1xuXG4gIC8vIElmIGFsbCBwb2ludHMgYXJlIHRoZSBzYW1lLCBzMDEgJiBzMDIgd2lsbCBiZSBpbmZcbiAgczAxID0gaXNOYU4oczAxKSA/IDAgOiBzMDE7XG4gIHMxMiA9IGlzTmFOKHMxMikgPyAwIDogczEyO1xuXG4gIGNvbnN0IGZhID0gdCAqIHMwMTsgLy8gc2NhbGluZyBmYWN0b3IgZm9yIHRyaWFuZ2xlIFRhXG4gIGNvbnN0IGZiID0gdCAqIHMxMjtcblxuICByZXR1cm4ge1xuICAgIHByZXZpb3VzOiB7XG4gICAgICB4OiBjdXJyZW50LnggLSBmYSAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcbiAgICAgIHk6IGN1cnJlbnQueSAtIGZhICogKG5leHQueSAtIHByZXZpb3VzLnkpXG4gICAgfSxcbiAgICBuZXh0OiB7XG4gICAgICB4OiBjdXJyZW50LnggKyBmYiAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcbiAgICAgIHk6IGN1cnJlbnQueSArIGZiICogKG5leHQueSAtIHByZXZpb3VzLnkpXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEFkanVzdCB0YW5nZW50cyB0byBlbnN1cmUgbW9ub3RvbmljIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbW9ub3RvbmVBZGp1c3QocG9pbnRzOiBTcGxpbmVQb2ludFtdLCBkZWx0YUs6IG51bWJlcltdLCBtSzogbnVtYmVyW10pIHtcbiAgY29uc3QgcG9pbnRzTGVuID0gcG9pbnRzLmxlbmd0aDtcblxuICBsZXQgYWxwaGFLOiBudW1iZXIsIGJldGFLOiBudW1iZXIsIHRhdUs6IG51bWJlciwgc3F1YXJlZE1hZ25pdHVkZTogbnVtYmVyLCBwb2ludEN1cnJlbnQ6IE9wdGlvbmFsU3BsaW5lUG9pbnQ7XG4gIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNMZW4gLSAxOyArK2kpIHtcbiAgICBwb2ludEN1cnJlbnQgPSBwb2ludEFmdGVyO1xuICAgIHBvaW50QWZ0ZXIgPSBnZXRQb2ludChwb2ludHMsIGkgKyAxKTtcbiAgICBpZiAoIXBvaW50Q3VycmVudCB8fCAhcG9pbnRBZnRlcikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFsbW9zdEVxdWFscyhkZWx0YUtbaV0sIDAsIEVQU0lMT04pKSB7XG4gICAgICBtS1tpXSA9IG1LW2kgKyAxXSA9IDA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhbHBoYUsgPSBtS1tpXSAvIGRlbHRhS1tpXTtcbiAgICBiZXRhSyA9IG1LW2kgKyAxXSAvIGRlbHRhS1tpXTtcbiAgICBzcXVhcmVkTWFnbml0dWRlID0gTWF0aC5wb3coYWxwaGFLLCAyKSArIE1hdGgucG93KGJldGFLLCAyKTtcbiAgICBpZiAoc3F1YXJlZE1hZ25pdHVkZSA8PSA5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXVLID0gMyAvIE1hdGguc3FydChzcXVhcmVkTWFnbml0dWRlKTtcbiAgICBtS1tpXSA9IGFscGhhSyAqIHRhdUsgKiBkZWx0YUtbaV07XG4gICAgbUtbaSArIDFdID0gYmV0YUsgKiB0YXVLICogZGVsdGFLW2ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vbm90b25lQ29tcHV0ZShwb2ludHM6IFNwbGluZVBvaW50W10sIG1LOiBudW1iZXJbXSwgaW5kZXhBeGlzOiAneCcgfCAneScgPSAneCcpIHtcbiAgY29uc3QgdmFsdWVBeGlzID0gZ2V0VmFsdWVBeGlzKGluZGV4QXhpcyk7XG4gIGNvbnN0IHBvaW50c0xlbiA9IHBvaW50cy5sZW5ndGg7XG4gIGxldCBkZWx0YTogbnVtYmVyLCBwb2ludEJlZm9yZTogT3B0aW9uYWxTcGxpbmVQb2ludCwgcG9pbnRDdXJyZW50OiBPcHRpb25hbFNwbGluZVBvaW50O1xuICBsZXQgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgMCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xuICAgIHBvaW50QmVmb3JlID0gcG9pbnRDdXJyZW50O1xuICAgIHBvaW50Q3VycmVudCA9IHBvaW50QWZ0ZXI7XG4gICAgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgaSArIDEpO1xuICAgIGlmICghcG9pbnRDdXJyZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpUGl4ZWwgPSBwb2ludEN1cnJlbnRbaW5kZXhBeGlzXTtcbiAgICBjb25zdCB2UGl4ZWwgPSBwb2ludEN1cnJlbnRbdmFsdWVBeGlzXTtcbiAgICBpZiAocG9pbnRCZWZvcmUpIHtcbiAgICAgIGRlbHRhID0gKGlQaXhlbCAtIHBvaW50QmVmb3JlW2luZGV4QXhpc10pIC8gMztcbiAgICAgIHBvaW50Q3VycmVudFtgY3AxJHtpbmRleEF4aXN9YF0gPSBpUGl4ZWwgLSBkZWx0YTtcbiAgICAgIHBvaW50Q3VycmVudFtgY3AxJHt2YWx1ZUF4aXN9YF0gPSB2UGl4ZWwgLSBkZWx0YSAqIG1LW2ldO1xuICAgIH1cbiAgICBpZiAocG9pbnRBZnRlcikge1xuICAgICAgZGVsdGEgPSAocG9pbnRBZnRlcltpbmRleEF4aXNdIC0gaVBpeGVsKSAvIDM7XG4gICAgICBwb2ludEN1cnJlbnRbYGNwMiR7aW5kZXhBeGlzfWBdID0gaVBpeGVsICsgZGVsdGE7XG4gICAgICBwb2ludEN1cnJlbnRbYGNwMiR7dmFsdWVBeGlzfWBdID0gdlBpeGVsICsgZGVsdGEgKiBtS1tpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgQsOpemllciBjb250cm9sIHBvaW50cyBpbiBhIHNpbWlsYXIgd2F5IHRoYW4gfHNwbGluZUN1cnZlfCxcbiAqIGJ1dCBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5IG9mIHRoZSBwcm92aWRlZCBkYXRhIGFuZCBlbnN1cmVzIG5vIGxvY2FsIGV4dHJlbXVtcyBhcmUgYWRkZWRcbiAqIGJldHdlZW4gdGhlIGRhdGFzZXQgZGlzY3JldGUgcG9pbnRzIGR1ZSB0byB0aGUgaW50ZXJwb2xhdGlvbi5cbiAqIFNlZSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vbm90b25lX2N1YmljX2ludGVycG9sYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGluZUN1cnZlTW9ub3RvbmUocG9pbnRzOiBTcGxpbmVQb2ludFtdLCBpbmRleEF4aXM6ICd4JyB8ICd5JyA9ICd4Jykge1xuICBjb25zdCB2YWx1ZUF4aXMgPSBnZXRWYWx1ZUF4aXMoaW5kZXhBeGlzKTtcbiAgY29uc3QgcG9pbnRzTGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgY29uc3QgZGVsdGFLOiBudW1iZXJbXSA9IEFycmF5KHBvaW50c0xlbikuZmlsbCgwKTtcbiAgY29uc3QgbUs6IG51bWJlcltdID0gQXJyYXkocG9pbnRzTGVuKTtcblxuICAvLyBDYWxjdWxhdGUgc2xvcGVzIChkZWx0YUspIGFuZCBpbml0aWFsaXplIHRhbmdlbnRzIChtSylcbiAgbGV0IGksIHBvaW50QmVmb3JlOiBPcHRpb25hbFNwbGluZVBvaW50LCBwb2ludEN1cnJlbnQ6IE9wdGlvbmFsU3BsaW5lUG9pbnQ7XG4gIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgcG9pbnRzTGVuOyArK2kpIHtcbiAgICBwb2ludEJlZm9yZSA9IHBvaW50Q3VycmVudDtcbiAgICBwb2ludEN1cnJlbnQgPSBwb2ludEFmdGVyO1xuICAgIHBvaW50QWZ0ZXIgPSBnZXRQb2ludChwb2ludHMsIGkgKyAxKTtcbiAgICBpZiAoIXBvaW50Q3VycmVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50QWZ0ZXIpIHtcbiAgICAgIGNvbnN0IHNsb3BlRGVsdGEgPSBwb2ludEFmdGVyW2luZGV4QXhpc10gLSBwb2ludEN1cnJlbnRbaW5kZXhBeGlzXTtcblxuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgdHdvIHBvaW50cyB0aGF0IGFwcGVhciBhdCB0aGUgc2FtZSB4IHBpeGVsLCBzbG9wZURlbHRhWCBpcyAwXG4gICAgICBkZWx0YUtbaV0gPSBzbG9wZURlbHRhICE9PSAwID8gKHBvaW50QWZ0ZXJbdmFsdWVBeGlzXSAtIHBvaW50Q3VycmVudFt2YWx1ZUF4aXNdKSAvIHNsb3BlRGVsdGEgOiAwO1xuICAgIH1cbiAgICBtS1tpXSA9ICFwb2ludEJlZm9yZSA/IGRlbHRhS1tpXVxuICAgICAgOiAhcG9pbnRBZnRlciA/IGRlbHRhS1tpIC0gMV1cbiAgICAgICAgOiAoc2lnbihkZWx0YUtbaSAtIDFdKSAhPT0gc2lnbihkZWx0YUtbaV0pKSA/IDBcbiAgICAgICAgICA6IChkZWx0YUtbaSAtIDFdICsgZGVsdGFLW2ldKSAvIDI7XG4gIH1cblxuICBtb25vdG9uZUFkanVzdChwb2ludHMsIGRlbHRhSywgbUspO1xuXG4gIG1vbm90b25lQ29tcHV0ZShwb2ludHMsIG1LLCBpbmRleEF4aXMpO1xufVxuXG5mdW5jdGlvbiBjYXBDb250cm9sUG9pbnQocHQ6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihwdCwgbWF4KSwgbWluKTtcbn1cblxuZnVuY3Rpb24gY2FwQmV6aWVyUG9pbnRzKHBvaW50czogU3BsaW5lUG9pbnRbXSwgYXJlYTogQ2hhcnRBcmVhKSB7XG4gIGxldCBpLCBpbGVuLCBwb2ludCwgaW5BcmVhLCBpbkFyZWFQcmV2O1xuICBsZXQgaW5BcmVhTmV4dCA9IF9pc1BvaW50SW5BcmVhKHBvaW50c1swXSwgYXJlYSk7XG4gIGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgaW5BcmVhUHJldiA9IGluQXJlYTtcbiAgICBpbkFyZWEgPSBpbkFyZWFOZXh0O1xuICAgIGluQXJlYU5leHQgPSBpIDwgaWxlbiAtIDEgJiYgX2lzUG9pbnRJbkFyZWEocG9pbnRzW2kgKyAxXSwgYXJlYSk7XG4gICAgaWYgKCFpbkFyZWEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwb2ludCA9IHBvaW50c1tpXTtcbiAgICBpZiAoaW5BcmVhUHJldikge1xuICAgICAgcG9pbnQuY3AxeCA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDF4LCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuICAgICAgcG9pbnQuY3AxeSA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDF5LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuICAgIH1cbiAgICBpZiAoaW5BcmVhTmV4dCkge1xuICAgICAgcG9pbnQuY3AyeCA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDJ4LCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuICAgICAgcG9pbnQuY3AyeSA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDJ5LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfdXBkYXRlQmV6aWVyQ29udHJvbFBvaW50cyhcbiAgcG9pbnRzOiBTcGxpbmVQb2ludFtdLFxuICBvcHRpb25zLFxuICBhcmVhOiBDaGFydEFyZWEsXG4gIGxvb3A6IGJvb2xlYW4sXG4gIGluZGV4QXhpczogJ3gnIHwgJ3knXG4pIHtcbiAgbGV0IGk6IG51bWJlciwgaWxlbjogbnVtYmVyLCBwb2ludDogU3BsaW5lUG9pbnQsIGNvbnRyb2xQb2ludHM6IFJldHVyblR5cGU8dHlwZW9mIHNwbGluZUN1cnZlPjtcblxuICAvLyBPbmx5IGNvbnNpZGVyIHBvaW50cyB0aGF0IGFyZSBkcmF3biBpbiBjYXNlIHRoZSBzcGFuR2FwcyBvcHRpb24gaXMgdXNlZFxuICBpZiAob3B0aW9ucy5zcGFuR2Fwcykge1xuICAgIHBvaW50cyA9IHBvaW50cy5maWx0ZXIoKHB0KSA9PiAhcHQuc2tpcCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG4gICAgc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMsIGluZGV4QXhpcyk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHByZXYgPSBsb29wID8gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSA6IHBvaW50c1swXTtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICBjb250cm9sUG9pbnRzID0gc3BsaW5lQ3VydmUoXG4gICAgICAgIHByZXYsXG4gICAgICAgIHBvaW50LFxuICAgICAgICBwb2ludHNbTWF0aC5taW4oaSArIDEsIGlsZW4gLSAobG9vcCA/IDAgOiAxKSkgJSBpbGVuXSxcbiAgICAgICAgb3B0aW9ucy50ZW5zaW9uXG4gICAgICApO1xuICAgICAgcG9pbnQuY3AxeCA9IGNvbnRyb2xQb2ludHMucHJldmlvdXMueDtcbiAgICAgIHBvaW50LmNwMXkgPSBjb250cm9sUG9pbnRzLnByZXZpb3VzLnk7XG4gICAgICBwb2ludC5jcDJ4ID0gY29udHJvbFBvaW50cy5uZXh0Lng7XG4gICAgICBwb2ludC5jcDJ5ID0gY29udHJvbFBvaW50cy5uZXh0Lnk7XG4gICAgICBwcmV2ID0gcG9pbnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuY2FwQmV6aWVyUG9pbnRzKSB7XG4gICAgY2FwQmV6aWVyUG9pbnRzKHBvaW50cywgYXJlYSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7Q2hhcnRBcmVhLCBTY2FsZX0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgQ2hhcnQgZnJvbSAnLi4vY29yZS9jb3JlLmNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUge0NoYXJ0RXZlbnR9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7SU5GSU5JVFl9IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcblxuLyoqXG4gKiBOb3RlOiB0eXBlZGVmcyBhcmUgYXV0by1leHBvcnRlZCwgc28gdXNlIGEgbWFkZS11cCBgZG9tYCBuYW1lc3BhY2Ugd2hlcmVcbiAqIG5lY2Vzc2FyeSB0byBhdm9pZCBkdXBsaWNhdGVzIHdpdGggYGV4cG9ydCAqIGZyb20gJy4vaGVscGVyc2A7IHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80NjAxMVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IGRvbS5DaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL3R5cGVzJykuQ2hhcnRFdmVudCB9IENoYXJ0RXZlbnRcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfaXNEb21TdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0UGFyZW50Tm9kZShkb21Ob2RlOiBIVE1MQ2FudmFzRWxlbWVudCk6IEhUTUxDYW52YXNFbGVtZW50IHtcbiAgbGV0IHBhcmVudCA9IGRvbU5vZGUucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgU2hhZG93Um9vdF0nKSB7XG4gICAgcGFyZW50ID0gKHBhcmVudCBhcyBTaGFkb3dSb290KS5ob3N0O1xuICB9XG4gIHJldHVybiBwYXJlbnQgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XG59XG5cbi8qKlxuICogY29udmVydCBtYXgtd2lkdGgvbWF4LWhlaWdodCB2YWx1ZXMgdGhhdCBtYXkgYmUgcGVyY2VudGFnZXMgaW50byBhIG51bWJlclxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZU1heFN0eWxlKHN0eWxlVmFsdWU6IHN0cmluZyB8IG51bWJlciwgbm9kZTogSFRNTEVsZW1lbnQsIHBhcmVudFByb3BlcnR5OiBzdHJpbmcpIHtcbiAgbGV0IHZhbHVlSW5QaXhlbHM6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHZhbHVlSW5QaXhlbHMgPSBwYXJzZUludChzdHlsZVZhbHVlLCAxMCk7XG5cbiAgICBpZiAoc3R5bGVWYWx1ZS5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAvLyBwZXJjZW50YWdlICogc2l6ZSBpbiBkaW1lbnNpb25cbiAgICAgIHZhbHVlSW5QaXhlbHMgPSAodmFsdWVJblBpeGVscyAvIDEwMCkgKiBub2RlLnBhcmVudE5vZGVbcGFyZW50UHJvcGVydHldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZUluUGl4ZWxzID0gc3R5bGVWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZUluUGl4ZWxzO1xufVxuXG5jb25zdCBnZXRDb21wdXRlZFN0eWxlID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9PlxuICBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGVsOiBIVE1MRWxlbWVudCwgcHJvcGVydHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbn1cblxuY29uc3QgcG9zaXRpb25zID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcbmZ1bmN0aW9uIGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZXM6IENTU1N0eWxlRGVjbGFyYXRpb24sIHN0eWxlOiBzdHJpbmcsIHN1ZmZpeD86IHN0cmluZyk6IENoYXJ0QXJlYSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIENoYXJ0QXJlYTtcbiAgc3VmZml4ID0gc3VmZml4ID8gJy0nICsgc3VmZml4IDogJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgY29uc3QgcG9zID0gcG9zaXRpb25zW2ldO1xuICAgIHJlc3VsdFtwb3NdID0gcGFyc2VGbG9hdChzdHlsZXNbc3R5bGUgKyAnLScgKyBwb3MgKyBzdWZmaXhdKSB8fCAwO1xuICB9XG4gIHJlc3VsdC53aWR0aCA9IHJlc3VsdC5sZWZ0ICsgcmVzdWx0LnJpZ2h0O1xuICByZXN1bHQuaGVpZ2h0ID0gcmVzdWx0LnRvcCArIHJlc3VsdC5ib3R0b207XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHVzZU9mZnNldFBvcyA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IEV2ZW50VGFyZ2V0KSA9PlxuICAoeCA+IDAgfHwgeSA+IDApICYmICghdGFyZ2V0IHx8ICEodGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zaGFkb3dSb290KTtcblxuLyoqXG4gKiBAcGFyYW0gZVxuICogQHBhcmFtIGNhbnZhc1xuICogQHJldHVybnMgQ2FudmFzIHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldENhbnZhc1Bvc2l0aW9uKFxuICBlOiBFdmVudCB8IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50LFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4pOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBib3g6IGJvb2xlYW47XG4gIH0ge1xuICBjb25zdCB0b3VjaGVzID0gKGUgYXMgVG91Y2hFdmVudCkudG91Y2hlcztcbiAgY29uc3Qgc291cmNlID0gKHRvdWNoZXMgJiYgdG91Y2hlcy5sZW5ndGggPyB0b3VjaGVzWzBdIDogZSkgYXMgTW91c2VFdmVudDtcbiAgY29uc3Qge29mZnNldFgsIG9mZnNldFl9ID0gc291cmNlIGFzIE1vdXNlRXZlbnQ7XG4gIGxldCBib3ggPSBmYWxzZTtcbiAgbGV0IHgsIHk7XG4gIGlmICh1c2VPZmZzZXRQb3Mob2Zmc2V0WCwgb2Zmc2V0WSwgZS50YXJnZXQpKSB7XG4gICAgeCA9IG9mZnNldFg7XG4gICAgeSA9IG9mZnNldFk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB4ID0gc291cmNlLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgeSA9IHNvdXJjZS5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgYm94ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4ge3gsIHksIGJveH07XG59XG5cbi8qKlxuICogR2V0cyBhbiBldmVudCdzIHgsIHkgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHRoZSBjaGFydCBhcmVhXG4gKiBAcGFyYW0gZXZlbnRcbiAqIEBwYXJhbSBjaGFydFxuICogQHJldHVybnMgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgZXZlbnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb3NpdGlvbihcbiAgZXZlbnQ6IEV2ZW50IHwgQ2hhcnRFdmVudCB8IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50LFxuICBjaGFydDogQ2hhcnRcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gIGlmICgnbmF0aXZlJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIGNvbnN0IHtjYW52YXMsIGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvfSA9IGNoYXJ0O1xuICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY2FudmFzKTtcbiAgY29uc3QgYm9yZGVyQm94ID0gc3R5bGUuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCc7XG4gIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICBjb25zdCBib3JkZXJzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAnYm9yZGVyJywgJ3dpZHRoJyk7XG4gIGNvbnN0IHt4LCB5LCBib3h9ID0gZ2V0Q2FudmFzUG9zaXRpb24oZXZlbnQsIGNhbnZhcyk7XG4gIGNvbnN0IHhPZmZzZXQgPSBwYWRkaW5ncy5sZWZ0ICsgKGJveCAmJiBib3JkZXJzLmxlZnQpO1xuICBjb25zdCB5T2Zmc2V0ID0gcGFkZGluZ3MudG9wICsgKGJveCAmJiBib3JkZXJzLnRvcCk7XG5cbiAgbGV0IHt3aWR0aCwgaGVpZ2h0fSA9IGNoYXJ0O1xuICBpZiAoYm9yZGVyQm94KSB7XG4gICAgd2lkdGggLT0gcGFkZGluZ3Mud2lkdGggKyBib3JkZXJzLndpZHRoO1xuICAgIGhlaWdodCAtPSBwYWRkaW5ncy5oZWlnaHQgKyBib3JkZXJzLmhlaWdodDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IE1hdGgucm91bmQoKHggLSB4T2Zmc2V0KSAvIHdpZHRoICogY2FudmFzLndpZHRoIC8gY3VycmVudERldmljZVBpeGVsUmF0aW8pLFxuICAgIHk6IE1hdGgucm91bmQoKHkgLSB5T2Zmc2V0KSAvIGhlaWdodCAqIGNhbnZhcy5oZWlnaHQgLyBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbylcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyU2l6ZShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFBhcnRpYWw8U2NhbGU+IHtcbiAgbGV0IG1heFdpZHRoOiBudW1iZXIsIG1heEhlaWdodDogbnVtYmVyO1xuXG4gIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gX2dldFBhcmVudE5vZGUoY2FudmFzKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgd2lkdGggPSBjYW52YXMuY2xpZW50V2lkdGg7XG4gICAgICBoZWlnaHQgPSBjYW52YXMuY2xpZW50SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyB0aGlzIGlzIHRoZSBib3JkZXIgYm94IG9mIHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IGNvbnRhaW5lclN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgY29uc3QgY29udGFpbmVyQm9yZGVyID0gZ2V0UG9zaXRpb25lZFN0eWxlKGNvbnRhaW5lclN0eWxlLCAnYm9yZGVyJywgJ3dpZHRoJyk7XG4gICAgICBjb25zdCBjb250YWluZXJQYWRkaW5nID0gZ2V0UG9zaXRpb25lZFN0eWxlKGNvbnRhaW5lclN0eWxlLCAncGFkZGluZycpO1xuICAgICAgd2lkdGggPSByZWN0LndpZHRoIC0gY29udGFpbmVyUGFkZGluZy53aWR0aCAtIGNvbnRhaW5lckJvcmRlci53aWR0aDtcbiAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0IC0gY29udGFpbmVyUGFkZGluZy5oZWlnaHQgLSBjb250YWluZXJCb3JkZXIuaGVpZ2h0O1xuICAgICAgbWF4V2lkdGggPSBwYXJzZU1heFN0eWxlKGNvbnRhaW5lclN0eWxlLm1heFdpZHRoLCBjb250YWluZXIsICdjbGllbnRXaWR0aCcpO1xuICAgICAgbWF4SGVpZ2h0ID0gcGFyc2VNYXhTdHlsZShjb250YWluZXJTdHlsZS5tYXhIZWlnaHQsIGNvbnRhaW5lciwgJ2NsaWVudEhlaWdodCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBtYXhXaWR0aDogbWF4V2lkdGggfHwgSU5GSU5JVFksXG4gICAgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfHwgSU5GSU5JVFlcbiAgfTtcbn1cblxuY29uc3Qgcm91bmQxID0gKHY6IG51bWJlcikgPT4gTWF0aC5yb3VuZCh2ICogMTApIC8gMTA7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4aW11bVNpemUoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gIGJiV2lkdGg/OiBudW1iZXIsXG4gIGJiSGVpZ2h0PzogbnVtYmVyLFxuICBhc3BlY3RSYXRpbz86IG51bWJlclxuKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNhbnZhcyk7XG4gIGNvbnN0IG1hcmdpbnMgPSBnZXRQb3NpdGlvbmVkU3R5bGUoc3R5bGUsICdtYXJnaW4nKTtcbiAgY29uc3QgbWF4V2lkdGggPSBwYXJzZU1heFN0eWxlKHN0eWxlLm1heFdpZHRoLCBjYW52YXMsICdjbGllbnRXaWR0aCcpIHx8IElORklOSVRZO1xuICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZU1heFN0eWxlKHN0eWxlLm1heEhlaWdodCwgY2FudmFzLCAnY2xpZW50SGVpZ2h0JykgfHwgSU5GSU5JVFk7XG4gIGNvbnN0IGNvbnRhaW5lclNpemUgPSBnZXRDb250YWluZXJTaXplKGNhbnZhcywgYmJXaWR0aCwgYmJIZWlnaHQpO1xuICBsZXQge3dpZHRoLCBoZWlnaHR9ID0gY29udGFpbmVyU2l6ZTtcblxuICBpZiAoc3R5bGUuYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgY29uc3QgYm9yZGVycyA9IGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZSwgJ2JvcmRlcicsICd3aWR0aCcpO1xuICAgIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICAgIHdpZHRoIC09IHBhZGRpbmdzLndpZHRoICsgYm9yZGVycy53aWR0aDtcbiAgICBoZWlnaHQgLT0gcGFkZGluZ3MuaGVpZ2h0ICsgYm9yZGVycy5oZWlnaHQ7XG4gIH1cbiAgd2lkdGggPSBNYXRoLm1heCgwLCB3aWR0aCAtIG1hcmdpbnMud2lkdGgpO1xuICBoZWlnaHQgPSBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IHdpZHRoIC8gYXNwZWN0UmF0aW8gOiBoZWlnaHQgLSBtYXJnaW5zLmhlaWdodCk7XG4gIHdpZHRoID0gcm91bmQxKE1hdGgubWluKHdpZHRoLCBtYXhXaWR0aCwgY29udGFpbmVyU2l6ZS5tYXhXaWR0aCkpO1xuICBoZWlnaHQgPSByb3VuZDEoTWF0aC5taW4oaGVpZ2h0LCBtYXhIZWlnaHQsIGNvbnRhaW5lclNpemUubWF4SGVpZ2h0KSk7XG4gIGlmICh3aWR0aCAmJiAhaGVpZ2h0KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQ2NTlcbiAgICAvLyBJZiB0aGUgY2FudmFzIGhhcyB3aWR0aCwgYnV0IG5vIGhlaWdodCwgZGVmYXVsdCB0byBhc3BlY3RSYXRpbyBvZiAyIChjYW52YXMgZGVmYXVsdClcbiAgICBoZWlnaHQgPSByb3VuZDEod2lkdGggLyAyKTtcbiAgfVxuXG4gIGNvbnN0IG1haW50YWluSGVpZ2h0ID0gYmJXaWR0aCAhPT0gdW5kZWZpbmVkIHx8IGJiSGVpZ2h0ICE9PSB1bmRlZmluZWQ7XG5cbiAgaWYgKG1haW50YWluSGVpZ2h0ICYmIGFzcGVjdFJhdGlvICYmIGNvbnRhaW5lclNpemUuaGVpZ2h0ICYmIGhlaWdodCA+IGNvbnRhaW5lclNpemUuaGVpZ2h0KSB7XG4gICAgaGVpZ2h0ID0gY29udGFpbmVyU2l6ZS5oZWlnaHQ7XG4gICAgd2lkdGggPSByb3VuZDEoTWF0aC5mbG9vcihoZWlnaHQgKiBhc3BlY3RSYXRpbykpO1xuICB9XG5cbiAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0fTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY2hhcnRcbiAqIEBwYXJhbSBmb3JjZVJhdGlvXG4gKiBAcGFyYW0gZm9yY2VTdHlsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2FudmFzIGNvbnRleHQgc2l6ZSBvciB0cmFuc2Zvcm1hdGlvbiBoYXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldGluYVNjYWxlKFxuICBjaGFydDogQ2hhcnQsXG4gIGZvcmNlUmF0aW86IG51bWJlcixcbiAgZm9yY2VTdHlsZT86IGJvb2xlYW5cbik6IGJvb2xlYW4gfCB2b2lkIHtcbiAgY29uc3QgcGl4ZWxSYXRpbyA9IGZvcmNlUmF0aW8gfHwgMTtcbiAgY29uc3QgZGV2aWNlSGVpZ2h0ID0gTWF0aC5mbG9vcihjaGFydC5oZWlnaHQgKiBwaXhlbFJhdGlvKTtcbiAgY29uc3QgZGV2aWNlV2lkdGggPSBNYXRoLmZsb29yKGNoYXJ0LndpZHRoICogcGl4ZWxSYXRpbyk7XG5cbiAgY2hhcnQuaGVpZ2h0ID0gTWF0aC5mbG9vcihjaGFydC5oZWlnaHQpO1xuICBjaGFydC53aWR0aCA9IE1hdGguZmxvb3IoY2hhcnQud2lkdGgpO1xuXG4gIGNvbnN0IGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblxuICAvLyBJZiBubyBzdHlsZSBoYXMgYmVlbiBzZXQgb24gdGhlIGNhbnZhcywgdGhlIHJlbmRlciBzaXplIGlzIHVzZWQgYXMgZGlzcGxheSBzaXplLFxuICAvLyBtYWtpbmcgdGhlIGNoYXJ0IHZpc3VhbGx5IGJpZ2dlciwgc28gbGV0J3MgZW5mb3JjZSBpdCB0byB0aGUgXCJjb3JyZWN0XCIgdmFsdWVzLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM1NzVcbiAgaWYgKGNhbnZhcy5zdHlsZSAmJiAoZm9yY2VTdHlsZSB8fCAoIWNhbnZhcy5zdHlsZS5oZWlnaHQgJiYgIWNhbnZhcy5zdHlsZS53aWR0aCkpKSB7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2NoYXJ0LmhlaWdodH1weGA7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7Y2hhcnQud2lkdGh9cHhgO1xuICB9XG5cbiAgaWYgKGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvICE9PSBwaXhlbFJhdGlvXG4gICAgICB8fCBjYW52YXMuaGVpZ2h0ICE9PSBkZXZpY2VIZWlnaHRcbiAgICAgIHx8IGNhbnZhcy53aWR0aCAhPT0gZGV2aWNlV2lkdGgpIHtcbiAgICBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgY2FudmFzLmhlaWdodCA9IGRldmljZUhlaWdodDtcbiAgICBjYW52YXMud2lkdGggPSBkZXZpY2VXaWR0aDtcbiAgICBjaGFydC5jdHguc2V0VHJhbnNmb3JtKHBpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHN1cHBvcnQgZm9yIG9wdGlvbnMgb2JqZWN0IGFyZ3VtZW50IGluIGFkZEV2ZW50TGlzdGVuZXIuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA9IChmdW5jdGlvbigpIHtcbiAgbGV0IHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgZ2V0IHBhc3NpdmUoKSB7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHBhc3NpdmUgcHJvcGVydHkuXG4gICAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucztcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRpb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxuICByZXR1cm4gcGFzc2l2ZVN1cHBvcnRlZDtcbn0oKSk7XG5cbi8qKlxuICogVGhlIFwidXNlZFwiIHNpemUgaXMgdGhlIGZpbmFsIHZhbHVlIG9mIGEgZGltZW5zaW9uIHByb3BlcnR5IGFmdGVyIGFsbCBjYWxjdWxhdGlvbnMgaGF2ZVxuICogYmVlbiBwZXJmb3JtZWQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIGBlbGVtZW50YCBidXQgcmV0dXJucyB1bmRlZmluZWRcbiAqIGlmIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBub3QgZXhwcmVzc2VkIGluIHBpeGVscy4gVGhhdCBjYW4gaGFwcGVuIGluIHNvbWUgY2FzZXMgd2hlcmVcbiAqIGBlbGVtZW50YCBoYXMgYSBzaXplIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgYW5kIHRoaXMgbGFzdCBvbmUgaXMgbm90IHlldCBkaXNwbGF5ZWQsXG4gKiBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGBkaXNwbGF5OiBub25lYCBvbiBhIHBhcmVudCBub2RlLlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdXNlZF92YWx1ZVxuICogQHJldHVybnMgU2l6ZSBpbiBwaXhlbHMgb3IgdW5kZWZpbmVkIGlmIHVua25vd24uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVc2VkU2l6ZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIHByb3BlcnR5OiAnd2lkdGgnIHwgJ2hlaWdodCdcbik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gZ2V0U3R5bGUoZWxlbWVudCwgcHJvcGVydHkpO1xuICBjb25zdCBtYXRjaGVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goL14oXFxkKykoXFwuXFxkKyk/cHgkLyk7XG4gIHJldHVybiBtYXRjaGVzID8gK21hdGNoZXNbMV0gOiB1bmRlZmluZWQ7XG59XG4iLCAiaW1wb3J0IHR5cGUge1BvaW50fSBmcm9tICcuLi90eXBlcy9nZW9tZXRyaWMuanMnO1xuaW1wb3J0IHR5cGUge1NwbGluZVBvaW50fSBmcm9tICcuL2hlbHBlcnMuY3VydmUuanMnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcG9pbnRJbkxpbmUocDE6IFBvaW50LCBwMjogUG9pbnQsIHQ6IG51bWJlciwgbW9kZT8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHtcbiAgICB4OiBwMS54ICsgdCAqIChwMi54IC0gcDEueCksXG4gICAgeTogcDEueSArIHQgKiAocDIueSAtIHAxLnkpXG4gIH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zdGVwcGVkSW50ZXJwb2xhdGlvbihcbiAgcDE6IFBvaW50LFxuICBwMjogUG9pbnQsXG4gIHQ6IG51bWJlciwgbW9kZTogJ21pZGRsZScgfCAnYWZ0ZXInIHwgdW5rbm93blxuKSB7XG4gIHJldHVybiB7XG4gICAgeDogcDEueCArIHQgKiAocDIueCAtIHAxLngpLFxuICAgIHk6IG1vZGUgPT09ICdtaWRkbGUnID8gdCA8IDAuNSA/IHAxLnkgOiBwMi55XG4gICAgICA6IG1vZGUgPT09ICdhZnRlcicgPyB0IDwgMSA/IHAxLnkgOiBwMi55XG4gICAgICAgIDogdCA+IDAgPyBwMi55IDogcDEueVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYmV6aWVySW50ZXJwb2xhdGlvbihwMTogU3BsaW5lUG9pbnQsIHAyOiBTcGxpbmVQb2ludCwgdDogbnVtYmVyLCBtb2RlPykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdCBjcDEgPSB7eDogcDEuY3AyeCwgeTogcDEuY3AyeX07XG4gIGNvbnN0IGNwMiA9IHt4OiBwMi5jcDF4LCB5OiBwMi5jcDF5fTtcbiAgY29uc3QgYSA9IF9wb2ludEluTGluZShwMSwgY3AxLCB0KTtcbiAgY29uc3QgYiA9IF9wb2ludEluTGluZShjcDEsIGNwMiwgdCk7XG4gIGNvbnN0IGMgPSBfcG9pbnRJbkxpbmUoY3AyLCBwMiwgdCk7XG4gIGNvbnN0IGQgPSBfcG9pbnRJbkxpbmUoYSwgYiwgdCk7XG4gIGNvbnN0IGUgPSBfcG9pbnRJbkxpbmUoYiwgYywgdCk7XG4gIHJldHVybiBfcG9pbnRJbkxpbmUoZCwgZSwgdCk7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBSVExBZGFwdGVyIHtcbiAgeCh4OiBudW1iZXIpOiBudW1iZXI7XG4gIHNldFdpZHRoKHc6IG51bWJlcik6IHZvaWQ7XG4gIHRleHRBbGlnbihhbGlnbjogJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnKTogJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnO1xuICB4UGx1cyh4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBudW1iZXI7XG4gIGxlZnRGb3JMdHIoeDogbnVtYmVyLCBpdGVtV2lkdGg6IG51bWJlcik6IG51bWJlcjtcbn1cblxuY29uc3QgZ2V0UmlnaHRUb0xlZnRBZGFwdGVyID0gZnVuY3Rpb24ocmVjdFg6IG51bWJlciwgd2lkdGg6IG51bWJlcik6IFJUTEFkYXB0ZXIge1xuICByZXR1cm4ge1xuICAgIHgoeCkge1xuICAgICAgcmV0dXJuIHJlY3RYICsgcmVjdFggKyB3aWR0aCAtIHg7XG4gICAgfSxcbiAgICBzZXRXaWR0aCh3KSB7XG4gICAgICB3aWR0aCA9IHc7XG4gICAgfSxcbiAgICB0ZXh0QWxpZ24oYWxpZ24pIHtcbiAgICAgIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgcmV0dXJuIGFsaWduO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFsaWduID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICB9LFxuICAgIHhQbHVzKHgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4geCAtIHZhbHVlO1xuICAgIH0sXG4gICAgbGVmdEZvckx0cih4LCBpdGVtV2lkdGgpIHtcbiAgICAgIHJldHVybiB4IC0gaXRlbVdpZHRoO1xuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCBnZXRMZWZ0VG9SaWdodEFkYXB0ZXIgPSBmdW5jdGlvbigpOiBSVExBZGFwdGVyIHtcbiAgcmV0dXJuIHtcbiAgICB4KHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH0sXG4gICAgc2V0V2lkdGgodykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgfSxcbiAgICB0ZXh0QWxpZ24oYWxpZ24pIHtcbiAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9LFxuICAgIHhQbHVzKHgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4geCArIHZhbHVlO1xuICAgIH0sXG4gICAgbGVmdEZvckx0cih4LCBfaXRlbVdpZHRoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4geDtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ0bEFkYXB0ZXIocnRsOiBib29sZWFuLCByZWN0WDogbnVtYmVyLCB3aWR0aDogbnVtYmVyKSB7XG4gIHJldHVybiBydGwgPyBnZXRSaWdodFRvTGVmdEFkYXB0ZXIocmVjdFgsIHdpZHRoKSA6IGdldExlZnRUb1JpZ2h0QWRhcHRlcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBkaXJlY3Rpb246ICdsdHInIHwgJ3J0bCcpIHtcbiAgbGV0IHN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uLCBvcmlnaW5hbDogW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ2x0cicgfHwgZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHN0eWxlID0gY3R4LmNhbnZhcy5zdHlsZTtcbiAgICBvcmlnaW5hbCA9IFtcbiAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2RpcmVjdGlvbicpLFxuICAgICAgc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eSgnZGlyZWN0aW9uJyksXG4gICAgXTtcblxuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXJlY3Rpb24nLCBkaXJlY3Rpb24sICdpbXBvcnRhbnQnKTtcbiAgICAoY3R4IGFzIHsgcHJldlRleHREaXJlY3Rpb24/OiBbc3RyaW5nLCBzdHJpbmddIH0pLnByZXZUZXh0RGlyZWN0aW9uID0gb3JpZ2luYWw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVUZXh0RGlyZWN0aW9uKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBvcmlnaW5hbD86IFtzdHJpbmcsIHN0cmluZ10pIHtcbiAgaWYgKG9yaWdpbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWxldGUgKGN0eCBhcyB7IHByZXZUZXh0RGlyZWN0aW9uPzogW3N0cmluZywgc3RyaW5nXSB9KS5wcmV2VGV4dERpcmVjdGlvbjtcbiAgICBjdHguY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCdkaXJlY3Rpb24nLCBvcmlnaW5hbFswXSwgb3JpZ2luYWxbMV0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHtfYW5nbGVCZXR3ZWVuLCBfYW5nbGVEaWZmLCBfaXNCZXR3ZWVuLCBfbm9ybWFsaXplQW5nbGV9IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7Y3JlYXRlQ29udGV4dH0gZnJvbSAnLi9oZWxwZXJzLm9wdGlvbnMuanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9lbGVtZW50cy9lbGVtZW50LmxpbmUuanMnKS5kZWZhdWx0IH0gTGluZUVsZW1lbnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9lbGVtZW50cy9lbGVtZW50LnBvaW50LmpzJykuZGVmYXVsdCB9IFBvaW50RWxlbWVudFxuICogQHR5cGVkZWYge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgbG9vcDogYm9vbGVhbiwgc3R5bGU/OiBhbnl9fSBTZWdtZW50XG4gKi9cblxuZnVuY3Rpb24gcHJvcGVydHlGbihwcm9wZXJ0eSkge1xuICBpZiAocHJvcGVydHkgPT09ICdhbmdsZScpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmV0d2VlbjogX2FuZ2xlQmV0d2VlbixcbiAgICAgIGNvbXBhcmU6IF9hbmdsZURpZmYsXG4gICAgICBub3JtYWxpemU6IF9ub3JtYWxpemVBbmdsZSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYmV0d2VlbjogX2lzQmV0d2VlbixcbiAgICBjb21wYXJlOiAoYSwgYikgPT4gYSAtIGIsXG4gICAgbm9ybWFsaXplOiB4ID0+IHhcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VnbWVudCh7c3RhcnQsIGVuZCwgY291bnQsIGxvb3AsIHN0eWxlfSkge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCAlIGNvdW50LFxuICAgIGVuZDogZW5kICUgY291bnQsXG4gICAgbG9vcDogbG9vcCAmJiAoZW5kIC0gc3RhcnQgKyAxKSAlIGNvdW50ID09PSAwLFxuICAgIHN0eWxlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNlZ21lbnQoc2VnbWVudCwgcG9pbnRzLCBib3VuZHMpIHtcbiAgY29uc3Qge3Byb3BlcnR5LCBzdGFydDogc3RhcnRCb3VuZCwgZW5kOiBlbmRCb3VuZH0gPSBib3VuZHM7XG4gIGNvbnN0IHtiZXR3ZWVuLCBub3JtYWxpemV9ID0gcHJvcGVydHlGbihwcm9wZXJ0eSk7XG4gIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQge3N0YXJ0LCBlbmQsIGxvb3B9ID0gc2VnbWVudDtcbiAgbGV0IGksIGlsZW47XG5cbiAgaWYgKGxvb3ApIHtcbiAgICBzdGFydCArPSBjb3VudDtcbiAgICBlbmQgKz0gY291bnQ7XG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBpZiAoIWJldHdlZW4obm9ybWFsaXplKHBvaW50c1tzdGFydCAlIGNvdW50XVtwcm9wZXJ0eV0pLCBzdGFydEJvdW5kLCBlbmRCb3VuZCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGFydC0tO1xuICAgICAgZW5kLS07XG4gICAgfVxuICAgIHN0YXJ0ICU9IGNvdW50O1xuICAgIGVuZCAlPSBjb3VudDtcbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkge1xuICAgIGVuZCArPSBjb3VudDtcbiAgfVxuICByZXR1cm4ge3N0YXJ0LCBlbmQsIGxvb3AsIHN0eWxlOiBzZWdtZW50LnN0eWxlfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdWItc2VnbWVudChzKSBvZiBhIGxpbmUgc2VnbWVudCB0aGF0IGZhbGwgaW4gdGhlIGdpdmVuIGJvdW5kc1xuICogQHBhcmFtIHtvYmplY3R9IHNlZ21lbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LnN0YXJ0IC0gc3RhcnQgaW5kZXggb2YgdGhlIHNlZ21lbnQsIHJlZmVycmluZyB0aGUgcG9pbnRzIGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gc2VnbWVudC5lbmQgLSBlbmQgaW5kZXggb2YgdGhlIHNlZ21lbnQsIHJlZmVycmluZyB0aGUgcG9pbnRzIGFycmF5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNlZ21lbnQubG9vcCAtIGluZGljYXRlcyB0aGF0IHRoZSBzZWdtZW50IGlzIGEgbG9vcFxuICogQHBhcmFtIHtvYmplY3R9IFtzZWdtZW50LnN0eWxlXSAtIHNlZ21lbnQgc3R5bGVcbiAqIEBwYXJhbSB7UG9pbnRFbGVtZW50W119IHBvaW50cyAtIHRoZSBwb2ludHMgdGhhdCB0aGlzIHNlZ21lbnQgcmVmZXJzIHRvXG4gKiBAcGFyYW0ge29iamVjdH0gW2JvdW5kc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZHMucHJvcGVydHkgLSB0aGUgcHJvcGVydHkgb2YgYSBgUG9pbnRFbGVtZW50YCB3ZSBhcmUgYm91bmRpbmcuIGB4YCwgYHlgIG9yIGBhbmdsZWAuXG4gKiBAcGFyYW0ge251bWJlcn0gYm91bmRzLnN0YXJ0IC0gc3RhcnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge251bWJlcn0gYm91bmRzLmVuZCAtIGVuZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwcml2YXRlXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gX2JvdW5kU2VnbWVudChzZWdtZW50LCBwb2ludHMsIGJvdW5kcykge1xuICBpZiAoIWJvdW5kcykge1xuICAgIHJldHVybiBbc2VnbWVudF07XG4gIH1cblxuICBjb25zdCB7cHJvcGVydHksIHN0YXJ0OiBzdGFydEJvdW5kLCBlbmQ6IGVuZEJvdW5kfSA9IGJvdW5kcztcbiAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICBjb25zdCB7Y29tcGFyZSwgYmV0d2Vlbiwgbm9ybWFsaXplfSA9IHByb3BlcnR5Rm4ocHJvcGVydHkpO1xuICBjb25zdCB7c3RhcnQsIGVuZCwgbG9vcCwgc3R5bGV9ID0gZ2V0U2VnbWVudChzZWdtZW50LCBwb2ludHMsIGJvdW5kcyk7XG5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgbGV0IHN1YlN0YXJ0ID0gbnVsbDtcbiAgbGV0IHZhbHVlLCBwb2ludCwgcHJldlZhbHVlO1xuXG4gIGNvbnN0IHN0YXJ0SXNCZWZvcmUgPSAoKSA9PiBiZXR3ZWVuKHN0YXJ0Qm91bmQsIHByZXZWYWx1ZSwgdmFsdWUpICYmIGNvbXBhcmUoc3RhcnRCb3VuZCwgcHJldlZhbHVlKSAhPT0gMDtcbiAgY29uc3QgZW5kSXNCZWZvcmUgPSAoKSA9PiBjb21wYXJlKGVuZEJvdW5kLCB2YWx1ZSkgPT09IDAgfHwgYmV0d2VlbihlbmRCb3VuZCwgcHJldlZhbHVlLCB2YWx1ZSk7XG4gIGNvbnN0IHNob3VsZFN0YXJ0ID0gKCkgPT4gaW5zaWRlIHx8IHN0YXJ0SXNCZWZvcmUoKTtcbiAgY29uc3Qgc2hvdWxkU3RvcCA9ICgpID0+ICFpbnNpZGUgfHwgZW5kSXNCZWZvcmUoKTtcblxuICBmb3IgKGxldCBpID0gc3RhcnQsIHByZXYgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkge1xuICAgIHBvaW50ID0gcG9pbnRzW2kgJSBjb3VudF07XG5cbiAgICBpZiAocG9pbnQuc2tpcCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFsdWUgPSBub3JtYWxpemUocG9pbnRbcHJvcGVydHldKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gcHJldlZhbHVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpbnNpZGUgPSBiZXR3ZWVuKHZhbHVlLCBzdGFydEJvdW5kLCBlbmRCb3VuZCk7XG5cbiAgICBpZiAoc3ViU3RhcnQgPT09IG51bGwgJiYgc2hvdWxkU3RhcnQoKSkge1xuICAgICAgc3ViU3RhcnQgPSBjb21wYXJlKHZhbHVlLCBzdGFydEJvdW5kKSA9PT0gMCA/IGkgOiBwcmV2O1xuICAgIH1cblxuICAgIGlmIChzdWJTdGFydCAhPT0gbnVsbCAmJiBzaG91bGRTdG9wKCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5vcm1hbGl6ZVNlZ21lbnQoe3N0YXJ0OiBzdWJTdGFydCwgZW5kOiBpLCBsb29wLCBjb3VudCwgc3R5bGV9KSk7XG4gICAgICBzdWJTdGFydCA9IG51bGw7XG4gICAgfVxuICAgIHByZXYgPSBpO1xuICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgaWYgKHN1YlN0YXJ0ICE9PSBudWxsKSB7XG4gICAgcmVzdWx0LnB1c2gobm9ybWFsaXplU2VnbWVudCh7c3RhcnQ6IHN1YlN0YXJ0LCBlbmQsIGxvb3AsIGNvdW50LCBzdHlsZX0pKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWdtZW50cyBvZiB0aGUgbGluZSB0aGF0IGFyZSBpbnNpZGUgZ2l2ZW4gYm91bmRzXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gW2JvdW5kc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZHMucHJvcGVydHkgLSB0aGUgcHJvcGVydHkgd2UgYXJlIGJvdW5kaW5nIHdpdGguIGB4YCwgYHlgIG9yIGBhbmdsZWAuXG4gKiBAcGFyYW0ge251bWJlcn0gYm91bmRzLnN0YXJ0IC0gc3RhcnQgdmFsdWUgb2YgdGhlIGBwcm9wZXJ0eWBcbiAqIEBwYXJhbSB7bnVtYmVyfSBib3VuZHMuZW5kIC0gZW5kIHZhbHVlIG9mIHRoZSBgcHJvcGVydHlgXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2JvdW5kU2VnbWVudHMobGluZSwgYm91bmRzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBzZWdtZW50cyA9IGxpbmUuc2VnbWVudHM7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN1YiA9IF9ib3VuZFNlZ21lbnQoc2VnbWVudHNbaV0sIGxpbmUucG9pbnRzLCBib3VuZHMpO1xuICAgIGlmIChzdWIubGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5zdWIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpbmQgc3RhcnQgYW5kIGVuZCBpbmRleCBvZiBhIGxpbmUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTdGFydEFuZEVuZChwb2ludHMsIGNvdW50LCBsb29wLCBzcGFuR2Fwcykge1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgZW5kID0gY291bnQgLSAxO1xuXG4gIGlmIChsb29wICYmICFzcGFuR2Fwcykge1xuICAgIC8vIGxvb3AgYW5kIG5vdCBzcGFubmluZyBnYXBzLCBmaXJzdCBmaW5kIGEgZ2FwIHRvIHN0YXJ0IGZyb21cbiAgICB3aGlsZSAoc3RhcnQgPCBjb3VudCAmJiAhcG9pbnRzW3N0YXJ0XS5za2lwKSB7XG4gICAgICBzdGFydCsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgZmlyc3Qgbm9uIHNraXBwZWQgcG9pbnQgKGFmdGVyIHRoZSBmaXJzdCBnYXAgcG9zc2libHkpXG4gIHdoaWxlIChzdGFydCA8IGNvdW50ICYmIHBvaW50c1tzdGFydF0uc2tpcCkge1xuICAgIHN0YXJ0Kys7XG4gIH1cblxuICAvLyBpZiB3ZSBsb29wZWQgdG8gY291bnQsIHN0YXJ0IG5lZWRzIHRvIGJlIDBcbiAgc3RhcnQgJT0gY291bnQ7XG5cbiAgaWYgKGxvb3ApIHtcbiAgICAvLyBsb29wIHdpbGwgZ28gcGFzdCBjb3VudCwgaWYgc3RhcnQgPiAwXG4gICAgZW5kICs9IHN0YXJ0O1xuICB9XG5cbiAgd2hpbGUgKGVuZCA+IHN0YXJ0ICYmIHBvaW50c1tlbmQgJSBjb3VudF0uc2tpcCkge1xuICAgIGVuZC0tO1xuICB9XG5cbiAgLy8gZW5kIGNvdWxkIGJlIG1vcmUgdGhhbiBjb3VudCwgbm9ybWFsaXplXG4gIGVuZCAlPSBjb3VudDtcblxuICByZXR1cm4ge3N0YXJ0LCBlbmR9O1xufVxuXG4vKipcbiAqIENvbXB1dGUgc29saWQgc2VnbWVudHMgZnJvbSBQb2ludHMsIHdoZW4gc3BhbkdhcHMgPT09IGZhbHNlXG4gKiBAcGFyYW0ge1BvaW50RWxlbWVudFtdfSBwb2ludHMgLSB0aGUgcG9pbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBzdGFydCBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIG1heCBpbmRleCAoY2FuIGdvIHBhc3QgY291bnQgb24gYSBsb29wKVxuICogQHBhcmFtIHtib29sZWFufSBsb29wIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhpcyB3b3VsZCBiZSBhIGxvb3AgaWYgbm8gZ2FwcyBhcmUgZm91bmRcbiAqL1xuZnVuY3Rpb24gc29saWRTZWdtZW50cyhwb2ludHMsIHN0YXJ0LCBtYXgsIGxvb3ApIHtcbiAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgbGV0IGxhc3QgPSBzdGFydDtcbiAgbGV0IHByZXYgPSBwb2ludHNbc3RhcnRdO1xuICBsZXQgZW5kO1xuXG4gIGZvciAoZW5kID0gc3RhcnQgKyAxOyBlbmQgPD0gbWF4OyArK2VuZCkge1xuICAgIGNvbnN0IGN1ciA9IHBvaW50c1tlbmQgJSBjb3VudF07XG4gICAgaWYgKGN1ci5za2lwIHx8IGN1ci5zdG9wKSB7XG4gICAgICBpZiAoIXByZXYuc2tpcCkge1xuICAgICAgICBsb29wID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtzdGFydDogc3RhcnQgJSBjb3VudCwgZW5kOiAoZW5kIC0gMSkgJSBjb3VudCwgbG9vcH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0ID0gbGFzdCA9IGN1ci5zdG9wID8gZW5kIDogbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdCA9IGVuZDtcbiAgICAgIGlmIChwcmV2LnNraXApIHtcbiAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHByZXYgPSBjdXI7XG4gIH1cblxuICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgIHJlc3VsdC5wdXNoKHtzdGFydDogc3RhcnQgJSBjb3VudCwgZW5kOiBsYXN0ICUgY291bnQsIGxvb3B9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgY29udGludW91cyBzZWdtZW50cyB0aGF0IGRlZmluZSB0aGUgd2hvbGUgbGluZVxuICogVGhlcmUgY2FuIGJlIHNraXBwZWQgcG9pbnRzIHdpdGhpbiBhIHNlZ21lbnQsIGlmIHNwYW5HYXBzIGlzIHRydWUuXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gW3NlZ21lbnRPcHRpb25zXVxuICogQHJldHVybiB7U2VnbWVudFtdfVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jb21wdXRlU2VnbWVudHMobGluZSwgc2VnbWVudE9wdGlvbnMpIHtcbiAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IHNwYW5HYXBzID0gbGluZS5vcHRpb25zLnNwYW5HYXBzO1xuICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgaWYgKCFjb3VudCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxvb3AgPSAhIWxpbmUuX2xvb3A7XG4gIGNvbnN0IHtzdGFydCwgZW5kfSA9IGZpbmRTdGFydEFuZEVuZChwb2ludHMsIGNvdW50LCBsb29wLCBzcGFuR2Fwcyk7XG5cbiAgaWYgKHNwYW5HYXBzID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHNwbGl0QnlTdHlsZXMobGluZSwgW3tzdGFydCwgZW5kLCBsb29wfV0sIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgbWF4ID0gZW5kIDwgc3RhcnQgPyBlbmQgKyBjb3VudCA6IGVuZDtcbiAgY29uc3QgY29tcGxldGVMb29wID0gISFsaW5lLl9mdWxsTG9vcCAmJiBzdGFydCA9PT0gMCAmJiBlbmQgPT09IGNvdW50IC0gMTtcbiAgcmV0dXJuIHNwbGl0QnlTdHlsZXMobGluZSwgc29saWRTZWdtZW50cyhwb2ludHMsIHN0YXJ0LCBtYXgsIGNvbXBsZXRlTG9vcCksIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U2VnbWVudFtdfSBzZWdtZW50c1xuICogQHBhcmFtIHtQb2ludEVsZW1lbnRbXX0gcG9pbnRzXG4gKiBAcGFyYW0ge29iamVjdH0gW3NlZ21lbnRPcHRpb25zXVxuICogQHJldHVybiB7U2VnbWVudFtdfVxuICovXG5mdW5jdGlvbiBzcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKSB7XG4gIGlmICghc2VnbWVudE9wdGlvbnMgfHwgIXNlZ21lbnRPcHRpb25zLnNldENvbnRleHQgfHwgIXBvaW50cykge1xuICAgIHJldHVybiBzZWdtZW50cztcbiAgfVxuICByZXR1cm4gZG9TcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge1NlZ21lbnRbXX0gc2VnbWVudHNcbiAqIEBwYXJhbSB7UG9pbnRFbGVtZW50W119IHBvaW50c1xuICogQHBhcmFtIHtvYmplY3R9IFtzZWdtZW50T3B0aW9uc11cbiAqIEByZXR1cm4ge1NlZ21lbnRbXX1cbiAqL1xuZnVuY3Rpb24gZG9TcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKSB7XG4gIGNvbnN0IGNoYXJ0Q29udGV4dCA9IGxpbmUuX2NoYXJ0LmdldENvbnRleHQoKTtcbiAgY29uc3QgYmFzZVN0eWxlID0gcmVhZFN0eWxlKGxpbmUub3B0aW9ucyk7XG4gIGNvbnN0IHtfZGF0YXNldEluZGV4OiBkYXRhc2V0SW5kZXgsIG9wdGlvbnM6IHtzcGFuR2Fwc319ID0gbGluZTtcbiAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgbGV0IHByZXZTdHlsZSA9IGJhc2VTdHlsZTtcbiAgbGV0IHN0YXJ0ID0gc2VnbWVudHNbMF0uc3RhcnQ7XG4gIGxldCBpID0gc3RhcnQ7XG5cbiAgZnVuY3Rpb24gYWRkU3R5bGUocywgZSwgbCwgc3QpIHtcbiAgICBjb25zdCBkaXIgPSBzcGFuR2FwcyA/IC0xIDogMTtcbiAgICBpZiAocyA9PT0gZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdHlsZSBjYW4gbm90IHN0YXJ0L2VuZCBvbiBhIHNraXBwZWQgcG9pbnQsIGFkanVzdCBpbmRpY2VzIGFjY29yZGluZ2x5XG4gICAgcyArPSBjb3VudDtcbiAgICB3aGlsZSAocG9pbnRzW3MgJSBjb3VudF0uc2tpcCkge1xuICAgICAgcyAtPSBkaXI7XG4gICAgfVxuICAgIHdoaWxlIChwb2ludHNbZSAlIGNvdW50XS5za2lwKSB7XG4gICAgICBlICs9IGRpcjtcbiAgICB9XG4gICAgaWYgKHMgJSBjb3VudCAhPT0gZSAlIGNvdW50KSB7XG4gICAgICByZXN1bHQucHVzaCh7c3RhcnQ6IHMgJSBjb3VudCwgZW5kOiBlICUgY291bnQsIGxvb3A6IGwsIHN0eWxlOiBzdH0pO1xuICAgICAgcHJldlN0eWxlID0gc3Q7XG4gICAgICBzdGFydCA9IGUgJSBjb3VudDtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBzdGFydCA9IHNwYW5HYXBzID8gc3RhcnQgOiBzZWdtZW50LnN0YXJ0O1xuICAgIGxldCBwcmV2ID0gcG9pbnRzW3N0YXJ0ICUgY291bnRdO1xuICAgIGxldCBzdHlsZTtcbiAgICBmb3IgKGkgPSBzdGFydCArIDE7IGkgPD0gc2VnbWVudC5lbmQ7IGkrKykge1xuICAgICAgY29uc3QgcHQgPSBwb2ludHNbaSAlIGNvdW50XTtcbiAgICAgIHN0eWxlID0gcmVhZFN0eWxlKHNlZ21lbnRPcHRpb25zLnNldENvbnRleHQoY3JlYXRlQ29udGV4dChjaGFydENvbnRleHQsIHtcbiAgICAgICAgdHlwZTogJ3NlZ21lbnQnLFxuICAgICAgICBwMDogcHJldixcbiAgICAgICAgcDE6IHB0LFxuICAgICAgICBwMERhdGFJbmRleDogKGkgLSAxKSAlIGNvdW50LFxuICAgICAgICBwMURhdGFJbmRleDogaSAlIGNvdW50LFxuICAgICAgICBkYXRhc2V0SW5kZXhcbiAgICAgIH0pKSk7XG4gICAgICBpZiAoc3R5bGVDaGFuZ2VkKHN0eWxlLCBwcmV2U3R5bGUpKSB7XG4gICAgICAgIGFkZFN0eWxlKHN0YXJ0LCBpIC0gMSwgc2VnbWVudC5sb29wLCBwcmV2U3R5bGUpO1xuICAgICAgfVxuICAgICAgcHJldiA9IHB0O1xuICAgICAgcHJldlN0eWxlID0gc3R5bGU7XG4gICAgfVxuICAgIGlmIChzdGFydCA8IGkgLSAxKSB7XG4gICAgICBhZGRTdHlsZShzdGFydCwgaSAtIDEsIHNlZ21lbnQubG9vcCwgcHJldlN0eWxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZWFkU3R5bGUob3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgYm9yZGVyQ2FwU3R5bGU6IG9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUsXG4gICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgIGJvcmRlckRhc2hPZmZzZXQ6IG9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCxcbiAgICBib3JkZXJKb2luU3R5bGU6IG9wdGlvbnMuYm9yZGVySm9pblN0eWxlLFxuICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ2hhbmdlZChzdHlsZSwgcHJldlN0eWxlKSB7XG4gIHJldHVybiBwcmV2U3R5bGUgJiYgSlNPTi5zdHJpbmdpZnkoc3R5bGUpICE9PSBKU09OLnN0cmluZ2lmeShwcmV2U3R5bGUpO1xufVxuIiwgImltcG9ydCB7cmVxdWVzdEFuaW1GcmFtZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4vY29yZS5hbmltYXRpb24uanMnKS5kZWZhdWx0IH0gQW5pbWF0aW9uXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqL1xuXG4vKipcbiAqIFBsZWFzZSB1c2UgdGhlIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IHdoaWNoIHByb3ZpZGVzIGEgc2luZ2xldG9uIGluc3RhbmNlXG4gKiBOb3RlOiBjbGFzcyBpcyBleHBvcnQgZm9yIHR5cGVkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIEFuaW1hdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgdGhpcy5fY2hhcnRzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9sYXN0RGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX25vdGlmeShjaGFydCwgYW5pbXMsIGRhdGUsIHR5cGUpIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBhbmltcy5saXN0ZW5lcnNbdHlwZV07XG4gICAgY29uc3QgbnVtU3RlcHMgPSBhbmltcy5kdXJhdGlvbjtcblxuICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZuID0+IGZuKHtcbiAgICAgIGNoYXJ0LFxuICAgICAgaW5pdGlhbDogYW5pbXMuaW5pdGlhbCxcbiAgICAgIG51bVN0ZXBzLFxuICAgICAgY3VycmVudFN0ZXA6IE1hdGgubWluKGRhdGUgLSBhbmltcy5zdGFydCwgbnVtU3RlcHMpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVmcmVzaCgpIHtcbiAgICBpZiAodGhpcy5fcmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuX3JlcXVlc3QgPSByZXF1ZXN0QW5pbUZyYW1lLmNhbGwod2luZG93LCAoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcnVubmluZykge1xuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF91cGRhdGUoZGF0ZSA9IERhdGUubm93KCkpIHtcbiAgICBsZXQgcmVtYWluaW5nID0gMDtcblxuICAgIHRoaXMuX2NoYXJ0cy5mb3JFYWNoKChhbmltcywgY2hhcnQpID0+IHtcbiAgICAgIGlmICghYW5pbXMucnVubmluZyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1zID0gYW5pbXMuaXRlbXM7XG4gICAgICBsZXQgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICBsZXQgZHJhdyA9IGZhbHNlO1xuICAgICAgbGV0IGl0ZW07XG5cbiAgICAgIGZvciAoOyBpID49IDA7IC0taSkge1xuICAgICAgICBpdGVtID0gaXRlbXNbaV07XG5cbiAgICAgICAgaWYgKGl0ZW0uX2FjdGl2ZSkge1xuICAgICAgICAgIGlmIChpdGVtLl90b3RhbCA+IGFuaW1zLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYW5pbWF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGl0cyBkdXJhdGlvbiBwcm9sb25nZWQsXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdG90YWwgZHVyYXRpb24gb2YgY3VycmVudCBhbmltYXRpb25zIHJ1biAoZm9yIHByb2dyZXNzIGV2ZW50KVxuICAgICAgICAgICAgYW5pbXMuZHVyYXRpb24gPSBpdGVtLl90b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXRlbS50aWNrKGRhdGUpO1xuICAgICAgICAgIGRyYXcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBieSByZXBsYWNpbmcgaXQgd2l0aCBsYXN0IGl0ZW0gYW5kIHJlbW92aW5nIHRoZSBsYXN0XG4gICAgICAgICAgLy8gQSBsb3QgZmFzdGVyIHRoYW4gc3BsaWNlLlxuICAgICAgICAgIGl0ZW1zW2ldID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaXRlbXMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRyYXcpIHtcbiAgICAgICAgY2hhcnQuZHJhdygpO1xuICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCAncHJvZ3Jlc3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgYW5pbXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCAnY29tcGxldGUnKTtcbiAgICAgICAgYW5pbXMuaW5pdGlhbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZW1haW5pbmcgKz0gaXRlbXMubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbGFzdERhdGUgPSBkYXRlO1xuXG4gICAgaWYgKHJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldEFuaW1zKGNoYXJ0KSB7XG4gICAgY29uc3QgY2hhcnRzID0gdGhpcy5fY2hhcnRzO1xuICAgIGxldCBhbmltcyA9IGNoYXJ0cy5nZXQoY2hhcnQpO1xuICAgIGlmICghYW5pbXMpIHtcbiAgICAgIGFuaW1zID0ge1xuICAgICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgICAgaW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBjb21wbGV0ZTogW10sXG4gICAgICAgICAgcHJvZ3Jlc3M6IFtdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjaGFydHMuc2V0KGNoYXJ0LCBhbmltcyk7XG4gICAgfVxuICAgIHJldHVybiBhbmltcztcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBldmVudCBuYW1lXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIC0gY2FsbGJhY2tcblx0ICovXG4gIGxpc3RlbihjaGFydCwgZXZlbnQsIGNiKSB7XG4gICAgdGhpcy5fZ2V0QW5pbXMoY2hhcnQpLmxpc3RlbmVyc1tldmVudF0ucHVzaChjYik7XG4gIH1cblxuICAvKipcblx0ICogQWRkIGFuaW1hdGlvbnNcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnRcblx0ICogQHBhcmFtIHtBbmltYXRpb25bXX0gaXRlbXMgLSBhbmltYXRpb25zXG5cdCAqL1xuICBhZGQoY2hhcnQsIGl0ZW1zKSB7XG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2dldEFuaW1zKGNoYXJ0KS5pdGVtcy5wdXNoKC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBDb3VudHMgbnVtYmVyIG9mIGFjdGl2ZSBhbmltYXRpb25zIGZvciB0aGUgY2hhcnRcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnRcblx0ICovXG4gIGhhcyhjaGFydCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBbmltcyhjaGFydCkuaXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBTdGFydCBhbmltYXRpbmcgKGFsbCBjaGFydHMpXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqL1xuICBzdGFydChjaGFydCkge1xuICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgaWYgKCFhbmltcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhbmltcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICBhbmltcy5zdGFydCA9IERhdGUubm93KCk7XG4gICAgYW5pbXMuZHVyYXRpb24gPSBhbmltcy5pdGVtcy5yZWR1Y2UoKGFjYywgY3VyKSA9PiBNYXRoLm1heChhY2MsIGN1ci5fZHVyYXRpb24pLCAwKTtcbiAgICB0aGlzLl9yZWZyZXNoKCk7XG4gIH1cblxuICBydW5uaW5nKGNoYXJ0KSB7XG4gICAgaWYgKCF0aGlzLl9ydW5uaW5nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgaWYgKCFhbmltcyB8fCAhYW5pbXMucnVubmluZyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG5cdCAqIFN0b3AgYWxsIGFuaW1hdGlvbnMgZm9yIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKi9cbiAgc3RvcChjaGFydCkge1xuICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgaWYgKCFhbmltcyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zID0gYW5pbXMuaXRlbXM7XG4gICAgbGV0IGkgPSBpdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgZm9yICg7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBpdGVtc1tpXS5jYW5jZWwoKTtcbiAgICB9XG4gICAgYW5pbXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBEYXRlLm5vdygpLCAnY29tcGxldGUnKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZW1vdmUgY2hhcnQgZnJvbSBBbmltYXRvclxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKi9cbiAgcmVtb3ZlKGNoYXJ0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0cy5kZWxldGUoY2hhcnQpO1xuICB9XG59XG5cbi8vIHNpbmdsZXRvbiBpbnN0YW5jZVxuZXhwb3J0IGRlZmF1bHQgLyogI19fUFVSRV9fICovIG5ldyBBbmltYXRvcigpO1xuIiwgImltcG9ydCBlZmZlY3RzIGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5lYXNpbmcuanMnO1xuaW1wb3J0IHtyZXNvbHZlfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMub3B0aW9ucy5qcyc7XG5pbXBvcnQge2NvbG9yIGFzIGhlbHBlcnNDb2xvcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvbG9yLmpzJztcblxuY29uc3QgdHJhbnNwYXJlbnQgPSAndHJhbnNwYXJlbnQnO1xuY29uc3QgaW50ZXJwb2xhdG9ycyA9IHtcbiAgYm9vbGVhbihmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgcmV0dXJuIGZhY3RvciA+IDAuNSA/IHRvIDogZnJvbTtcbiAgfSxcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b1xuICAgKiBAcGFyYW0ge251bWJlcn0gZmFjdG9yXG4gICAqL1xuICBjb2xvcihmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgY29uc3QgYzAgPSBoZWxwZXJzQ29sb3IoZnJvbSB8fCB0cmFuc3BhcmVudCk7XG4gICAgY29uc3QgYzEgPSBjMC52YWxpZCAmJiBoZWxwZXJzQ29sb3IodG8gfHwgdHJhbnNwYXJlbnQpO1xuICAgIHJldHVybiBjMSAmJiBjMS52YWxpZFxuICAgICAgPyBjMS5taXgoYzAsIGZhY3RvcikuaGV4U3RyaW5nKClcbiAgICAgIDogdG87XG4gIH0sXG4gIG51bWJlcihmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgcmV0dXJuIGZyb20gKyAodG8gLSBmcm9tKSAqIGZhY3RvcjtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5pbWF0aW9uIHtcbiAgY29uc3RydWN0b3IoY2ZnLCB0YXJnZXQsIHByb3AsIHRvKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuXG4gICAgdG8gPSByZXNvbHZlKFtjZmcudG8sIHRvLCBjdXJyZW50VmFsdWUsIGNmZy5mcm9tXSk7XG4gICAgY29uc3QgZnJvbSA9IHJlc29sdmUoW2NmZy5mcm9tLCBjdXJyZW50VmFsdWUsIHRvXSk7XG5cbiAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2ZuID0gY2ZnLmZuIHx8IGludGVycG9sYXRvcnNbY2ZnLnR5cGUgfHwgdHlwZW9mIGZyb21dO1xuICAgIHRoaXMuX2Vhc2luZyA9IGVmZmVjdHNbY2ZnLmVhc2luZ10gfHwgZWZmZWN0cy5saW5lYXI7XG4gICAgdGhpcy5fc3RhcnQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgKyAoY2ZnLmRlbGF5IHx8IDApKTtcbiAgICB0aGlzLl9kdXJhdGlvbiA9IHRoaXMuX3RvdGFsID0gTWF0aC5mbG9vcihjZmcuZHVyYXRpb24pO1xuICAgIHRoaXMuX2xvb3AgPSAhIWNmZy5sb29wO1xuICAgIHRoaXMuX3RhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLl9wcm9wID0gcHJvcDtcbiAgICB0aGlzLl9mcm9tID0gZnJvbTtcbiAgICB0aGlzLl90byA9IHRvO1xuICAgIHRoaXMuX3Byb21pc2VzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICB1cGRhdGUoY2ZnLCB0bywgZGF0ZSkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuX25vdGlmeShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX3RhcmdldFt0aGlzLl9wcm9wXTtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBkYXRlIC0gdGhpcy5fc3RhcnQ7XG4gICAgICBjb25zdCByZW1haW4gPSB0aGlzLl9kdXJhdGlvbiAtIGVsYXBzZWQ7XG4gICAgICB0aGlzLl9zdGFydCA9IGRhdGU7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IE1hdGguZmxvb3IoTWF0aC5tYXgocmVtYWluLCBjZmcuZHVyYXRpb24pKTtcbiAgICAgIHRoaXMuX3RvdGFsICs9IGVsYXBzZWQ7XG4gICAgICB0aGlzLl9sb29wID0gISFjZmcubG9vcDtcbiAgICAgIHRoaXMuX3RvID0gcmVzb2x2ZShbY2ZnLnRvLCB0bywgY3VycmVudFZhbHVlLCBjZmcuZnJvbV0pO1xuICAgICAgdGhpcy5fZnJvbSA9IHJlc29sdmUoW2NmZy5mcm9tLCBjdXJyZW50VmFsdWUsIHRvXSk7XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIC8vIHVwZGF0ZSBjdXJyZW50IGV2YWx1YXRlZCB2YWx1ZSwgZm9yIHNtb290aGVyIGFuaW1hdGlvbnNcbiAgICAgIHRoaXMudGljayhEYXRlLm5vdygpKTtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbm90aWZ5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICB0aWNrKGRhdGUpIHtcbiAgICBjb25zdCBlbGFwc2VkID0gZGF0ZSAtIHRoaXMuX3N0YXJ0O1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuX3Byb3A7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuX2Zyb207XG4gICAgY29uc3QgbG9vcCA9IHRoaXMuX2xvb3A7XG4gICAgY29uc3QgdG8gPSB0aGlzLl90bztcbiAgICBsZXQgZmFjdG9yO1xuXG4gICAgdGhpcy5fYWN0aXZlID0gZnJvbSAhPT0gdG8gJiYgKGxvb3AgfHwgKGVsYXBzZWQgPCBkdXJhdGlvbikpO1xuXG4gICAgaWYgKCF0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuX3RhcmdldFtwcm9wXSA9IHRvO1xuICAgICAgdGhpcy5fbm90aWZ5KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbGFwc2VkIDwgMCkge1xuICAgICAgdGhpcy5fdGFyZ2V0W3Byb3BdID0gZnJvbTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmYWN0b3IgPSAoZWxhcHNlZCAvIGR1cmF0aW9uKSAlIDI7XG4gICAgZmFjdG9yID0gbG9vcCAmJiBmYWN0b3IgPiAxID8gMiAtIGZhY3RvciA6IGZhY3RvcjtcbiAgICBmYWN0b3IgPSB0aGlzLl9lYXNpbmcoTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgZmFjdG9yKSkpO1xuXG4gICAgdGhpcy5fdGFyZ2V0W3Byb3BdID0gdGhpcy5fZm4oZnJvbSwgdG8sIGZhY3Rvcik7XG4gIH1cblxuICB3YWl0KCkge1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5fcHJvbWlzZXMgfHwgKHRoaXMuX3Byb21pc2VzID0gW10pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIHByb21pc2VzLnB1c2goe3JlcywgcmVqfSk7XG4gICAgfSk7XG4gIH1cblxuICBfbm90aWZ5KHJlc29sdmVkKSB7XG4gICAgY29uc3QgbWV0aG9kID0gcmVzb2x2ZWQgPyAncmVzJyA6ICdyZWonO1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5fcHJvbWlzZXMgfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcHJvbWlzZXNbaV1bbWV0aG9kXSgpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBhbmltYXRvciBmcm9tICcuL2NvcmUuYW5pbWF0b3IuanMnO1xuaW1wb3J0IEFuaW1hdGlvbiBmcm9tICcuL2NvcmUuYW5pbWF0aW9uLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2NvcmUuZGVmYXVsdHMuanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbmltYXRpb25zIHtcbiAgY29uc3RydWN0b3IoY2hhcnQsIGNvbmZpZykge1xuICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gICAgdGhpcy5fcHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmNvbmZpZ3VyZShjb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKGNvbmZpZykge1xuICAgIGlmICghaXNPYmplY3QoY29uZmlnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSBPYmplY3Qua2V5cyhkZWZhdWx0cy5hbmltYXRpb24pO1xuICAgIGNvbnN0IGFuaW1hdGVkUHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29uZmlnKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBjb25maWdba2V5XTtcbiAgICAgIGlmICghaXNPYmplY3QoY2ZnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgYW5pbWF0aW9uT3B0aW9ucykge1xuICAgICAgICByZXNvbHZlZFtvcHRpb25dID0gY2ZnW29wdGlvbl07XG4gICAgICB9XG5cbiAgICAgIChpc0FycmF5KGNmZy5wcm9wZXJ0aWVzKSAmJiBjZmcucHJvcGVydGllcyB8fCBba2V5XSkuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcCA9PT0ga2V5IHx8ICFhbmltYXRlZFByb3BzLmhhcyhwcm9wKSkge1xuICAgICAgICAgIGFuaW1hdGVkUHJvcHMuc2V0KHByb3AsIHJlc29sdmVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcblx0ICogVXRpbGl0eSB0byBoYW5kbGUgYW5pbWF0aW9uIG9mIGBvcHRpb25zYC5cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9hbmltYXRlT3B0aW9ucyh0YXJnZXQsIHZhbHVlcykge1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB2YWx1ZXMub3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZVRhcmdldE9wdGlvbnModGFyZ2V0LCBuZXdPcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhvcHRpb25zLCBuZXdPcHRpb25zKTtcbiAgICBpZiAobmV3T3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgICAvLyBHb2luZyB0byBzaGFyZWQgb3B0aW9uczpcbiAgICAgIC8vIEFmdGVyIGFsbCBhbmltYXRpb25zIGFyZSBkb25lLCBhc3NpZ24gdGhlIHNoYXJlZCBvcHRpb25zIG9iamVjdCB0byB0aGUgZWxlbWVudFxuICAgICAgLy8gU28gYW55IG5ldyB1cGRhdGVzIHRvIHRoZSBzaGFyZWQgb3B0aW9ucyBhcmUgb2JzZXJ2ZWRcbiAgICAgIGF3YWl0QWxsKHRhcmdldC5vcHRpb25zLiRhbmltYXRpb25zLCBuZXdPcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFyZ2V0Lm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAvLyByZWplY3RlZCwgbm9vcFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9jcmVhdGVBbmltYXRpb25zKHRhcmdldCwgdmFsdWVzKSB7XG4gICAgY29uc3QgYW5pbWF0ZWRQcm9wcyA9IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgY29uc3QgYW5pbWF0aW9ucyA9IFtdO1xuICAgIGNvbnN0IHJ1bm5pbmcgPSB0YXJnZXQuJGFuaW1hdGlvbnMgfHwgKHRhcmdldC4kYW5pbWF0aW9ucyA9IHt9KTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG4gICAgY29uc3QgZGF0ZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSBwcm9wcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKHByb3AuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wID09PSAnb3B0aW9ucycpIHtcbiAgICAgICAgYW5pbWF0aW9ucy5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKHRhcmdldCwgdmFsdWVzKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbcHJvcF07XG4gICAgICBsZXQgYW5pbWF0aW9uID0gcnVubmluZ1twcm9wXTtcbiAgICAgIGNvbnN0IGNmZyA9IGFuaW1hdGVkUHJvcHMuZ2V0KHByb3ApO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIGlmIChjZmcgJiYgYW5pbWF0aW9uLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXhpc3RpbmcgYWN0aXZlIGFuaW1hdGlvbiwgbGV0J3MgdXBkYXRlIHRoYXRcbiAgICAgICAgICBhbmltYXRpb24udXBkYXRlKGNmZywgdmFsdWUsIGRhdGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjZmcgfHwgIWNmZy5kdXJhdGlvbikge1xuICAgICAgICAvLyBub3QgYW5pbWF0ZWQsIHNldCBkaXJlY3RseSB0byBuZXcgdmFsdWVcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBydW5uaW5nW3Byb3BdID0gYW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbihjZmcsIHRhcmdldCwgcHJvcCwgdmFsdWUpO1xuICAgICAgYW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBhbmltYXRpb25zO1xuICB9XG5cblxuICAvKipcblx0ICogVXBkYXRlIGB0YXJnZXRgIHByb3BlcnRpZXMgdG8gbmV3IHZhbHVlcywgdXNpbmcgY29uZmlndXJlZCBhbmltYXRpb25zXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBvYmplY3QgdG8gdXBkYXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgLSBuZXcgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge2Jvb2xlYW58dW5kZWZpbmVkfSAtIGB0cnVlYCBpZiBhbmltYXRpb25zIHdlcmUgc3RhcnRlZFxuXHQgKiovXG4gIHVwZGF0ZSh0YXJnZXQsIHZhbHVlcykge1xuICAgIGlmICh0aGlzLl9wcm9wZXJ0aWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIE5vdGhpbmcgaXMgYW5pbWF0ZWQsIGp1c3QgYXBwbHkgdGhlIG5ldyB2YWx1ZXMuXG4gICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgdmFsdWVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5fY3JlYXRlQW5pbWF0aW9ucyh0YXJnZXQsIHZhbHVlcyk7XG5cbiAgICBpZiAoYW5pbWF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGFuaW1hdG9yLmFkZCh0aGlzLl9jaGFydCwgYW5pbWF0aW9ucyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXdhaXRBbGwoYW5pbWF0aW9ucywgcHJvcGVydGllcykge1xuICBjb25zdCBydW5uaW5nID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYW5pbSA9IGFuaW1hdGlvbnNba2V5c1tpXV07XG4gICAgaWYgKGFuaW0gJiYgYW5pbS5hY3RpdmUoKSkge1xuICAgICAgcnVubmluZy5wdXNoKGFuaW0ud2FpdCgpKTtcbiAgICB9XG4gIH1cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gUHJvbWlzZS5hbGwocnVubmluZyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUYXJnZXRPcHRpb25zKHRhcmdldCwgbmV3T3B0aW9ucykge1xuICBpZiAoIW5ld09wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG9wdGlvbnMgPSB0YXJnZXQub3B0aW9ucztcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgdGFyZ2V0Lm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAob3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgLy8gR29pbmcgZnJvbSBzaGFyZWQgb3B0aW9ucyB0byBkaXN0aW5jdCBvbmU6XG4gICAgLy8gQ3JlYXRlIG5ldyBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIHRoZSBvbGQgc2hhcmVkIHZhbHVlcyBhbmQgc3RhcnQgdXBkYXRpbmcgdGhhdC5cbiAgICB0YXJnZXQub3B0aW9ucyA9IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7JHNoYXJlZDogZmFsc2UsICRhbmltYXRpb25zOiB7fX0pO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuIiwgImltcG9ydCBBbmltYXRpb25zIGZyb20gJy4vY29yZS5hbmltYXRpb25zLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2NvcmUuZGVmYXVsdHMuanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc0Zpbml0ZSwgaXNPYmplY3QsIHZhbHVlT3JEZWZhdWx0LCByZXNvbHZlT2JqZWN0S2V5LCBkZWZpbmVkfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge2xpc3RlbkFycmF5RXZlbnRzLCB1bmxpc3RlbkFycmF5RXZlbnRzfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQge2NyZWF0ZUNvbnRleHQsIHNpZ259IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4vY29yZS5zY2FsZS5qcycpLmRlZmF1bHQgfSBTY2FsZVxuICovXG5cbmZ1bmN0aW9uIHNjYWxlQ2xpcChzY2FsZSwgYWxsb3dlZE92ZXJmbG93KSB7XG4gIGNvbnN0IG9wdHMgPSBzY2FsZSAmJiBzY2FsZS5vcHRpb25zIHx8IHt9O1xuICBjb25zdCByZXZlcnNlID0gb3B0cy5yZXZlcnNlO1xuICBjb25zdCBtaW4gPSBvcHRzLm1pbiA9PT0gdW5kZWZpbmVkID8gYWxsb3dlZE92ZXJmbG93IDogMDtcbiAgY29uc3QgbWF4ID0gb3B0cy5tYXggPT09IHVuZGVmaW5lZCA/IGFsbG93ZWRPdmVyZmxvdyA6IDA7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHJldmVyc2UgPyBtYXggOiBtaW4sXG4gICAgZW5kOiByZXZlcnNlID8gbWluIDogbWF4XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDbGlwKHhTY2FsZSwgeVNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpIHtcbiAgaWYgKGFsbG93ZWRPdmVyZmxvdyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgeCA9IHNjYWxlQ2xpcCh4U2NhbGUsIGFsbG93ZWRPdmVyZmxvdyk7XG4gIGNvbnN0IHkgPSBzY2FsZUNsaXAoeVNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpO1xuXG4gIHJldHVybiB7XG4gICAgdG9wOiB5LmVuZCxcbiAgICByaWdodDogeC5lbmQsXG4gICAgYm90dG9tOiB5LnN0YXJ0LFxuICAgIGxlZnQ6IHguc3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9DbGlwKHZhbHVlKSB7XG4gIGxldCB0LCByLCBiLCBsO1xuXG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0ID0gdmFsdWUudG9wO1xuICAgIHIgPSB2YWx1ZS5yaWdodDtcbiAgICBiID0gdmFsdWUuYm90dG9tO1xuICAgIGwgPSB2YWx1ZS5sZWZ0O1xuICB9IGVsc2Uge1xuICAgIHQgPSByID0gYiA9IGwgPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiB0LFxuICAgIHJpZ2h0OiByLFxuICAgIGJvdHRvbTogYixcbiAgICBsZWZ0OiBsLFxuICAgIGRpc2FibGVkOiB2YWx1ZSA9PT0gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIGZpbHRlclZpc2libGUpIHtcbiAgY29uc3Qga2V5cyA9IFtdO1xuICBjb25zdCBtZXRhc2V0cyA9IGNoYXJ0Ll9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZmlsdGVyVmlzaWJsZSk7XG4gIGxldCBpLCBpbGVuO1xuXG4gIGZvciAoaSA9IDAsIGlsZW4gPSBtZXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBrZXlzLnB1c2gobWV0YXNldHNbaV0uaW5kZXgpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBhcHBseVN0YWNrKHN0YWNrLCB2YWx1ZSwgZHNJbmRleCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGtleXMgPSBzdGFjay5rZXlzO1xuICBjb25zdCBzaW5nbGVNb2RlID0gb3B0aW9ucy5tb2RlID09PSAnc2luZ2xlJztcbiAgbGV0IGksIGlsZW4sIGRhdGFzZXRJbmRleCwgb3RoZXJWYWx1ZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBkYXRhc2V0SW5kZXggPSAra2V5c1tpXTtcbiAgICBpZiAoZGF0YXNldEluZGV4ID09PSBkc0luZGV4KSB7XG4gICAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb3RoZXJWYWx1ZSA9IHN0YWNrLnZhbHVlc1tkYXRhc2V0SW5kZXhdO1xuICAgIGlmIChpc0Zpbml0ZShvdGhlclZhbHVlKSAmJiAoc2luZ2xlTW9kZSB8fCAodmFsdWUgPT09IDAgfHwgc2lnbih2YWx1ZSkgPT09IHNpZ24ob3RoZXJWYWx1ZSkpKSkge1xuICAgICAgdmFsdWUgKz0gb3RoZXJWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2JqZWN0RGF0YVRvQXJyYXkoZGF0YSkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIGNvbnN0IGFkYXRhID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgbGV0IGksIGlsZW4sIGtleTtcbiAgZm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBhZGF0YVtpXSA9IHtcbiAgICAgIHg6IGtleSxcbiAgICAgIHk6IGRhdGFba2V5XVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGFkYXRhO1xufVxuXG5mdW5jdGlvbiBpc1N0YWNrZWQoc2NhbGUsIG1ldGEpIHtcbiAgY29uc3Qgc3RhY2tlZCA9IHNjYWxlICYmIHNjYWxlLm9wdGlvbnMuc3RhY2tlZDtcbiAgcmV0dXJuIHN0YWNrZWQgfHwgKHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBnZXRTdGFja0tleShpbmRleFNjYWxlLCB2YWx1ZVNjYWxlLCBtZXRhKSB7XG4gIHJldHVybiBgJHtpbmRleFNjYWxlLmlkfS4ke3ZhbHVlU2NhbGUuaWR9LiR7bWV0YS5zdGFjayB8fCBtZXRhLnR5cGV9YDtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlckJvdW5kcyhzY2FsZSkge1xuICBjb25zdCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gc2NhbGUuZ2V0VXNlckJvdW5kcygpO1xuICByZXR1cm4ge1xuICAgIG1pbjogbWluRGVmaW5lZCA/IG1pbiA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcbiAgICBtYXg6IG1heERlZmluZWQgPyBtYXggOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JDcmVhdGVTdGFjayhzdGFja3MsIHN0YWNrS2V5LCBpbmRleFZhbHVlKSB7XG4gIGNvbnN0IHN1YlN0YWNrID0gc3RhY2tzW3N0YWNrS2V5XSB8fCAoc3RhY2tzW3N0YWNrS2V5XSA9IHt9KTtcbiAgcmV0dXJuIHN1YlN0YWNrW2luZGV4VmFsdWVdIHx8IChzdWJTdGFja1tpbmRleFZhbHVlXSA9IHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCBwb3NpdGl2ZSwgdHlwZSkge1xuICBmb3IgKGNvbnN0IG1ldGEgb2YgdlNjYWxlLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHR5cGUpLnJldmVyc2UoKSkge1xuICAgIGNvbnN0IHZhbHVlID0gc3RhY2tbbWV0YS5pbmRleF07XG4gICAgaWYgKChwb3NpdGl2ZSAmJiB2YWx1ZSA+IDApIHx8ICghcG9zaXRpdmUgJiYgdmFsdWUgPCAwKSkge1xuICAgICAgcmV0dXJuIG1ldGEuaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YWNrcyhjb250cm9sbGVyLCBwYXJzZWQpIHtcbiAgY29uc3Qge2NoYXJ0LCBfY2FjaGVkTWV0YTogbWV0YX0gPSBjb250cm9sbGVyO1xuICBjb25zdCBzdGFja3MgPSBjaGFydC5fc3RhY2tzIHx8IChjaGFydC5fc3RhY2tzID0ge30pOyAvLyBtYXAgc3RydWN0dXJlIGlzIHtzdGFja0tleToge2RhdGFzZXRJbmRleDogdmFsdWV9fVxuICBjb25zdCB7aVNjYWxlLCB2U2NhbGUsIGluZGV4OiBkYXRhc2V0SW5kZXh9ID0gbWV0YTtcbiAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgY29uc3Qga2V5ID0gZ2V0U3RhY2tLZXkoaVNjYWxlLCB2U2NhbGUsIG1ldGEpO1xuICBjb25zdCBpbGVuID0gcGFyc2VkLmxlbmd0aDtcbiAgbGV0IHN0YWNrO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY29uc3QgaXRlbSA9IHBhcnNlZFtpXTtcbiAgICBjb25zdCB7W2lBeGlzXTogaW5kZXgsIFt2QXhpc106IHZhbHVlfSA9IGl0ZW07XG4gICAgY29uc3QgaXRlbVN0YWNrcyA9IGl0ZW0uX3N0YWNrcyB8fCAoaXRlbS5fc3RhY2tzID0ge30pO1xuICAgIHN0YWNrID0gaXRlbVN0YWNrc1t2QXhpc10gPSBnZXRPckNyZWF0ZVN0YWNrKHN0YWNrcywga2V5LCBpbmRleCk7XG4gICAgc3RhY2tbZGF0YXNldEluZGV4XSA9IHZhbHVlO1xuXG4gICAgc3RhY2suX3RvcCA9IGdldExhc3RJbmRleEluU3RhY2soc3RhY2ssIHZTY2FsZSwgdHJ1ZSwgbWV0YS50eXBlKTtcbiAgICBzdGFjay5fYm90dG9tID0gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCBmYWxzZSwgbWV0YS50eXBlKTtcblxuICAgIGNvbnN0IHZpc3VhbFZhbHVlcyA9IHN0YWNrLl92aXN1YWxWYWx1ZXMgfHwgKHN0YWNrLl92aXN1YWxWYWx1ZXMgPSB7fSk7XG4gICAgdmlzdWFsVmFsdWVzW2RhdGFzZXRJbmRleF0gPSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsIGF4aXMpIHtcbiAgY29uc3Qgc2NhbGVzID0gY2hhcnQuc2NhbGVzO1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NhbGVzKS5maWx0ZXIoa2V5ID0+IHNjYWxlc1trZXldLmF4aXMgPT09IGF4aXMpLnNoaWZ0KCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGFzZXRDb250ZXh0KHBhcmVudCwgaW5kZXgpIHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LFxuICAgIHtcbiAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICBkYXRhc2V0OiB1bmRlZmluZWQsXG4gICAgICBkYXRhc2V0SW5kZXg6IGluZGV4LFxuICAgICAgaW5kZXgsXG4gICAgICBtb2RlOiAnZGVmYXVsdCcsXG4gICAgICB0eXBlOiAnZGF0YXNldCdcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGFDb250ZXh0KHBhcmVudCwgaW5kZXgsIGVsZW1lbnQpIHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBkYXRhSW5kZXg6IGluZGV4LFxuICAgIHBhcnNlZDogdW5kZWZpbmVkLFxuICAgIHJhdzogdW5kZWZpbmVkLFxuICAgIGVsZW1lbnQsXG4gICAgaW5kZXgsXG4gICAgbW9kZTogJ2RlZmF1bHQnLFxuICAgIHR5cGU6ICdkYXRhJ1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJTdGFja3MobWV0YSwgaXRlbXMpIHtcbiAgLy8gTm90IHVzaW5nIG1ldGEuaW5kZXggaGVyZSwgYmVjYXVzZSBpdCBtaWdodCBiZSBhbHJlYWR5IHVwZGF0ZWQgaWYgdGhlIGRhdGFzZXQgY2hhbmdlZCBsb2NhdGlvblxuICBjb25zdCBkYXRhc2V0SW5kZXggPSBtZXRhLmNvbnRyb2xsZXIuaW5kZXg7XG4gIGNvbnN0IGF4aXMgPSBtZXRhLnZTY2FsZSAmJiBtZXRhLnZTY2FsZS5heGlzO1xuICBpZiAoIWF4aXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpdGVtcyA9IGl0ZW1zIHx8IG1ldGEuX3BhcnNlZDtcbiAgZm9yIChjb25zdCBwYXJzZWQgb2YgaXRlbXMpIHtcbiAgICBjb25zdCBzdGFja3MgPSBwYXJzZWQuX3N0YWNrcztcbiAgICBpZiAoIXN0YWNrcyB8fCBzdGFja3NbYXhpc10gPT09IHVuZGVmaW5lZCB8fCBzdGFja3NbYXhpc11bZGF0YXNldEluZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlbGV0ZSBzdGFja3NbYXhpc11bZGF0YXNldEluZGV4XTtcbiAgICBpZiAoc3RhY2tzW2F4aXNdLl92aXN1YWxWYWx1ZXMgIT09IHVuZGVmaW5lZCAmJiBzdGFja3NbYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBzdGFja3NbYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBpc0RpcmVjdFVwZGF0ZU1vZGUgPSAobW9kZSkgPT4gbW9kZSA9PT0gJ3Jlc2V0JyB8fCBtb2RlID09PSAnbm9uZSc7XG5jb25zdCBjbG9uZUlmTm90U2hhcmVkID0gKGNhY2hlZCwgc2hhcmVkKSA9PiBzaGFyZWQgPyBjYWNoZWQgOiBPYmplY3QuYXNzaWduKHt9LCBjYWNoZWQpO1xuY29uc3QgY3JlYXRlU3RhY2sgPSAoY2FuU3RhY2ssIG1ldGEsIGNoYXJ0KSA9PiBjYW5TdGFjayAmJiAhbWV0YS5oaWRkZW4gJiYgbWV0YS5fc3RhY2tlZFxuICAmJiB7a2V5czogZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIHRydWUpLCB2YWx1ZXM6IG51bGx9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7fTtcblxuICAvKipcbiAgICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGFzZXQgKGUuZy4gQ2hhcnQuZWxlbWVudC5MaW5lRWxlbWVudCkuXG4gICAqL1xuICBzdGF0aWMgZGF0YXNldEVsZW1lbnRUeXBlID0gbnVsbDtcblxuICAvKipcbiAgICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGEgKGUuZy4gQ2hhcnQuZWxlbWVudC5Qb2ludEVsZW1lbnQpLlxuICAgKi9cbiAgc3RhdGljIGRhdGFFbGVtZW50VHlwZSA9IG51bGw7XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkYXRhc2V0SW5kZXhcblx0ICovXG4gIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcbiAgICB0aGlzLmNoYXJ0ID0gY2hhcnQ7XG4gICAgdGhpcy5fY3R4ID0gY2hhcnQuY3R4O1xuICAgIHRoaXMuaW5kZXggPSBkYXRhc2V0SW5kZXg7XG4gICAgdGhpcy5fY2FjaGVkRGF0YU9wdHMgPSB7fTtcbiAgICB0aGlzLl9jYWNoZWRNZXRhID0gdGhpcy5nZXRNZXRhKCk7XG4gICAgdGhpcy5fdHlwZSA9IHRoaXMuX2NhY2hlZE1ldGEudHlwZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtib29sZWFuIHwgb2JqZWN0fSAqL1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9kYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX29iamVjdERhdGEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2hhcmVkT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9kcmF3U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZHJhd0NvdW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IGZhbHNlO1xuICAgIHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zeW5jTGlzdCA9IFtdO1xuICAgIHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlID0gbmV3LnRhcmdldC5kYXRhc2V0RWxlbWVudFR5cGU7XG4gICAgdGhpcy5kYXRhRWxlbWVudFR5cGUgPSBuZXcudGFyZ2V0LmRhdGFFbGVtZW50VHlwZTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuICAgIHRoaXMubGlua1NjYWxlcygpO1xuICAgIG1ldGEuX3N0YWNrZWQgPSBpc1N0YWNrZWQobWV0YS52U2NhbGUsIG1ldGEpO1xuICAgIHRoaXMuYWRkRWxlbWVudHMoKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsbCAmJiAhdGhpcy5jaGFydC5pc1BsdWdpbkVuYWJsZWQoJ2ZpbGxlcicpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJUcmllZCB0byB1c2UgdGhlICdmaWxsJyBvcHRpb24gd2l0aG91dCB0aGUgJ0ZpbGxlcicgcGx1Z2luIGVuYWJsZWQuIFBsZWFzZSBpbXBvcnQgYW5kIHJlZ2lzdGVyIHRoZSAnRmlsbGVyJyBwbHVnaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZGlzYWJsZWQgaW4gdGhlIG9wdGlvbnNcIik7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSW5kZXgoZGF0YXNldEluZGV4KSB7XG4gICAgaWYgKHRoaXMuaW5kZXggIT09IGRhdGFzZXRJbmRleCkge1xuICAgICAgY2xlYXJTdGFja3ModGhpcy5fY2FjaGVkTWV0YSk7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBkYXRhc2V0SW5kZXg7XG4gIH1cblxuICBsaW5rU2NhbGVzKCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cbiAgICBjb25zdCBjaG9vc2VJZCA9IChheGlzLCB4LCB5LCByKSA9PiBheGlzID09PSAneCcgPyB4IDogYXhpcyA9PT0gJ3InID8gciA6IHk7XG5cbiAgICBjb25zdCB4aWQgPSBtZXRhLnhBeGlzSUQgPSB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LnhBeGlzSUQsIGdldEZpcnN0U2NhbGVJZChjaGFydCwgJ3gnKSk7XG4gICAgY29uc3QgeWlkID0gbWV0YS55QXhpc0lEID0gdmFsdWVPckRlZmF1bHQoZGF0YXNldC55QXhpc0lELCBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsICd5JykpO1xuICAgIGNvbnN0IHJpZCA9IG1ldGEuckF4aXNJRCA9IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuckF4aXNJRCwgZ2V0Rmlyc3RTY2FsZUlkKGNoYXJ0LCAncicpKTtcbiAgICBjb25zdCBpbmRleEF4aXMgPSBtZXRhLmluZGV4QXhpcztcbiAgICBjb25zdCBpaWQgPSBtZXRhLmlBeGlzSUQgPSBjaG9vc2VJZChpbmRleEF4aXMsIHhpZCwgeWlkLCByaWQpO1xuICAgIGNvbnN0IHZpZCA9IG1ldGEudkF4aXNJRCA9IGNob29zZUlkKGluZGV4QXhpcywgeWlkLCB4aWQsIHJpZCk7XG4gICAgbWV0YS54U2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoeGlkKTtcbiAgICBtZXRhLnlTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh5aWQpO1xuICAgIG1ldGEuclNjYWxlID0gdGhpcy5nZXRTY2FsZUZvcklkKHJpZCk7XG4gICAgbWV0YS5pU2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoaWlkKTtcbiAgICBtZXRhLnZTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh2aWQpO1xuICB9XG5cbiAgZ2V0RGF0YXNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3RoaXMuaW5kZXhdO1xuICB9XG5cbiAgZ2V0TWV0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0aGlzLmluZGV4KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2NhbGVJRFxuXHQgKiBAcmV0dXJuIHtTY2FsZX1cblx0ICovXG4gIGdldFNjYWxlRm9ySWQoc2NhbGVJRCkge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LnNjYWxlc1tzY2FsZUlEXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldE90aGVyU2NhbGUoc2NhbGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICByZXR1cm4gc2NhbGUgPT09IG1ldGEuaVNjYWxlXG4gICAgICA/IG1ldGEudlNjYWxlXG4gICAgICA6IG1ldGEuaVNjYWxlO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fdXBkYXRlKCdyZXNldCcpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZGVzdHJveSgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgdW5saXN0ZW5BcnJheUV2ZW50cyh0aGlzLl9kYXRhLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKG1ldGEuX3N0YWNrZWQpIHtcbiAgICAgIGNsZWFyU3RhY2tzKG1ldGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2RhdGFDaGVjaygpIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IGRhdGFzZXQuZGF0YSB8fCAoZGF0YXNldC5kYXRhID0gW10pO1xuICAgIGNvbnN0IF9kYXRhID0gdGhpcy5fZGF0YTtcblxuICAgIC8vIEluIG9yZGVyIHRvIGNvcnJlY3RseSBoYW5kbGUgZGF0YSBhZGRpdGlvbi9kZWxldGlvbiBhbmltYXRpb24gKGFuIHRodXMgc2ltdWxhdGVcbiAgICAvLyByZWFsLXRpbWUgY2hhcnRzKSwgd2UgbmVlZCB0byBtb25pdG9yIHRoZXNlIGRhdGEgbW9kaWZpY2F0aW9ucyBhbmQgc3luY2hyb25pemVcbiAgICAvLyB0aGUgaW50ZXJuYWwgbWV0YSBkYXRhIGFjY29yZGluZ2x5LlxuXG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gY29udmVydE9iamVjdERhdGFUb0FycmF5KGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoX2RhdGEgIT09IGRhdGEpIHtcbiAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAvLyBUaGlzIGNhc2UgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHJlcGxhY2VkIHRoZSBkYXRhIGFycmF5IGluc3RhbmNlLlxuICAgICAgICB1bmxpc3RlbkFycmF5RXZlbnRzKF9kYXRhLCB0aGlzKTtcbiAgICAgICAgLy8gRGlzY2FyZCBvbGQgcGFyc2VkIGRhdGEgYW5kIHN0YWNrc1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY2xlYXJTdGFja3MobWV0YSk7XG4gICAgICAgIG1ldGEuX3BhcnNlZCA9IFtdO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShkYXRhKSkge1xuICAgICAgICBsaXN0ZW5BcnJheUV2ZW50cyhkYXRhLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG4gICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB9XG4gIH1cblxuICBhZGRFbGVtZW50cygpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcblxuICAgIHRoaXMuX2RhdGFDaGVjaygpO1xuXG4gICAgaWYgKHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICBtZXRhLmRhdGFzZXQgPSBuZXcgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUoKTtcbiAgICB9XG4gIH1cblxuICBidWlsZE9yVXBkYXRlRWxlbWVudHMocmVzZXROZXdFbGVtZW50cykge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcbiAgICBsZXQgc3RhY2tDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9kYXRhQ2hlY2soKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBjYWNoZWQgX3N0YWNrZWQgc3RhdHVzIGlzIGN1cnJlbnRcbiAgICBjb25zdCBvbGRTdGFja2VkID0gbWV0YS5fc3RhY2tlZDtcbiAgICBtZXRhLl9zdGFja2VkID0gaXNTdGFja2VkKG1ldGEudlNjYWxlLCBtZXRhKTtcblxuICAgIC8vIGRldGVjdCBjaGFuZ2UgaW4gc3RhY2sgb3B0aW9uXG4gICAgaWYgKG1ldGEuc3RhY2sgIT09IGRhdGFzZXQuc3RhY2spIHtcbiAgICAgIHN0YWNrQ2hhbmdlZCA9IHRydWU7XG4gICAgICAvLyByZW1vdmUgdmFsdWVzIGZyb20gb2xkIHN0YWNrXG4gICAgICBjbGVhclN0YWNrcyhtZXRhKTtcbiAgICAgIG1ldGEuc3RhY2sgPSBkYXRhc2V0LnN0YWNrO1xuICAgIH1cblxuICAgIC8vIFJlLXN5bmMgbWV0YSBkYXRhIGluIGNhc2UgdGhlIHVzZXIgcmVwbGFjZWQgdGhlIGRhdGEgYXJyYXkgb3IgaWYgd2UgbWlzc2VkXG4gICAgLy8gYW55IHVwZGF0ZXMgYW5kIHNvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhbmRsZSBudW1iZXIgb2YgZGF0YXBvaW50cyBjaGFuZ2luZy5cbiAgICB0aGlzLl9yZXN5bmNFbGVtZW50cyhyZXNldE5ld0VsZW1lbnRzKTtcblxuICAgIC8vIGlmIHN0YWNrIGNoYW5nZWQsIHVwZGF0ZSBzdGFjayB2YWx1ZXMgZm9yIHRoZSB3aG9sZSBkYXRhc2V0XG4gICAgaWYgKHN0YWNrQ2hhbmdlZCB8fCBvbGRTdGFja2VkICE9PSBtZXRhLl9zdGFja2VkKSB7XG4gICAgICB1cGRhdGVTdGFja3ModGhpcywgbWV0YS5fcGFyc2VkKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogTWVyZ2VzIHVzZXItc3VwcGxpZWQgYW5kIGRlZmF1bHQgZGF0YXNldC1sZXZlbCBvcHRpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBjb25maWd1cmUoKSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jaGFydC5jb25maWc7XG4gICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRTY29wZUtleXModGhpcy5fdHlwZSk7XG4gICAgY29uc3Qgc2NvcGVzID0gY29uZmlnLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSwgc2NvcGVLZXlzLCB0cnVlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCB0aGlzLmdldENvbnRleHQoKSk7XG4gICAgdGhpcy5fcGFyc2luZyA9IHRoaXMub3B0aW9ucy5wYXJzaW5nO1xuICAgIHRoaXMuX2NhY2hlZERhdGFPcHRzID0ge307XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudFxuXHQgKi9cbiAgcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3Qge19jYWNoZWRNZXRhOiBtZXRhLCBfZGF0YTogZGF0YX0gPSB0aGlzO1xuICAgIGNvbnN0IHtpU2NhbGUsIF9zdGFja2VkfSA9IG1ldGE7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcblxuICAgIGxldCBzb3J0ZWQgPSBzdGFydCA9PT0gMCAmJiBjb3VudCA9PT0gZGF0YS5sZW5ndGggPyB0cnVlIDogbWV0YS5fc29ydGVkO1xuICAgIGxldCBwcmV2ID0gc3RhcnQgPiAwICYmIG1ldGEuX3BhcnNlZFtzdGFydCAtIDFdO1xuICAgIGxldCBpLCBjdXIsIHBhcnNlZDtcblxuICAgIGlmICh0aGlzLl9wYXJzaW5nID09PSBmYWxzZSkge1xuICAgICAgbWV0YS5fcGFyc2VkID0gZGF0YTtcbiAgICAgIG1ldGEuX3NvcnRlZCA9IHRydWU7XG4gICAgICBwYXJzZWQgPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNBcnJheShkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5wYXJzZUFycmF5RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5wYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZCA9IHRoaXMucGFyc2VQcmltaXRpdmVEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTm90SW5PcmRlckNvbXBhcmVkVG9QcmV2ID0gKCkgPT4gY3VyW2lBeGlzXSA9PT0gbnVsbCB8fCAocHJldiAmJiBjdXJbaUF4aXNdIDwgcHJldltpQXhpc10pO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgbWV0YS5fcGFyc2VkW2kgKyBzdGFydF0gPSBjdXIgPSBwYXJzZWRbaV07XG4gICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICBpZiAoaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYoKSkge1xuICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXYgPSBjdXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1ldGEuX3NvcnRlZCA9IHNvcnRlZDtcbiAgICB9XG5cbiAgICBpZiAoX3N0YWNrZWQpIHtcbiAgICAgIHVwZGF0ZVN0YWNrcyh0aGlzLCBwYXJzZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBwcmltaXRpdmUgdmFsdWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhIC0gZGF0YXNldCBtZXRhXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGRhdGEgLSBkYXRhIGFycmF5LiBFeGFtcGxlIFsxLDMsNF1cblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gc3RhcnQgaW5kZXhcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gbnVtYmVyIG9mIGl0ZW1zIHRvIHBhcnNlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IHBhcnNlZCBpdGVtIC0gaXRlbSBjb250YWluaW5nIGluZGV4IGFuZCBhIHBhcnNlZCB2YWx1ZVxuXHQgKiBmb3IgZWFjaCBzY2FsZSBpZC5cblx0ICogRXhhbXBsZToge3hTY2FsZTA6IDAsIHlTY2FsZTA6IDF9XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCB7aVNjYWxlLCB2U2NhbGV9ID0gbWV0YTtcbiAgICBjb25zdCBpQXhpcyA9IGlTY2FsZS5heGlzO1xuICAgIGNvbnN0IHZBeGlzID0gdlNjYWxlLmF4aXM7XG4gICAgY29uc3QgbGFiZWxzID0gaVNjYWxlLmdldExhYmVscygpO1xuICAgIGNvbnN0IHNpbmdsZVNjYWxlID0gaVNjYWxlID09PSB2U2NhbGU7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICBsZXQgaSwgaWxlbiwgaW5kZXg7XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICBbaUF4aXNdOiBzaW5nbGVTY2FsZSB8fCBpU2NhbGUucGFyc2UobGFiZWxzW2luZGV4XSwgaW5kZXgpLFxuICAgICAgICBbdkF4aXNdOiB2U2NhbGUucGFyc2UoZGF0YVtpbmRleF0sIGluZGV4KVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBhcnJheXNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1ldGEgLSBkYXRhc2V0IG1ldGFcblx0ICogQHBhcmFtIHthcnJheX0gZGF0YSAtIGRhdGEgYXJyYXkuIEV4YW1wbGUgW1sxLDJdLFszLDRdXVxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBzdGFydCBpbmRleFxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBudW1iZXIgb2YgaXRlbXMgdG8gcGFyc2Vcblx0ICogQHJldHVybnMge29iamVjdH0gcGFyc2VkIGl0ZW0gLSBpdGVtIGNvbnRhaW5pbmcgaW5kZXggYW5kIGEgcGFyc2VkIHZhbHVlXG5cdCAqIGZvciBlYWNoIHNjYWxlIGlkLlxuXHQgKiBFeGFtcGxlOiB7eDogMCwgeTogMX1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3Qge3hTY2FsZSwgeVNjYWxlfSA9IG1ldGE7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICBsZXQgaSwgaWxlbiwgaW5kZXgsIGl0ZW07XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgaXRlbSA9IGRhdGFbaW5kZXhdO1xuICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICB4OiB4U2NhbGUucGFyc2UoaXRlbVswXSwgaW5kZXgpLFxuICAgICAgICB5OiB5U2NhbGUucGFyc2UoaXRlbVsxXSwgaW5kZXgpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG5cdCAqIFBhcnNlIGFycmF5IG9mIG9iamVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1ldGEgLSBkYXRhc2V0IG1ldGFcblx0ICogQHBhcmFtIHthcnJheX0gZGF0YSAtIGRhdGEgYXJyYXkuIEV4YW1wbGUgW3t4OjEsIHk6NX0sIHt4OjIsIHk6MTB9XVxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBzdGFydCBpbmRleFxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBudW1iZXIgb2YgaXRlbXMgdG8gcGFyc2Vcblx0ICogQHJldHVybnMge29iamVjdH0gcGFyc2VkIGl0ZW0gLSBpdGVtIGNvbnRhaW5pbmcgaW5kZXggYW5kIGEgcGFyc2VkIHZhbHVlXG5cdCAqIGZvciBlYWNoIHNjYWxlIGlkLiBfY3VzdG9tIGlzIG9wdGlvbmFsXG5cdCAqIEV4YW1wbGU6IHt4U2NhbGUwOiAwLCB5U2NhbGUwOiAxLCBfY3VzdG9tOiB7cjogMTAsIGZvbzogJ2Jhcid9fVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3Qge3hTY2FsZSwgeVNjYWxlfSA9IG1ldGE7XG4gICAgY29uc3Qge3hBeGlzS2V5ID0gJ3gnLCB5QXhpc0tleSA9ICd5J30gPSB0aGlzLl9wYXJzaW5nO1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgbGV0IGksIGlsZW4sIGluZGV4LCBpdGVtO1xuXG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICAgIGl0ZW0gPSBkYXRhW2luZGV4XTtcbiAgICAgIHBhcnNlZFtpXSA9IHtcbiAgICAgICAgeDogeFNjYWxlLnBhcnNlKHJlc29sdmVPYmplY3RLZXkoaXRlbSwgeEF4aXNLZXkpLCBpbmRleCksXG4gICAgICAgIHk6IHlTY2FsZS5wYXJzZShyZXNvbHZlT2JqZWN0S2V5KGl0ZW0sIHlBeGlzS2V5KSwgaW5kZXgpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldFBhcnNlZChpbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRNZXRhLl9wYXJzZWRbaW5kZXhdO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldERhdGFFbGVtZW50KGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgYXBwbHlTdGFjayhzY2FsZSwgcGFyc2VkLCBtb2RlKSB7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3NjYWxlLmF4aXNdO1xuICAgIGNvbnN0IHN0YWNrID0ge1xuICAgICAga2V5czogZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIHRydWUpLFxuICAgICAgdmFsdWVzOiBwYXJzZWQuX3N0YWNrc1tzY2FsZS5heGlzXS5fdmlzdWFsVmFsdWVzXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHlTdGFjayhzdGFjaywgdmFsdWUsIG1ldGEuaW5kZXgsIHttb2RlfSk7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgdXBkYXRlUmFuZ2VGcm9tUGFyc2VkKHJhbmdlLCBzY2FsZSwgcGFyc2VkLCBzdGFjaykge1xuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VkW3NjYWxlLmF4aXNdO1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlZFZhbHVlID09PSBudWxsID8gTmFOIDogcGFyc2VkVmFsdWU7XG4gICAgY29uc3QgdmFsdWVzID0gc3RhY2sgJiYgcGFyc2VkLl9zdGFja3Nbc2NhbGUuYXhpc107XG4gICAgaWYgKHN0YWNrICYmIHZhbHVlcykge1xuICAgICAgc3RhY2sudmFsdWVzID0gdmFsdWVzO1xuICAgICAgdmFsdWUgPSBhcHBseVN0YWNrKHN0YWNrLCBwYXJzZWRWYWx1ZSwgdGhpcy5fY2FjaGVkTWV0YS5pbmRleCk7XG4gICAgfVxuICAgIHJhbmdlLm1pbiA9IE1hdGgubWluKHJhbmdlLm1pbiwgdmFsdWUpO1xuICAgIHJhbmdlLm1heCA9IE1hdGgubWF4KHJhbmdlLm1heCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldE1pbk1heChzY2FsZSwgY2FuU3RhY2spIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBfcGFyc2VkID0gbWV0YS5fcGFyc2VkO1xuICAgIGNvbnN0IHNvcnRlZCA9IG1ldGEuX3NvcnRlZCAmJiBzY2FsZSA9PT0gbWV0YS5pU2NhbGU7XG4gICAgY29uc3QgaWxlbiA9IF9wYXJzZWQubGVuZ3RoO1xuICAgIGNvbnN0IG90aGVyU2NhbGUgPSB0aGlzLl9nZXRPdGhlclNjYWxlKHNjYWxlKTtcbiAgICBjb25zdCBzdGFjayA9IGNyZWF0ZVN0YWNrKGNhblN0YWNrLCBtZXRhLCB0aGlzLmNoYXJ0KTtcbiAgICBjb25zdCByYW5nZSA9IHttaW46IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgbWF4OiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl9O1xuICAgIGNvbnN0IHttaW46IG90aGVyTWluLCBtYXg6IG90aGVyTWF4fSA9IGdldFVzZXJCb3VuZHMob3RoZXJTY2FsZSk7XG4gICAgbGV0IGksIHBhcnNlZDtcblxuICAgIGZ1bmN0aW9uIF9za2lwKCkge1xuICAgICAgcGFyc2VkID0gX3BhcnNlZFtpXTtcbiAgICAgIGNvbnN0IG90aGVyVmFsdWUgPSBwYXJzZWRbb3RoZXJTY2FsZS5heGlzXTtcbiAgICAgIHJldHVybiAhaXNGaW5pdGUocGFyc2VkW3NjYWxlLmF4aXNdKSB8fCBvdGhlck1pbiA+IG90aGVyVmFsdWUgfHwgb3RoZXJNYXggPCBvdGhlclZhbHVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGlmIChfc2tpcCgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKTtcbiAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgLy8gaWYgdGhlIGRhdGEgaXMgc29ydGVkLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgZnJvbSB0aGlzIGVuZCBvZiBhcnJheVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNvcnRlZCkge1xuICAgICAgLy8gaW4gdGhlIHNvcnRlZCBjYXNlLCBmaW5kIGZpcnN0IG5vbi1za2lwcGVkIHZhbHVlIGZyb20gb3RoZXIgZW5kIG9mIGFycmF5XG4gICAgICBmb3IgKGkgPSBpbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKF9za2lwKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgZ2V0QWxsUGFyc2VkVmFsdWVzKHNjYWxlKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGxldCBpLCBpbGVuLCB2YWx1ZTtcblxuICAgIGZvciAoaSA9IDAsIGlsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlZFtpXVtzY2FsZS5heGlzXTtcbiAgICAgIGlmIChpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge251bWJlcnxib29sZWFufVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGlTY2FsZSA9IG1ldGEuaVNjYWxlO1xuICAgIGNvbnN0IHZTY2FsZSA9IG1ldGEudlNjYWxlO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGlTY2FsZSA/ICcnICsgaVNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkW2lTY2FsZS5heGlzXSkgOiAnJyxcbiAgICAgIHZhbHVlOiB2U2NhbGUgPyAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pIDogJydcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICB0aGlzLnVwZGF0ZShtb2RlIHx8ICdkZWZhdWx0Jyk7XG4gICAgbWV0YS5fY2xpcCA9IHRvQ2xpcCh2YWx1ZU9yRGVmYXVsdCh0aGlzLm9wdGlvbnMuY2xpcCwgZGVmYXVsdENsaXAobWV0YS54U2NhbGUsIG1ldGEueVNjYWxlLCB0aGlzLmdldE1heE92ZXJmbG93KCkpKSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1vZGVcblx0ICovXG4gIHVwZGF0ZShtb2RlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgZHJhdygpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLl9jdHg7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuICAgIGNvbnN0IGFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgY29uc3QgYWN0aXZlID0gW107XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9kcmF3U3RhcnQgfHwgMDtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RyYXdDb3VudCB8fCAoZWxlbWVudHMubGVuZ3RoIC0gc3RhcnQpO1xuICAgIGNvbnN0IGRyYXdBY3RpdmVFbGVtZW50c09uVG9wID0gdGhpcy5vcHRpb25zLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wO1xuICAgIGxldCBpO1xuXG4gICAgaWYgKG1ldGEuZGF0YXNldCkge1xuICAgICAgbWV0YS5kYXRhc2V0LmRyYXcoY3R4LCBhcmVhLCBzdGFydCwgY291bnQpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWxlbWVudC5oaWRkZW4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZWxlbWVudC5hY3RpdmUgJiYgZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3ApIHtcbiAgICAgICAgYWN0aXZlLnB1c2goZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmRyYXcoY3R4LCBhcmVhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgKytpKSB7XG4gICAgICBhY3RpdmVbaV0uZHJhdyhjdHgsIGFyZWEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIGEgc2V0IG9mIHByZWRlZmluZWQgc3R5bGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGF0YXNldFxuXHQgKiBvciB0aGUgZGF0YSBpZiB0aGUgaW5kZXggaXMgc3BlY2lmaWVkXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGRhdGEgaW5kZXhcblx0ICogQHBhcmFtIHtib29sZWFufSBbYWN0aXZlXSAtIHRydWUgaWYgaG92ZXJcblx0ICogQHJldHVybiB7b2JqZWN0fSBzdHlsZSBvYmplY3Rcblx0ICovXG4gIGdldFN0eWxlKGluZGV4LCBhY3RpdmUpIHtcbiAgICBjb25zdCBtb2RlID0gYWN0aXZlID8gJ2FjdGl2ZScgOiAnZGVmYXVsdCc7XG4gICAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgJiYgdGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0XG4gICAgICA/IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKVxuICAgICAgOiB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXggfHwgMCwgbW9kZSk7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCBtb2RlKSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuICAgIGxldCBjb250ZXh0O1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gICAgICBjb250ZXh0ID0gZWxlbWVudC4kY29udGV4dCB8fFxuICAgICAgICAoZWxlbWVudC4kY29udGV4dCA9IGNyZWF0ZURhdGFDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpLCBpbmRleCwgZWxlbWVudCkpO1xuICAgICAgY29udGV4dC5wYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpbmRleCk7XG4gICAgICBjb250ZXh0LnJhdyA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG4gICAgICBjb250ZXh0LmluZGV4ID0gY29udGV4dC5kYXRhSW5kZXggPSBpbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IHRoaXMuJGNvbnRleHQgfHxcbiAgICAgICAgKHRoaXMuJGNvbnRleHQgPSBjcmVhdGVEYXRhc2V0Q29udGV4dCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSwgdGhpcy5pbmRleCkpO1xuICAgICAgY29udGV4dC5kYXRhc2V0ID0gZGF0YXNldDtcbiAgICAgIGNvbnRleHQuaW5kZXggPSBjb250ZXh0LmRhdGFzZXRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgY29udGV4dC5hY3RpdmUgPSAhIWFjdGl2ZTtcbiAgICBjb250ZXh0Lm1vZGUgPSBtb2RlO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCwgbW9kZSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCwgbW9kZSkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlRWxlbWVudE9wdGlvbnModGhpcy5kYXRhRWxlbWVudFR5cGUuaWQsIG1vZGUsIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3Jlc29sdmVFbGVtZW50T3B0aW9ucyhlbGVtZW50VHlwZSwgbW9kZSA9ICdkZWZhdWx0JywgaW5kZXgpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBtb2RlID09PSAnYWN0aXZlJztcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlZERhdGFPcHRzO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gZWxlbWVudFR5cGUgKyAnLScgKyBtb2RlO1xuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICBjb25zdCBzaGFyaW5nID0gdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nICYmIGRlZmluZWQoaW5kZXgpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjbG9uZUlmTm90U2hhcmVkKGNhY2hlZCwgc2hhcmluZyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY2hhcnQuY29uZmlnO1xuICAgIGNvbnN0IHNjb3BlS2V5cyA9IGNvbmZpZy5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLCBlbGVtZW50VHlwZSk7XG4gICAgY29uc3QgcHJlZml4ZXMgPSBhY3RpdmUgPyBbYCR7ZWxlbWVudFR5cGV9SG92ZXJgLCAnaG92ZXInLCBlbGVtZW50VHlwZSwgJyddIDogW2VsZW1lbnRUeXBlLCAnJ107XG4gICAgY29uc3Qgc2NvcGVzID0gY29uZmlnLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSwgc2NvcGVLZXlzKTtcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGRlZmF1bHRzLmVsZW1lbnRzW2VsZW1lbnRUeXBlXSk7XG4gICAgLy8gY29udGV4dCBpcyBwcm92aWRlZCBhcyBhIGZ1bmN0aW9uLCBhbmQgaXMgY2FsbGVkIG9ubHkgaWYgbmVlZGVkLFxuICAgIC8vIHNvIHdlIGRvbid0IGNyZWF0ZSBhIGNvbnRleHQgZm9yIGVhY2ggZWxlbWVudCBpZiBub3QgbmVlZGVkLlxuICAgIGNvbnN0IGNvbnRleHQgPSAoKSA9PiB0aGlzLmdldENvbnRleHQoaW5kZXgsIGFjdGl2ZSwgbW9kZSk7XG4gICAgY29uc3QgdmFsdWVzID0gY29uZmlnLnJlc29sdmVOYW1lZE9wdGlvbnMoc2NvcGVzLCBuYW1lcywgY29udGV4dCwgcHJlZml4ZXMpO1xuXG4gICAgaWYgKHZhbHVlcy4kc2hhcmVkKSB7XG4gICAgICAvLyBgJHNoYXJlZGAgaW5kaWNhdGVzIHRoaXMgc2V0IG9mIG9wdGlvbnMgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGVsZW1lbnRzLlxuICAgICAgLy8gU2hhcmluZyBpcyB1c2VkIHRvIHJlZHVjZSBudW1iZXIgb2YgcHJvcGVydGllcyB0byBjaGFuZ2UgZHVyaW5nIGFuaW1hdGlvbi5cbiAgICAgIHZhbHVlcy4kc2hhcmVkID0gc2hhcmluZztcblxuICAgICAgLy8gV2UgY2FjaGUgb3B0aW9ucyBieSBgbW9kZWAsIHdoaWNoIGNhbiBiZSAnYWN0aXZlJyBmb3IgZXhhbXBsZS4gVGhpcyBlbmFibGVzIHVzXG4gICAgICAvLyB0byBoYXZlIHRoZSAnYWN0aXZlJyBlbGVtZW50IG9wdGlvbnMgYW5kICdkZWZhdWx0JyBvcHRpb25zIHRvIHN3aXRjaCBiZXR3ZWVuXG4gICAgICAvLyB3aGVuIGludGVyYWN0aW5nLlxuICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShjbG9uZUlmTm90U2hhcmVkKHZhbHVlcywgc2hhcmluZykpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCB0cmFuc2l0aW9uLCBhY3RpdmUpIHtcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZWREYXRhT3B0cztcbiAgICBjb25zdCBjYWNoZUtleSA9IGBhbmltYXRpb24tJHt0cmFuc2l0aW9ufWA7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGVbY2FjaGVLZXldO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGxldCBvcHRpb25zO1xuICAgIGlmIChjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY2hhcnQuY29uZmlnO1xuICAgICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRBbmltYXRpb25TY29wZUtleXModGhpcy5fdHlwZSwgdHJhbnNpdGlvbik7XG4gICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMpO1xuICAgICAgb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIHRoaXMuZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCB0cmFuc2l0aW9uKSk7XG4gICAgfVxuICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBuZXcgQW5pbWF0aW9ucyhjaGFydCwgb3B0aW9ucyAmJiBvcHRpb25zLmFuaW1hdGlvbnMpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2NhY2hlYWJsZSkge1xuICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShhbmltYXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gIH1cblxuICAvKipcblx0ICogVXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgb3B0aW9ucyBvYmplY3Qgc2hhcmVkIGJldHdlZW4gZWxlbWVudHNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0U2hhcmVkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLiRzaGFyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnMgfHwgKHRoaXMuX3NoYXJlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSk7XG4gIH1cblxuICAvKipcblx0ICogVXRpbGl0eSBmb3IgZGV0ZXJtaW5pbmcgaWYgYG9wdGlvbnNgIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdXBkYXRlZCBwcm9wZXJ0aWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGluY2x1ZGVPcHRpb25zKG1vZGUsIHNoYXJlZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gIXNoYXJlZE9wdGlvbnMgfHwgaXNEaXJlY3RVcGRhdGVNb2RlKG1vZGUpIHx8IHRoaXMuY2hhcnQuX2FuaW1hdGlvbnNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyB2NCwgcmVuYW1lIHRvIGdldFNoYXJlZE9wdGlvbnMgYW5kIHJlbW92ZSBleGNlc3MgZnVuY3Rpb25zXG4gICAqL1xuICBfZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSkge1xuICAgIGNvbnN0IGZpcnN0T3B0cyA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgY29uc3QgcHJldmlvdXNseVNoYXJlZE9wdGlvbnMgPSB0aGlzLl9zaGFyZWRPcHRpb25zO1xuICAgIGNvbnN0IHNoYXJlZE9wdGlvbnMgPSB0aGlzLmdldFNoYXJlZE9wdGlvbnMoZmlyc3RPcHRzKTtcbiAgICBjb25zdCBpbmNsdWRlT3B0aW9ucyA9IHRoaXMuaW5jbHVkZU9wdGlvbnMobW9kZSwgc2hhcmVkT3B0aW9ucykgfHwgKHNoYXJlZE9wdGlvbnMgIT09IHByZXZpb3VzbHlTaGFyZWRPcHRpb25zKTtcbiAgICB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMoc2hhcmVkT3B0aW9ucywgbW9kZSwgZmlyc3RPcHRzKTtcbiAgICByZXR1cm4ge3NoYXJlZE9wdGlvbnMsIGluY2x1ZGVPcHRpb25zfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVdGlsaXR5IGZvciB1cGRhdGluZyBhbiBlbGVtZW50IHdpdGggbmV3IHByb3BlcnRpZXMsIHVzaW5nIGFuaW1hdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgdXBkYXRlRWxlbWVudChlbGVtZW50LCBpbmRleCwgcHJvcGVydGllcywgbW9kZSkge1xuICAgIGlmIChpc0RpcmVjdFVwZGF0ZU1vZGUobW9kZSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCBtb2RlKS51cGRhdGUoZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIFV0aWxpdHkgdG8gYW5pbWF0ZSB0aGUgc2hhcmVkIG9wdGlvbnMsIHRoYXQgYXJlIHBvdGVudGlhbGx5IGFmZmVjdGluZyBtdWx0aXBsZSBlbGVtZW50cy5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgdXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBuZXdPcHRpb25zKSB7XG4gICAgaWYgKHNoYXJlZE9wdGlvbnMgJiYgIWlzRGlyZWN0VXBkYXRlTW9kZShtb2RlKSkge1xuICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModW5kZWZpbmVkLCBtb2RlKS51cGRhdGUoc2hhcmVkT3B0aW9ucywgbmV3T3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfc2V0U3R5bGUoZWxlbWVudCwgaW5kZXgsIG1vZGUsIGFjdGl2ZSkge1xuICAgIGVsZW1lbnQuYWN0aXZlID0gYWN0aXZlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldFN0eWxlKGluZGV4LCBhY3RpdmUpO1xuICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCBtb2RlLCBhY3RpdmUpLnVwZGF0ZShlbGVtZW50LCB7XG4gICAgICAvLyBXaGVuIGdvaW5nIGZyb20gYWN0aXZlIHRvIGluYWN0aXZlLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0byB0aGUgc2hhcmVkIG9wdGlvbnMuXG4gICAgICAvLyBUaGlzIHdheSB0aGUgb25jZSBob3ZlcmVkIGVsZW1lbnQgd2lsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzaGFyZWQgb3B0aW9ucyBpbnN0YW5jZSwgYWZ0ZXIgYW5pbWF0aW9uLlxuICAgICAgb3B0aW9uczogKCFhY3RpdmUgJiYgdGhpcy5nZXRTaGFyZWRPcHRpb25zKG9wdGlvbnMpKSB8fCBvcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVIb3ZlclN0eWxlKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICB0aGlzLl9zZXRTdHlsZShlbGVtZW50LCBpbmRleCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgfVxuXG4gIHNldEhvdmVyU3R5bGUoZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleCkge1xuICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIGluZGV4LCAnYWN0aXZlJywgdHJ1ZSk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O1xuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9zZXREYXRhc2V0SG92ZXJTdHlsZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O1xuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCwgJ2FjdGl2ZScsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3Jlc3luY0VsZW1lbnRzKHJlc2V0TmV3RWxlbWVudHMpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YTtcblxuICAgIC8vIEFwcGx5IGNoYW5nZXMgZGV0ZWN0ZWQgdGhyb3VnaCBhcnJheSBsaXN0ZW5lcnNcbiAgICBmb3IgKGNvbnN0IFttZXRob2QsIGFyZzEsIGFyZzJdIG9mIHRoaXMuX3N5bmNMaXN0KSB7XG4gICAgICB0aGlzW21ldGhvZF0oYXJnMSwgYXJnMik7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG5cbiAgICBjb25zdCBudW1NZXRhID0gZWxlbWVudHMubGVuZ3RoO1xuICAgIGNvbnN0IG51bURhdGEgPSBkYXRhLmxlbmd0aDtcbiAgICBjb25zdCBjb3VudCA9IE1hdGgubWluKG51bURhdGEsIG51bU1ldGEpO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAvLyBUT0RPOiBJdCBpcyBub3Qgb3B0aW1hbCB0byBhbHdheXMgcGFyc2UgdGhlIG9sZCBkYXRhXG4gICAgICAvLyBUaGlzIGlzIGRvbmUgYmVjYXVzZSB3ZSBhcmUgbm90IGRldGVjdGluZyBkaXJlY3QgYXNzaWdubWVudHM6XG4gICAgICAvLyBjaGFydC5kYXRhLmRhdGFzZXRzWzBdLmRhdGFbNV0gPSAxMDtcbiAgICAgIC8vIGNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uZGF0YVs1XS55ID0gMTA7XG4gICAgICB0aGlzLnBhcnNlKDAsIGNvdW50KTtcbiAgICB9XG5cbiAgICBpZiAobnVtRGF0YSA+IG51bU1ldGEpIHtcbiAgICAgIHRoaXMuX2luc2VydEVsZW1lbnRzKG51bU1ldGEsIG51bURhdGEgLSBudW1NZXRhLCByZXNldE5ld0VsZW1lbnRzKTtcbiAgICB9IGVsc2UgaWYgKG51bURhdGEgPCBudW1NZXRhKSB7XG4gICAgICB0aGlzLl9yZW1vdmVFbGVtZW50cyhudW1EYXRhLCBudW1NZXRhIC0gbnVtRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaW5zZXJ0RWxlbWVudHMoc3RhcnQsIGNvdW50LCByZXNldE5ld0VsZW1lbnRzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGRhdGEgPSBtZXRhLmRhdGE7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBjb3VudDtcbiAgICBsZXQgaTtcblxuICAgIGNvbnN0IG1vdmUgPSAoYXJyKSA9PiB7XG4gICAgICBhcnIubGVuZ3RoICs9IGNvdW50O1xuICAgICAgZm9yIChpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgICAgYXJyW2ldID0gYXJyW2kgLSBjb3VudF07XG4gICAgICB9XG4gICAgfTtcbiAgICBtb3ZlKGRhdGEpO1xuXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgZGF0YVtpXSA9IG5ldyB0aGlzLmRhdGFFbGVtZW50VHlwZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wYXJzaW5nKSB7XG4gICAgICBtb3ZlKG1ldGEuX3BhcnNlZCk7XG4gICAgfVxuICAgIHRoaXMucGFyc2Uoc3RhcnQsIGNvdW50KTtcblxuICAgIGlmIChyZXNldE5ld0VsZW1lbnRzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGRhdGEsIHN0YXJ0LCBjb3VudCwgJ3Jlc2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMoZWxlbWVudCwgc3RhcnQsIGNvdW50LCBtb2RlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVtb3ZlRWxlbWVudHMoc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBtZXRhLl9wYXJzZWQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gICAgICBpZiAobWV0YS5fc3RhY2tlZCkge1xuICAgICAgICBjbGVhclN0YWNrcyhtZXRhLCByZW1vdmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWV0YS5kYXRhLnNwbGljZShzdGFydCwgY291bnQpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG4gICAqL1xuICBfc3luYyhhcmdzKSB7XG4gICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgIHRoaXMuX3N5bmNMaXN0LnB1c2goYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFttZXRob2QsIGFyZzEsIGFyZzJdID0gYXJncztcbiAgICAgIHRoaXNbbWV0aG9kXShhcmcxLCBhcmcyKTtcbiAgICB9XG4gICAgdGhpcy5jaGFydC5fZGF0YUNoYW5nZXMucHVzaChbdGhpcy5pbmRleCwgLi4uYXJnc10pO1xuICB9XG5cbiAgX29uRGF0YVB1c2goKSB7XG4gICAgY29uc3QgY291bnQgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHRoaXMuX3N5bmMoWydfaW5zZXJ0RWxlbWVudHMnLCB0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aCAtIGNvdW50LCBjb3VudF0pO1xuICB9XG5cbiAgX29uRGF0YVBvcCgpIHtcbiAgICB0aGlzLl9zeW5jKFsnX3JlbW92ZUVsZW1lbnRzJywgdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aCAtIDEsIDFdKTtcbiAgfVxuXG4gIF9vbkRhdGFTaGlmdCgpIHtcbiAgICB0aGlzLl9zeW5jKFsnX3JlbW92ZUVsZW1lbnRzJywgMCwgMV0pO1xuICB9XG5cbiAgX29uRGF0YVNwbGljZShzdGFydCwgY291bnQpIHtcbiAgICBpZiAoY291bnQpIHtcbiAgICAgIHRoaXMuX3N5bmMoWydfcmVtb3ZlRWxlbWVudHMnLCBzdGFydCwgY291bnRdKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICBpZiAobmV3Q291bnQpIHtcbiAgICAgIHRoaXMuX3N5bmMoWydfaW5zZXJ0RWxlbWVudHMnLCBzdGFydCwgbmV3Q291bnRdKTtcbiAgICB9XG4gIH1cblxuICBfb25EYXRhVW5zaGlmdCgpIHtcbiAgICB0aGlzLl9zeW5jKFsnX2luc2VydEVsZW1lbnRzJywgMCwgYXJndW1lbnRzLmxlbmd0aF0pO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge1xuICBfYXJyYXlVbmlxdWUsIGlzQXJyYXksIGlzTnVsbE9yVW5kZWYsXG4gIHZhbHVlT3JEZWZhdWx0LCByZXNvbHZlT2JqZWN0S2V5LCBzaWduLCBkZWZpbmVkXG59IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG5mdW5jdGlvbiBnZXRBbGxTY2FsZVZhbHVlcyhzY2FsZSwgdHlwZSkge1xuICBpZiAoIXNjYWxlLl9jYWNoZS4kYmFyKSB7XG4gICAgY29uc3QgdmlzaWJsZU1ldGFzID0gc2NhbGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSk7XG4gICAgbGV0IHZhbHVlcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlsZW4gPSB2aXNpYmxlTWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHZpc2libGVNZXRhc1tpXS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyhzY2FsZSkpO1xuICAgIH1cbiAgICBzY2FsZS5fY2FjaGUuJGJhciA9IF9hcnJheVVuaXF1ZSh2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpKTtcbiAgfVxuICByZXR1cm4gc2NhbGUuX2NhY2hlLiRiYXI7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIFwib3B0aW1hbFwiIHNhbXBsZSBzaXplIHRvIG1haW50YWluIGJhcnMgZXF1YWxseSBzaXplZCB3aGlsZSBwcmV2ZW50aW5nIG92ZXJsYXAuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb21wdXRlTWluU2FtcGxlU2l6ZShtZXRhKSB7XG4gIGNvbnN0IHNjYWxlID0gbWV0YS5pU2NhbGU7XG4gIGNvbnN0IHZhbHVlcyA9IGdldEFsbFNjYWxlVmFsdWVzKHNjYWxlLCBtZXRhLnR5cGUpO1xuICBsZXQgbWluID0gc2NhbGUuX2xlbmd0aDtcbiAgbGV0IGksIGlsZW4sIGN1cnIsIHByZXY7XG4gIGNvbnN0IHVwZGF0ZU1pbkFuZFByZXYgPSAoKSA9PiB7XG4gICAgaWYgKGN1cnIgPT09IDMyNzY3IHx8IGN1cnIgPT09IC0zMjc2OCkge1xuICAgICAgLy8gSWdub3JlIHRydW5jYXRlZCBwaXhlbHNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRlZmluZWQocHJldikpIHtcbiAgICAgIC8vIGN1cnIgLSBwcmV2ID09PSAwIGlzIGlnbm9yZWRcbiAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgTWF0aC5hYnMoY3VyciAtIHByZXYpIHx8IG1pbik7XG4gICAgfVxuICAgIHByZXYgPSBjdXJyO1xuICB9O1xuXG4gIGZvciAoaSA9IDAsIGlsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY3VyciA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUodmFsdWVzW2ldKTtcbiAgICB1cGRhdGVNaW5BbmRQcmV2KCk7XG4gIH1cblxuICBwcmV2ID0gdW5kZWZpbmVkO1xuICBmb3IgKGkgPSAwLCBpbGVuID0gc2NhbGUudGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY3VyciA9IHNjYWxlLmdldFBpeGVsRm9yVGljayhpKTtcbiAgICB1cGRhdGVNaW5BbmRQcmV2KCk7XG4gIH1cblxuICByZXR1cm4gbWluO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuIFwiaWRlYWxcIiBjYXRlZ29yeSBiYXNlZCBvbiB0aGUgYWJzb2x1dGUgYmFyIHRoaWNrbmVzcyBvciwgaWYgdW5kZWZpbmVkIG9yIG51bGwsXG4gKiB1c2VzIHRoZSBzbWFsbGVzdCBpbnRlcnZhbCAoc2VlIGNvbXB1dGVNaW5TYW1wbGVTaXplKSB0aGF0IHByZXZlbnRzIGJhciBvdmVybGFwcGluZy4gVGhpc1xuICogbW9kZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlcyBiYXJzIGVxdWFsbHkgc2l6ZWQgKHVudGlsIHdlIGludHJvZHVjZSBzY3JpcHRhYmxlIG9wdGlvbnM/KS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpIHtcbiAgY29uc3QgdGhpY2tuZXNzID0gb3B0aW9ucy5iYXJUaGlja25lc3M7XG4gIGxldCBzaXplLCByYXRpbztcblxuICBpZiAoaXNOdWxsT3JVbmRlZih0aGlja25lc3MpKSB7XG4gICAgc2l6ZSA9IHJ1bGVyLm1pbiAqIG9wdGlvbnMuY2F0ZWdvcnlQZXJjZW50YWdlO1xuICAgIHJhdGlvID0gb3B0aW9ucy5iYXJQZXJjZW50YWdlO1xuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gYmFyIHRoaWNrbmVzcyBpcyBlbmZvcmNlZCwgY2F0ZWdvcnkgYW5kIGJhciBwZXJjZW50YWdlcyBhcmUgaWdub3JlZC5cbiAgICAvLyBOb3RlKFNCKTogd2UgY291bGQgYWRkIHN1cHBvcnQgZm9yIHJlbGF0aXZlIGJhciB0aGlja25lc3MgKGUuZy4gYmFyVGhpY2tuZXNzOiAnNTAlJylcbiAgICAvLyBhbmQgZGVwcmVjYXRlIGJhclBlcmNlbnRhZ2Ugc2luY2UgdGhpcyB2YWx1ZSBpcyBpZ25vcmVkIHdoZW4gdGhpY2tuZXNzIGlzIGFic29sdXRlLlxuICAgIHNpemUgPSB0aGlja25lc3MgKiBzdGFja0NvdW50O1xuICAgIHJhdGlvID0gMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2h1bms6IHNpemUgLyBzdGFja0NvdW50LFxuICAgIHJhdGlvLFxuICAgIHN0YXJ0OiBydWxlci5waXhlbHNbaW5kZXhdIC0gKHNpemUgLyAyKVxuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuIFwib3B0aW1hbFwiIGNhdGVnb3J5IHRoYXQgZ2xvYmFsbHkgYXJyYW5nZXMgYmFycyBzaWRlIGJ5IHNpZGUgKG5vIGdhcCB3aGVuXG4gKiBwZXJjZW50YWdlIG9wdGlvbnMgYXJlIDEpLCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgYW5kIGZvbGxvd2luZyBjYXRlZ29yaWVzLiBUaGlzIG1vZGVcbiAqIGdlbmVyYXRlcyBiYXJzIHdpdGggZGlmZmVyZW50IHdpZHRocyB3aGVuIGRhdGEgYXJlIG5vdCBldmVubHkgc3BhY2VkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUZsZXhDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpIHtcbiAgY29uc3QgcGl4ZWxzID0gcnVsZXIucGl4ZWxzO1xuICBjb25zdCBjdXJyID0gcGl4ZWxzW2luZGV4XTtcbiAgbGV0IHByZXYgPSBpbmRleCA+IDAgPyBwaXhlbHNbaW5kZXggLSAxXSA6IG51bGw7XG4gIGxldCBuZXh0ID0gaW5kZXggPCBwaXhlbHMubGVuZ3RoIC0gMSA/IHBpeGVsc1tpbmRleCArIDFdIDogbnVsbDtcbiAgY29uc3QgcGVyY2VudCA9IG9wdGlvbnMuY2F0ZWdvcnlQZXJjZW50YWdlO1xuXG4gIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgLy8gZmlyc3QgZGF0YTogaXRzIHNpemUgaXMgZG91YmxlIGJhc2VkIG9uIHRoZSBuZXh0IHBvaW50IG9yLFxuICAgIC8vIGlmIGl0J3MgYWxzbyB0aGUgbGFzdCBkYXRhLCB3ZSB1c2UgdGhlIHNjYWxlIHNpemUuXG4gICAgcHJldiA9IGN1cnIgLSAobmV4dCA9PT0gbnVsbCA/IHJ1bGVyLmVuZCAtIHJ1bGVyLnN0YXJ0IDogbmV4dCAtIGN1cnIpO1xuICB9XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBsYXN0IGRhdGE6IGl0cyBzaXplIGlzIGFsc28gZG91YmxlIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBwb2ludC5cbiAgICBuZXh0ID0gY3VyciArIGN1cnIgLSBwcmV2O1xuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBjdXJyIC0gKGN1cnIgLSBNYXRoLm1pbihwcmV2LCBuZXh0KSkgLyAyICogcGVyY2VudDtcbiAgY29uc3Qgc2l6ZSA9IE1hdGguYWJzKG5leHQgLSBwcmV2KSAvIDIgKiBwZXJjZW50O1xuXG4gIHJldHVybiB7XG4gICAgY2h1bms6IHNpemUgLyBzdGFja0NvdW50LFxuICAgIHJhdGlvOiBvcHRpb25zLmJhclBlcmNlbnRhZ2UsXG4gICAgc3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGbG9hdEJhcihlbnRyeSwgaXRlbSwgdlNjYWxlLCBpKSB7XG4gIGNvbnN0IHN0YXJ0VmFsdWUgPSB2U2NhbGUucGFyc2UoZW50cnlbMF0sIGkpO1xuICBjb25zdCBlbmRWYWx1ZSA9IHZTY2FsZS5wYXJzZShlbnRyeVsxXSwgaSk7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoc3RhcnRWYWx1ZSwgZW5kVmFsdWUpO1xuICBsZXQgYmFyU3RhcnQgPSBtaW47XG4gIGxldCBiYXJFbmQgPSBtYXg7XG5cbiAgaWYgKE1hdGguYWJzKG1pbikgPiBNYXRoLmFicyhtYXgpKSB7XG4gICAgYmFyU3RhcnQgPSBtYXg7XG4gICAgYmFyRW5kID0gbWluO1xuICB9XG5cbiAgLy8gU3RvcmUgYGJhckVuZGAgKGZ1cnRoZXN0IGF3YXkgZnJvbSBvcmlnaW4pIGFzIHBhcnNlZCB2YWx1ZSxcbiAgLy8gdG8gbWFrZSBzdGFja2luZyBzdHJhaWdodCBmb3J3YXJkXG4gIGl0ZW1bdlNjYWxlLmF4aXNdID0gYmFyRW5kO1xuXG4gIGl0ZW0uX2N1c3RvbSA9IHtcbiAgICBiYXJTdGFydCxcbiAgICBiYXJFbmQsXG4gICAgc3RhcnQ6IHN0YXJ0VmFsdWUsXG4gICAgZW5kOiBlbmRWYWx1ZSxcbiAgICBtaW4sXG4gICAgbWF4XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZW50cnksIGl0ZW0sIHZTY2FsZSwgaSkge1xuICBpZiAoaXNBcnJheShlbnRyeSkpIHtcbiAgICBwYXJzZUZsb2F0QmFyKGVudHJ5LCBpdGVtLCB2U2NhbGUsIGkpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW1bdlNjYWxlLmF4aXNdID0gdlNjYWxlLnBhcnNlKGVudHJ5LCBpKTtcbiAgfVxuICByZXR1cm4gaXRlbTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBcnJheU9yUHJpbWl0aXZlKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICBjb25zdCBpU2NhbGUgPSBtZXRhLmlTY2FsZTtcbiAgY29uc3QgdlNjYWxlID0gbWV0YS52U2NhbGU7XG4gIGNvbnN0IGxhYmVscyA9IGlTY2FsZS5nZXRMYWJlbHMoKTtcbiAgY29uc3Qgc2luZ2xlU2NhbGUgPSBpU2NhbGUgPT09IHZTY2FsZTtcbiAgY29uc3QgcGFyc2VkID0gW107XG4gIGxldCBpLCBpbGVuLCBpdGVtLCBlbnRyeTtcblxuICBmb3IgKGkgPSBzdGFydCwgaWxlbiA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBlbnRyeSA9IGRhdGFbaV07XG4gICAgaXRlbSA9IHt9O1xuICAgIGl0ZW1baVNjYWxlLmF4aXNdID0gc2luZ2xlU2NhbGUgfHwgaVNjYWxlLnBhcnNlKGxhYmVsc1tpXSwgaSk7XG4gICAgcGFyc2VkLnB1c2gocGFyc2VWYWx1ZShlbnRyeSwgaXRlbSwgdlNjYWxlLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gaXNGbG9hdEJhcihjdXN0b20pIHtcbiAgcmV0dXJuIGN1c3RvbSAmJiBjdXN0b20uYmFyU3RhcnQgIT09IHVuZGVmaW5lZCAmJiBjdXN0b20uYmFyRW5kICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJhclNpZ24oc2l6ZSwgdlNjYWxlLCBhY3R1YWxCYXNlKSB7XG4gIGlmIChzaXplICE9PSAwKSB7XG4gICAgcmV0dXJuIHNpZ24oc2l6ZSk7XG4gIH1cbiAgcmV0dXJuICh2U2NhbGUuaXNIb3Jpem9udGFsKCkgPyAxIDogLTEpICogKHZTY2FsZS5taW4gPj0gYWN0dWFsQmFzZSA/IDEgOiAtMSk7XG59XG5cbmZ1bmN0aW9uIGJvcmRlclByb3BzKHByb3BlcnRpZXMpIHtcbiAgbGV0IHJldmVyc2UsIHN0YXJ0LCBlbmQsIHRvcCwgYm90dG9tO1xuICBpZiAocHJvcGVydGllcy5ob3Jpem9udGFsKSB7XG4gICAgcmV2ZXJzZSA9IHByb3BlcnRpZXMuYmFzZSA+IHByb3BlcnRpZXMueDtcbiAgICBzdGFydCA9ICdsZWZ0JztcbiAgICBlbmQgPSAncmlnaHQnO1xuICB9IGVsc2Uge1xuICAgIHJldmVyc2UgPSBwcm9wZXJ0aWVzLmJhc2UgPCBwcm9wZXJ0aWVzLnk7XG4gICAgc3RhcnQgPSAnYm90dG9tJztcbiAgICBlbmQgPSAndG9wJztcbiAgfVxuICBpZiAocmV2ZXJzZSkge1xuICAgIHRvcCA9ICdlbmQnO1xuICAgIGJvdHRvbSA9ICdzdGFydCc7XG4gIH0gZWxzZSB7XG4gICAgdG9wID0gJ3N0YXJ0JztcbiAgICBib3R0b20gPSAnZW5kJztcbiAgfVxuICByZXR1cm4ge3N0YXJ0LCBlbmQsIHJldmVyc2UsIHRvcCwgYm90dG9tfTtcbn1cblxuZnVuY3Rpb24gc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpIHtcbiAgbGV0IGVkZ2UgPSBvcHRpb25zLmJvcmRlclNraXBwZWQ7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIGlmICghZWRnZSkge1xuICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHJlcztcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZWRnZSA9PT0gdHJ1ZSkge1xuICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHt0b3A6IHRydWUsIHJpZ2h0OiB0cnVlLCBib3R0b206IHRydWUsIGxlZnQ6IHRydWV9O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtzdGFydCwgZW5kLCByZXZlcnNlLCB0b3AsIGJvdHRvbX0gPSBib3JkZXJQcm9wcyhwcm9wZXJ0aWVzKTtcblxuICBpZiAoZWRnZSA9PT0gJ21pZGRsZScgJiYgc3RhY2spIHtcbiAgICBwcm9wZXJ0aWVzLmVuYWJsZUJvcmRlclJhZGl1cyA9IHRydWU7XG4gICAgaWYgKChzdGFjay5fdG9wIHx8IDApID09PSBpbmRleCkge1xuICAgICAgZWRnZSA9IHRvcDtcbiAgICB9IGVsc2UgaWYgKChzdGFjay5fYm90dG9tIHx8IDApID09PSBpbmRleCkge1xuICAgICAgZWRnZSA9IGJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW3BhcnNlRWRnZShib3R0b20sIHN0YXJ0LCBlbmQsIHJldmVyc2UpXSA9IHRydWU7XG4gICAgICBlZGdlID0gdG9wO1xuICAgIH1cbiAgfVxuXG4gIHJlc1twYXJzZUVkZ2UoZWRnZSwgc3RhcnQsIGVuZCwgcmV2ZXJzZSldID0gdHJ1ZTtcbiAgcHJvcGVydGllcy5ib3JkZXJTa2lwcGVkID0gcmVzO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVkZ2UoZWRnZSwgYSwgYiwgcmV2ZXJzZSkge1xuICBpZiAocmV2ZXJzZSkge1xuICAgIGVkZ2UgPSBzd2FwKGVkZ2UsIGEsIGIpO1xuICAgIGVkZ2UgPSBzdGFydEVuZChlZGdlLCBiLCBhKTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlID0gc3RhcnRFbmQoZWRnZSwgYSwgYik7XG4gIH1cbiAgcmV0dXJuIGVkZ2U7XG59XG5cbmZ1bmN0aW9uIHN3YXAob3JpZywgdjEsIHYyKSB7XG4gIHJldHVybiBvcmlnID09PSB2MSA/IHYyIDogb3JpZyA9PT0gdjIgPyB2MSA6IG9yaWc7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0RW5kKHYsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHYgPT09ICdzdGFydCcgPyBzdGFydCA6IHYgPT09ICdlbmQnID8gZW5kIDogdjtcbn1cblxuZnVuY3Rpb24gc2V0SW5mbGF0ZUFtb3VudChwcm9wZXJ0aWVzLCB7aW5mbGF0ZUFtb3VudH0sIHJhdGlvKSB7XG4gIHByb3BlcnRpZXMuaW5mbGF0ZUFtb3VudCA9IGluZmxhdGVBbW91bnQgPT09ICdhdXRvJ1xuICAgID8gcmF0aW8gPT09IDEgPyAwLjMzIDogMFxuICAgIDogaW5mbGF0ZUFtb3VudDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFyQ29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcblxuICBzdGF0aWMgaWQgPSAnYmFyJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgIGRhdGFFbGVtZW50VHlwZTogJ2JhcicsXG5cbiAgICBjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcbiAgICBiYXJQZXJjZW50YWdlOiAwLjksXG4gICAgZ3JvdXBlZDogdHJ1ZSxcblxuICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgIG51bWJlcnM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIHByb3BlcnRpZXM6IFsneCcsICd5JywgJ2Jhc2UnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIHNjYWxlczoge1xuICAgICAgX2luZGV4Xzoge1xuICAgICAgICB0eXBlOiAnY2F0ZWdvcnknLFxuICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF92YWx1ZV86IHtcbiAgICAgICAgdHlwZTogJ2xpbmVhcicsXG4gICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuXG4gIC8qKlxuXHQgKiBPdmVycmlkaW5nIHByaW1pdGl2ZSBkYXRhIHBhcnNpbmcgc2luY2Ugd2Ugc3VwcG9ydCBtaXhlZCBwcmltaXRpdmUvYXJyYXlcblx0ICogZGF0YSBmb3IgZmxvYXQgYmFyc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBwYXJzZVByaW1pdGl2ZURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICB9XG5cbiAgLyoqXG5cdCAqIE92ZXJyaWRpbmcgYXJyYXkgZGF0YSBwYXJzaW5nIHNpbmNlIHdlIHN1cHBvcnQgbWl4ZWQgcHJpbWl0aXZlL2FycmF5XG5cdCAqIGRhdGEgZm9yIGZsb2F0IGJhcnNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICB9XG5cbiAgLyoqXG5cdCAqIE92ZXJyaWRpbmcgb2JqZWN0IGRhdGEgcGFyc2luZyBzaW5jZSB3ZSBzdXBwb3J0IG1peGVkIHByaW1pdGl2ZS9hcnJheVxuXHQgKiB2YWx1ZS1zY2FsZSBkYXRhIGZvciBmbG9hdCBiYXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCB7aVNjYWxlLCB2U2NhbGV9ID0gbWV0YTtcbiAgICBjb25zdCB7eEF4aXNLZXkgPSAneCcsIHlBeGlzS2V5ID0gJ3knfSA9IHRoaXMuX3BhcnNpbmc7XG4gICAgY29uc3QgaUF4aXNLZXkgPSBpU2NhbGUuYXhpcyA9PT0gJ3gnID8geEF4aXNLZXkgOiB5QXhpc0tleTtcbiAgICBjb25zdCB2QXhpc0tleSA9IHZTY2FsZS5heGlzID09PSAneCcgPyB4QXhpc0tleSA6IHlBeGlzS2V5O1xuICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgIGxldCBpLCBpbGVuLCBpdGVtLCBvYmo7XG4gICAgZm9yIChpID0gc3RhcnQsIGlsZW4gPSBzdGFydCArIGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBvYmogPSBkYXRhW2ldO1xuICAgICAgaXRlbSA9IHt9O1xuICAgICAgaXRlbVtpU2NhbGUuYXhpc10gPSBpU2NhbGUucGFyc2UocmVzb2x2ZU9iamVjdEtleShvYmosIGlBeGlzS2V5KSwgaSk7XG4gICAgICBwYXJzZWQucHVzaChwYXJzZVZhbHVlKHJlc29sdmVPYmplY3RLZXkob2JqLCB2QXhpc0tleSksIGl0ZW0sIHZTY2FsZSwgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spIHtcbiAgICBzdXBlci51cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKTtcbiAgICBjb25zdCBjdXN0b20gPSBwYXJzZWQuX2N1c3RvbTtcbiAgICBpZiAoY3VzdG9tICYmIHNjYWxlID09PSB0aGlzLl9jYWNoZWRNZXRhLnZTY2FsZSkge1xuICAgICAgLy8gZmxvYXQgYmFyOiBvbmx5IG9uZSBlbmQgb2YgdGhlIGJhciBpcyBjb25zaWRlcmVkIGJ5IGBzdXBlcmBcbiAgICAgIHJhbmdlLm1pbiA9IE1hdGgubWluKHJhbmdlLm1pbiwgY3VzdG9tLm1pbik7XG4gICAgICByYW5nZS5tYXggPSBNYXRoLm1heChyYW5nZS5tYXgsIGN1c3RvbS5tYXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtudW1iZXJ8Ym9vbGVhbn1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IHtpU2NhbGUsIHZTY2FsZX0gPSBtZXRhO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICBjb25zdCBjdXN0b20gPSBwYXJzZWQuX2N1c3RvbTtcbiAgICBjb25zdCB2YWx1ZSA9IGlzRmxvYXRCYXIoY3VzdG9tKVxuICAgICAgPyAnWycgKyBjdXN0b20uc3RhcnQgKyAnLCAnICsgY3VzdG9tLmVuZCArICddJ1xuICAgICAgOiAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiAnJyArIGlTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFtpU2NhbGUuYXhpc10pLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSB0cnVlO1xuXG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgbWV0YS5zdGFjayA9IHRoaXMuZ2V0RGF0YXNldCgpLnN0YWNrO1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKG1ldGEuZGF0YSwgMCwgbWV0YS5kYXRhLmxlbmd0aCwgbW9kZSk7XG4gIH1cblxuICB1cGRhdGVFbGVtZW50cyhiYXJzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2luZGV4LCBfY2FjaGVkTWV0YToge3ZTY2FsZX19ID0gdGhpcztcbiAgICBjb25zdCBiYXNlID0gdlNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICAgIGNvbnN0IGhvcml6b250YWwgPSB2U2NhbGUuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgcnVsZXIgPSB0aGlzLl9nZXRSdWxlcigpO1xuICAgIGNvbnN0IHtzaGFyZWRPcHRpb25zLCBpbmNsdWRlT3B0aW9uc30gPSB0aGlzLl9nZXRTaGFyZWRPcHRpb25zKHN0YXJ0LCBtb2RlKTtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaSk7XG4gICAgICBjb25zdCB2cGl4ZWxzID0gcmVzZXQgfHwgaXNOdWxsT3JVbmRlZihwYXJzZWRbdlNjYWxlLmF4aXNdKSA/IHtiYXNlLCBoZWFkOiBiYXNlfSA6IHRoaXMuX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGkpO1xuICAgICAgY29uc3QgaXBpeGVscyA9IHRoaXMuX2NhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKGksIHJ1bGVyKTtcbiAgICAgIGNvbnN0IHN0YWNrID0gKHBhcnNlZC5fc3RhY2tzIHx8IHt9KVt2U2NhbGUuYXhpc107XG5cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgIGhvcml6b250YWwsXG4gICAgICAgIGJhc2U6IHZwaXhlbHMuYmFzZSxcbiAgICAgICAgZW5hYmxlQm9yZGVyUmFkaXVzOiAhc3RhY2sgfHwgaXNGbG9hdEJhcihwYXJzZWQuX2N1c3RvbSkgfHwgKGluZGV4ID09PSBzdGFjay5fdG9wIHx8IGluZGV4ID09PSBzdGFjay5fYm90dG9tKSxcbiAgICAgICAgeDogaG9yaXpvbnRhbCA/IHZwaXhlbHMuaGVhZCA6IGlwaXhlbHMuY2VudGVyLFxuICAgICAgICB5OiBob3Jpem9udGFsID8gaXBpeGVscy5jZW50ZXIgOiB2cGl4ZWxzLmhlYWQsXG4gICAgICAgIGhlaWdodDogaG9yaXpvbnRhbCA/IGlwaXhlbHMuc2l6ZSA6IE1hdGguYWJzKHZwaXhlbHMuc2l6ZSksXG4gICAgICAgIHdpZHRoOiBob3Jpem9udGFsID8gTWF0aC5hYnModnBpeGVscy5zaXplKSA6IGlwaXhlbHMuc2l6ZVxuICAgICAgfTtcblxuICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIGJhcnNbaV0uYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0aWVzLm9wdGlvbnMgfHwgYmFyc1tpXS5vcHRpb25zO1xuICAgICAgc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpO1xuICAgICAgc2V0SW5mbGF0ZUFtb3VudChwcm9wZXJ0aWVzLCBvcHRpb25zLCBydWxlci5yYXRpbyk7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYmFyc1tpXSwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIHN0YWNrcyBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xhc3RdIC0gVGhlIGRhdGFzZXQgaW5kZXhcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhSW5kZXhdIC0gVGhlIGRhdGEgaW5kZXggb2YgdGhlIHJ1bGVyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVGhlIGxpc3Qgb2Ygc3RhY2sgSURzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0U3RhY2tzKGxhc3QsIGRhdGFJbmRleCkge1xuICAgIGNvbnN0IHtpU2NhbGV9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBtZXRhc2V0cyA9IGlTY2FsZS5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcyh0aGlzLl90eXBlKVxuICAgICAgLmZpbHRlcihtZXRhID0+IG1ldGEuY29udHJvbGxlci5vcHRpb25zLmdyb3VwZWQpO1xuICAgIGNvbnN0IHN0YWNrZWQgPSBpU2NhbGUub3B0aW9ucy5zdGFja2VkO1xuICAgIGNvbnN0IHN0YWNrcyA9IFtdO1xuXG4gICAgY29uc3Qgc2tpcE51bGwgPSAobWV0YSkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gbWV0YS5jb250cm9sbGVyLmdldFBhcnNlZChkYXRhSW5kZXgpO1xuICAgICAgY29uc3QgdmFsID0gcGFyc2VkICYmIHBhcnNlZFttZXRhLnZTY2FsZS5heGlzXTtcblxuICAgICAgaWYgKGlzTnVsbE9yVW5kZWYodmFsKSB8fCBpc05hTih2YWwpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgbWV0YXNldHMpIHtcbiAgICAgIGlmIChkYXRhSW5kZXggIT09IHVuZGVmaW5lZCAmJiBza2lwTnVsbChtZXRhKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RhY2tlZCAgIHwgbWV0YS5zdGFja1xuICAgICAgLy8gICAgICAgICAgIHwgZm91bmQgfCBub3QgZm91bmQgfCB1bmRlZmluZWRcbiAgICAgIC8vIGZhbHNlICAgICB8ICAgeCAgIHwgICAgIHggICAgIHwgICAgIHhcbiAgICAgIC8vIHRydWUgICAgICB8ICAgICAgIHwgICAgIHggICAgIHxcbiAgICAgIC8vIHVuZGVmaW5lZCB8ICAgICAgIHwgICAgIHggICAgIHwgICAgIHhcbiAgICAgIGlmIChzdGFja2VkID09PSBmYWxzZSB8fCBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEgfHxcblx0XHRcdFx0KHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHN0YWNrcy5wdXNoKG1ldGEuc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGEuaW5kZXggPT09IGxhc3QpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gc3RhY2tzPyB0aGF0IG1lYW5zIHRoZXJlIGlzIG5vIHZpc2libGUgZGF0YS4gTGV0J3Mgc3RpbGwgaW5pdGlhbGl6ZSBhbiBgdW5kZWZpbmVkYFxuICAgIC8vIHN0YWNrIHdoZXJlIHBvc3NpYmxlIGludmlzaWJsZSBiYXJzIHdpbGwgYmUgbG9jYXRlZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNjM2OFxuICAgIGlmICghc3RhY2tzLmxlbmd0aCkge1xuICAgICAgc3RhY2tzLnB1c2godW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBudW1iZXIgb2Ygc3RhY2tzIGJhc2VkIG9uIGdyb3VwcyBhbmQgYmFyIHZpc2liaWxpdHkuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0U3RhY2tDb3VudChpbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTdGFja3ModW5kZWZpbmVkLCBpbmRleCkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIHN0YWNrIGluZGV4IGZvciB0aGUgZ2l2ZW4gZGF0YXNldCBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RhdGFzZXRJbmRleF0gLSBUaGUgZGF0YXNldCBpbmRleFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIHN0YWNrIG5hbWUgdG8gZmluZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGFJbmRleF1cblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHN0YWNrIGluZGV4XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0U3RhY2tJbmRleChkYXRhc2V0SW5kZXgsIG5hbWUsIGRhdGFJbmRleCkge1xuICAgIGNvbnN0IHN0YWNrcyA9IHRoaXMuX2dldFN0YWNrcyhkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCk7XG4gICAgY29uc3QgaW5kZXggPSAobmFtZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgPyBzdGFja3MuaW5kZXhPZihuYW1lKVxuICAgICAgOiAtMTsgLy8gaW5kZXhPZiByZXR1cm5zIC0xIGlmIGVsZW1lbnQgaXMgbm90IHByZXNlbnRcblxuICAgIHJldHVybiAoaW5kZXggPT09IC0xKVxuICAgICAgPyBzdGFja3MubGVuZ3RoIC0gMVxuICAgICAgOiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldFJ1bGVyKCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgaVNjYWxlID0gbWV0YS5pU2NhbGU7XG4gICAgY29uc3QgcGl4ZWxzID0gW107XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YS5kYXRhLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgcGl4ZWxzLnB1c2goaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSlbaVNjYWxlLmF4aXNdLCBpKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFyVGhpY2tuZXNzID0gb3B0cy5iYXJUaGlja25lc3M7XG4gICAgY29uc3QgbWluID0gYmFyVGhpY2tuZXNzIHx8IGNvbXB1dGVNaW5TYW1wbGVTaXplKG1ldGEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbixcbiAgICAgIHBpeGVscyxcbiAgICAgIHN0YXJ0OiBpU2NhbGUuX3N0YXJ0UGl4ZWwsXG4gICAgICBlbmQ6IGlTY2FsZS5fZW5kUGl4ZWwsXG4gICAgICBzdGFja0NvdW50OiB0aGlzLl9nZXRTdGFja0NvdW50KCksXG4gICAgICBzY2FsZTogaVNjYWxlLFxuICAgICAgZ3JvdXBlZDogb3B0cy5ncm91cGVkLFxuICAgICAgLy8gYmFyIHRoaWNrbmVzcyByYXRpbyB1c2VkIGZvciBub24tZ3JvdXBlZCBiYXJzXG4gICAgICByYXRpbzogYmFyVGhpY2tuZXNzID8gMSA6IG9wdHMuY2F0ZWdvcnlQZXJjZW50YWdlICogb3B0cy5iYXJQZXJjZW50YWdlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBOb3RlOiBwaXhlbCB2YWx1ZXMgYXJlIG5vdCBjbGFtcGVkIHRvIHRoZSBzY2FsZSBhcmVhLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGluZGV4KSB7XG4gICAgY29uc3Qge19jYWNoZWRNZXRhOiB7dlNjYWxlLCBfc3RhY2tlZCwgaW5kZXg6IGRhdGFzZXRJbmRleH0sIG9wdGlvbnM6IHtiYXNlOiBiYXNlVmFsdWUsIG1pbkJhckxlbmd0aH19ID0gdGhpcztcbiAgICBjb25zdCBhY3R1YWxCYXNlID0gYmFzZVZhbHVlIHx8IDA7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgIGNvbnN0IGN1c3RvbSA9IHBhcnNlZC5fY3VzdG9tO1xuICAgIGNvbnN0IGZsb2F0aW5nID0gaXNGbG9hdEJhcihjdXN0b20pO1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlZFt2U2NhbGUuYXhpc107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gX3N0YWNrZWQgPyB0aGlzLmFwcGx5U3RhY2sodlNjYWxlLCBwYXJzZWQsIF9zdGFja2VkKSA6IHZhbHVlO1xuICAgIGxldCBoZWFkLCBzaXplO1xuXG4gICAgaWYgKGxlbmd0aCAhPT0gdmFsdWUpIHtcbiAgICAgIHN0YXJ0ID0gbGVuZ3RoIC0gdmFsdWU7XG4gICAgICBsZW5ndGggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIHZhbHVlID0gY3VzdG9tLmJhclN0YXJ0O1xuICAgICAgbGVuZ3RoID0gY3VzdG9tLmJhckVuZCAtIGN1c3RvbS5iYXJTdGFydDtcbiAgICAgIC8vIGJhcnMgY3Jvc3Npbmcgb3JpZ2luIGFyZSBub3Qgc3RhY2tlZFxuICAgICAgaWYgKHZhbHVlICE9PSAwICYmIHNpZ24odmFsdWUpICE9PSBzaWduKGN1c3RvbS5iYXJFbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ICs9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSAhaXNOdWxsT3JVbmRlZihiYXNlVmFsdWUpICYmICFmbG9hdGluZyA/IGJhc2VWYWx1ZSA6IHN0YXJ0O1xuICAgIGxldCBiYXNlID0gdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnRWYWx1ZSk7XG5cbiAgICBpZiAodGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShpbmRleCkpIHtcbiAgICAgIGhlYWQgPSB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCArIGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdoZW4gbm90IHZpc2libGUsIG5vIGhlaWdodFxuICAgICAgaGVhZCA9IGJhc2U7XG4gICAgfVxuXG4gICAgc2l6ZSA9IGhlYWQgLSBiYXNlO1xuXG4gICAgaWYgKE1hdGguYWJzKHNpemUpIDwgbWluQmFyTGVuZ3RoKSB7XG4gICAgICBzaXplID0gYmFyU2lnbihzaXplLCB2U2NhbGUsIGFjdHVhbEJhc2UpICogbWluQmFyTGVuZ3RoO1xuICAgICAgaWYgKHZhbHVlID09PSBhY3R1YWxCYXNlKSB7XG4gICAgICAgIGJhc2UgLT0gc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGFydFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwKTtcbiAgICAgIGNvbnN0IGVuZFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgxKTtcbiAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgIGJhc2UgPSBNYXRoLm1heChNYXRoLm1pbihiYXNlLCBtYXgpLCBtaW4pO1xuICAgICAgaGVhZCA9IGJhc2UgKyBzaXplO1xuXG4gICAgICBpZiAoX3N0YWNrZWQgJiYgIWZsb2F0aW5nKSB7XG4gICAgICAgIC8vIHZpc3VhbCBkYXRhIGNvb3JkaW5hdGVzIGFmdGVyIGFwcGx5aW5nIG1pbkJhckxlbmd0aFxuICAgICAgICBwYXJzZWQuX3N0YWNrc1t2U2NhbGUuYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdID0gdlNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoaGVhZCkgLSB2U2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUoYWN0dWFsQmFzZSkpIHtcbiAgICAgIGNvbnN0IGhhbGZHcmlkID0gc2lnbihzaXplKSAqIHZTY2FsZS5nZXRMaW5lV2lkdGhGb3JWYWx1ZShhY3R1YWxCYXNlKSAvIDI7XG4gICAgICBiYXNlICs9IGhhbGZHcmlkO1xuICAgICAgc2l6ZSAtPSBoYWxmR3JpZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZSxcbiAgICAgIGJhc2UsXG4gICAgICBoZWFkLFxuICAgICAgY2VudGVyOiBoZWFkICsgc2l6ZSAvIDJcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoaW5kZXgsIHJ1bGVyKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBydWxlci5zY2FsZTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHNraXBOdWxsID0gb3B0aW9ucy5za2lwTnVsbDtcbiAgICBjb25zdCBtYXhCYXJUaGlja25lc3MgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLm1heEJhclRoaWNrbmVzcywgSW5maW5pdHkpO1xuICAgIGxldCBjZW50ZXIsIHNpemU7XG4gICAgaWYgKHJ1bGVyLmdyb3VwZWQpIHtcbiAgICAgIGNvbnN0IHN0YWNrQ291bnQgPSBza2lwTnVsbCA/IHRoaXMuX2dldFN0YWNrQ291bnQoaW5kZXgpIDogcnVsZXIuc3RhY2tDb3VudDtcbiAgICAgIGNvbnN0IHJhbmdlID0gb3B0aW9ucy5iYXJUaGlja25lc3MgPT09ICdmbGV4J1xuICAgICAgICA/IGNvbXB1dGVGbGV4Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zLCBzdGFja0NvdW50KVxuICAgICAgICA6IGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpO1xuXG4gICAgICBjb25zdCBzdGFja0luZGV4ID0gdGhpcy5fZ2V0U3RhY2tJbmRleCh0aGlzLmluZGV4LCB0aGlzLl9jYWNoZWRNZXRhLnN0YWNrLCBza2lwTnVsbCA/IGluZGV4IDogdW5kZWZpbmVkKTtcbiAgICAgIGNlbnRlciA9IHJhbmdlLnN0YXJ0ICsgKHJhbmdlLmNodW5rICogc3RhY2tJbmRleCkgKyAocmFuZ2UuY2h1bmsgLyAyKTtcbiAgICAgIHNpemUgPSBNYXRoLm1pbihtYXhCYXJUaGlja25lc3MsIHJhbmdlLmNodW5rICogcmFuZ2UucmF0aW8pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3Igbm9uLWdyb3VwZWQgYmFyIGNoYXJ0cywgZXhhY3QgcGl4ZWwgdmFsdWVzIGFyZSB1c2VkXG4gICAgICBjZW50ZXIgPSBzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKGluZGV4KVtzY2FsZS5heGlzXSwgaW5kZXgpO1xuICAgICAgc2l6ZSA9IE1hdGgubWluKG1heEJhclRoaWNrbmVzcywgcnVsZXIubWluICogcnVsZXIucmF0aW8pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBiYXNlOiBjZW50ZXIgLSBzaXplIC8gMixcbiAgICAgIGhlYWQ6IGNlbnRlciArIHNpemUgLyAyLFxuICAgICAgY2VudGVyLFxuICAgICAgc2l6ZVxuICAgIH07XG4gIH1cblxuICBkcmF3KCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IHZTY2FsZSA9IG1ldGEudlNjYWxlO1xuICAgIGNvbnN0IHJlY3RzID0gbWV0YS5kYXRhO1xuICAgIGNvbnN0IGlsZW4gPSByZWN0cy5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgZm9yICg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmdldFBhcnNlZChpKVt2U2NhbGUuYXhpc10gIT09IG51bGwpIHtcbiAgICAgICAgcmVjdHNbaV0uZHJhdyh0aGlzLl9jdHgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge3ZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1YmJsZUNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgc3RhdGljIGlkID0gJ2J1YmJsZSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGF0YXNldEVsZW1lbnRUeXBlOiBmYWxzZSxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG5cbiAgICBhbmltYXRpb25zOiB7XG4gICAgICBudW1iZXJzOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBwcm9wZXJ0aWVzOiBbJ3gnLCAneScsICdib3JkZXJXaWR0aCcsICdyYWRpdXMnXVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgc2NhbGVzOiB7XG4gICAgICB4OiB7XG4gICAgICAgIHR5cGU6ICdsaW5lYXInXG4gICAgICB9LFxuICAgICAgeToge1xuICAgICAgICB0eXBlOiAnbGluZWFyJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IHRydWU7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIFBhcnNlIGFycmF5IG9mIHByaW1pdGl2ZSB2YWx1ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VQcmltaXRpdmVEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHN1cGVyLnBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXJzZWRbaV0uX2N1c3RvbSA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpICsgc3RhcnQpLnJhZGl1cztcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBhcnJheXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgcGFyc2VkID0gc3VwZXIucGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgIHBhcnNlZFtpXS5fY3VzdG9tID0gdmFsdWVPckRlZmF1bHQoaXRlbVsyXSwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkgKyBzdGFydCkucmFkaXVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBvYmplY3RzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBzdXBlci5wYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgIHBhcnNlZFtpXS5fY3VzdG9tID0gdmFsdWVPckRlZmF1bHQoaXRlbSAmJiBpdGVtLnIgJiYgK2l0ZW0uciwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkgKyBzdGFydCkucmFkaXVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhO1xuXG4gICAgbGV0IG1heCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZGF0YVtpXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpKSkgLyAyKTtcbiAgICB9XG4gICAgcmV0dXJuIG1heCA+IDAgJiYgbWF4O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldExhYmVsQW5kVmFsdWUoaW5kZXgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmNoYXJ0LmRhdGEubGFiZWxzIHx8IFtdO1xuICAgIGNvbnN0IHt4U2NhbGUsIHlTY2FsZX0gPSBtZXRhO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICBjb25zdCB4ID0geFNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkLngpO1xuICAgIGNvbnN0IHkgPSB5U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueSk7XG4gICAgY29uc3QgciA9IHBhcnNlZC5fY3VzdG9tO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBsYWJlbHNbaW5kZXhdIHx8ICcnLFxuICAgICAgdmFsdWU6ICcoJyArIHggKyAnLCAnICsgeSArIChyID8gJywgJyArIHIgOiAnJykgKyAnKSdcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG5cbiAgICAvLyBVcGRhdGUgUG9pbnRzXG4gICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIDAsIHBvaW50cy5sZW5ndGgsIG1vZGUpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2lTY2FsZSwgdlNjYWxlfSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3Qge3NoYXJlZE9wdGlvbnMsIGluY2x1ZGVPcHRpb25zfSA9IHRoaXMuX2dldFNoYXJlZE9wdGlvbnMoc3RhcnQsIG1vZGUpO1xuICAgIGNvbnN0IGlBeGlzID0gaVNjYWxlLmF4aXM7XG4gICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICBjb25zdCBwYXJzZWQgPSAhcmVzZXQgJiYgdGhpcy5nZXRQYXJzZWQoaSk7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge307XG4gICAgICBjb25zdCBpUGl4ZWwgPSBwcm9wZXJ0aWVzW2lBeGlzXSA9IHJlc2V0ID8gaVNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwLjUpIDogaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUocGFyc2VkW2lBeGlzXSk7XG4gICAgICBjb25zdCB2UGl4ZWwgPSBwcm9wZXJ0aWVzW3ZBeGlzXSA9IHJlc2V0ID8gdlNjYWxlLmdldEJhc2VQaXhlbCgpIDogdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUocGFyc2VkW3ZBeGlzXSk7XG5cbiAgICAgIHByb3BlcnRpZXMuc2tpcCA9IGlzTmFOKGlQaXhlbCkgfHwgaXNOYU4odlBpeGVsKTtcblxuICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG5cbiAgICAgICAgaWYgKHJlc2V0KSB7XG4gICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zLnJhZGl1cyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHBvaW50LCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCwgbW9kZSkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICBsZXQgdmFsdWVzID0gc3VwZXIucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCwgbW9kZSk7XG5cbiAgICAvLyBJbiBjYXNlIHZhbHVlcyB3ZXJlIGNhY2hlZCAoYW5kIHRodXMgZnJvemVuKSwgd2UgbmVlZCB0byBjbG9uZSB0aGUgdmFsdWVzXG4gICAgaWYgKHZhbHVlcy4kc2hhcmVkKSB7XG4gICAgICB2YWx1ZXMgPSBPYmplY3QuYXNzaWduKHt9LCB2YWx1ZXMsIHskc2hhcmVkOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSByYWRpdXMgcmVzb2x1dGlvblxuICAgIGNvbnN0IHJhZGl1cyA9IHZhbHVlcy5yYWRpdXM7XG4gICAgaWYgKG1vZGUgIT09ICdhY3RpdmUnKSB7XG4gICAgICB2YWx1ZXMucmFkaXVzID0gMDtcbiAgICB9XG4gICAgdmFsdWVzLnJhZGl1cyArPSB2YWx1ZU9yRGVmYXVsdChwYXJzZWQgJiYgcGFyc2VkLl9jdXN0b20sIHJhZGl1cyk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge2lzT2JqZWN0LCByZXNvbHZlT2JqZWN0S2V5LCB0b1BlcmNlbnRhZ2UsIHRvRGltZW5zaW9uLCB2YWx1ZU9yRGVmYXVsdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuaW1wb3J0IHtmb3JtYXROdW1iZXJ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5pbnRsLmpzJztcbmltcG9ydCB7dG9SYWRpYW5zLCBQSSwgVEFVLCBIQUxGX1BJLCBfYW5nbGVCZXR3ZWVufSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IENoYXJ0XG4gKi9cblxuZnVuY3Rpb24gZ2V0UmF0aW9BbmRPZmZzZXQocm90YXRpb24sIGNpcmN1bWZlcmVuY2UsIGN1dG91dCkge1xuICBsZXQgcmF0aW9YID0gMTtcbiAgbGV0IHJhdGlvWSA9IDE7XG4gIGxldCBvZmZzZXRYID0gMDtcbiAgbGV0IG9mZnNldFkgPSAwO1xuICAvLyBJZiB0aGUgY2hhcnQncyBjaXJjdW1mZXJlbmNlIGlzbid0IGEgZnVsbCBjaXJjbGUsIGNhbGN1bGF0ZSBzaXplIGFzIGEgcmF0aW8gb2YgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgYXJjXG4gIGlmIChjaXJjdW1mZXJlbmNlIDwgVEFVKSB7XG4gICAgY29uc3Qgc3RhcnRBbmdsZSA9IHJvdGF0aW9uO1xuICAgIGNvbnN0IGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIGNpcmN1bWZlcmVuY2U7XG4gICAgY29uc3Qgc3RhcnRYID0gTWF0aC5jb3Moc3RhcnRBbmdsZSk7XG4gICAgY29uc3Qgc3RhcnRZID0gTWF0aC5zaW4oc3RhcnRBbmdsZSk7XG4gICAgY29uc3QgZW5kWCA9IE1hdGguY29zKGVuZEFuZ2xlKTtcbiAgICBjb25zdCBlbmRZID0gTWF0aC5zaW4oZW5kQW5nbGUpO1xuICAgIGNvbnN0IGNhbGNNYXggPSAoYW5nbGUsIGEsIGIpID0+IF9hbmdsZUJldHdlZW4oYW5nbGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCB0cnVlKSA/IDEgOiBNYXRoLm1heChhLCBhICogY3V0b3V0LCBiLCBiICogY3V0b3V0KTtcbiAgICBjb25zdCBjYWxjTWluID0gKGFuZ2xlLCBhLCBiKSA9PiBfYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgdHJ1ZSkgPyAtMSA6IE1hdGgubWluKGEsIGEgKiBjdXRvdXQsIGIsIGIgKiBjdXRvdXQpO1xuICAgIGNvbnN0IG1heFggPSBjYWxjTWF4KDAsIHN0YXJ0WCwgZW5kWCk7XG4gICAgY29uc3QgbWF4WSA9IGNhbGNNYXgoSEFMRl9QSSwgc3RhcnRZLCBlbmRZKTtcbiAgICBjb25zdCBtaW5YID0gY2FsY01pbihQSSwgc3RhcnRYLCBlbmRYKTtcbiAgICBjb25zdCBtaW5ZID0gY2FsY01pbihQSSArIEhBTEZfUEksIHN0YXJ0WSwgZW5kWSk7XG4gICAgcmF0aW9YID0gKG1heFggLSBtaW5YKSAvIDI7XG4gICAgcmF0aW9ZID0gKG1heFkgLSBtaW5ZKSAvIDI7XG4gICAgb2Zmc2V0WCA9IC0obWF4WCArIG1pblgpIC8gMjtcbiAgICBvZmZzZXRZID0gLShtYXhZICsgbWluWSkgLyAyO1xuICB9XG4gIHJldHVybiB7cmF0aW9YLCByYXRpb1ksIG9mZnNldFgsIG9mZnNldFl9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3VnaG51dENvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgc3RhdGljIGlkID0gJ2RvdWdobnV0JztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgIGRhdGFFbGVtZW50VHlwZTogJ2FyYycsXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBCb29sZWFuIC0gV2hldGhlciB3ZSBhbmltYXRlIHRoZSByb3RhdGlvbiBvZiB0aGUgRG91Z2hudXRcbiAgICAgIGFuaW1hdGVSb3RhdGU6IHRydWUsXG4gICAgICAvLyBCb29sZWFuIC0gV2hldGhlciB3ZSBhbmltYXRlIHNjYWxpbmcgdGhlIERvdWdobnV0IGZyb20gdGhlIGNlbnRyZVxuICAgICAgYW5pbWF0ZVNjYWxlOiBmYWxzZVxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgbnVtYmVyczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgcHJvcGVydGllczogWydjaXJjdW1mZXJlbmNlJywgJ2VuZEFuZ2xlJywgJ2lubmVyUmFkaXVzJywgJ291dGVyUmFkaXVzJywgJ3N0YXJ0QW5nbGUnLCAneCcsICd5JywgJ29mZnNldCcsICdib3JkZXJXaWR0aCcsICdzcGFjaW5nJ11cbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgdGhhdCB3ZSBjdXQgb3V0IG9mIHRoZSBtaWRkbGUuXG4gICAgY3V0b3V0OiAnNTAlJyxcblxuICAgIC8vIFRoZSByb3RhdGlvbiBvZiB0aGUgY2hhcnQsIHdoZXJlIHRoZSBmaXJzdCBkYXRhIGFyYyBiZWdpbnMuXG4gICAgcm90YXRpb246IDAsXG5cbiAgICAvLyBUaGUgdG90YWwgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2hhcnQuXG4gICAgY2lyY3VtZmVyZW5jZTogMzYwLFxuXG4gICAgLy8gVGhlIG91dHIgcmFkaXVzIG9mIHRoZSBjaGFydFxuICAgIHJhZGl1czogJzEwMCUnLFxuXG4gICAgLy8gU3BhY2luZyBiZXR3ZWVuIGFyY3NcbiAgICBzcGFjaW5nOiAwLFxuXG4gICAgaW5kZXhBeGlzOiAncicsXG4gIH07XG5cbiAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgIF9zY3JpcHRhYmxlOiAobmFtZSkgPT4gbmFtZSAhPT0gJ3NwYWNpbmcnLFxuICAgIF9pbmRleGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnc3BhY2luZycsXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIGFzcGVjdFJhdGlvOiAxLFxuXG4gICAgLy8gTmVlZCB0byBvdmVycmlkZSB0aGVzZSB0byBnaXZlIGEgbmljZSBkZWZhdWx0XG4gICAgcGx1Z2luczoge1xuICAgICAgbGVnZW5kOiB7XG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgIGdlbmVyYXRlTGFiZWxzKGNoYXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3Qge2xhYmVsczoge3BvaW50U3R5bGUsIGNvbG9yfX0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcblxuICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sYWJlbHMubWFwKChsYWJlbCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IG1ldGEuY29udHJvbGxlci5nZXRTdHlsZShpKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogc3R5bGUuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlU3R5bGU6IHN0eWxlLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgZm9udENvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogc3R5bGUuYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICBwb2ludFN0eWxlOiBwb2ludFN0eWxlLFxuICAgICAgICAgICAgICAgICAgaGlkZGVuOiAhY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSksXG5cbiAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGRhdGEgdXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGNvcnJlY3QgaXRlbVxuICAgICAgICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgb25DbGljayhlLCBsZWdlbmRJdGVtLCBsZWdlbmQpIHtcbiAgICAgICAgICBsZWdlbmQuY2hhcnQudG9nZ2xlRGF0YVZpc2liaWxpdHkobGVnZW5kSXRlbS5pbmRleCk7XG4gICAgICAgICAgbGVnZW5kLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcbiAgICBzdXBlcihjaGFydCwgZGF0YXNldEluZGV4KTtcblxuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IHRydWU7XG4gICAgdGhpcy5pbm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2Zmc2V0WCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9mZnNldFkgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBsaW5rU2NhbGVzKCkge31cblxuICAvKipcblx0ICogT3ZlcnJpZGUgZGF0YSBwYXJzaW5nLCBzaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHNjYWxlc1xuXHQgKi9cbiAgcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YXNldCgpLmRhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG5cbiAgICBpZiAodGhpcy5fcGFyc2luZyA9PT0gZmFsc2UpIHtcbiAgICAgIG1ldGEuX3BhcnNlZCA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBnZXR0ZXIgPSAoaSkgPT4gK2RhdGFbaV07XG5cbiAgICAgIGlmIChpc09iamVjdChkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgY29uc3Qge2tleSA9ICd2YWx1ZSd9ID0gdGhpcy5fcGFyc2luZztcbiAgICAgICAgZ2V0dGVyID0gKGkpID0+ICtyZXNvbHZlT2JqZWN0S2V5KGRhdGFbaV0sIGtleSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgZm9yIChpID0gc3RhcnQsIGlsZW4gPSBzdGFydCArIGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICAgIG1ldGEuX3BhcnNlZFtpXSA9IGdldHRlcihpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRSb3RhdGlvbigpIHtcbiAgICByZXR1cm4gdG9SYWRpYW5zKHRoaXMub3B0aW9ucy5yb3RhdGlvbiAtIDkwKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldENpcmN1bWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY2lyY3VtZmVyZW5jZSk7XG4gIH1cblxuICAvKipcblx0ICogR2V0IHRoZSBtYXhpbWFsIHJvdGF0aW9uICYgY2lyY3VtZmVyZW5jZSBleHRlbnRzXG5cdCAqIGFjcm9zcyBhbGwgdmlzaWJsZSBkYXRhc2V0cy5cblx0ICovXG4gIF9nZXRSb3RhdGlvbkV4dGVudHMoKSB7XG4gICAgbGV0IG1pbiA9IFRBVTtcbiAgICBsZXQgbWF4ID0gLVRBVTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAodGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpICYmIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSkudHlwZSA9PT0gdGhpcy5fdHlwZSkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShpKS5jb250cm9sbGVyO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IGNvbnRyb2xsZXIuX2dldFJvdGF0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSBjb250cm9sbGVyLl9nZXRDaXJjdW1mZXJlbmNlKCk7XG5cbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCByb3RhdGlvbik7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgcm90YXRpb24gKyBjaXJjdW1mZXJlbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm90YXRpb246IG1pbixcbiAgICAgIGNpcmN1bWZlcmVuY2U6IG1heCAtIG1pbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlXG5cdCAqL1xuICB1cGRhdGUobW9kZSkge1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCB7Y2hhcnRBcmVhfSA9IGNoYXJ0O1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGFyY3MgPSBtZXRhLmRhdGE7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuZ2V0TWF4Qm9yZGVyV2lkdGgoKSArIHRoaXMuZ2V0TWF4T2Zmc2V0KGFyY3MpICsgdGhpcy5vcHRpb25zLnNwYWNpbmc7XG4gICAgY29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KChNYXRoLm1pbihjaGFydEFyZWEud2lkdGgsIGNoYXJ0QXJlYS5oZWlnaHQpIC0gc3BhY2luZykgLyAyLCAwKTtcbiAgICBjb25zdCBjdXRvdXQgPSBNYXRoLm1pbih0b1BlcmNlbnRhZ2UodGhpcy5vcHRpb25zLmN1dG91dCwgbWF4U2l6ZSksIDEpO1xuICAgIGNvbnN0IGNoYXJ0V2VpZ2h0ID0gdGhpcy5fZ2V0UmluZ1dlaWdodCh0aGlzLmluZGV4KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIG1heGltYWwgcm90YXRpb24gJiBjaXJjdW1mZXJlbmNlIGxpbWl0cy5cbiAgICAvLyBJZiB3ZSBvbmx5IGNvbnNpZGVyIG91ciBkYXRhc2V0LCB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyB3aGVuIHR3byBkYXRhc2V0c1xuICAgIC8vIGFyZSBib3RoIGxlc3MgdGhhbiBhIGNpcmNsZSB3aXRoIGRpZmZlcmVudCByb3RhdGlvbnMgKHN0YXJ0aW5nIGFuZ2xlcylcbiAgICBjb25zdCB7Y2lyY3VtZmVyZW5jZSwgcm90YXRpb259ID0gdGhpcy5fZ2V0Um90YXRpb25FeHRlbnRzKCk7XG4gICAgY29uc3Qge3JhdGlvWCwgcmF0aW9ZLCBvZmZzZXRYLCBvZmZzZXRZfSA9IGdldFJhdGlvQW5kT2Zmc2V0KHJvdGF0aW9uLCBjaXJjdW1mZXJlbmNlLCBjdXRvdXQpO1xuICAgIGNvbnN0IG1heFdpZHRoID0gKGNoYXJ0QXJlYS53aWR0aCAtIHNwYWNpbmcpIC8gcmF0aW9YO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IChjaGFydEFyZWEuaGVpZ2h0IC0gc3BhY2luZykgLyByYXRpb1k7XG4gICAgY29uc3QgbWF4UmFkaXVzID0gTWF0aC5tYXgoTWF0aC5taW4obWF4V2lkdGgsIG1heEhlaWdodCkgLyAyLCAwKTtcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IHRvRGltZW5zaW9uKHRoaXMub3B0aW9ucy5yYWRpdXMsIG1heFJhZGl1cyk7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSBNYXRoLm1heChvdXRlclJhZGl1cyAqIGN1dG91dCwgMCk7XG4gICAgY29uc3QgcmFkaXVzTGVuZ3RoID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gdGhpcy5fZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpO1xuICAgIHRoaXMub2Zmc2V0WCA9IG9mZnNldFggKiBvdXRlclJhZGl1cztcbiAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZICogb3V0ZXJSYWRpdXM7XG5cbiAgICBtZXRhLnRvdGFsID0gdGhpcy5jYWxjdWxhdGVUb3RhbCgpO1xuXG4gICAgdGhpcy5vdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIC0gcmFkaXVzTGVuZ3RoICogdGhpcy5fZ2V0UmluZ1dlaWdodE9mZnNldCh0aGlzLmluZGV4KTtcbiAgICB0aGlzLmlubmVyUmFkaXVzID0gTWF0aC5tYXgodGhpcy5vdXRlclJhZGl1cyAtIHJhZGl1c0xlbmd0aCAqIGNoYXJ0V2VpZ2h0LCAwKTtcblxuICAgIHRoaXMudXBkYXRlRWxlbWVudHMoYXJjcywgMCwgYXJjcy5sZW5ndGgsIG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2lyY3VtZmVyZW5jZShpLCByZXNldCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IHRoaXMuX2dldENpcmN1bWZlcmVuY2UoKTtcbiAgICBpZiAoKHJlc2V0ICYmIG9wdHMuYW5pbWF0aW9uLmFuaW1hdGVSb3RhdGUpIHx8ICF0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpIHx8IG1ldGEuX3BhcnNlZFtpXSA9PT0gbnVsbCB8fCBtZXRhLmRhdGFbaV0uaGlkZGVuKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2lyY3VtZmVyZW5jZShtZXRhLl9wYXJzZWRbaV0gKiBjaXJjdW1mZXJlbmNlIC8gVEFVKTtcbiAgfVxuXG4gIHVwZGF0ZUVsZW1lbnRzKGFyY3MsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuICAgIGNvbnN0IG9wdHMgPSBjaGFydC5vcHRpb25zO1xuICAgIGNvbnN0IGFuaW1hdGlvbk9wdHMgPSBvcHRzLmFuaW1hdGlvbjtcbiAgICBjb25zdCBjZW50ZXJYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IChjaGFydEFyZWEudG9wICsgY2hhcnRBcmVhLmJvdHRvbSkgLyAyO1xuICAgIGNvbnN0IGFuaW1hdGVTY2FsZSA9IHJlc2V0ICYmIGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVNjYWxlO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gYW5pbWF0ZVNjYWxlID8gMCA6IHRoaXMuaW5uZXJSYWRpdXM7XG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBhbmltYXRlU2NhbGUgPyAwIDogdGhpcy5vdXRlclJhZGl1cztcbiAgICBjb25zdCB7c2hhcmVkT3B0aW9ucywgaW5jbHVkZU9wdGlvbnN9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgbGV0IHN0YXJ0QW5nbGUgPSB0aGlzLl9nZXRSb3RhdGlvbigpO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0YXJ0OyArK2kpIHtcbiAgICAgIHN0YXJ0QW5nbGUgKz0gdGhpcy5fY2lyY3VtZmVyZW5jZShpLCByZXNldCk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpIHtcbiAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSB0aGlzLl9jaXJjdW1mZXJlbmNlKGksIHJlc2V0KTtcbiAgICAgIGNvbnN0IGFyYyA9IGFyY3NbaV07XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICB4OiBjZW50ZXJYICsgdGhpcy5vZmZzZXRYLFxuICAgICAgICB5OiBjZW50ZXJZICsgdGhpcy5vZmZzZXRZLFxuICAgICAgICBzdGFydEFuZ2xlLFxuICAgICAgICBlbmRBbmdsZTogc3RhcnRBbmdsZSArIGNpcmN1bWZlcmVuY2UsXG4gICAgICAgIGNpcmN1bWZlcmVuY2UsXG4gICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICBpbm5lclJhZGl1c1xuICAgICAgfTtcbiAgICAgIGlmIChpbmNsdWRlT3B0aW9ucykge1xuICAgICAgICBwcm9wZXJ0aWVzLm9wdGlvbnMgPSBzaGFyZWRPcHRpb25zIHx8IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBhcmMuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0QW5nbGUgKz0gY2lyY3VtZmVyZW5jZTtcblxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGFyYywgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlVG90YWwoKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgbWV0YURhdGEgPSBtZXRhLmRhdGE7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBtZXRhRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBtZXRhLl9wYXJzZWRbaV07XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgIWlzTmFOKHZhbHVlKSAmJiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpICYmICFtZXRhRGF0YVtpXS5oaWRkZW4pIHtcbiAgICAgICAgdG90YWwgKz0gTWF0aC5hYnModmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UodmFsdWUpIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuX2NhY2hlZE1ldGEudG90YWw7XG4gICAgaWYgKHRvdGFsID4gMCAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gVEFVICogKE1hdGguYWJzKHZhbHVlKSAvIHRvdGFsKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBnZXRMYWJlbEFuZFZhbHVlKGluZGV4KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IGxhYmVscyA9IGNoYXJ0LmRhdGEubGFiZWxzIHx8IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0TnVtYmVyKG1ldGEuX3BhcnNlZFtpbmRleF0sIGNoYXJ0Lm9wdGlvbnMubG9jYWxlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgIHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBnZXRNYXhCb3JkZXJXaWR0aChhcmNzKSB7XG4gICAgbGV0IG1heCA9IDA7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGxldCBpLCBpbGVuLCBtZXRhLCBjb250cm9sbGVyLCBvcHRpb25zO1xuXG4gICAgaWYgKCFhcmNzKSB7XG4gICAgICAvLyBGaW5kIHRoZSBvdXRtb3N0IHZpc2libGUgZGF0YXNldFxuICAgICAgZm9yIChpID0gMCwgaWxlbiA9IGNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICAgIGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG4gICAgICAgICAgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgIGFyY3MgPSBtZXRhLmRhdGE7XG4gICAgICAgICAgY29udHJvbGxlciA9IG1ldGEuY29udHJvbGxlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXJjcykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGFyY3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBvcHRpb25zID0gY29udHJvbGxlci5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO1xuICAgICAgaWYgKG9wdGlvbnMuYm9yZGVyQWxpZ24gIT09ICdpbm5lcicpIHtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBvcHRpb25zLmJvcmRlcldpZHRoIHx8IDAsIG9wdGlvbnMuaG92ZXJCb3JkZXJXaWR0aCB8fCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuXG4gIGdldE1heE9mZnNldChhcmNzKSB7XG4gICAgbGV0IG1heCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IGFyY3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBvcHRpb25zLm9mZnNldCB8fCAwLCBvcHRpb25zLmhvdmVyT2Zmc2V0IHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gbWF4O1xuICB9XG5cbiAgLyoqXG5cdCAqIEdldCByYWRpdXMgbGVuZ3RoIG9mZnNldCBvZiB0aGUgZGF0YXNldCBpbiByZWxhdGlvbiB0byB0aGUgdmlzaWJsZSBkYXRhc2V0cyB3ZWlnaHRzLiBUaGlzIGFsbG93cyBkZXRlcm1pbmluZyB0aGUgaW5uZXIgYW5kIG91dGVyIHJhZGl1cyBjb3JyZWN0bHlcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRSaW5nV2VpZ2h0T2Zmc2V0KGRhdGFzZXRJbmRleCkge1xuICAgIGxldCByaW5nV2VpZ2h0T2Zmc2V0ID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldEluZGV4OyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcbiAgICAgICAgcmluZ1dlaWdodE9mZnNldCArPSB0aGlzLl9nZXRSaW5nV2VpZ2h0KGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByaW5nV2VpZ2h0T2Zmc2V0O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0UmluZ1dlaWdodChkYXRhc2V0SW5kZXgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgodmFsdWVPckRlZmF1bHQodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0ud2VpZ2h0LCAxKSwgMCk7XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgc3VtIG9mIGFsbCB2aXNpYmxlIGRhdGEgc2V0IHdlaWdodHMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0UmluZ1dlaWdodE9mZnNldCh0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoKSB8fCAxO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge2lzTnVsbE9yVW5kZWZ9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHtpc051bWJlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuaW1wb3J0IHtfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cywgX3NjYWxlUmFuZ2VzQ2hhbmdlZH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmVDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuXG4gIHN0YXRpYyBpZCA9ICdsaW5lJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6ICdsaW5lJyxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG5cbiAgICBzaG93TGluZTogdHJ1ZSxcbiAgICBzcGFuR2FwczogZmFsc2UsXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIHNjYWxlczoge1xuICAgICAgX2luZGV4Xzoge1xuICAgICAgICB0eXBlOiAnY2F0ZWdvcnknLFxuICAgICAgfSxcbiAgICAgIF92YWx1ZV86IHtcbiAgICAgICAgdHlwZTogJ2xpbmVhcicsXG4gICAgICB9LFxuICAgIH1cbiAgfTtcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IHRydWU7XG4gICAgdGhpcy5zdXBwb3J0c0RlY2ltYXRpb24gPSB0cnVlO1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZShtb2RlKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3Qge2RhdGFzZXQ6IGxpbmUsIGRhdGE6IHBvaW50cyA9IFtdLCBfZGF0YXNldH0gPSBtZXRhO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBhbmltYXRpb25zRGlzYWJsZWQgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7XG4gICAgbGV0IHtzdGFydCwgY291bnR9ID0gX2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMobWV0YSwgcG9pbnRzLCBhbmltYXRpb25zRGlzYWJsZWQpO1xuXG4gICAgdGhpcy5fZHJhd1N0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5fZHJhd0NvdW50ID0gY291bnQ7XG5cbiAgICBpZiAoX3NjYWxlUmFuZ2VzQ2hhbmdlZChtZXRhKSkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgICAgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBMaW5lXG4gICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGxpbmUuX2RhdGFzZXRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgbGluZS5fZGVjaW1hdGVkID0gISFfZGF0YXNldC5fZGVjaW1hdGVkO1xuICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zaG93TGluZSkge1xuICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgfVxuICAgIG9wdGlvbnMuc2VnbWVudCA9IHRoaXMub3B0aW9ucy5zZWdtZW50O1xuICAgIHRoaXMudXBkYXRlRWxlbWVudChsaW5lLCB1bmRlZmluZWQsIHtcbiAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgb3B0aW9uc1xuICAgIH0sIG1vZGUpO1xuXG4gICAgLy8gVXBkYXRlIFBvaW50c1xuICAgIHRoaXMudXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2lTY2FsZSwgdlNjYWxlLCBfc3RhY2tlZCwgX2RhdGFzZXR9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCB7c2hhcmVkT3B0aW9ucywgaW5jbHVkZU9wdGlvbnN9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB2QXhpcyA9IHZTY2FsZS5heGlzO1xuICAgIGNvbnN0IHtzcGFuR2Fwcywgc2VnbWVudH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWF4R2FwTGVuZ3RoID0gaXNOdW1iZXIoc3BhbkdhcHMpID8gc3BhbkdhcHMgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgY29uc3QgZGlyZWN0VXBkYXRlID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkIHx8IHJlc2V0IHx8IG1vZGUgPT09ICdub25lJztcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGNvdW50O1xuICAgIGNvbnN0IHBvaW50c0NvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBsZXQgcHJldlBhcnNlZCA9IHN0YXJ0ID4gMCAmJiB0aGlzLmdldFBhcnNlZChzdGFydCAtIDEpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBkaXJlY3RVcGRhdGUgPyBwb2ludCA6IHt9O1xuXG4gICAgICBpZiAoaSA8IHN0YXJ0IHx8IGkgPj0gZW5kKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc2tpcCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpKTtcbiAgICAgIGNvbnN0IG51bGxEYXRhID0gaXNOdWxsT3JVbmRlZihwYXJzZWRbdkF4aXNdKTtcbiAgICAgIGNvbnN0IGlQaXhlbCA9IHByb3BlcnRpZXNbaUF4aXNdID0gaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUocGFyc2VkW2lBeGlzXSwgaSk7XG4gICAgICBjb25zdCB2UGl4ZWwgPSBwcm9wZXJ0aWVzW3ZBeGlzXSA9IHJlc2V0IHx8IG51bGxEYXRhID8gdlNjYWxlLmdldEJhc2VQaXhlbCgpIDogdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUoX3N0YWNrZWQgPyB0aGlzLmFwcGx5U3RhY2sodlNjYWxlLCBwYXJzZWQsIF9zdGFja2VkKSA6IHBhcnNlZFt2QXhpc10sIGkpO1xuXG4gICAgICBwcm9wZXJ0aWVzLnNraXAgPSBpc05hTihpUGl4ZWwpIHx8IGlzTmFOKHZQaXhlbCkgfHwgbnVsbERhdGE7XG4gICAgICBwcm9wZXJ0aWVzLnN0b3AgPSBpID4gMCAmJiAoTWF0aC5hYnMocGFyc2VkW2lBeGlzXSAtIHByZXZQYXJzZWRbaUF4aXNdKSkgPiBtYXhHYXBMZW5ndGg7XG4gICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBwcm9wZXJ0aWVzLnBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgcHJvcGVydGllcy5yYXcgPSBfZGF0YXNldC5kYXRhW2ldO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5jbHVkZU9wdGlvbnMpIHtcbiAgICAgICAgcHJvcGVydGllcy5vcHRpb25zID0gc2hhcmVkT3B0aW9ucyB8fCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgcG9pbnQuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaXJlY3RVcGRhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHBvaW50LCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgIH1cblxuICAgICAgcHJldlBhcnNlZCA9IHBhcnNlZDtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgZGF0YXNldCA9IG1ldGEuZGF0YXNldDtcbiAgICBjb25zdCBib3JkZXIgPSBkYXRhc2V0Lm9wdGlvbnMgJiYgZGF0YXNldC5vcHRpb25zLmJvcmRlcldpZHRoIHx8IDA7XG4gICAgY29uc3QgZGF0YSA9IG1ldGEuZGF0YSB8fCBbXTtcbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYm9yZGVyO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdFBvaW50ID0gZGF0YVswXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucygwKSk7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdLnNpemUodGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGRhdGEubGVuZ3RoIC0gMSkpO1xuICAgIHJldHVybiBNYXRoLm1heChib3JkZXIsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCkgLyAyO1xuICB9XG5cbiAgZHJhdygpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBtZXRhLmRhdGFzZXQudXBkYXRlQ29udHJvbFBvaW50cyh0aGlzLmNoYXJ0LmNoYXJ0QXJlYSwgbWV0YS5pU2NhbGUuYXhpcyk7XG4gICAgc3VwZXIuZHJhdygpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge3RvUmFkaWFucywgUEksIGZvcm1hdE51bWJlciwgX3BhcnNlT2JqZWN0RGF0YVJhZGlhbFNjYWxlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9sYXJBcmVhQ29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcblxuICBzdGF0aWMgaWQgPSAncG9sYXJBcmVhJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdhcmMnLFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgYW5pbWF0ZVJvdGF0ZTogdHJ1ZSxcbiAgICAgIGFuaW1hdGVTY2FsZTogdHJ1ZVxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgbnVtYmVyczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgcHJvcGVydGllczogWyd4JywgJ3knLCAnc3RhcnRBbmdsZScsICdlbmRBbmdsZScsICdpbm5lclJhZGl1cycsICdvdXRlclJhZGl1cyddXG4gICAgICB9LFxuICAgIH0sXG4gICAgaW5kZXhBeGlzOiAncicsXG4gICAgc3RhcnRBbmdsZTogMCxcbiAgfTtcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgYXNwZWN0UmF0aW86IDEsXG5cbiAgICBwbHVnaW5zOiB7XG4gICAgICBsZWdlbmQ6IHtcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgZ2VuZXJhdGVMYWJlbHMoY2hhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaGFydC5kYXRhO1xuICAgICAgICAgICAgaWYgKGRhdGEubGFiZWxzLmxlbmd0aCAmJiBkYXRhLmRhdGFzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB7bGFiZWxzOiB7cG9pbnRTdHlsZSwgY29sb3J9fSA9IGNoYXJ0LmxlZ2VuZC5vcHRpb25zO1xuXG4gICAgICAgICAgICAgIHJldHVybiBkYXRhLmxhYmVscy5tYXAoKGxhYmVsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKGkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgICAgICBzdHJva2VTdHlsZTogc3R5bGUuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICBmb250Q29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgICAgICAgbGluZVdpZHRoOiBzdHlsZS5ib3JkZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgIHBvaW50U3R5bGU6IHBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgICBoaWRkZW46ICFjaGFydC5nZXREYXRhVmlzaWJpbGl0eShpKSxcblxuICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgY29ycmVjdCBpdGVtXG4gICAgICAgICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkNsaWNrKGUsIGxlZ2VuZEl0ZW0sIGxlZ2VuZCkge1xuICAgICAgICAgIGxlZ2VuZC5jaGFydC50b2dnbGVEYXRhVmlzaWJpbGl0eShsZWdlbmRJdGVtLmluZGV4KTtcbiAgICAgICAgICBsZWdlbmQuY2hhcnQudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2NhbGVzOiB7XG4gICAgICByOiB7XG4gICAgICAgIHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuICAgICAgICBhbmdsZUxpbmVzOiB7XG4gICAgICAgICAgZGlzcGxheTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXG4gICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICBjaXJjdWxhcjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwb2ludExhYmVsczoge1xuICAgICAgICAgIGRpc3BsYXk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0QW5nbGU6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IoY2hhcnQsIGRhdGFzZXRJbmRleCkge1xuICAgIHN1cGVyKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xuXG4gICAgdGhpcy5pbm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCBsYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IGZvcm1hdE51bWJlcihtZXRhLl9wYXJzZWRbaW5kZXhdLnIsIGNoYXJ0Lm9wdGlvbnMubG9jYWxlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgIHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgcmV0dXJuIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZS5iaW5kKHRoaXMpKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gIH1cblxuICB1cGRhdGUobW9kZSkge1xuICAgIGNvbnN0IGFyY3MgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG5cbiAgICB0aGlzLl91cGRhdGVSYWRpdXMoKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGFyY3MsIDAsIGFyY3MubGVuZ3RoLCBtb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBnZXRNaW5NYXgoKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgcmFuZ2UgPSB7bWluOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1heDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZfTtcblxuICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpLnI7XG5cbiAgICAgIGlmICghaXNOYU4ocGFyc2VkKSAmJiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGluZGV4KSkge1xuICAgICAgICBpZiAocGFyc2VkIDwgcmFuZ2UubWluKSB7XG4gICAgICAgICAgcmFuZ2UubWluID0gcGFyc2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlZCA+IHJhbmdlLm1heCkge1xuICAgICAgICAgIHJhbmdlLm1heCA9IHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlUmFkaXVzKCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgY29uc3Qgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XG4gICAgY29uc3QgbWluU2l6ZSA9IE1hdGgubWluKGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCk7XG5cbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IE1hdGgubWF4KG1pblNpemUgLyAyLCAwKTtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IE1hdGgubWF4KG9wdHMuY3V0b3V0UGVyY2VudGFnZSA/IChvdXRlclJhZGl1cyAvIDEwMCkgKiAob3B0cy5jdXRvdXRQZXJjZW50YWdlKSA6IDEsIDApO1xuICAgIGNvbnN0IHJhZGl1c0xlbmd0aCA9IChvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzKSAvIGNoYXJ0LmdldFZpc2libGVEYXRhc2V0Q291bnQoKTtcblxuICAgIHRoaXMub3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyAtIChyYWRpdXNMZW5ndGggKiB0aGlzLmluZGV4KTtcbiAgICB0aGlzLmlubmVyUmFkaXVzID0gdGhpcy5vdXRlclJhZGl1cyAtIHJhZGl1c0xlbmd0aDtcbiAgfVxuXG4gIHVwZGF0ZUVsZW1lbnRzKGFyY3MsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3Qgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XG4gICAgY29uc3QgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fY2FjaGVkTWV0YS5yU2NhbGU7XG4gICAgY29uc3QgY2VudGVyWCA9IHNjYWxlLnhDZW50ZXI7XG4gICAgY29uc3QgY2VudGVyWSA9IHNjYWxlLnlDZW50ZXI7XG4gICAgY29uc3QgZGF0YXNldFN0YXJ0QW5nbGUgPSBzY2FsZS5nZXRJbmRleEFuZ2xlKDApIC0gMC41ICogUEk7XG4gICAgbGV0IGFuZ2xlID0gZGF0YXNldFN0YXJ0QW5nbGU7XG4gICAgbGV0IGk7XG5cbiAgICBjb25zdCBkZWZhdWx0QW5nbGUgPSAzNjAgLyB0aGlzLmNvdW50VmlzaWJsZUVsZW1lbnRzKCk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RhcnQ7ICsraSkge1xuICAgICAgYW5nbGUgKz0gdGhpcy5fY29tcHV0ZUFuZ2xlKGksIG1vZGUsIGRlZmF1bHRBbmdsZSk7XG4gICAgfVxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmMgPSBhcmNzW2ldO1xuICAgICAgbGV0IHN0YXJ0QW5nbGUgPSBhbmdsZTtcbiAgICAgIGxldCBlbmRBbmdsZSA9IGFuZ2xlICsgdGhpcy5fY29tcHV0ZUFuZ2xlKGksIG1vZGUsIGRlZmF1bHRBbmdsZSk7XG4gICAgICBsZXQgb3V0ZXJSYWRpdXMgPSBjaGFydC5nZXREYXRhVmlzaWJpbGl0eShpKSA/IHNjYWxlLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKGkpLnIpIDogMDtcbiAgICAgIGFuZ2xlID0gZW5kQW5nbGU7XG5cbiAgICAgIGlmIChyZXNldCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUpIHtcbiAgICAgICAgICBvdXRlclJhZGl1cyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVJvdGF0ZSkge1xuICAgICAgICAgIHN0YXJ0QW5nbGUgPSBlbmRBbmdsZSA9IGRhdGFzZXRTdGFydEFuZ2xlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgIHg6IGNlbnRlclgsXG4gICAgICAgIHk6IGNlbnRlclksXG4gICAgICAgIGlubmVyUmFkaXVzOiAwLFxuICAgICAgICBvdXRlclJhZGl1cyxcbiAgICAgICAgc3RhcnRBbmdsZSxcbiAgICAgICAgZW5kQW5nbGUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBhcmMuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKVxuICAgICAgfTtcblxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGFyYywgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgfVxuICB9XG5cbiAgY291bnRWaXNpYmxlRWxlbWVudHMoKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpc05hTih0aGlzLmdldFBhcnNlZChpbmRleCkucikgJiYgdGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShpbmRleCkpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbXB1dGVBbmdsZShpbmRleCwgbW9kZSwgZGVmYXVsdEFuZ2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaW5kZXgpXG4gICAgICA/IHRvUmFkaWFucyh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpLmFuZ2xlIHx8IGRlZmF1bHRBbmdsZSlcbiAgICAgIDogMDtcbiAgfVxufVxuIiwgImltcG9ydCBEb3VnaG51dENvbnRyb2xsZXIgZnJvbSAnLi9jb250cm9sbGVyLmRvdWdobnV0LmpzJztcblxuLy8gUGllIGNoYXJ0cyBhcmUgRG91Z2hudXQgY2hhcnQgd2l0aCBkaWZmZXJlbnQgZGVmYXVsdHNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpZUNvbnRyb2xsZXIgZXh0ZW5kcyBEb3VnaG51dENvbnRyb2xsZXIge1xuXG4gIHN0YXRpYyBpZCA9ICdwaWUnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBjaGFydCB0aGF0IHdlIGN1dCBvdXQgb2YgdGhlIG1pZGRsZS5cbiAgICBjdXRvdXQ6IDAsXG5cbiAgICAvLyBUaGUgcm90YXRpb24gb2YgdGhlIGNoYXJ0LCB3aGVyZSB0aGUgZmlyc3QgZGF0YSBhcmMgYmVnaW5zLlxuICAgIHJvdGF0aW9uOiAwLFxuXG4gICAgLy8gVGhlIHRvdGFsIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGNoYXJ0LlxuICAgIGNpcmN1bWZlcmVuY2U6IDM2MCxcblxuICAgIC8vIFRoZSBvdXRyIHJhZGl1cyBvZiB0aGUgY2hhcnRcbiAgICByYWRpdXM6ICcxMDAlJ1xuICB9O1xufVxuIiwgImltcG9ydCBEYXRhc2V0Q29udHJvbGxlciBmcm9tICcuLi9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHtfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGV9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRhckNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgc3RhdGljIGlkID0gJ3JhZGFyJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6ICdsaW5lJyxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgaW5kZXhBeGlzOiAncicsXG4gICAgc2hvd0xpbmU6IHRydWUsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGxpbmU6IHtcbiAgICAgICAgZmlsbDogJ3N0YXJ0J1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIGFzcGVjdFJhdGlvOiAxLFxuXG4gICAgc2NhbGVzOiB7XG4gICAgICByOiB7XG4gICAgICAgIHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IHZTY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEudlNjYWxlO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogdlNjYWxlLmdldExhYmVscygpW2luZGV4XSxcbiAgICAgIHZhbHVlOiAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pXG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICByZXR1cm4gX3BhcnNlT2JqZWN0RGF0YVJhZGlhbFNjYWxlLmJpbmQodGhpcykobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgfVxuXG4gIHVwZGF0ZShtb2RlKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgbGluZSA9IG1ldGEuZGF0YXNldDtcbiAgICBjb25zdCBwb2ludHMgPSBtZXRhLmRhdGEgfHwgW107XG4gICAgY29uc3QgbGFiZWxzID0gbWV0YS5pU2NhbGUuZ2V0TGFiZWxzKCk7XG5cbiAgICAvLyBVcGRhdGUgTGluZVxuICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuICAgIC8vIEluIHJlc2l6ZSBtb2RlIG9ubHkgcG9pbnQgbG9jYXRpb25zIGNoYW5nZSwgc28gbm8gbmVlZCB0byBzZXQgdGhlIHBvaW50cyBvciBvcHRpb25zLlxuICAgIGlmIChtb2RlICE9PSAncmVzaXplJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICBfbG9vcDogdHJ1ZSxcbiAgICAgICAgX2Z1bGxMb29wOiBsYWJlbHMubGVuZ3RoID09PSBwb2ludHMubGVuZ3RoLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQobGluZSwgdW5kZWZpbmVkLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgUG9pbnRzXG4gICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIDAsIHBvaW50cy5sZW5ndGgsIG1vZGUpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEuclNjYWxlO1xuICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICBjb25zdCBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGksIHRoaXMuZ2V0UGFyc2VkKGkpLnIpO1xuXG4gICAgICBjb25zdCB4ID0gcmVzZXQgPyBzY2FsZS54Q2VudGVyIDogcG9pbnRQb3NpdGlvbi54O1xuICAgICAgY29uc3QgeSA9IHJlc2V0ID8gc2NhbGUueUNlbnRlciA6IHBvaW50UG9zaXRpb24ueTtcblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgYW5nbGU6IHBvaW50UG9zaXRpb24uYW5nbGUsXG4gICAgICAgIHNraXA6IGlzTmFOKHgpIHx8IGlzTmFOKHkpLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQocG9pbnQsIGksIHByb3BlcnRpZXMsIG1vZGUpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBEYXRhc2V0Q29udHJvbGxlciBmcm9tICcuLi9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHtpc051bGxPclVuZGVmfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7X2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMsIF9zY2FsZVJhbmdlc0NoYW5nZWR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5leHRyYXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2F0dGVyQ29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcblxuICBzdGF0aWMgaWQgPSAnc2NhdHRlcic7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGF0YXNldEVsZW1lbnRUeXBlOiBmYWxzZSxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgc2hvd0xpbmU6IGZhbHNlLFxuICAgIGZpbGw6IGZhbHNlXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuXG4gICAgaW50ZXJhY3Rpb246IHtcbiAgICAgIG1vZGU6ICdwb2ludCdcbiAgICB9LFxuXG4gICAgc2NhbGVzOiB7XG4gICAgICB4OiB7XG4gICAgICAgIHR5cGU6ICdsaW5lYXInXG4gICAgICB9LFxuICAgICAgeToge1xuICAgICAgICB0eXBlOiAnbGluZWFyJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuY2hhcnQuZGF0YS5sYWJlbHMgfHwgW107XG4gICAgY29uc3Qge3hTY2FsZSwgeVNjYWxlfSA9IG1ldGE7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgIGNvbnN0IHggPSB4U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueCk7XG4gICAgY29uc3QgeSA9IHlTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZC55KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgIHZhbHVlOiAnKCcgKyB4ICsgJywgJyArIHkgKyAnKSdcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCB7ZGF0YTogcG9pbnRzID0gW119ID0gbWV0YTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgYW5pbWF0aW9uc0Rpc2FibGVkID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkO1xuICAgIGxldCB7c3RhcnQsIGNvdW50fSA9IF9nZXRTdGFydEFuZENvdW50T2ZWaXNpYmxlUG9pbnRzKG1ldGEsIHBvaW50cywgYW5pbWF0aW9uc0Rpc2FibGVkKTtcblxuICAgIHRoaXMuX2RyYXdTdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX2RyYXdDb3VudCA9IGNvdW50O1xuXG4gICAgaWYgKF9zY2FsZVJhbmdlc0NoYW5nZWQobWV0YSkpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG5cbiAgICAgIGNvbnN0IHtkYXRhc2V0OiBsaW5lLCBfZGF0YXNldH0gPSBtZXRhO1xuXG4gICAgICAvLyBVcGRhdGUgTGluZVxuICAgICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgbGluZS5fZGF0YXNldEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIGxpbmUuX2RlY2ltYXRlZCA9ICEhX2RhdGFzZXQuX2RlY2ltYXRlZDtcbiAgICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKG1vZGUpO1xuICAgICAgb3B0aW9ucy5zZWdtZW50ID0gdGhpcy5vcHRpb25zLnNlZ21lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQobGluZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9LCBtb2RlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgUG9pbnRzXG4gICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIHN0YXJ0LCBjb3VudCwgbW9kZSk7XG4gIH1cblxuICBhZGRFbGVtZW50cygpIHtcbiAgICBjb25zdCB7c2hvd0xpbmV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKCF0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSAmJiBzaG93TGluZSkge1xuICAgICAgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgPSB0aGlzLmNoYXJ0LnJlZ2lzdHJ5LmdldEVsZW1lbnQoJ2xpbmUnKTtcbiAgICB9XG5cbiAgICBzdXBlci5hZGRFbGVtZW50cygpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2lTY2FsZSwgdlNjYWxlLCBfc3RhY2tlZCwgX2RhdGFzZXR9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBmaXJzdE9wdHMgPSB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoc3RhcnQsIG1vZGUpO1xuICAgIGNvbnN0IHNoYXJlZE9wdGlvbnMgPSB0aGlzLmdldFNoYXJlZE9wdGlvbnMoZmlyc3RPcHRzKTtcbiAgICBjb25zdCBpbmNsdWRlT3B0aW9ucyA9IHRoaXMuaW5jbHVkZU9wdGlvbnMobW9kZSwgc2hhcmVkT3B0aW9ucyk7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB2QXhpcyA9IHZTY2FsZS5heGlzO1xuICAgIGNvbnN0IHtzcGFuR2Fwcywgc2VnbWVudH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWF4R2FwTGVuZ3RoID0gaXNOdW1iZXIoc3BhbkdhcHMpID8gc3BhbkdhcHMgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgY29uc3QgZGlyZWN0VXBkYXRlID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkIHx8IHJlc2V0IHx8IG1vZGUgPT09ICdub25lJztcbiAgICBsZXQgcHJldlBhcnNlZCA9IHN0YXJ0ID4gMCAmJiB0aGlzLmdldFBhcnNlZChzdGFydCAtIDEpO1xuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGRpcmVjdFVwZGF0ZSA/IHBvaW50IDoge307XG4gICAgICBjb25zdCBudWxsRGF0YSA9IGlzTnVsbE9yVW5kZWYocGFyc2VkW3ZBeGlzXSk7XG4gICAgICBjb25zdCBpUGl4ZWwgPSBwcm9wZXJ0aWVzW2lBeGlzXSA9IGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFtpQXhpc10sIGkpO1xuICAgICAgY29uc3QgdlBpeGVsID0gcHJvcGVydGllc1t2QXhpc10gPSByZXNldCB8fCBudWxsRGF0YSA/IHZTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKF9zdGFja2VkID8gdGhpcy5hcHBseVN0YWNrKHZTY2FsZSwgcGFyc2VkLCBfc3RhY2tlZCkgOiBwYXJzZWRbdkF4aXNdLCBpKTtcblxuICAgICAgcHJvcGVydGllcy5za2lwID0gaXNOYU4oaVBpeGVsKSB8fCBpc05hTih2UGl4ZWwpIHx8IG51bGxEYXRhO1xuICAgICAgcHJvcGVydGllcy5zdG9wID0gaSA+IDAgJiYgKE1hdGguYWJzKHBhcnNlZFtpQXhpc10gLSBwcmV2UGFyc2VkW2lBeGlzXSkpID4gbWF4R2FwTGVuZ3RoO1xuICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgcHJvcGVydGllcy5wYXJzZWQgPSBwYXJzZWQ7XG4gICAgICAgIHByb3BlcnRpZXMucmF3ID0gX2RhdGFzZXQuZGF0YVtpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlyZWN0VXBkYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChwb2ludCwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICB9XG5cbiAgICAgIHByZXZQYXJzZWQgPSBwYXJzZWQ7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTaGFyZWRPcHRpb25zKHNoYXJlZE9wdGlvbnMsIG1vZGUsIGZpcnN0T3B0cyk7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgZGF0YSA9IG1ldGEuZGF0YSB8fCBbXTtcblxuICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICBsZXQgbWF4ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZGF0YVtpXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpKSkgLyAyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXggPiAwICYmIG1heDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gbWV0YS5kYXRhc2V0O1xuICAgIGNvbnN0IGJvcmRlciA9IGRhdGFzZXQub3B0aW9ucyAmJiBkYXRhc2V0Lm9wdGlvbnMuYm9yZGVyV2lkdGggfHwgMDtcblxuICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBib3JkZXI7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RQb2ludCA9IGRhdGFbMF0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoMCkpO1xuICAgIGNvbnN0IGxhc3RQb2ludCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhkYXRhLmxlbmd0aCAtIDEpKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoYm9yZGVyLCBmaXJzdFBvaW50LCBsYXN0UG9pbnQpIC8gMjtcbiAgfVxufVxuIiwgIi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5fYWRhcHRlcnNcbiAqIEBzaW5jZSAyLjguMFxuICogQHByaXZhdGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7QW55T2JqZWN0fSBmcm9tICcuLi90eXBlcy9iYXNpYy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhcnRPcHRpb25zfSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB0eXBlIFRpbWVVbml0ID0gJ21pbGxpc2Vjb25kJyB8ICdzZWNvbmQnIHwgJ21pbnV0ZScgfCAnaG91cicgfCAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCcgfCAncXVhcnRlcicgfCAneWVhcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZUFkYXB0ZXI8VCBleHRlbmRzIEFueU9iamVjdCA9IEFueU9iamVjdD4ge1xuICByZWFkb25seSBvcHRpb25zOiBUO1xuICAvKipcbiAgICogV2lsbCBjYWxsZWQgd2l0aCBjaGFydCBvcHRpb25zIGFmdGVyIGFkYXB0ZXIgY3JlYXRpb24uXG4gICAqL1xuICBpbml0KHRoaXM6IERhdGVBZGFwdGVyPFQ+LCBjaGFydE9wdGlvbnM6IENoYXJ0T3B0aW9ucyk6IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIHRpbWUgZm9ybWF0cyBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXR0aW5nIHVuaXRzIGRlZmluZWRcbiAgICogaW4gVW5pdCBhcyB3ZWxsIGFzICdkYXRldGltZScgcmVwcmVzZW50aW5nIGEgZGV0YWlsZWQgZGF0ZS90aW1lIHN0cmluZy5cbiAgICovXG4gIGZvcm1hdHModGhpczogRGF0ZUFkYXB0ZXI8VD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogUGFyc2VzIHRoZSBnaXZlbiBgdmFsdWVgIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gcGFyc2UgKHVzdWFsbHkgY29tZXMgZnJvbSB0aGUgZGF0YSlcbiAgICogQHBhcmFtIFtmb3JtYXRdIC0gdGhlIGV4cGVjdGVkIGRhdGEgZm9ybWF0XG4gICAqL1xuICBwYXJzZSh0aGlzOiBEYXRlQWRhcHRlcjxUPiwgdmFsdWU6IHVua25vd24sIGZvcm1hdD86IFRpbWVVbml0KTogbnVtYmVyIHwgbnVsbDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBkYXRlIGluIHRoZSBzcGVjaWZpZWQgYGZvcm1hdGAgZm9yIGEgZ2l2ZW4gYHRpbWVzdGFtcGAuXG4gICAqIEBwYXJhbSB0aW1lc3RhbXAgLSB0aGUgdGltZXN0YW1wIHRvIGZvcm1hdFxuICAgKiBAcGFyYW0gZm9ybWF0IC0gdGhlIGRhdGUvdGltZSB0b2tlblxuICAgKi9cbiAgZm9ybWF0KHRoaXM6IERhdGVBZGFwdGVyPFQ+LCB0aW1lc3RhbXA6IG51bWJlciwgZm9ybWF0OiBUaW1lVW5pdCk6IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZHMgdGhlIHNwZWNpZmllZCBgYW1vdW50YCBvZiBgdW5pdGAgdG8gdGhlIGdpdmVuIGB0aW1lc3RhbXBgLlxuICAgKiBAcGFyYW0gdGltZXN0YW1wIC0gdGhlIGlucHV0IHRpbWVzdGFtcFxuICAgKiBAcGFyYW0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBhZGRcbiAgICogQHBhcmFtIHVuaXQgLSB0aGUgdW5pdCBhcyBzdHJpbmdcbiAgICovXG4gIGFkZCh0aGlzOiBEYXRlQWRhcHRlcjxUPiwgdGltZXN0YW1wOiBudW1iZXIsIGFtb3VudDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBgdW5pdGAgYmV0d2VlbiB0aGUgZ2l2ZW4gdGltZXN0YW1wcy5cbiAgICogQHBhcmFtIGEgLSB0aGUgaW5wdXQgdGltZXN0YW1wIChyZWZlcmVuY2UpXG4gICAqIEBwYXJhbSBiIC0gdGhlIHRpbWVzdGFtcCB0byBzdWJ0cmFjdFxuICAgKiBAcGFyYW0gdW5pdCAtIHRoZSB1bml0IGFzIHN0cmluZ1xuICAgKi9cbiAgZGlmZih0aGlzOiBEYXRlQWRhcHRlcjxUPiwgYTogbnVtYmVyLCBiOiBudW1iZXIsIHVuaXQ6IFRpbWVVbml0KTogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJucyBzdGFydCBvZiBgdW5pdGAgZm9yIHRoZSBnaXZlbiBgdGltZXN0YW1wYC5cbiAgICogQHBhcmFtIHRpbWVzdGFtcCAtIHRoZSBpbnB1dCB0aW1lc3RhbXBcbiAgICogQHBhcmFtIHVuaXQgLSB0aGUgdW5pdCBhcyBzdHJpbmdcbiAgICogQHBhcmFtIFt3ZWVrZGF5XSAtIHRoZSBJU08gZGF5IG9mIHRoZSB3ZWVrIHdpdGggMSBiZWluZyBNb25kYXlcbiAgICogYW5kIDcgYmVpbmcgU3VuZGF5IChvbmx5IG5lZWRlZCBpZiBwYXJhbSAqdW5pdCogaXMgYGlzb1dlZWtgKS5cbiAgICovXG4gIHN0YXJ0T2YodGhpczogRGF0ZUFkYXB0ZXI8VD4sIHRpbWVzdGFtcDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCB8ICdpc29XZWVrJywgd2Vla2RheT86IG51bWJlcik6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybnMgZW5kIG9mIGB1bml0YCBmb3IgdGhlIGdpdmVuIGB0aW1lc3RhbXBgLlxuICAgKiBAcGFyYW0gdGltZXN0YW1wIC0gdGhlIGlucHV0IHRpbWVzdGFtcFxuICAgKiBAcGFyYW0gdW5pdCAtIHRoZSB1bml0IGFzIHN0cmluZ1xuICAgKi9cbiAgZW5kT2YodGhpczogRGF0ZUFkYXB0ZXI8VD4sIHRpbWVzdGFtcDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCB8ICdpc29XZWVrJyk6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gYWJzdHJhY3Q8VCA9IHZvaWQ+KCk6IFQge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZDogQ2hlY2sgdGhhdCBhIGNvbXBsZXRlIGRhdGUgYWRhcHRlciBpcyBwcm92aWRlZC4nKTtcbn1cblxuLyoqXG4gKiBEYXRlIGFkYXB0ZXIgKGN1cnJlbnQgdXNlZCBieSB0aGUgdGltZSBzY2FsZSlcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuX2FkYXB0ZXJzLl9kYXRlXG4gKiBAbWVtYmVyb2YgQ2hhcnQuX2FkYXB0ZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBEYXRlQWRhcHRlckJhc2UgaW1wbGVtZW50cyBEYXRlQWRhcHRlciB7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgZGF0ZSBhZGFwdGVyIG1ldGhvZHMuXG4gICAqIEFjY2VwdHMgdHlwZSBwYXJhbWV0ZXIgdG8gZGVmaW5lIG9wdGlvbnMgdHlwZS5cbiAgICogQGV4YW1wbGVcbiAgICogQ2hhcnQuX2FkYXB0ZXJzLl9kYXRlLm92ZXJyaWRlPHtteUFkYXB0ZXJPcHRpb246IHN0cmluZ30+KHtcbiAgICogICBpbml0KCkge1xuICAgKiAgICAgY29uc29sZS5sb2codGhpcy5vcHRpb25zLm15QWRhcHRlck9wdGlvbik7XG4gICAqICAgfVxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlPFQgZXh0ZW5kcyBBbnlPYmplY3QgPSBBbnlPYmplY3Q+KFxuICAgIG1lbWJlcnM6IFBhcnRpYWw8T21pdDxEYXRlQWRhcHRlcjxUPiwgJ29wdGlvbnMnPj5cbiAgKSB7XG4gICAgT2JqZWN0LmFzc2lnbihEYXRlQWRhcHRlckJhc2UucHJvdG90eXBlLCBtZW1iZXJzKTtcbiAgfVxuXG4gIHJlYWRvbmx5IG9wdGlvbnM6IEFueU9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBbnlPYmplY3QpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBpbml0KCkge31cblxuICBmb3JtYXRzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgcGFyc2UoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gIH1cblxuICBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgfVxuXG4gIGFkZCgpOiBudW1iZXIge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgZGlmZigpOiBudW1iZXIge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgc3RhcnRPZigpOiBudW1iZXIge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgZW5kT2YoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9kYXRlOiBEYXRlQWRhcHRlckJhc2Vcbn07XG4iLCAiaW1wb3J0IHtfbG9va3VwQnlLZXksIF9ybG9va3VwQnlLZXl9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7Z2V0UmVsYXRpdmVQb3NpdGlvbn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmRvbS5qcyc7XG5pbXBvcnQge19hbmdsZUJldHdlZW4sIGdldEFuZ2xlRnJvbVBvaW50fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5pbXBvcnQge19pc1BvaW50SW5BcmVhfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLkNoYXJ0RXZlbnQgfSBDaGFydEV2ZW50XG4gKiBAdHlwZWRlZiB7e2F4aXM/OiBzdHJpbmcsIGludGVyc2VjdD86IGJvb2xlYW4sIGluY2x1ZGVJbnZpc2libGU/OiBib29sZWFufX0gSW50ZXJhY3Rpb25PcHRpb25zXG4gKiBAdHlwZWRlZiB7e2RhdGFzZXRJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCBlbGVtZW50OiBpbXBvcnQoJy4vY29yZS5lbGVtZW50LmpzJykuZGVmYXVsdH19IEludGVyYWN0aW9uSXRlbVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL3R5cGVzL2luZGV4LmpzJykuUG9pbnQgfSBQb2ludFxuICovXG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRvIGJpbmFyeSBzZWFyY2ggd2hlbiBwb3NzaWJsZVxuICogQHBhcmFtIHtvYmplY3R9IG1ldGFzZXQgLSB0aGUgZGF0YXNldCBtZXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGlzIG1vZGUuIHh8eXx4eXxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gZmluZFxuICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJzZWN0XSAtIHNob3VsZCB0aGUgZWxlbWVudCBpbnRlcnNlY3RcbiAqIEByZXR1cm5zIHt7bG86bnVtYmVyLCBoaTpudW1iZXJ9fSBpbmRpY2VzIHRvIHNlYXJjaCBkYXRhIGFycmF5IGJldHdlZW5cbiAqL1xuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKG1ldGFzZXQsIGF4aXMsIHZhbHVlLCBpbnRlcnNlY3QpIHtcbiAgY29uc3Qge2NvbnRyb2xsZXIsIGRhdGEsIF9zb3J0ZWR9ID0gbWV0YXNldDtcbiAgY29uc3QgaVNjYWxlID0gY29udHJvbGxlci5fY2FjaGVkTWV0YS5pU2NhbGU7XG4gIGlmIChpU2NhbGUgJiYgYXhpcyA9PT0gaVNjYWxlLmF4aXMgJiYgYXhpcyAhPT0gJ3InICYmIF9zb3J0ZWQgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICBjb25zdCBsb29rdXBNZXRob2QgPSBpU2NhbGUuX3JldmVyc2VQaXhlbHMgPyBfcmxvb2t1cEJ5S2V5IDogX2xvb2t1cEJ5S2V5O1xuICAgIGlmICghaW50ZXJzZWN0KSB7XG4gICAgICByZXR1cm4gbG9va3VwTWV0aG9kKGRhdGEsIGF4aXMsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIuX3NoYXJlZE9wdGlvbnMpIHtcbiAgICAgIC8vIF9zaGFyZWRPcHRpb25zIGluZGljYXRlcyB0aGF0IGVhY2ggZWxlbWVudCBoYXMgZXF1YWwgb3B0aW9ucyAtPiBlcXVhbCBwcm9wb3J0aW9uc1xuICAgICAgLy8gU28gd2UgY2FuIGRvIGEgcmFuZ2VkIGJpbmFyeSBzZWFyY2ggYmFzZWQgb24gdGhlIHJhbmdlIG9mIGZpcnN0IGVsZW1lbnQgYW5kXG4gICAgICAvLyBiZSBjb25maWRlbnQgdG8gZ2V0IHRoZSBmdWxsIHJhbmdlIG9mIGluZGljZXMgdGhhdCBjYW4gaW50ZXJzZWN0IHdpdGggdGhlIHZhbHVlLlxuICAgICAgY29uc3QgZWwgPSBkYXRhWzBdO1xuICAgICAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgZWwuZ2V0UmFuZ2UgPT09ICdmdW5jdGlvbicgJiYgZWwuZ2V0UmFuZ2UoYXhpcyk7XG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBsb29rdXBNZXRob2QoZGF0YSwgYXhpcywgdmFsdWUgLSByYW5nZSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGxvb2t1cE1ldGhvZChkYXRhLCBheGlzLCB2YWx1ZSArIHJhbmdlKTtcbiAgICAgICAgcmV0dXJuIHtsbzogc3RhcnQubG8sIGhpOiBlbmQuaGl9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBEZWZhdWx0IHRvIGFsbCBlbGVtZW50cywgd2hlbiBiaW5hcnkgc2VhcmNoIGNhbiBub3QgYmUgdXNlZC5cbiAgcmV0dXJuIHtsbzogMCwgaGk6IGRhdGEubGVuZ3RoIC0gMX07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHNlbGVjdCBjYW5kaWRhdGUgZWxlbWVudHMgZm9yIGludGVyYWN0aW9uXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuICogQHBhcmFtIHtzdHJpbmd9IGF4aXMgLSB0aGUgYXhpcyBtb2RlLiB4fHl8eHl8clxuICogQHBhcmFtIHtQb2ludH0gcG9zaXRpb24gLSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0bywgaW4gcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSB0aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBmb3IgZWFjaCB2aXNpYmxlIGl0ZW1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVyc2VjdF0gLSBjb25zaWRlciBpbnRlcnNlY3RpbmcgaXRlbXNcbiAqL1xuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgaGFuZGxlciwgaW50ZXJzZWN0KSB7XG4gIGNvbnN0IG1ldGFzZXRzID0gY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW2F4aXNdO1xuICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IG1ldGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgIGNvbnN0IHtpbmRleCwgZGF0YX0gPSBtZXRhc2V0c1tpXTtcbiAgICBjb25zdCB7bG8sIGhpfSA9IGJpbmFyeVNlYXJjaChtZXRhc2V0c1tpXSwgYXhpcywgdmFsdWUsIGludGVyc2VjdCk7XG4gICAgZm9yIChsZXQgaiA9IGxvOyBqIDw9IGhpOyArK2opIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkYXRhW2pdO1xuICAgICAgaWYgKCFlbGVtZW50LnNraXApIHtcbiAgICAgICAgaGFuZGxlcihlbGVtZW50LCBpbmRleCwgaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2V0IGEgZGlzdGFuY2UgbWV0cmljIGZ1bmN0aW9uIGZvciB0d28gcG9pbnRzIGJhc2VkIG9uIHRoZVxuICogYXhpcyBtb2RlIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBheGlzIC0gdGhlIGF4aXMgbW9kZS4geHx5fHh5fHJcbiAqL1xuZnVuY3Rpb24gZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzKGF4aXMpIHtcbiAgY29uc3QgdXNlWCA9IGF4aXMuaW5kZXhPZigneCcpICE9PSAtMTtcbiAgY29uc3QgdXNlWSA9IGF4aXMuaW5kZXhPZigneScpICE9PSAtMTtcblxuICByZXR1cm4gZnVuY3Rpb24ocHQxLCBwdDIpIHtcbiAgICBjb25zdCBkZWx0YVggPSB1c2VYID8gTWF0aC5hYnMocHQxLnggLSBwdDIueCkgOiAwO1xuICAgIGNvbnN0IGRlbHRhWSA9IHVzZVkgPyBNYXRoLmFicyhwdDEueSAtIHB0Mi55KSA6IDA7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhkZWx0YVgsIDIpICsgTWF0aC5wb3coZGVsdGFZLCAyKSk7XG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgdGhhdCBpbnRlcnNlY3QgdGhlIGV2ZW50IHBvc2l0aW9uXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuICogQHBhcmFtIHtQb2ludH0gcG9zaXRpb24gLSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0bywgaW4gcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBheGlzIC0gdGhlIGF4aXMgbW9kZS4geHx5fHh5fHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVJbnZpc2libGVdIC0gaW5jbHVkZSBpbnZpc2libGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIGNoYXJ0IGFyZWFcbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIHVzZUZpbmFsUG9zaXRpb24sIGluY2x1ZGVJbnZpc2libGUpIHtcbiAgY29uc3QgaXRlbXMgPSBbXTtcblxuICBpZiAoIWluY2x1ZGVJbnZpc2libGUgJiYgIWNoYXJ0LmlzUG9pbnRJbkFyZWEocG9zaXRpb24pKSB7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgY29uc3QgZXZhbHVhdGlvbkZ1bmMgPSBmdW5jdGlvbihlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG4gICAgaWYgKCFpbmNsdWRlSW52aXNpYmxlICYmICFfaXNQb2ludEluQXJlYShlbGVtZW50LCBjaGFydC5jaGFydEFyZWEsIDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgdXNlRmluYWxQb3NpdGlvbikpIHtcbiAgICAgIGl0ZW1zLnB1c2goe2VsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXh9KTtcbiAgICB9XG4gIH07XG5cbiAgZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgZXZhbHVhdGlvbkZ1bmMsIHRydWUpO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb24gZm9yIGEgcmFkaWFsIGNoYXJ0XG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7UG9pbnR9IHBvc2l0aW9uIC0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG8sIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGVzIGFsb25nIHdoaWNoIHRvIG1lYXN1cmUgZGlzdGFuY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXROZWFyZXN0UmFkaWFsSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGV2YWx1YXRpb25GdW5jKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICBjb25zdCB7c3RhcnRBbmdsZSwgZW5kQW5nbGV9ID0gZWxlbWVudC5nZXRQcm9wcyhbJ3N0YXJ0QW5nbGUnLCAnZW5kQW5nbGUnXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgY29uc3Qge2FuZ2xlfSA9IGdldEFuZ2xlRnJvbVBvaW50KGVsZW1lbnQsIHt4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55fSk7XG5cbiAgICBpZiAoX2FuZ2xlQmV0d2VlbihhbmdsZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUpKSB7XG4gICAgICBpdGVtcy5wdXNoKHtlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fSk7XG4gICAgfVxuICB9XG5cbiAgZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgZXZhbHVhdGlvbkZ1bmMpO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb24gZm9yIGEgY2FydGVzaWFuIGNoYXJ0XG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7UG9pbnR9IHBvc2l0aW9uIC0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG8sIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGVzIGFsb25nIHdoaWNoIHRvIG1lYXN1cmUgZGlzdGFuY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVyc2VjdF0gLSBpZiB0cnVlLCBvbmx5IGNvbnNpZGVyIGl0ZW1zIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbdXNlRmluYWxQb3NpdGlvbl0gLSB1c2UgdGhlIGVsZW1lbnQncyBhbmltYXRpb24gdGFyZ2V0IGluc3RlYWQgb2YgY3VycmVudCBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZUludmlzaWJsZV0gLSBpbmNsdWRlIGludmlzaWJsZSBwb2ludHMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUgY2hhcnQgYXJlYVxuICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IHRoZSBuZWFyZXN0IGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3RDYXJ0ZXNpYW5JdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkge1xuICBsZXQgaXRlbXMgPSBbXTtcbiAgY29uc3QgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMoYXhpcyk7XG4gIGxldCBtaW5EaXN0YW5jZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICBmdW5jdGlvbiBldmFsdWF0aW9uRnVuYyhlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG4gICAgY29uc3QgaW5SYW5nZSA9IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBpZiAoaW50ZXJzZWN0ICYmICFpblJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyID0gZWxlbWVudC5nZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBjb25zdCBwb2ludEluQXJlYSA9ICEhaW5jbHVkZUludmlzaWJsZSB8fCBjaGFydC5pc1BvaW50SW5BcmVhKGNlbnRlcik7XG4gICAgaWYgKCFwb2ludEluQXJlYSAmJiAhaW5SYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VNZXRyaWMocG9zaXRpb24sIGNlbnRlcik7XG4gICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgIGl0ZW1zID0gW3tlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fV07XG4gICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPT09IG1pbkRpc3RhbmNlKSB7XG4gICAgICAvLyBDYW4gaGF2ZSBtdWx0aXBsZSBpdGVtcyBhdCB0aGUgc2FtZSBkaXN0YW5jZSBpbiB3aGljaCBjYXNlIHdlIHNvcnQgYnkgc2l6ZVxuICAgICAgaXRlbXMucHVzaCh7ZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleH0pO1xuICAgIH1cbiAgfVxuXG4gIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGV2YWx1YXRpb25GdW5jKTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGl0ZW1zIG5lYXJlc3QgdG8gdGhlIGV2ZW50IHBvc2l0aW9uIGNvbnNpZGVyaW5nIGFsbCB2aXNpYmxlIGl0ZW1zIGluIHRoZSBjaGFydFxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgdG8gbG9vayBhdCBlbGVtZW50cyBmcm9tXG4gKiBAcGFyYW0ge1BvaW50fSBwb3NpdGlvbiAtIHRoZSBwb2ludCB0byBiZSBuZWFyZXN0IHRvLCBpbiByZWxhdGl2ZSBjb29yZGluYXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IGF4aXMgLSB0aGUgYXhlcyBhbG9uZyB3aGljaCB0byBtZWFzdXJlIGRpc3RhbmNlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcnNlY3RdIC0gaWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVJbnZpc2libGVdIC0gaW5jbHVkZSBpbnZpc2libGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIGNoYXJ0IGFyZWFcbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBpbnRlcnNlY3QsIHVzZUZpbmFsUG9zaXRpb24sIGluY2x1ZGVJbnZpc2libGUpIHtcbiAgaWYgKCFpbmNsdWRlSW52aXNpYmxlICYmICFjaGFydC5pc1BvaW50SW5BcmVhKHBvc2l0aW9uKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBheGlzID09PSAncicgJiYgIWludGVyc2VjdFxuICAgID8gZ2V0TmVhcmVzdFJhZGlhbEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbilcbiAgICA6IGdldE5lYXJlc3RDYXJ0ZXNpYW5JdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbWF0Y2hpbmcgYWxvbmcgdGhlIGdpdmVuIFggb3IgWSBheGlzXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7UG9pbnR9IHBvc2l0aW9uIC0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG8sIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGlzIHRvIG1hdGNoXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcnNlY3RdIC0gaWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXRBeGlzSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBpbnRlcnNlY3QsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgY29uc3QgcmFuZ2VNZXRob2QgPSBheGlzID09PSAneCcgPyAnaW5YUmFuZ2UnIDogJ2luWVJhbmdlJztcbiAgbGV0IGludGVyc2VjdHNJdGVtID0gZmFsc2U7XG5cbiAgZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpID0+IHtcbiAgICBpZiAoZWxlbWVudFtyYW5nZU1ldGhvZF0ocG9zaXRpb25bYXhpc10sIHVzZUZpbmFsUG9zaXRpb24pKSB7XG4gICAgICBpdGVtcy5wdXNoKHtlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fSk7XG4gICAgICBpbnRlcnNlY3RzSXRlbSA9IGludGVyc2VjdHNJdGVtIHx8IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIElmIHdlIHdhbnQgdG8gdHJpZ2dlciBvbiBhbiBpbnRlcnNlY3QgYW5kIHdlIGRvbid0IGhhdmUgYW55IGl0ZW1zXG4gIC8vIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvbiwgcmV0dXJuIG5vdGhpbmdcbiAgaWYgKGludGVyc2VjdCAmJiAhaW50ZXJzZWN0c0l0ZW0pIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGludGVyYWN0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zXG4gKiBAbmFtZXNwYWNlIENoYXJ0LkludGVyYWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLy8gUGFydCBvZiB0aGUgcHVibGljIEFQSSB0byBmYWNpbGl0YXRlIGRldmVsb3BlcnMgY3JlYXRpbmcgdGhlaXIgb3duIG1vZGVzXG4gIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyxcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGRpZmZlcmVudCBtb2Rlc1xuICBtb2Rlczoge1xuICAgIC8qKlxuXHRcdCAqIFJldHVybnMgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXguIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgd2Ugb25seSByZXR1cm4gaXRlbXMgaWYgd2UgaW50ZXJzZWN0IHNvbWV0aGluZ1xuXHRcdCAqIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBtb2RlIGlzIGZhbHNlLCB3ZSBmaW5kIHRoZSBuZWFyZXN0IGl0ZW0gYW5kIHJldHVybiB0aGUgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXggYXMgdGhhdCBpdGVtXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmluZGV4XG5cdFx0ICogQHNpbmNlIHYyLjQuMFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIGZpbmFsIGVsZW1lbnQgcG9zaXRpb24gKGFuaW1hdGlvbiB0YXJnZXQpXG5cdFx0ICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IC0gaXRlbXMgdGhhdCBhcmUgZm91bmRcblx0XHQgKi9cbiAgICBpbmRleChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIC8vIERlZmF1bHQgYXhpcyBmb3IgaW5kZXggbW9kZSBpcyAneCcgdG8gbWF0Y2ggb2xkIGJlaGF2aW91clxuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneCc7XG4gICAgICBjb25zdCBpbmNsdWRlSW52aXNpYmxlID0gb3B0aW9ucy5pbmNsdWRlSW52aXNpYmxlIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLmludGVyc2VjdFxuICAgICAgICA/IGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSlcbiAgICAgICAgOiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBmYWxzZSwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuXG4gICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNoYXJ0LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXNbMF0uaW5kZXg7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBtZXRhLmRhdGFbaW5kZXhdO1xuXG4gICAgICAgIC8vIGRvbid0IGNvdW50IGl0ZW1zIHRoYXQgYXJlIHNraXBwZWQgKG51bGwgZGF0YSlcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQuc2tpcCkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goe2VsZW1lbnQsIGRhdGFzZXRJbmRleDogbWV0YS5pbmRleCwgaW5kZXh9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogUmV0dXJucyBpdGVtcyBpbiB0aGUgc2FtZSBkYXRhc2V0LiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgcGFyYW1ldGVyIGlzIHRydWUsIHdlIG9ubHkgcmV0dXJuIGl0ZW1zIGlmIHdlIGludGVyc2VjdCBzb21ldGhpbmdcblx0XHQgKiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgaXMgZmFsc2UsIHdlIGZpbmQgdGhlIG5lYXJlc3QgaXRlbSBhbmQgcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGF0IGRhdGFzZXRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuZGF0YXNldFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIGZpbmFsIGVsZW1lbnQgcG9zaXRpb24gKGFuaW1hdGlvbiB0YXJnZXQpXG5cdFx0ICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IC0gaXRlbXMgdGhhdCBhcmUgZm91bmRcblx0XHQgKi9cbiAgICBkYXRhc2V0KGNoYXJ0LCBlLCBvcHRpb25zLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuICAgICAgY29uc3QgaW5jbHVkZUludmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUludmlzaWJsZSB8fCBmYWxzZTtcbiAgICAgIGxldCBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0XG4gICAgICAgID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKSA6XG4gICAgICAgIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGZhbHNlLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZGF0YXNldEluZGV4ID0gaXRlbXNbMF0uZGF0YXNldEluZGV4O1xuICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5kYXRhO1xuICAgICAgICBpdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpdGVtcy5wdXNoKHtlbGVtZW50OiBkYXRhW2ldLCBkYXRhc2V0SW5kZXgsIGluZGV4OiBpfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH0sXG5cbiAgICAvKipcblx0XHQgKiBQb2ludCBtb2RlIHJldHVybnMgYWxsIGVsZW1lbnRzIHRoYXQgaGl0IHRlc3QgYmFzZWQgb24gdGhlIGV2ZW50IHBvc2l0aW9uXG5cdFx0ICogb2YgdGhlIGV2ZW50XG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmludGVyc2VjdFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIGZpbmFsIGVsZW1lbnQgcG9zaXRpb24gKGFuaW1hdGlvbiB0YXJnZXQpXG5cdFx0ICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IC0gaXRlbXMgdGhhdCBhcmUgZm91bmRcblx0XHQgKi9cbiAgICBwb2ludChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIGNvbnN0IGF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3h5JztcbiAgICAgIGNvbnN0IGluY2x1ZGVJbnZpc2libGUgPSBvcHRpb25zLmluY2x1ZGVJbnZpc2libGUgfHwgZmFsc2U7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogbmVhcmVzdCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnQgY2xvc2VzdCB0byB0aGUgcG9pbnRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuaW50ZXJzZWN0XG5cdFx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSAtIHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0ge0ludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyAtIG9wdGlvbnMgdG8gdXNlXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbdXNlRmluYWxQb3NpdGlvbl0gLSB1c2UgZmluYWwgZWxlbWVudCBwb3NpdGlvbiAoYW5pbWF0aW9uIHRhcmdldClcblx0XHQgKiBAcmV0dXJuIHtJbnRlcmFjdGlvbkl0ZW1bXX0gLSBpdGVtcyB0aGF0IGFyZSBmb3VuZFxuXHRcdCAqL1xuICAgIG5lYXJlc3QoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICBjb25zdCBheGlzID0gb3B0aW9ucy5heGlzIHx8ICd4eSc7XG4gICAgICBjb25zdCBpbmNsdWRlSW52aXNpYmxlID0gb3B0aW9ucy5pbmNsdWRlSW52aXNpYmxlIHx8IGZhbHNlO1xuICAgICAgcmV0dXJuIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIG9wdGlvbnMuaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogeCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeCBjb29yZGluYXRlXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnhcblx0XHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlIC0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSB7SW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gb3B0aW9ucyB0byB1c2Vcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VGaW5hbFBvc2l0aW9uXSAtIHVzZSBmaW5hbCBlbGVtZW50IHBvc2l0aW9uIChhbmltYXRpb24gdGFyZ2V0KVxuXHRcdCAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSAtIGl0ZW1zIHRoYXQgYXJlIGZvdW5kXG5cdFx0ICovXG4gICAgeChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIHJldHVybiBnZXRBeGlzSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCAneCcsIG9wdGlvbnMuaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogeSBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeSBjb29yZGluYXRlXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnlcblx0XHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlIC0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSB7SW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gb3B0aW9ucyB0byB1c2Vcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VGaW5hbFBvc2l0aW9uXSAtIHVzZSBmaW5hbCBlbGVtZW50IHBvc2l0aW9uIChhbmltYXRpb24gdGFyZ2V0KVxuXHRcdCAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSAtIGl0ZW1zIHRoYXQgYXJlIGZvdW5kXG5cdFx0ICovXG4gICAgeShjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIHJldHVybiBnZXRBeGlzSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCAneScsIG9wdGlvbnMuaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtkZWZpbmVkLCBlYWNoLCBpc09iamVjdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuaW1wb3J0IHt0b1BhZGRpbmd9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqL1xuXG5jb25zdCBTVEFUSUNfUE9TSVRJT05TID0gWydsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nXTtcblxuZnVuY3Rpb24gZmlsdGVyQnlQb3NpdGlvbihhcnJheSwgcG9zaXRpb24pIHtcbiAgcmV0dXJuIGFycmF5LmZpbHRlcih2ID0+IHYucG9zID09PSBwb3NpdGlvbik7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyhhcnJheSwgYXhpcykge1xuICByZXR1cm4gYXJyYXkuZmlsdGVyKHYgPT4gU1RBVElDX1BPU0lUSU9OUy5pbmRleE9mKHYucG9zKSA9PT0gLTEgJiYgdi5ib3guYXhpcyA9PT0gYXhpcyk7XG59XG5cbmZ1bmN0aW9uIHNvcnRCeVdlaWdodChhcnJheSwgcmV2ZXJzZSkge1xuICByZXR1cm4gYXJyYXkuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHYwID0gcmV2ZXJzZSA/IGIgOiBhO1xuICAgIGNvbnN0IHYxID0gcmV2ZXJzZSA/IGEgOiBiO1xuICAgIHJldHVybiB2MC53ZWlnaHQgPT09IHYxLndlaWdodCA/XG4gICAgICB2MC5pbmRleCAtIHYxLmluZGV4IDpcbiAgICAgIHYwLndlaWdodCAtIHYxLndlaWdodDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBCb3hlcyhib3hlcykge1xuICBjb25zdCBsYXlvdXRCb3hlcyA9IFtdO1xuICBsZXQgaSwgaWxlbiwgYm94LCBwb3MsIHN0YWNrLCBzdGFja1dlaWdodDtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gKGJveGVzIHx8IFtdKS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBib3ggPSBib3hlc1tpXTtcbiAgICAoe3Bvc2l0aW9uOiBwb3MsIG9wdGlvbnM6IHtzdGFjaywgc3RhY2tXZWlnaHQgPSAxfX0gPSBib3gpO1xuICAgIGxheW91dEJveGVzLnB1c2goe1xuICAgICAgaW5kZXg6IGksXG4gICAgICBib3gsXG4gICAgICBwb3MsXG4gICAgICBob3Jpem9udGFsOiBib3guaXNIb3Jpem9udGFsKCksXG4gICAgICB3ZWlnaHQ6IGJveC53ZWlnaHQsXG4gICAgICBzdGFjazogc3RhY2sgJiYgKHBvcyArIHN0YWNrKSxcbiAgICAgIHN0YWNrV2VpZ2h0XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxheW91dEJveGVzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YWNrcyhsYXlvdXRzKSB7XG4gIGNvbnN0IHN0YWNrcyA9IHt9O1xuICBmb3IgKGNvbnN0IHdyYXAgb2YgbGF5b3V0cykge1xuICAgIGNvbnN0IHtzdGFjaywgcG9zLCBzdGFja1dlaWdodH0gPSB3cmFwO1xuICAgIGlmICghc3RhY2sgfHwgIVNUQVRJQ19QT1NJVElPTlMuaW5jbHVkZXMocG9zKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IF9zdGFjayA9IHN0YWNrc1tzdGFja10gfHwgKHN0YWNrc1tzdGFja10gPSB7Y291bnQ6IDAsIHBsYWNlZDogMCwgd2VpZ2h0OiAwLCBzaXplOiAwfSk7XG4gICAgX3N0YWNrLmNvdW50Kys7XG4gICAgX3N0YWNrLndlaWdodCArPSBzdGFja1dlaWdodDtcbiAgfVxuICByZXR1cm4gc3RhY2tzO1xufVxuXG4vKipcbiAqIHN0b3JlIGRpbWVuc2lvbnMgdXNlZCBpbnN0ZWFkIG9mIGF2YWlsYWJsZSBjaGFydEFyZWEgaW4gZml0Qm94ZXNcbiAqKi9cbmZ1bmN0aW9uIHNldExheW91dERpbXMobGF5b3V0cywgcGFyYW1zKSB7XG4gIGNvbnN0IHN0YWNrcyA9IGJ1aWxkU3RhY2tzKGxheW91dHMpO1xuICBjb25zdCB7dkJveE1heFdpZHRoLCBoQm94TWF4SGVpZ2h0fSA9IHBhcmFtcztcbiAgbGV0IGksIGlsZW4sIGxheW91dDtcbiAgZm9yIChpID0gMCwgaWxlbiA9IGxheW91dHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgbGF5b3V0ID0gbGF5b3V0c1tpXTtcbiAgICBjb25zdCB7ZnVsbFNpemV9ID0gbGF5b3V0LmJveDtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdO1xuICAgIGNvbnN0IGZhY3RvciA9IHN0YWNrICYmIGxheW91dC5zdGFja1dlaWdodCAvIHN0YWNrLndlaWdodDtcbiAgICBpZiAobGF5b3V0Lmhvcml6b250YWwpIHtcbiAgICAgIGxheW91dC53aWR0aCA9IGZhY3RvciA/IGZhY3RvciAqIHZCb3hNYXhXaWR0aCA6IGZ1bGxTaXplICYmIHBhcmFtcy5hdmFpbGFibGVXaWR0aDtcbiAgICAgIGxheW91dC5oZWlnaHQgPSBoQm94TWF4SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXlvdXQud2lkdGggPSB2Qm94TWF4V2lkdGg7XG4gICAgICBsYXlvdXQuaGVpZ2h0ID0gZmFjdG9yID8gZmFjdG9yICogaEJveE1heEhlaWdodCA6IGZ1bGxTaXplICYmIHBhcmFtcy5hdmFpbGFibGVIZWlnaHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGFja3M7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0Qm94ZXMoYm94ZXMpIHtcbiAgY29uc3QgbGF5b3V0Qm94ZXMgPSB3cmFwQm94ZXMoYm94ZXMpO1xuICBjb25zdCBmdWxsU2l6ZSA9IHNvcnRCeVdlaWdodChsYXlvdXRCb3hlcy5maWx0ZXIod3JhcCA9PiB3cmFwLmJveC5mdWxsU2l6ZSksIHRydWUpO1xuICBjb25zdCBsZWZ0ID0gc29ydEJ5V2VpZ2h0KGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdsZWZ0JyksIHRydWUpO1xuICBjb25zdCByaWdodCA9IHNvcnRCeVdlaWdodChmaWx0ZXJCeVBvc2l0aW9uKGxheW91dEJveGVzLCAncmlnaHQnKSk7XG4gIGNvbnN0IHRvcCA9IHNvcnRCeVdlaWdodChmaWx0ZXJCeVBvc2l0aW9uKGxheW91dEJveGVzLCAndG9wJyksIHRydWUpO1xuICBjb25zdCBib3R0b20gPSBzb3J0QnlXZWlnaHQoZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ2JvdHRvbScpKTtcbiAgY29uc3QgY2VudGVySG9yaXpvbnRhbCA9IGZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyhsYXlvdXRCb3hlcywgJ3gnKTtcbiAgY29uc3QgY2VudGVyVmVydGljYWwgPSBmaWx0ZXJEeW5hbWljUG9zaXRpb25CeUF4aXMobGF5b3V0Qm94ZXMsICd5Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICBmdWxsU2l6ZSxcbiAgICBsZWZ0QW5kVG9wOiBsZWZ0LmNvbmNhdCh0b3ApLFxuICAgIHJpZ2h0QW5kQm90dG9tOiByaWdodC5jb25jYXQoY2VudGVyVmVydGljYWwpLmNvbmNhdChib3R0b20pLmNvbmNhdChjZW50ZXJIb3Jpem9udGFsKSxcbiAgICBjaGFydEFyZWE6IGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdjaGFydEFyZWEnKSxcbiAgICB2ZXJ0aWNhbDogbGVmdC5jb25jYXQocmlnaHQpLmNvbmNhdChjZW50ZXJWZXJ0aWNhbCksXG4gICAgaG9yaXpvbnRhbDogdG9wLmNvbmNhdChib3R0b20pLmNvbmNhdChjZW50ZXJIb3Jpem9udGFsKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDb21iaW5lZE1heChtYXhQYWRkaW5nLCBjaGFydEFyZWEsIGEsIGIpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1heFBhZGRpbmdbYV0sIGNoYXJ0QXJlYVthXSkgKyBNYXRoLm1heChtYXhQYWRkaW5nW2JdLCBjaGFydEFyZWFbYl0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNYXhQYWRkaW5nKG1heFBhZGRpbmcsIGJveFBhZGRpbmcpIHtcbiAgbWF4UGFkZGluZy50b3AgPSBNYXRoLm1heChtYXhQYWRkaW5nLnRvcCwgYm94UGFkZGluZy50b3ApO1xuICBtYXhQYWRkaW5nLmxlZnQgPSBNYXRoLm1heChtYXhQYWRkaW5nLmxlZnQsIGJveFBhZGRpbmcubGVmdCk7XG4gIG1heFBhZGRpbmcuYm90dG9tID0gTWF0aC5tYXgobWF4UGFkZGluZy5ib3R0b20sIGJveFBhZGRpbmcuYm90dG9tKTtcbiAgbWF4UGFkZGluZy5yaWdodCA9IE1hdGgubWF4KG1heFBhZGRpbmcucmlnaHQsIGJveFBhZGRpbmcucmlnaHQpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEaW1zKGNoYXJ0QXJlYSwgcGFyYW1zLCBsYXlvdXQsIHN0YWNrcykge1xuICBjb25zdCB7cG9zLCBib3h9ID0gbGF5b3V0O1xuICBjb25zdCBtYXhQYWRkaW5nID0gY2hhcnRBcmVhLm1heFBhZGRpbmc7XG5cbiAgLy8gZHluYW1pY2FsbHkgcGxhY2VkIGJveGVzIHNpemUgaXMgbm90IGNvbnNpZGVyZWRcbiAgaWYgKCFpc09iamVjdChwb3MpKSB7XG4gICAgaWYgKGxheW91dC5zaXplKSB7XG4gICAgICAvLyB0aGlzIGxheW91dCB3YXMgYWxyZWFkeSBjb3VudGVkIGZvciwgbGV0cyBmaXJzdCByZWR1Y2Ugb2xkIHNpemVcbiAgICAgIGNoYXJ0QXJlYVtwb3NdIC09IGxheW91dC5zaXplO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdIHx8IHtzaXplOiAwLCBjb3VudDogMX07XG4gICAgc3RhY2suc2l6ZSA9IE1hdGgubWF4KHN0YWNrLnNpemUsIGxheW91dC5ob3Jpem9udGFsID8gYm94LmhlaWdodCA6IGJveC53aWR0aCk7XG4gICAgbGF5b3V0LnNpemUgPSBzdGFjay5zaXplIC8gc3RhY2suY291bnQ7XG4gICAgY2hhcnRBcmVhW3Bvc10gKz0gbGF5b3V0LnNpemU7XG4gIH1cblxuICBpZiAoYm94LmdldFBhZGRpbmcpIHtcbiAgICB1cGRhdGVNYXhQYWRkaW5nKG1heFBhZGRpbmcsIGJveC5nZXRQYWRkaW5nKCkpO1xuICB9XG5cbiAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCgwLCBwYXJhbXMub3V0ZXJXaWR0aCAtIGdldENvbWJpbmVkTWF4KG1heFBhZGRpbmcsIGNoYXJ0QXJlYSwgJ2xlZnQnLCAncmlnaHQnKSk7XG4gIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KDAsIHBhcmFtcy5vdXRlckhlaWdodCAtIGdldENvbWJpbmVkTWF4KG1heFBhZGRpbmcsIGNoYXJ0QXJlYSwgJ3RvcCcsICdib3R0b20nKSk7XG4gIGNvbnN0IHdpZHRoQ2hhbmdlZCA9IG5ld1dpZHRoICE9PSBjaGFydEFyZWEudztcbiAgY29uc3QgaGVpZ2h0Q2hhbmdlZCA9IG5ld0hlaWdodCAhPT0gY2hhcnRBcmVhLmg7XG4gIGNoYXJ0QXJlYS53ID0gbmV3V2lkdGg7XG4gIGNoYXJ0QXJlYS5oID0gbmV3SGVpZ2h0O1xuXG4gIC8vIHJldHVybiBib29sZWFucyBvbiB0aGUgY2hhbmdlcyBwZXIgZGlyZWN0aW9uXG4gIHJldHVybiBsYXlvdXQuaG9yaXpvbnRhbFxuICAgID8ge3NhbWU6IHdpZHRoQ2hhbmdlZCwgb3RoZXI6IGhlaWdodENoYW5nZWR9XG4gICAgOiB7c2FtZTogaGVpZ2h0Q2hhbmdlZCwgb3RoZXI6IHdpZHRoQ2hhbmdlZH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1heFBhZGRpbmcoY2hhcnRBcmVhKSB7XG4gIGNvbnN0IG1heFBhZGRpbmcgPSBjaGFydEFyZWEubWF4UGFkZGluZztcblxuICBmdW5jdGlvbiB1cGRhdGVQb3MocG9zKSB7XG4gICAgY29uc3QgY2hhbmdlID0gTWF0aC5tYXgobWF4UGFkZGluZ1twb3NdIC0gY2hhcnRBcmVhW3Bvc10sIDApO1xuICAgIGNoYXJ0QXJlYVtwb3NdICs9IGNoYW5nZTtcbiAgICByZXR1cm4gY2hhbmdlO1xuICB9XG4gIGNoYXJ0QXJlYS55ICs9IHVwZGF0ZVBvcygndG9wJyk7XG4gIGNoYXJ0QXJlYS54ICs9IHVwZGF0ZVBvcygnbGVmdCcpO1xuICB1cGRhdGVQb3MoJ3JpZ2h0Jyk7XG4gIHVwZGF0ZVBvcygnYm90dG9tJyk7XG59XG5cbmZ1bmN0aW9uIGdldE1hcmdpbnMoaG9yaXpvbnRhbCwgY2hhcnRBcmVhKSB7XG4gIGNvbnN0IG1heFBhZGRpbmcgPSBjaGFydEFyZWEubWF4UGFkZGluZztcblxuICBmdW5jdGlvbiBtYXJnaW5Gb3JQb3NpdGlvbnMocG9zaXRpb25zKSB7XG4gICAgY29uc3QgbWFyZ2luID0ge2xlZnQ6IDAsIHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMH07XG4gICAgcG9zaXRpb25zLmZvckVhY2goKHBvcykgPT4ge1xuICAgICAgbWFyZ2luW3Bvc10gPSBNYXRoLm1heChjaGFydEFyZWFbcG9zXSwgbWF4UGFkZGluZ1twb3NdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFyZ2luO1xuICB9XG5cbiAgcmV0dXJuIGhvcml6b250YWxcbiAgICA/IG1hcmdpbkZvclBvc2l0aW9ucyhbJ2xlZnQnLCAncmlnaHQnXSlcbiAgICA6IG1hcmdpbkZvclBvc2l0aW9ucyhbJ3RvcCcsICdib3R0b20nXSk7XG59XG5cbmZ1bmN0aW9uIGZpdEJveGVzKGJveGVzLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKSB7XG4gIGNvbnN0IHJlZml0Qm94ZXMgPSBbXTtcbiAgbGV0IGksIGlsZW4sIGxheW91dCwgYm94LCByZWZpdCwgY2hhbmdlZDtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gYm94ZXMubGVuZ3RoLCByZWZpdCA9IDA7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBsYXlvdXQgPSBib3hlc1tpXTtcbiAgICBib3ggPSBsYXlvdXQuYm94O1xuXG4gICAgYm94LnVwZGF0ZShcbiAgICAgIGxheW91dC53aWR0aCB8fCBjaGFydEFyZWEudyxcbiAgICAgIGxheW91dC5oZWlnaHQgfHwgY2hhcnRBcmVhLmgsXG4gICAgICBnZXRNYXJnaW5zKGxheW91dC5ob3Jpem9udGFsLCBjaGFydEFyZWEpXG4gICAgKTtcbiAgICBjb25zdCB7c2FtZSwgb3RoZXJ9ID0gdXBkYXRlRGltcyhjaGFydEFyZWEsIHBhcmFtcywgbGF5b3V0LCBzdGFja3MpO1xuXG4gICAgLy8gRGltZW5zaW9ucyBjaGFuZ2VkIGFuZCB0aGVyZSB3ZXJlIG5vbiBmdWxsIHdpZHRoIGJveGVzIGJlZm9yZSB0aGlzXG4gICAgLy8gLT4gd2UgaGF2ZSB0byByZWZpdCB0aG9zZVxuICAgIHJlZml0IHw9IHNhbWUgJiYgcmVmaXRCb3hlcy5sZW5ndGg7XG5cbiAgICAvLyBDaGFydCBhcmVhIGNoYW5nZWQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IG90aGVyO1xuXG4gICAgaWYgKCFib3guZnVsbFNpemUpIHsgLy8gZnVsbFNpemUgYm94ZXMgZG9uJ3QgbmVlZCB0byBiZSByZS1maXR0ZWQgaW4gYW55IGNhc2VcbiAgICAgIHJlZml0Qm94ZXMucHVzaChsYXlvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZpdCAmJiBmaXRCb3hlcyhyZWZpdEJveGVzLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKSB8fCBjaGFuZ2VkO1xufVxuXG5mdW5jdGlvbiBzZXRCb3hEaW1zKGJveCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGJveC50b3AgPSB0b3A7XG4gIGJveC5sZWZ0ID0gbGVmdDtcbiAgYm94LnJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICBib3guYm90dG9tID0gdG9wICsgaGVpZ2h0O1xuICBib3gud2lkdGggPSB3aWR0aDtcbiAgYm94LmhlaWdodCA9IGhlaWdodDtcbn1cblxuZnVuY3Rpb24gcGxhY2VCb3hlcyhib3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcykge1xuICBjb25zdCB1c2VyUGFkZGluZyA9IHBhcmFtcy5wYWRkaW5nO1xuICBsZXQge3gsIHl9ID0gY2hhcnRBcmVhO1xuXG4gIGZvciAoY29uc3QgbGF5b3V0IG9mIGJveGVzKSB7XG4gICAgY29uc3QgYm94ID0gbGF5b3V0LmJveDtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdIHx8IHtjb3VudDogMSwgcGxhY2VkOiAwLCB3ZWlnaHQ6IDF9O1xuICAgIGNvbnN0IHdlaWdodCA9IChsYXlvdXQuc3RhY2tXZWlnaHQgLyBzdGFjay53ZWlnaHQpIHx8IDE7XG4gICAgaWYgKGxheW91dC5ob3Jpem9udGFsKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGNoYXJ0QXJlYS53ICogd2VpZ2h0O1xuICAgICAgY29uc3QgaGVpZ2h0ID0gc3RhY2suc2l6ZSB8fCBib3guaGVpZ2h0O1xuICAgICAgaWYgKGRlZmluZWQoc3RhY2suc3RhcnQpKSB7XG4gICAgICAgIHkgPSBzdGFjay5zdGFydDtcbiAgICAgIH1cbiAgICAgIGlmIChib3guZnVsbFNpemUpIHtcbiAgICAgICAgc2V0Qm94RGltcyhib3gsIHVzZXJQYWRkaW5nLmxlZnQsIHksIHBhcmFtcy5vdXRlcldpZHRoIC0gdXNlclBhZGRpbmcucmlnaHQgLSB1c2VyUGFkZGluZy5sZWZ0LCBoZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Qm94RGltcyhib3gsIGNoYXJ0QXJlYS5sZWZ0ICsgc3RhY2sucGxhY2VkLCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnN0YXJ0ID0geTtcbiAgICAgIHN0YWNrLnBsYWNlZCArPSB3aWR0aDtcbiAgICAgIHkgPSBib3guYm90dG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSBjaGFydEFyZWEuaCAqIHdlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gc3RhY2suc2l6ZSB8fCBib3gud2lkdGg7XG4gICAgICBpZiAoZGVmaW5lZChzdGFjay5zdGFydCkpIHtcbiAgICAgICAgeCA9IHN0YWNrLnN0YXJ0O1xuICAgICAgfVxuICAgICAgaWYgKGJveC5mdWxsU2l6ZSkge1xuICAgICAgICBzZXRCb3hEaW1zKGJveCwgeCwgdXNlclBhZGRpbmcudG9wLCB3aWR0aCwgcGFyYW1zLm91dGVySGVpZ2h0IC0gdXNlclBhZGRpbmcuYm90dG9tIC0gdXNlclBhZGRpbmcudG9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEJveERpbXMoYm94LCB4LCBjaGFydEFyZWEudG9wICsgc3RhY2sucGxhY2VkLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnN0YXJ0ID0geDtcbiAgICAgIHN0YWNrLnBsYWNlZCArPSBoZWlnaHQ7XG4gICAgICB4ID0gYm94LnJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIGNoYXJ0QXJlYS54ID0geDtcbiAgY2hhcnRBcmVhLnkgPSB5O1xufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgTGF5b3V0SXRlbVxuICogQHR5cGVkZWYge29iamVjdH0gTGF5b3V0SXRlbVxuICogQHByb3Age3N0cmluZ30gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIGNoYXJ0IGxheW91dC4gUG9zc2libGUgdmFsdWVzIGFyZVxuICogJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsIGFuZCAnY2hhcnRBcmVhJ1xuICogQHByb3Age251bWJlcn0gd2VpZ2h0IC0gVGhlIHdlaWdodCB1c2VkIHRvIHNvcnQgdGhlIGl0ZW0uIEhpZ2hlciB3ZWlnaHRzIGFyZSBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2hhcnQgYXJlYVxuICogQHByb3Age2Jvb2xlYW59IGZ1bGxTaXplIC0gaWYgdHJ1ZSwgYW5kIHRoZSBpdGVtIGlzIGhvcml6b250YWwsIHRoZW4gcHVzaCB2ZXJ0aWNhbCBib3hlcyBkb3duXG4gKiBAcHJvcCB7ZnVuY3Rpb259IGlzSG9yaXpvbnRhbCAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGF5b3V0IGl0ZW0gaXMgaG9yaXpvbnRhbCAoaWUuIHRvcCBvciBib3R0b20pXG4gKiBAcHJvcCB7ZnVuY3Rpb259IHVwZGF0ZSAtIFRha2VzIHR3byBwYXJhbWV0ZXJzOiB3aWR0aCBhbmQgaGVpZ2h0LiBSZXR1cm5zIHNpemUgb2YgaXRlbVxuICogQHByb3Age2Z1bmN0aW9ufSBkcmF3IC0gRHJhd3MgdGhlIGVsZW1lbnRcbiAqIEBwcm9wIHtmdW5jdGlvbn0gW2dldFBhZGRpbmddIC0gIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcGFkZGluZyBvbiB0aGUgZWRnZXNcbiAqIEBwcm9wIHtudW1iZXJ9IHdpZHRoIC0gV2lkdGggb2YgaXRlbS4gTXVzdCBiZSB2YWxpZCBhZnRlciB1cGRhdGUoKVxuICogQHByb3Age251bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIGl0ZW0uIE11c3QgYmUgdmFsaWQgYWZ0ZXIgdXBkYXRlKClcbiAqIEBwcm9wIHtudW1iZXJ9IGxlZnQgLSBMZWZ0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtudW1iZXJ9IHRvcCAtIFRvcCBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXG4gKiBAcHJvcCB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXG4gKi9cblxuLy8gVGhlIGxheW91dCBzZXJ2aWNlIGlzIHZlcnkgc2VsZiBleHBsYW5hdG9yeS4gIEl0J3MgcmVzcG9uc2libGUgZm9yIHRoZSBsYXlvdXQgd2l0aGluIGEgY2hhcnQuXG4vLyBTY2FsZXMsIExlZ2VuZHMgYW5kIFBsdWdpbnMgYWxsIHJlbHkgb24gdGhlIGxheW91dCBzZXJ2aWNlIGFuZCBjYW4gZWFzaWx5IHJlZ2lzdGVyIHRvIGJlIHBsYWNlZCBhbnl3aGVyZSB0aGV5IG5lZWRcbi8vIEl0IGlzIHRoaXMgc2VydmljZSdzIHJlc3BvbnNpYmlsaXR5IG9mIGNhcnJ5aW5nIG91dCB0aGF0IGxheW91dC5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICAvKipcblx0ICogUmVnaXN0ZXIgYSBib3ggdG8gYSBjaGFydC5cblx0ICogQSBib3ggaXMgc2ltcGx5IGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0IHJlcXVpcmVzIGxheW91dC4gZWcuIFNjYWxlcywgTGVnZW5kLCBUaXRsZS5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgdG8gdXNlXG5cdCAqIEBwYXJhbSB7TGF5b3V0SXRlbX0gaXRlbSAtIHRoZSBpdGVtIHRvIGFkZCB0byBiZSBsYWlkIG91dFxuXHQgKi9cbiAgYWRkQm94KGNoYXJ0LCBpdGVtKSB7XG4gICAgaWYgKCFjaGFydC5ib3hlcykge1xuICAgICAgY2hhcnQuYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGl0ZW0gd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgIGl0ZW0uZnVsbFNpemUgPSBpdGVtLmZ1bGxTaXplIHx8IGZhbHNlO1xuICAgIGl0ZW0ucG9zaXRpb24gPSBpdGVtLnBvc2l0aW9uIHx8ICd0b3AnO1xuICAgIGl0ZW0ud2VpZ2h0ID0gaXRlbS53ZWlnaHQgfHwgMDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXRlbS5fbGF5ZXJzID0gaXRlbS5fbGF5ZXJzIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHo6IDAsXG4gICAgICAgIGRyYXcoY2hhcnRBcmVhKSB7XG4gICAgICAgICAgaXRlbS5kcmF3KGNoYXJ0QXJlYSk7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH07XG5cbiAgICBjaGFydC5ib3hlcy5wdXNoKGl0ZW0pO1xuICB9LFxuXG4gIC8qKlxuXHQgKiBSZW1vdmUgYSBsYXlvdXRJdGVtIGZyb20gYSBjaGFydFxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byByZW1vdmUgdGhlIGJveCBmcm9tXG5cdCAqIEBwYXJhbSB7TGF5b3V0SXRlbX0gbGF5b3V0SXRlbSAtIHRoZSBpdGVtIHRvIHJlbW92ZSBmcm9tIHRoZSBsYXlvdXRcblx0ICovXG4gIHJlbW92ZUJveChjaGFydCwgbGF5b3V0SXRlbSkge1xuICAgIGNvbnN0IGluZGV4ID0gY2hhcnQuYm94ZXMgPyBjaGFydC5ib3hlcy5pbmRleE9mKGxheW91dEl0ZW0pIDogLTE7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgY2hhcnQuYm94ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG5cdCAqIFNldHMgKG9yIHVwZGF0ZXMpIG9wdGlvbnMgb24gdGhlIGdpdmVuIGBpdGVtYC5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgaW4gd2hpY2ggdGhlIGl0ZW0gbGl2ZXMgKG9yIHdpbGwgYmUgYWRkZWQgdG8pXG5cdCAqIEBwYXJhbSB7TGF5b3V0SXRlbX0gaXRlbSAtIHRoZSBpdGVtIHRvIGNvbmZpZ3VyZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gdGhlIG5ldyBpdGVtIG9wdGlvbnMuXG5cdCAqL1xuICBjb25maWd1cmUoY2hhcnQsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgICBpdGVtLmZ1bGxTaXplID0gb3B0aW9ucy5mdWxsU2l6ZTtcbiAgICBpdGVtLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbjtcbiAgICBpdGVtLndlaWdodCA9IG9wdGlvbnMud2VpZ2h0O1xuICB9LFxuXG4gIC8qKlxuXHQgKiBGaXRzIGJveGVzIG9mIHRoZSBnaXZlbiBjaGFydCBpbnRvIHRoZSBnaXZlbiBzaXplIGJ5IGhhdmluZyBlYWNoIGJveCBtZWFzdXJlIGl0c2VsZlxuXHQgKiB0aGVuIHJ1bm5pbmcgYSBmaXR0aW5nIGFsZ29yaXRobVxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSB0aGUgd2lkdGggdG8gZml0IGludG9cblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIHRoZSBoZWlnaHQgdG8gZml0IGludG9cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pblBhZGRpbmcgLSBtaW5pbXVtIHBhZGRpbmcgcmVxdWlyZWQgZm9yIGVhY2ggc2lkZSBvZiBjaGFydCBhcmVhXG5cdCAqL1xuICB1cGRhdGUoY2hhcnQsIHdpZHRoLCBoZWlnaHQsIG1pblBhZGRpbmcpIHtcbiAgICBpZiAoIWNoYXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhjaGFydC5vcHRpb25zLmxheW91dC5wYWRkaW5nKTtcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IE1hdGgubWF4KHdpZHRoIC0gcGFkZGluZy53aWR0aCwgMCk7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0IC0gcGFkZGluZy5oZWlnaHQsIDApO1xuICAgIGNvbnN0IGJveGVzID0gYnVpbGRMYXlvdXRCb3hlcyhjaGFydC5ib3hlcyk7XG4gICAgY29uc3QgdmVydGljYWxCb3hlcyA9IGJveGVzLnZlcnRpY2FsO1xuICAgIGNvbnN0IGhvcml6b250YWxCb3hlcyA9IGJveGVzLmhvcml6b250YWw7XG5cbiAgICAvLyBCZWZvcmUgYW55IGNoYW5nZXMgYXJlIG1hZGUsIG5vdGlmeSBib3hlcyB0aGF0IGFuIHVwZGF0ZSBpcyBhYm91dCB0byBiZWluZ1xuICAgIC8vIFRoaXMgaXMgdXNlZCB0byBjbGVhciBhbnkgY2FjaGVkIGRhdGEgKGUuZy4gc2NhbGUgbGltaXRzKVxuICAgIGVhY2goY2hhcnQuYm94ZXMsIGJveCA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJveC5iZWZvcmVMYXlvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYm94LmJlZm9yZUxheW91dCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRXNzZW50aWFsbHkgd2Ugbm93IGhhdmUgYW55IG51bWJlciBvZiBib3hlcyBvbiBlYWNoIG9mIHRoZSA0IHNpZGVzLlxuICAgIC8vIE91ciBjYW52YXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLlxuICAgIC8vIFRoZSBhcmVhcyBMMSBhbmQgTDIgYXJlIHRoZSBsZWZ0IGF4ZXMuIFIxIGlzIHRoZSByaWdodCBheGlzLCBUMSBpcyB0aGUgdG9wIGF4aXMgYW5kXG4gICAgLy8gQjEgaXMgdGhlIGJvdHRvbSBheGlzXG4gICAgLy8gVGhlcmUgYXJlIGFsc28gNCBxdWFkcmFudC1saWtlIGxvY2F0aW9ucyAobGVmdCB0byByaWdodCBpbnN0ZWFkIG9mIGNsb2Nrd2lzZSkgcmVzZXJ2ZWQgZm9yIGNoYXJ0IG92ZXJsYXlzXG4gICAgLy8gVGhlc2UgbG9jYXRpb25zIGFyZSBzaW5nbGUtYm94IGxvY2F0aW9ucyBvbmx5LCB3aGVuIHRyeWluZyB0byByZWdpc3RlciBhIGNoYXJ0QXJlYSBsb2NhdGlvbiB0aGF0IGlzIGFscmVhZHkgdGFrZW4sXG4gICAgLy8gYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAgLy9cbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8ICAgICAgICAgICAgICAgICAgVDEgKEZ1bGwgV2lkdGgpICAgICAgICAgICAgICAgICAgIHxcbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgVDIgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8ICAgIHwtLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLXxcbiAgICAvLyB8ICAgIHwgICAgfCBDMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDMiB8ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfC0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS18ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8IEwxIHwgTDIgfCAgICAgICAgICAgQ2hhcnRBcmVhIChDMCkgICAgICAgICAgICB8IFIxIHxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfC0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS18ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfCBDMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDNCB8ICAgIHxcbiAgICAvLyB8ICAgIHwtLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLXxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgQjEgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8ICAgICAgICAgICAgICAgICAgQjIgKEZ1bGwgV2lkdGgpICAgICAgICAgICAgICAgICAgIHxcbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvL1xuXG4gICAgY29uc3QgdmlzaWJsZVZlcnRpY2FsQm94Q291bnQgPSB2ZXJ0aWNhbEJveGVzLnJlZHVjZSgodG90YWwsIHdyYXApID0+XG4gICAgICB3cmFwLmJveC5vcHRpb25zICYmIHdyYXAuYm94Lm9wdGlvbnMuZGlzcGxheSA9PT0gZmFsc2UgPyB0b3RhbCA6IHRvdGFsICsgMSwgMCkgfHwgMTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgb3V0ZXJXaWR0aDogd2lkdGgsXG4gICAgICBvdXRlckhlaWdodDogaGVpZ2h0LFxuICAgICAgcGFkZGluZyxcbiAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgYXZhaWxhYmxlSGVpZ2h0LFxuICAgICAgdkJveE1heFdpZHRoOiBhdmFpbGFibGVXaWR0aCAvIDIgLyB2aXNpYmxlVmVydGljYWxCb3hDb3VudCxcbiAgICAgIGhCb3hNYXhIZWlnaHQ6IGF2YWlsYWJsZUhlaWdodCAvIDJcbiAgICB9KTtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gT2JqZWN0LmFzc2lnbih7fSwgcGFkZGluZyk7XG4gICAgdXBkYXRlTWF4UGFkZGluZyhtYXhQYWRkaW5nLCB0b1BhZGRpbmcobWluUGFkZGluZykpO1xuICAgIGNvbnN0IGNoYXJ0QXJlYSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbWF4UGFkZGluZyxcbiAgICAgIHc6IGF2YWlsYWJsZVdpZHRoLFxuICAgICAgaDogYXZhaWxhYmxlSGVpZ2h0LFxuICAgICAgeDogcGFkZGluZy5sZWZ0LFxuICAgICAgeTogcGFkZGluZy50b3BcbiAgICB9LCBwYWRkaW5nKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHNldExheW91dERpbXModmVydGljYWxCb3hlcy5jb25jYXQoaG9yaXpvbnRhbEJveGVzKSwgcGFyYW1zKTtcblxuICAgIC8vIEZpcnN0IGZpdCB0aGUgZnVsbFNpemUgYm94ZXMsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiByZS1maXR0aW5nLlxuICAgIGZpdEJveGVzKGJveGVzLmZ1bGxTaXplLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKTtcblxuICAgIC8vIFRoZW4gZml0IHZlcnRpY2FsIGJveGVzXG4gICAgZml0Qm94ZXModmVydGljYWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG5cbiAgICAvLyBUaGVuIGZpdCBob3Jpem9udGFsIGJveGVzXG4gICAgaWYgKGZpdEJveGVzKGhvcml6b250YWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcykpIHtcbiAgICAgIC8vIGlmIHRoZSBhcmVhIGNoYW5nZWQsIHJlLWZpdCB2ZXJ0aWNhbCBib3hlc1xuICAgICAgZml0Qm94ZXModmVydGljYWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgfVxuXG4gICAgaGFuZGxlTWF4UGFkZGluZyhjaGFydEFyZWEpO1xuXG4gICAgLy8gRmluYWxseSBwbGFjZSB0aGUgYm94ZXMgdG8gY29ycmVjdCBjb29yZGluYXRlc1xuICAgIHBsYWNlQm94ZXMoYm94ZXMubGVmdEFuZFRvcCwgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG5cbiAgICAvLyBNb3ZlIHRvIG9wcG9zaXRlIHNpZGUgb2YgY2hhcnRcbiAgICBjaGFydEFyZWEueCArPSBjaGFydEFyZWEudztcbiAgICBjaGFydEFyZWEueSArPSBjaGFydEFyZWEuaDtcblxuICAgIHBsYWNlQm94ZXMoYm94ZXMucmlnaHRBbmRCb3R0b20sIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpO1xuXG4gICAgY2hhcnQuY2hhcnRBcmVhID0ge1xuICAgICAgbGVmdDogY2hhcnRBcmVhLmxlZnQsXG4gICAgICB0b3A6IGNoYXJ0QXJlYS50b3AsXG4gICAgICByaWdodDogY2hhcnRBcmVhLmxlZnQgKyBjaGFydEFyZWEudyxcbiAgICAgIGJvdHRvbTogY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5oLFxuICAgICAgaGVpZ2h0OiBjaGFydEFyZWEuaCxcbiAgICAgIHdpZHRoOiBjaGFydEFyZWEudyxcbiAgICB9O1xuXG4gICAgLy8gRmluYWxseSB1cGRhdGUgYm94ZXMgaW4gY2hhcnRBcmVhIChyYWRpYWwgc2NhbGUgZm9yIGV4YW1wbGUpXG4gICAgZWFjaChib3hlcy5jaGFydEFyZWEsIChsYXlvdXQpID0+IHtcbiAgICAgIGNvbnN0IGJveCA9IGxheW91dC5ib3g7XG4gICAgICBPYmplY3QuYXNzaWduKGJveCwgY2hhcnQuY2hhcnRBcmVhKTtcbiAgICAgIGJveC51cGRhdGUoY2hhcnRBcmVhLncsIGNoYXJ0QXJlYS5oLCB7bGVmdDogMCwgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwfSk7XG4gICAgfSk7XG4gIH1cbn07XG4iLCAiXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICovXG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgdGhhdCBhbGxvd3MgYWJzdHJhY3RpbmcgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIGF3YXkgZnJvbSB0aGUgY2hhcnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VQbGF0Zm9ybSB7XG4gIC8qKlxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgY29uc3RydWN0aW9uIHRpbWUsIHJldHVybnMgYSBjb250ZXh0MmQgaW5zdGFuY2UgaW1wbGVtZW50aW5nXG5cdCAqIHRoZSBbVzNDIENhbnZhcyAyRCBDb250ZXh0IEFQSSBzdGFuZGFyZF17QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSLzJkY29udGV4dC99LlxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgLSBUaGUgY2FudmFzIGZyb20gd2hpY2ggdG8gYWNxdWlyZSBjb250ZXh0IChwbGF0Zm9ybSBzcGVjaWZpYylcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb10gLSBUaGUgY2hhcnQgb3B0aW9uc1xuXHQgKi9cbiAgYWNxdWlyZUNvbnRleHQoY2FudmFzLCBhc3BlY3RSYXRpbykge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8qKlxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgZGVzdHJ1Y3Rpb24gdGltZSwgcmVsZWFzZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0XG5cdCAqIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgdGhlIGFjcXVpcmVDb250ZXh0KCkgbWV0aG9kLlxuXHQgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCAtIFRoZSBjb250ZXh0MmQgaW5zdGFuY2Vcblx0ICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIG1ldGhvZCBzdWNjZWVkZWQsIGVsc2UgZmFsc2Vcblx0ICovXG4gIHJlbGVhc2VDb250ZXh0KGNvbnRleHQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBvbiB0aGUgZ2l2ZW4gY2hhcnQuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gQ2hhcnQgZnJvbSB3aGljaCB0byBsaXN0ZW4gZm9yIGV2ZW50XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlICh7QGxpbmsgQ2hhcnRFdmVudH0pIHR5cGUgdG8gbGlzdGVuIGZvclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciAtIFJlY2VpdmVzIGEgbm90aWZpY2F0aW9uIChhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzXG5cdCAqIHRoZSB7QGxpbmsgQ2hhcnRFdmVudH0gaW50ZXJmYWNlKSB3aGVuIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBvY2N1cnMuXG5cdCAqL1xuICBhZGRFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggYWRkRXZlbnRMaXN0ZW5lci5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBDaGFydCBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgKHtAbGluayBDaGFydEV2ZW50fSkgdHlwZSB0byByZW1vdmVcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50IHRhcmdldC5cblx0ICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjdXJyZW50IGRldmljZVBpeGVsUmF0aW8gb2YgdGhlIGRldmljZSB0aGlzIHBsYXRmb3JtIGlzIGNvbm5lY3RlZCB0by5cblx0ICovXG4gIGdldERldmljZVBpeGVsUmF0aW8oKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIGluIHBpeGVscyBvZiBnaXZlbiBjYW52YXMgZWxlbWVudC5cblx0ICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gZWxlbWVudFxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIGNvbnRlbnQgd2lkdGggb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gY29udGVudCBoZWlnaHQgb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb10gLSBhc3BlY3QgcmF0aW8gdG8gbWFpbnRhaW5cblx0ICovXG4gIGdldE1heGltdW1TaXplKGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKSB7XG4gICAgd2lkdGggPSBNYXRoLm1heCgwLCB3aWR0aCB8fCBlbGVtZW50LndpZHRoKTtcbiAgICBoZWlnaHQgPSBoZWlnaHQgfHwgZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0OiBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IE1hdGguZmxvb3Iod2lkdGggLyBhc3BlY3RSYXRpbykgOiBoZWlnaHQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcblx0ICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNhbnZhcyBpcyBhdHRhY2hlZCB0byB0aGUgcGxhdGZvcm0sIGZhbHNlIGlmIG5vdC5cblx0ICovXG4gIGlzQXR0YWNoZWQoY2FudmFzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGNvbmZpZyB3aXRoIHBsYXRmb3JtIHNwZWNpZmljIHJlcXVpcmVtZW50c1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vY29yZS9jb3JlLmNvbmZpZy5qcycpLmRlZmF1bHR9IGNvbmZpZ1xuICAgKi9cbiAgdXBkYXRlQ29uZmlnKGNvbmZpZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgLy8gbm8tb3BcbiAgfVxufVxuIiwgIi8qKlxuICogUGxhdGZvcm0gZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gKG1pbmltYWwpLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1OTEjaXNzdWVjb21tZW50LTMxOTU3NTkzOVxuICovXG5cbmltcG9ydCBCYXNlUGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5iYXNlLmpzJztcblxuLyoqXG4gKiBQbGF0Zm9ybSBjbGFzcyBmb3IgY2hhcnRzIHdpdGhvdXQgYWNjZXNzIHRvIHRoZSBET00gb3IgdG8gbWFueSBlbGVtZW50IHByb3BlcnRpZXNcbiAqIFRoaXMgcGxhdGZvcm0gaXMgdXNlZCBieSBkZWZhdWx0IGZvciBhbnkgY2hhcnQgcGFzc2VkIGFuIE9mZnNjcmVlbkNhbnZhcy5cbiAqIEBleHRlbmRzIEJhc2VQbGF0Zm9ybVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNpY1BsYXRmb3JtIGV4dGVuZHMgQmFzZVBsYXRmb3JtIHtcbiAgYWNxdWlyZUNvbnRleHQoaXRlbSkge1xuICAgIC8vIFRvIHByZXZlbnQgY2FudmFzIGZpbmdlcnByaW50aW5nLCBzb21lIGFkZC1vbnMgdW5kZWZpbmUgdGhlIGdldENvbnRleHRcbiAgICAvLyBtZXRob2QsIGZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20va2thcHNuZXIvQ2FudmFzQmxvY2tlclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yODA3XG4gICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5nZXRDb250ZXh0ICYmIGl0ZW0uZ2V0Q29udGV4dCgnMmQnKSB8fCBudWxsO1xuICB9XG4gIHVwZGF0ZUNvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcub3B0aW9ucy5hbmltYXRpb24gPSBmYWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ2hhcnQuUGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHRhcmdldGluZyBhIHdlYiBicm93c2VyXG4gKi9cblxuaW1wb3J0IEJhc2VQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmJhc2UuanMnO1xuaW1wb3J0IHtfZ2V0UGFyZW50Tm9kZSwgZ2V0UmVsYXRpdmVQb3NpdGlvbiwgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucywgcmVhZFVzZWRTaXplLCBnZXRNYXhpbXVtU2l6ZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmRvbS5qcyc7XG5pbXBvcnQge3Rocm90dGxlZH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5pbXBvcnQge2lzTnVsbE9yVW5kZWZ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vY29yZS9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqL1xuXG5jb25zdCBFWFBBTkRPX0tFWSA9ICckY2hhcnRqcyc7XG5cbi8qKlxuICogRE9NIGV2ZW50IHR5cGVzIC0+IENoYXJ0LmpzIGV2ZW50IHR5cGVzLlxuICogTm90ZTogb25seSBldmVudHMgd2l0aCBkaWZmZXJlbnQgdHlwZXMgYXJlIG1hcHBlZC5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzXG4gKi9cbmNvbnN0IEVWRU5UX1RZUEVTID0ge1xuICB0b3VjaHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgdG91Y2htb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgdG91Y2hlbmQ6ICdtb3VzZXVwJyxcbiAgcG9pbnRlcmVudGVyOiAnbW91c2VlbnRlcicsXG4gIHBvaW50ZXJkb3duOiAnbW91c2Vkb3duJyxcbiAgcG9pbnRlcm1vdmU6ICdtb3VzZW1vdmUnLFxuICBwb2ludGVydXA6ICdtb3VzZXVwJyxcbiAgcG9pbnRlcmxlYXZlOiAnbW91c2VvdXQnLFxuICBwb2ludGVyb3V0OiAnbW91c2VvdXQnXG59O1xuXG5jb25zdCBpc051bGxPckVtcHR5ID0gdmFsdWUgPT4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnO1xuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgY2FudmFzIHN0eWxlIGFuZCByZW5kZXIgc2l6ZSB3aXRob3V0IG1vZGlmeWluZyB0aGUgY2FudmFzIGRpc3BsYXkgc2l6ZSxcbiAqIHNpbmNlIHJlc3BvbnNpdmVuZXNzIGlzIGhhbmRsZWQgYnkgdGhlIGNvbnRyb2xsZXIucmVzaXplKCkgbWV0aG9kLiBUaGUgY29uZmlnIGlzIHVzZWRcbiAqIHRvIGRldGVybWluZSB0aGUgYXNwZWN0IHJhdGlvIHRvIGFwcGx5IGluIGNhc2Ugbm8gZXhwbGljaXQgaGVpZ2h0IGhhcyBiZWVuIHNwZWNpZmllZC5cbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb11cbiAqL1xuZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gIGNvbnN0IHN0eWxlID0gY2FudmFzLnN0eWxlO1xuXG4gIC8vIE5PVEUoU0IpIGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykgIT09IGNhbnZhcy53aWR0aDogaW4gdGhlIGZpcnN0IGNhc2UgaXRcbiAgLy8gcmV0dXJucyBudWxsIG9yICcnIGlmIG5vIGV4cGxpY2l0IHZhbHVlIGhhcyBiZWVuIHNldCB0byB0aGUgY2FudmFzIGF0dHJpYnV0ZS5cbiAgY29uc3QgcmVuZGVySGVpZ2h0ID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gIGNvbnN0IHJlbmRlcldpZHRoID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcblxuICAvLyBDaGFydC5qcyBtb2RpZmllcyBzb21lIGNhbnZhcyB2YWx1ZXMgdGhhdCB3ZSB3YW50IHRvIHJlc3RvcmUgb24gZGVzdHJveVxuICBjYW52YXNbRVhQQU5ET19LRVldID0ge1xuICAgIGluaXRpYWw6IHtcbiAgICAgIGhlaWdodDogcmVuZGVySGVpZ2h0LFxuICAgICAgd2lkdGg6IHJlbmRlcldpZHRoLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogc3R5bGUuZGlzcGxheSxcbiAgICAgICAgaGVpZ2h0OiBzdHlsZS5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBzdHlsZS53aWR0aFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBGb3JjZSBjYW52YXMgdG8gZGlzcGxheSBhcyBibG9jayB0byBhdm9pZCBleHRyYSBzcGFjZSBjYXVzZWQgYnkgaW5saW5lXG4gIC8vIGVsZW1lbnRzLCB3aGljaCB3b3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVzcG9uc2l2ZSByZXNpemUgcHJvY2Vzcy5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI1MzhcbiAgc3R5bGUuZGlzcGxheSA9IHN0eWxlLmRpc3BsYXkgfHwgJ2Jsb2NrJztcbiAgLy8gSW5jbHVkZSBwb3NzaWJsZSBib3JkZXJzIGluIHRoZSBzaXplXG4gIHN0eWxlLmJveFNpemluZyA9IHN0eWxlLmJveFNpemluZyB8fCAnYm9yZGVyLWJveCc7XG5cbiAgaWYgKGlzTnVsbE9yRW1wdHkocmVuZGVyV2lkdGgpKSB7XG4gICAgY29uc3QgZGlzcGxheVdpZHRoID0gcmVhZFVzZWRTaXplKGNhbnZhcywgJ3dpZHRoJyk7XG4gICAgaWYgKGRpc3BsYXlXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYW52YXMud2lkdGggPSBkaXNwbGF5V2lkdGg7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTnVsbE9yRW1wdHkocmVuZGVySGVpZ2h0KSkge1xuICAgIGlmIChjYW52YXMuc3R5bGUuaGVpZ2h0ID09PSAnJykge1xuICAgICAgLy8gSWYgbm8gZXhwbGljaXQgcmVuZGVyIGhlaWdodCBhbmQgc3R5bGUgaGVpZ2h0LCBsZXQncyBhcHBseSB0aGUgYXNwZWN0IHJhdGlvLFxuICAgICAgLy8gd2hpY2ggb25lIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgYnV0IGFsc28gYnkgY2hhcnRzIGFzIGRlZmF1bHQgb3B0aW9uXG4gICAgICAvLyAoaS5lLiBvcHRpb25zLmFzcGVjdFJhdGlvKS4gSWYgbm90IHNwZWNpZmllZCwgdXNlIGNhbnZhcyBhc3BlY3QgcmF0aW8gb2YgMi5cbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXMud2lkdGggLyAoYXNwZWN0UmF0aW8gfHwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSByZWFkVXNlZFNpemUoY2FudmFzLCAnaGVpZ2h0Jyk7XG4gICAgICBpZiAoZGlzcGxheUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkaXNwbGF5SGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjYW52YXM7XG59XG5cbi8vIERlZmF1bHQgcGFzc2l2ZSB0byB0cnVlIGFzIGV4cGVjdGVkIGJ5IENocm9tZSBmb3IgJ3RvdWNoc3RhcnQnIGFuZCAndG91Y2hlbmQnIGV2ZW50cy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80Mjg3XG5jb25zdCBldmVudExpc3RlbmVyT3B0aW9ucyA9IHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZTtcblxuZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICBjaGFydC5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSB7XG4gIGNvbnN0IHR5cGUgPSBFVkVOVF9UWVBFU1tldmVudC50eXBlXSB8fCBldmVudC50eXBlO1xuICBjb25zdCB7eCwgeX0gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGV2ZW50LCBjaGFydCk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICBjaGFydCxcbiAgICBuYXRpdmU6IGV2ZW50LFxuICAgIHg6IHggIT09IHVuZGVmaW5lZCA/IHggOiBudWxsLFxuICAgIHk6IHkgIT09IHVuZGVmaW5lZCA/IHkgOiBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub2RlTGlzdENvbnRhaW5zKG5vZGVMaXN0LCBjYW52YXMpIHtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVMaXN0KSB7XG4gICAgaWYgKG5vZGUgPT09IGNhbnZhcyB8fCBub2RlLmNvbnRhaW5zKGNhbnZhcykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVBdHRhY2hPYnNlcnZlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGxldCB0cmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICB0cmlnZ2VyID0gdHJpZ2dlciB8fCBub2RlTGlzdENvbnRhaW5zKGVudHJ5LmFkZGVkTm9kZXMsIGNhbnZhcyk7XG4gICAgICB0cmlnZ2VyID0gdHJpZ2dlciAmJiAhbm9kZUxpc3RDb250YWlucyhlbnRyeS5yZW1vdmVkTm9kZXMsIGNhbnZhcyk7XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfSk7XG4gIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9KTtcbiAgcmV0dXJuIG9ic2VydmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZXRhY2hPYnNlcnZlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGxldCB0cmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICB0cmlnZ2VyID0gdHJpZ2dlciB8fCBub2RlTGlzdENvbnRhaW5zKGVudHJ5LnJlbW92ZWROb2RlcywgY2FudmFzKTtcbiAgICAgIHRyaWdnZXIgPSB0cmlnZ2VyICYmICFub2RlTGlzdENvbnRhaW5zKGVudHJ5LmFkZGVkTm9kZXMsIGNhbnZhcyk7XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfSk7XG4gIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9KTtcbiAgcmV0dXJuIG9ic2VydmVyO1xufVxuXG5jb25zdCBkcnBMaXN0ZW5pbmdDaGFydHMgPSBuZXcgTWFwKCk7XG5sZXQgb2xkRGV2aWNlUGl4ZWxSYXRpbyA9IDA7XG5cbmZ1bmN0aW9uIG9uV2luZG93UmVzaXplKCkge1xuICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgaWYgKGRwciA9PT0gb2xkRGV2aWNlUGl4ZWxSYXRpbykge1xuICAgIHJldHVybjtcbiAgfVxuICBvbGREZXZpY2VQaXhlbFJhdGlvID0gZHByO1xuICBkcnBMaXN0ZW5pbmdDaGFydHMuZm9yRWFjaCgocmVzaXplLCBjaGFydCkgPT4ge1xuICAgIGlmIChjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAhPT0gZHByKSB7XG4gICAgICByZXNpemUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCwgcmVzaXplKSB7XG4gIGlmICghZHJwTGlzdGVuaW5nQ2hhcnRzLnNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25XaW5kb3dSZXNpemUpO1xuICB9XG4gIGRycExpc3RlbmluZ0NoYXJ0cy5zZXQoY2hhcnQsIHJlc2l6ZSk7XG59XG5cbmZ1bmN0aW9uIHVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQpIHtcbiAgZHJwTGlzdGVuaW5nQ2hhcnRzLmRlbGV0ZShjaGFydCk7XG4gIGlmICghZHJwTGlzdGVuaW5nQ2hhcnRzLnNpemUpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25XaW5kb3dSZXNpemUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlc2l6ZU9ic2VydmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcyAmJiBfZ2V0UGFyZW50Tm9kZShjYW52YXMpO1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZXNpemUgPSB0aHJvdHRsZWQoKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCB3ID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgIGxpc3RlbmVyKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmICh3IDwgY29udGFpbmVyLmNsaWVudFdpZHRoKSB7XG4gICAgICAvLyBJZiB0aGUgY29udGFpbmVyIHNpemUgc2hyYW5rIGR1cmluZyBjaGFydCByZXNpemUsIGxldCdzIGFzc3VtZVxuICAgICAgLy8gc2Nyb2xsYmFyIGFwcGVhcmVkLiBTbyB3ZSByZXNpemUgYWdhaW4gd2l0aCB0aGUgc2Nyb2xsYmFyIHZpc2libGUgLVxuICAgICAgLy8gZWZmZWN0aXZlbHkgbWFraW5nIGNoYXJ0IHNtYWxsZXIgYW5kIHRoZSBzY3JvbGxiYXIgaGlkZGVuIGFnYWluLlxuICAgICAgLy8gQmVjYXVzZSB3ZSBhcmUgaW5zaWRlIGB0aHJvdHRsZWRgLCBhbmQgY3VycmVudGx5IGB0aWNraW5nYCwgc2Nyb2xsXG4gICAgICAvLyBldmVudHMgYXJlIGlnbm9yZWQgZHVyaW5nIHRoaXMgd2hvbGUgMiByZXNpemUgcHJvY2Vzcy5cbiAgICAgIC8vIElmIHdlIGFzc3VtZWQgd3JvbmcgYW5kIHNvbWV0aGluZyBlbHNlIGhhcHBlbmVkLCB3ZSBhcmUgcmVzaXppbmdcbiAgICAgIC8vIHR3aWNlIGluIGEgZnJhbWUgKHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpc3N1ZSlcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICB9LCB3aW5kb3cpO1xuXG4gIC8vIEB0cy1pZ25vcmUgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNzg2MSBpbXBsZW1lbnRlZFxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07XG4gICAgY29uc3Qgd2lkdGggPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQ7XG4gICAgLy8gV2hlbiBpdHMgY29udGFpbmVyJ3MgZGlzcGxheSBpcyBzZXQgdG8gJ25vbmUnIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFcbiAgICAvLyBzaXplIG9mICgwLCAwKSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgY2hhcnQgdG8gbG9zZSBpdHMgb3JpZ2luYWwgaGVpZ2h0LCBzbyBza2lwXG4gICAgLy8gcmVzaXppbmcgaW4gc3VjaCBjYXNlLlxuICAgIGlmICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9KTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpO1xuICBsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCwgcmVzaXplKTtcblxuICByZXR1cm4gb2JzZXJ2ZXI7XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VPYnNlcnZlcihjaGFydCwgdHlwZSwgb2JzZXJ2ZXIpIHtcbiAgaWYgKG9ic2VydmVyKSB7XG4gICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmICh0eXBlID09PSAncmVzaXplJykge1xuICAgIHVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3h5QW5kTGlzdGVuKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gIGNvbnN0IHByb3h5ID0gdGhyb3R0bGVkKChldmVudCkgPT4ge1xuICAgIC8vIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgdGhlIGNoYXJ0IGlzIGRlc3Ryb3llZCB3aGlsZSB3YWl0aW5nXG4gICAgLy8gZm9yIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gdG8gb2NjdXIuIFdlIHByZXZlbnQgY3Jhc2hlcyBieSBjaGVja2luZ1xuICAgIC8vIGZvciBhIGRlc3Ryb3llZCBjaGFydFxuICAgIGlmIChjaGFydC5jdHggIT09IG51bGwpIHtcbiAgICAgIGxpc3RlbmVyKGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpKTtcbiAgICB9XG4gIH0sIGNoYXJ0KTtcblxuICBhZGRMaXN0ZW5lcihjYW52YXMsIHR5cGUsIHByb3h5KTtcblxuICByZXR1cm4gcHJveHk7XG59XG5cbi8qKlxuICogUGxhdGZvcm0gY2xhc3MgZm9yIGNoYXJ0cyB0aGF0IGNhbiBhY2Nlc3MgdGhlIERPTSBhbmQgZ2xvYmFsIHdpbmRvdy9kb2N1bWVudCBwcm9wZXJ0aWVzXG4gKiBAZXh0ZW5kcyBCYXNlUGxhdGZvcm1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tUGxhdGZvcm0gZXh0ZW5kcyBCYXNlUGxhdGZvcm0ge1xuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb11cblx0ICogQHJldHVybiB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfG51bGx9XG5cdCAqL1xuICBhY3F1aXJlQ29udGV4dChjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gICAgLy8gVG8gcHJldmVudCBjYW52YXMgZmluZ2VycHJpbnRpbmcsIHNvbWUgYWRkLW9ucyB1bmRlZmluZSB0aGUgZ2V0Q29udGV4dFxuICAgIC8vIG1ldGhvZCwgZm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ra2Fwc25lci9DYW52YXNCbG9ja2VyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI4MDdcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzICYmIGNhbnZhcy5nZXRDb250ZXh0ICYmIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gYGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEYCBmYWlscyB3aGVuIHRoZSBjYW52YXMgaXNcbiAgICAvLyBpbnNpZGUgYW4gaWZyYW1lIG9yIHdoZW4gcnVubmluZyBpbiBhIHByb3RlY3RlZCBlbnZpcm9ubWVudC4gV2UgY291bGQgZ3Vlc3MgdGhlXG4gICAgLy8gdHlwZXMgZnJvbSB0aGVpciB0b1N0cmluZygpIHZhbHVlIGJ1dCBsZXQncyBrZWVwIHRoaW5ncyBmbGV4aWJsZSBhbmQgYXNzdW1lIGl0J3NcbiAgICAvLyBhIHN1ZmZpY2llbnQgY29uZGl0aW9uIGlmIHRoZSBjYW52YXMgaGFzIGEgY29udGV4dDJEIHdoaWNoIGhhcyBjYW52YXMgYXMgYGNhbnZhc2AuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM4ODdcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNDEwMlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80MTUyXG4gICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5jYW52YXMgPT09IGNhbnZhcykge1xuICAgICAgLy8gTG9hZCBwbGF0Zm9ybSByZXNvdXJjZXMgb24gZmlyc3QgY2hhcnQgY3JlYXRpb24sIHRvIG1ha2UgaXQgcG9zc2libGUgdG9cbiAgICAgIC8vIGltcG9ydCB0aGUgbGlicmFyeSBiZWZvcmUgc2V0dGluZyBwbGF0Zm9ybSBvcHRpb25zLlxuICAgICAgaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKTtcbiAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0XG5cdCAqL1xuICByZWxlYXNlQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29uc3QgY2FudmFzID0gY29udGV4dC5jYW52YXM7XG4gICAgaWYgKCFjYW52YXNbRVhQQU5ET19LRVldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbCA9IGNhbnZhc1tFWFBBTkRPX0tFWV0uaW5pdGlhbDtcbiAgICBbJ2hlaWdodCcsICd3aWR0aCddLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5pdGlhbFtwcm9wXTtcbiAgICAgIGlmIChpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgICBjYW52YXMucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZShwcm9wLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdHlsZSA9IGluaXRpYWwuc3R5bGUgfHwge307XG4gICAgT2JqZWN0LmtleXMoc3R5bGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY2FudmFzLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGNhbnZhcyByZW5kZXIgc2l6ZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCAoYW5kIHRodXMgdGhlIHN0YXRlIHN0YWNrIGRpc2NhcmRlZCksXG4gICAgLy8gd2UgY2FuJ3QgdXNlIHNhdmUoKSBhbmQgcmVzdG9yZSgpIHRvIHJlc3RvcmUgdGhlIGluaXRpYWwgc3RhdGUuIFNvIG1ha2Ugc3VyZSB0aGF0IGF0XG4gICAgLy8gbGVhc3QgdGhlIGNhbnZhcyBjb250ZXh0IGlzIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHN0YXRlIGJ5IHNldHRpbmcgdGhlIGNhbnZhcyB3aWR0aC5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1odG1sNS0yMDExMDUyNS90aGUtY2FudmFzLWVsZW1lbnQuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy53aWR0aDtcblxuICAgIGRlbGV0ZSBjYW52YXNbRVhQQU5ET19LRVldO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG5cdCAqL1xuICBhZGRFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIC8vIENhbiBoYXZlIG9ubHkgb25lIGxpc3RlbmVyIHBlciB0eXBlLCBzbyBtYWtlIHN1cmUgcHJldmlvdXMgaXMgcmVtb3ZlZFxuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSk7XG5cbiAgICBjb25zdCBwcm94aWVzID0gY2hhcnQuJHByb3hpZXMgfHwgKGNoYXJ0LiRwcm94aWVzID0ge30pO1xuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgYXR0YWNoOiBjcmVhdGVBdHRhY2hPYnNlcnZlcixcbiAgICAgIGRldGFjaDogY3JlYXRlRGV0YWNoT2JzZXJ2ZXIsXG4gICAgICByZXNpemU6IGNyZWF0ZVJlc2l6ZU9ic2VydmVyXG4gICAgfTtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbdHlwZV0gfHwgY3JlYXRlUHJveHlBbmRMaXN0ZW47XG4gICAgcHJveGllc1t0eXBlXSA9IGhhbmRsZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG5cdCAqL1xuICByZW1vdmVFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlKSB7XG4gICAgY29uc3QgcHJveGllcyA9IGNoYXJ0LiRwcm94aWVzIHx8IChjaGFydC4kcHJveGllcyA9IHt9KTtcbiAgICBjb25zdCBwcm94eSA9IHByb3hpZXNbdHlwZV07XG5cbiAgICBpZiAoIXByb3h5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgICBhdHRhY2g6IHJlbGVhc2VPYnNlcnZlcixcbiAgICAgIGRldGFjaDogcmVsZWFzZU9ic2VydmVyLFxuICAgICAgcmVzaXplOiByZWxlYXNlT2JzZXJ2ZXJcbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1t0eXBlXSB8fCByZW1vdmVMaXN0ZW5lcjtcbiAgICBoYW5kbGVyKGNoYXJ0LCB0eXBlLCBwcm94eSk7XG4gICAgcHJveGllc1t0eXBlXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldERldmljZVBpeGVsUmF0aW8oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIGNvbnRlbnQgd2lkdGggb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gY29udGVudCBoZWlnaHQgb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb10gLSBhc3BlY3QgcmF0aW8gdG8gbWFpbnRhaW5cblx0ICovXG4gIGdldE1heGltdW1TaXplKGNhbnZhcywgd2lkdGgsIGhlaWdodCwgYXNwZWN0UmF0aW8pIHtcbiAgICByZXR1cm4gZ2V0TWF4aW11bVNpemUoY2FudmFzLCB3aWR0aCwgaGVpZ2h0LCBhc3BlY3RSYXRpbyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG5cdCAqL1xuICBpc0F0dGFjaGVkKGNhbnZhcykge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IF9nZXRQYXJlbnROb2RlKGNhbnZhcyk7XG4gICAgcmV0dXJuICEhKGNvbnRhaW5lciAmJiBjb250YWluZXIuaXNDb25uZWN0ZWQpO1xuICB9XG59XG4iLCAiaW1wb3J0IHtfaXNEb21TdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IEJhc2VQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmJhc2UuanMnO1xuaW1wb3J0IEJhc2ljUGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5iYXNpYy5qcyc7XG5pbXBvcnQgRG9tUGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5kb20uanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gX2RldGVjdFBsYXRmb3JtKGNhbnZhcykge1xuICBpZiAoIV9pc0RvbVN1cHBvcnRlZCgpIHx8ICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJyAmJiBjYW52YXMgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXMpKSB7XG4gICAgcmV0dXJuIEJhc2ljUGxhdGZvcm07XG4gIH1cbiAgcmV0dXJuIERvbVBsYXRmb3JtO1xufVxuXG5leHBvcnQge0Jhc2VQbGF0Zm9ybSwgQmFzaWNQbGF0Zm9ybSwgRG9tUGxhdGZvcm19O1xuIiwgImltcG9ydCB0eXBlIHtBbnlPYmplY3R9IGZyb20gJy4uL3R5cGVzL2Jhc2ljLmpzJztcbmltcG9ydCB0eXBlIHtQb2ludH0gZnJvbSAnLi4vdHlwZXMvZ2VvbWV0cmljLmpzJztcbmltcG9ydCB0eXBlIHtBbmltYXRpb259IGZyb20gJy4uL3R5cGVzL2FuaW1hdGlvbi5qcyc7XG5pbXBvcnQge2lzTnVtYmVyfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZW1lbnQ8VCA9IEFueU9iamVjdCwgTyA9IEFueU9iamVjdD4ge1xuXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHt9O1xuICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHVuZGVmaW5lZDtcblxuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgYWN0aXZlID0gZmFsc2U7XG4gIG9wdGlvbnM6IE87XG4gICRhbmltYXRpb25zOiBSZWNvcmQ8a2V5b2YgVCwgQW5pbWF0aW9uPjtcblxuICB0b29sdGlwUG9zaXRpb24odXNlRmluYWxQb3NpdGlvbjogYm9vbGVhbik6IFBvaW50IHtcbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmdldFByb3BzKFsneCcsICd5J10sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIHJldHVybiB7eCwgeX0gYXMgUG9pbnQ7XG4gIH1cblxuICBoYXNWYWx1ZSgpIHtcbiAgICByZXR1cm4gaXNOdW1iZXIodGhpcy54KSAmJiBpc051bWJlcih0aGlzLnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgb3IgZmluYWwgdmFsdWUgb2YgZWFjaCBwcm9wLiBDYW4gcmV0dXJuIGV4dHJhIHByb3BlcnRpZXMgKHdob2xlIG9iamVjdCkuXG4gICAqIEBwYXJhbSBwcm9wcyAtIHByb3BlcnRpZXMgdG8gZ2V0XG4gICAqIEBwYXJhbSBbZmluYWxdIC0gZ2V0IHRoZSBmaW5hbCB2YWx1ZSAoYW5pbWF0aW9uIHRhcmdldClcbiAgICovXG4gIGdldFByb3BzPFAgZXh0ZW5kcyAoa2V5b2YgVClbXT4ocHJvcHM6IFAsIGZpbmFsPzogYm9vbGVhbik6IFBpY2s8VCwgUFtudW1iZXJdPjtcbiAgZ2V0UHJvcHM8UCBleHRlbmRzIHN0cmluZz4ocHJvcHM6IFBbXSwgZmluYWw/OiBib29sZWFuKTogUGFydGlhbDxSZWNvcmQ8UCwgdW5rbm93bj4+O1xuICBnZXRQcm9wcyhwcm9wczogc3RyaW5nW10sIGZpbmFsPzogYm9vbGVhbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBhbmltcyA9IHRoaXMuJGFuaW1hdGlvbnM7XG4gICAgaWYgKCFmaW5hbCB8fCAhYW5pbXMpIHtcbiAgICAgIC8vIGxldCdzIG5vdCBjcmVhdGUgYW4gb2JqZWN0LCBpZiBub3QgbmVlZGVkXG4gICAgICByZXR1cm4gdGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHJldFtwcm9wXSA9IGFuaW1zW3Byb3BdICYmIGFuaW1zW3Byb3BdLmFjdGl2ZSgpID8gYW5pbXNbcHJvcF0uX3RvIDogdGhpc1twcm9wIGFzIHN0cmluZ107XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuIiwgImltcG9ydCB7aXNOdWxsT3JVbmRlZiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7X2ZhY3Rvcml6ZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuXG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4vY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IENoYXJ0XG4gKiBAdHlwZWRlZiB7e3ZhbHVlOm51bWJlciB8IHN0cmluZywgbGFiZWw/OnN0cmluZywgbWFqb3I/OmJvb2xlYW4sICRjb250ZXh0Pzphbnl9fSBUaWNrXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3Vic2V0IG9mIHRpY2tzIHRvIGJlIHBsb3R0ZWQgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgbGFiZWxzLlxuICogQHBhcmFtIHtpbXBvcnQoJy4vY29yZS5zY2FsZS5qcycpLmRlZmF1bHR9IHNjYWxlXG4gKiBAcGFyYW0ge1RpY2tbXX0gdGlja3NcbiAqIEByZXR1cm4ge1RpY2tbXX1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvU2tpcChzY2FsZSwgdGlja3MpIHtcbiAgY29uc3QgdGlja09wdHMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xuICBjb25zdCBkZXRlcm1pbmVkTWF4VGlja3MgPSBkZXRlcm1pbmVNYXhUaWNrcyhzY2FsZSk7XG4gIGNvbnN0IHRpY2tzTGltaXQgPSBNYXRoLm1pbih0aWNrT3B0cy5tYXhUaWNrc0xpbWl0IHx8IGRldGVybWluZWRNYXhUaWNrcywgZGV0ZXJtaW5lZE1heFRpY2tzKTtcbiAgY29uc3QgbWFqb3JJbmRpY2VzID0gdGlja09wdHMubWFqb3IuZW5hYmxlZCA/IGdldE1ham9ySW5kaWNlcyh0aWNrcykgOiBbXTtcbiAgY29uc3QgbnVtTWFqb3JJbmRpY2VzID0gbWFqb3JJbmRpY2VzLmxlbmd0aDtcbiAgY29uc3QgZmlyc3QgPSBtYWpvckluZGljZXNbMF07XG4gIGNvbnN0IGxhc3QgPSBtYWpvckluZGljZXNbbnVtTWFqb3JJbmRpY2VzIC0gMV07XG4gIGNvbnN0IG5ld1RpY2tzID0gW107XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHRvbyBtYW55IG1ham9yIHRpY2tzIHRvIGRpc3BsYXkgdGhlbSBhbGxcbiAgaWYgKG51bU1ham9ySW5kaWNlcyA+IHRpY2tzTGltaXQpIHtcbiAgICBza2lwTWFqb3JzKHRpY2tzLCBuZXdUaWNrcywgbWFqb3JJbmRpY2VzLCBudW1NYWpvckluZGljZXMgLyB0aWNrc0xpbWl0KTtcbiAgICByZXR1cm4gbmV3VGlja3M7XG4gIH1cblxuICBjb25zdCBzcGFjaW5nID0gY2FsY3VsYXRlU3BhY2luZyhtYWpvckluZGljZXMsIHRpY2tzLCB0aWNrc0xpbWl0KTtcblxuICBpZiAobnVtTWFqb3JJbmRpY2VzID4gMCkge1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGNvbnN0IGF2Z01ham9yU3BhY2luZyA9IG51bU1ham9ySW5kaWNlcyA+IDEgPyBNYXRoLnJvdW5kKChsYXN0IC0gZmlyc3QpIC8gKG51bU1ham9ySW5kaWNlcyAtIDEpKSA6IG51bGw7XG4gICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIGlzTnVsbE9yVW5kZWYoYXZnTWFqb3JTcGFjaW5nKSA/IDAgOiBmaXJzdCAtIGF2Z01ham9yU3BhY2luZywgZmlyc3QpO1xuICAgIGZvciAoaSA9IDAsIGlsZW4gPSBudW1NYWpvckluZGljZXMgLSAxOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZywgbWFqb3JJbmRpY2VzW2ldLCBtYWpvckluZGljZXNbaSArIDFdKTtcbiAgICB9XG4gICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIGxhc3QsIGlzTnVsbE9yVW5kZWYoYXZnTWFqb3JTcGFjaW5nKSA/IHRpY2tzLmxlbmd0aCA6IGxhc3QgKyBhdmdNYWpvclNwYWNpbmcpO1xuICAgIHJldHVybiBuZXdUaWNrcztcbiAgfVxuICBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZyk7XG4gIHJldHVybiBuZXdUaWNrcztcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTWF4VGlja3Moc2NhbGUpIHtcbiAgY29uc3Qgb2Zmc2V0ID0gc2NhbGUub3B0aW9ucy5vZmZzZXQ7XG4gIGNvbnN0IHRpY2tMZW5ndGggPSBzY2FsZS5fdGlja1NpemUoKTtcbiAgY29uc3QgbWF4U2NhbGUgPSBzY2FsZS5fbGVuZ3RoIC8gdGlja0xlbmd0aCArIChvZmZzZXQgPyAwIDogMSk7XG4gIGNvbnN0IG1heENoYXJ0ID0gc2NhbGUuX21heExlbmd0aCAvIHRpY2tMZW5ndGg7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgubWluKG1heFNjYWxlLCBtYXhDaGFydCkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyW119IG1ham9ySW5kaWNlc1xuICogQHBhcmFtIHtUaWNrW119IHRpY2tzXG4gKiBAcGFyYW0ge251bWJlcn0gdGlja3NMaW1pdFxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKG1ham9ySW5kaWNlcywgdGlja3MsIHRpY2tzTGltaXQpIHtcbiAgY29uc3QgZXZlbk1ham9yU3BhY2luZyA9IGdldEV2ZW5TcGFjaW5nKG1ham9ySW5kaWNlcyk7XG4gIGNvbnN0IHNwYWNpbmcgPSB0aWNrcy5sZW5ndGggLyB0aWNrc0xpbWl0O1xuXG4gIC8vIElmIHRoZSBtYWpvciB0aWNrcyBhcmUgZXZlbmx5IHNwYWNlZCBhcGFydCwgcGxhY2UgdGhlIG1pbm9yIHRpY2tzXG4gIC8vIHNvIHRoYXQgdGhleSBkaXZpZGUgdGhlIG1ham9yIHRpY2tzIGludG8gZXZlbiBjaHVua3NcbiAgaWYgKCFldmVuTWFqb3JTcGFjaW5nKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KHNwYWNpbmcsIDEpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9ycyA9IF9mYWN0b3JpemUoZXZlbk1ham9yU3BhY2luZyk7XG4gIGZvciAobGV0IGkgPSAwLCBpbGVuID0gZmFjdG9ycy5sZW5ndGggLSAxOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgY29uc3QgZmFjdG9yID0gZmFjdG9yc1tpXTtcbiAgICBpZiAoZmFjdG9yID4gc3BhY2luZykge1xuICAgICAgcmV0dXJuIGZhY3RvcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KHNwYWNpbmcsIDEpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7VGlja1tdfSB0aWNrc1xuICovXG5mdW5jdGlvbiBnZXRNYWpvckluZGljZXModGlja3MpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpLCBpbGVuO1xuICBmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgaWYgKHRpY2tzW2ldLm1ham9yKSB7XG4gICAgICByZXN1bHQucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RpY2tbXX0gdGlja3NcbiAqIEBwYXJhbSB7VGlja1tdfSBuZXdUaWNrc1xuICogQHBhcmFtIHtudW1iZXJbXX0gbWFqb3JJbmRpY2VzXG4gKiBAcGFyYW0ge251bWJlcn0gc3BhY2luZ1xuICovXG5mdW5jdGlvbiBza2lwTWFqb3JzKHRpY2tzLCBuZXdUaWNrcywgbWFqb3JJbmRpY2VzLCBzcGFjaW5nKSB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBuZXh0ID0gbWFqb3JJbmRpY2VzWzBdO1xuICBsZXQgaTtcblxuICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcpO1xuICBmb3IgKGkgPSAwOyBpIDwgdGlja3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA9PT0gbmV4dCkge1xuICAgICAgbmV3VGlja3MucHVzaCh0aWNrc1tpXSk7XG4gICAgICBjb3VudCsrO1xuICAgICAgbmV4dCA9IG1ham9ySW5kaWNlc1tjb3VudCAqIHNwYWNpbmddO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VGlja1tdfSB0aWNrc1xuICogQHBhcmFtIHtUaWNrW119IG5ld1RpY2tzXG4gKiBAcGFyYW0ge251bWJlcn0gc3BhY2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IFttYWpvclN0YXJ0XVxuICogQHBhcmFtIHtudW1iZXJ9IFttYWpvckVuZF1cbiAqL1xuZnVuY3Rpb24gc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIG1ham9yU3RhcnQsIG1ham9yRW5kKSB7XG4gIGNvbnN0IHN0YXJ0ID0gdmFsdWVPckRlZmF1bHQobWFqb3JTdGFydCwgMCk7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKHZhbHVlT3JEZWZhdWx0KG1ham9yRW5kLCB0aWNrcy5sZW5ndGgpLCB0aWNrcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgbGVuZ3RoLCBpLCBuZXh0O1xuXG4gIHNwYWNpbmcgPSBNYXRoLmNlaWwoc3BhY2luZyk7XG4gIGlmIChtYWpvckVuZCkge1xuICAgIGxlbmd0aCA9IG1ham9yRW5kIC0gbWFqb3JTdGFydDtcbiAgICBzcGFjaW5nID0gbGVuZ3RoIC8gTWF0aC5mbG9vcihsZW5ndGggLyBzcGFjaW5nKTtcbiAgfVxuXG4gIG5leHQgPSBzdGFydDtcblxuICB3aGlsZSAobmV4dCA8IDApIHtcbiAgICBjb3VudCsrO1xuICAgIG5leHQgPSBNYXRoLnJvdW5kKHN0YXJ0ICsgY291bnQgKiBzcGFjaW5nKTtcbiAgfVxuXG4gIGZvciAoaSA9IE1hdGgubWF4KHN0YXJ0LCAwKTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgaWYgKGkgPT09IG5leHQpIHtcbiAgICAgIG5ld1RpY2tzLnB1c2godGlja3NbaV0pO1xuICAgICAgY291bnQrKztcbiAgICAgIG5leHQgPSBNYXRoLnJvdW5kKHN0YXJ0ICsgY291bnQgKiBzcGFjaW5nKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyW119IGFyclxuICovXG5mdW5jdGlvbiBnZXRFdmVuU3BhY2luZyhhcnIpIHtcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgbGV0IGksIGRpZmY7XG5cbiAgaWYgKGxlbiA8IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGRpZmYgPSBhcnJbMF0sIGkgPSAxOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYXJyW2ldIC0gYXJyW2kgLSAxXSAhPT0gZGlmZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlmZjtcbn1cbiIsICJpbXBvcnQgRWxlbWVudCBmcm9tICcuL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQge19hbGlnblBpeGVsLCBfbWVhc3VyZVRleHQsIHJlbmRlclRleHQsIGNsaXBBcmVhLCB1bmNsaXBBcmVhfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLmpzJztcbmltcG9ydCB7Y2FsbGJhY2sgYXMgY2FsbCwgZWFjaCwgZmluaXRlT3JEZWZhdWx0LCBpc0FycmF5LCBpc0Zpbml0ZSwgaXNOdWxsT3JVbmRlZiwgaXNPYmplY3QsIHZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge3RvRGVncmVlcywgdG9SYWRpYW5zLCBfaW50MTZSYW5nZSwgX2xpbWl0VmFsdWUsIEhBTEZfUEl9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7X2FsaWduU3RhcnRFbmQsIF90b0xlZnRSaWdodENlbnRlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5pbXBvcnQge2NyZWF0ZUNvbnRleHQsIHRvRm9udCwgdG9QYWRkaW5nLCBfYWRkR3JhY2V9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcbmltcG9ydCB7YXV0b1NraXB9IGZyb20gJy4vY29yZS5zY2FsZS5hdXRvc2tpcC5qcyc7XG5cbmNvbnN0IHJldmVyc2VBbGlnbiA9IChhbGlnbikgPT4gYWxpZ24gPT09ICdsZWZ0JyA/ICdyaWdodCcgOiBhbGlnbiA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6IGFsaWduO1xuY29uc3Qgb2Zmc2V0RnJvbUVkZ2UgPSAoc2NhbGUsIGVkZ2UsIG9mZnNldCkgPT4gZWRnZSA9PT0gJ3RvcCcgfHwgZWRnZSA9PT0gJ2xlZnQnID8gc2NhbGVbZWRnZV0gKyBvZmZzZXQgOiBzY2FsZVtlZGdlXSAtIG9mZnNldDtcbmNvbnN0IGdldFRpY2tzTGltaXQgPSAodGlja3NMZW5ndGgsIG1heFRpY2tzTGltaXQpID0+IE1hdGgubWluKG1heFRpY2tzTGltaXQgfHwgdGlja3NMZW5ndGgsIHRpY2tzTGVuZ3RoKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHt7dmFsdWU6bnVtYmVyIHwgc3RyaW5nLCBsYWJlbD86c3RyaW5nLCBtYWpvcj86Ym9vbGVhbiwgJGNvbnRleHQ/OmFueX19IFRpY2tcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBudW1JdGVtcyBmcm9tIGFyclxuICogQHBhcmFtIHthbnlbXX0gYXJyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtSXRlbXNcbiAqL1xuZnVuY3Rpb24gc2FtcGxlKGFyciwgbnVtSXRlbXMpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGluY3JlbWVudCA9IGFyci5sZW5ndGggLyBudW1JdGVtcztcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgbGVuOyBpICs9IGluY3JlbWVudCkge1xuICAgIHJlc3VsdC5wdXNoKGFycltNYXRoLmZsb29yKGkpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1NjYWxlfSBzY2FsZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9mZnNldEdyaWRMaW5lc1xuICovXG5mdW5jdGlvbiBnZXRQaXhlbEZvckdyaWRMaW5lKHNjYWxlLCBpbmRleCwgb2Zmc2V0R3JpZExpbmVzKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHNjYWxlLnRpY2tzLmxlbmd0aDtcbiAgY29uc3QgdmFsaWRJbmRleCA9IE1hdGgubWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgY29uc3Qgc3RhcnQgPSBzY2FsZS5fc3RhcnRQaXhlbDtcbiAgY29uc3QgZW5kID0gc2NhbGUuX2VuZFBpeGVsO1xuICBjb25zdCBlcHNpbG9uID0gMWUtNjsgLy8gMWUtNiBpcyBtYXJnaW4gaW4gcGl4ZWxzIGZvciBhY2N1bXVsYXRlZCBlcnJvci5cbiAgbGV0IGxpbmVWYWx1ZSA9IHNjYWxlLmdldFBpeGVsRm9yVGljayh2YWxpZEluZGV4KTtcbiAgbGV0IG9mZnNldDtcblxuICBpZiAob2Zmc2V0R3JpZExpbmVzKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgobGluZVZhbHVlIC0gc3RhcnQsIGVuZCAtIGxpbmVWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgb2Zmc2V0ID0gKHNjYWxlLmdldFBpeGVsRm9yVGljaygxKSAtIGxpbmVWYWx1ZSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXQgPSAobGluZVZhbHVlIC0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKHZhbGlkSW5kZXggLSAxKSkgLyAyO1xuICAgIH1cbiAgICBsaW5lVmFsdWUgKz0gdmFsaWRJbmRleCA8IGluZGV4ID8gb2Zmc2V0IDogLW9mZnNldDtcblxuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgdGhlIHBpeGVsIGlzIG91dCBvZiB0aGUgcmFuZ2VcbiAgICBpZiAobGluZVZhbHVlIDwgc3RhcnQgLSBlcHNpbG9uIHx8IGxpbmVWYWx1ZSA+IGVuZCArIGVwc2lsb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVWYWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FjaGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGdhcmJhZ2VDb2xsZWN0KGNhY2hlcywgbGVuZ3RoKSB7XG4gIGVhY2goY2FjaGVzLCAoY2FjaGUpID0+IHtcbiAgICBjb25zdCBnYyA9IGNhY2hlLmdjO1xuICAgIGNvbnN0IGdjTGVuID0gZ2MubGVuZ3RoIC8gMjtcbiAgICBsZXQgaTtcbiAgICBpZiAoZ2NMZW4gPiBsZW5ndGgpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnY0xlbjsgKytpKSB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZS5kYXRhW2djW2ldXTtcbiAgICAgIH1cbiAgICAgIGdjLnNwbGljZSgwLCBnY0xlbik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zLmRyYXdUaWNrcyA/IG9wdGlvbnMudGlja0xlbmd0aCA6IDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VGl0bGVIZWlnaHQob3B0aW9ucywgZmFsbGJhY2spIHtcbiAgaWYgKCFvcHRpb25zLmRpc3BsYXkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IGZvbnQgPSB0b0ZvbnQob3B0aW9ucy5mb250LCBmYWxsYmFjayk7XG4gIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcob3B0aW9ucy5wYWRkaW5nKTtcbiAgY29uc3QgbGluZXMgPSBpc0FycmF5KG9wdGlvbnMudGV4dCkgPyBvcHRpb25zLnRleHQubGVuZ3RoIDogMTtcblxuICByZXR1cm4gKGxpbmVzICogZm9udC5saW5lSGVpZ2h0KSArIHBhZGRpbmcuaGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2FsZUNvbnRleHQocGFyZW50LCBzY2FsZSkge1xuICByZXR1cm4gY3JlYXRlQ29udGV4dChwYXJlbnQsIHtcbiAgICBzY2FsZSxcbiAgICB0eXBlOiAnc2NhbGUnXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUaWNrQ29udGV4dChwYXJlbnQsIGluZGV4LCB0aWNrKSB7XG4gIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgIHRpY2ssXG4gICAgaW5kZXgsXG4gICAgdHlwZTogJ3RpY2snXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0aXRsZUFsaWduKGFsaWduLCBwb3NpdGlvbiwgcmV2ZXJzZSkge1xuICBsZXQgcmV0ID0gX3RvTGVmdFJpZ2h0Q2VudGVyKGFsaWduKTtcbiAgaWYgKChyZXZlcnNlICYmIHBvc2l0aW9uICE9PSAncmlnaHQnKSB8fCAoIXJldmVyc2UgJiYgcG9zaXRpb24gPT09ICdyaWdodCcpKSB7XG4gICAgcmV0ID0gcmV2ZXJzZUFsaWduKHJldCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gdGl0bGVBcmdzKHNjYWxlLCBvZmZzZXQsIHBvc2l0aW9uLCBhbGlnbikge1xuICBjb25zdCB7dG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCBjaGFydH0gPSBzY2FsZTtcbiAgY29uc3Qge2NoYXJ0QXJlYSwgc2NhbGVzfSA9IGNoYXJ0O1xuICBsZXQgcm90YXRpb24gPSAwO1xuICBsZXQgbWF4V2lkdGgsIHRpdGxlWCwgdGl0bGVZO1xuICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuXG4gIGlmIChzY2FsZS5pc0hvcml6b250YWwoKSkge1xuICAgIHRpdGxlWCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBsZWZ0LCByaWdodCk7XG5cbiAgICBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgdGl0bGVZID0gc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSArIGhlaWdodCAtIG9mZnNldDtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgdGl0bGVZID0gKGNoYXJ0QXJlYS5ib3R0b20gKyBjaGFydEFyZWEudG9wKSAvIDIgKyBoZWlnaHQgLSBvZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlWSA9IG9mZnNldEZyb21FZGdlKHNjYWxlLCBwb3NpdGlvbiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgbWF4V2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgIHRpdGxlWCA9IHNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkgLSB3aWR0aCArIG9mZnNldDtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgdGl0bGVYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIgLSB3aWR0aCArIG9mZnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGl0bGVYID0gb2Zmc2V0RnJvbUVkZ2Uoc2NhbGUsIHBvc2l0aW9uLCBvZmZzZXQpO1xuICAgIH1cbiAgICB0aXRsZVkgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgYm90dG9tLCB0b3ApO1xuICAgIHJvdGF0aW9uID0gcG9zaXRpb24gPT09ICdsZWZ0JyA/IC1IQUxGX1BJIDogSEFMRl9QSTtcbiAgfVxuICByZXR1cm4ge3RpdGxlWCwgdGl0bGVZLCBtYXhXaWR0aCwgcm90YXRpb259O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2FsZSBleHRlbmRzIEVsZW1lbnQge1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgdGhpcy5pZCA9IGNmZy5pZDtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLnR5cGUgPSBjZmcudHlwZTtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9ICovXG4gICAgdGhpcy5jdHggPSBjZmcuY3R4O1xuICAgIC8qKiBAdHlwZSB7Q2hhcnR9ICovXG4gICAgdGhpcy5jaGFydCA9IGNmZy5jaGFydDtcblxuICAgIC8vIGltcGxlbWVudHMgYm94XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy50b3AgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5ib3R0b20gPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5sZWZ0ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMucmlnaHQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9tYXJnaW5zID0ge1xuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwXG4gICAgfTtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLm1heFdpZHRoID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMubWF4SGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMucGFkZGluZ1RvcCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIHNjYWxlLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICAvKiogQHR5cGUge3N0cmluZz19ICovXG4gICAgdGhpcy5heGlzID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyPX0gKi9cbiAgICB0aGlzLmxhYmVsUm90YXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5taW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtUaWNrW119ICovXG4gICAgdGhpcy50aWNrcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7b2JqZWN0W118bnVsbH0gKi9cbiAgICB0aGlzLl9ncmlkTGluZUl0ZW1zID0gbnVsbDtcbiAgICAvKiogQHR5cGUge29iamVjdFtdfG51bGx9ICovXG4gICAgdGhpcy5fbGFiZWxJdGVtcyA9IG51bGw7XG4gICAgLyoqIEB0eXBlIHtvYmplY3R8bnVsbH0gKi9cbiAgICB0aGlzLl9sYWJlbFNpemVzID0gbnVsbDtcbiAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgIHRoaXMuX21heExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbG9uZ2VzdFRleHRDYWNoZSA9IHt9O1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuX3N0YXJ0UGl4ZWwgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fZW5kUGl4ZWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmV2ZXJzZVBpeGVscyA9IGZhbHNlO1xuICAgIHRoaXMuX3VzZXJNYXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdXNlck1pbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdWdnZXN0ZWRNYXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3VnZ2VzdGVkTWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3RpY2tzTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9ib3JkZXJWYWx1ZSA9IDA7XG4gICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB0aGlzLl9kYXRhTGltaXRzQ2FjaGVkID0gZmFsc2U7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge2FueX0gb3B0aW9uc1xuXHQgKiBAc2luY2UgMy4wXG5cdCAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuXG4gICAgdGhpcy5heGlzID0gb3B0aW9ucy5heGlzO1xuXG4gICAgLy8gcGFyc2UgbWluL21heCB2YWx1ZSwgc28gd2UgY2FuIHByb3Blcmx5IGRldGVybWluZSBtaW4vbWF4IGZvciBvdGhlciBzY2FsZXNcbiAgICB0aGlzLl91c2VyTWluID0gdGhpcy5wYXJzZShvcHRpb25zLm1pbik7XG4gICAgdGhpcy5fdXNlck1heCA9IHRoaXMucGFyc2Uob3B0aW9ucy5tYXgpO1xuICAgIHRoaXMuX3N1Z2dlc3RlZE1pbiA9IHRoaXMucGFyc2Uob3B0aW9ucy5zdWdnZXN0ZWRNaW4pO1xuICAgIHRoaXMuX3N1Z2dlc3RlZE1heCA9IHRoaXMucGFyc2Uob3B0aW9ucy5zdWdnZXN0ZWRNYXgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIFBhcnNlIGEgc3VwcG9ydGVkIGlucHV0IHZhbHVlIHRvIGludGVybmFsIHJlcHJlc2VudGF0aW9uLlxuXHQgKiBAcGFyYW0geyp9IHJhd1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XVxuXHQgKiBAc2luY2UgMy4wXG5cdCAqL1xuICBwYXJzZShyYXcsIGluZGV4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge3ttaW46IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbkRlZmluZWQ6IGJvb2xlYW4sIG1heERlZmluZWQ6IGJvb2xlYW59fVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBzaW5jZSAzLjBcblx0ICovXG4gIGdldFVzZXJCb3VuZHMoKSB7XG4gICAgbGV0IHtfdXNlck1pbiwgX3VzZXJNYXgsIF9zdWdnZXN0ZWRNaW4sIF9zdWdnZXN0ZWRNYXh9ID0gdGhpcztcbiAgICBfdXNlck1pbiA9IGZpbml0ZU9yRGVmYXVsdChfdXNlck1pbiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICBfdXNlck1heCA9IGZpbml0ZU9yRGVmYXVsdChfdXNlck1heCwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtcbiAgICBfc3VnZ2VzdGVkTWluID0gZmluaXRlT3JEZWZhdWx0KF9zdWdnZXN0ZWRNaW4sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgX3N1Z2dlc3RlZE1heCA9IGZpbml0ZU9yRGVmYXVsdChfc3VnZ2VzdGVkTWF4LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgIHJldHVybiB7XG4gICAgICBtaW46IGZpbml0ZU9yRGVmYXVsdChfdXNlck1pbiwgX3N1Z2dlc3RlZE1pbiksXG4gICAgICBtYXg6IGZpbml0ZU9yRGVmYXVsdChfdXNlck1heCwgX3N1Z2dlc3RlZE1heCksXG4gICAgICBtaW5EZWZpbmVkOiBpc0Zpbml0ZShfdXNlck1pbiksXG4gICAgICBtYXhEZWZpbmVkOiBpc0Zpbml0ZShfdXNlck1heClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FuU3RhY2tcblx0ICogQHJldHVybiB7e21pbjogbnVtYmVyLCBtYXg6IG51bWJlcn19XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHNpbmNlIDMuMFxuXHQgKi9cbiAgZ2V0TWluTWF4KGNhblN0YWNrKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IHJhbmdlO1xuXG4gICAgaWYgKG1pbkRlZmluZWQgJiYgbWF4RGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHttaW4sIG1heH07XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXMgPSB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlsZW4gPSBtZXRhcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHJhbmdlID0gbWV0YXNbaV0uY29udHJvbGxlci5nZXRNaW5NYXgodGhpcywgY2FuU3RhY2spO1xuICAgICAgaWYgKCFtaW5EZWZpbmVkKSB7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgcmFuZ2UubWluKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWF4RGVmaW5lZCkge1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHJhbmdlLm1heCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIG1pbiA8PSBtYXggd2hlbiBvbmx5IG1pbiBvciBtYXggaXMgZGVmaW5lZCBieSB1c2VyIGFuZCB0aGUgZGF0YSBpcyBvdXRzaWRlIHRoYXQgcmFuZ2VcbiAgICBtaW4gPSBtYXhEZWZpbmVkICYmIG1pbiA+IG1heCA/IG1heCA6IG1pbjtcbiAgICBtYXggPSBtaW5EZWZpbmVkICYmIG1pbiA+IG1heCA/IG1pbiA6IG1heDtcblxuICAgIHJldHVybiB7XG4gICAgICBtaW46IGZpbml0ZU9yRGVmYXVsdChtaW4sIGZpbml0ZU9yRGVmYXVsdChtYXgsIG1pbikpLFxuICAgICAgbWF4OiBmaW5pdGVPckRlZmF1bHQobWF4LCBmaW5pdGVPckRlZmF1bHQobWluLCBtYXgpKVxuICAgIH07XG4gIH1cblxuICAvKipcblx0ICogR2V0IHRoZSBwYWRkaW5nIG5lZWRlZCBmb3IgdGhlIHNjYWxlXG5cdCAqIEByZXR1cm4ge3t0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyLCBib3R0b206IG51bWJlciwgcmlnaHQ6IG51bWJlcn19IHRoZSBuZWNlc3NhcnkgcGFkZGluZ1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgZ2V0UGFkZGluZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogdGhpcy5wYWRkaW5nTGVmdCB8fCAwLFxuICAgICAgdG9wOiB0aGlzLnBhZGRpbmdUb3AgfHwgMCxcbiAgICAgIHJpZ2h0OiB0aGlzLnBhZGRpbmdSaWdodCB8fCAwLFxuICAgICAgYm90dG9tOiB0aGlzLnBhZGRpbmdCb3R0b20gfHwgMFxuICAgIH07XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgc2NhbGUgdGljayBvYmplY3RzXG5cdCAqIEByZXR1cm4ge1RpY2tbXX1cblx0ICogQHNpbmNlIDIuN1xuXHQgKi9cbiAgZ2V0VGlja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudGlja3M7XG4gIH1cblxuICAvKipcblx0ICogQHJldHVybiB7c3RyaW5nW119XG5cdCAqL1xuICBnZXRMYWJlbHMoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnQuZGF0YTtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVscyB8fCAodGhpcy5pc0hvcml6b250YWwoKSA/IGRhdGEueExhYmVscyA6IGRhdGEueUxhYmVscykgfHwgZGF0YS5sYWJlbHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7aW1wb3J0KCcuLi90eXBlcy5qcycpLkxhYmVsSXRlbVtdfVxuICAgKi9cbiAgZ2V0TGFiZWxJdGVtcyhjaGFydEFyZWEgPSB0aGlzLmNoYXJ0LmNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fbGFiZWxJdGVtcyB8fCAodGhpcy5fbGFiZWxJdGVtcyA9IHRoaXMuX2NvbXB1dGVMYWJlbEl0ZW1zKGNoYXJ0QXJlYSkpO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIC8vIFdoZW4gYSBuZXcgbGF5b3V0IGlzIGNyZWF0ZWQsIHJlc2V0IHRoZSBkYXRhIGxpbWl0cyBjYWNoZVxuICBiZWZvcmVMYXlvdXQoKSB7XG4gICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB0aGlzLl9kYXRhTGltaXRzQ2FjaGVkID0gZmFsc2U7XG4gIH1cblxuICAvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuICAvLyBBbnkgZnVuY3Rpb24gZGVmaW5lZCBoZXJlIGlzIGluaGVyaXRlZCBieSBhbGwgc2NhbGUgdHlwZXMuXG4gIC8vIEFueSBmdW5jdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIHNjYWxlIHR5cGVcblxuICBiZWZvcmVVcGRhdGUoKSB7XG4gICAgY2FsbCh0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhXaWR0aCAtIHRoZSBtYXggd2lkdGggaW4gcGl4ZWxzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhIZWlnaHQgLSB0aGUgbWF4IGhlaWdodCBpbiBwaXhlbHNcblx0ICogQHBhcmFtIHt7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHJpZ2h0OiBudW1iZXJ9fSBtYXJnaW5zIC0gdGhlIHNwYWNlIGJldHdlZW4gdGhlIGVkZ2Ugb2YgdGhlIG90aGVyIHNjYWxlcyBhbmQgZWRnZSBvZiB0aGUgY2hhcnRcblx0ICogICBUaGlzIHNwYWNlIGNvbWVzIGZyb20gdHdvIHNvdXJjZXM6XG5cdCAqICAgICAtIHBhZGRpbmcgLSBzcGFjZSB0aGF0J3MgcmVxdWlyZWQgdG8gc2hvdyB0aGUgbGFiZWxzIGF0IHRoZSBlZGdlcyBvZiB0aGUgc2NhbGVcblx0ICogICAgIC0gdGhpY2tuZXNzIG9mIHNjYWxlcyBvciBsZWdlbmRzIGluIGFub3RoZXIgb3JpZW50YXRpb25cblx0ICovXG4gIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXJnaW5zKSB7XG4gICAgY29uc3Qge2JlZ2luQXRaZXJvLCBncmFjZSwgdGlja3M6IHRpY2tPcHRzfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBzYW1wbGVTaXplID0gdGlja09wdHMuc2FtcGxlU2l6ZTtcblxuICAgIC8vIFVwZGF0ZSBMaWZlY3ljbGUgLSBQcm9iYWJseSBkb24ndCB3YW50IHRvIGV2ZXIgZXh0ZW5kIG9yIG92ZXJ3cml0ZSB0aGlzIGZ1bmN0aW9uIDspXG4gICAgdGhpcy5iZWZvcmVVcGRhdGUoKTtcblxuICAgIC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuICAgIHRoaXMubWF4V2lkdGggPSBtYXhXaWR0aDtcbiAgICB0aGlzLm1heEhlaWdodCA9IG1heEhlaWdodDtcbiAgICB0aGlzLl9tYXJnaW5zID0gbWFyZ2lucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwXG4gICAgfSwgbWFyZ2lucyk7XG5cbiAgICB0aGlzLnRpY2tzID0gbnVsbDtcbiAgICB0aGlzLl9sYWJlbFNpemVzID0gbnVsbDtcbiAgICB0aGlzLl9ncmlkTGluZUl0ZW1zID0gbnVsbDtcbiAgICB0aGlzLl9sYWJlbEl0ZW1zID0gbnVsbDtcblxuICAgIC8vIERpbWVuc2lvbnNcbiAgICB0aGlzLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuXG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdGhpcy5pc0hvcml6b250YWwoKVxuICAgICAgPyB0aGlzLndpZHRoICsgbWFyZ2lucy5sZWZ0ICsgbWFyZ2lucy5yaWdodFxuICAgICAgOiB0aGlzLmhlaWdodCArIG1hcmdpbnMudG9wICsgbWFyZ2lucy5ib3R0b207XG5cbiAgICAvLyBEYXRhIG1pbi9tYXhcbiAgICBpZiAoIXRoaXMuX2RhdGFMaW1pdHNDYWNoZWQpIHtcbiAgICAgIHRoaXMuYmVmb3JlRGF0YUxpbWl0cygpO1xuICAgICAgdGhpcy5kZXRlcm1pbmVEYXRhTGltaXRzKCk7XG4gICAgICB0aGlzLmFmdGVyRGF0YUxpbWl0cygpO1xuICAgICAgdGhpcy5fcmFuZ2UgPSBfYWRkR3JhY2UodGhpcywgZ3JhY2UsIGJlZ2luQXRaZXJvKTtcbiAgICAgIHRoaXMuX2RhdGFMaW1pdHNDYWNoZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpO1xuXG4gICAgdGhpcy50aWNrcyA9IHRoaXMuYnVpbGRUaWNrcygpIHx8IFtdO1xuXG4gICAgLy8gQWxsb3cgbW9kaWZpY2F0aW9uIG9mIHRpY2tzIGluIGNhbGxiYWNrLlxuICAgIHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7XG5cbiAgICAvLyBDb21wdXRlIHRpY2sgcm90YXRpb24gYW5kIGZpdCB1c2luZyBhIHNhbXBsZWQgc3Vic2V0IG9mIGxhYmVsc1xuICAgIC8vIFdlIGdlbmVyYWxseSBkb24ndCBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZXZlcnkgc2luZ2xlIGxhYmVsIGZvciBkZXRlcm1pbmluZyBzY2FsZSBzaXplXG4gICAgY29uc3Qgc2FtcGxpbmdFbmFibGVkID0gc2FtcGxlU2l6ZSA8IHRoaXMudGlja3MubGVuZ3RoO1xuICAgIHRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHNhbXBsaW5nRW5hYmxlZCA/IHNhbXBsZSh0aGlzLnRpY2tzLCBzYW1wbGVTaXplKSA6IHRoaXMudGlja3MpO1xuXG4gICAgLy8gY29uZmlndXJlIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBoZXJlLCBvbmNlIGZyb20gY29yZS5jb250cm9sbGVyLnVwZGF0ZUxheW91dC5cbiAgICAvLyBIZXJlIHdlIGhhdmVuJ3QgYmVlbiBwb3NpdGlvbmVkIHlldCwgYnV0IGRpbWVuc2lvbnMgYXJlIGNvcnJlY3QuXG4gICAgLy8gVmFyaWFibGVzIHNldCBpbiBjb25maWd1cmUgYXJlIG5lZWRlZCBmb3IgY2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgYW5kXG4gICAgLy8gaXQncyBvayB0aGF0IGNvb3JkaW5hdGVzIGFyZSBub3QgY29ycmVjdCB0aGVyZSwgb25seSBkaW1lbnNpb25zIG1hdHRlci5cbiAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuXG4gICAgLy8gVGljayBSb3RhdGlvblxuICAgIHRoaXMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpOyAvLyBQcmVjb25kaXRpb25zOiBudW1iZXIgb2YgdGlja3MgYW5kIHNpemVzIG9mIGxhcmdlc3QgbGFiZWxzIG11c3QgYmUgY2FsY3VsYXRlZCBiZWZvcmVoYW5kXG4gICAgdGhpcy5hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKTtcblxuICAgIC8vIEF1dG8tc2tpcFxuICAgIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmICh0aWNrT3B0cy5hdXRvU2tpcCB8fCB0aWNrT3B0cy5zb3VyY2UgPT09ICdhdXRvJykpIHtcbiAgICAgIHRoaXMudGlja3MgPSBhdXRvU2tpcCh0aGlzLCB0aGlzLnRpY2tzKTtcbiAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBudWxsO1xuICAgICAgdGhpcy5hZnRlckF1dG9Ta2lwKCk7XG4gICAgfVxuXG4gICAgaWYgKHNhbXBsaW5nRW5hYmxlZCkge1xuICAgICAgLy8gR2VuZXJhdGUgbGFiZWxzIHVzaW5nIGFsbCBub24tc2tpcHBlZCB0aWNrc1xuICAgICAgdGhpcy5fY29udmVydFRpY2tzVG9MYWJlbHModGhpcy50aWNrcyk7XG4gICAgfVxuXG4gICAgdGhpcy5iZWZvcmVGaXQoKTtcbiAgICB0aGlzLmZpdCgpOyAvLyBQcmVjb25kaXRpb25zOiBsYWJlbCByb3RhdGlvbiBhbmQgbGFiZWwgc2l6ZXMgbXVzdCBiZSBjYWxjdWxhdGVkIGJlZm9yZWhhbmRcbiAgICB0aGlzLmFmdGVyRml0KCk7XG5cbiAgICAvLyBJTVBPUlRBTlQ6IGFmdGVyIHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIHRoYXQgYHRoaXMudGlja3NgIHdpbGwgTkVWRVIgY2hhbmdlIVxuXG4gICAgdGhpcy5hZnRlclVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGNvbmZpZ3VyZSgpIHtcbiAgICBsZXQgcmV2ZXJzZVBpeGVscyA9IHRoaXMub3B0aW9ucy5yZXZlcnNlO1xuICAgIGxldCBzdGFydFBpeGVsLCBlbmRQaXhlbDtcblxuICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICBzdGFydFBpeGVsID0gdGhpcy5sZWZ0O1xuICAgICAgZW5kUGl4ZWwgPSB0aGlzLnJpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFBpeGVsID0gdGhpcy50b3A7XG4gICAgICBlbmRQaXhlbCA9IHRoaXMuYm90dG9tO1xuICAgICAgLy8gYnkgZGVmYXVsdCB2ZXJ0aWNhbCBzY2FsZXMgYXJlIGZyb20gYm90dG9tIHRvIHRvcCwgc28gcGl4ZWxzIGFyZSByZXZlcnNlZFxuICAgICAgcmV2ZXJzZVBpeGVscyA9ICFyZXZlcnNlUGl4ZWxzO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFBpeGVsID0gc3RhcnRQaXhlbDtcbiAgICB0aGlzLl9lbmRQaXhlbCA9IGVuZFBpeGVsO1xuICAgIHRoaXMuX3JldmVyc2VQaXhlbHMgPSByZXZlcnNlUGl4ZWxzO1xuICAgIHRoaXMuX2xlbmd0aCA9IGVuZFBpeGVsIC0gc3RhcnRQaXhlbDtcbiAgICB0aGlzLl9hbGlnblRvUGl4ZWxzID0gdGhpcy5vcHRpb25zLmFsaWduVG9QaXhlbHM7XG4gIH1cblxuICBhZnRlclVwZGF0ZSgpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5hZnRlclVwZGF0ZSwgW3RoaXNdKTtcbiAgfVxuXG4gIC8vXG5cbiAgYmVmb3JlU2V0RGltZW5zaW9ucygpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5iZWZvcmVTZXREaW1lbnNpb25zLCBbdGhpc10pO1xuICB9XG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgLy8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgLy8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5tYXhXaWR0aDtcbiAgICAgIHRoaXMubGVmdCA9IDA7XG4gICAgICB0aGlzLnJpZ2h0ID0gdGhpcy53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLm1heEhlaWdodDtcblxuICAgICAgLy8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG4gICAgICB0aGlzLnRvcCA9IDA7XG4gICAgICB0aGlzLmJvdHRvbSA9IHRoaXMuaGVpZ2h0O1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHBhZGRpbmdcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gMDtcbiAgICB0aGlzLnBhZGRpbmdUb3AgPSAwO1xuICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gMDtcbiAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSAwO1xuICB9XG4gIGFmdGVyU2V0RGltZW5zaW9ucygpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5hZnRlclNldERpbWVuc2lvbnMsIFt0aGlzXSk7XG4gIH1cblxuICBfY2FsbEhvb2tzKG5hbWUpIHtcbiAgICB0aGlzLmNoYXJ0Lm5vdGlmeVBsdWdpbnMobmFtZSwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNhbGwodGhpcy5vcHRpb25zW25hbWVdLCBbdGhpc10pO1xuICB9XG5cbiAgLy8gRGF0YSBsaW1pdHNcbiAgYmVmb3JlRGF0YUxpbWl0cygpIHtcbiAgICB0aGlzLl9jYWxsSG9va3MoJ2JlZm9yZURhdGFMaW1pdHMnKTtcbiAgfVxuICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge31cbiAgYWZ0ZXJEYXRhTGltaXRzKCkge1xuICAgIHRoaXMuX2NhbGxIb29rcygnYWZ0ZXJEYXRhTGltaXRzJyk7XG4gIH1cblxuICAvL1xuICBiZWZvcmVCdWlsZFRpY2tzKCkge1xuICAgIHRoaXMuX2NhbGxIb29rcygnYmVmb3JlQnVpbGRUaWNrcycpO1xuICB9XG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtvYmplY3RbXX0gdGhlIHRpY2tzXG5cdCAqL1xuICBidWlsZFRpY2tzKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBhZnRlckJ1aWxkVGlja3MoKSB7XG4gICAgdGhpcy5fY2FsbEhvb2tzKCdhZnRlckJ1aWxkVGlja3MnKTtcbiAgfVxuXG4gIGJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbigpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG4gIH1cbiAgLyoqXG5cdCAqIENvbnZlcnQgdGlja3MgdG8gbGFiZWwgc3RyaW5nc1xuXHQgKiBAcGFyYW0ge1RpY2tbXX0gdGlja3Ncblx0ICovXG4gIGdlbmVyYXRlVGlja0xhYmVscyh0aWNrcykge1xuICAgIGNvbnN0IHRpY2tPcHRzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuICAgIGxldCBpLCBpbGVuLCB0aWNrO1xuICAgIGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspIHtcbiAgICAgIHRpY2sgPSB0aWNrc1tpXTtcbiAgICAgIHRpY2subGFiZWwgPSBjYWxsKHRpY2tPcHRzLmNhbGxiYWNrLCBbdGljay52YWx1ZSwgaSwgdGlja3NdLCB0aGlzKTtcbiAgICB9XG4gIH1cbiAgYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24oKSB7XG4gICAgY2FsbCh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG4gIH1cblxuICAvL1xuXG4gIGJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSB7XG4gICAgY2FsbCh0aGlzLm9wdGlvbnMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgW3RoaXNdKTtcbiAgfVxuICBjYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IG51bVRpY2tzID0gZ2V0VGlja3NMaW1pdCh0aGlzLnRpY2tzLmxlbmd0aCwgb3B0aW9ucy50aWNrcy5tYXhUaWNrc0xpbWl0KTtcbiAgICBjb25zdCBtaW5Sb3RhdGlvbiA9IHRpY2tPcHRzLm1pblJvdGF0aW9uIHx8IDA7XG4gICAgY29uc3QgbWF4Um90YXRpb24gPSB0aWNrT3B0cy5tYXhSb3RhdGlvbjtcbiAgICBsZXQgbGFiZWxSb3RhdGlvbiA9IG1pblJvdGF0aW9uO1xuICAgIGxldCB0aWNrV2lkdGgsIG1heEhlaWdodCwgbWF4TGFiZWxEaWFnb25hbDtcblxuICAgIGlmICghdGhpcy5faXNWaXNpYmxlKCkgfHwgIXRpY2tPcHRzLmRpc3BsYXkgfHwgbWluUm90YXRpb24gPj0gbWF4Um90YXRpb24gfHwgbnVtVGlja3MgPD0gMSB8fCAhdGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgdGhpcy5sYWJlbFJvdGF0aW9uID0gbWluUm90YXRpb247XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxTaXplcyA9IHRoaXMuX2dldExhYmVsU2l6ZXMoKTtcbiAgICBjb25zdCBtYXhMYWJlbFdpZHRoID0gbGFiZWxTaXplcy53aWRlc3Qud2lkdGg7XG4gICAgY29uc3QgbWF4TGFiZWxIZWlnaHQgPSBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0O1xuXG4gICAgLy8gRXN0aW1hdGUgdGhlIHdpZHRoIG9mIGVhY2ggZ3JpZCBiYXNlZCBvbiB0aGUgY2FudmFzIHdpZHRoLCB0aGUgbWF4aW11bVxuICAgIC8vIGxhYmVsIHdpZHRoIGFuZCB0aGUgbnVtYmVyIG9mIHRpY2sgaW50ZXJ2YWxzXG4gICAgY29uc3QgbWF4V2lkdGggPSBfbGltaXRWYWx1ZSh0aGlzLmNoYXJ0LndpZHRoIC0gbWF4TGFiZWxXaWR0aCwgMCwgdGhpcy5tYXhXaWR0aCk7XG4gICAgdGlja1dpZHRoID0gb3B0aW9ucy5vZmZzZXQgPyB0aGlzLm1heFdpZHRoIC8gbnVtVGlja3MgOiBtYXhXaWR0aCAvIChudW1UaWNrcyAtIDEpO1xuXG4gICAgLy8gQWxsb3cgMyBwaXhlbHMgeDIgcGFkZGluZyBlaXRoZXIgc2lkZSBmb3IgbGFiZWwgcmVhZGFiaWxpdHlcbiAgICBpZiAobWF4TGFiZWxXaWR0aCArIDYgPiB0aWNrV2lkdGgpIHtcbiAgICAgIHRpY2tXaWR0aCA9IG1heFdpZHRoIC8gKG51bVRpY2tzIC0gKG9wdGlvbnMub2Zmc2V0ID8gMC41IDogMSkpO1xuICAgICAgbWF4SGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgLSBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zLmdyaWQpXG5cdFx0XHRcdC0gdGlja09wdHMucGFkZGluZyAtIGdldFRpdGxlSGVpZ2h0KG9wdGlvbnMudGl0bGUsIHRoaXMuY2hhcnQub3B0aW9ucy5mb250KTtcbiAgICAgIG1heExhYmVsRGlhZ29uYWwgPSBNYXRoLnNxcnQobWF4TGFiZWxXaWR0aCAqIG1heExhYmVsV2lkdGggKyBtYXhMYWJlbEhlaWdodCAqIG1heExhYmVsSGVpZ2h0KTtcbiAgICAgIGxhYmVsUm90YXRpb24gPSB0b0RlZ3JlZXMoTWF0aC5taW4oXG4gICAgICAgIE1hdGguYXNpbihfbGltaXRWYWx1ZSgobGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCArIDYpIC8gdGlja1dpZHRoLCAtMSwgMSkpLFxuICAgICAgICBNYXRoLmFzaW4oX2xpbWl0VmFsdWUobWF4SGVpZ2h0IC8gbWF4TGFiZWxEaWFnb25hbCwgLTEsIDEpKSAtIE1hdGguYXNpbihfbGltaXRWYWx1ZShtYXhMYWJlbEhlaWdodCAvIG1heExhYmVsRGlhZ29uYWwsIC0xLCAxKSlcbiAgICAgICkpO1xuICAgICAgbGFiZWxSb3RhdGlvbiA9IE1hdGgubWF4KG1pblJvdGF0aW9uLCBNYXRoLm1pbihtYXhSb3RhdGlvbiwgbGFiZWxSb3RhdGlvbikpO1xuICAgIH1cblxuICAgIHRoaXMubGFiZWxSb3RhdGlvbiA9IGxhYmVsUm90YXRpb247XG4gIH1cbiAgYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgIGNhbGwodGhpcy5vcHRpb25zLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgW3RoaXNdKTtcbiAgfVxuICBhZnRlckF1dG9Ta2lwKCkge31cblxuICAvL1xuXG4gIGJlZm9yZUZpdCgpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5iZWZvcmVGaXQsIFt0aGlzXSk7XG4gIH1cbiAgZml0KCkge1xuICAgIC8vIFJlc2V0XG4gICAgY29uc3QgbWluU2l6ZSA9IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcblxuICAgIGNvbnN0IHtjaGFydCwgb3B0aW9uczoge3RpY2tzOiB0aWNrT3B0cywgdGl0bGU6IHRpdGxlT3B0cywgZ3JpZDogZ3JpZE9wdHN9fSA9IHRoaXM7XG4gICAgY29uc3QgZGlzcGxheSA9IHRoaXMuX2lzVmlzaWJsZSgpO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG5cbiAgICBpZiAoZGlzcGxheSkge1xuICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCh0aXRsZU9wdHMsIGNoYXJ0Lm9wdGlvbnMuZm9udCk7XG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIG1pblNpemUud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICBtaW5TaXplLmhlaWdodCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWRPcHRzKSArIHRpdGxlSGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluU2l6ZS5oZWlnaHQgPSB0aGlzLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxuICAgICAgICBtaW5TaXplLndpZHRoID0gZ2V0VGlja01hcmtMZW5ndGgoZ3JpZE9wdHMpICsgdGl0bGVIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGJvdGhlciBmaXR0aW5nIHRoZSB0aWNrcyBpZiB3ZSBhcmUgbm90IHNob3dpbmcgdGhlIGxhYmVsc1xuICAgICAgaWYgKHRpY2tPcHRzLmRpc3BsYXkgJiYgdGhpcy50aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qge2ZpcnN0LCBsYXN0LCB3aWRlc3QsIGhpZ2hlc3R9ID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgICAgICBjb25zdCB0aWNrUGFkZGluZyA9IHRpY2tPcHRzLnBhZGRpbmcgKiAyO1xuICAgICAgICBjb25zdCBhbmdsZVJhZGlhbnMgPSB0b1JhZGlhbnModGhpcy5sYWJlbFJvdGF0aW9uKTtcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKTtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGVSYWRpYW5zKTtcblxuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIC8vIEEgaG9yaXpvbnRhbCBheGlzIGlzIG1vcmUgY29uc3RyYWluZWQgYnkgdGhlIGhlaWdodC5cbiAgICAgICAgICBjb25zdCBsYWJlbEhlaWdodCA9IHRpY2tPcHRzLm1pcnJvciA/IDAgOiBzaW4gKiB3aWRlc3Qud2lkdGggKyBjb3MgKiBoaWdoZXN0LmhlaWdodDtcbiAgICAgICAgICBtaW5TaXplLmhlaWdodCA9IE1hdGgubWluKHRoaXMubWF4SGVpZ2h0LCBtaW5TaXplLmhlaWdodCArIGxhYmVsSGVpZ2h0ICsgdGlja1BhZGRpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBIHZlcnRpY2FsIGF4aXMgaXMgbW9yZSBjb25zdHJhaW5lZCBieSB0aGUgd2lkdGguIExhYmVscyBhcmUgdGhlXG4gICAgICAgIC8vIGRvbWluYW50IGZhY3RvciBoZXJlLCBzbyBnZXQgdGhhdCBsZW5ndGggZmlyc3QgYW5kIGFjY291bnQgZm9yIHBhZGRpbmdcbiAgICAgICAgICBjb25zdCBsYWJlbFdpZHRoID0gdGlja09wdHMubWlycm9yID8gMCA6IGNvcyAqIHdpZGVzdC53aWR0aCArIHNpbiAqIGhpZ2hlc3QuaGVpZ2h0O1xuXG4gICAgICAgICAgbWluU2l6ZS53aWR0aCA9IE1hdGgubWluKHRoaXMubWF4V2lkdGgsIG1pblNpemUud2lkdGggKyBsYWJlbFdpZHRoICsgdGlja1BhZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZVBhZGRpbmcoZmlyc3QsIGxhc3QsIHNpbiwgY29zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVNYXJnaW5zKCk7XG5cbiAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5fbGVuZ3RoID0gY2hhcnQud2lkdGggLSB0aGlzLl9tYXJnaW5zLmxlZnQgLSB0aGlzLl9tYXJnaW5zLnJpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQgPSBtaW5TaXplLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aWR0aCA9IG1pblNpemUud2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHRoaXMuX2xlbmd0aCA9IGNoYXJ0LmhlaWdodCAtIHRoaXMuX21hcmdpbnMudG9wIC0gdGhpcy5fbWFyZ2lucy5ib3R0b207XG4gICAgfVxuICB9XG5cbiAgX2NhbGN1bGF0ZVBhZGRpbmcoZmlyc3QsIGxhc3QsIHNpbiwgY29zKSB7XG4gICAgY29uc3Qge3RpY2tzOiB7YWxpZ24sIHBhZGRpbmd9LCBwb3NpdGlvbn0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgaXNSb3RhdGVkID0gdGhpcy5sYWJlbFJvdGF0aW9uICE9PSAwO1xuICAgIGNvbnN0IGxhYmVsc0JlbG93VGlja3MgPSBwb3NpdGlvbiAhPT0gJ3RvcCcgJiYgdGhpcy5heGlzID09PSAneCc7XG5cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9IHRoaXMuZ2V0UGl4ZWxGb3JUaWNrKDApIC0gdGhpcy5sZWZ0O1xuICAgICAgY29uc3Qgb2Zmc2V0UmlnaHQgPSB0aGlzLnJpZ2h0IC0gdGhpcy5nZXRQaXhlbEZvclRpY2sodGhpcy50aWNrcy5sZW5ndGggLSAxKTtcbiAgICAgIGxldCBwYWRkaW5nTGVmdCA9IDA7XG4gICAgICBsZXQgcGFkZGluZ1JpZ2h0ID0gMDtcblxuICAgICAgLy8gRW5zdXJlIHRoYXQgb3VyIHRpY2tzIGFyZSBhbHdheXMgaW5zaWRlIHRoZSBjYW52YXMuIFdoZW4gcm90YXRlZCwgdGlja3MgYXJlIHJpZ2h0IGFsaWduZWRcbiAgICAgIC8vIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJpZ2h0IHBhZGRpbmcgaXMgZG9taW5hdGVkIGJ5IHRoZSBmb250IGhlaWdodFxuICAgICAgaWYgKGlzUm90YXRlZCkge1xuICAgICAgICBpZiAobGFiZWxzQmVsb3dUaWNrcykge1xuICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gY29zICogZmlyc3Qud2lkdGg7XG4gICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gc2luICogbGFzdC5oZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQgPSBzaW4gKiBmaXJzdC5oZWlnaHQ7XG4gICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gY29zICogbGFzdC53aWR0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICBwYWRkaW5nUmlnaHQgPSBsYXN0LndpZHRoO1xuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcGFkZGluZ0xlZnQgPSBmaXJzdC53aWR0aDtcbiAgICAgIH0gZWxzZSBpZiAoYWxpZ24gIT09ICdpbm5lcicpIHtcbiAgICAgICAgcGFkZGluZ0xlZnQgPSBmaXJzdC53aWR0aCAvIDI7XG4gICAgICAgIHBhZGRpbmdSaWdodCA9IGxhc3Qud2lkdGggLyAyO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgcGFkZGluZyB0YWtpbmcgaW50byBhY2NvdW50IGNoYW5nZXMgaW4gb2Zmc2V0c1xuICAgICAgdGhpcy5wYWRkaW5nTGVmdCA9IE1hdGgubWF4KChwYWRkaW5nTGVmdCAtIG9mZnNldExlZnQgKyBwYWRkaW5nKSAqIHRoaXMud2lkdGggLyAodGhpcy53aWR0aCAtIG9mZnNldExlZnQpLCAwKTtcbiAgICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gTWF0aC5tYXgoKHBhZGRpbmdSaWdodCAtIG9mZnNldFJpZ2h0ICsgcGFkZGluZykgKiB0aGlzLndpZHRoIC8gKHRoaXMud2lkdGggLSBvZmZzZXRSaWdodCksIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGFkZGluZ1RvcCA9IGxhc3QuaGVpZ2h0IC8gMjtcbiAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gZmlyc3QuaGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHBhZGRpbmdUb3AgPSAwO1xuICAgICAgICBwYWRkaW5nQm90dG9tID0gZmlyc3QuaGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcGFkZGluZ1RvcCA9IGxhc3QuaGVpZ2h0O1xuICAgICAgICBwYWRkaW5nQm90dG9tID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZ1RvcCArIHBhZGRpbmc7XG4gICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSBwYWRkaW5nQm90dG9tICsgcGFkZGluZztcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogSGFuZGxlIG1hcmdpbnMgYW5kIHBhZGRpbmcgaW50ZXJhY3Rpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaGFuZGxlTWFyZ2lucygpIHtcbiAgICBpZiAodGhpcy5fbWFyZ2lucykge1xuICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nTGVmdCwgdGhpcy5fbWFyZ2lucy5sZWZ0KTtcbiAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLCB0aGlzLl9tYXJnaW5zLnRvcCk7XG4gICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nUmlnaHQsIHRoaXMuX21hcmdpbnMucmlnaHQpO1xuICAgICAgdGhpcy5fbWFyZ2lucy5ib3R0b20gPSBNYXRoLm1heCh0aGlzLnBhZGRpbmdCb3R0b20sIHRoaXMuX21hcmdpbnMuYm90dG9tKTtcbiAgICB9XG4gIH1cblxuICBhZnRlckZpdCgpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5hZnRlckZpdCwgW3RoaXNdKTtcbiAgfVxuXG4gIC8vIFNoYXJlZCBNZXRob2RzXG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cbiAgaXNIb3Jpem9udGFsKCkge1xuICAgIGNvbnN0IHtheGlzLCBwb3NpdGlvbn0gPSB0aGlzLm9wdGlvbnM7XG4gICAgcmV0dXJuIHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgYXhpcyA9PT0gJ3gnO1xuICB9XG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cbiAgaXNGdWxsU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZ1bGxTaXplO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7VGlja1tdfSB0aWNrc1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRpY2tzKSB7XG4gICAgdGhpcy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24oKTtcblxuICAgIHRoaXMuZ2VuZXJhdGVUaWNrTGFiZWxzKHRpY2tzKTtcblxuICAgIC8vIFRpY2tzIHNob3VsZCBiZSBza2lwcGVkIHdoZW4gY2FsbGJhY2sgcmV0dXJucyBudWxsIG9yIHVuZGVmLCBzbyBsZXRzIHJlbW92ZSB0aG9zZS5cbiAgICBsZXQgaSwgaWxlbjtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZih0aWNrc1tpXS5sYWJlbCkpIHtcbiAgICAgICAgdGlja3Muc3BsaWNlKGksIDEpO1xuICAgICAgICBpbGVuLS07XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCk7XG4gIH1cblxuICAvKipcblx0ICogQHJldHVybiB7eyBmaXJzdDogb2JqZWN0LCBsYXN0OiBvYmplY3QsIHdpZGVzdDogb2JqZWN0LCBoaWdoZXN0OiBvYmplY3QsIHdpZHRoczogQXJyYXksIGhlaWdodHM6IGFycmF5IH19XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0TGFiZWxTaXplcygpIHtcbiAgICBsZXQgbGFiZWxTaXplcyA9IHRoaXMuX2xhYmVsU2l6ZXM7XG5cbiAgICBpZiAoIWxhYmVsU2l6ZXMpIHtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSB0aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZTtcbiAgICAgIGxldCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICBpZiAoc2FtcGxlU2l6ZSA8IHRpY2tzLmxlbmd0aCkge1xuICAgICAgICB0aWNrcyA9IHNhbXBsZSh0aWNrcywgc2FtcGxlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBsYWJlbFNpemVzID0gdGhpcy5fY29tcHV0ZUxhYmVsU2l6ZXModGlja3MsIHRpY2tzLmxlbmd0aCwgdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBsYWJlbFNpemVzO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMge3dpZHRoLCBoZWlnaHQsIG9mZnNldH0gb2JqZWN0cyBmb3IgdGhlIGZpcnN0LCBsYXN0LCB3aWRlc3QsIGhpZ2hlc3QgdGlja1xuXHQgKiBsYWJlbHMgd2hlcmUgb2Zmc2V0IGluZGljYXRlcyB0aGUgYW5jaG9yIHBvaW50IG9mZnNldCBmcm9tIHRoZSB0b3AgaW4gcGl4ZWxzLlxuXHQgKiBAcmV0dXJuIHt7IGZpcnN0OiBvYmplY3QsIGxhc3Q6IG9iamVjdCwgd2lkZXN0OiBvYmplY3QsIGhpZ2hlc3Q6IG9iamVjdCwgd2lkdGhzOiBBcnJheSwgaGVpZ2h0czogYXJyYXkgfX1cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9jb21wdXRlTGFiZWxTaXplcyh0aWNrcywgbGVuZ3RoLCBtYXhUaWNrc0xpbWl0KSB7XG4gICAgY29uc3Qge2N0eCwgX2xvbmdlc3RUZXh0Q2FjaGU6IGNhY2hlc30gPSB0aGlzO1xuICAgIGNvbnN0IHdpZHRocyA9IFtdO1xuICAgIGNvbnN0IGhlaWdodHMgPSBbXTtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSBNYXRoLmZsb29yKGxlbmd0aCAvIGdldFRpY2tzTGltaXQobGVuZ3RoLCBtYXhUaWNrc0xpbWl0KSk7XG4gICAgbGV0IHdpZGVzdExhYmVsU2l6ZSA9IDA7XG4gICAgbGV0IGhpZ2hlc3RMYWJlbFNpemUgPSAwO1xuICAgIGxldCBpLCBqLCBqbGVuLCBsYWJlbCwgdGlja0ZvbnQsIGZvbnRTdHJpbmcsIGNhY2hlLCBsaW5lSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBuZXN0ZWRMYWJlbDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gaW5jcmVtZW50KSB7XG4gICAgICBsYWJlbCA9IHRpY2tzW2ldLmxhYmVsO1xuICAgICAgdGlja0ZvbnQgPSB0aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKGkpO1xuICAgICAgY3R4LmZvbnQgPSBmb250U3RyaW5nID0gdGlja0ZvbnQuc3RyaW5nO1xuICAgICAgY2FjaGUgPSBjYWNoZXNbZm9udFN0cmluZ10gPSBjYWNoZXNbZm9udFN0cmluZ10gfHwge2RhdGE6IHt9LCBnYzogW119O1xuICAgICAgbGluZUhlaWdodCA9IHRpY2tGb250LmxpbmVIZWlnaHQ7XG4gICAgICB3aWR0aCA9IGhlaWdodCA9IDA7XG4gICAgICAvLyBVbmRlZmluZWQgbGFiZWxzIGFuZCBhcnJheXMgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZFxuICAgICAgaWYgKCFpc051bGxPclVuZGVmKGxhYmVsKSAmJiAhaXNBcnJheShsYWJlbCkpIHtcbiAgICAgICAgd2lkdGggPSBfbWVhc3VyZVRleHQoY3R4LCBjYWNoZS5kYXRhLCBjYWNoZS5nYywgd2lkdGgsIGxhYmVsKTtcbiAgICAgICAgaGVpZ2h0ID0gbGluZUhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShsYWJlbCkpIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgbGV0J3MgbWVhc3VyZSBlYWNoIGVsZW1lbnRcbiAgICAgICAgZm9yIChqID0gMCwgamxlbiA9IGxhYmVsLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuICAgICAgICAgIG5lc3RlZExhYmVsID0gbGFiZWxbal07XG4gICAgICAgICAgLy8gVW5kZWZpbmVkIGxhYmVscyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWYobmVzdGVkTGFiZWwpICYmICFpc0FycmF5KG5lc3RlZExhYmVsKSkge1xuICAgICAgICAgICAgd2lkdGggPSBfbWVhc3VyZVRleHQoY3R4LCBjYWNoZS5kYXRhLCBjYWNoZS5nYywgd2lkdGgsIG5lc3RlZExhYmVsKTtcbiAgICAgICAgICAgIGhlaWdodCArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2lkdGhzLnB1c2god2lkdGgpO1xuICAgICAgaGVpZ2h0cy5wdXNoKGhlaWdodCk7XG4gICAgICB3aWRlc3RMYWJlbFNpemUgPSBNYXRoLm1heCh3aWR0aCwgd2lkZXN0TGFiZWxTaXplKTtcbiAgICAgIGhpZ2hlc3RMYWJlbFNpemUgPSBNYXRoLm1heChoZWlnaHQsIGhpZ2hlc3RMYWJlbFNpemUpO1xuICAgIH1cbiAgICBnYXJiYWdlQ29sbGVjdChjYWNoZXMsIGxlbmd0aCk7XG5cbiAgICBjb25zdCB3aWRlc3QgPSB3aWR0aHMuaW5kZXhPZih3aWRlc3RMYWJlbFNpemUpO1xuICAgIGNvbnN0IGhpZ2hlc3QgPSBoZWlnaHRzLmluZGV4T2YoaGlnaGVzdExhYmVsU2l6ZSk7XG5cbiAgICBjb25zdCB2YWx1ZUF0ID0gKGlkeCkgPT4gKHt3aWR0aDogd2lkdGhzW2lkeF0gfHwgMCwgaGVpZ2h0OiBoZWlnaHRzW2lkeF0gfHwgMH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0OiB2YWx1ZUF0KDApLFxuICAgICAgbGFzdDogdmFsdWVBdChsZW5ndGggLSAxKSxcbiAgICAgIHdpZGVzdDogdmFsdWVBdCh3aWRlc3QpLFxuICAgICAgaGlnaGVzdDogdmFsdWVBdChoaWdoZXN0KSxcbiAgICAgIHdpZHRocyxcbiAgICAgIGhlaWdodHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgbGFiZWwgdG8gZGlzcGxheSBpbiB0aGUgdG9vbHRpcCBmb3IgdGhlIGdpdmVuIHZhbHVlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cbiAgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBwb2ludC4gVmFsdWUgY2FuIGVpdGhlciBiZSBhbiBpbmRleCBvciBhIG51bWVyaWNhbCB2YWx1ZVxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlLCBpbmRleCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgZGF0YSB2YWx1ZSBmcm9tIGEgZ2l2ZW4gcGl4ZWwuIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgZ2V0UGl4ZWxGb3JWYWx1ZVxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBpeGVsXG5cdCAqIEByZXR1cm4geyp9XG5cdCAqL1xuICBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0aWNrIGF0IHRoZSBnaXZlbiBpbmRleFxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG4gIGdldFBpeGVsRm9yVGljayhpbmRleCkge1xuICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlja3MubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGlja3NbaW5kZXhdLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVdGlsaXR5IGZvciBnZXR0aW5nIHRoZSBwaXhlbCBsb2NhdGlvbiBvZiBhIHBlcmNlbnRhZ2Ugb2Ygc2NhbGVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG4gIGdldFBpeGVsRm9yRGVjaW1hbChkZWNpbWFsKSB7XG4gICAgaWYgKHRoaXMuX3JldmVyc2VQaXhlbHMpIHtcbiAgICAgIGRlY2ltYWwgPSAxIC0gZGVjaW1hbDtcbiAgICB9XG5cbiAgICBjb25zdCBwaXhlbCA9IHRoaXMuX3N0YXJ0UGl4ZWwgKyBkZWNpbWFsICogdGhpcy5fbGVuZ3RoO1xuICAgIHJldHVybiBfaW50MTZSYW5nZSh0aGlzLl9hbGlnblRvUGl4ZWxzID8gX2FsaWduUGl4ZWwodGhpcy5jaGFydCwgcGl4ZWwsIDApIDogcGl4ZWwpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICBjb25zdCBkZWNpbWFsID0gKHBpeGVsIC0gdGhpcy5fc3RhcnRQaXhlbCkgLyB0aGlzLl9sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX3JldmVyc2VQaXhlbHMgPyAxIC0gZGVjaW1hbCA6IGRlY2ltYWw7XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgZm9yIHRoZSBtaW5pbXVtIGNoYXJ0IHZhbHVlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRCYXNlUGl4ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldEJhc2VWYWx1ZSgpKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRCYXNlVmFsdWUoKSB7XG4gICAgY29uc3Qge21pbiwgbWF4fSA9IHRoaXM7XG5cbiAgICByZXR1cm4gbWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDpcbiAgICAgIG1pbiA+IDAgJiYgbWF4ID4gMCA/IG1pbiA6XG4gICAgICAwO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldENvbnRleHQoaW5kZXgpIHtcbiAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3MgfHwgW107XG5cbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRpY2tzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdGljayA9IHRpY2tzW2luZGV4XTtcbiAgICAgIHJldHVybiB0aWNrLiRjb250ZXh0IHx8XG5cdFx0XHRcdCh0aWNrLiRjb250ZXh0ID0gY3JlYXRlVGlja0NvbnRleHQodGhpcy5nZXRDb250ZXh0KCksIGluZGV4LCB0aWNrKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8XG5cdFx0XHQodGhpcy4kY29udGV4dCA9IGNyZWF0ZVNjYWxlQ29udGV4dCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSwgdGhpcykpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF90aWNrU2l6ZSgpIHtcbiAgICBjb25zdCBvcHRpb25UaWNrcyA9IHRoaXMub3B0aW9ucy50aWNrcztcblxuICAgIC8vIENhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgYnkgbGFiZWwgaW4gYXhpcyBkaXJlY3Rpb24uXG4gICAgY29uc3Qgcm90ID0gdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG4gICAgY29uc3QgY29zID0gTWF0aC5hYnMoTWF0aC5jb3Mocm90KSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5hYnMoTWF0aC5zaW4ocm90KSk7XG5cbiAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBvcHRpb25UaWNrcy5hdXRvU2tpcFBhZGRpbmcgfHwgMDtcbiAgICBjb25zdCB3ID0gbGFiZWxTaXplcyA/IGxhYmVsU2l6ZXMud2lkZXN0LndpZHRoICsgcGFkZGluZyA6IDA7XG4gICAgY29uc3QgaCA9IGxhYmVsU2l6ZXMgPyBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0ICsgcGFkZGluZyA6IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGZvciAxIHRpY2sgaW4gYXhpcyBkaXJlY3Rpb24uXG4gICAgcmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKClcbiAgICAgID8gaCAqIGNvcyA+IHcgKiBzaW4gPyB3IC8gY29zIDogaCAvIHNpblxuICAgICAgOiBoICogc2luIDwgdyAqIGNvcyA/IGggLyBjb3MgOiB3IC8gc2luO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaXNWaXNpYmxlKCkge1xuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTtcblxuICAgIGlmIChkaXNwbGF5ICE9PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiAhIWRpc3BsYXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY29tcHV0ZUdyaWRMaW5lSXRlbXMoY2hhcnRBcmVhKSB7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcztcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB7Z3JpZCwgcG9zaXRpb24sIGJvcmRlcn0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9mZnNldCA9IGdyaWQub2Zmc2V0O1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgIGNvbnN0IHRpY2tzTGVuZ3RoID0gdGlja3MubGVuZ3RoICsgKG9mZnNldCA/IDEgOiAwKTtcbiAgICBjb25zdCB0bCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWQpO1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG5cbiAgICBjb25zdCBib3JkZXJPcHRzID0gYm9yZGVyLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNvbnN0IGF4aXNXaWR0aCA9IGJvcmRlck9wdHMuZGlzcGxheSA/IGJvcmRlck9wdHMud2lkdGggOiAwO1xuICAgIGNvbnN0IGF4aXNIYWxmV2lkdGggPSBheGlzV2lkdGggLyAyO1xuICAgIGNvbnN0IGFsaWduQm9yZGVyVmFsdWUgPSBmdW5jdGlvbihwaXhlbCkge1xuICAgICAgcmV0dXJuIF9hbGlnblBpeGVsKGNoYXJ0LCBwaXhlbCwgYXhpc1dpZHRoKTtcbiAgICB9O1xuICAgIGxldCBib3JkZXJWYWx1ZSwgaSwgbGluZVZhbHVlLCBhbGlnbmVkTGluZVZhbHVlO1xuICAgIGxldCB0eDEsIHR5MSwgdHgyLCB0eTIsIHgxLCB5MSwgeDIsIHkyO1xuXG4gICAgaWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMuYm90dG9tKTtcbiAgICAgIHR5MSA9IHRoaXMuYm90dG9tIC0gdGw7XG4gICAgICB0eTIgPSBib3JkZXJWYWx1ZSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICB5MSA9IGFsaWduQm9yZGVyVmFsdWUoY2hhcnRBcmVhLnRvcCkgKyBheGlzSGFsZldpZHRoO1xuICAgICAgeTIgPSBjaGFydEFyZWEuYm90dG9tO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy50b3ApO1xuICAgICAgeTEgPSBjaGFydEFyZWEudG9wO1xuICAgICAgeTIgPSBhbGlnbkJvcmRlclZhbHVlKGNoYXJ0QXJlYS5ib3R0b20pIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR5MSA9IGJvcmRlclZhbHVlICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR5MiA9IHRoaXMudG9wICsgdGw7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy5yaWdodCk7XG4gICAgICB0eDEgPSB0aGlzLnJpZ2h0IC0gdGw7XG4gICAgICB0eDIgPSBib3JkZXJWYWx1ZSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICB4MSA9IGFsaWduQm9yZGVyVmFsdWUoY2hhcnRBcmVhLmxlZnQpICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgIHgyID0gY2hhcnRBcmVhLnJpZ2h0O1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLmxlZnQpO1xuICAgICAgeDEgPSBjaGFydEFyZWEubGVmdDtcbiAgICAgIHgyID0gYWxpZ25Cb3JkZXJWYWx1ZShjaGFydEFyZWEucmlnaHQpIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR4MSA9IGJvcmRlclZhbHVlICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR4MiA9IHRoaXMubGVmdCArIHRsO1xuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3gnKSB7XG4gICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSgoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMiArIDAuNSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLmNoYXJ0LnNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkpO1xuICAgICAgfVxuXG4gICAgICB5MSA9IGNoYXJ0QXJlYS50b3A7XG4gICAgICB5MiA9IGNoYXJ0QXJlYS5ib3R0b207XG4gICAgICB0eTEgPSBib3JkZXJWYWx1ZSArIGF4aXNIYWxmV2lkdGg7XG4gICAgICB0eTIgPSB0eTEgKyB0bDtcbiAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUoKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIpO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy5jaGFydC5zY2FsZXNbcG9zaXRpb25BeGlzSURdLmdldFBpeGVsRm9yVmFsdWUodmFsdWUpKTtcbiAgICAgIH1cblxuICAgICAgdHgxID0gYm9yZGVyVmFsdWUgLSBheGlzSGFsZldpZHRoO1xuICAgICAgdHgyID0gdHgxIC0gdGw7XG4gICAgICB4MSA9IGNoYXJ0QXJlYS5sZWZ0O1xuICAgICAgeDIgPSBjaGFydEFyZWEucmlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXQgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQsIHRpY2tzTGVuZ3RoKTtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRpY2tzTGVuZ3RoIC8gbGltaXQpKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlja3NMZW5ndGg7IGkgKz0gc3RlcCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChpKTtcbiAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gZ3JpZC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgY29uc3Qgb3B0c0F0SW5kZXhCb3JkZXIgPSBib3JkZXIuc2V0Q29udGV4dChjb250ZXh0KTtcblxuICAgICAgY29uc3QgbGluZVdpZHRoID0gb3B0c0F0SW5kZXgubGluZVdpZHRoO1xuICAgICAgY29uc3QgbGluZUNvbG9yID0gb3B0c0F0SW5kZXguY29sb3I7XG4gICAgICBjb25zdCBib3JkZXJEYXNoID0gb3B0c0F0SW5kZXhCb3JkZXIuZGFzaCB8fCBbXTtcbiAgICAgIGNvbnN0IGJvcmRlckRhc2hPZmZzZXQgPSBvcHRzQXRJbmRleEJvcmRlci5kYXNoT2Zmc2V0O1xuXG4gICAgICBjb25zdCB0aWNrV2lkdGggPSBvcHRzQXRJbmRleC50aWNrV2lkdGg7XG4gICAgICBjb25zdCB0aWNrQ29sb3IgPSBvcHRzQXRJbmRleC50aWNrQ29sb3I7XG4gICAgICBjb25zdCB0aWNrQm9yZGVyRGFzaCA9IG9wdHNBdEluZGV4LnRpY2tCb3JkZXJEYXNoIHx8IFtdO1xuICAgICAgY29uc3QgdGlja0JvcmRlckRhc2hPZmZzZXQgPSBvcHRzQXRJbmRleC50aWNrQm9yZGVyRGFzaE9mZnNldDtcblxuICAgICAgbGluZVZhbHVlID0gZ2V0UGl4ZWxGb3JHcmlkTGluZSh0aGlzLCBpLCBvZmZzZXQpO1xuXG4gICAgICAvLyBTa2lwIGlmIHRoZSBwaXhlbCBpcyBvdXQgb2YgdGhlIHJhbmdlXG4gICAgICBpZiAobGluZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFsaWduZWRMaW5lVmFsdWUgPSBfYWxpZ25QaXhlbChjaGFydCwgbGluZVZhbHVlLCBsaW5lV2lkdGgpO1xuXG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIHR4MSA9IHR4MiA9IHgxID0geDIgPSBhbGlnbmVkTGluZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHkxID0gdHkyID0geTEgPSB5MiA9IGFsaWduZWRMaW5lVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICB0eDEsXG4gICAgICAgIHR5MSxcbiAgICAgICAgdHgyLFxuICAgICAgICB0eTIsXG4gICAgICAgIHgxLFxuICAgICAgICB5MSxcbiAgICAgICAgeDIsXG4gICAgICAgIHkyLFxuICAgICAgICB3aWR0aDogbGluZVdpZHRoLFxuICAgICAgICBjb2xvcjogbGluZUNvbG9yLFxuICAgICAgICBib3JkZXJEYXNoLFxuICAgICAgICBib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgICB0aWNrV2lkdGgsXG4gICAgICAgIHRpY2tDb2xvcixcbiAgICAgICAgdGlja0JvcmRlckRhc2gsXG4gICAgICAgIHRpY2tCb3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdGlja3NMZW5ndGggPSB0aWNrc0xlbmd0aDtcbiAgICB0aGlzLl9ib3JkZXJWYWx1ZSA9IGJvcmRlclZhbHVlO1xuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY29tcHV0ZUxhYmVsSXRlbXMoY2hhcnRBcmVhKSB7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcztcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHtwb3NpdGlvbiwgdGlja3M6IG9wdGlvblRpY2tzfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5pc0hvcml6b250YWwoKTtcbiAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgY29uc3Qge2FsaWduLCBjcm9zc0FsaWduLCBwYWRkaW5nLCBtaXJyb3J9ID0gb3B0aW9uVGlja3M7XG4gICAgY29uc3QgdGwgPSBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zLmdyaWQpO1xuICAgIGNvbnN0IHRpY2tBbmRQYWRkaW5nID0gdGwgKyBwYWRkaW5nO1xuICAgIGNvbnN0IGhUaWNrQW5kUGFkZGluZyA9IG1pcnJvciA/IC1wYWRkaW5nIDogdGlja0FuZFBhZGRpbmc7XG4gICAgY29uc3Qgcm90YXRpb24gPSAtdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBsZXQgaSwgaWxlbiwgdGljaywgbGFiZWwsIHgsIHksIHRleHRBbGlnbiwgcGl4ZWwsIGZvbnQsIGxpbmVIZWlnaHQsIGxpbmVDb3VudCwgdGV4dE9mZnNldDtcbiAgICBsZXQgdGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICB5ID0gdGhpcy5ib3R0b20gLSBoVGlja0FuZFBhZGRpbmc7XG4gICAgICB0ZXh0QWxpZ24gPSB0aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHkgPSB0aGlzLnRvcCArIGhUaWNrQW5kUGFkZGluZztcbiAgICAgIHRleHRBbGlnbiA9IHRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgIGNvbnN0IHJldCA9IHRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQodGwpO1xuICAgICAgdGV4dEFsaWduID0gcmV0LnRleHRBbGlnbjtcbiAgICAgIHggPSByZXQueDtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICBjb25zdCByZXQgPSB0aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHRsKTtcbiAgICAgIHRleHRBbGlnbiA9IHJldC50ZXh0QWxpZ247XG4gICAgICB4ID0gcmV0Lng7XG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneCcpIHtcbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgeSA9ICgoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMikgKyB0aWNrQW5kUGFkZGluZztcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uQXhpc0lEID0gT2JqZWN0LmtleXMocG9zaXRpb24pWzBdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgeSA9IHRoaXMuY2hhcnQuc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSArIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgfVxuICAgICAgdGV4dEFsaWduID0gdGhpcy5fZ2V0WEF4aXNMYWJlbEFsaWdubWVudCgpO1xuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIHggPSAoKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIpIC0gdGlja0FuZFBhZGRpbmc7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgIHggPSB0aGlzLmNoYXJ0LnNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0ZXh0QWxpZ24gPSB0aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHRsKS50ZXh0QWxpZ247XG4gICAgfVxuXG4gICAgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgdGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxTaXplcyA9IHRoaXMuX2dldExhYmVsU2l6ZXMoKTtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB0aWNrID0gdGlja3NbaV07XG4gICAgICBsYWJlbCA9IHRpY2subGFiZWw7XG5cbiAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gb3B0aW9uVGlja3Muc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoaSkpO1xuICAgICAgcGl4ZWwgPSB0aGlzLmdldFBpeGVsRm9yVGljayhpKSArIG9wdGlvblRpY2tzLmxhYmVsT2Zmc2V0O1xuICAgICAgZm9udCA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoaSk7XG4gICAgICBsaW5lSGVpZ2h0ID0gZm9udC5saW5lSGVpZ2h0O1xuICAgICAgbGluZUNvdW50ID0gaXNBcnJheShsYWJlbCkgPyBsYWJlbC5sZW5ndGggOiAxO1xuICAgICAgY29uc3QgaGFsZkNvdW50ID0gbGluZUNvdW50IC8gMjtcbiAgICAgIGNvbnN0IGNvbG9yID0gb3B0c0F0SW5kZXguY29sb3I7XG4gICAgICBjb25zdCBzdHJva2VDb2xvciA9IG9wdHNBdEluZGV4LnRleHRTdHJva2VDb2xvcjtcbiAgICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gb3B0c0F0SW5kZXgudGV4dFN0cm9rZVdpZHRoO1xuICAgICAgbGV0IHRpY2tUZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG5cbiAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgeCA9IHBpeGVsO1xuXG4gICAgICAgIGlmICh0ZXh0QWxpZ24gPT09ICdpbm5lcicpIHtcbiAgICAgICAgICBpZiAoaSA9PT0gaWxlbiAtIDEpIHtcbiAgICAgICAgICAgIHRpY2tUZXh0QWxpZ24gPSAhdGhpcy5vcHRpb25zLnJldmVyc2UgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdGlja1RleHRBbGlnbiA9ICF0aGlzLm9wdGlvbnMucmV2ZXJzZSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpY2tUZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKGNyb3NzQWxpZ24gPT09ICduZWFyJyB8fCByb3RhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1saW5lQ291bnQgKiBsaW5lSGVpZ2h0ICsgbGluZUhlaWdodCAvIDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1sYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0IC8gMiAtIGhhbGZDb3VudCAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gLWxhYmVsU2l6ZXMuaGlnaGVzdC5oZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxuICAgICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicgfHwgcm90YXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHRleHRPZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAvIDIgLSBoYWxmQ291bnQgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAtIGxpbmVDb3VudCAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaXJyb3IpIHtcbiAgICAgICAgICB0ZXh0T2Zmc2V0ICo9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3RhdGlvbiAhPT0gMCAmJiAhb3B0c0F0SW5kZXguc2hvd0xhYmVsQmFja2Ryb3ApIHtcbiAgICAgICAgICB4ICs9IChsaW5lSGVpZ2h0IC8gMikgKiBNYXRoLnNpbihyb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkgPSBwaXhlbDtcbiAgICAgICAgdGV4dE9mZnNldCA9ICgxIC0gbGluZUNvdW50KSAqIGxpbmVIZWlnaHQgLyAyO1xuICAgICAgfVxuXG4gICAgICBsZXQgYmFja2Ryb3A7XG5cbiAgICAgIGlmIChvcHRzQXRJbmRleC5zaG93TGFiZWxCYWNrZHJvcCkge1xuICAgICAgICBjb25zdCBsYWJlbFBhZGRpbmcgPSB0b1BhZGRpbmcob3B0c0F0SW5kZXguYmFja2Ryb3BQYWRkaW5nKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gbGFiZWxTaXplcy5oZWlnaHRzW2ldO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGxhYmVsU2l6ZXMud2lkdGhzW2ldO1xuXG4gICAgICAgIGxldCB0b3AgPSB0ZXh0T2Zmc2V0IC0gbGFiZWxQYWRkaW5nLnRvcDtcbiAgICAgICAgbGV0IGxlZnQgPSAwIC0gbGFiZWxQYWRkaW5nLmxlZnQ7XG5cbiAgICAgICAgc3dpdGNoICh0ZXh0QmFzZWxpbmUpIHtcbiAgICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgICB0b3AgLT0gaGVpZ2h0IC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgLT0gaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHtcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBsZWZ0IC09IHdpZHRoIC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gd2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBiYWNrZHJvcCA9IHtcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aDogd2lkdGggKyBsYWJlbFBhZGRpbmcud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyBsYWJlbFBhZGRpbmcuaGVpZ2h0LFxuXG4gICAgICAgICAgY29sb3I6IG9wdHNBdEluZGV4LmJhY2tkcm9wQ29sb3IsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbCxcbiAgICAgICAgZm9udCxcbiAgICAgICAgdGV4dE9mZnNldCxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHN0cm9rZUNvbG9yLFxuICAgICAgICAgIHN0cm9rZVdpZHRoLFxuICAgICAgICAgIHRleHRBbGlnbjogdGlja1RleHRBbGlnbixcbiAgICAgICAgICB0ZXh0QmFzZWxpbmUsXG4gICAgICAgICAgdHJhbnNsYXRpb246IFt4LCB5XSxcbiAgICAgICAgICBiYWNrZHJvcCxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKSB7XG4gICAgY29uc3Qge3Bvc2l0aW9uLCB0aWNrc30gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qgcm90YXRpb24gPSAtdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG5cbiAgICBpZiAocm90YXRpb24pIHtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH1cblxuICAgIGxldCBhbGlnbiA9ICdjZW50ZXInO1xuXG4gICAgaWYgKHRpY2tzLmFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICBhbGlnbiA9ICdsZWZ0JztcbiAgICB9IGVsc2UgaWYgKHRpY2tzLmFsaWduID09PSAnZW5kJykge1xuICAgICAgYWxpZ24gPSAncmlnaHQnO1xuICAgIH0gZWxzZSBpZiAodGlja3MuYWxpZ24gPT09ICdpbm5lcicpIHtcbiAgICAgIGFsaWduID0gJ2lubmVyJztcbiAgICB9XG5cbiAgICByZXR1cm4gYWxpZ247XG4gIH1cblxuICBfZ2V0WUF4aXNMYWJlbEFsaWdubWVudCh0bCkge1xuICAgIGNvbnN0IHtwb3NpdGlvbiwgdGlja3M6IHtjcm9zc0FsaWduLCBtaXJyb3IsIHBhZGRpbmd9fSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgIGNvbnN0IHRpY2tBbmRQYWRkaW5nID0gdGwgKyBwYWRkaW5nO1xuICAgIGNvbnN0IHdpZGVzdCA9IGxhYmVsU2l6ZXMud2lkZXN0LndpZHRoO1xuXG4gICAgbGV0IHRleHRBbGlnbjtcbiAgICBsZXQgeDtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBpZiAobWlycm9yKSB7XG4gICAgICAgIHggPSB0aGlzLnJpZ2h0ICsgcGFkZGluZztcblxuICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgeCArPSAod2lkZXN0IC8gMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICB4ICs9IHdpZGVzdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IHRoaXMucmlnaHQgLSB0aWNrQW5kUGFkZGluZztcblxuICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgIHggLT0gKHdpZGVzdCAvIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICB4ID0gdGhpcy5sZWZ0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgaWYgKG1pcnJvcikge1xuICAgICAgICB4ID0gdGhpcy5sZWZ0ICsgcGFkZGluZztcblxuICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgIHggLT0gKHdpZGVzdCAvIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICB4IC09IHdpZGVzdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IHRoaXMubGVmdCArIHRpY2tBbmRQYWRkaW5nO1xuXG4gICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicpIHtcbiAgICAgICAgICB0ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgICB4ICs9IHdpZGVzdCAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICB4ID0gdGhpcy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgIH1cblxuICAgIHJldHVybiB7dGV4dEFsaWduLCB4fTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbXB1dGVMYWJlbEFyZWEoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50aWNrcy5taXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdsZWZ0JyB8fCBwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIHt0b3A6IDAsIGxlZnQ6IHRoaXMubGVmdCwgYm90dG9tOiBjaGFydC5oZWlnaHQsIHJpZ2h0OiB0aGlzLnJpZ2h0fTtcbiAgICB9IGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICByZXR1cm4ge3RvcDogdGhpcy50b3AsIGxlZnQ6IDAsIGJvdHRvbTogdGhpcy5ib3R0b20sIHJpZ2h0OiBjaGFydC53aWR0aH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIGRyYXdCYWNrZ3JvdW5kKCkge1xuICAgIGNvbnN0IHtjdHgsIG9wdGlvbnM6IHtiYWNrZ3JvdW5kQ29sb3J9LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHR9ID0gdGhpcztcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgIGN0eC5maWxsUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRMaW5lV2lkdGhGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLm9wdGlvbnMuZ3JpZDtcbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8ICFncmlkLmRpc3BsYXkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgY29uc3QgaW5kZXggPSB0aWNrcy5maW5kSW5kZXgodCA9PiB0LnZhbHVlID09PSB2YWx1ZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBncmlkLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGluZGV4KSk7XG4gICAgICByZXR1cm4gb3B0cy5saW5lV2lkdGg7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdHcmlkKGNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLm9wdGlvbnMuZ3JpZDtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2dyaWRMaW5lSXRlbXMgfHwgKHRoaXMuX2dyaWRMaW5lSXRlbXMgPSB0aGlzLl9jb21wdXRlR3JpZExpbmVJdGVtcyhjaGFydEFyZWEpKTtcbiAgICBsZXQgaSwgaWxlbjtcblxuICAgIGNvbnN0IGRyYXdMaW5lID0gKHAxLCBwMiwgc3R5bGUpID0+IHtcbiAgICAgIGlmICghc3R5bGUud2lkdGggfHwgIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHgubGluZVdpZHRoID0gc3R5bGUud2lkdGg7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChzdHlsZS5ib3JkZXJEYXNoIHx8IFtdKTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IHN0eWxlLmJvcmRlckRhc2hPZmZzZXQ7XG5cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8ocDEueCwgcDEueSk7XG4gICAgICBjdHgubGluZVRvKHAyLngsIHAyLnkpO1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9O1xuXG4gICAgaWYgKGdyaWQuZGlzcGxheSkge1xuICAgICAgZm9yIChpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG5cbiAgICAgICAgaWYgKGdyaWQuZHJhd09uQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgZHJhd0xpbmUoXG4gICAgICAgICAgICB7eDogaXRlbS54MSwgeTogaXRlbS55MX0sXG4gICAgICAgICAgICB7eDogaXRlbS54MiwgeTogaXRlbS55Mn0sXG4gICAgICAgICAgICBpdGVtXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChncmlkLmRyYXdUaWNrcykge1xuICAgICAgICAgIGRyYXdMaW5lKFxuICAgICAgICAgICAge3g6IGl0ZW0udHgxLCB5OiBpdGVtLnR5MX0sXG4gICAgICAgICAgICB7eDogaXRlbS50eDIsIHk6IGl0ZW0udHkyfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sb3I6IGl0ZW0udGlja0NvbG9yLFxuICAgICAgICAgICAgICB3aWR0aDogaXRlbS50aWNrV2lkdGgsXG4gICAgICAgICAgICAgIGJvcmRlckRhc2g6IGl0ZW0udGlja0JvcmRlckRhc2gsXG4gICAgICAgICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IGl0ZW0udGlja0JvcmRlckRhc2hPZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdCb3JkZXIoKSB7XG4gICAgY29uc3Qge2NoYXJ0LCBjdHgsIG9wdGlvbnM6IHtib3JkZXIsIGdyaWR9fSA9IHRoaXM7XG4gICAgY29uc3QgYm9yZGVyT3B0cyA9IGJvcmRlci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICBjb25zdCBheGlzV2lkdGggPSBib3JkZXIuZGlzcGxheSA/IGJvcmRlck9wdHMud2lkdGggOiAwO1xuICAgIGlmICghYXhpc1dpZHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RMaW5lV2lkdGggPSBncmlkLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KDApKS5saW5lV2lkdGg7XG4gICAgY29uc3QgYm9yZGVyVmFsdWUgPSB0aGlzLl9ib3JkZXJWYWx1ZTtcbiAgICBsZXQgeDEsIHgyLCB5MSwgeTI7XG5cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgeDEgPSBfYWxpZ25QaXhlbChjaGFydCwgdGhpcy5sZWZ0LCBheGlzV2lkdGgpIC0gYXhpc1dpZHRoIC8gMjtcbiAgICAgIHgyID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMucmlnaHQsIGxhc3RMaW5lV2lkdGgpICsgbGFzdExpbmVXaWR0aCAvIDI7XG4gICAgICB5MSA9IHkyID0gYm9yZGVyVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHkxID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMudG9wLCBheGlzV2lkdGgpIC0gYXhpc1dpZHRoIC8gMjtcbiAgICAgIHkyID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMuYm90dG9tLCBsYXN0TGluZVdpZHRoKSArIGxhc3RMaW5lV2lkdGggLyAyO1xuICAgICAgeDEgPSB4MiA9IGJvcmRlclZhbHVlO1xuICAgIH1cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5saW5lV2lkdGggPSBib3JkZXJPcHRzLndpZHRoO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGJvcmRlck9wdHMuY29sb3I7XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4Lm1vdmVUbyh4MSwgeTEpO1xuICAgIGN0eC5saW5lVG8oeDIsIHkyKTtcbiAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdMYWJlbHMoY2hhcnRBcmVhKSB7XG4gICAgY29uc3Qgb3B0aW9uVGlja3MgPSB0aGlzLm9wdGlvbnMudGlja3M7XG5cbiAgICBpZiAoIW9wdGlvblRpY2tzLmRpc3BsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblxuICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9jb21wdXRlTGFiZWxBcmVhKCk7XG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIGNsaXBBcmVhKGN0eCwgYXJlYSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldExhYmVsSXRlbXMoY2hhcnRBcmVhKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGNvbnN0IHJlbmRlclRleHRPcHRpb25zID0gaXRlbS5vcHRpb25zO1xuICAgICAgY29uc3QgdGlja0ZvbnQgPSBpdGVtLmZvbnQ7XG4gICAgICBjb25zdCBsYWJlbCA9IGl0ZW0ubGFiZWw7XG4gICAgICBjb25zdCB5ID0gaXRlbS50ZXh0T2Zmc2V0O1xuICAgICAgcmVuZGVyVGV4dChjdHgsIGxhYmVsLCAwLCB5LCB0aWNrRm9udCwgcmVuZGVyVGV4dE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChhcmVhKSB7XG4gICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdUaXRsZSgpIHtcbiAgICBjb25zdCB7Y3R4LCBvcHRpb25zOiB7cG9zaXRpb24sIHRpdGxlLCByZXZlcnNlfX0gPSB0aGlzO1xuXG4gICAgaWYgKCF0aXRsZS5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9udCA9IHRvRm9udCh0aXRsZS5mb250KTtcbiAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlLnBhZGRpbmcpO1xuICAgIGNvbnN0IGFsaWduID0gdGl0bGUuYWxpZ247XG4gICAgbGV0IG9mZnNldCA9IGZvbnQubGluZUhlaWdodCAvIDI7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdib3R0b20nIHx8IHBvc2l0aW9uID09PSAnY2VudGVyJyB8fCBpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgIG9mZnNldCArPSBwYWRkaW5nLmJvdHRvbTtcbiAgICAgIGlmIChpc0FycmF5KHRpdGxlLnRleHQpKSB7XG4gICAgICAgIG9mZnNldCArPSBmb250LmxpbmVIZWlnaHQgKiAodGl0bGUudGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ICs9IHBhZGRpbmcudG9wO1xuICAgIH1cblxuICAgIGNvbnN0IHt0aXRsZVgsIHRpdGxlWSwgbWF4V2lkdGgsIHJvdGF0aW9ufSA9IHRpdGxlQXJncyh0aGlzLCBvZmZzZXQsIHBvc2l0aW9uLCBhbGlnbik7XG5cbiAgICByZW5kZXJUZXh0KGN0eCwgdGl0bGUudGV4dCwgMCwgMCwgZm9udCwge1xuICAgICAgY29sb3I6IHRpdGxlLmNvbG9yLFxuICAgICAgbWF4V2lkdGgsXG4gICAgICByb3RhdGlvbixcbiAgICAgIHRleHRBbGlnbjogdGl0bGVBbGlnbihhbGlnbiwgcG9zaXRpb24sIHJldmVyc2UpLFxuICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgIHRyYW5zbGF0aW9uOiBbdGl0bGVYLCB0aXRsZVldLFxuICAgIH0pO1xuICB9XG5cbiAgZHJhdyhjaGFydEFyZWEpIHtcbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmF3QmFja2dyb3VuZCgpO1xuICAgIHRoaXMuZHJhd0dyaWQoY2hhcnRBcmVhKTtcbiAgICB0aGlzLmRyYXdCb3JkZXIoKTtcbiAgICB0aGlzLmRyYXdUaXRsZSgpO1xuICAgIHRoaXMuZHJhd0xhYmVscyhjaGFydEFyZWEpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge29iamVjdFtdfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2xheWVycygpIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHR6ID0gb3B0cy50aWNrcyAmJiBvcHRzLnRpY2tzLnogfHwgMDtcbiAgICBjb25zdCBneiA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZ3JpZCAmJiBvcHRzLmdyaWQueiwgLTEpO1xuICAgIGNvbnN0IGJ6ID0gdmFsdWVPckRlZmF1bHQob3B0cy5ib3JkZXIgJiYgb3B0cy5ib3JkZXIueiwgMCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8IHRoaXMuZHJhdyAhPT0gU2NhbGUucHJvdG90eXBlLmRyYXcpIHtcbiAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGRyYXcgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBjdXN0b20gc2NhbGVcbiAgICAgIHJldHVybiBbe1xuICAgICAgICB6OiB0eixcbiAgICAgICAgZHJhdzogKGNoYXJ0QXJlYSkgPT4ge1xuICAgICAgICAgIHRoaXMuZHJhdyhjaGFydEFyZWEpO1xuICAgICAgICB9XG4gICAgICB9XTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3tcbiAgICAgIHo6IGd6LFxuICAgICAgZHJhdzogKGNoYXJ0QXJlYSkgPT4ge1xuICAgICAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMuZHJhd0dyaWQoY2hhcnRBcmVhKTtcbiAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB6OiBieixcbiAgICAgIGRyYXc6ICgpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3Qm9yZGVyKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgejogdHosXG4gICAgICBkcmF3OiAoY2hhcnRBcmVhKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd0xhYmVscyhjaGFydEFyZWEpO1xuICAgICAgfVxuICAgIH1dO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdmlzaWJsZSBkYXRhc2V0IG1ldGFzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoaXMgc2NhbGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlXSAtIGlmIHNwZWNpZmllZCwgYWxzbyBmaWx0ZXIgYnkgZGF0YXNldCB0eXBlXG5cdCAqIEByZXR1cm4ge29iamVjdFtdfVxuXHQgKi9cbiAgZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSkge1xuICAgIGNvbnN0IG1ldGFzID0gdGhpcy5jaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgY29uc3QgYXhpc0lEID0gdGhpcy5heGlzICsgJ0F4aXNJRCc7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBjb25zdCBtZXRhID0gbWV0YXNbaV07XG4gICAgICBpZiAobWV0YVtheGlzSURdID09PSB0aGlzLmlkICYmICghdHlwZSB8fCBtZXRhLnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1ldGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuXHQgKiBAcmV0dXJuIHtvYmplY3R9XG5cdCAqIEBwcm90ZWN0ZWRcbiBcdCAqL1xuICBfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyhpbmRleCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMudGlja3Muc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoaW5kZXgpKTtcbiAgICByZXR1cm4gdG9Gb250KG9wdHMuZm9udCk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgX21heERpZ2l0cygpIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCkubGluZUhlaWdodDtcbiAgICByZXR1cm4gKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoIDogdGhpcy5oZWlnaHQpIC8gZm9udFNpemU7XG4gIH1cbn1cbiIsICJpbXBvcnQge21lcmdlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCBkZWZhdWx0cywge292ZXJyaWRlc30gZnJvbSAnLi9jb3JlLmRlZmF1bHRzLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIGRlZmF1bHRzOiBhbnksIG92ZXJyaWRlcz86IGFueSwgZGVmYXVsdFJvdXRlczogYW55fX0gSUNoYXJ0Q29tcG9uZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZWRSZWdpc3RyeSB7XG4gIGNvbnN0cnVjdG9yKHR5cGUsIHNjb3BlLCBvdmVycmlkZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTtcbiAgICB0aGlzLml0ZW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGlzRm9yVHlwZSh0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZi5jYWxsKHRoaXMudHlwZS5wcm90b3R5cGUsIHR5cGUucHJvdG90eXBlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0lDaGFydENvbXBvbmVudH0gaXRlbVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2NvcGUgd2hlcmUgaXRlbXMgZGVmYXVsdHMgd2VyZSByZWdpc3RlcmVkIHRvLlxuXHQgKi9cbiAgcmVnaXN0ZXIoaXRlbSkge1xuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGl0ZW0pO1xuICAgIGxldCBwYXJlbnRTY29wZTtcblxuICAgIGlmIChpc0lDaGFydENvbXBvbmVudChwcm90bykpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHJlZ2lzdGVyZWQgYW5kIG5vdGUgdGhlIHNjb3BlIHdoZXJlIGl0cyBkZWZhdWx0cyBhcmUuXG4gICAgICBwYXJlbnRTY29wZSA9IHRoaXMucmVnaXN0ZXIocHJvdG8pO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBjb25zdCBpZCA9IGl0ZW0uaWQ7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlICsgJy4nICsgaWQ7XG5cbiAgICBpZiAoIWlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzIGRvZXMgbm90IGhhdmUgaWQ6ICcgKyBpdGVtKTtcbiAgICB9XG5cbiAgICBpZiAoaWQgaW4gaXRlbXMpIHtcbiAgICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH1cblxuICAgIGl0ZW1zW2lkXSA9IGl0ZW07XG4gICAgcmVnaXN0ZXJEZWZhdWx0cyhpdGVtLCBzY29wZSwgcGFyZW50U2NvcGUpO1xuICAgIGlmICh0aGlzLm92ZXJyaWRlKSB7XG4gICAgICBkZWZhdWx0cy5vdmVycmlkZShpdGVtLmlkLCBpdGVtLm92ZXJyaWRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0P31cblx0ICovXG4gIGdldChpZCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zW2lkXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0lDaGFydENvbXBvbmVudH0gaXRlbVxuXHQgKi9cbiAgdW5yZWdpc3RlcihpdGVtKSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIGNvbnN0IGlkID0gaXRlbS5pZDtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XG5cbiAgICBpZiAoaWQgaW4gaXRlbXMpIHtcbiAgICAgIGRlbGV0ZSBpdGVtc1tpZF07XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlICYmIGlkIGluIGRlZmF1bHRzW3Njb3BlXSkge1xuICAgICAgZGVsZXRlIGRlZmF1bHRzW3Njb3BlXVtpZF07XG4gICAgICBpZiAodGhpcy5vdmVycmlkZSkge1xuICAgICAgICBkZWxldGUgb3ZlcnJpZGVzW2lkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0cyhpdGVtLCBzY29wZSwgcGFyZW50U2NvcGUpIHtcbiAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGVmYXVsdHMgYW5kIGtlZXAgZXhpc3RpbmcgZGVmYXVsdHNcbiAgY29uc3QgaXRlbURlZmF1bHRzID0gbWVyZ2UoT2JqZWN0LmNyZWF0ZShudWxsKSwgW1xuICAgIHBhcmVudFNjb3BlID8gZGVmYXVsdHMuZ2V0KHBhcmVudFNjb3BlKSA6IHt9LFxuICAgIGRlZmF1bHRzLmdldChzY29wZSksXG4gICAgaXRlbS5kZWZhdWx0c1xuICBdKTtcblxuICBkZWZhdWx0cy5zZXQoc2NvcGUsIGl0ZW1EZWZhdWx0cyk7XG5cbiAgaWYgKGl0ZW0uZGVmYXVsdFJvdXRlcykge1xuICAgIHJvdXRlRGVmYXVsdHMoc2NvcGUsIGl0ZW0uZGVmYXVsdFJvdXRlcyk7XG4gIH1cblxuICBpZiAoaXRlbS5kZXNjcmlwdG9ycykge1xuICAgIGRlZmF1bHRzLmRlc2NyaWJlKHNjb3BlLCBpdGVtLmRlc2NyaXB0b3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByb3V0ZURlZmF1bHRzKHNjb3BlLCByb3V0ZXMpIHtcbiAgT2JqZWN0LmtleXMocm91dGVzKS5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eVBhcnRzID0gcHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gcHJvcGVydHlQYXJ0cy5wb3AoKTtcbiAgICBjb25zdCBzb3VyY2VTY29wZSA9IFtzY29wZV0uY29uY2F0KHByb3BlcnR5UGFydHMpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBwYXJ0cyA9IHJvdXRlc1twcm9wZXJ0eV0uc3BsaXQoJy4nKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gcGFydHMucG9wKCk7XG4gICAgY29uc3QgdGFyZ2V0U2NvcGUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgZGVmYXVsdHMucm91dGUoc291cmNlU2NvcGUsIHNvdXJjZU5hbWUsIHRhcmdldFNjb3BlLCB0YXJnZXROYW1lKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzSUNoYXJ0Q29tcG9uZW50KHByb3RvKSB7XG4gIHJldHVybiAnaWQnIGluIHByb3RvICYmICdkZWZhdWx0cycgaW4gcHJvdG87XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4vY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQgU2NhbGUgZnJvbSAnLi9jb3JlLnNjYWxlLmpzJztcbmltcG9ydCBUeXBlZFJlZ2lzdHJ5IGZyb20gJy4vY29yZS50eXBlZFJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7ZWFjaCwgY2FsbGJhY2sgYXMgY2FsbCwgX2NhcGl0YWxpemV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBQbGVhc2UgdXNlIHRoZSBtb2R1bGUncyBkZWZhdWx0IGV4cG9ydCB3aGljaCBwcm92aWRlcyBhIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogTm90ZTogY2xhc3MgaXMgZXhwb3J0ZWQgZm9yIHR5cGVkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250cm9sbGVycyA9IG5ldyBUeXBlZFJlZ2lzdHJ5KERhdGFzZXRDb250cm9sbGVyLCAnZGF0YXNldHMnLCB0cnVlKTtcbiAgICB0aGlzLmVsZW1lbnRzID0gbmV3IFR5cGVkUmVnaXN0cnkoRWxlbWVudCwgJ2VsZW1lbnRzJyk7XG4gICAgdGhpcy5wbHVnaW5zID0gbmV3IFR5cGVkUmVnaXN0cnkoT2JqZWN0LCAncGx1Z2lucycpO1xuICAgIHRoaXMuc2NhbGVzID0gbmV3IFR5cGVkUmVnaXN0cnkoU2NhbGUsICdzY2FsZXMnKTtcbiAgICAvLyBPcmRlciBpcyBpbXBvcnRhbnQsIFNjYWxlIGhhcyBFbGVtZW50IGluIHByb3RvdHlwZSBjaGFpbixcbiAgICAvLyBzbyBTY2FsZXMgbXVzdCBiZSBiZWZvcmUgRWxlbWVudHMuIFBsdWdpbnMgYXJlIGEgZmFsbGJhY2ssIHNvIG5vdCBsaXN0ZWQgaGVyZS5cbiAgICB0aGlzLl90eXBlZFJlZ2lzdHJpZXMgPSBbdGhpcy5jb250cm9sbGVycywgdGhpcy5zY2FsZXMsIHRoaXMuZWxlbWVudHNdO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuXHQgKi9cbiAgYWRkKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MpO1xuICB9XG5cbiAgcmVtb3ZlKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4udHlwZW9mIERhdGFzZXRDb250cm9sbGVyfSBhcmdzXG5cdCAqL1xuICBhZGRDb250cm9sbGVycyguLi5hcmdzKSB7XG4gICAgdGhpcy5fZWFjaCgncmVnaXN0ZXInLCBhcmdzLCB0aGlzLmNvbnRyb2xsZXJzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0gIHsuLi50eXBlb2YgRWxlbWVudH0gYXJnc1xuXHQgKi9cbiAgYWRkRWxlbWVudHMoLi4uYXJncykge1xuICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncywgdGhpcy5lbGVtZW50cyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG5cdCAqL1xuICBhZGRQbHVnaW5zKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MsIHRoaXMucGx1Z2lucyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4udHlwZW9mIFNjYWxlfSBhcmdzXG5cdCAqL1xuICBhZGRTY2FsZXMoLi4uYXJncykge1xuICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncywgdGhpcy5zY2FsZXMpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7dHlwZW9mIERhdGFzZXRDb250cm9sbGVyfVxuXHQgKi9cbiAgZ2V0Q29udHJvbGxlcihpZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMuY29udHJvbGxlcnMsICdjb250cm9sbGVyJyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt0eXBlb2YgRWxlbWVudH1cblx0ICovXG4gIGdldEVsZW1lbnQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0KGlkLCB0aGlzLmVsZW1lbnRzLCAnZWxlbWVudCcpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cbiAgZ2V0UGx1Z2luKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldChpZCwgdGhpcy5wbHVnaW5zLCAncGx1Z2luJyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt0eXBlb2YgU2NhbGV9XG5cdCAqL1xuICBnZXRTY2FsZShpZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMuc2NhbGVzLCAnc2NhbGUnKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0gIHsuLi50eXBlb2YgRGF0YXNldENvbnRyb2xsZXJ9IGFyZ3Ncblx0ICovXG4gIHJlbW92ZUNvbnRyb2xsZXJzKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5jb250cm9sbGVycyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4udHlwZW9mIEVsZW1lbnR9IGFyZ3Ncblx0ICovXG4gIHJlbW92ZUVsZW1lbnRzKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5lbGVtZW50cyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG5cdCAqL1xuICByZW1vdmVQbHVnaW5zKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5wbHVnaW5zKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0gIHsuLi50eXBlb2YgU2NhbGV9IGFyZ3Ncblx0ICovXG4gIHJlbW92ZVNjYWxlcyguLi5hcmdzKSB7XG4gICAgdGhpcy5fZWFjaCgndW5yZWdpc3RlcicsIGFyZ3MsIHRoaXMuc2NhbGVzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2VhY2gobWV0aG9kLCBhcmdzLCB0eXBlZFJlZ2lzdHJ5KSB7XG4gICAgWy4uLmFyZ3NdLmZvckVhY2goYXJnID0+IHtcbiAgICAgIGNvbnN0IHJlZyA9IHR5cGVkUmVnaXN0cnkgfHwgdGhpcy5fZ2V0UmVnaXN0cnlGb3JUeXBlKGFyZyk7XG4gICAgICBpZiAodHlwZWRSZWdpc3RyeSB8fCByZWcuaXNGb3JUeXBlKGFyZykgfHwgKHJlZyA9PT0gdGhpcy5wbHVnaW5zICYmIGFyZy5pZCkpIHtcbiAgICAgICAgdGhpcy5fZXhlYyhtZXRob2QsIHJlZywgYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBsb29wYWJsZSBhcmdzXG4gICAgICAgIC8vIFVzZSBjYXNlOlxuICAgICAgICAvLyAgaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tICcuL3BsdWdpbnMuanMnO1xuICAgICAgICAvLyAgQ2hhcnQucmVnaXN0ZXIocGx1Z2lucyk7XG4gICAgICAgIGVhY2goYXJnLCBpdGVtID0+IHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbWl4ZWQgdHlwZXMgaW4gdGhlIGxvb3BhYmxlLCBtYWtlIHN1cmUgdGhvc2UgYXJlXG4gICAgICAgICAgLy8gcmVnaXN0ZXJlZCBpbiBjb3JyZWN0IHJlZ2lzdHJ5XG4gICAgICAgICAgLy8gVXNlIGNhc2U6ICh0cmVlbWFwIGV4cG9ydGluZyBjb250cm9sbGVyLCBlbGVtZW50cyBldGMpXG4gICAgICAgICAgLy8gIGltcG9ydCAqIGFzIHRyZWVtYXAgZnJvbSAnY2hhcnRqcy1jaGFydC10cmVlbWFwLmpzJztcbiAgICAgICAgICAvLyAgQ2hhcnQucmVnaXN0ZXIodHJlZW1hcCk7XG5cbiAgICAgICAgICBjb25zdCBpdGVtUmVnID0gdHlwZWRSZWdpc3RyeSB8fCB0aGlzLl9nZXRSZWdpc3RyeUZvclR5cGUoaXRlbSk7XG4gICAgICAgICAgdGhpcy5fZXhlYyhtZXRob2QsIGl0ZW1SZWcsIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2V4ZWMobWV0aG9kLCByZWdpc3RyeSwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgY2FtZWxNZXRob2QgPSBfY2FwaXRhbGl6ZShtZXRob2QpO1xuICAgIGNhbGwoY29tcG9uZW50WydiZWZvcmUnICsgY2FtZWxNZXRob2RdLCBbXSwgY29tcG9uZW50KTsgLy8gYmVmb3JlUmVnaXN0ZXIgLyBiZWZvcmVVbnJlZ2lzdGVyXG4gICAgcmVnaXN0cnlbbWV0aG9kXShjb21wb25lbnQpO1xuICAgIGNhbGwoY29tcG9uZW50WydhZnRlcicgKyBjYW1lbE1ldGhvZF0sIFtdLCBjb21wb25lbnQpOyAvLyBhZnRlclJlZ2lzdGVyIC8gYWZ0ZXJVbnJlZ2lzdGVyXG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRSZWdpc3RyeUZvclR5cGUodHlwZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdHlwZWRSZWdpc3RyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWcgPSB0aGlzLl90eXBlZFJlZ2lzdHJpZXNbaV07XG4gICAgICBpZiAocmVnLmlzRm9yVHlwZSh0eXBlKSkge1xuICAgICAgICByZXR1cm4gcmVnO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBwbHVnaW5zIGlzIHRoZSBmYWxsYmFjayByZWdpc3RyeVxuICAgIHJldHVybiB0aGlzLnBsdWdpbnM7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXQoaWQsIHR5cGVkUmVnaXN0cnksIHR5cGUpIHtcbiAgICBjb25zdCBpdGVtID0gdHlwZWRSZWdpc3RyeS5nZXQoaWQpO1xuICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgaWQgKyAnXCIgaXMgbm90IGEgcmVnaXN0ZXJlZCAnICsgdHlwZSArICcuJyk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbn1cblxuLy8gc2luZ2xldG9uIGluc3RhbmNlXG5leHBvcnQgZGVmYXVsdCAvKiAjX19QVVJFX18gKi8gbmV3IFJlZ2lzdHJ5KCk7XG4iLCAiaW1wb3J0IHJlZ2lzdHJ5IGZyb20gJy4vY29yZS5yZWdpc3RyeS5qcyc7XG5pbXBvcnQge2NhbGxiYWNrIGFzIGNhbGxDYWxsYmFjaywgaXNOdWxsT3JVbmRlZiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLkNoYXJ0RXZlbnQgfSBDaGFydEV2ZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vcGx1Z2lucy9wbHVnaW4udG9vbHRpcC5qcycpLmRlZmF1bHQgfSBUb29sdGlwXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgZmlsdGVyQ2FsbGJhY2tcbiAqIEBwYXJhbSB7e3BsdWdpbjogb2JqZWN0LCBvcHRpb25zOiBvYmplY3R9fSB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleF1cbiAqIEBwYXJhbSB7YXJyYXl9IFthcnJheV1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbdGhpc0FyZ11cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdCA9IFtdO1xuICB9XG5cbiAgLyoqXG5cdCAqIENhbGxzIGVuYWJsZWQgcGx1Z2lucyBmb3IgYGNoYXJ0YCBvbiB0aGUgc3BlY2lmaWVkIGhvb2sgYW5kIHdpdGggdGhlIGdpdmVuIGFyZ3MuXG5cdCAqIFRoaXMgbWV0aG9kIGltbWVkaWF0ZWx5IHJldHVybnMgYXMgc29vbiBhcyBhIHBsdWdpbiBleHBsaWNpdGx5IHJldHVybnMgZmFsc2UuIFRoZVxuXHQgKiByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCwgZm9yIGluc3RhbmNlLCB0byBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgYWN0aW9uLlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZSBmb3Igd2hpY2ggcGx1Z2lucyBzaG91bGQgYmUgY2FsbGVkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaG9vayAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gbWV0aG9kIHRvIGNhbGwgKGUuZy4gJ2JlZm9yZVVwZGF0ZScpLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gRXh0cmEgYXJndW1lbnRzIHRvIGFwcGx5IHRvIHRoZSBob29rIGNhbGwuXG4gICAqIEBwYXJhbSB7ZmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdIC0gRmlsdGVyaW5nIGZ1bmN0aW9uIGZvciBsaW1pdGluZyB3aGljaCBwbHVnaW5zIGFyZSBub3RpZmllZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gZmFsc2UgaWYgYW55IG9mIHRoZSBwbHVnaW5zIHJldHVybiBmYWxzZSwgZWxzZSByZXR1cm5zIHRydWUuXG5cdCAqL1xuICBub3RpZnkoY2hhcnQsIGhvb2ssIGFyZ3MsIGZpbHRlcikge1xuICAgIGlmIChob29rID09PSAnYmVmb3JlSW5pdCcpIHtcbiAgICAgIHRoaXMuX2luaXQgPSB0aGlzLl9jcmVhdGVEZXNjcmlwdG9ycyhjaGFydCwgdHJ1ZSk7XG4gICAgICB0aGlzLl9ub3RpZnkodGhpcy5faW5pdCwgY2hhcnQsICdpbnN0YWxsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBmaWx0ZXIgPyB0aGlzLl9kZXNjcmlwdG9ycyhjaGFydCkuZmlsdGVyKGZpbHRlcikgOiB0aGlzLl9kZXNjcmlwdG9ycyhjaGFydCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fbm90aWZ5KGRlc2NyaXB0b3JzLCBjaGFydCwgaG9vaywgYXJncyk7XG5cbiAgICBpZiAoaG9vayA9PT0gJ2FmdGVyRGVzdHJveScpIHtcbiAgICAgIHRoaXMuX25vdGlmeShkZXNjcmlwdG9ycywgY2hhcnQsICdzdG9wJyk7XG4gICAgICB0aGlzLl9ub3RpZnkodGhpcy5faW5pdCwgY2hhcnQsICd1bmluc3RhbGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX25vdGlmeShkZXNjcmlwdG9ycywgY2hhcnQsIGhvb2ssIGFyZ3MpIHtcbiAgICBhcmdzID0gYXJncyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgZGVzY3JpcHRvcnMpIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGRlc2NyaXB0b3IucGx1Z2luO1xuICAgICAgY29uc3QgbWV0aG9kID0gcGx1Z2luW2hvb2tdO1xuICAgICAgY29uc3QgcGFyYW1zID0gW2NoYXJ0LCBhcmdzLCBkZXNjcmlwdG9yLm9wdGlvbnNdO1xuICAgICAgaWYgKGNhbGxDYWxsYmFjayhtZXRob2QsIHBhcmFtcywgcGx1Z2luKSA9PT0gZmFsc2UgJiYgYXJncy5jYW5jZWxhYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGludmFsaWRhdGUoKSB7XG4gICAgLy8gV2hlbiBwbHVnaW5zIGFyZSByZWdpc3RlcmVkLCB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgb2YgYSBkb3VibGVcbiAgICAvLyBpbnZhbGlkYXRlIHNpdHVhdGlvbi4gSW4gdGhpcyBjYXNlLCB3ZSBvbmx5IHdhbnQgdG8gaW52YWxpZGF0ZSBvbmNlLlxuICAgIC8vIElmIHdlIGludmFsaWRhdGUgbXVsdGlwbGUgdGltZXMsIHRoZSBgX29sZENhY2hlYCBpcyBsb3N0IGFuZCBhbGwgb2YgdGhlXG4gICAgLy8gcGx1Z2lucyBhcmUgcmVzdGFydGVkIHdpdGhvdXQgYmVpbmcgY29ycmVjdGx5IHN0b3BwZWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy84MTQ3XG4gICAgaWYgKCFpc051bGxPclVuZGVmKHRoaXMuX2NhY2hlKSkge1xuICAgICAgdGhpcy5fb2xkQ2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgIHRoaXMuX2NhY2hlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2Rlc2NyaXB0b3JzKGNoYXJ0KSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSB0aGlzLl9jYWNoZSA9IHRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0KTtcblxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlcyhjaGFydCk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcnM7XG4gIH1cblxuICBfY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQsIGFsbCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNoYXJ0ICYmIGNoYXJ0LmNvbmZpZztcbiAgICBjb25zdCBvcHRpb25zID0gdmFsdWVPckRlZmF1bHQoY29uZmlnLm9wdGlvbnMgJiYgY29uZmlnLm9wdGlvbnMucGx1Z2lucywge30pO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBhbGxQbHVnaW5zKGNvbmZpZyk7XG4gICAgLy8gb3B0aW9ucyA9PT0gZmFsc2UgPT4gYWxsIHBsdWdpbnMgYXJlIGRpc2FibGVkXG4gICAgcmV0dXJuIG9wdGlvbnMgPT09IGZhbHNlICYmICFhbGwgPyBbXSA6IGNyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0LCBwbHVnaW5zLCBvcHRpb25zLCBhbGwpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfbm90aWZ5U3RhdGVDaGFuZ2VzKGNoYXJ0KSB7XG4gICAgY29uc3QgcHJldmlvdXNEZXNjcmlwdG9ycyA9IHRoaXMuX29sZENhY2hlIHx8IFtdO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gdGhpcy5fY2FjaGU7XG4gICAgY29uc3QgZGlmZiA9IChhLCBiKSA9PiBhLmZpbHRlcih4ID0+ICFiLnNvbWUoeSA9PiB4LnBsdWdpbi5pZCA9PT0geS5wbHVnaW4uaWQpKTtcbiAgICB0aGlzLl9ub3RpZnkoZGlmZihwcmV2aW91c0Rlc2NyaXB0b3JzLCBkZXNjcmlwdG9ycyksIGNoYXJ0LCAnc3RvcCcpO1xuICAgIHRoaXMuX25vdGlmeShkaWZmKGRlc2NyaXB0b3JzLCBwcmV2aW91c0Rlc2NyaXB0b3JzKSwgY2hhcnQsICdzdGFydCcpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vY29yZS5jb25maWcuanMnKS5kZWZhdWx0fSBjb25maWdcbiAqL1xuZnVuY3Rpb24gYWxsUGx1Z2lucyhjb25maWcpIHtcbiAgY29uc3QgbG9jYWxJZHMgPSB7fTtcbiAgY29uc3QgcGx1Z2lucyA9IFtdO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVnaXN0cnkucGx1Z2lucy5pdGVtcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHBsdWdpbnMucHVzaChyZWdpc3RyeS5nZXRQbHVnaW4oa2V5c1tpXSkpO1xuICB9XG5cbiAgY29uc3QgbG9jYWwgPSBjb25maWcucGx1Z2lucyB8fCBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBsdWdpbiA9IGxvY2FsW2ldO1xuXG4gICAgaWYgKHBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID09PSAtMSkge1xuICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICBsb2NhbElkc1twbHVnaW4uaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3BsdWdpbnMsIGxvY2FsSWRzfTtcbn1cblxuZnVuY3Rpb24gZ2V0T3B0cyhvcHRpb25zLCBhbGwpIHtcbiAgaWYgKCFhbGwgJiYgb3B0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAob3B0aW9ucyA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQsIHtwbHVnaW5zLCBsb2NhbElkc30sIG9wdGlvbnMsIGFsbCkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgY29udGV4dCA9IGNoYXJ0LmdldENvbnRleHQoKTtcblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgY29uc3QgaWQgPSBwbHVnaW4uaWQ7XG4gICAgY29uc3Qgb3B0cyA9IGdldE9wdHMob3B0aW9uc1tpZF0sIGFsbCk7XG4gICAgaWYgKG9wdHMgPT09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQucHVzaCh7XG4gICAgICBwbHVnaW4sXG4gICAgICBvcHRpb25zOiBwbHVnaW5PcHRzKGNoYXJ0LmNvbmZpZywge3BsdWdpbiwgbG9jYWw6IGxvY2FsSWRzW2lkXX0sIG9wdHMsIGNvbnRleHQpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwbHVnaW5PcHRzKGNvbmZpZywge3BsdWdpbiwgbG9jYWx9LCBvcHRzLCBjb250ZXh0KSB7XG4gIGNvbnN0IGtleXMgPSBjb25maWcucGx1Z2luU2NvcGVLZXlzKHBsdWdpbik7XG4gIGNvbnN0IHNjb3BlcyA9IGNvbmZpZy5nZXRPcHRpb25TY29wZXMob3B0cywga2V5cyk7XG4gIGlmIChsb2NhbCAmJiBwbHVnaW4uZGVmYXVsdHMpIHtcbiAgICAvLyBtYWtlIHN1cmUgcGx1Z2luIGRlZmF1bHRzIGFyZSBpbiBzY29wZXMgZm9yIGxvY2FsIChub3QgcmVnaXN0ZXJlZCkgcGx1Z2luc1xuICAgIHNjb3Blcy5wdXNoKHBsdWdpbi5kZWZhdWx0cyk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIGNvbnRleHQsIFsnJ10sIHtcbiAgICAvLyBUaGVzZSBhcmUganVzdCBkZWZhdWx0cyB0aGF0IHBsdWdpbnMgY2FuIG92ZXJyaWRlXG4gICAgc2NyaXB0YWJsZTogZmFsc2UsXG4gICAgaW5kZXhhYmxlOiBmYWxzZSxcbiAgICBhbGxLZXlzOiB0cnVlXG4gIH0pO1xufVxuIiwgImltcG9ydCBkZWZhdWx0cywge292ZXJyaWRlcywgZGVzY3JpcHRvcnN9IGZyb20gJy4vY29yZS5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge21lcmdlSWYsIHJlc29sdmVPYmplY3RLZXksIGlzQXJyYXksIGlzRnVuY3Rpb24sIHZhbHVlT3JEZWZhdWx0LCBpc09iamVjdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuaW1wb3J0IHtfYXR0YWNoQ29udGV4dCwgX2NyZWF0ZVJlc29sdmVyLCBfZGVzY3JpcHRvcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhBeGlzKHR5cGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0YXNldERlZmF1bHRzID0gZGVmYXVsdHMuZGF0YXNldHNbdHlwZV0gfHwge307XG4gIGNvbnN0IGRhdGFzZXRPcHRpb25zID0gKG9wdGlvbnMuZGF0YXNldHMgfHwge30pW3R5cGVdIHx8IHt9O1xuICByZXR1cm4gZGF0YXNldE9wdGlvbnMuaW5kZXhBeGlzIHx8IG9wdGlvbnMuaW5kZXhBeGlzIHx8IGRhdGFzZXREZWZhdWx0cy5pbmRleEF4aXMgfHwgJ3gnO1xufVxuXG5mdW5jdGlvbiBnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEKGlkLCBpbmRleEF4aXMpIHtcbiAgbGV0IGF4aXMgPSBpZDtcbiAgaWYgKGlkID09PSAnX2luZGV4XycpIHtcbiAgICBheGlzID0gaW5kZXhBeGlzO1xuICB9IGVsc2UgaWYgKGlkID09PSAnX3ZhbHVlXycpIHtcbiAgICBheGlzID0gaW5kZXhBeGlzID09PSAneCcgPyAneScgOiAneCc7XG4gIH1cbiAgcmV0dXJuIGF4aXM7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRTY2FsZUlERnJvbUF4aXMoYXhpcywgaW5kZXhBeGlzKSB7XG4gIHJldHVybiBheGlzID09PSBpbmRleEF4aXMgPyAnX2luZGV4XycgOiAnX3ZhbHVlXyc7XG59XG5cbmZ1bmN0aW9uIGF4aXNGcm9tUG9zaXRpb24ocG9zaXRpb24pIHtcbiAgaWYgKHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICByZXR1cm4gJ3gnO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnIHx8IHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgcmV0dXJuICd5JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lQXhpcyhpZCwgc2NhbGVPcHRpb25zKSB7XG4gIGlmIChpZCA9PT0gJ3gnIHx8IGlkID09PSAneScgfHwgaWQgPT09ICdyJykge1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlkID0gc2NhbGVPcHRpb25zLmF4aXNcbiAgICB8fCBheGlzRnJvbVBvc2l0aW9uKHNjYWxlT3B0aW9ucy5wb3NpdGlvbilcbiAgICB8fCBpZC5sZW5ndGggPiAxICYmIGRldGVybWluZUF4aXMoaWRbMF0udG9Mb3dlckNhc2UoKSwgc2NhbGVPcHRpb25zKTtcblxuICBpZiAoaWQpIHtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlcm1pbmUgdHlwZSBvZiAnJHtuYW1lfScgYXhpcy4gUGxlYXNlIHByb3ZpZGUgJ2F4aXMnIG9yICdwb3NpdGlvbicgb3B0aW9uLmApO1xufVxuXG5mdW5jdGlvbiBtZXJnZVNjYWxlQ29uZmlnKGNvbmZpZywgb3B0aW9ucykge1xuICBjb25zdCBjaGFydERlZmF1bHRzID0gb3ZlcnJpZGVzW2NvbmZpZy50eXBlXSB8fCB7c2NhbGVzOiB7fX07XG4gIGNvbnN0IGNvbmZpZ1NjYWxlcyA9IG9wdGlvbnMuc2NhbGVzIHx8IHt9O1xuICBjb25zdCBjaGFydEluZGV4QXhpcyA9IGdldEluZGV4QXhpcyhjb25maWcudHlwZSwgb3B0aW9ucyk7XG4gIGNvbnN0IHNjYWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gRmlyc3QgZmlndXJlIG91dCBmaXJzdCBzY2FsZSBpZCdzIHBlciBheGlzLlxuICBPYmplY3Qua2V5cyhjb25maWdTY2FsZXMpLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IHNjYWxlQ29uZiA9IGNvbmZpZ1NjYWxlc1tpZF07XG4gICAgaWYgKCFpc09iamVjdChzY2FsZUNvbmYpKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHtpZH1gKTtcbiAgICB9XG4gICAgaWYgKHNjYWxlQ29uZi5fcHJveHkpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHtpZH1gKTtcbiAgICB9XG4gICAgY29uc3QgYXhpcyA9IGRldGVybWluZUF4aXMoaWQsIHNjYWxlQ29uZik7XG4gICAgY29uc3QgZGVmYXVsdElkID0gZ2V0RGVmYXVsdFNjYWxlSURGcm9tQXhpcyhheGlzLCBjaGFydEluZGV4QXhpcyk7XG4gICAgY29uc3QgZGVmYXVsdFNjYWxlT3B0aW9ucyA9IGNoYXJ0RGVmYXVsdHMuc2NhbGVzIHx8IHt9O1xuICAgIHNjYWxlc1tpZF0gPSBtZXJnZUlmKE9iamVjdC5jcmVhdGUobnVsbCksIFt7YXhpc30sIHNjYWxlQ29uZiwgZGVmYXVsdFNjYWxlT3B0aW9uc1theGlzXSwgZGVmYXVsdFNjYWxlT3B0aW9uc1tkZWZhdWx0SWRdXSk7XG4gIH0pO1xuXG4gIC8vIFRoZW4gbWVyZ2UgZGF0YXNldCBkZWZhdWx0cyB0byBzY2FsZSBjb25maWdzXG4gIGNvbmZpZy5kYXRhLmRhdGFzZXRzLmZvckVhY2goZGF0YXNldCA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGFzZXQudHlwZSB8fCBjb25maWcudHlwZTtcbiAgICBjb25zdCBpbmRleEF4aXMgPSBkYXRhc2V0LmluZGV4QXhpcyB8fCBnZXRJbmRleEF4aXModHlwZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YXNldERlZmF1bHRzID0gb3ZlcnJpZGVzW3R5cGVdIHx8IHt9O1xuICAgIGNvbnN0IGRlZmF1bHRTY2FsZU9wdGlvbnMgPSBkYXRhc2V0RGVmYXVsdHMuc2NhbGVzIHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGRlZmF1bHRTY2FsZU9wdGlvbnMpLmZvckVhY2goZGVmYXVsdElEID0+IHtcbiAgICAgIGNvbnN0IGF4aXMgPSBnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEKGRlZmF1bHRJRCwgaW5kZXhBeGlzKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YXNldFtheGlzICsgJ0F4aXNJRCddIHx8IGF4aXM7XG4gICAgICBzY2FsZXNbaWRdID0gc2NhbGVzW2lkXSB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbWVyZ2VJZihzY2FsZXNbaWRdLCBbe2F4aXN9LCBjb25maWdTY2FsZXNbaWRdLCBkZWZhdWx0U2NhbGVPcHRpb25zW2RlZmF1bHRJRF1dKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gYXBwbHkgc2NhbGUgZGVmYXVsdHMsIGlmIG5vdCBvdmVycmlkZGVuIGJ5IGRhdGFzZXQgZGVmYXVsdHNcbiAgT2JqZWN0LmtleXMoc2NhbGVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZXNba2V5XTtcbiAgICBtZXJnZUlmKHNjYWxlLCBbZGVmYXVsdHMuc2NhbGVzW3NjYWxlLnR5cGVdLCBkZWZhdWx0cy5zY2FsZV0pO1xuICB9KTtcblxuICByZXR1cm4gc2NhbGVzO1xufVxuXG5mdW5jdGlvbiBpbml0T3B0aW9ucyhjb25maWcpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zIHx8IChjb25maWcub3B0aW9ucyA9IHt9KTtcblxuICBvcHRpb25zLnBsdWdpbnMgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnBsdWdpbnMsIHt9KTtcbiAgb3B0aW9ucy5zY2FsZXMgPSBtZXJnZVNjYWxlQ29uZmlnKGNvbmZpZywgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhKGRhdGEpIHtcbiAgZGF0YSA9IGRhdGEgfHwge307XG4gIGRhdGEuZGF0YXNldHMgPSBkYXRhLmRhdGFzZXRzIHx8IFtdO1xuICBkYXRhLmxhYmVscyA9IGRhdGEubGFiZWxzIHx8IFtdO1xuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gaW5pdENvbmZpZyhjb25maWcpIHtcbiAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICBjb25maWcuZGF0YSA9IGluaXREYXRhKGNvbmZpZy5kYXRhKTtcblxuICBpbml0T3B0aW9ucyhjb25maWcpO1xuXG4gIHJldHVybiBjb25maWc7XG59XG5cbmNvbnN0IGtleUNhY2hlID0gbmV3IE1hcCgpO1xuY29uc3Qga2V5c0NhY2hlZCA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gY2FjaGVkS2V5cyhjYWNoZUtleSwgZ2VuZXJhdGUpIHtcbiAgbGV0IGtleXMgPSBrZXlDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICBpZiAoIWtleXMpIHtcbiAgICBrZXlzID0gZ2VuZXJhdGUoKTtcbiAgICBrZXlDYWNoZS5zZXQoY2FjaGVLZXksIGtleXMpO1xuICAgIGtleXNDYWNoZWQuYWRkKGtleXMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuXG5jb25zdCBhZGRJZkZvdW5kID0gKHNldCwgb2JqLCBrZXkpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHJlc29sdmVPYmplY3RLZXkob2JqLCBrZXkpO1xuICBpZiAob3B0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0LmFkZChvcHRzKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gaW5pdENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX3Njb3BlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcmVzb2x2ZXJDYWNoZSA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldCBwbGF0Zm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnBsYXRmb3JtO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy50eXBlO1xuICB9XG5cbiAgc2V0IHR5cGUodHlwZSkge1xuICAgIHRoaXMuX2NvbmZpZy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuZGF0YTtcbiAgfVxuXG4gIHNldCBkYXRhKGRhdGEpIHtcbiAgICB0aGlzLl9jb25maWcuZGF0YSA9IGluaXREYXRhKGRhdGEpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5vcHRpb25zO1xuICB9XG5cbiAgc2V0IG9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuX2NvbmZpZy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGdldCBwbHVnaW5zKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcucGx1Z2lucztcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLl9jb25maWc7XG4gICAgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgaW5pdE9wdGlvbnMoY29uZmlnKTtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5fc2NvcGVDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3Jlc29sdmVyQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcHRpb24gc2NvcGUga2V5cyBmb3IgcmVzb2x2aW5nIGRhdGFzZXQgb3B0aW9ucy5cbiAgICogVGhlc2Uga2V5cyBkbyBub3QgaW5jbHVkZSB0aGUgZGF0YXNldCBpdHNlbGYsIGJlY2F1c2UgaXQgaXMgbm90IHVuZGVyIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc2V0VHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXVtdfVxuICAgKi9cbiAgZGF0YXNldFNjb3BlS2V5cyhkYXRhc2V0VHlwZSkge1xuICAgIHJldHVybiBjYWNoZWRLZXlzKGRhdGFzZXRUeXBlLFxuICAgICAgKCkgPT4gW1tcbiAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgJydcbiAgICAgIF1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcHRpb24gc2NvcGUga2V5cyBmb3IgcmVzb2x2aW5nIGRhdGFzZXQgYW5pbWF0aW9uIG9wdGlvbnMuXG4gICAqIFRoZXNlIGtleXMgZG8gbm90IGluY2x1ZGUgdGhlIGRhdGFzZXQgaXRzZWxmLCBiZWNhdXNlIGl0IGlzIG5vdCB1bmRlciBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNldFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zaXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nW11bXX1cbiAgICovXG4gIGRhdGFzZXRBbmltYXRpb25TY29wZUtleXMoZGF0YXNldFR5cGUsIHRyYW5zaXRpb24pIHtcbiAgICByZXR1cm4gY2FjaGVkS2V5cyhgJHtkYXRhc2V0VHlwZX0udHJhbnNpdGlvbi4ke3RyYW5zaXRpb259YCxcbiAgICAgICgpID0+IFtcbiAgICAgICAgW1xuICAgICAgICAgIGBkYXRhc2V0cy4ke2RhdGFzZXRUeXBlfS50cmFuc2l0aW9ucy4ke3RyYW5zaXRpb259YCxcbiAgICAgICAgICBgdHJhbnNpdGlvbnMuJHt0cmFuc2l0aW9ufWAsXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIGxvb2tpbmcgdXAgdGhlIGBhbmltYXRpb25zYCBhbmQgYGFuaW1hdGlvbmAga2V5c1xuICAgICAgICBbXG4gICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgICAnJ1xuICAgICAgICBdXG4gICAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcHRpb25zIHNjb3BlIGtleXMgZm9yIHJlc29sdmluZyBlbGVtZW50IG9wdGlvbnMgdGhhdCBiZWxvbmdcbiAgICogdG8gYW4gZGF0YXNldC4gVGhlc2Uga2V5cyBkbyBub3QgaW5jbHVkZSB0aGUgZGF0YXNldCBpdHNlbGYsIGJlY2F1c2UgaXRcbiAgICogaXMgbm90IHVuZGVyIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc2V0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZWxlbWVudFR5cGVcbiAgICogQHJldHVybiB7c3RyaW5nW11bXX1cbiAgICovXG4gIGRhdGFzZXRFbGVtZW50U2NvcGVLZXlzKGRhdGFzZXRUeXBlLCBlbGVtZW50VHlwZSkge1xuICAgIHJldHVybiBjYWNoZWRLZXlzKGAke2RhdGFzZXRUeXBlfS0ke2VsZW1lbnRUeXBlfWAsXG4gICAgICAoKSA9PiBbW1xuICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX0uZWxlbWVudHMuJHtlbGVtZW50VHlwZX1gLFxuICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX1gLFxuICAgICAgICBgZWxlbWVudHMuJHtlbGVtZW50VHlwZX1gLFxuICAgICAgICAnJ1xuICAgICAgXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9wdGlvbnMgc2NvcGUga2V5cyBmb3IgcmVzb2x2aW5nIHBsdWdpbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3tpZDogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9uU2NvcGVzPzogc3RyaW5nW119fSBwbHVnaW5cbiAgICogQHJldHVybiB7c3RyaW5nW11bXX1cbiAgICovXG4gIHBsdWdpblNjb3BlS2V5cyhwbHVnaW4pIHtcbiAgICBjb25zdCBpZCA9IHBsdWdpbi5pZDtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlO1xuICAgIHJldHVybiBjYWNoZWRLZXlzKGAke3R5cGV9LXBsdWdpbi0ke2lkfWAsXG4gICAgICAoKSA9PiBbW1xuICAgICAgICBgcGx1Z2lucy4ke2lkfWAsXG4gICAgICAgIC4uLnBsdWdpbi5hZGRpdGlvbmFsT3B0aW9uU2NvcGVzIHx8IFtdLFxuICAgICAgXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FjaGVkU2NvcGVzKG1haW5TY29wZSwgcmVzZXRDYWNoZSkge1xuICAgIGNvbnN0IF9zY29wZUNhY2hlID0gdGhpcy5fc2NvcGVDYWNoZTtcbiAgICBsZXQgY2FjaGUgPSBfc2NvcGVDYWNoZS5nZXQobWFpblNjb3BlKTtcbiAgICBpZiAoIWNhY2hlIHx8IHJlc2V0Q2FjaGUpIHtcbiAgICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgX3Njb3BlQ2FjaGUuc2V0KG1haW5TY29wZSwgY2FjaGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIG9iamVjdHMgZnJvbSBvcHRpb25zIGFuZCBkZWZhdWx0cyBmb3Igb3B0aW9uIHZhbHVlIHJlc29sdXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYWluU2NvcGUgLSBUaGUgbWFpbiBzY29wZSBvYmplY3QgZm9yIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmdbXVtdfSBrZXlMaXN0cyAtIFRoZSBhcnJheXMgb2Yga2V5cyBpbiByZXNvbHV0aW9uIG9yZGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2V0Q2FjaGVdIC0gcmVzZXQgdGhlIGNhY2hlIGZvciB0aGlzIG1haW5TY29wZVxuICAgKi9cbiAgZ2V0T3B0aW9uU2NvcGVzKG1haW5TY29wZSwga2V5TGlzdHMsIHJlc2V0Q2FjaGUpIHtcbiAgICBjb25zdCB7b3B0aW9ucywgdHlwZX0gPSB0aGlzO1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5fY2FjaGVkU2NvcGVzKG1haW5TY29wZSwgcmVzZXRDYWNoZSk7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleUxpc3RzKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlcyA9IG5ldyBTZXQoKTtcblxuICAgIGtleUxpc3RzLmZvckVhY2goa2V5cyA9PiB7XG4gICAgICBpZiAobWFpblNjb3BlKSB7XG4gICAgICAgIHNjb3Blcy5hZGQobWFpblNjb3BlKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiBhZGRJZkZvdW5kKHNjb3BlcywgbWFpblNjb3BlLCBrZXkpKTtcbiAgICAgIH1cbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4gYWRkSWZGb3VuZChzY29wZXMsIG9wdGlvbnMsIGtleSkpO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiBhZGRJZkZvdW5kKHNjb3Blcywgb3ZlcnJpZGVzW3R5cGVdIHx8IHt9LCBrZXkpKTtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4gYWRkSWZGb3VuZChzY29wZXMsIGRlZmF1bHRzLCBrZXkpKTtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4gYWRkSWZGb3VuZChzY29wZXMsIGRlc2NyaXB0b3JzLCBrZXkpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbShzY29wZXMpO1xuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFycmF5LnB1c2goT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgfVxuICAgIGlmIChrZXlzQ2FjaGVkLmhhcyhrZXlMaXN0cykpIHtcbiAgICAgIGNhY2hlLnNldChrZXlMaXN0cywgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3B0aW9uIHNjb3BlcyBmb3IgcmVzb2x2aW5nIGNoYXJ0IG9wdGlvbnNcbiAgICogQHJldHVybiB7b2JqZWN0W119XG4gICAqL1xuICBjaGFydE9wdGlvblNjb3BlcygpIHtcbiAgICBjb25zdCB7b3B0aW9ucywgdHlwZX0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvdmVycmlkZXNbdHlwZV0gfHwge30sXG4gICAgICBkZWZhdWx0cy5kYXRhc2V0c1t0eXBlXSB8fCB7fSwgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzg1MzFcbiAgICAgIHt0eXBlfSxcbiAgICAgIGRlZmF1bHRzLFxuICAgICAgZGVzY3JpcHRvcnNcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IHNjb3Blc1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufG9iamVjdH0gY29udGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcHJlZml4ZXNdXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHJlc29sdmVOYW1lZE9wdGlvbnMoc2NvcGVzLCBuYW1lcywgY29udGV4dCwgcHJlZml4ZXMgPSBbJyddKSB7XG4gICAgY29uc3QgcmVzdWx0ID0geyRzaGFyZWQ6IHRydWV9O1xuICAgIGNvbnN0IHtyZXNvbHZlciwgc3ViUHJlZml4ZXN9ID0gZ2V0UmVzb2x2ZXIodGhpcy5fcmVzb2x2ZXJDYWNoZSwgc2NvcGVzLCBwcmVmaXhlcyk7XG4gICAgbGV0IG9wdGlvbnMgPSByZXNvbHZlcjtcbiAgICBpZiAobmVlZENvbnRleHQocmVzb2x2ZXIsIG5hbWVzKSkge1xuICAgICAgcmVzdWx0LiRzaGFyZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRleHQgPSBpc0Z1bmN0aW9uKGNvbnRleHQpID8gY29udGV4dCgpIDogY29udGV4dDtcbiAgICAgIC8vIHN1YlJlc29sdmVyIGlzIHBhc3NlZCB0byBzY3JpcHRhYmxlIG9wdGlvbnMuIEl0IHNob3VsZCBub3QgcmVzb2x2ZSB0byBob3ZlciBvcHRpb25zLlxuICAgICAgY29uc3Qgc3ViUmVzb2x2ZXIgPSB0aGlzLmNyZWF0ZVJlc29sdmVyKHNjb3BlcywgY29udGV4dCwgc3ViUHJlZml4ZXMpO1xuICAgICAgb3B0aW9ucyA9IF9hdHRhY2hDb250ZXh0KHJlc29sdmVyLCBjb250ZXh0LCBzdWJSZXNvbHZlcik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIG5hbWVzKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvcHRpb25zW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IHNjb3Blc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtwcmVmaXhlc11cbiAgICogQHBhcmFtIHt7c2NyaXB0YWJsZTogYm9vbGVhbiwgaW5kZXhhYmxlOiBib29sZWFuLCBhbGxLZXlzPzogYm9vbGVhbn19IFtkZXNjcmlwdG9yRGVmYXVsdHNdXG4gICAqL1xuICBjcmVhdGVSZXNvbHZlcihzY29wZXMsIGNvbnRleHQsIHByZWZpeGVzID0gWycnXSwgZGVzY3JpcHRvckRlZmF1bHRzKSB7XG4gICAgY29uc3Qge3Jlc29sdmVyfSA9IGdldFJlc29sdmVyKHRoaXMuX3Jlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpO1xuICAgIHJldHVybiBpc09iamVjdChjb250ZXh0KVxuICAgICAgPyBfYXR0YWNoQ29udGV4dChyZXNvbHZlciwgY29udGV4dCwgdW5kZWZpbmVkLCBkZXNjcmlwdG9yRGVmYXVsdHMpXG4gICAgICA6IHJlc29sdmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlc29sdmVyKHJlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpIHtcbiAgbGV0IGNhY2hlID0gcmVzb2x2ZXJDYWNoZS5nZXQoc2NvcGVzKTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHJlc29sdmVyQ2FjaGUuc2V0KHNjb3BlcywgY2FjaGUpO1xuICB9XG4gIGNvbnN0IGNhY2hlS2V5ID0gcHJlZml4ZXMuam9pbigpO1xuICBsZXQgY2FjaGVkID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFjYWNoZWQpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IF9jcmVhdGVSZXNvbHZlcihzY29wZXMsIHByZWZpeGVzKTtcbiAgICBjYWNoZWQgPSB7XG4gICAgICByZXNvbHZlcixcbiAgICAgIHN1YlByZWZpeGVzOiBwcmVmaXhlcy5maWx0ZXIocCA9PiAhcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdob3ZlcicpKVxuICAgIH07XG4gICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBjYWNoZWQpO1xuICB9XG4gIHJldHVybiBjYWNoZWQ7XG59XG5cbmNvbnN0IGhhc0Z1bmN0aW9uID0gdmFsdWUgPT4gaXNPYmplY3QodmFsdWUpXG4gICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBhY2MgfHwgaXNGdW5jdGlvbih2YWx1ZVtrZXldKSwgZmFsc2UpO1xuXG5mdW5jdGlvbiBuZWVkQ29udGV4dChwcm94eSwgbmFtZXMpIHtcbiAgY29uc3Qge2lzU2NyaXB0YWJsZSwgaXNJbmRleGFibGV9ID0gX2Rlc2NyaXB0b3JzKHByb3h5KTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgbmFtZXMpIHtcbiAgICBjb25zdCBzY3JpcHRhYmxlID0gaXNTY3JpcHRhYmxlKHByb3ApO1xuICAgIGNvbnN0IGluZGV4YWJsZSA9IGlzSW5kZXhhYmxlKHByb3ApO1xuICAgIGNvbnN0IHZhbHVlID0gKGluZGV4YWJsZSB8fCBzY3JpcHRhYmxlKSAmJiBwcm94eVtwcm9wXTtcbiAgICBpZiAoKHNjcmlwdGFibGUgJiYgKGlzRnVuY3Rpb24odmFsdWUpIHx8IGhhc0Z1bmN0aW9uKHZhbHVlKSkpXG4gICAgICB8fCAoaW5kZXhhYmxlICYmIGlzQXJyYXkodmFsdWUpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgYW5pbWF0b3IgZnJvbSAnLi9jb3JlLmFuaW1hdG9yLmpzJztcbmltcG9ydCBkZWZhdWx0cywge292ZXJyaWRlc30gZnJvbSAnLi9jb3JlLmRlZmF1bHRzLmpzJztcbmltcG9ydCBJbnRlcmFjdGlvbiBmcm9tICcuL2NvcmUuaW50ZXJhY3Rpb24uanMnO1xuaW1wb3J0IGxheW91dHMgZnJvbSAnLi9jb3JlLmxheW91dHMuanMnO1xuaW1wb3J0IHtfZGV0ZWN0UGxhdGZvcm19IGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBQbHVnaW5TZXJ2aWNlIGZyb20gJy4vY29yZS5wbHVnaW5zLmpzJztcbmltcG9ydCByZWdpc3RyeSBmcm9tICcuL2NvcmUucmVnaXN0cnkuanMnO1xuaW1wb3J0IENvbmZpZywge2RldGVybWluZUF4aXMsIGdldEluZGV4QXhpc30gZnJvbSAnLi9jb3JlLmNvbmZpZy5qcyc7XG5pbXBvcnQge3JldGluYVNjYWxlLCBfaXNEb21TdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5kb20uanMnO1xuaW1wb3J0IHtlYWNoLCBjYWxsYmFjayBhcyBjYWxsQ2FsbGJhY2ssIHVpZCwgdmFsdWVPckRlZmF1bHQsIF9lbGVtZW50c0VxdWFsLCBpc051bGxPclVuZGVmLCBzZXRzRXF1YWwsIGRlZmluZWQsIGlzRnVuY3Rpb24sIF9pc0NsaWNrRXZlbnR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Y2xlYXJDYW52YXMsIGNsaXBBcmVhLCBjcmVhdGVDb250ZXh0LCB1bmNsaXBBcmVhLCBfaXNQb2ludEluQXJlYX0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge3ZlcnNpb259IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuZXh0cmFzLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5DaGFydEV2ZW50IH0gQ2hhcnRFdmVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL3R5cGVzL2luZGV4LmpzJykuUG9pbnQgfSBQb2ludFxuICovXG5cbmNvbnN0IEtOT1dOX1BPU0lUSU9OUyA9IFsndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0JywgJ2NoYXJ0QXJlYSddO1xuZnVuY3Rpb24gcG9zaXRpb25Jc0hvcml6b250YWwocG9zaXRpb24sIGF4aXMpIHtcbiAgcmV0dXJuIHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgKEtOT1dOX1BPU0lUSU9OUy5pbmRleE9mKHBvc2l0aW9uKSA9PT0gLTEgJiYgYXhpcyA9PT0gJ3gnKTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZTJMZXZlbChsMSwgbDIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYVtsMV0gPT09IGJbbDFdXG4gICAgICA/IGFbbDJdIC0gYltsMl1cbiAgICAgIDogYVtsMV0gLSBiW2wxXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BbmltYXRpb25zQ29tcGxldGUoY29udGV4dCkge1xuICBjb25zdCBjaGFydCA9IGNvbnRleHQuY2hhcnQ7XG4gIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmFuaW1hdGlvbjtcblxuICBjaGFydC5ub3RpZnlQbHVnaW5zKCdhZnRlclJlbmRlcicpO1xuICBjYWxsQ2FsbGJhY2soYW5pbWF0aW9uT3B0aW9ucyAmJiBhbmltYXRpb25PcHRpb25zLm9uQ29tcGxldGUsIFtjb250ZXh0XSwgY2hhcnQpO1xufVxuXG5mdW5jdGlvbiBvbkFuaW1hdGlvblByb2dyZXNzKGNvbnRleHQpIHtcbiAgY29uc3QgY2hhcnQgPSBjb250ZXh0LmNoYXJ0O1xuICBjb25zdCBhbmltYXRpb25PcHRpb25zID0gY2hhcnQub3B0aW9ucy5hbmltYXRpb247XG4gIGNhbGxDYWxsYmFjayhhbmltYXRpb25PcHRpb25zICYmIGFuaW1hdGlvbk9wdGlvbnMub25Qcm9ncmVzcywgW2NvbnRleHRdLCBjaGFydCk7XG59XG5cbi8qKlxuICogQ2hhcnQuanMgY2FuIHRha2UgYSBzdHJpbmcgaWQgb2YgYSBjYW52YXMgZWxlbWVudCwgYSAyZCBjb250ZXh0LCBvciBhIGNhbnZhcyBlbGVtZW50IGl0c2VsZi5cbiAqIEF0dGVtcHQgdG8gdW53cmFwIHRoZSBpdGVtIHBhc3NlZCBpbnRvIHRoZSBjaGFydCBjb25zdHJ1Y3RvciBzbyB0aGF0IGl0IGlzIGEgY2FudmFzIGVsZW1lbnQgKGlmIHBvc3NpYmxlKS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FudmFzKGl0ZW0pIHtcbiAgaWYgKF9pc0RvbVN1cHBvcnRlZCgpICYmIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgIGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpdGVtKTtcbiAgfSBlbHNlIGlmIChpdGVtICYmIGl0ZW0ubGVuZ3RoKSB7XG4gICAgLy8gU3VwcG9ydCBmb3IgYXJyYXkgYmFzZWQgcXVlcmllcyAoc3VjaCBhcyBqUXVlcnkpXG4gICAgaXRlbSA9IGl0ZW1bMF07XG4gIH1cblxuICBpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xuICAgIC8vIFN1cHBvcnQgZm9yIGFueSBvYmplY3QgYXNzb2NpYXRlZCB0byBhIGNhbnZhcyAoaW5jbHVkaW5nIGEgY29udGV4dDJkKVxuICAgIGl0ZW0gPSBpdGVtLmNhbnZhcztcbiAgfVxuICByZXR1cm4gaXRlbTtcbn1cblxuY29uc3QgaW5zdGFuY2VzID0ge307XG5jb25zdCBnZXRDaGFydCA9IChrZXkpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZ2V0Q2FudmFzKGtleSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluc3RhbmNlcykuZmlsdGVyKChjKSA9PiBjLmNhbnZhcyA9PT0gY2FudmFzKS5wb3AoKTtcbn07XG5cbmZ1bmN0aW9uIG1vdmVOdW1lcmljS2V5cyhvYmosIHN0YXJ0LCBtb3ZlKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgaW50S2V5ID0gK2tleTtcbiAgICBpZiAoaW50S2V5ID49IHN0YXJ0KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgICAgaWYgKG1vdmUgPiAwIHx8IGludEtleSA+IHN0YXJ0KSB7XG4gICAgICAgIG9ialtpbnRLZXkgKyBtb3ZlXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Q2hhcnRFdmVudH0gZVxuICogQHBhcmFtIHtDaGFydEV2ZW50fG51bGx9IGxhc3RFdmVudFxuICogQHBhcmFtIHtib29sZWFufSBpbkNoYXJ0QXJlYVxuICogQHBhcmFtIHtib29sZWFufSBpc0NsaWNrXG4gKiBAcmV0dXJucyB7Q2hhcnRFdmVudHxudWxsfVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVMYXN0RXZlbnQoZSwgbGFzdEV2ZW50LCBpbkNoYXJ0QXJlYSwgaXNDbGljaykge1xuICBpZiAoIWluQ2hhcnRBcmVhIHx8IGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0NsaWNrKSB7XG4gICAgcmV0dXJuIGxhc3RFdmVudDtcbiAgfVxuICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YXNldEFyZWEobWV0YSkge1xuICBjb25zdCB7eFNjYWxlLCB5U2NhbGV9ID0gbWV0YTtcbiAgaWYgKHhTY2FsZSAmJiB5U2NhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogeFNjYWxlLmxlZnQsXG4gICAgICByaWdodDogeFNjYWxlLnJpZ2h0LFxuICAgICAgdG9wOiB5U2NhbGUudG9wLFxuICAgICAgYm90dG9tOiB5U2NhbGUuYm90dG9tXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBDaGFydCB7XG5cbiAgc3RhdGljIGRlZmF1bHRzID0gZGVmYXVsdHM7XG4gIHN0YXRpYyBpbnN0YW5jZXMgPSBpbnN0YW5jZXM7XG4gIHN0YXRpYyBvdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gIHN0YXRpYyByZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICBzdGF0aWMgdmVyc2lvbiA9IHZlcnNpb247XG4gIHN0YXRpYyBnZXRDaGFydCA9IGdldENoYXJ0O1xuXG4gIHN0YXRpYyByZWdpc3RlciguLi5pdGVtcykge1xuICAgIHJlZ2lzdHJ5LmFkZCguLi5pdGVtcyk7XG4gICAgaW52YWxpZGF0ZVBsdWdpbnMoKTtcbiAgfVxuXG4gIHN0YXRpYyB1bnJlZ2lzdGVyKC4uLml0ZW1zKSB7XG4gICAgcmVnaXN0cnkucmVtb3ZlKC4uLml0ZW1zKTtcbiAgICBpbnZhbGlkYXRlUGx1Z2lucygpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIGNvbnN0cnVjdG9yKGl0ZW0sIHVzZXJDb25maWcpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZyA9IG5ldyBDb25maWcodXNlckNvbmZpZyk7XG4gICAgY29uc3QgaW5pdGlhbENhbnZhcyA9IGdldENhbnZhcyhpdGVtKTtcbiAgICBjb25zdCBleGlzdGluZ0NoYXJ0ID0gZ2V0Q2hhcnQoaW5pdGlhbENhbnZhcyk7XG4gICAgaWYgKGV4aXN0aW5nQ2hhcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NhbnZhcyBpcyBhbHJlYWR5IGluIHVzZS4gQ2hhcnQgd2l0aCBJRCBcXCcnICsgZXhpc3RpbmdDaGFydC5pZCArICdcXCcnICtcblx0XHRcdFx0JyBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGNhbnZhcyB3aXRoIElEIFxcJycgKyBleGlzdGluZ0NoYXJ0LmNhbnZhcy5pZCArICdcXCcgY2FuIGJlIHJldXNlZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoY29uZmlnLmNoYXJ0T3B0aW9uU2NvcGVzKCksIHRoaXMuZ2V0Q29udGV4dCgpKTtcblxuICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgKGNvbmZpZy5wbGF0Zm9ybSB8fCBfZGV0ZWN0UGxhdGZvcm0oaW5pdGlhbENhbnZhcykpKCk7XG4gICAgdGhpcy5wbGF0Zm9ybS51cGRhdGVDb25maWcoY29uZmlnKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KGluaXRpYWxDYW52YXMsIG9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgIGNvbnN0IGNhbnZhcyA9IGNvbnRleHQgJiYgY29udGV4dC5jYW52YXM7XG4gICAgY29uc3QgaGVpZ2h0ID0gY2FudmFzICYmIGNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSBjYW52YXMgJiYgY2FudmFzLndpZHRoO1xuXG4gICAgdGhpcy5pZCA9IHVpZCgpO1xuICAgIHRoaXMuY3R4ID0gY29udGV4dDtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gU3RvcmUgdGhlIHByZXZpb3VzbHkgdXNlZCBhc3BlY3QgcmF0aW8gdG8gZGV0ZXJtaW5lIGlmIGEgcmVzaXplXG4gICAgLy8gaXMgbmVlZGVkIGR1cmluZyB1cGRhdGVzLiBEbyB0aGlzIGFmdGVyIF9vcHRpb25zIGlzIHNldCBzaW5jZVxuICAgIC8vIGFzcGVjdFJhdGlvIHVzZXMgYSBnZXR0ZXJcbiAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuYXNwZWN0UmF0aW87XG4gICAgdGhpcy5fbGF5ZXJzID0gW107XG4gICAgdGhpcy5fbWV0YXNldHMgPSBbXTtcbiAgICB0aGlzLl9zdGFja3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ib3hlcyA9IFtdO1xuICAgIHRoaXMuY3VycmVudERldmljZVBpeGVsUmF0aW8gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGFydEFyZWEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYWN0aXZlID0gW107XG4gICAgdGhpcy5fbGFzdEV2ZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICAgIC8qKiBAdHlwZSB7P3thdHRhY2g/OiBmdW5jdGlvbiwgZGV0YWNoPzogZnVuY3Rpb24sIHJlc2l6ZT86IGZ1bmN0aW9ufX0gKi9cbiAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NvcnRlZE1ldGFzZXRzID0gW107XG4gICAgdGhpcy5zY2FsZXMgPSB7fTtcbiAgICB0aGlzLl9wbHVnaW5zID0gbmV3IFBsdWdpblNlcnZpY2UoKTtcbiAgICB0aGlzLiRwcm94aWVzID0ge307XG4gICAgdGhpcy5faGlkZGVuSW5kaWNlcyA9IHt9O1xuICAgIHRoaXMuYXR0YWNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9kb1Jlc2l6ZSA9IGRlYm91bmNlKG1vZGUgPT4gdGhpcy51cGRhdGUobW9kZSksIG9wdGlvbnMucmVzaXplRGVsYXkgfHwgMCk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXMgPSBbXTtcblxuICAgIC8vIEFkZCB0aGUgY2hhcnQgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2VcbiAgICBpbnN0YW5jZXNbdGhpcy5pZF0gPSB0aGlzO1xuXG4gICAgaWYgKCFjb250ZXh0IHx8ICFjYW52YXMpIHtcbiAgICAgIC8vIFRoZSBnaXZlbiBpdGVtIGlzIG5vdCBhIGNvbXBhdGlibGUgY29udGV4dDJkIGVsZW1lbnQsIGxldCdzIHJldHVybiBiZWZvcmUgZmluYWxpemluZ1xuICAgICAgLy8gdGhlIGNoYXJ0IGluaXRpYWxpemF0aW9uIGJ1dCBhZnRlciBzZXR0aW5nIGJhc2ljIGNoYXJ0IC8gY29udHJvbGxlciBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgIC8vIGNhbiBoZWxwIHRvIGZpZ3VyZSBvdXQgdGhhdCB0aGUgY2hhcnQgaXMgbm90IHZhbGlkIChlLmcgY2hhcnQuY2FudmFzICE9PSBudWxsKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yODA3XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBjaGFydDogY2FuJ3QgYWNxdWlyZSBjb250ZXh0IGZyb20gdGhlIGdpdmVuIGl0ZW1cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYW5pbWF0b3IubGlzdGVuKHRoaXMsICdjb21wbGV0ZScsIG9uQW5pbWF0aW9uc0NvbXBsZXRlKTtcbiAgICBhbmltYXRvci5saXN0ZW4odGhpcywgJ3Byb2dyZXNzJywgb25BbmltYXRpb25Qcm9ncmVzcyk7XG5cbiAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMuYXR0YWNoZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFzcGVjdFJhdGlvKCkge1xuICAgIGNvbnN0IHtvcHRpb25zOiB7YXNwZWN0UmF0aW8sIG1haW50YWluQXNwZWN0UmF0aW99LCB3aWR0aCwgaGVpZ2h0LCBfYXNwZWN0UmF0aW99ID0gdGhpcztcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWYoYXNwZWN0UmF0aW8pKSB7XG4gICAgICAvLyBJZiBhc3BlY3RSYXRpbyBpcyBkZWZpbmVkIGluIG9wdGlvbnMsIHVzZSB0aGF0LlxuICAgICAgcmV0dXJuIGFzcGVjdFJhdGlvO1xuICAgIH1cblxuICAgIGlmIChtYWludGFpbkFzcGVjdFJhdGlvICYmIF9hc3BlY3RSYXRpbykge1xuICAgICAgLy8gSWYgbWFpbnRhaW5Bc3BlY3RSYXRpbyBpcyB0cnV0aGx5IGFuZCB3ZSBoYWQgcHJldmlvdXNseSBkZXRlcm1pbmVkIF9hc3BlY3RSYXRpbywgdXNlIHRoYXRcbiAgICAgIHJldHVybiBfYXNwZWN0UmF0aW87XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlXG4gICAgcmV0dXJuIGhlaWdodCA/IHdpZHRoIC8gaGVpZ2h0IDogbnVsbDtcbiAgfVxuXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhO1xuICB9XG5cbiAgc2V0IGRhdGEoZGF0YSkge1xuICAgIHRoaXMuY29uZmlnLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBzZXQgb3B0aW9ucyhvcHRpb25zKSB7XG4gICAgdGhpcy5jb25maWcub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBnZXQgcmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBCZWZvcmUgaW5pdCBwbHVnaW4gbm90aWZpY2F0aW9uXG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVJbml0Jyk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlc3BvbnNpdmUpIHtcbiAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldGluYVNjYWxlKHRoaXMsIHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRFdmVudHMoKTtcblxuICAgIC8vIEFmdGVyIGluaXQgcGx1Z2luIG5vdGlmaWNhdGlvblxuICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJJbml0Jyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIGNsZWFyQ2FudmFzKHRoaXMuY2FudmFzLCB0aGlzLmN0eCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdG9wKCkge1xuICAgIGFuaW1hdG9yLnN0b3AodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcblx0ICogUmVzaXplIHRoZSBjaGFydCB0byBpdHMgY29udGFpbmVyIG9yIHRvIGV4cGxpY2l0IGRpbWVuc2lvbnMuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XVxuXHQgKi9cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoIWFuaW1hdG9yLnJ1bm5pbmcodGhpcykpIHtcbiAgICAgIHRoaXMuX3Jlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVzaXplQmVmb3JlRHJhdyA9IHt3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG4gIH1cblxuICBfcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gb3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvICYmIHRoaXMuYXNwZWN0UmF0aW87XG4gICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMucGxhdGZvcm0uZ2V0TWF4aW11bVNpemUoY2FudmFzLCB3aWR0aCwgaGVpZ2h0LCBhc3BlY3RSYXRpbyk7XG4gICAgY29uc3QgbmV3UmF0aW8gPSBvcHRpb25zLmRldmljZVBpeGVsUmF0aW8gfHwgdGhpcy5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMud2lkdGggPyAncmVzaXplJyA6ICdhdHRhY2gnO1xuXG4gICAgdGhpcy53aWR0aCA9IG5ld1NpemUud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBuZXdTaXplLmhlaWdodDtcbiAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuYXNwZWN0UmF0aW87XG4gICAgaWYgKCFyZXRpbmFTY2FsZSh0aGlzLCBuZXdSYXRpbywgdHJ1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ3Jlc2l6ZScsIHtzaXplOiBuZXdTaXplfSk7XG5cbiAgICBjYWxsQ2FsbGJhY2sob3B0aW9ucy5vblJlc2l6ZSwgW3RoaXMsIG5ld1NpemVdLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICBpZiAodGhpcy5fZG9SZXNpemUobW9kZSkpIHtcbiAgICAgICAgLy8gVGhlIHJlc2l6ZSB1cGRhdGUgaXMgZGVsYXllZCwgb25seSBkcmF3IHdpdGhvdXQgdXBkYXRpbmcuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlU2NhbGVzSGF2ZUlEcygpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHNjYWxlc09wdGlvbnMgPSBvcHRpb25zLnNjYWxlcyB8fCB7fTtcblxuICAgIGVhY2goc2NhbGVzT3B0aW9ucywgKGF4aXNPcHRpb25zLCBheGlzSUQpID0+IHtcbiAgICAgIGF4aXNPcHRpb25zLmlkID0gYXhpc0lEO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEJ1aWxkcyBhIG1hcCBvZiBzY2FsZSBJRCB0byBzY2FsZSBvYmplY3QgZm9yIGZ1dHVyZSBsb29rdXAuXG5cdCAqL1xuICBidWlsZE9yVXBkYXRlU2NhbGVzKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qgc2NhbGVPcHRzID0gb3B0aW9ucy5zY2FsZXM7XG4gICAgY29uc3Qgc2NhbGVzID0gdGhpcy5zY2FsZXM7XG4gICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5rZXlzKHNjYWxlcykucmVkdWNlKChvYmosIGlkKSA9PiB7XG4gICAgICBvYmpbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICBsZXQgaXRlbXMgPSBbXTtcblxuICAgIGlmIChzY2FsZU9wdHMpIHtcbiAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KFxuICAgICAgICBPYmplY3Qua2V5cyhzY2FsZU9wdHMpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSBzY2FsZU9wdHNbaWRdO1xuICAgICAgICAgIGNvbnN0IGF4aXMgPSBkZXRlcm1pbmVBeGlzKGlkLCBzY2FsZU9wdGlvbnMpO1xuICAgICAgICAgIGNvbnN0IGlzUmFkaWFsID0gYXhpcyA9PT0gJ3InO1xuICAgICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGF4aXMgPT09ICd4JztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3B0aW9uczogc2NhbGVPcHRpb25zLFxuICAgICAgICAgICAgZHBvc2l0aW9uOiBpc1JhZGlhbCA/ICdjaGFydEFyZWEnIDogaXNIb3Jpem9udGFsID8gJ2JvdHRvbScgOiAnbGVmdCcsXG4gICAgICAgICAgICBkdHlwZTogaXNSYWRpYWwgPyAncmFkaWFsTGluZWFyJyA6IGlzSG9yaXpvbnRhbCA/ICdjYXRlZ29yeScgOiAnbGluZWFyJ1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGVhY2goaXRlbXMsIChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSBpdGVtLm9wdGlvbnM7XG4gICAgICBjb25zdCBpZCA9IHNjYWxlT3B0aW9ucy5pZDtcbiAgICAgIGNvbnN0IGF4aXMgPSBkZXRlcm1pbmVBeGlzKGlkLCBzY2FsZU9wdGlvbnMpO1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gdmFsdWVPckRlZmF1bHQoc2NhbGVPcHRpb25zLnR5cGUsIGl0ZW0uZHR5cGUpO1xuXG4gICAgICBpZiAoc2NhbGVPcHRpb25zLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb25Jc0hvcml6b250YWwoc2NhbGVPcHRpb25zLnBvc2l0aW9uLCBheGlzKSAhPT0gcG9zaXRpb25Jc0hvcml6b250YWwoaXRlbS5kcG9zaXRpb24pKSB7XG4gICAgICAgIHNjYWxlT3B0aW9ucy5wb3NpdGlvbiA9IGl0ZW0uZHBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVkW2lkXSA9IHRydWU7XG4gICAgICBsZXQgc2NhbGUgPSBudWxsO1xuICAgICAgaWYgKGlkIGluIHNjYWxlcyAmJiBzY2FsZXNbaWRdLnR5cGUgPT09IHNjYWxlVHlwZSkge1xuICAgICAgICBzY2FsZSA9IHNjYWxlc1tpZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzY2FsZUNsYXNzID0gcmVnaXN0cnkuZ2V0U2NhbGUoc2NhbGVUeXBlKTtcbiAgICAgICAgc2NhbGUgPSBuZXcgc2NhbGVDbGFzcyh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdHlwZTogc2NhbGVUeXBlLFxuICAgICAgICAgIGN0eDogdGhpcy5jdHgsXG4gICAgICAgICAgY2hhcnQ6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIHNjYWxlc1tzY2FsZS5pZF0gPSBzY2FsZTtcbiAgICAgIH1cblxuICAgICAgc2NhbGUuaW5pdChzY2FsZU9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIC8vIGNsZWFyIHVwIGRpc2NhcmRlZCBzY2FsZXNcbiAgICBlYWNoKHVwZGF0ZWQsIChoYXNVcGRhdGVkLCBpZCkgPT4ge1xuICAgICAgaWYgKCFoYXNVcGRhdGVkKSB7XG4gICAgICAgIGRlbGV0ZSBzY2FsZXNbaWRdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWFjaChzY2FsZXMsIChzY2FsZSkgPT4ge1xuICAgICAgbGF5b3V0cy5jb25maWd1cmUodGhpcywgc2NhbGUsIHNjYWxlLm9wdGlvbnMpO1xuICAgICAgbGF5b3V0cy5hZGRCb3godGhpcywgc2NhbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlTWV0YXNldHMoKSB7XG4gICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLl9tZXRhc2V0cztcbiAgICBjb25zdCBudW1EYXRhID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBudW1NZXRhID0gbWV0YXNldHMubGVuZ3RoO1xuXG4gICAgbWV0YXNldHMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIGlmIChudW1NZXRhID4gbnVtRGF0YSkge1xuICAgICAgZm9yIChsZXQgaSA9IG51bURhdGE7IGkgPCBudW1NZXRhOyArK2kpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGkpO1xuICAgICAgfVxuICAgICAgbWV0YXNldHMuc3BsaWNlKG51bURhdGEsIG51bU1ldGEgLSBudW1EYXRhKTtcbiAgICB9XG4gICAgdGhpcy5fc29ydGVkTWV0YXNldHMgPSBtZXRhc2V0cy5zbGljZSgwKS5zb3J0KGNvbXBhcmUyTGV2ZWwoJ29yZGVyJywgJ2luZGV4JykpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSB7XG4gICAgY29uc3Qge19tZXRhc2V0czogbWV0YXNldHMsIGRhdGE6IHtkYXRhc2V0c319ID0gdGhpcztcbiAgICBpZiAobWV0YXNldHMubGVuZ3RoID4gZGF0YXNldHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhY2tzO1xuICAgIH1cbiAgICBtZXRhc2V0cy5mb3JFYWNoKChtZXRhLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGRhdGFzZXRzLmZpbHRlcih4ID0+IHggPT09IG1ldGEuX2RhdGFzZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCkge1xuICAgIGNvbnN0IG5ld0NvbnRyb2xsZXJzID0gW107XG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmRhdGEuZGF0YXNldHM7XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICB0aGlzLl9yZW1vdmVVbnJlZmVyZW5jZWRNZXRhc2V0cygpO1xuXG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2ldO1xuICAgICAgbGV0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgY29uc3QgdHlwZSA9IGRhdGFzZXQudHlwZSB8fCB0aGlzLmNvbmZpZy50eXBlO1xuXG4gICAgICBpZiAobWV0YS50eXBlICYmIG1ldGEudHlwZSAhPT0gdHlwZSkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaSk7XG4gICAgICAgIG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgfVxuICAgICAgbWV0YS50eXBlID0gdHlwZTtcbiAgICAgIG1ldGEuaW5kZXhBeGlzID0gZGF0YXNldC5pbmRleEF4aXMgfHwgZ2V0SW5kZXhBeGlzKHR5cGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBtZXRhLm9yZGVyID0gZGF0YXNldC5vcmRlciB8fCAwO1xuICAgICAgbWV0YS5pbmRleCA9IGk7XG4gICAgICBtZXRhLmxhYmVsID0gJycgKyBkYXRhc2V0LmxhYmVsO1xuICAgICAgbWV0YS52aXNpYmxlID0gdGhpcy5pc0RhdGFzZXRWaXNpYmxlKGkpO1xuXG4gICAgICBpZiAobWV0YS5jb250cm9sbGVyKSB7XG4gICAgICAgIG1ldGEuY29udHJvbGxlci51cGRhdGVJbmRleChpKTtcbiAgICAgICAgbWV0YS5jb250cm9sbGVyLmxpbmtTY2FsZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IENvbnRyb2xsZXJDbGFzcyA9IHJlZ2lzdHJ5LmdldENvbnRyb2xsZXIodHlwZSk7XG4gICAgICAgIGNvbnN0IHtkYXRhc2V0RWxlbWVudFR5cGUsIGRhdGFFbGVtZW50VHlwZX0gPSBkZWZhdWx0cy5kYXRhc2V0c1t0eXBlXTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihDb250cm9sbGVyQ2xhc3MsIHtcbiAgICAgICAgICBkYXRhRWxlbWVudFR5cGU6IHJlZ2lzdHJ5LmdldEVsZW1lbnQoZGF0YUVsZW1lbnRUeXBlKSxcbiAgICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGRhdGFzZXRFbGVtZW50VHlwZSAmJiByZWdpc3RyeS5nZXRFbGVtZW50KGRhdGFzZXRFbGVtZW50VHlwZSlcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGEuY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyQ2xhc3ModGhpcywgaSk7XG4gICAgICAgIG5ld0NvbnRyb2xsZXJzLnB1c2gobWV0YS5jb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVNZXRhc2V0cygpO1xuICAgIHJldHVybiBuZXdDb250cm9sbGVycztcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXNldCB0aGUgZWxlbWVudHMgb2YgYWxsIGRhdGFzZXRzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVzZXRFbGVtZW50cygpIHtcbiAgICBlYWNoKHRoaXMuZGF0YS5kYXRhc2V0cywgKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkgPT4ge1xuICAgICAgdGhpcy5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIucmVzZXQoKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuXHQqIFJlc2V0cyB0aGUgY2hhcnQgYmFjayB0byBpdHMgc3RhdGUgYmVmb3JlIHRoZSBpbml0aWFsIGFuaW1hdGlvblxuXHQqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRzKCk7XG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdyZXNldCcpO1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgIGNvbmZpZy51cGRhdGUoKTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihjb25maWcuY2hhcnRPcHRpb25TY29wZXMoKSwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNvbnN0IGFuaW1zRGlzYWJsZWQgPSB0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQgPSAhb3B0aW9ucy5hbmltYXRpb247XG5cbiAgICB0aGlzLl91cGRhdGVTY2FsZXMoKTtcbiAgICB0aGlzLl9jaGVja0V2ZW50QmluZGluZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCk7XG5cbiAgICAvLyBwbHVnaW5zIG9wdGlvbnMgcmVmZXJlbmNlcyBtaWdodCBoYXZlIGNoYW5nZSwgbGV0J3MgaW52YWxpZGF0ZSB0aGUgY2FjaGVcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTExMSNpc3N1ZWNvbW1lbnQtMzU1OTM0MTY3XG4gICAgdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCk7XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVVcGRhdGUnLCB7bW9kZSwgY2FuY2VsYWJsZTogdHJ1ZX0pID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSBkYXRhc2V0IGNvbnRyb2xsZXJzIGFyZSB1cGRhdGVkIGFuZCBuZXcgY29udHJvbGxlcnMgYXJlIHJlc2V0XG4gICAgY29uc3QgbmV3Q29udHJvbGxlcnMgPSB0aGlzLmJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpO1xuXG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVFbGVtZW50c1VwZGF0ZScpO1xuXG4gICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhc2V0IGNvbnRyb2xsZXJzIGhhdmUgY29ycmVjdCBtZXRhIGRhdGEgY291bnRzXG4gICAgbGV0IG1pblBhZGRpbmcgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBpbGVuID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgICAgY29uc3Qge2NvbnRyb2xsZXJ9ID0gdGhpcy5nZXREYXRhc2V0TWV0YShpKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gIWFuaW1zRGlzYWJsZWQgJiYgbmV3Q29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKSA9PT0gLTE7XG4gICAgICAvLyBOZXcgY29udHJvbGxlcnMgd2lsbCBiZSByZXNldCBhZnRlciB0aGUgbGF5b3V0IHBhc3MsIHNvIHdlIG9ubHkgd2FudCB0byBtb2RpZnlcbiAgICAgIC8vIGVsZW1lbnRzIGFkZGVkIHRvIG5ldyBkYXRhc2V0c1xuICAgICAgY29udHJvbGxlci5idWlsZE9yVXBkYXRlRWxlbWVudHMocmVzZXQpO1xuICAgICAgbWluUGFkZGluZyA9IE1hdGgubWF4KCtjb250cm9sbGVyLmdldE1heE92ZXJmbG93KCksIG1pblBhZGRpbmcpO1xuICAgIH1cbiAgICBtaW5QYWRkaW5nID0gdGhpcy5fbWluUGFkZGluZyA9IG9wdGlvbnMubGF5b3V0LmF1dG9QYWRkaW5nID8gbWluUGFkZGluZyA6IDA7XG4gICAgdGhpcy5fdXBkYXRlTGF5b3V0KG1pblBhZGRpbmcpO1xuXG4gICAgLy8gT25seSByZXNldCB0aGUgY29udHJvbGxlcnMgaWYgd2UgaGF2ZSBhbmltYXRpb25zXG4gICAgaWYgKCFhbmltc0Rpc2FibGVkKSB7XG4gICAgICAvLyBDYW4gb25seSByZXNldCB0aGUgbmV3IGNvbnRyb2xsZXJzIGFmdGVyIHRoZSBzY2FsZXMgaGF2ZSBiZWVuIHVwZGF0ZWRcbiAgICAgIC8vIFJlc2V0IGlzIGRvbmUgdG8gZ2V0IHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGluaXRpYWwgYW5pbWF0aW9uXG4gICAgICBlYWNoKG5ld0NvbnRyb2xsZXJzLCAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBjb250cm9sbGVyLnJlc2V0KCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVEYXRhc2V0cyhtb2RlKTtcblxuICAgIC8vIERvIHRoaXMgYmVmb3JlIHJlbmRlciBzbyB0aGF0IGFueSBwbHVnaW5zIHRoYXQgbmVlZCBmaW5hbCBzY2FsZSB1cGRhdGVzIGNhbiB1c2UgaXRcbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyVXBkYXRlJywge21vZGV9KTtcblxuICAgIHRoaXMuX2xheWVycy5zb3J0KGNvbXBhcmUyTGV2ZWwoJ3onLCAnX2lkeCcpKTtcblxuICAgIC8vIFJlcGxheSBsYXN0IGV2ZW50IGZyb20gYmVmb3JlIHVwZGF0ZSwgb3Igc2V0IGhvdmVyIHN0eWxlcyBvbiBhY3RpdmUgZWxlbWVudHNcbiAgICBjb25zdCB7X2FjdGl2ZSwgX2xhc3RFdmVudH0gPSB0aGlzO1xuICAgIGlmIChfbGFzdEV2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIoX2xhc3RFdmVudCwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChfYWN0aXZlLmxlbmd0aCkge1xuICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoX2FjdGl2ZSwgX2FjdGl2ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZVNjYWxlcygpIHtcbiAgICBlYWNoKHRoaXMuc2NhbGVzLCAoc2NhbGUpID0+IHtcbiAgICAgIGxheW91dHMucmVtb3ZlQm94KHRoaXMsIHNjYWxlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpO1xuICAgIHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tFdmVudEJpbmRpbmdzKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgZXhpc3RpbmdFdmVudHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpO1xuICAgIGNvbnN0IG5ld0V2ZW50cyA9IG5ldyBTZXQob3B0aW9ucy5ldmVudHMpO1xuXG4gICAgaWYgKCFzZXRzRXF1YWwoZXhpc3RpbmdFdmVudHMsIG5ld0V2ZW50cykgfHwgISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzICE9PSBvcHRpb25zLnJlc3BvbnNpdmUpIHtcbiAgICAgIC8vIFRoZSBjb25maWd1cmVkIGV2ZW50cyBoYXZlIGNoYW5nZWQuIFJlYmluZC5cbiAgICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVIaWRkZW5JbmRpY2VzKCkge1xuICAgIGNvbnN0IHtfaGlkZGVuSW5kaWNlc30gPSB0aGlzO1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IHttZXRob2QsIHN0YXJ0LCBjb3VudH0gb2YgY2hhbmdlcykge1xuICAgICAgY29uc3QgbW92ZSA9IG1ldGhvZCA9PT0gJ19yZW1vdmVFbGVtZW50cycgPyAtY291bnQgOiBjb3VudDtcbiAgICAgIG1vdmVOdW1lcmljS2V5cyhfaGlkZGVuSW5kaWNlcywgc3RhcnQsIG1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldFVuaWZvcm1EYXRhQ2hhbmdlcygpIHtcbiAgICBjb25zdCBfZGF0YUNoYW5nZXMgPSB0aGlzLl9kYXRhQ2hhbmdlcztcbiAgICBpZiAoIV9kYXRhQ2hhbmdlcyB8fCAhX2RhdGFDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGFDaGFuZ2VzID0gW107XG4gICAgY29uc3QgZGF0YXNldENvdW50ID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBtYWtlU2V0ID0gKGlkeCkgPT4gbmV3IFNldChcbiAgICAgIF9kYXRhQ2hhbmdlc1xuICAgICAgICAuZmlsdGVyKGMgPT4gY1swXSA9PT0gaWR4KVxuICAgICAgICAubWFwKChjLCBpKSA9PiBpICsgJywnICsgYy5zcGxpY2UoMSkuam9pbignLCcpKVxuICAgICk7XG5cbiAgICBjb25zdCBjaGFuZ2VTZXQgPSBtYWtlU2V0KDApO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YXNldENvdW50OyBpKyspIHtcbiAgICAgIGlmICghc2V0c0VxdWFsKGNoYW5nZVNldCwgbWFrZVNldChpKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShjaGFuZ2VTZXQpXG4gICAgICAubWFwKGMgPT4gYy5zcGxpdCgnLCcpKVxuICAgICAgLm1hcChhID0+ICh7bWV0aG9kOiBhWzFdLCBzdGFydDogK2FbMl0sIGNvdW50OiArYVszXX0pKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBjaGFydCBsYXlvdXQgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZUxheW91dGBcblx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyTGF5b3V0YC5cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF91cGRhdGVMYXlvdXQobWluUGFkZGluZykge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUxheW91dCcsIHtjYW5jZWxhYmxlOiB0cnVlfSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGF5b3V0cy51cGRhdGUodGhpcywgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIG1pblBhZGRpbmcpO1xuXG4gICAgY29uc3QgYXJlYSA9IHRoaXMuY2hhcnRBcmVhO1xuICAgIGNvbnN0IG5vQXJlYSA9IGFyZWEud2lkdGggPD0gMCB8fCBhcmVhLmhlaWdodCA8PSAwO1xuXG4gICAgdGhpcy5fbGF5ZXJzID0gW107XG4gICAgZWFjaCh0aGlzLmJveGVzLCAoYm94KSA9PiB7XG4gICAgICBpZiAobm9BcmVhICYmIGJveC5wb3NpdGlvbiA9PT0gJ2NoYXJ0QXJlYScpIHtcbiAgICAgICAgLy8gU2tpcCBkcmF3aW5nIGFuZCBjb25maWd1cmluZyBjaGFydEFyZWEgYm94ZXMgd2hlbiBjaGFydEFyZWEgaXMgemVybyBvciBuZWdhdGl2ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmZpZ3VyZSBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgaW4gY29yZS5zY2FsZS51cGRhdGUgYW5kIG9uY2UgaGVyZS5cbiAgICAgIC8vIEhlcmUgdGhlIGJveGVzIGFyZSBmdWxseSB1cGRhdGVkIGFuZCBhdCB0aGVpciBmaW5hbCBwb3NpdGlvbnMuXG4gICAgICBpZiAoYm94LmNvbmZpZ3VyZSkge1xuICAgICAgICBib3guY29uZmlndXJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9sYXllcnMucHVzaCguLi5ib3guX2xheWVycygpKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMuX2xheWVycy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5faWR4ID0gaW5kZXg7XG4gICAgfSk7XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyTGF5b3V0Jyk7XG4gIH1cblxuICAvKipcblx0ICogVXBkYXRlcyBhbGwgZGF0YXNldHMgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRzVXBkYXRlYFxuXHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlRGF0YXNldHMobW9kZSkge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURhdGFzZXRzVXBkYXRlJywge21vZGUsIGNhbmNlbGFibGU6IHRydWV9KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHRoaXMuZ2V0RGF0YXNldE1ldGEoaSkuY29udHJvbGxlci5jb25maWd1cmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGFzZXQoaSwgaXNGdW5jdGlvbihtb2RlKSA/IG1vZGUoe2RhdGFzZXRJbmRleDogaX0pIDogbW9kZSk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckRhdGFzZXRzVXBkYXRlJywge21vZGV9KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVcGRhdGVzIGRhdGFzZXQgYXQgaW5kZXggdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRVcGRhdGVgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRVcGRhdGVgLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3VwZGF0ZURhdGFzZXQoaW5kZXgsIG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gICAgY29uc3QgYXJncyA9IHttZXRhLCBpbmRleCwgbW9kZSwgY2FuY2VsYWJsZTogdHJ1ZX07XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0VXBkYXRlJywgYXJncykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5jb250cm9sbGVyLl91cGRhdGUobW9kZSk7XG5cbiAgICBhcmdzLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldFVwZGF0ZScsIGFyZ3MpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZVJlbmRlcicsIHtjYW5jZWxhYmxlOiB0cnVlfSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFuaW1hdG9yLmhhcyh0aGlzKSkge1xuICAgICAgaWYgKHRoaXMuYXR0YWNoZWQgJiYgIWFuaW1hdG9yLnJ1bm5pbmcodGhpcykpIHtcbiAgICAgICAgYW5pbWF0b3Iuc3RhcnQodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgb25BbmltYXRpb25zQ29tcGxldGUoe2NoYXJ0OiB0aGlzfSk7XG4gICAgfVxuICB9XG5cbiAgZHJhdygpIHtcbiAgICBsZXQgaTtcbiAgICBpZiAodGhpcy5fcmVzaXplQmVmb3JlRHJhdykge1xuICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gdGhpcy5fcmVzaXplQmVmb3JlRHJhdztcbiAgICAgIHRoaXMuX3Jlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG5cbiAgICBpZiAodGhpcy53aWR0aCA8PSAwIHx8IHRoaXMuaGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEcmF3Jywge2NhbmNlbGFibGU6IHRydWV9KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCZWNhdXNlIG9mIHBsdWdpbiBob29rcyAoYmVmb3JlL2FmdGVyRGF0YXNldHNEcmF3KSwgZGF0YXNldHMgY2FuJ3RcbiAgICAvLyBjdXJyZW50bHkgYmUgcGFydCBvZiBsYXllcnMuIEluc3RlYWQsIHdlIGRyYXdcbiAgICAvLyBsYXllcnMgPD0gMCBiZWZvcmUoZGVmYXVsdCwgYmFja3dhcmQgY29tcGF0KSwgYW5kIHRoZSByZXN0IGFmdGVyXG4gICAgY29uc3QgbGF5ZXJzID0gdGhpcy5fbGF5ZXJzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoICYmIGxheWVyc1tpXS56IDw9IDA7ICsraSkge1xuICAgICAgbGF5ZXJzW2ldLmRyYXcodGhpcy5jaGFydEFyZWEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYXdEYXRhc2V0cygpO1xuXG4gICAgLy8gUmVzdCBvZiBsYXllcnNcbiAgICBmb3IgKDsgaSA8IGxheWVycy5sZW5ndGg7ICsraSkge1xuICAgICAgbGF5ZXJzW2ldLmRyYXcodGhpcy5jaGFydEFyZWEpO1xuICAgIH1cblxuICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEcmF3Jyk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZmlsdGVyVmlzaWJsZSkge1xuICAgIGNvbnN0IG1ldGFzZXRzID0gdGhpcy5fc29ydGVkTWV0YXNldHM7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBjb25zdCBtZXRhID0gbWV0YXNldHNbaV07XG4gICAgICBpZiAoIWZpbHRlclZpc2libGUgfHwgbWV0YS52aXNpYmxlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1ldGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcblx0ICogR2V0cyB0aGUgdmlzaWJsZSBkYXRhc2V0IG1ldGFzIGluIGRyYXdpbmcgb3JkZXJcblx0ICogQHJldHVybiB7b2JqZWN0W119XG5cdCAqL1xuICBnZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTb3J0ZWREYXRhc2V0TWV0YXModHJ1ZSk7XG4gIH1cblxuICAvKipcblx0ICogRHJhd3MgYWxsIGRhdGFzZXRzIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0c0RyYXdgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRzRHJhd2AuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZHJhd0RhdGFzZXRzKCkge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURhdGFzZXRzRHJhdycsIHtjYW5jZWxhYmxlOiB0cnVlfSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKTtcbiAgICBmb3IgKGxldCBpID0gbWV0YXNldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRoaXMuX2RyYXdEYXRhc2V0KG1ldGFzZXRzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldHNEcmF3Jyk7XG4gIH1cblxuICAvKipcblx0ICogRHJhd3MgZGF0YXNldCBhdCBpbmRleCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldERyYXdgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXREcmF3YC5cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9kcmF3RGF0YXNldChtZXRhKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY2xpcCA9IG1ldGEuX2NsaXA7XG4gICAgY29uc3QgdXNlQ2xpcCA9ICFjbGlwLmRpc2FibGVkO1xuICAgIGNvbnN0IGFyZWEgPSBnZXREYXRhc2V0QXJlYShtZXRhKSB8fCB0aGlzLmNoYXJ0QXJlYTtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgbWV0YSxcbiAgICAgIGluZGV4OiBtZXRhLmluZGV4LFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0RHJhdycsIGFyZ3MpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh1c2VDbGlwKSB7XG4gICAgICBjbGlwQXJlYShjdHgsIHtcbiAgICAgICAgbGVmdDogY2xpcC5sZWZ0ID09PSBmYWxzZSA/IDAgOiBhcmVhLmxlZnQgLSBjbGlwLmxlZnQsXG4gICAgICAgIHJpZ2h0OiBjbGlwLnJpZ2h0ID09PSBmYWxzZSA/IHRoaXMud2lkdGggOiBhcmVhLnJpZ2h0ICsgY2xpcC5yaWdodCxcbiAgICAgICAgdG9wOiBjbGlwLnRvcCA9PT0gZmFsc2UgPyAwIDogYXJlYS50b3AgLSBjbGlwLnRvcCxcbiAgICAgICAgYm90dG9tOiBjbGlwLmJvdHRvbSA9PT0gZmFsc2UgPyB0aGlzLmhlaWdodCA6IGFyZWEuYm90dG9tICsgY2xpcC5ib3R0b21cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1ldGEuY29udHJvbGxlci5kcmF3KCk7XG5cbiAgICBpZiAodXNlQ2xpcCkge1xuICAgICAgdW5jbGlwQXJlYShjdHgpO1xuICAgIH1cblxuICAgIGFyZ3MuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEYXRhc2V0RHJhdycsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwb2ludCBpcyBpbiB0aGUgY2hhcnQgYXJlYS5cbiAgICogQHBhcmFtIHtQb2ludH0gcG9pbnQgLSBpbiByZWxhdGl2ZSBjb29yZGluYXRlcyAoc2VlLCBlLmcuLCBnZXRSZWxhdGl2ZVBvc2l0aW9uKVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUG9pbnRJbkFyZWEocG9pbnQpIHtcbiAgICByZXR1cm4gX2lzUG9pbnRJbkFyZWEocG9pbnQsIHRoaXMuY2hhcnRBcmVhLCB0aGlzLl9taW5QYWRkaW5nKTtcbiAgfVxuXG4gIGdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgbW9kZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIGNvbnN0IG1ldGhvZCA9IEludGVyYWN0aW9uLm1vZGVzW21vZGVdO1xuICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kKHRoaXMsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgICBjb25zdCBtZXRhc2V0cyA9IHRoaXMuX21ldGFzZXRzO1xuICAgIGxldCBtZXRhID0gbWV0YXNldHMuZmlsdGVyKHggPT4geCAmJiB4Ll9kYXRhc2V0ID09PSBkYXRhc2V0KS5wb3AoKTtcblxuICAgIGlmICghbWV0YSkge1xuICAgICAgbWV0YSA9IHtcbiAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgZGF0YTogW10sXG4gICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgIGNvbnRyb2xsZXI6IG51bGwsXG4gICAgICAgIGhpZGRlbjogbnVsbCxcdFx0XHQvLyBTZWUgaXNEYXRhc2V0VmlzaWJsZSgpIGNvbW1lbnRcbiAgICAgICAgeEF4aXNJRDogbnVsbCxcbiAgICAgICAgeUF4aXNJRDogbnVsbCxcbiAgICAgICAgb3JkZXI6IGRhdGFzZXQgJiYgZGF0YXNldC5vcmRlciB8fCAwLFxuICAgICAgICBpbmRleDogZGF0YXNldEluZGV4LFxuICAgICAgICBfZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgX3BhcnNlZDogW10sXG4gICAgICAgIF9zb3J0ZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgbWV0YXNldHMucHVzaChtZXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRleHQgfHwgKHRoaXMuJGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KG51bGwsIHtjaGFydDogdGhpcywgdHlwZTogJ2NoYXJ0J30pKTtcbiAgfVxuXG4gIGdldFZpc2libGVEYXRhc2V0Q291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLmxlbmd0aDtcbiAgfVxuXG4gIGlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuICAgIGlmICghZGF0YXNldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cbiAgICAvLyBtZXRhLmhpZGRlbiBpcyBhIHBlciBjaGFydCBkYXRhc2V0IGhpZGRlbiBmbGFnIG92ZXJyaWRlIHdpdGggMyBzdGF0ZXM6IGlmIHRydWUgb3IgZmFsc2UsXG4gICAgLy8gdGhlIGRhdGFzZXQuaGlkZGVuIHZhbHVlIGlzIGlnbm9yZWQsIGVsc2UgaWYgbnVsbCwgdGhlIGRhdGFzZXQgaGlkZGVuIHN0YXRlIGlzIHJldHVybmVkLlxuICAgIHJldHVybiB0eXBlb2YgbWV0YS5oaWRkZW4gPT09ICdib29sZWFuJyA/ICFtZXRhLmhpZGRlbiA6ICFkYXRhc2V0LmhpZGRlbjtcbiAgfVxuXG4gIHNldERhdGFzZXRWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgdmlzaWJsZSkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgbWV0YS5oaWRkZW4gPSAhdmlzaWJsZTtcbiAgfVxuXG4gIHRvZ2dsZURhdGFWaXNpYmlsaXR5KGluZGV4KSB7XG4gICAgdGhpcy5faGlkZGVuSW5kaWNlc1tpbmRleF0gPSAhdGhpcy5faGlkZGVuSW5kaWNlc1tpbmRleF07XG4gIH1cblxuICBnZXREYXRhVmlzaWJpbGl0eShpbmRleCkge1xuICAgIHJldHVybiAhdGhpcy5faGlkZGVuSW5kaWNlc1tpbmRleF07XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF91cGRhdGVWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgZGF0YUluZGV4LCB2aXNpYmxlKSB7XG4gICAgY29uc3QgbW9kZSA9IHZpc2libGUgPyAnc2hvdycgOiAnaGlkZSc7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcbiAgICBjb25zdCBhbmltcyA9IG1ldGEuY29udHJvbGxlci5fcmVzb2x2ZUFuaW1hdGlvbnModW5kZWZpbmVkLCBtb2RlKTtcblxuICAgIGlmIChkZWZpbmVkKGRhdGFJbmRleCkpIHtcbiAgICAgIG1ldGEuZGF0YVtkYXRhSW5kZXhdLmhpZGRlbiA9ICF2aXNpYmxlO1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhc2V0VmlzaWJpbGl0eShkYXRhc2V0SW5kZXgsIHZpc2libGUpO1xuICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIHN0YXRlLCBzbyBoaWRlIGFuaW1hdGlvbiBjYW4gYmUgc2Vlbi4gVGhpcyBjb3VsZCBiZSBoYW5kbGVkIGJldHRlciBpZiB1cGRhdGUgLyB1cGRhdGVEYXRhc2V0IHJldHVybmVkIGEgUHJvbWlzZS5cbiAgICAgIGFuaW1zLnVwZGF0ZShtZXRhLCB7dmlzaWJsZX0pO1xuICAgICAgdGhpcy51cGRhdGUoKGN0eCkgPT4gY3R4LmRhdGFzZXRJbmRleCA9PT0gZGF0YXNldEluZGV4ID8gbW9kZSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgaGlkZShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCkge1xuICAgIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHkoZGF0YXNldEluZGV4LCBkYXRhSW5kZXgsIGZhbHNlKTtcbiAgfVxuXG4gIHNob3coZGF0YXNldEluZGV4LCBkYXRhSW5kZXgpIHtcbiAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgZGF0YUluZGV4LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2Rlc3Ryb3lEYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fbWV0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgICBpZiAobWV0YSAmJiBtZXRhLmNvbnRyb2xsZXIpIHtcbiAgICAgIG1ldGEuY29udHJvbGxlci5fZGVzdHJveSgpO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5fbWV0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgfVxuXG4gIF9zdG9wKCkge1xuICAgIGxldCBpLCBpbGVuO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIGFuaW1hdG9yLnJlbW92ZSh0aGlzKTtcblxuICAgIGZvciAoaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURlc3Ryb3knKTtcbiAgICBjb25zdCB7Y2FudmFzLCBjdHh9ID0gdGhpcztcblxuICAgIHRoaXMuX3N0b3AoKTtcbiAgICB0aGlzLmNvbmZpZy5jbGVhckNhY2hlKCk7XG5cbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpO1xuICAgICAgdGhpcy5wbGF0Zm9ybS5yZWxlYXNlQ29udGV4dChjdHgpO1xuICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgdGhpcy5jdHggPSBudWxsO1xuICAgIH1cblxuICAgIGRlbGV0ZSBpbnN0YW5jZXNbdGhpcy5pZF07XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGVzdHJveScpO1xuICB9XG5cbiAgdG9CYXNlNjRJbWFnZSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLnRvRGF0YVVSTCguLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLmJpbmRVc2VyRXZlbnRzKCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXNwb25zaXZlKSB7XG4gICAgICB0aGlzLmJpbmRSZXNwb25zaXZlRXZlbnRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXR0YWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYmluZFVzZXJFdmVudHMoKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcblxuICAgIGNvbnN0IF9hZGQgPSAodHlwZSwgbGlzdGVuZXIpID0+IHtcbiAgICAgIHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgfTtcblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGUsIHgsIHkpID0+IHtcbiAgICAgIGUub2Zmc2V0WCA9IHg7XG4gICAgICBlLm9mZnNldFkgPSB5O1xuICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyKGUpO1xuICAgIH07XG5cbiAgICBlYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsICh0eXBlKSA9PiBfYWRkKHR5cGUsIGxpc3RlbmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJpbmRSZXNwb25zaXZlRXZlbnRzKCkge1xuICAgIGlmICghdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycykge1xuICAgICAgdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcblxuICAgIGNvbnN0IF9hZGQgPSAodHlwZSwgbGlzdGVuZXIpID0+IHtcbiAgICAgIHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgfTtcbiAgICBjb25zdCBfcmVtb3ZlID0gKHR5cGUsIGxpc3RlbmVyKSA9PiB7XG4gICAgICBpZiAobGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgIHBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgICBkZWxldGUgbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBsaXN0ZW5lciA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgdGhpcy5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBkZXRhY2hlZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICBjb25zdCBhdHRhY2hlZCA9ICgpID0+IHtcbiAgICAgIF9yZW1vdmUoJ2F0dGFjaCcsIGF0dGFjaGVkKTtcblxuICAgICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICBfYWRkKCdyZXNpemUnLCBsaXN0ZW5lcik7XG4gICAgICBfYWRkKCdkZXRhY2gnLCBkZXRhY2hlZCk7XG4gICAgfTtcblxuICAgIGRldGFjaGVkID0gKCkgPT4ge1xuICAgICAgdGhpcy5hdHRhY2hlZCA9IGZhbHNlO1xuXG4gICAgICBfcmVtb3ZlKCdyZXNpemUnLCBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFN0b3AgYW5pbWF0aW5nIGFuZCByZW1vdmUgbWV0YXNldHMsIHNvIHdoZW4gcmUtYXR0YWNoZWQsIHRoZSBhbmltYXRpb25zIHN0YXJ0IGZyb20gYmVnaW5uaW5nLlxuICAgICAgdGhpcy5fc3RvcCgpO1xuICAgICAgdGhpcy5fcmVzaXplKDAsIDApO1xuXG4gICAgICBfYWRkKCdhdHRhY2gnLCBhdHRhY2hlZCk7XG4gICAgfTtcblxuICAgIGlmIChwbGF0Zm9ybS5pc0F0dGFjaGVkKHRoaXMuY2FudmFzKSkge1xuICAgICAgYXR0YWNoZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV0YWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIHVuYmluZEV2ZW50cygpIHtcbiAgICBlYWNoKHRoaXMuX2xpc3RlbmVycywgKGxpc3RlbmVyLCB0eXBlKSA9PiB7XG4gICAgICB0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gICAgZWFjaCh0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzLCAobGlzdGVuZXIsIHR5cGUpID0+IHtcbiAgICAgIHRoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUhvdmVyU3R5bGUoaXRlbXMsIG1vZGUsIGVuYWJsZWQpIHtcbiAgICBjb25zdCBwcmVmaXggPSBlbmFibGVkID8gJ3NldCcgOiAncmVtb3ZlJztcbiAgICBsZXQgbWV0YSwgaXRlbSwgaSwgaWxlbjtcblxuICAgIGlmIChtb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgIG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGl0ZW1zWzBdLmRhdGFzZXRJbmRleCk7XG4gICAgICBtZXRhLmNvbnRyb2xsZXJbJ18nICsgcHJlZml4ICsgJ0RhdGFzZXRIb3ZlclN0eWxlJ10oKTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBpdGVtID0gaXRlbXNbaV07XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gaXRlbSAmJiB0aGlzLmdldERhdGFzZXRNZXRhKGl0ZW0uZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlcltwcmVmaXggKyAnSG92ZXJTdHlsZSddKGl0ZW0uZWxlbWVudCwgaXRlbS5kYXRhc2V0SW5kZXgsIGl0ZW0uaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBHZXQgYWN0aXZlIChob3ZlcmVkKSBlbGVtZW50c1xuXHQgKiBAcmV0dXJucyBhcnJheVxuXHQgKi9cbiAgZ2V0QWN0aXZlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBTZXQgYWN0aXZlIChob3ZlcmVkKSBlbGVtZW50c1xuXHQgKiBAcGFyYW0ge2FycmF5fSBhY3RpdmVFbGVtZW50cyBOZXcgYWN0aXZlIGRhdGEgcG9pbnRzXG5cdCAqL1xuICBzZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlRWxlbWVudHMubWFwKCh7ZGF0YXNldEluZGV4LCBpbmRleH0pID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhc2V0IGZvdW5kIGF0IGluZGV4ICcgKyBkYXRhc2V0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhc2V0SW5kZXgsXG4gICAgICAgIGVsZW1lbnQ6IG1ldGEuZGF0YVtpbmRleF0sXG4gICAgICAgIGluZGV4LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFuZ2VkID0gIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG5cbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHVzZSB0aGUgcHJldmlvdXMgbW91c2UgZXZlbnQgdG8gb3ZlcnJpZGUgdGhlIGFjdGl2ZSBlbGVtZW50cyBpbiB1cGRhdGUuXG4gICAgICB0aGlzLl9sYXN0RXZlbnQgPSBudWxsO1xuICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoYWN0aXZlLCBsYXN0QWN0aXZlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQ2FsbHMgZW5hYmxlZCBwbHVnaW5zIG9uIHRoZSBzcGVjaWZpZWQgaG9vayBhbmQgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cblx0ICogVGhpcyBtZXRob2QgaW1tZWRpYXRlbHkgcmV0dXJucyBhcyBzb29uIGFzIGEgcGx1Z2luIGV4cGxpY2l0bHkgcmV0dXJucyBmYWxzZS4gVGhlXG5cdCAqIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkLCBmb3IgaW5zdGFuY2UsIHRvIGludGVycnVwdCB0aGUgY3VycmVudCBhY3Rpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBob29rIC0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiBtZXRob2QgdG8gY2FsbCAoZS5nLiAnYmVmb3JlVXBkYXRlJykuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnc10gLSBFeHRyYSBhcmd1bWVudHMgdG8gYXBwbHkgdG8gdGhlIGhvb2sgY2FsbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoJy4vY29yZS5wbHVnaW5zLmpzJykuZmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdIC0gRmlsdGVyaW5nIGZ1bmN0aW9uIGZvciBsaW1pdGluZyB3aGljaCBwbHVnaW5zIGFyZSBub3RpZmllZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gZmFsc2UgaWYgYW55IG9mIHRoZSBwbHVnaW5zIHJldHVybiBmYWxzZSwgZWxzZSByZXR1cm5zIHRydWUuXG5cdCAqL1xuICBub3RpZnlQbHVnaW5zKGhvb2ssIGFyZ3MsIGZpbHRlcikge1xuICAgIHJldHVybiB0aGlzLl9wbHVnaW5zLm5vdGlmeSh0aGlzLCBob29rLCBhcmdzLCBmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcGx1Z2luIHdpdGggdGhlIHNwZWNpZmljIElEIGlzIHJlZ2lzdGVyZWQgYW5kIGVuYWJsZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpbklkIC0gVGhlIElEIG9mIHRoZSBwbHVnaW4gb2Ygd2hpY2ggdG8gY2hlY2sgaWYgaXQgaXMgZW5hYmxlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUGx1Z2luRW5hYmxlZChwbHVnaW5JZCkge1xuICAgIHJldHVybiB0aGlzLl9wbHVnaW5zLl9jYWNoZS5maWx0ZXIocCA9PiBwLnBsdWdpbi5pZCA9PT0gcGx1Z2luSWQpLmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3VwZGF0ZUhvdmVyU3R5bGVzKGFjdGl2ZSwgbGFzdEFjdGl2ZSwgcmVwbGF5KSB7XG4gICAgY29uc3QgaG92ZXJPcHRpb25zID0gdGhpcy5vcHRpb25zLmhvdmVyO1xuICAgIGNvbnN0IGRpZmYgPSAoYSwgYikgPT4gYS5maWx0ZXIoeCA9PiAhYi5zb21lKHkgPT4geC5kYXRhc2V0SW5kZXggPT09IHkuZGF0YXNldEluZGV4ICYmIHguaW5kZXggPT09IHkuaW5kZXgpKTtcbiAgICBjb25zdCBkZWFjdGl2YXRlZCA9IGRpZmYobGFzdEFjdGl2ZSwgYWN0aXZlKTtcbiAgICBjb25zdCBhY3RpdmF0ZWQgPSByZXBsYXkgPyBhY3RpdmUgOiBkaWZmKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG5cbiAgICBpZiAoZGVhY3RpdmF0ZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnVwZGF0ZUhvdmVyU3R5bGUoZGVhY3RpdmF0ZWQsIGhvdmVyT3B0aW9ucy5tb2RlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRlZC5sZW5ndGggJiYgaG92ZXJPcHRpb25zLm1vZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlSG92ZXJTdHlsZShhY3RpdmF0ZWQsIGhvdmVyT3B0aW9ucy5tb2RlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9ldmVudEhhbmRsZXIoZSwgcmVwbGF5KSB7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgcmVwbGF5LFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGluQ2hhcnRBcmVhOiB0aGlzLmlzUG9pbnRJbkFyZWEoZSlcbiAgICB9O1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gKHBsdWdpbikgPT4gKHBsdWdpbi5vcHRpb25zLmV2ZW50cyB8fCB0aGlzLm9wdGlvbnMuZXZlbnRzKS5pbmNsdWRlcyhlLm5hdGl2ZS50eXBlKTtcblxuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9oYW5kbGVFdmVudChlLCByZXBsYXksIGFyZ3MuaW5DaGFydEFyZWEpO1xuXG4gICAgYXJncy5jYW5jZWxhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpO1xuXG4gICAgaWYgKGNoYW5nZWQgfHwgYXJncy5jaGFuZ2VkKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgdGhlIGV2ZW50IHRvIGhhbmRsZVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXBsYXldIC0gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHJlcGxheWVkIGJ5IGB1cGRhdGVgXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luQ2hhcnRBcmVhXSAtIHRydWUgaWYgdGhlIGV2ZW50IGlzIGluc2lkZSBjaGFydEFyZWFcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgY2hhcnQgbmVlZHMgdG8gcmUtcmVuZGVyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaGFuZGxlRXZlbnQoZSwgcmVwbGF5LCBpbkNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IHtfYWN0aXZlOiBsYXN0QWN0aXZlID0gW10sIG9wdGlvbnN9ID0gdGhpcztcblxuICAgIC8vIElmIHRoZSBldmVudCBpcyByZXBsYXllZCBmcm9tIGB1cGRhdGVgLCB3ZSBzaG91bGQgZXZhbHVhdGUgd2l0aCB0aGUgZmluYWwgcG9zaXRpb25zLlxuICAgIC8vXG4gICAgLy8gVGhlIGByZXBsYXlgOlxuICAgIC8vIEl0J3MgdGhlIGxhc3QgZXZlbnQgKGV4Y2x1ZGluZyBjbGljaykgdGhhdCBoYXMgb2NjdXJyZWQgYmVmb3JlIGB1cGRhdGVgLlxuICAgIC8vIFNvIG1vdXNlIGhhcyBub3QgbW92ZWQuIEl0J3MgYWxzbyBvdmVyIHRoZSBjaGFydCwgYmVjYXVzZSB0aGVyZSBpcyBhIGByZXBsYXlgLlxuICAgIC8vXG4gICAgLy8gVGhlIHdoeTpcbiAgICAvLyBJZiBhbmltYXRpb25zIGFyZSBhY3RpdmUsIHRoZSBlbGVtZW50cyBoYXZlbid0IG1vdmVkIHlldCBjb21wYXJlZCB0byBzdGF0ZSBiZWZvcmUgdXBkYXRlLlxuICAgIC8vIEJ1dCBpZiB0aGV5IHdpbGwsIHdlIGFyZSBhY3RpdmF0aW5nIHRoZSBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGFjdGl2ZSwgaWYgdGhpcyBjaGVja1xuICAgIC8vIHdhcyBkb25lIGFmdGVyIHRoZSBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkLiA9PiBcImZpbmFsIHBvc2l0aW9uc1wiLlxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFuaW1hdGlvbnMsIHRoZSBcImZpbmFsXCIgYW5kIFwiY3VycmVudFwiIHBvc2l0aW9ucyBhcmUgZXF1YWwuXG4gICAgLy8gVGhpcyBpcyBkb25lIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGV2YWx1YXRlIHRoZSBhY3RpdmUgZWxlbWVudHMgZWFjaCBhbmltYXRpb24gZnJhbWVcbiAgICAvLyAtIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZS5cbiAgICBjb25zdCB1c2VGaW5hbFBvc2l0aW9uID0gcmVwbGF5O1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIGluQ2hhcnRBcmVhLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBjb25zdCBpc0NsaWNrID0gX2lzQ2xpY2tFdmVudChlKTtcbiAgICBjb25zdCBsYXN0RXZlbnQgPSBkZXRlcm1pbmVMYXN0RXZlbnQoZSwgdGhpcy5fbGFzdEV2ZW50LCBpbkNoYXJ0QXJlYSwgaXNDbGljayk7XG5cbiAgICBpZiAoaW5DaGFydEFyZWEpIHtcbiAgICAgIC8vIFNldCBfbGFzdEV2ZW50IHRvIG51bGwgd2hpbGUgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIGV2ZW50IGhhbmRsZXJzLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZWN1cnNpb24gaWYgdGhlIGhhbmRsZXIgY2FsbHMgY2hhcnQudXBkYXRlKClcbiAgICAgIHRoaXMuX2xhc3RFdmVudCA9IG51bGw7XG5cbiAgICAgIC8vIEludm9rZSBvbkhvdmVyIGhvb2tcbiAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zLm9uSG92ZXIsIFtlLCBhY3RpdmUsIHRoaXNdLCB0aGlzKTtcblxuICAgICAgaWYgKGlzQ2xpY2spIHtcbiAgICAgICAgY2FsbENhbGxiYWNrKG9wdGlvbnMub25DbGljaywgW2UsIGFjdGl2ZSwgdGhpc10sIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZWQgPSAhX2VsZW1lbnRzRXF1YWwoYWN0aXZlLCBsYXN0QWN0aXZlKTtcbiAgICBpZiAoY2hhbmdlZCB8fCByZXBsYXkpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGFjdGl2ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyU3R5bGVzKGFjdGl2ZSwgbGFzdEFjdGl2ZSwgcmVwbGF5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0RXZlbnQgPSBsYXN0RXZlbnQ7XG5cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBUaGUgZXZlbnRcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL3R5cGVzL2luZGV4LmpzJykuQWN0aXZlRWxlbWVudFtdfSBsYXN0QWN0aXZlIC0gUHJldmlvdXNseSBhY3RpdmUgZWxlbWVudHNcbiAgICogQHBhcmFtIHtib29sZWFufSBpbkNoYXJ0QXJlYSAtIElzIHRoZSBlbnZlbnQgaW5zaWRlIGNoYXJ0QXJlYVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZUZpbmFsUG9zaXRpb24gLSBTaG91bGQgdGhlIGV2YWx1YXRpb24gYmUgZG9uZSB3aXRoIGN1cnJlbnQgb3IgZmluYWwgKGFmdGVyIGFuaW1hdGlvbikgZWxlbWVudCBwb3NpdGlvbnNcbiAgICogQHJldHVybnMge2ltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5BY3RpdmVFbGVtZW50W119IC0gVGhlIGFjdGl2ZSBlbGVtZW50c1xuICAgKiBAcHJhdmF0ZVxuICAgKi9cbiAgX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIGluQ2hhcnRBcmVhLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghaW5DaGFydEFyZWEpIHtcbiAgICAgIC8vIExldCB1c2VyIGNvbnRyb2wgdGhlIGFjdGl2ZSBlbGVtZW50cyBvdXRzaWRlIGNoYXJ0QXJlYS4gRWcuIHVzaW5nIExlZ2VuZC5cbiAgICAgIHJldHVybiBsYXN0QWN0aXZlO1xuICAgIH1cblxuICAgIGNvbnN0IGhvdmVyT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5ob3ZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsIGhvdmVyT3B0aW9ucy5tb2RlLCBob3Zlck9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbmZ1bmN0aW9uIGludmFsaWRhdGVQbHVnaW5zKCkge1xuICByZXR1cm4gZWFjaChDaGFydC5pbnN0YW5jZXMsIChjaGFydCkgPT4gY2hhcnQuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hhcnQ7XG4iLCAiaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHtfYW5nbGVCZXR3ZWVuLCBnZXRBbmdsZUZyb21Qb2ludCwgVEFVLCBIQUxGX1BJLCB2YWx1ZU9yRGVmYXVsdH0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG5pbXBvcnQge1BJLCBfaXNCZXR3ZWVuLCBfbGltaXRWYWx1ZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuaW1wb3J0IHtfcmVhZFZhbHVlVG9Qcm9wc30gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm9wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUge0FyY09wdGlvbnMsIFBvaW50fSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cblxuZnVuY3Rpb24gY2xpcEFyYyhjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgZWxlbWVudDogQXJjRWxlbWVudCwgZW5kQW5nbGU6IG51bWJlcikge1xuICBjb25zdCB7c3RhcnRBbmdsZSwgcGl4ZWxNYXJnaW4sIHgsIHksIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1c30gPSBlbGVtZW50O1xuICBsZXQgYW5nbGVNYXJnaW4gPSBwaXhlbE1hcmdpbiAvIG91dGVyUmFkaXVzO1xuXG4gIC8vIERyYXcgYW4gaW5uZXIgYm9yZGVyIGJ5IGNsaXBwaW5nIHRoZSBhcmMgYW5kIGRyYXdpbmcgYSBkb3VibGUtd2lkdGggYm9yZGVyXG4gIC8vIEVubGFyZ2UgdGhlIGNsaXBwaW5nIGFyYyBieSAwLjMzIHBpeGVscyB0byBlbGltaW5hdGUgZ2xpdGNoZXMgYmV0d2VlbiBib3JkZXJzXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4LmFyYyh4LCB5LCBvdXRlclJhZGl1cywgc3RhcnRBbmdsZSAtIGFuZ2xlTWFyZ2luLCBlbmRBbmdsZSArIGFuZ2xlTWFyZ2luKTtcbiAgaWYgKGlubmVyUmFkaXVzID4gcGl4ZWxNYXJnaW4pIHtcbiAgICBhbmdsZU1hcmdpbiA9IHBpeGVsTWFyZ2luIC8gaW5uZXJSYWRpdXM7XG4gICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgZW5kQW5nbGUgKyBhbmdsZU1hcmdpbiwgc3RhcnRBbmdsZSAtIGFuZ2xlTWFyZ2luLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBjdHguYXJjKHgsIHksIHBpeGVsTWFyZ2luLCBlbmRBbmdsZSArIEhBTEZfUEksIHN0YXJ0QW5nbGUgLSBIQUxGX1BJKTtcbiAgfVxuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5jbGlwKCk7XG59XG5cbmZ1bmN0aW9uIHRvUmFkaXVzQ29ybmVycyh2YWx1ZSkge1xuICByZXR1cm4gX3JlYWRWYWx1ZVRvUHJvcHModmFsdWUsIFsnb3V0ZXJTdGFydCcsICdvdXRlckVuZCcsICdpbm5lclN0YXJ0JywgJ2lubmVyRW5kJ10pO1xufVxuXG4vKipcbiAqIFBhcnNlIGJvcmRlciByYWRpdXMgZnJvbSB0aGUgcHJvdmlkZWQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBwYXJzZUJvcmRlclJhZGl1cyhhcmM6IEFyY0VsZW1lbnQsIGlubmVyUmFkaXVzOiBudW1iZXIsIG91dGVyUmFkaXVzOiBudW1iZXIsIGFuZ2xlRGVsdGE6IG51bWJlcikge1xuICBjb25zdCBvID0gdG9SYWRpdXNDb3JuZXJzKGFyYy5vcHRpb25zLmJvcmRlclJhZGl1cyk7XG4gIGNvbnN0IGhhbGZUaGlja25lc3MgPSAob3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cykgLyAyO1xuICBjb25zdCBpbm5lckxpbWl0ID0gTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgYW5nbGVEZWx0YSAqIGlubmVyUmFkaXVzIC8gMik7XG5cbiAgLy8gT3V0ZXIgbGltaXRzIGFyZSBjb21wbGljYXRlZC4gV2Ugd2FudCB0byBjb21wdXRlIHRoZSBhdmFpbGFibGUgYW5ndWxhciBkaXN0YW5jZSBhdFxuICAvLyBhIHJhZGl1cyBvZiBvdXRlclJhZGl1cyAtIGJvcmRlclJhZGl1cyBiZWNhdXNlIGZvciBzbWFsbCBhbmd1bGFyIGRpc3RhbmNlcywgdGhpcyB0ZXJtIGxpbWl0cy5cbiAgLy8gV2UgY29tcHV0ZSBhdCByID0gb3V0ZXJSYWRpdXMgLSBib3JkZXJSYWRpdXMgYmVjYXVzZSB0aGlzIGNpcmNsZSBkZWZpbmVzIHRoZSBjZW50ZXIgb2YgdGhlIGJvcmRlciBjb3JuZXJzLlxuICAvL1xuICAvLyBJZiB0aGUgYm9yZGVyUmFkaXVzIGlzIGxhcmdlLCB0aGF0IHZhbHVlIGNhbiBiZWNvbWUgbmVnYXRpdmUuXG4gIC8vIFRoaXMgY2F1c2VzIHRoZSBvdXRlciBib3JkZXJzIHRvIGxvc2UgdGhlaXIgcmFkaXVzIGVudGlyZWx5LCB3aGljaCBpcyByYXRoZXIgdW5leHBlY3RlZC4gVG8gc29sdmUgdGhhdCwgaWYgYm9yZGVyUmFkaXVzID4gb3V0ZXJSYWRpdXNcbiAgLy8gd2Uga25vdyB0aGF0IHRoZSB0aGlja25lc3MgdGVybSB3aWxsIGRvbWluYXRlIGFuZCBjb21wdXRlIHRoZSBsaW1pdHMgYXQgdGhhdCBwb2ludFxuICBjb25zdCBjb21wdXRlT3V0ZXJMaW1pdCA9ICh2YWwpID0+IHtcbiAgICBjb25zdCBvdXRlckFyY0xpbWl0ID0gKG91dGVyUmFkaXVzIC0gTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgdmFsKSkgKiBhbmdsZURlbHRhIC8gMjtcbiAgICByZXR1cm4gX2xpbWl0VmFsdWUodmFsLCAwLCBNYXRoLm1pbihoYWxmVGhpY2tuZXNzLCBvdXRlckFyY0xpbWl0KSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBvdXRlclN0YXJ0OiBjb21wdXRlT3V0ZXJMaW1pdChvLm91dGVyU3RhcnQpLFxuICAgIG91dGVyRW5kOiBjb21wdXRlT3V0ZXJMaW1pdChvLm91dGVyRW5kKSxcbiAgICBpbm5lclN0YXJ0OiBfbGltaXRWYWx1ZShvLmlubmVyU3RhcnQsIDAsIGlubmVyTGltaXQpLFxuICAgIGlubmVyRW5kOiBfbGltaXRWYWx1ZShvLmlubmVyRW5kLCAwLCBpbm5lckxpbWl0KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IChyLCDwnZyDKSB0byAoeCwgeSlcbiAqL1xuZnVuY3Rpb24gclRoZXRhVG9YWShyOiBudW1iZXIsIHRoZXRhOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gIHJldHVybiB7XG4gICAgeDogeCArIHIgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgeTogeSArIHIgKiBNYXRoLnNpbih0aGV0YSksXG4gIH07XG59XG5cblxuLyoqXG4gKiBQYXRoIHRoZSBhcmMsIHJlc3BlY3RpbmcgYm9yZGVyIHJhZGl1cyBieSBzZXBhcmF0aW5nIGludG8gbGVmdCBhbmQgcmlnaHQgaGFsdmVzLlxuICpcbiAqICAgU3RhcnQgICAgICBFbmRcbiAqXG4gKiAgICAxLS0tPmEtLS0+MiAgICBPdXRlclxuICogICAvICAgICAgICAgICBcXFxuICogICA4ICAgICAgICAgICAzXG4gKiAgIHwgICAgICAgICAgIHxcbiAqICAgfCAgICAgICAgICAgfFxuICogICA3ICAgICAgICAgICA0XG4gKiAgIFxcICAgICAgICAgICAvXG4gKiAgICA2PC0tLWI8LS0tNSAgICBJbm5lclxuICovXG5mdW5jdGlvbiBwYXRoQXJjKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgZWxlbWVudDogQXJjRWxlbWVudCxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHNwYWNpbmc6IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4gIGNpcmN1bGFyOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHt4LCB5LCBzdGFydEFuZ2xlOiBzdGFydCwgcGl4ZWxNYXJnaW4sIGlubmVyUmFkaXVzOiBpbm5lclJ9ID0gZWxlbWVudDtcblxuICBjb25zdCBvdXRlclJhZGl1cyA9IE1hdGgubWF4KGVsZW1lbnQub3V0ZXJSYWRpdXMgKyBzcGFjaW5nICsgb2Zmc2V0IC0gcGl4ZWxNYXJnaW4sIDApO1xuICBjb25zdCBpbm5lclJhZGl1cyA9IGlubmVyUiA+IDAgPyBpbm5lclIgKyBzcGFjaW5nICsgb2Zmc2V0ICsgcGl4ZWxNYXJnaW4gOiAwO1xuXG4gIGxldCBzcGFjaW5nT2Zmc2V0ID0gMDtcbiAgY29uc3QgYWxwaGEgPSBlbmQgLSBzdGFydDtcblxuICBpZiAoc3BhY2luZykge1xuICAgIC8vIFdoZW4gc3BhY2luZyBpcyBwcmVzZW50LCBpdCBpcyB0aGUgc2FtZSBmb3IgYWxsIGl0ZW1zXG4gICAgLy8gU28gd2UgYWRqdXN0IHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIG9mIHRoZSBhcmMgc3VjaCB0aGF0XG4gICAgLy8gdGhlIGRpc3RhbmNlIGlzIHRoZSBzYW1lIGFzIGl0IHdvdWxkIGJlIHdpdGhvdXQgdGhlIHNwYWNpbmdcbiAgICBjb25zdCBub1NwYWNpbmdJbm5lclJhZGl1cyA9IGlubmVyUiA+IDAgPyBpbm5lclIgLSBzcGFjaW5nIDogMDtcbiAgICBjb25zdCBub1NwYWNpbmdPdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzID4gMCA/IG91dGVyUmFkaXVzIC0gc3BhY2luZyA6IDA7XG4gICAgY29uc3QgYXZOb2dTcGFjaW5nUmFkaXVzID0gKG5vU3BhY2luZ0lubmVyUmFkaXVzICsgbm9TcGFjaW5nT3V0ZXJSYWRpdXMpIC8gMjtcbiAgICBjb25zdCBhZGp1c3RlZEFuZ2xlID0gYXZOb2dTcGFjaW5nUmFkaXVzICE9PSAwID8gKGFscGhhICogYXZOb2dTcGFjaW5nUmFkaXVzKSAvIChhdk5vZ1NwYWNpbmdSYWRpdXMgKyBzcGFjaW5nKSA6IGFscGhhO1xuICAgIHNwYWNpbmdPZmZzZXQgPSAoYWxwaGEgLSBhZGp1c3RlZEFuZ2xlKSAvIDI7XG4gIH1cblxuICBjb25zdCBiZXRhID0gTWF0aC5tYXgoMC4wMDEsIGFscGhhICogb3V0ZXJSYWRpdXMgLSBvZmZzZXQgLyBQSSkgLyBvdXRlclJhZGl1cztcbiAgY29uc3QgYW5nbGVPZmZzZXQgPSAoYWxwaGEgLSBiZXRhKSAvIDI7XG4gIGNvbnN0IHN0YXJ0QW5nbGUgPSBzdGFydCArIGFuZ2xlT2Zmc2V0ICsgc3BhY2luZ09mZnNldDtcbiAgY29uc3QgZW5kQW5nbGUgPSBlbmQgLSBhbmdsZU9mZnNldCAtIHNwYWNpbmdPZmZzZXQ7XG4gIGNvbnN0IHtvdXRlclN0YXJ0LCBvdXRlckVuZCwgaW5uZXJTdGFydCwgaW5uZXJFbmR9ID0gcGFyc2VCb3JkZXJSYWRpdXMoZWxlbWVudCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpO1xuXG4gIGNvbnN0IG91dGVyU3RhcnRBZGp1c3RlZFJhZGl1cyA9IG91dGVyUmFkaXVzIC0gb3V0ZXJTdGFydDtcbiAgY29uc3Qgb3V0ZXJFbmRBZGp1c3RlZFJhZGl1cyA9IG91dGVyUmFkaXVzIC0gb3V0ZXJFbmQ7XG4gIGNvbnN0IG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlID0gc3RhcnRBbmdsZSArIG91dGVyU3RhcnQgLyBvdXRlclN0YXJ0QWRqdXN0ZWRSYWRpdXM7XG4gIGNvbnN0IG91dGVyRW5kQWRqdXN0ZWRBbmdsZSA9IGVuZEFuZ2xlIC0gb3V0ZXJFbmQgLyBvdXRlckVuZEFkanVzdGVkUmFkaXVzO1xuXG4gIGNvbnN0IGlubmVyU3RhcnRBZGp1c3RlZFJhZGl1cyA9IGlubmVyUmFkaXVzICsgaW5uZXJTdGFydDtcbiAgY29uc3QgaW5uZXJFbmRBZGp1c3RlZFJhZGl1cyA9IGlubmVyUmFkaXVzICsgaW5uZXJFbmQ7XG4gIGNvbnN0IGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlID0gc3RhcnRBbmdsZSArIGlubmVyU3RhcnQgLyBpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXM7XG4gIGNvbnN0IGlubmVyRW5kQWRqdXN0ZWRBbmdsZSA9IGVuZEFuZ2xlIC0gaW5uZXJFbmQgLyBpbm5lckVuZEFkanVzdGVkUmFkaXVzO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcblxuICBpZiAoY2lyY3VsYXIpIHtcbiAgICAvLyBUaGUgZmlyc3QgYXJjIHNlZ21lbnRzIGZyb20gcG9pbnQgMSB0byBwb2ludCBhIHRvIHBvaW50IDJcbiAgICBjb25zdCBvdXRlck1pZEFkanVzdGVkQW5nbGUgPSAob3V0ZXJTdGFydEFkanVzdGVkQW5nbGUgKyBvdXRlckVuZEFkanVzdGVkQW5nbGUpIC8gMjtcbiAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzLCBvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSwgb3V0ZXJNaWRBZGp1c3RlZEFuZ2xlKTtcbiAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzLCBvdXRlck1pZEFkanVzdGVkQW5nbGUsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSk7XG5cbiAgICAvLyBUaGUgY29ybmVyIHNlZ21lbnQgZnJvbSBwb2ludCAyIHRvIHBvaW50IDNcbiAgICBpZiAob3V0ZXJFbmQgPiAwKSB7XG4gICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShvdXRlckVuZEFkanVzdGVkUmFkaXVzLCBvdXRlckVuZEFkanVzdGVkQW5nbGUsIHgsIHkpO1xuICAgICAgY3R4LmFyYyhwQ2VudGVyLngsIHBDZW50ZXIueSwgb3V0ZXJFbmQsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSwgZW5kQW5nbGUgKyBIQUxGX1BJKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGluZSBmcm9tIHBvaW50IDMgdG8gcG9pbnQgNFxuICAgIGNvbnN0IHA0ID0gclRoZXRhVG9YWShpbm5lckVuZEFkanVzdGVkUmFkaXVzLCBlbmRBbmdsZSwgeCwgeSk7XG4gICAgY3R4LmxpbmVUbyhwNC54LCBwNC55KTtcblxuICAgIC8vIFRoZSBjb3JuZXIgc2VnbWVudCBmcm9tIHBvaW50IDQgdG8gcG9pbnQgNVxuICAgIGlmIChpbm5lckVuZCA+IDApIHtcbiAgICAgIGNvbnN0IHBDZW50ZXIgPSByVGhldGFUb1hZKGlubmVyRW5kQWRqdXN0ZWRSYWRpdXMsIGlubmVyRW5kQWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBpbm5lckVuZCwgZW5kQW5nbGUgKyBIQUxGX1BJLCBpbm5lckVuZEFkanVzdGVkQW5nbGUgKyBNYXRoLlBJKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgaW5uZXIgYXJjIGZyb20gcG9pbnQgNSB0byBwb2ludCBiIHRvIHBvaW50IDZcbiAgICBjb25zdCBpbm5lck1pZEFkanVzdGVkQW5nbGUgPSAoKGVuZEFuZ2xlIC0gKGlubmVyRW5kIC8gaW5uZXJSYWRpdXMpKSArIChzdGFydEFuZ2xlICsgKGlubmVyU3RhcnQgLyBpbm5lclJhZGl1cykpKSAvIDI7XG4gICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgZW5kQW5nbGUgLSAoaW5uZXJFbmQgLyBpbm5lclJhZGl1cyksIGlubmVyTWlkQWRqdXN0ZWRBbmdsZSwgdHJ1ZSk7XG4gICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgaW5uZXJNaWRBZGp1c3RlZEFuZ2xlLCBzdGFydEFuZ2xlICsgKGlubmVyU3RhcnQgLyBpbm5lclJhZGl1cyksIHRydWUpO1xuXG4gICAgLy8gVGhlIGNvcm5lciBzZWdtZW50IGZyb20gcG9pbnQgNiB0byBwb2ludCA3XG4gICAgaWYgKGlubmVyU3RhcnQgPiAwKSB7XG4gICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXMsIGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlLCB4LCB5KTtcbiAgICAgIGN0eC5hcmMocENlbnRlci54LCBwQ2VudGVyLnksIGlubmVyU3RhcnQsIGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlICsgTWF0aC5QSSwgc3RhcnRBbmdsZSAtIEhBTEZfUEkpO1xuICAgIH1cblxuICAgIC8vIFRoZSBsaW5lIGZyb20gcG9pbnQgNyB0byBwb2ludCA4XG4gICAgY29uc3QgcDggPSByVGhldGFUb1hZKG91dGVyU3RhcnRBZGp1c3RlZFJhZGl1cywgc3RhcnRBbmdsZSwgeCwgeSk7XG4gICAgY3R4LmxpbmVUbyhwOC54LCBwOC55KTtcblxuICAgIC8vIFRoZSBjb3JuZXIgc2VnbWVudCBmcm9tIHBvaW50IDggdG8gcG9pbnQgMVxuICAgIGlmIChvdXRlclN0YXJ0ID4gMCkge1xuICAgICAgY29uc3QgcENlbnRlciA9IHJUaGV0YVRvWFkob3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzLCBvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBvdXRlclN0YXJ0LCBzdGFydEFuZ2xlIC0gSEFMRl9QSSwgb3V0ZXJTdGFydEFkanVzdGVkQW5nbGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjdHgubW92ZVRvKHgsIHkpO1xuXG4gICAgY29uc3Qgb3V0ZXJTdGFydFggPSBNYXRoLmNvcyhvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHg7XG4gICAgY29uc3Qgb3V0ZXJTdGFydFkgPSBNYXRoLnNpbihvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHk7XG4gICAgY3R4LmxpbmVUbyhvdXRlclN0YXJ0WCwgb3V0ZXJTdGFydFkpO1xuXG4gICAgY29uc3Qgb3V0ZXJFbmRYID0gTWF0aC5jb3Mob3V0ZXJFbmRBZGp1c3RlZEFuZ2xlKSAqIG91dGVyUmFkaXVzICsgeDtcbiAgICBjb25zdCBvdXRlckVuZFkgPSBNYXRoLnNpbihvdXRlckVuZEFkanVzdGVkQW5nbGUpICogb3V0ZXJSYWRpdXMgKyB5O1xuICAgIGN0eC5saW5lVG8ob3V0ZXJFbmRYLCBvdXRlckVuZFkpO1xuICB9XG5cbiAgY3R4LmNsb3NlUGF0aCgpO1xufVxuXG5mdW5jdGlvbiBkcmF3QXJjKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgZWxlbWVudDogQXJjRWxlbWVudCxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHNwYWNpbmc6IG51bWJlcixcbiAgY2lyY3VsYXI6IGJvb2xlYW4sXG4pIHtcbiAgY29uc3Qge2Z1bGxDaXJjbGVzLCBzdGFydEFuZ2xlLCBjaXJjdW1mZXJlbmNlfSA9IGVsZW1lbnQ7XG4gIGxldCBlbmRBbmdsZSA9IGVsZW1lbnQuZW5kQW5nbGU7XG4gIGlmIChmdWxsQ2lyY2xlcykge1xuICAgIHBhdGhBcmMoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGVuZEFuZ2xlLCBjaXJjdWxhcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsQ2lyY2xlczsgKytpKSB7XG4gICAgICBjdHguZmlsbCgpO1xuICAgIH1cbiAgICBpZiAoIWlzTmFOKGNpcmN1bWZlcmVuY2UpKSB7XG4gICAgICBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyAoY2lyY3VtZmVyZW5jZSAlIFRBVSB8fCBUQVUpO1xuICAgIH1cbiAgfVxuICBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmRBbmdsZSwgY2lyY3VsYXIpO1xuICBjdHguZmlsbCgpO1xuICByZXR1cm4gZW5kQW5nbGU7XG59XG5cbmZ1bmN0aW9uIGRyYXdCb3JkZXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBlbGVtZW50OiBBcmNFbGVtZW50LFxuICBvZmZzZXQ6IG51bWJlcixcbiAgc3BhY2luZzogbnVtYmVyLFxuICBjaXJjdWxhcjogYm9vbGVhbixcbikge1xuICBjb25zdCB7ZnVsbENpcmNsZXMsIHN0YXJ0QW5nbGUsIGNpcmN1bWZlcmVuY2UsIG9wdGlvbnN9ID0gZWxlbWVudDtcbiAgY29uc3Qge2JvcmRlcldpZHRoLCBib3JkZXJKb2luU3R5bGV9ID0gb3B0aW9ucztcbiAgY29uc3QgaW5uZXIgPSBvcHRpb25zLmJvcmRlckFsaWduID09PSAnaW5uZXInO1xuXG4gIGlmICghYm9yZGVyV2lkdGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5uZXIpIHtcbiAgICBjdHgubGluZVdpZHRoID0gYm9yZGVyV2lkdGggKiAyO1xuICAgIGN0eC5saW5lSm9pbiA9IGJvcmRlckpvaW5TdHlsZSB8fCAncm91bmQnO1xuICB9IGVsc2Uge1xuICAgIGN0eC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICBjdHgubGluZUpvaW4gPSBib3JkZXJKb2luU3R5bGUgfHwgJ2JldmVsJztcbiAgfVxuXG4gIGxldCBlbmRBbmdsZSA9IGVsZW1lbnQuZW5kQW5nbGU7XG4gIGlmIChmdWxsQ2lyY2xlcykge1xuICAgIHBhdGhBcmMoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGVuZEFuZ2xlLCBjaXJjdWxhcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsQ2lyY2xlczsgKytpKSB7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxuICAgIGlmICghaXNOYU4oY2lyY3VtZmVyZW5jZSkpIHtcbiAgICAgIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIChjaXJjdW1mZXJlbmNlICUgVEFVIHx8IFRBVSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlubmVyKSB7XG4gICAgY2xpcEFyYyhjdHgsIGVsZW1lbnQsIGVuZEFuZ2xlKTtcbiAgfVxuXG4gIGlmICghZnVsbENpcmNsZXMpIHtcbiAgICBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmRBbmdsZSwgY2lyY3VsYXIpO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyY1Byb3BzIGV4dGVuZHMgUG9pbnQge1xuICBzdGFydEFuZ2xlOiBudW1iZXI7XG4gIGVuZEFuZ2xlOiBudW1iZXI7XG4gIGlubmVyUmFkaXVzOiBudW1iZXI7XG4gIG91dGVyUmFkaXVzOiBudW1iZXI7XG4gIGNpcmN1bWZlcmVuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJjRWxlbWVudCBleHRlbmRzIEVsZW1lbnQ8QXJjUHJvcHMsIEFyY09wdGlvbnM+IHtcblxuICBzdGF0aWMgaWQgPSAnYXJjJztcblxuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgYm9yZGVyQWxpZ246ICdjZW50ZXInLFxuICAgIGJvcmRlckNvbG9yOiAnI2ZmZicsXG4gICAgYm9yZGVySm9pblN0eWxlOiB1bmRlZmluZWQsXG4gICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIG9mZnNldDogMCxcbiAgICBzcGFjaW5nOiAwLFxuICAgIGFuZ2xlOiB1bmRlZmluZWQsXG4gICAgY2lyY3VsYXI6IHRydWUsXG4gIH07XG5cbiAgc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJ1xuICB9O1xuXG4gIGNpcmN1bWZlcmVuY2U6IG51bWJlcjtcbiAgZW5kQW5nbGU6IG51bWJlcjtcbiAgZnVsbENpcmNsZXM6IG51bWJlcjtcbiAgaW5uZXJSYWRpdXM6IG51bWJlcjtcbiAgb3V0ZXJSYWRpdXM6IG51bWJlcjtcbiAgcGl4ZWxNYXJnaW46IG51bWJlcjtcbiAgc3RhcnRBbmdsZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaXJjdW1mZXJlbmNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhcnRBbmdsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZEFuZ2xlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5uZXJSYWRpdXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vdXRlclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBpeGVsTWFyZ2luID0gMDtcbiAgICB0aGlzLmZ1bGxDaXJjbGVzID0gMDtcblxuICAgIGlmIChjZmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICB9XG4gIH1cblxuICBpblJhbmdlKGNoYXJ0WDogbnVtYmVyLCBjaGFydFk6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbjogYm9vbGVhbikge1xuICAgIGNvbnN0IHBvaW50ID0gdGhpcy5nZXRQcm9wcyhbJ3gnLCAneSddLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBjb25zdCB7YW5nbGUsIGRpc3RhbmNlfSA9IGdldEFuZ2xlRnJvbVBvaW50KHBvaW50LCB7eDogY2hhcnRYLCB5OiBjaGFydFl9KTtcbiAgICBjb25zdCB7c3RhcnRBbmdsZSwgZW5kQW5nbGUsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgY2lyY3VtZmVyZW5jZX0gPSB0aGlzLmdldFByb3BzKFtcbiAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICdlbmRBbmdsZScsXG4gICAgICAnaW5uZXJSYWRpdXMnLFxuICAgICAgJ291dGVyUmFkaXVzJyxcbiAgICAgICdjaXJjdW1mZXJlbmNlJ1xuICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIGNvbnN0IHJBZGp1c3QgPSB0aGlzLm9wdGlvbnMuc3BhY2luZyAvIDI7XG4gICAgY29uc3QgX2NpcmN1bWZlcmVuY2UgPSB2YWx1ZU9yRGVmYXVsdChjaXJjdW1mZXJlbmNlLCBlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpO1xuICAgIGNvbnN0IGJldHdlZW5BbmdsZXMgPSBfY2lyY3VtZmVyZW5jZSA+PSBUQVUgfHwgX2FuZ2xlQmV0d2VlbihhbmdsZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUpO1xuICAgIGNvbnN0IHdpdGhpblJhZGl1cyA9IF9pc0JldHdlZW4oZGlzdGFuY2UsIGlubmVyUmFkaXVzICsgckFkanVzdCwgb3V0ZXJSYWRpdXMgKyByQWRqdXN0KTtcblxuICAgIHJldHVybiAoYmV0d2VlbkFuZ2xlcyAmJiB3aXRoaW5SYWRpdXMpO1xuICB9XG5cbiAgZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbjogYm9vbGVhbikge1xuICAgIGNvbnN0IHt4LCB5LCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzfSA9IHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgJ3gnLFxuICAgICAgJ3knLFxuICAgICAgJ3N0YXJ0QW5nbGUnLFxuICAgICAgJ2VuZEFuZ2xlJyxcbiAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAnb3V0ZXJSYWRpdXMnXG4gICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgY29uc3Qge29mZnNldCwgc3BhY2luZ30gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgaGFsZkFuZ2xlID0gKHN0YXJ0QW5nbGUgKyBlbmRBbmdsZSkgLyAyO1xuICAgIGNvbnN0IGhhbGZSYWRpdXMgPSAoaW5uZXJSYWRpdXMgKyBvdXRlclJhZGl1cyArIHNwYWNpbmcgKyBvZmZzZXQpIC8gMjtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCArIE1hdGguY29zKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzLFxuICAgICAgeTogeSArIE1hdGguc2luKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzXG4gICAgfTtcbiAgfVxuXG4gIHRvb2x0aXBQb3NpdGlvbih1c2VGaW5hbFBvc2l0aW9uOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBkcmF3KGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XG4gICAgY29uc3Qge29wdGlvbnMsIGNpcmN1bWZlcmVuY2V9ID0gdGhpcztcbiAgICBjb25zdCBvZmZzZXQgPSAob3B0aW9ucy5vZmZzZXQgfHwgMCkgLyA0O1xuICAgIGNvbnN0IHNwYWNpbmcgPSAob3B0aW9ucy5zcGFjaW5nIHx8IDApIC8gMjtcbiAgICBjb25zdCBjaXJjdWxhciA9IG9wdGlvbnMuY2lyY3VsYXI7XG4gICAgdGhpcy5waXhlbE1hcmdpbiA9IChvcHRpb25zLmJvcmRlckFsaWduID09PSAnaW5uZXInKSA/IDAuMzMgOiAwO1xuICAgIHRoaXMuZnVsbENpcmNsZXMgPSBjaXJjdW1mZXJlbmNlID4gVEFVID8gTWF0aC5mbG9vcihjaXJjdW1mZXJlbmNlIC8gVEFVKSA6IDA7XG5cbiAgICBpZiAoY2lyY3VtZmVyZW5jZSA9PT0gMCB8fCB0aGlzLmlubmVyUmFkaXVzIDwgMCB8fCB0aGlzLm91dGVyUmFkaXVzIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN0eC5zYXZlKCk7XG5cbiAgICBjb25zdCBoYWxmQW5nbGUgPSAodGhpcy5zdGFydEFuZ2xlICsgdGhpcy5lbmRBbmdsZSkgLyAyO1xuICAgIGN0eC50cmFuc2xhdGUoTWF0aC5jb3MoaGFsZkFuZ2xlKSAqIG9mZnNldCwgTWF0aC5zaW4oaGFsZkFuZ2xlKSAqIG9mZnNldCk7XG4gICAgY29uc3QgZml4ID0gMSAtIE1hdGguc2luKE1hdGgubWluKFBJLCBjaXJjdW1mZXJlbmNlIHx8IDApKTtcbiAgICBjb25zdCByYWRpdXNPZmZzZXQgPSBvZmZzZXQgKiBmaXg7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcblxuICAgIGRyYXdBcmMoY3R4LCB0aGlzLCByYWRpdXNPZmZzZXQsIHNwYWNpbmcsIGNpcmN1bGFyKTtcbiAgICBkcmF3Qm9yZGVyKGN0eCwgdGhpcywgcmFkaXVzT2Zmc2V0LCBzcGFjaW5nLCBjaXJjdWxhcik7XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG59XG4iLCAiaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHtfYmV6aWVySW50ZXJwb2xhdGlvbiwgX3BvaW50SW5MaW5lLCBfc3RlcHBlZEludGVycG9sYXRpb259IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5pbnRlcnBvbGF0aW9uLmpzJztcbmltcG9ydCB7X2NvbXB1dGVTZWdtZW50cywgX2JvdW5kU2VnbWVudHN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5zZWdtZW50LmpzJztcbmltcG9ydCB7X3N0ZXBwZWRMaW5lVG8sIF9iZXppZXJDdXJ2ZVRvfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLmpzJztcbmltcG9ydCB7X3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jdXJ2ZS5qcyc7XG5pbXBvcnQge3ZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9lbGVtZW50LnBvaW50LmpzJykuZGVmYXVsdCB9IFBvaW50RWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIHNldFN0eWxlKGN0eCwgb3B0aW9ucywgc3R5bGUgPSBvcHRpb25zKSB7XG4gIGN0eC5saW5lQ2FwID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyQ2FwU3R5bGUsIG9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUpO1xuICBjdHguc2V0TGluZURhc2godmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyRGFzaCwgb3B0aW9ucy5ib3JkZXJEYXNoKSk7XG4gIGN0eC5saW5lRGFzaE9mZnNldCA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckRhc2hPZmZzZXQsIG9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCk7XG4gIGN0eC5saW5lSm9pbiA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckpvaW5TdHlsZSwgb3B0aW9ucy5ib3JkZXJKb2luU3R5bGUpO1xuICBjdHgubGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyV2lkdGgsIG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICBjdHguc3Ryb2tlU3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChzdHlsZS5ib3JkZXJDb2xvciwgb3B0aW9ucy5ib3JkZXJDb2xvcik7XG59XG5cbmZ1bmN0aW9uIGxpbmVUbyhjdHgsIHByZXZpb3VzLCB0YXJnZXQpIHtcbiAgY3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lTWV0aG9kKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc3RlcHBlZCkge1xuICAgIHJldHVybiBfc3RlcHBlZExpbmVUbztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRlbnNpb24gfHwgb3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG4gICAgcmV0dXJuIF9iZXppZXJDdXJ2ZVRvO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVUbztcbn1cblxuZnVuY3Rpb24gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMgPSB7fSkge1xuICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gIGNvbnN0IHtzdGFydDogcGFyYW1zU3RhcnQgPSAwLCBlbmQ6IHBhcmFtc0VuZCA9IGNvdW50IC0gMX0gPSBwYXJhbXM7XG4gIGNvbnN0IHtzdGFydDogc2VnbWVudFN0YXJ0LCBlbmQ6IHNlZ21lbnRFbmR9ID0gc2VnbWVudDtcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heChwYXJhbXNTdGFydCwgc2VnbWVudFN0YXJ0KTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4ocGFyYW1zRW5kLCBzZWdtZW50RW5kKTtcbiAgY29uc3Qgb3V0c2lkZSA9IHBhcmFtc1N0YXJ0IDwgc2VnbWVudFN0YXJ0ICYmIHBhcmFtc0VuZCA8IHNlZ21lbnRTdGFydCB8fCBwYXJhbXNTdGFydCA+IHNlZ21lbnRFbmQgJiYgcGFyYW1zRW5kID4gc2VnbWVudEVuZDtcblxuICByZXR1cm4ge1xuICAgIGNvdW50LFxuICAgIHN0YXJ0LFxuICAgIGxvb3A6IHNlZ21lbnQubG9vcCxcbiAgICBpbGVuOiBlbmQgPCBzdGFydCAmJiAhb3V0c2lkZSA/IGNvdW50ICsgZW5kIC0gc3RhcnQgOiBlbmQgLSBzdGFydFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBwYXRoIGZyb20gcG9pbnRzLCBncm91cGluZyBieSB0cnVuY2F0ZWQgeC1jb29yZGluYXRlXG4gKiBQb2ludHMgbmVlZCB0byBiZSBpbiBvcmRlciBieSB4LWNvb3JkaW5hdGUgZm9yIHRoaXMgdG8gd29yayBlZmZpY2llbnRseVxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8UGF0aDJEfSBjdHggLSBDb250ZXh0XG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gc2VnbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQuc3RhcnQgLSBzdGFydCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LmVuZCAtIGVuZCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VnbWVudC5sb29wIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgaXMgYSBsb29wXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5tb3ZlIC0gbW92ZSB0byBzdGFydGluZyBwb2ludCAodnMgbGluZSB0byBpdClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLnJldmVyc2UgLSBwYXRoIHRoZSBzZWdtZW50IGZyb20gZW5kIHRvIHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnN0YXJ0IC0gbGltaXQgc2VnbWVudCB0byBwb2ludHMgc3RhcnRpbmcgZnJvbSBgc3RhcnRgIGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLmVuZCAtIGxpbWl0IHNlZ21lbnQgdG8gcG9pbnRzIGVuZGluZyBhdCBgc3RhcnRgICsgYGNvdW50YCBpbmRleFxuICovXG5mdW5jdGlvbiBwYXRoU2VnbWVudChjdHgsIGxpbmUsIHNlZ21lbnQsIHBhcmFtcykge1xuICBjb25zdCB7cG9pbnRzLCBvcHRpb25zfSA9IGxpbmU7XG4gIGNvbnN0IHtjb3VudCwgc3RhcnQsIGxvb3AsIGlsZW59ID0gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMpO1xuICBjb25zdCBsaW5lTWV0aG9kID0gZ2V0TGluZU1ldGhvZChvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQge21vdmUgPSB0cnVlLCByZXZlcnNlfSA9IHBhcmFtcyB8fCB7fTtcbiAgbGV0IGksIHBvaW50LCBwcmV2O1xuXG4gIGZvciAoaSA9IDA7IGkgPD0gaWxlbjsgKytpKSB7XG4gICAgcG9pbnQgPSBwb2ludHNbKHN0YXJ0ICsgKHJldmVyc2UgPyBpbGVuIC0gaSA6IGkpKSAlIGNvdW50XTtcblxuICAgIGlmIChwb2ludC5za2lwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIHNraXBwZWQgcG9pbnQgaW5zaWRlIGEgc2VnbWVudCwgc3BhbkdhcHMgbXVzdCBiZSB0cnVlXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKG1vdmUpIHtcbiAgICAgIGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XG4gICAgICBtb3ZlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVNZXRob2QoY3R4LCBwcmV2LCBwb2ludCwgcmV2ZXJzZSwgb3B0aW9ucy5zdGVwcGVkKTtcbiAgICB9XG5cbiAgICBwcmV2ID0gcG9pbnQ7XG4gIH1cblxuICBpZiAobG9vcCkge1xuICAgIHBvaW50ID0gcG9pbnRzWyhzdGFydCArIChyZXZlcnNlID8gaWxlbiA6IDApKSAlIGNvdW50XTtcbiAgICBsaW5lTWV0aG9kKGN0eCwgcHJldiwgcG9pbnQsIHJldmVyc2UsIG9wdGlvbnMuc3RlcHBlZCk7XG4gIH1cblxuICByZXR1cm4gISFsb29wO1xufVxuXG4vKipcbiAqIENyZWF0ZSBwYXRoIGZyb20gcG9pbnRzLCBncm91cGluZyBieSB0cnVuY2F0ZWQgeC1jb29yZGluYXRlXG4gKiBQb2ludHMgbmVlZCB0byBiZSBpbiBvcmRlciBieSB4LWNvb3JkaW5hdGUgZm9yIHRoaXMgdG8gd29yayBlZmZpY2llbnRseVxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8UGF0aDJEfSBjdHggLSBDb250ZXh0XG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gc2VnbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQuc3RhcnQgLSBzdGFydCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LmVuZCAtIGVuZCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VnbWVudC5sb29wIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgaXMgYSBsb29wXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5tb3ZlIC0gbW92ZSB0byBzdGFydGluZyBwb2ludCAodnMgbGluZSB0byBpdClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLnJldmVyc2UgLSBwYXRoIHRoZSBzZWdtZW50IGZyb20gZW5kIHRvIHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnN0YXJ0IC0gbGltaXQgc2VnbWVudCB0byBwb2ludHMgc3RhcnRpbmcgZnJvbSBgc3RhcnRgIGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLmVuZCAtIGxpbWl0IHNlZ21lbnQgdG8gcG9pbnRzIGVuZGluZyBhdCBgc3RhcnRgICsgYGNvdW50YCBpbmRleFxuICovXG5mdW5jdGlvbiBmYXN0UGF0aFNlZ21lbnQoY3R4LCBsaW5lLCBzZWdtZW50LCBwYXJhbXMpIHtcbiAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IHtjb3VudCwgc3RhcnQsIGlsZW59ID0gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMpO1xuICBjb25zdCB7bW92ZSA9IHRydWUsIHJldmVyc2V9ID0gcGFyYW1zIHx8IHt9O1xuICBsZXQgYXZnWCA9IDA7XG4gIGxldCBjb3VudFggPSAwO1xuICBsZXQgaSwgcG9pbnQsIHByZXZYLCBtaW5ZLCBtYXhZLCBsYXN0WTtcblxuICBjb25zdCBwb2ludEluZGV4ID0gKGluZGV4KSA9PiAoc3RhcnQgKyAocmV2ZXJzZSA/IGlsZW4gLSBpbmRleCA6IGluZGV4KSkgJSBjb3VudDtcbiAgY29uc3QgZHJhd1ggPSAoKSA9PiB7XG4gICAgaWYgKG1pblkgIT09IG1heFkpIHtcbiAgICAgIC8vIERyYXcgbGluZSB0byBtYXhZIGFuZCBtaW5ZLCB1c2luZyB0aGUgYXZlcmFnZSB4LWNvb3JkaW5hdGVcbiAgICAgIGN0eC5saW5lVG8oYXZnWCwgbWF4WSk7XG4gICAgICBjdHgubGluZVRvKGF2Z1gsIG1pblkpO1xuICAgICAgLy8gTGluZSB0byB5LXZhbHVlIG9mIGxhc3QgcG9pbnQgaW4gZ3JvdXAuIFNvIHRoZSBsaW5lIGNvbnRpbnVlc1xuICAgICAgLy8gZnJvbSBjb3JyZWN0IHBvc2l0aW9uLiBOb3QgdXNpbmcgbW92ZSwgdG8gaGF2ZSBzb2xpZCBwYXRoLlxuICAgICAgY3R4LmxpbmVUbyhhdmdYLCBsYXN0WSk7XG4gICAgfVxuICB9O1xuXG4gIGlmIChtb3ZlKSB7XG4gICAgcG9pbnQgPSBwb2ludHNbcG9pbnRJbmRleCgwKV07XG4gICAgY3R4Lm1vdmVUbyhwb2ludC54LCBwb2ludC55KTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPD0gaWxlbjsgKytpKSB7XG4gICAgcG9pbnQgPSBwb2ludHNbcG9pbnRJbmRleChpKV07XG5cbiAgICBpZiAocG9pbnQuc2tpcCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBza2lwcGVkIHBvaW50IGluc2lkZSBhIHNlZ21lbnQsIHNwYW5HYXBzIG11c3QgYmUgdHJ1ZVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgeCA9IHBvaW50Lng7XG4gICAgY29uc3QgeSA9IHBvaW50Lnk7XG4gICAgY29uc3QgdHJ1bmNYID0geCB8IDA7IC8vIHRydW5jYXRlZCB4LWNvb3JkaW5hdGVcblxuICAgIGlmICh0cnVuY1ggPT09IHByZXZYKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgYG1pbllgIC8gYG1heFlgIGFuZCBgYXZnWGAgd2hpbGUgd2Ugc3RheSB3aXRoaW4gc2FtZSB4LXBvc2l0aW9uXG4gICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgbWluWSA9IHk7XG4gICAgICB9IGVsc2UgaWYgKHkgPiBtYXhZKSB7XG4gICAgICAgIG1heFkgPSB5O1xuICAgICAgfVxuICAgICAgLy8gRm9yIGZpcnN0IHBvaW50IGluIGdyb3VwLCBjb3VudFggaXMgYDBgLCBzbyBhdmVyYWdlIHdpbGwgYmUgYHhgIC8gMS5cbiAgICAgIGF2Z1ggPSAoY291bnRYICogYXZnWCArIHgpIC8gKytjb3VudFg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyYXdYKCk7XG4gICAgICAvLyBEcmF3IGxpbmUgdG8gbmV4dCB4LXBvc2l0aW9uLCB1c2luZyB0aGUgZmlyc3QgKG9yIG9ubHkpXG4gICAgICAvLyB5LXZhbHVlIGluIHRoYXQgZ3JvdXBcbiAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG5cbiAgICAgIHByZXZYID0gdHJ1bmNYO1xuICAgICAgY291bnRYID0gMDtcbiAgICAgIG1pblkgPSBtYXhZID0geTtcbiAgICB9XG4gICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCB5LXZhbHVlIGluIGdyb3VwXG4gICAgbGFzdFkgPSB5O1xuICB9XG4gIGRyYXdYKCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtMaW5lRWxlbWVudH0gbGluZSAtIHRoZSBsaW5lXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfZ2V0U2VnbWVudE1ldGhvZChsaW5lKSB7XG4gIGNvbnN0IG9wdHMgPSBsaW5lLm9wdGlvbnM7XG4gIGNvbnN0IGJvcmRlckRhc2ggPSBvcHRzLmJvcmRlckRhc2ggJiYgb3B0cy5ib3JkZXJEYXNoLmxlbmd0aDtcbiAgY29uc3QgdXNlRmFzdFBhdGggPSAhbGluZS5fZGVjaW1hdGVkICYmICFsaW5lLl9sb29wICYmICFvcHRzLnRlbnNpb24gJiYgb3B0cy5jdWJpY0ludGVycG9sYXRpb25Nb2RlICE9PSAnbW9ub3RvbmUnICYmICFvcHRzLnN0ZXBwZWQgJiYgIWJvcmRlckRhc2g7XG4gIHJldHVybiB1c2VGYXN0UGF0aCA/IGZhc3RQYXRoU2VnbWVudCA6IHBhdGhTZWdtZW50O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9nZXRJbnRlcnBvbGF0aW9uTWV0aG9kKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc3RlcHBlZCkge1xuICAgIHJldHVybiBfc3RlcHBlZEludGVycG9sYXRpb247XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZW5zaW9uIHx8IG9wdGlvbnMuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ21vbm90b25lJykge1xuICAgIHJldHVybiBfYmV6aWVySW50ZXJwb2xhdGlvbjtcbiAgfVxuXG4gIHJldHVybiBfcG9pbnRJbkxpbmU7XG59XG5cbmZ1bmN0aW9uIHN0cm9rZVBhdGhXaXRoQ2FjaGUoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgbGV0IHBhdGggPSBsaW5lLl9wYXRoO1xuICBpZiAoIXBhdGgpIHtcbiAgICBwYXRoID0gbGluZS5fcGF0aCA9IG5ldyBQYXRoMkQoKTtcbiAgICBpZiAobGluZS5wYXRoKHBhdGgsIHN0YXJ0LCBjb3VudCkpIHtcbiAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgfVxuICB9XG4gIHNldFN0eWxlKGN0eCwgbGluZS5vcHRpb25zKTtcbiAgY3R4LnN0cm9rZShwYXRoKTtcbn1cblxuZnVuY3Rpb24gc3Ryb2tlUGF0aERpcmVjdChjdHgsIGxpbmUsIHN0YXJ0LCBjb3VudCkge1xuICBjb25zdCB7c2VnbWVudHMsIG9wdGlvbnN9ID0gbGluZTtcbiAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKGxpbmUpO1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIHNldFN0eWxlKGN0eCwgb3B0aW9ucywgc2VnbWVudC5zdHlsZSk7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGlmIChzZWdtZW50TWV0aG9kKGN0eCwgbGluZSwgc2VnbWVudCwge3N0YXJ0LCBlbmQ6IHN0YXJ0ICsgY291bnQgLSAxfSkpIHtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59XG5cbmNvbnN0IHVzZVBhdGgyRCA9IHR5cGVvZiBQYXRoMkQgPT09ICdmdW5jdGlvbic7XG5cbmZ1bmN0aW9uIGRyYXcoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgaWYgKHVzZVBhdGgyRCAmJiAhbGluZS5vcHRpb25zLnNlZ21lbnQpIHtcbiAgICBzdHJva2VQYXRoV2l0aENhY2hlKGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KTtcbiAgfSBlbHNlIHtcbiAgICBzdHJva2VQYXRoRGlyZWN0KGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIHN0YXRpYyBpZCA9ICdsaW5lJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBib3JkZXJDYXBTdHlsZTogJ2J1dHQnLFxuICAgIGJvcmRlckRhc2g6IFtdLFxuICAgIGJvcmRlckRhc2hPZmZzZXQ6IDAsXG4gICAgYm9yZGVySm9pblN0eWxlOiAnbWl0ZXInLFxuICAgIGJvcmRlcldpZHRoOiAzLFxuICAgIGNhcEJlemllclBvaW50czogdHJ1ZSxcbiAgICBjdWJpY0ludGVycG9sYXRpb25Nb2RlOiAnZGVmYXVsdCcsXG4gICAgZmlsbDogZmFsc2UsXG4gICAgc3BhbkdhcHM6IGZhbHNlLFxuICAgIHN0ZXBwZWQ6IGZhbHNlLFxuICAgIHRlbnNpb246IDAsXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgIGJvcmRlckNvbG9yOiAnYm9yZGVyQ29sb3InXG4gIH07XG5cblxuICBzdGF0aWMgZGVzY3JpcHRvcnMgPSB7XG4gICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgX2luZGV4YWJsZTogKG5hbWUpID0+IG5hbWUgIT09ICdib3JkZXJEYXNoJyAmJiBuYW1lICE9PSAnZmlsbCcsXG4gIH07XG5cblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5hbmltYXRlZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NoYXJ0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2xvb3AgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZnVsbExvb3AgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wb2ludHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2VnbWVudHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZGVjaW1hdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2RhdGFzZXRJbmRleCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChjZmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250cm9sUG9pbnRzKGNoYXJ0QXJlYSwgaW5kZXhBeGlzKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoKG9wdGlvbnMudGVuc2lvbiB8fCBvcHRpb25zLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPT09ICdtb25vdG9uZScpICYmICFvcHRpb25zLnN0ZXBwZWQgJiYgIXRoaXMuX3BvaW50c1VwZGF0ZWQpIHtcbiAgICAgIGNvbnN0IGxvb3AgPSBvcHRpb25zLnNwYW5HYXBzID8gdGhpcy5fbG9vcCA6IHRoaXMuX2Z1bGxMb29wO1xuICAgICAgX3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHModGhpcy5fcG9pbnRzLCBvcHRpb25zLCBjaGFydEFyZWEsIGxvb3AsIGluZGV4QXhpcyk7XG4gICAgICB0aGlzLl9wb2ludHNVcGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXQgcG9pbnRzKHBvaW50cykge1xuICAgIHRoaXMuX3BvaW50cyA9IHBvaW50cztcbiAgICBkZWxldGUgdGhpcy5fc2VnbWVudHM7XG4gICAgZGVsZXRlIHRoaXMuX3BhdGg7XG4gICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgZ2V0IHNlZ21lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWdtZW50cyB8fCAodGhpcy5fc2VnbWVudHMgPSBfY29tcHV0ZVNlZ21lbnRzKHRoaXMsIHRoaXMub3B0aW9ucy5zZWdtZW50KSk7XG4gIH1cblxuICAvKipcblx0ICogRmlyc3Qgbm9uLXNraXBwZWQgcG9pbnQgb24gdGhpcyBsaW5lXG5cdCAqIEByZXR1cm5zIHtQb2ludEVsZW1lbnR8dW5kZWZpbmVkfVxuXHQgKi9cbiAgZmlyc3QoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggJiYgcG9pbnRzW3NlZ21lbnRzWzBdLnN0YXJ0XTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBMYXN0IG5vbi1za2lwcGVkIHBvaW50IG9uIHRoaXMgbGluZVxuXHQgKiBAcmV0dXJucyB7UG9pbnRFbGVtZW50fHVuZGVmaW5lZH1cblx0ICovXG4gIGxhc3QoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGNvbnN0IGNvdW50ID0gc2VnbWVudHMubGVuZ3RoO1xuICAgIHJldHVybiBjb3VudCAmJiBwb2ludHNbc2VnbWVudHNbY291bnQgLSAxXS5lbmRdO1xuICB9XG5cbiAgLyoqXG5cdCAqIEludGVycG9sYXRlIGEgcG9pbnQgaW4gdGhpcyBsaW5lIGF0IHRoZSBzYW1lIHZhbHVlIG9uIGBwcm9wZXJ0eWAgYXNcblx0ICogdGhlIHJlZmVyZW5jZSBgcG9pbnRgIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7UG9pbnRFbGVtZW50fSBwb2ludCAtIHRoZSByZWZlcmVuY2UgcG9pbnRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gdGhlIHByb3BlcnR5IHRvIG1hdGNoIG9uXG5cdCAqIEByZXR1cm5zIHtQb2ludEVsZW1lbnR8dW5kZWZpbmVkfVxuXHQgKi9cbiAgaW50ZXJwb2xhdGUocG9pbnQsIHByb3BlcnR5KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB2YWx1ZSA9IHBvaW50W3Byb3BlcnR5XTtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgICBjb25zdCBzZWdtZW50cyA9IF9ib3VuZFNlZ21lbnRzKHRoaXMsIHtwcm9wZXJ0eSwgc3RhcnQ6IHZhbHVlLCBlbmQ6IHZhbHVlfSk7XG5cbiAgICBpZiAoIXNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IF9pbnRlcnBvbGF0ZSA9IF9nZXRJbnRlcnBvbGF0aW9uTWV0aG9kKG9wdGlvbnMpO1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGZvciAoaSA9IDAsIGlsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGNvbnN0IHtzdGFydCwgZW5kfSA9IHNlZ21lbnRzW2ldO1xuICAgICAgY29uc3QgcDEgPSBwb2ludHNbc3RhcnRdO1xuICAgICAgY29uc3QgcDIgPSBwb2ludHNbZW5kXTtcbiAgICAgIGlmIChwMSA9PT0gcDIpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocDEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHQgPSBNYXRoLmFicygodmFsdWUgLSBwMVtwcm9wZXJ0eV0pIC8gKHAyW3Byb3BlcnR5XSAtIHAxW3Byb3BlcnR5XSkpO1xuICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gX2ludGVycG9sYXRlKHAxLCBwMiwgdCwgb3B0aW9ucy5zdGVwcGVkKTtcbiAgICAgIGludGVycG9sYXRlZFtwcm9wZXJ0eV0gPSBwb2ludFtwcm9wZXJ0eV07XG4gICAgICByZXN1bHQucHVzaChpbnRlcnBvbGF0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBBcHBlbmQgYSBzZWdtZW50IG9mIHRoaXMgbGluZSB0byBjdXJyZW50IHBhdGguXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHhcblx0ICogQHBhcmFtIHtvYmplY3R9IHNlZ21lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQuc3RhcnQgLSBzdGFydCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiBcdCAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LmVuZCAtIGVuZCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiBcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VnbWVudC5sb29wIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgaXMgYSBsb29wXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcblx0ICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMubW92ZSAtIG1vdmUgdG8gc3RhcnRpbmcgcG9pbnQgKHZzIGxpbmUgdG8gaXQpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLnJldmVyc2UgLSBwYXRoIHRoZSBzZWdtZW50IGZyb20gZW5kIHRvIHN0YXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMuc3RhcnQgLSBsaW1pdCBzZWdtZW50IHRvIHBvaW50cyBzdGFydGluZyBmcm9tIGBzdGFydGAgaW5kZXhcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5lbmQgLSBsaW1pdCBzZWdtZW50IHRvIHBvaW50cyBlbmRpbmcgYXQgYHN0YXJ0YCArIGBjb3VudGAgaW5kZXhcblx0ICogQHJldHVybnMge3VuZGVmaW5lZHxib29sZWFufSAtIHRydWUgaWYgdGhlIHNlZ21lbnQgaXMgYSBmdWxsIGxvb3AgKHBhdGggc2hvdWxkIGJlIGNsb3NlZClcblx0ICovXG4gIHBhdGhTZWdtZW50KGN0eCwgc2VnbWVudCwgcGFyYW1zKSB7XG4gICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKHRoaXMpO1xuICAgIHJldHVybiBzZWdtZW50TWV0aG9kKGN0eCwgdGhpcywgc2VnbWVudCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBBcHBlbmQgYWxsIHNlZ21lbnRzIG9mIHRoaXMgbGluZSB0byBjdXJyZW50IHBhdGguXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfFBhdGgyRH0gY3R4XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRdXG5cdCAqIEByZXR1cm5zIHt1bmRlZmluZWR8Ym9vbGVhbn0gLSB0cnVlIGlmIGxpbmUgaXMgYSBmdWxsIGxvb3AgKHBhdGggc2hvdWxkIGJlIGNsb3NlZClcblx0ICovXG4gIHBhdGgoY3R4LCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuc2VnbWVudHM7XG4gICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKHRoaXMpO1xuICAgIGxldCBsb29wID0gdGhpcy5fbG9vcDtcblxuICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICBjb3VudCA9IGNvdW50IHx8ICh0aGlzLnBvaW50cy5sZW5ndGggLSBzdGFydCk7XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgIGxvb3AgJj0gc2VnbWVudE1ldGhvZChjdHgsIHRoaXMsIHNlZ21lbnQsIHtzdGFydCwgZW5kOiBzdGFydCArIGNvdW50IC0gMX0pO1xuICAgIH1cbiAgICByZXR1cm4gISFsb29wO1xuICB9XG5cbiAgLyoqXG5cdCAqIERyYXdcblx0ICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eFxuXHQgKiBAcGFyYW0ge29iamVjdH0gY2hhcnRBcmVhXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRdXG5cdCAqL1xuICBkcmF3KGN0eCwgY2hhcnRBcmVhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzIHx8IFtdO1xuXG4gICAgaWYgKHBvaW50cy5sZW5ndGggJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCkge1xuICAgICAgY3R4LnNhdmUoKTtcblxuICAgICAgZHJhdyhjdHgsIHRoaXMsIHN0YXJ0LCBjb3VudCk7XG5cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgIC8vIFdoZW4gbGluZSBpcyBhbmltYXRlZCwgdGhlIGNvbnRyb2wgcG9pbnRzIGFuZCBwYXRoIGFyZSBub3QgY2FjaGVkLlxuICAgICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgRWxlbWVudCBmcm9tICcuLi9jb3JlL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQge2RyYXdQb2ludCwgX2lzUG9pbnRJbkFyZWF9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDYXJ0ZXNpYW5QYXJzZWREYXRhLFxuICBDaGFydEFyZWEsXG4gIFBvaW50LFxuICBQb2ludEhvdmVyT3B0aW9ucyxcbiAgUG9pbnRPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cbmZ1bmN0aW9uIGluUmFuZ2UoZWw6IFBvaW50RWxlbWVudCwgcG9zOiBudW1iZXIsIGF4aXM6ICd4JyB8ICd5JywgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGVsLm9wdGlvbnM7XG4gIGNvbnN0IHtbYXhpc106IHZhbHVlfSA9IGVsLmdldFByb3BzKFtheGlzXSwgdXNlRmluYWxQb3NpdGlvbik7XG5cbiAgcmV0dXJuIChNYXRoLmFicyhwb3MgLSB2YWx1ZSkgPCBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaGl0UmFkaXVzKTtcbn1cblxuZXhwb3J0IHR5cGUgUG9pbnRQcm9wcyA9IFBvaW50XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50RWxlbWVudCBleHRlbmRzIEVsZW1lbnQ8UG9pbnRQcm9wcywgUG9pbnRPcHRpb25zICYgUG9pbnRIb3Zlck9wdGlvbnM+IHtcblxuICBzdGF0aWMgaWQgPSAncG9pbnQnO1xuXG4gIHBhcnNlZDogQ2FydGVzaWFuUGFyc2VkRGF0YTtcbiAgc2tpcD86IGJvb2xlYW47XG4gIHN0b3A/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIGJvcmRlcldpZHRoOiAxLFxuICAgIGhpdFJhZGl1czogMSxcbiAgICBob3ZlckJvcmRlcldpZHRoOiAxLFxuICAgIGhvdmVyUmFkaXVzOiA0LFxuICAgIHBvaW50U3R5bGU6ICdjaXJjbGUnLFxuICAgIHJhZGl1czogMyxcbiAgICByb3RhdGlvbjogMFxuICB9O1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJyxcbiAgICBib3JkZXJDb2xvcjogJ2JvcmRlckNvbG9yJ1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXJzZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5za2lwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RvcCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChjZmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICB9XG4gIH1cblxuICBpblJhbmdlKG1vdXNlWDogbnVtYmVyLCBtb3VzZVk6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuZ2V0UHJvcHMoWyd4JywgJ3knXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgcmV0dXJuICgoTWF0aC5wb3cobW91c2VYIC0geCwgMikgKyBNYXRoLnBvdyhtb3VzZVkgLSB5LCAyKSkgPCBNYXRoLnBvdyhvcHRpb25zLmhpdFJhZGl1cyArIG9wdGlvbnMucmFkaXVzLCAyKSk7XG4gIH1cblxuICBpblhSYW5nZShtb3VzZVg6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaW5SYW5nZSh0aGlzLCBtb3VzZVgsICd4JywgdXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBpbllSYW5nZShtb3VzZVk6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaW5SYW5nZSh0aGlzLCBtb3VzZVksICd5JywgdXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuZ2V0UHJvcHMoWyd4JywgJ3knXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgcmV0dXJuIHt4LCB5fTtcbiAgfVxuXG4gIHNpemUob3B0aW9ucz86IFBhcnRpYWw8UG9pbnRPcHRpb25zICYgUG9pbnRIb3Zlck9wdGlvbnM+KSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zIHx8IHt9O1xuICAgIGxldCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cyB8fCAwO1xuICAgIHJhZGl1cyA9IE1hdGgubWF4KHJhZGl1cywgcmFkaXVzICYmIG9wdGlvbnMuaG92ZXJSYWRpdXMgfHwgMCk7XG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSByYWRpdXMgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCB8fCAwO1xuICAgIHJldHVybiAocmFkaXVzICsgYm9yZGVyV2lkdGgpICogMjtcbiAgfVxuXG4gIGRyYXcoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFyZWE6IENoYXJ0QXJlYSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAodGhpcy5za2lwIHx8IG9wdGlvbnMucmFkaXVzIDwgMC4xIHx8ICFfaXNQb2ludEluQXJlYSh0aGlzLCBhcmVhLCB0aGlzLnNpemUob3B0aW9ucykgLyAyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdGlvbnMuYm9yZGVyQ29sb3I7XG4gICAgY3R4LmxpbmVXaWR0aCA9IG9wdGlvbnMuYm9yZGVyV2lkdGg7XG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgIGRyYXdQb2ludChjdHgsIG9wdGlvbnMsIHRoaXMueCwgdGhpcy55KTtcbiAgfVxuXG4gIGdldFJhbmdlKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgfHwge307XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGYWxsYmFja3Mgc2hvdWxkIG5ldmVyIGJlIGhpdCBpbiBwcmFjdGljZVxuICAgIHJldHVybiBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaGl0UmFkaXVzO1xuICB9XG59XG4iLCAiaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHtpc09iamVjdCwgX2lzQmV0d2VlbiwgX2xpbWl0VmFsdWV9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHthZGRSb3VuZGVkUmVjdFBhdGh9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHt0b1RSQkwsIHRvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuLyoqIEB0eXBlZGVmIHt7IHg6IG51bWJlciwgeTogbnVtYmVyLCBiYXNlOiBudW1iZXIsIGhvcml6b250YWw6IGJvb2xlYW4sIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH19IEJhclByb3BzICovXG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgYm91bmRzIG9mIHRoZSBiYXIgcmVnYXJkbGVzcyBvZiB0aGUgb3JpZW50YXRpb25cbiAqIEBwYXJhbSB7QmFyRWxlbWVudH0gYmFyIHRoZSBiYXJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dXG4gKiBAcmV0dXJuIHtvYmplY3R9IGJvdW5kcyBvZiB0aGUgYmFyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRCYXJCb3VuZHMoYmFyLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gIGNvbnN0IHt4LCB5LCBiYXNlLCB3aWR0aCwgaGVpZ2h0fSA9IC8qKiBAdHlwZSB7QmFyUHJvcHN9ICovIChiYXIuZ2V0UHJvcHMoWyd4JywgJ3knLCAnYmFzZScsICd3aWR0aCcsICdoZWlnaHQnXSwgdXNlRmluYWxQb3NpdGlvbikpO1xuXG4gIGxldCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIGhhbGY7XG5cbiAgaWYgKGJhci5ob3Jpem9udGFsKSB7XG4gICAgaGFsZiA9IGhlaWdodCAvIDI7XG4gICAgbGVmdCA9IE1hdGgubWluKHgsIGJhc2UpO1xuICAgIHJpZ2h0ID0gTWF0aC5tYXgoeCwgYmFzZSk7XG4gICAgdG9wID0geSAtIGhhbGY7XG4gICAgYm90dG9tID0geSArIGhhbGY7XG4gIH0gZWxzZSB7XG4gICAgaGFsZiA9IHdpZHRoIC8gMjtcbiAgICBsZWZ0ID0geCAtIGhhbGY7XG4gICAgcmlnaHQgPSB4ICsgaGFsZjtcbiAgICB0b3AgPSBNYXRoLm1pbih5LCBiYXNlKTtcbiAgICBib3R0b20gPSBNYXRoLm1heCh5LCBiYXNlKTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgdG9wLCByaWdodCwgYm90dG9tfTtcbn1cblxuZnVuY3Rpb24gc2tpcE9yTGltaXQoc2tpcCwgdmFsdWUsIG1pbiwgbWF4KSB7XG4gIHJldHVybiBza2lwID8gMCA6IF9saW1pdFZhbHVlKHZhbHVlLCBtaW4sIG1heCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyV2lkdGgoYmFyLCBtYXhXLCBtYXhIKSB7XG4gIGNvbnN0IHZhbHVlID0gYmFyLm9wdGlvbnMuYm9yZGVyV2lkdGg7XG4gIGNvbnN0IHNraXAgPSBiYXIuYm9yZGVyU2tpcHBlZDtcbiAgY29uc3QgbyA9IHRvVFJCTCh2YWx1ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0OiBza2lwT3JMaW1pdChza2lwLnRvcCwgby50b3AsIDAsIG1heEgpLFxuICAgIHI6IHNraXBPckxpbWl0KHNraXAucmlnaHQsIG8ucmlnaHQsIDAsIG1heFcpLFxuICAgIGI6IHNraXBPckxpbWl0KHNraXAuYm90dG9tLCBvLmJvdHRvbSwgMCwgbWF4SCksXG4gICAgbDogc2tpcE9yTGltaXQoc2tpcC5sZWZ0LCBvLmxlZnQsIDAsIG1heFcpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyUmFkaXVzKGJhciwgbWF4VywgbWF4SCkge1xuICBjb25zdCB7ZW5hYmxlQm9yZGVyUmFkaXVzfSA9IGJhci5nZXRQcm9wcyhbJ2VuYWJsZUJvcmRlclJhZGl1cyddKTtcbiAgY29uc3QgdmFsdWUgPSBiYXIub3B0aW9ucy5ib3JkZXJSYWRpdXM7XG4gIGNvbnN0IG8gPSB0b1RSQkxDb3JuZXJzKHZhbHVlKTtcbiAgY29uc3QgbWF4UiA9IE1hdGgubWluKG1heFcsIG1heEgpO1xuICBjb25zdCBza2lwID0gYmFyLmJvcmRlclNraXBwZWQ7XG5cbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCwgYXNzdW1lIHRoZSB1c2VyIGtub3dzIHdoYXQgdGhleSBhcmUgZG9pbmdcbiAgLy8gYW5kIGFwcGx5IGFzIGRpcmVjdGVkLlxuICBjb25zdCBlbmFibGVCb3JkZXIgPSBlbmFibGVCb3JkZXJSYWRpdXMgfHwgaXNPYmplY3QodmFsdWUpO1xuXG4gIHJldHVybiB7XG4gICAgdG9wTGVmdDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLnRvcCB8fCBza2lwLmxlZnQsIG8udG9wTGVmdCwgMCwgbWF4UiksXG4gICAgdG9wUmlnaHQ6IHNraXBPckxpbWl0KCFlbmFibGVCb3JkZXIgfHwgc2tpcC50b3AgfHwgc2tpcC5yaWdodCwgby50b3BSaWdodCwgMCwgbWF4UiksXG4gICAgYm90dG9tTGVmdDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLmJvdHRvbSB8fCBza2lwLmxlZnQsIG8uYm90dG9tTGVmdCwgMCwgbWF4UiksXG4gICAgYm90dG9tUmlnaHQ6IHNraXBPckxpbWl0KCFlbmFibGVCb3JkZXIgfHwgc2tpcC5ib3R0b20gfHwgc2tpcC5yaWdodCwgby5ib3R0b21SaWdodCwgMCwgbWF4UilcbiAgfTtcbn1cblxuZnVuY3Rpb24gYm91bmRpbmdSZWN0cyhiYXIpIHtcbiAgY29uc3QgYm91bmRzID0gZ2V0QmFyQm91bmRzKGJhcik7XG4gIGNvbnN0IHdpZHRoID0gYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQ7XG4gIGNvbnN0IGhlaWdodCA9IGJvdW5kcy5ib3R0b20gLSBib3VuZHMudG9wO1xuICBjb25zdCBib3JkZXIgPSBwYXJzZUJvcmRlcldpZHRoKGJhciwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgY29uc3QgcmFkaXVzID0gcGFyc2VCb3JkZXJSYWRpdXMoYmFyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuXG4gIHJldHVybiB7XG4gICAgb3V0ZXI6IHtcbiAgICAgIHg6IGJvdW5kcy5sZWZ0LFxuICAgICAgeTogYm91bmRzLnRvcCxcbiAgICAgIHc6IHdpZHRoLFxuICAgICAgaDogaGVpZ2h0LFxuICAgICAgcmFkaXVzXG4gICAgfSxcbiAgICBpbm5lcjoge1xuICAgICAgeDogYm91bmRzLmxlZnQgKyBib3JkZXIubCxcbiAgICAgIHk6IGJvdW5kcy50b3AgKyBib3JkZXIudCxcbiAgICAgIHc6IHdpZHRoIC0gYm9yZGVyLmwgLSBib3JkZXIucixcbiAgICAgIGg6IGhlaWdodCAtIGJvcmRlci50IC0gYm9yZGVyLmIsXG4gICAgICByYWRpdXM6IHtcbiAgICAgICAgdG9wTGVmdDogTWF0aC5tYXgoMCwgcmFkaXVzLnRvcExlZnQgLSBNYXRoLm1heChib3JkZXIudCwgYm9yZGVyLmwpKSxcbiAgICAgICAgdG9wUmlnaHQ6IE1hdGgubWF4KDAsIHJhZGl1cy50b3BSaWdodCAtIE1hdGgubWF4KGJvcmRlci50LCBib3JkZXIucikpLFxuICAgICAgICBib3R0b21MZWZ0OiBNYXRoLm1heCgwLCByYWRpdXMuYm90dG9tTGVmdCAtIE1hdGgubWF4KGJvcmRlci5iLCBib3JkZXIubCkpLFxuICAgICAgICBib3R0b21SaWdodDogTWF0aC5tYXgoMCwgcmFkaXVzLmJvdHRvbVJpZ2h0IC0gTWF0aC5tYXgoYm9yZGVyLmIsIGJvcmRlci5yKSksXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpblJhbmdlKGJhciwgeCwgeSwgdXNlRmluYWxQb3NpdGlvbikge1xuICBjb25zdCBza2lwWCA9IHggPT09IG51bGw7XG4gIGNvbnN0IHNraXBZID0geSA9PT0gbnVsbDtcbiAgY29uc3Qgc2tpcEJvdGggPSBza2lwWCAmJiBza2lwWTtcbiAgY29uc3QgYm91bmRzID0gYmFyICYmICFza2lwQm90aCAmJiBnZXRCYXJCb3VuZHMoYmFyLCB1c2VGaW5hbFBvc2l0aW9uKTtcblxuICByZXR1cm4gYm91bmRzXG5cdFx0JiYgKHNraXBYIHx8IF9pc0JldHdlZW4oeCwgYm91bmRzLmxlZnQsIGJvdW5kcy5yaWdodCkpXG5cdFx0JiYgKHNraXBZIHx8IF9pc0JldHdlZW4oeSwgYm91bmRzLnRvcCwgYm91bmRzLmJvdHRvbSkpO1xufVxuXG5mdW5jdGlvbiBoYXNSYWRpdXMocmFkaXVzKSB7XG4gIHJldHVybiByYWRpdXMudG9wTGVmdCB8fCByYWRpdXMudG9wUmlnaHQgfHwgcmFkaXVzLmJvdHRvbUxlZnQgfHwgcmFkaXVzLmJvdHRvbVJpZ2h0O1xufVxuXG4vKipcbiAqIEFkZCBhIHBhdGggb2YgYSByZWN0YW5nbGUgdG8gdGhlIGN1cnJlbnQgc3ViLXBhdGhcbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggQ29udGV4dFxuICogQHBhcmFtIHsqfSByZWN0IEJvdW5kaW5nIHJlY3RcbiAqL1xuZnVuY3Rpb24gYWRkTm9ybWFsUmVjdFBhdGgoY3R4LCByZWN0KSB7XG4gIGN0eC5yZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LncsIHJlY3QuaCk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZWN0KHJlY3QsIGFtb3VudCwgcmVmUmVjdCA9IHt9KSB7XG4gIGNvbnN0IHggPSByZWN0LnggIT09IHJlZlJlY3QueCA/IC1hbW91bnQgOiAwO1xuICBjb25zdCB5ID0gcmVjdC55ICE9PSByZWZSZWN0LnkgPyAtYW1vdW50IDogMDtcbiAgY29uc3QgdyA9IChyZWN0LnggKyByZWN0LncgIT09IHJlZlJlY3QueCArIHJlZlJlY3QudyA/IGFtb3VudCA6IDApIC0geDtcbiAgY29uc3QgaCA9IChyZWN0LnkgKyByZWN0LmggIT09IHJlZlJlY3QueSArIHJlZlJlY3QuaCA/IGFtb3VudCA6IDApIC0geTtcbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LnggKyB4LFxuICAgIHk6IHJlY3QueSArIHksXG4gICAgdzogcmVjdC53ICsgdyxcbiAgICBoOiByZWN0LmggKyBoLFxuICAgIHJhZGl1czogcmVjdC5yYWRpdXNcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFyRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIHN0YXRpYyBpZCA9ICdiYXInO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIGJvcmRlclNraXBwZWQ6ICdzdGFydCcsXG4gICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgIGluZmxhdGVBbW91bnQ6ICdhdXRvJyxcbiAgICBwb2ludFN0eWxlOiB1bmRlZmluZWRcbiAgfTtcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogJ2JhY2tncm91bmRDb2xvcicsXG4gICAgYm9yZGVyQ29sb3I6ICdib3JkZXJDb2xvcidcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaG9yaXpvbnRhbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJhc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluZmxhdGVBbW91bnQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoY2ZnKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNmZyk7XG4gICAgfVxuICB9XG5cbiAgZHJhdyhjdHgpIHtcbiAgICBjb25zdCB7aW5mbGF0ZUFtb3VudCwgb3B0aW9uczoge2JvcmRlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3J9fSA9IHRoaXM7XG4gICAgY29uc3Qge2lubmVyLCBvdXRlcn0gPSBib3VuZGluZ1JlY3RzKHRoaXMpO1xuICAgIGNvbnN0IGFkZFJlY3RQYXRoID0gaGFzUmFkaXVzKG91dGVyLnJhZGl1cykgPyBhZGRSb3VuZGVkUmVjdFBhdGggOiBhZGROb3JtYWxSZWN0UGF0aDtcblxuICAgIGN0eC5zYXZlKCk7XG5cbiAgICBpZiAob3V0ZXIudyAhPT0gaW5uZXIudyB8fCBvdXRlci5oICE9PSBpbm5lci5oKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBhZGRSZWN0UGF0aChjdHgsIGluZmxhdGVSZWN0KG91dGVyLCBpbmZsYXRlQW1vdW50LCBpbm5lcikpO1xuICAgICAgY3R4LmNsaXAoKTtcbiAgICAgIGFkZFJlY3RQYXRoKGN0eCwgaW5mbGF0ZVJlY3QoaW5uZXIsIC1pbmZsYXRlQW1vdW50LCBvdXRlcikpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGJvcmRlckNvbG9yO1xuICAgICAgY3R4LmZpbGwoJ2V2ZW5vZGQnKTtcbiAgICB9XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgYWRkUmVjdFBhdGgoY3R4LCBpbmZsYXRlUmVjdChpbm5lciwgaW5mbGF0ZUFtb3VudCkpO1xuICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgY3R4LmZpbGwoKTtcblxuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICBpblJhbmdlKG1vdXNlWCwgbW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIGluUmFuZ2UodGhpcywgbW91c2VYLCBtb3VzZVksIHVzZUZpbmFsUG9zaXRpb24pO1xuICB9XG5cbiAgaW5YUmFuZ2UobW91c2VYLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIGluUmFuZ2UodGhpcywgbW91c2VYLCBudWxsLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgfVxuXG4gIGluWVJhbmdlKG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIHJldHVybiBpblJhbmdlKHRoaXMsIG51bGwsIG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgY29uc3Qge3gsIHksIGJhc2UsIGhvcml6b250YWx9ID0gLyoqIEB0eXBlIHtCYXJQcm9wc30gKi8gKHRoaXMuZ2V0UHJvcHMoWyd4JywgJ3knLCAnYmFzZScsICdob3Jpem9udGFsJ10sIHVzZUZpbmFsUG9zaXRpb24pKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogaG9yaXpvbnRhbCA/ICh4ICsgYmFzZSkgLyAyIDogeCxcbiAgICAgIHk6IGhvcml6b250YWwgPyB5IDogKHkgKyBiYXNlKSAvIDJcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmFuZ2UoYXhpcykge1xuICAgIHJldHVybiBheGlzID09PSAneCcgPyB0aGlzLndpZHRoIC8gMiA6IHRoaXMuaGVpZ2h0IC8gMjtcbiAgfVxufVxuIiwgImltcG9ydCB7RG91Z2hudXRDb250cm9sbGVyLCBQb2xhckFyZWFDb250cm9sbGVyfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhcnQsIENoYXJ0RGF0YXNldH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yc1BsdWdpbk9wdGlvbnMge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgZm9yY2VPdmVycmlkZT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDb2xvcnNEZXNjcmlwdG9yIHtcbiAgYmFja2dyb3VuZENvbG9yPzogdW5rbm93bjtcbiAgYm9yZGVyQ29sb3I/OiB1bmtub3duO1xufVxuXG5jb25zdCBCT1JERVJfQ09MT1JTID0gW1xuICAncmdiKDU0LCAxNjIsIDIzNSknLCAvLyBibHVlXG4gICdyZ2IoMjU1LCA5OSwgMTMyKScsIC8vIHJlZFxuICAncmdiKDI1NSwgMTU5LCA2NCknLCAvLyBvcmFuZ2VcbiAgJ3JnYigyNTUsIDIwNSwgODYpJywgLy8geWVsbG93XG4gICdyZ2IoNzUsIDE5MiwgMTkyKScsIC8vIGdyZWVuXG4gICdyZ2IoMTUzLCAxMDIsIDI1NSknLCAvLyBwdXJwbGVcbiAgJ3JnYigyMDEsIDIwMywgMjA3KScgLy8gZ3JleVxuXTtcblxuLy8gQm9yZGVyIGNvbG9ycyB3aXRoIDUwJSB0cmFuc3BhcmVuY3lcbmNvbnN0IEJBQ0tHUk9VTkRfQ09MT1JTID0gLyogI19fUFVSRV9fICovIEJPUkRFUl9DT0xPUlMubWFwKGNvbG9yID0+IGNvbG9yLnJlcGxhY2UoJ3JnYignLCAncmdiYSgnKS5yZXBsYWNlKCcpJywgJywgMC41KScpKTtcblxuZnVuY3Rpb24gZ2V0Qm9yZGVyQ29sb3IoaTogbnVtYmVyKSB7XG4gIHJldHVybiBCT1JERVJfQ09MT1JTW2kgJSBCT1JERVJfQ09MT1JTLmxlbmd0aF07XG59XG5cbmZ1bmN0aW9uIGdldEJhY2tncm91bmRDb2xvcihpOiBudW1iZXIpIHtcbiAgcmV0dXJuIEJBQ0tHUk9VTkRfQ09MT1JTW2kgJSBCQUNLR1JPVU5EX0NPTE9SUy5sZW5ndGhdO1xufVxuXG5mdW5jdGlvbiBjb2xvcml6ZURlZmF1bHREYXRhc2V0KGRhdGFzZXQ6IENoYXJ0RGF0YXNldCwgaTogbnVtYmVyKSB7XG4gIGRhdGFzZXQuYm9yZGVyQ29sb3IgPSBnZXRCb3JkZXJDb2xvcihpKTtcbiAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRCYWNrZ3JvdW5kQ29sb3IoaSk7XG5cbiAgcmV0dXJuICsraTtcbn1cblxuZnVuY3Rpb24gY29sb3JpemVEb3VnaG51dERhdGFzZXQoZGF0YXNldDogQ2hhcnREYXRhc2V0LCBpOiBudW1iZXIpIHtcbiAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmRhdGEubWFwKCgpID0+IGdldEJvcmRlckNvbG9yKGkrKykpO1xuXG4gIHJldHVybiBpO1xufVxuXG5mdW5jdGlvbiBjb2xvcml6ZVBvbGFyQXJlYURhdGFzZXQoZGF0YXNldDogQ2hhcnREYXRhc2V0LCBpOiBudW1iZXIpIHtcbiAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmRhdGEubWFwKCgpID0+IGdldEJhY2tncm91bmRDb2xvcihpKyspKTtcblxuICByZXR1cm4gaTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29sb3JpemVyKGNoYXJ0OiBDaGFydCkge1xuICBsZXQgaSA9IDA7XG5cbiAgcmV0dXJuIChkYXRhc2V0OiBDaGFydERhdGFzZXQsIGRhdGFzZXRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuY29udHJvbGxlcjtcblxuICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgRG91Z2hudXRDb250cm9sbGVyKSB7XG4gICAgICBpID0gY29sb3JpemVEb3VnaG51dERhdGFzZXQoZGF0YXNldCwgaSk7XG4gICAgfSBlbHNlIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgUG9sYXJBcmVhQ29udHJvbGxlcikge1xuICAgICAgaSA9IGNvbG9yaXplUG9sYXJBcmVhRGF0YXNldChkYXRhc2V0LCBpKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgIGkgPSBjb2xvcml6ZURlZmF1bHREYXRhc2V0KGRhdGFzZXQsIGkpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNDb2xvcnNEZWZpbml0aW9ucyhcbiAgZGVzY3JpcHRvcnM6IENvbG9yc0Rlc2NyaXB0b3JbXSB8IFJlY29yZDxzdHJpbmcsIENvbG9yc0Rlc2NyaXB0b3I+XG4pIHtcbiAgbGV0IGs6IG51bWJlciB8IHN0cmluZztcblxuICBmb3IgKGsgaW4gZGVzY3JpcHRvcnMpIHtcbiAgICBpZiAoZGVzY3JpcHRvcnNba10uYm9yZGVyQ29sb3IgfHwgZGVzY3JpcHRvcnNba10uYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbihcbiAgZGVzY3JpcHRvcjogQ29sb3JzRGVzY3JpcHRvclxuKSB7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmIChkZXNjcmlwdG9yLmJvcmRlckNvbG9yIHx8IGRlc2NyaXB0b3IuYmFja2dyb3VuZENvbG9yKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2NvbG9ycycsXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGZvcmNlT3ZlcnJpZGU6IGZhbHNlXG4gIH0gYXMgQ29sb3JzUGx1Z2luT3B0aW9ucyxcblxuICBiZWZvcmVMYXlvdXQoY2hhcnQ6IENoYXJ0LCBfYXJncywgb3B0aW9uczogQ29sb3JzUGx1Z2luT3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZGF0YToge2RhdGFzZXRzfSxcbiAgICAgIG9wdGlvbnM6IGNoYXJ0T3B0aW9uc1xuICAgIH0gPSBjaGFydC5jb25maWc7XG4gICAgY29uc3Qge2VsZW1lbnRzfSA9IGNoYXJ0T3B0aW9ucztcblxuICAgIGlmICghb3B0aW9ucy5mb3JjZU92ZXJyaWRlICYmIChjb250YWluc0NvbG9yc0RlZmluaXRpb25zKGRhdGFzZXRzKSB8fCBjb250YWluc0NvbG9yc0RlZmluaXRpb24oY2hhcnRPcHRpb25zKSB8fCAoZWxlbWVudHMgJiYgY29udGFpbnNDb2xvcnNEZWZpbml0aW9ucyhlbGVtZW50cykpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yaXplciA9IGdldENvbG9yaXplcihjaGFydCk7XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKGNvbG9yaXplcik7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtfbGltaXRWYWx1ZSwgX2xvb2t1cEJ5S2V5LCBpc051bGxPclVuZGVmLCByZXNvbHZlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuZnVuY3Rpb24gbHR0YkRlY2ltYXRpb24oZGF0YSwgc3RhcnQsIGNvdW50LCBhdmFpbGFibGVXaWR0aCwgb3B0aW9ucykge1xuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIExhcmdlc3QgVHJpYW5nbGUgVGhyZWUgQnVja2V0cyBhbGdvcml0aG0uXG4gICAqXG4gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGJ5IFN2ZWlubiBTdGVpbmFyc3NvblxuICAgKiBpbiBodHRwczovL2dpdGh1Yi5jb20vc3ZlaW5uLXN0ZWluYXJzc29uL2Zsb3QtZG93bnNhbXBsZS9ibG9iL21hc3Rlci9qcXVlcnkuZmxvdC5kb3duc2FtcGxlLmpzXG4gICAqXG4gICAqIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBpcyBNSVQgbGljZW5zZWQuXG4gICAqL1xuICBjb25zdCBzYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzIHx8IGF2YWlsYWJsZVdpZHRoO1xuICAvLyBUaGVyZSBhcmUgbGVzcyBwb2ludHMgdGhhbiB0aGUgdGhyZXNob2xkLCByZXR1cm5pbmcgdGhlIHdob2xlIGFycmF5XG4gIGlmIChzYW1wbGVzID49IGNvdW50KSB7XG4gICAgcmV0dXJuIGRhdGEuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICB9XG5cbiAgY29uc3QgZGVjaW1hdGVkID0gW107XG5cbiAgY29uc3QgYnVja2V0V2lkdGggPSAoY291bnQgLSAyKSAvIChzYW1wbGVzIC0gMik7XG4gIGxldCBzYW1wbGVkSW5kZXggPSAwO1xuICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0ICsgY291bnQgLSAxO1xuICAvLyBTdGFydGluZyBmcm9tIG9mZnNldFxuICBsZXQgYSA9IHN0YXJ0O1xuICBsZXQgaSwgbWF4QXJlYVBvaW50LCBtYXhBcmVhLCBhcmVhLCBuZXh0QTtcblxuICBkZWNpbWF0ZWRbc2FtcGxlZEluZGV4KytdID0gZGF0YVthXTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlcyAtIDI7IGkrKykge1xuICAgIGxldCBhdmdYID0gMDtcbiAgICBsZXQgYXZnWSA9IDA7XG4gICAgbGV0IGo7XG5cbiAgICAvLyBBZGRpbmcgb2Zmc2V0XG4gICAgY29uc3QgYXZnUmFuZ2VTdGFydCA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIGJ1Y2tldFdpZHRoKSArIDEgKyBzdGFydDtcbiAgICBjb25zdCBhdmdSYW5nZUVuZCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgKyAyKSAqIGJ1Y2tldFdpZHRoKSArIDEsIGNvdW50KSArIHN0YXJ0O1xuICAgIGNvbnN0IGF2Z1JhbmdlTGVuZ3RoID0gYXZnUmFuZ2VFbmQgLSBhdmdSYW5nZVN0YXJ0O1xuXG4gICAgZm9yIChqID0gYXZnUmFuZ2VTdGFydDsgaiA8IGF2Z1JhbmdlRW5kOyBqKyspIHtcbiAgICAgIGF2Z1ggKz0gZGF0YVtqXS54O1xuICAgICAgYXZnWSArPSBkYXRhW2pdLnk7XG4gICAgfVxuXG4gICAgYXZnWCAvPSBhdmdSYW5nZUxlbmd0aDtcbiAgICBhdmdZIC89IGF2Z1JhbmdlTGVuZ3RoO1xuXG4gICAgLy8gQWRkaW5nIG9mZnNldFxuICAgIGNvbnN0IHJhbmdlT2ZmcyA9IE1hdGguZmxvb3IoaSAqIGJ1Y2tldFdpZHRoKSArIDEgKyBzdGFydDtcbiAgICBjb25zdCByYW5nZVRvID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSArIDEpICogYnVja2V0V2lkdGgpICsgMSwgY291bnQpICsgc3RhcnQ7XG4gICAgY29uc3Qge3g6IHBvaW50QXgsIHk6IHBvaW50QXl9ID0gZGF0YVthXTtcblxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIGNoYW5nZWQgZnJvbSB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHdoaWNoIGluaXRpYWxpemVzIHRoZXNlXG4gICAgLy8gdmFsdWVzIHRvIDEuIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRoYXQgaWYgdGhlIGFyZWEgaXMgc21hbGwsIG5leHRBXG4gICAgLy8gd291bGQgbmV2ZXIgYmUgc2V0IGFuZCB0aHVzIGEgY3Jhc2ggd291bGQgb2NjdXIgaW4gdGhlIG5leHQgbG9vcCBhcyBgYWAgd291bGQgYmVjb21lXG4gICAgLy8gYHVuZGVmaW5lZGAuIFNpbmNlIHRoZSBhcmVhIGlzIGFsd2F5cyBwb3NpdGl2ZSwgYnV0IGNvdWxkIGJlIDAgaW4gdGhlIGNhc2Ugb2YgYSBmbGF0IHRyYWNlLFxuICAgIC8vIGluaXRpYWxpemluZyB3aXRoIGEgbmVnYXRpdmUgbnVtYmVyIGlzIHRoZSBjb3JyZWN0IHNvbHV0aW9uLlxuICAgIG1heEFyZWEgPSBhcmVhID0gLTE7XG5cbiAgICBmb3IgKGogPSByYW5nZU9mZnM7IGogPCByYW5nZVRvOyBqKyspIHtcbiAgICAgIGFyZWEgPSAwLjUgKiBNYXRoLmFicyhcbiAgICAgICAgKHBvaW50QXggLSBhdmdYKSAqIChkYXRhW2pdLnkgLSBwb2ludEF5KSAtXG4gICAgICAgIChwb2ludEF4IC0gZGF0YVtqXS54KSAqIChhdmdZIC0gcG9pbnRBeSlcbiAgICAgICk7XG5cbiAgICAgIGlmIChhcmVhID4gbWF4QXJlYSkge1xuICAgICAgICBtYXhBcmVhID0gYXJlYTtcbiAgICAgICAgbWF4QXJlYVBvaW50ID0gZGF0YVtqXTtcbiAgICAgICAgbmV4dEEgPSBqO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlY2ltYXRlZFtzYW1wbGVkSW5kZXgrK10gPSBtYXhBcmVhUG9pbnQ7XG4gICAgYSA9IG5leHRBO1xuICB9XG5cbiAgLy8gSW5jbHVkZSB0aGUgbGFzdCBwb2ludFxuICBkZWNpbWF0ZWRbc2FtcGxlZEluZGV4KytdID0gZGF0YVtlbmRJbmRleF07XG5cbiAgcmV0dXJuIGRlY2ltYXRlZDtcbn1cblxuZnVuY3Rpb24gbWluTWF4RGVjaW1hdGlvbihkYXRhLCBzdGFydCwgY291bnQsIGF2YWlsYWJsZVdpZHRoKSB7XG4gIGxldCBhdmdYID0gMDtcbiAgbGV0IGNvdW50WCA9IDA7XG4gIGxldCBpLCBwb2ludCwgeCwgeSwgcHJldlgsIG1pbkluZGV4LCBtYXhJbmRleCwgc3RhcnRJbmRleCwgbWluWSwgbWF4WTtcbiAgY29uc3QgZGVjaW1hdGVkID0gW107XG4gIGNvbnN0IGVuZEluZGV4ID0gc3RhcnQgKyBjb3VudCAtIDE7XG5cbiAgY29uc3QgeE1pbiA9IGRhdGFbc3RhcnRdLng7XG4gIGNvbnN0IHhNYXggPSBkYXRhW2VuZEluZGV4XS54O1xuICBjb25zdCBkeCA9IHhNYXggLSB4TWluO1xuXG4gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7XG4gICAgcG9pbnQgPSBkYXRhW2ldO1xuICAgIHggPSAocG9pbnQueCAtIHhNaW4pIC8gZHggKiBhdmFpbGFibGVXaWR0aDtcbiAgICB5ID0gcG9pbnQueTtcbiAgICBjb25zdCB0cnVuY1ggPSB4IHwgMDtcblxuICAgIGlmICh0cnVuY1ggPT09IHByZXZYKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgYG1pbllgIC8gYG1heFlgIGFuZCBgYXZnWGAgd2hpbGUgd2Ugc3RheSB3aXRoaW4gc2FtZSB4LXBvc2l0aW9uXG4gICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgbWluWSA9IHk7XG4gICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoeSA+IG1heFkpIHtcbiAgICAgICAgbWF4WSA9IHk7XG4gICAgICAgIG1heEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBmaXJzdCBwb2ludCBpbiBncm91cCwgY291bnRYIGlzIGAwYCwgc28gYXZlcmFnZSB3aWxsIGJlIGB4YCAvIDEuXG4gICAgICAvLyBVc2UgcG9pbnQueCBoZXJlIGJlY2F1c2Ugd2UncmUgY29tcHV0aW5nIHRoZSBhdmVyYWdlIGRhdGEgYHhgIHZhbHVlXG4gICAgICBhdmdYID0gKGNvdW50WCAqIGF2Z1ggKyBwb2ludC54KSAvICsrY291bnRYO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQdXNoIHVwIHRvIDQgcG9pbnRzLCAzIGZvciB0aGUgbGFzdCBpbnRlcnZhbCBhbmQgdGhlIGZpcnN0IHBvaW50IGZvciB0aGlzIGludGVydmFsXG4gICAgICBjb25zdCBsYXN0SW5kZXggPSBpIC0gMTtcblxuICAgICAgaWYgKCFpc051bGxPclVuZGVmKG1pbkluZGV4KSAmJiAhaXNOdWxsT3JVbmRlZihtYXhJbmRleCkpIHtcbiAgICAgICAgLy8gVGhlIGludGVydmFsIGlzIGRlZmluZWQgYnkgNCBwb2ludHM6IHN0YXJ0LCBtaW4sIG1heCwgZW5kLlxuICAgICAgICAvLyBUaGUgc3RhcnRpbmcgcG9pbnQgaXMgYWxyZWFkeSBjb25zaWRlcmVkIGF0IHRoaXMgcG9pbnQsIHNvIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoaWNoXG4gICAgICAgIC8vIG9mIHRoZSBvdGhlciBwb2ludHMgdG8gYWRkLiBXZSBuZWVkIHRvIHNvcnQgdGhlc2UgcG9pbnRzIHRvIGVuc3VyZSB0aGUgZGVjaW1hdGVkIGRhdGFcbiAgICAgICAgLy8gaXMgc3RpbGwgc29ydGVkIGFuZCB0aGVuIGVuc3VyZSB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcy5cbiAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXgxID0gTWF0aC5taW4obWluSW5kZXgsIG1heEluZGV4KTtcbiAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXgyID0gTWF0aC5tYXgobWluSW5kZXgsIG1heEluZGV4KTtcblxuICAgICAgICBpZiAoaW50ZXJtZWRpYXRlSW5kZXgxICE9PSBzdGFydEluZGV4ICYmIGludGVybWVkaWF0ZUluZGV4MSAhPT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgZGVjaW1hdGVkLnB1c2goe1xuICAgICAgICAgICAgLi4uZGF0YVtpbnRlcm1lZGlhdGVJbmRleDFdLFxuICAgICAgICAgICAgeDogYXZnWCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJtZWRpYXRlSW5kZXgyICE9PSBzdGFydEluZGV4ICYmIGludGVybWVkaWF0ZUluZGV4MiAhPT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgZGVjaW1hdGVkLnB1c2goe1xuICAgICAgICAgICAgLi4uZGF0YVtpbnRlcm1lZGlhdGVJbmRleDJdLFxuICAgICAgICAgICAgeDogYXZnWFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxhc3RJbmRleCA9PT0gc3RhcnRJbmRleCB3aWxsIG9jY3VyIHdoZW4gYSByYW5nZSBoYXMgb25seSAxIHBvaW50IHdoaWNoIGNvdWxkXG4gICAgICAvLyBoYXBwZW4gd2l0aCB2ZXJ5IHVuZXZlbiBkYXRhXG4gICAgICBpZiAoaSA+IDAgJiYgbGFzdEluZGV4ICE9PSBzdGFydEluZGV4KSB7XG4gICAgICAgIC8vIExhc3QgcG9pbnQgaW4gdGhlIHByZXZpb3VzIGludGVydmFsXG4gICAgICAgIGRlY2ltYXRlZC5wdXNoKGRhdGFbbGFzdEluZGV4XSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IG9mIHRoZSBuZXcgaW50ZXJ2YWxcbiAgICAgIGRlY2ltYXRlZC5wdXNoKHBvaW50KTtcbiAgICAgIHByZXZYID0gdHJ1bmNYO1xuICAgICAgY291bnRYID0gMDtcbiAgICAgIG1pblkgPSBtYXhZID0geTtcbiAgICAgIG1pbkluZGV4ID0gbWF4SW5kZXggPSBzdGFydEluZGV4ID0gaTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVjaW1hdGVkO1xufVxuXG5mdW5jdGlvbiBjbGVhbkRlY2ltYXRlZERhdGFzZXQoZGF0YXNldCkge1xuICBpZiAoZGF0YXNldC5fZGVjaW1hdGVkKSB7XG4gICAgY29uc3QgZGF0YSA9IGRhdGFzZXQuX2RhdGE7XG4gICAgZGVsZXRlIGRhdGFzZXQuX2RlY2ltYXRlZDtcbiAgICBkZWxldGUgZGF0YXNldC5fZGF0YTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YXNldCwgJ2RhdGEnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZGF0YSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhbkRlY2ltYXRlZERhdGEoY2hhcnQpIHtcbiAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0KSA9PiB7XG4gICAgY2xlYW5EZWNpbWF0ZWREYXRhc2V0KGRhdGFzZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50c1NpbXBsaWZpZWQobWV0YSwgcG9pbnRzKSB7XG4gIGNvbnN0IHBvaW50Q291bnQgPSBwb2ludHMubGVuZ3RoO1xuXG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBjb3VudDtcblxuICBjb25zdCB7aVNjYWxlfSA9IG1ldGE7XG4gIGNvbnN0IHttaW4sIG1heCwgbWluRGVmaW5lZCwgbWF4RGVmaW5lZH0gPSBpU2NhbGUuZ2V0VXNlckJvdW5kcygpO1xuXG4gIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgc3RhcnQgPSBfbGltaXRWYWx1ZShfbG9va3VwQnlLZXkocG9pbnRzLCBpU2NhbGUuYXhpcywgbWluKS5sbywgMCwgcG9pbnRDb3VudCAtIDEpO1xuICB9XG4gIGlmIChtYXhEZWZpbmVkKSB7XG4gICAgY291bnQgPSBfbGltaXRWYWx1ZShfbG9va3VwQnlLZXkocG9pbnRzLCBpU2NhbGUuYXhpcywgbWF4KS5oaSArIDEsIHN0YXJ0LCBwb2ludENvdW50KSAtIHN0YXJ0O1xuICB9IGVsc2Uge1xuICAgIGNvdW50ID0gcG9pbnRDb3VudCAtIHN0YXJ0O1xuICB9XG5cbiAgcmV0dXJuIHtzdGFydCwgY291bnR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnZGVjaW1hdGlvbicsXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBhbGdvcml0aG06ICdtaW4tbWF4JyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgfSxcblxuICBiZWZvcmVFbGVtZW50c1VwZGF0ZTogKGNoYXJ0LCBhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKCFvcHRpb25zLmVuYWJsZWQpIHtcbiAgICAgIC8vIFRoZSBkZWNpbWF0aW9uIHBsdWdpbiBtYXkgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZW5hYmxlZC4gTmVlZCB0byByZW1vdmUgb2xkIGBkYXRhc2V0Ll9kYXRhYCBoYW5kbGVyc1xuICAgICAgY2xlYW5EZWNpbWF0ZWREYXRhKGNoYXJ0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBc3N1bWUgdGhlIGVudGlyZSBjaGFydCBpcyBhdmFpbGFibGUgdG8gc2hvdyBhIGZldyBtb3JlIHBvaW50cyB0aGFuIG5lZWRlZFxuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY2hhcnQud2lkdGg7XG5cbiAgICBjaGFydC5kYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkgPT4ge1xuICAgICAgY29uc3Qge19kYXRhLCBpbmRleEF4aXN9ID0gZGF0YXNldDtcbiAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuICAgICAgY29uc3QgZGF0YSA9IF9kYXRhIHx8IGRhdGFzZXQuZGF0YTtcblxuICAgICAgaWYgKHJlc29sdmUoW2luZGV4QXhpcywgY2hhcnQub3B0aW9ucy5pbmRleEF4aXNdKSA9PT0gJ3knKSB7XG4gICAgICAgIC8vIERlY2ltYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIGxpbmVzIHRoYXQgaGF2ZSBhbiBYIGluZGV4QXhpc1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghbWV0YS5jb250cm9sbGVyLnN1cHBvcnRzRGVjaW1hdGlvbikge1xuICAgICAgICAvLyBPbmx5IGxpbmUgZGF0YXNldHMgYXJlIHN1cHBvcnRlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHhBeGlzID0gY2hhcnQuc2NhbGVzW21ldGEueEF4aXNJRF07XG4gICAgICBpZiAoeEF4aXMudHlwZSAhPT0gJ2xpbmVhcicgJiYgeEF4aXMudHlwZSAhPT0gJ3RpbWUnKSB7XG4gICAgICAgIC8vIE9ubHkgbGluZWFyIGludGVycG9sYXRpb24gaXMgc3VwcG9ydGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXJ0Lm9wdGlvbnMucGFyc2luZykge1xuICAgICAgICAvLyBQbHVnaW4gb25seSBzdXBwb3J0cyBkYXRhIHRoYXQgZG9lcyBub3QgbmVlZCBwYXJzaW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHtzdGFydCwgY291bnR9ID0gZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50c1NpbXBsaWZpZWQobWV0YSwgZGF0YSk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSBvcHRpb25zLnRocmVzaG9sZCB8fCA0ICogYXZhaWxhYmxlV2lkdGg7XG4gICAgICBpZiAoY291bnQgPD0gdGhyZXNob2xkKSB7XG4gICAgICAgIC8vIE5vIGRlY2ltYXRpb24gaXMgcmVxdWlyZWQgdW50aWwgd2UgYXJlIGFib3ZlIHRoaXMgdGhyZXNob2xkXG4gICAgICAgIGNsZWFuRGVjaW1hdGVkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZihfZGF0YSkpIHtcbiAgICAgICAgLy8gRmlyc3QgdGltZSB3ZSBhcmUgc2VlaW5nIHRoaXMgZGF0YXNldFxuICAgICAgICAvLyBXZSBvdmVycmlkZSB0aGUgJ2RhdGEnIHByb3BlcnR5IHdpdGggYSBzZXR0ZXIgdGhhdCBzdG9yZXMgdGhlXG4gICAgICAgIC8vIHJhdyBkYXRhIGluIF9kYXRhLCBidXQgcmVhZHMgdGhlIGRlY2ltYXRlZCBkYXRhIGZyb20gX2RlY2ltYXRlZFxuICAgICAgICBkYXRhc2V0Ll9kYXRhID0gZGF0YTtcbiAgICAgICAgZGVsZXRlIGRhdGFzZXQuZGF0YTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGFzZXQsICdkYXRhJywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjaW1hdGVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhID0gZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQb2ludCB0aGUgY2hhcnQgdG8gdGhlIGRlY2ltYXRlZCBkYXRhXG4gICAgICBsZXQgZGVjaW1hdGVkO1xuICAgICAgc3dpdGNoIChvcHRpb25zLmFsZ29yaXRobSkge1xuICAgICAgY2FzZSAnbHR0Yic6XG4gICAgICAgIGRlY2ltYXRlZCA9IGx0dGJEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbi1tYXgnOlxuICAgICAgICBkZWNpbWF0ZWQgPSBtaW5NYXhEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVjaW1hdGlvbiBhbGdvcml0aG0gJyR7b3B0aW9ucy5hbGdvcml0aG19J2ApO1xuICAgICAgfVxuXG4gICAgICBkYXRhc2V0Ll9kZWNpbWF0ZWQgPSBkZWNpbWF0ZWQ7XG4gICAgfSk7XG4gIH0sXG5cbiAgZGVzdHJveShjaGFydCkge1xuICAgIGNsZWFuRGVjaW1hdGVkRGF0YShjaGFydCk7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtfYm91bmRTZWdtZW50LCBfYm91bmRTZWdtZW50cywgX25vcm1hbGl6ZUFuZ2xlfSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIF9zZWdtZW50cyhsaW5lLCB0YXJnZXQsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IHRwb2ludHMgPSB0YXJnZXQucG9pbnRzO1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGxldCB7c3RhcnQsIGVuZH0gPSBzZWdtZW50O1xuICAgIGVuZCA9IF9maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBwb2ludHMpO1xuXG4gICAgY29uc3QgYm91bmRzID0gX2dldEJvdW5kcyhwcm9wZXJ0eSwgcG9pbnRzW3N0YXJ0XSwgcG9pbnRzW2VuZF0sIHNlZ21lbnQubG9vcCk7XG5cbiAgICBpZiAoIXRhcmdldC5zZWdtZW50cykge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBib3VuZGFyeSBub3Qgc3VwcG9ydGluZyBgc2VnbWVudHNgIChzaW1wbGVBcmMpXG4gICAgICAvLyBCb3VuZHMgYXJlIHByb3ZpZGVkIGFzIGB0YXJnZXRgIGZvciBwYXJ0aWFsIGNpcmNsZSwgb3IgdW5kZWZpbmVkIGZvciBmdWxsIGNpcmNsZVxuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIHNvdXJjZTogc2VnbWVudCxcbiAgICAgICAgdGFyZ2V0OiBib3VuZHMsXG4gICAgICAgIHN0YXJ0OiBwb2ludHNbc3RhcnRdLFxuICAgICAgICBlbmQ6IHBvaW50c1tlbmRdXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgc2VnbWVudHMgZnJvbSBgdGFyZ2V0YCB0aGF0IGludGVyc2VjdCB0aGUgYm91bmRzIG9mIGN1cnJlbnQgc2VnbWVudCBvZiBgbGluZWBcbiAgICBjb25zdCB0YXJnZXRTZWdtZW50cyA9IF9ib3VuZFNlZ21lbnRzKHRhcmdldCwgYm91bmRzKTtcblxuICAgIGZvciAoY29uc3QgdGd0IG9mIHRhcmdldFNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBzdWJCb3VuZHMgPSBfZ2V0Qm91bmRzKHByb3BlcnR5LCB0cG9pbnRzW3RndC5zdGFydF0sIHRwb2ludHNbdGd0LmVuZF0sIHRndC5sb29wKTtcbiAgICAgIGNvbnN0IGZpbGxTb3VyY2VzID0gX2JvdW5kU2VnbWVudChzZWdtZW50LCBwb2ludHMsIHN1YkJvdW5kcyk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsbFNvdXJjZSBvZiBmaWxsU291cmNlcykge1xuICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IGZpbGxTb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIFtwcm9wZXJ0eV06IF9nZXRFZGdlKGJvdW5kcywgc3ViQm91bmRzLCAnc3RhcnQnLCBNYXRoLm1heClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgW3Byb3BlcnR5XTogX2dldEVkZ2UoYm91bmRzLCBzdWJCb3VuZHMsICdlbmQnLCBNYXRoLm1pbilcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0Qm91bmRzKHByb3BlcnR5LCBmaXJzdCwgbGFzdCwgbG9vcCkge1xuICBpZiAobG9vcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgc3RhcnQgPSBmaXJzdFtwcm9wZXJ0eV07XG4gIGxldCBlbmQgPSBsYXN0W3Byb3BlcnR5XTtcblxuICBpZiAocHJvcGVydHkgPT09ICdhbmdsZScpIHtcbiAgICBzdGFydCA9IF9ub3JtYWxpemVBbmdsZShzdGFydCk7XG4gICAgZW5kID0gX25vcm1hbGl6ZUFuZ2xlKGVuZCk7XG4gIH1cbiAgcmV0dXJuIHtwcm9wZXJ0eSwgc3RhcnQsIGVuZH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcG9pbnRzRnJvbVNlZ21lbnRzKGJvdW5kYXJ5LCBsaW5lKSB7XG4gIGNvbnN0IHt4ID0gbnVsbCwgeSA9IG51bGx9ID0gYm91bmRhcnkgfHwge307XG4gIGNvbnN0IGxpbmVQb2ludHMgPSBsaW5lLnBvaW50cztcbiAgY29uc3QgcG9pbnRzID0gW107XG4gIGxpbmUuc2VnbWVudHMuZm9yRWFjaCgoe3N0YXJ0LCBlbmR9KSA9PiB7XG4gICAgZW5kID0gX2ZpbmRTZWdtZW50RW5kKHN0YXJ0LCBlbmQsIGxpbmVQb2ludHMpO1xuICAgIGNvbnN0IGZpcnN0ID0gbGluZVBvaW50c1tzdGFydF07XG4gICAgY29uc3QgbGFzdCA9IGxpbmVQb2ludHNbZW5kXTtcbiAgICBpZiAoeSAhPT0gbnVsbCkge1xuICAgICAgcG9pbnRzLnB1c2goe3g6IGZpcnN0LngsIHl9KTtcbiAgICAgIHBvaW50cy5wdXNoKHt4OiBsYXN0LngsIHl9KTtcbiAgICB9IGVsc2UgaWYgKHggIT09IG51bGwpIHtcbiAgICAgIHBvaW50cy5wdXNoKHt4LCB5OiBmaXJzdC55fSk7XG4gICAgICBwb2ludHMucHVzaCh7eCwgeTogbGFzdC55fSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBvaW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBwb2ludHMpIHtcbiAgZm9yICg7ZW5kID4gc3RhcnQ7IGVuZC0tKSB7XG4gICAgY29uc3QgcG9pbnQgPSBwb2ludHNbZW5kXTtcbiAgICBpZiAoIWlzTmFOKHBvaW50LngpICYmICFpc05hTihwb2ludC55KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbmQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRFZGdlKGEsIGIsIHByb3AsIGZuKSB7XG4gIGlmIChhICYmIGIpIHtcbiAgICByZXR1cm4gZm4oYVtwcm9wXSwgYltwcm9wXSk7XG4gIH1cbiAgcmV0dXJuIGEgPyBhW3Byb3BdIDogYiA/IGJbcHJvcF0gOiAwO1xufVxuIiwgIi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2NvcmUvY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IENoYXJ0XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vY29yZS9jb3JlLnNjYWxlLmpzJykuZGVmYXVsdCB9IFNjYWxlXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvZWxlbWVudC5wb2ludC5qcycpLmRlZmF1bHQgfSBQb2ludEVsZW1lbnRcbiAqL1xuXG5pbXBvcnQge0xpbmVFbGVtZW50fSBmcm9tICcuLi8uLi9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQge2lzQXJyYXl9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHtfcG9pbnRzRnJvbVNlZ21lbnRzfSBmcm9tICcuL2ZpbGxlci5zZWdtZW50LmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge1BvaW50RWxlbWVudFtdIHwgeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfX0gYm91bmRhcnlcbiAqIEBwYXJhbSB7TGluZUVsZW1lbnR9IGxpbmVcbiAqIEByZXR1cm4ge0xpbmVFbGVtZW50P31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jcmVhdGVCb3VuZGFyeUxpbmUoYm91bmRhcnksIGxpbmUpIHtcbiAgbGV0IHBvaW50cyA9IFtdO1xuICBsZXQgX2xvb3AgPSBmYWxzZTtcblxuICBpZiAoaXNBcnJheShib3VuZGFyeSkpIHtcbiAgICBfbG9vcCA9IHRydWU7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHBvaW50cyA9IGJvdW5kYXJ5O1xuICB9IGVsc2Uge1xuICAgIHBvaW50cyA9IF9wb2ludHNGcm9tU2VnbWVudHMoYm91bmRhcnksIGxpbmUpO1xuICB9XG5cbiAgcmV0dXJuIHBvaW50cy5sZW5ndGggPyBuZXcgTGluZUVsZW1lbnQoe1xuICAgIHBvaW50cyxcbiAgICBvcHRpb25zOiB7dGVuc2lvbjogMH0sXG4gICAgX2xvb3AsXG4gICAgX2Z1bGxMb29wOiBfbG9vcFxuICB9KSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2hvdWxkQXBwbHlGaWxsKHNvdXJjZSkge1xuICByZXR1cm4gc291cmNlICYmIHNvdXJjZS5maWxsICE9PSBmYWxzZTtcbn1cbiIsICJpbXBvcnQge2lzT2JqZWN0LCBpc0Zpbml0ZSwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uLy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vY29yZS9jb3JlLnNjYWxlLmpzJykuZGVmYXVsdCB9IFNjYWxlXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvZWxlbWVudC5saW5lLmpzJykuZGVmYXVsdCB9IExpbmVFbGVtZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vdHlwZXMvaW5kZXguanMnKS5GaWxsVGFyZ2V0IH0gRmlsbFRhcmdldFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL3R5cGVzL2luZGV4LmpzJykuQ29tcGxleEZpbGxUYXJnZXQgfSBDb21wbGV4RmlsbFRhcmdldFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBfcmVzb2x2ZVRhcmdldChzb3VyY2VzLCBpbmRleCwgcHJvcGFnYXRlKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICBsZXQgZmlsbCA9IHNvdXJjZS5maWxsO1xuICBjb25zdCB2aXNpdGVkID0gW2luZGV4XTtcbiAgbGV0IHRhcmdldDtcblxuICBpZiAoIXByb3BhZ2F0ZSkge1xuICAgIHJldHVybiBmaWxsO1xuICB9XG5cbiAgd2hpbGUgKGZpbGwgIT09IGZhbHNlICYmIHZpc2l0ZWQuaW5kZXhPZihmaWxsKSA9PT0gLTEpIHtcbiAgICBpZiAoIWlzRmluaXRlKGZpbGwpKSB7XG4gICAgICByZXR1cm4gZmlsbDtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBzb3VyY2VzW2ZpbGxdO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC52aXNpYmxlKSB7XG4gICAgICByZXR1cm4gZmlsbDtcbiAgICB9XG5cbiAgICB2aXNpdGVkLnB1c2goZmlsbCk7XG4gICAgZmlsbCA9IHRhcmdldC5maWxsO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7TGluZUVsZW1lbnR9IGxpbmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZGVjb2RlRmlsbChsaW5lLCBpbmRleCwgY291bnQpIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB7dmFsdWU6IG51bWJlcn19ICovXG4gIGNvbnN0IGZpbGwgPSBwYXJzZUZpbGxPcHRpb24obGluZSk7XG5cbiAgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgcmV0dXJuIGlzTmFOKGZpbGwudmFsdWUpID8gZmFsc2UgOiBmaWxsO1xuICB9XG5cbiAgbGV0IHRhcmdldCA9IHBhcnNlRmxvYXQoZmlsbCk7XG5cbiAgaWYgKGlzRmluaXRlKHRhcmdldCkgJiYgTWF0aC5mbG9vcih0YXJnZXQpID09PSB0YXJnZXQpIHtcbiAgICByZXR1cm4gZGVjb2RlVGFyZ2V0SW5kZXgoZmlsbFswXSwgaW5kZXgsIHRhcmdldCwgY291bnQpO1xuICB9XG5cbiAgcmV0dXJuIFsnb3JpZ2luJywgJ3N0YXJ0JywgJ2VuZCcsICdzdGFjaycsICdzaGFwZSddLmluZGV4T2YoZmlsbCkgPj0gMCAmJiBmaWxsO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVUYXJnZXRJbmRleChmaXJzdENoLCBpbmRleCwgdGFyZ2V0LCBjb3VudCkge1xuICBpZiAoZmlyc3RDaCA9PT0gJy0nIHx8IGZpcnN0Q2ggPT09ICcrJykge1xuICAgIHRhcmdldCA9IGluZGV4ICsgdGFyZ2V0O1xuICB9XG5cbiAgaWYgKHRhcmdldCA9PT0gaW5kZXggfHwgdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gY291bnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RmlsbFRhcmdldCB8IENvbXBsZXhGaWxsVGFyZ2V0fSBmaWxsXG4gKiBAcGFyYW0ge1NjYWxlfSBzY2FsZVxuICogQHJldHVybnMge251bWJlciB8IG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0VGFyZ2V0UGl4ZWwoZmlsbCwgc2NhbGUpIHtcbiAgbGV0IHBpeGVsID0gbnVsbDtcbiAgaWYgKGZpbGwgPT09ICdzdGFydCcpIHtcbiAgICBwaXhlbCA9IHNjYWxlLmJvdHRvbTtcbiAgfSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuICAgIHBpeGVsID0gc2NhbGUudG9wO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHBpeGVsID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShmaWxsLnZhbHVlKTtcbiAgfSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUGl4ZWwpIHtcbiAgICBwaXhlbCA9IHNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICB9XG4gIHJldHVybiBwaXhlbDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0ZpbGxUYXJnZXQgfCBDb21wbGV4RmlsbFRhcmdldH0gZmlsbFxuICogQHBhcmFtIHtTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldFRhcmdldFZhbHVlKGZpbGwsIHNjYWxlLCBzdGFydFZhbHVlKSB7XG4gIGxldCB2YWx1ZTtcblxuICBpZiAoZmlsbCA9PT0gJ3N0YXJ0Jykge1xuICAgIHZhbHVlID0gc3RhcnRWYWx1ZTtcbiAgfSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuICAgIHZhbHVlID0gc2NhbGUub3B0aW9ucy5yZXZlcnNlID8gc2NhbGUubWluIDogc2NhbGUubWF4O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZhbHVlID0gZmlsbC52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IHNjYWxlLmdldEJhc2VWYWx1ZSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRmlsbE9wdGlvbihsaW5lKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBsaW5lLm9wdGlvbnM7XG4gIGNvbnN0IGZpbGxPcHRpb24gPSBvcHRpb25zLmZpbGw7XG4gIGxldCBmaWxsID0gdmFsdWVPckRlZmF1bHQoZmlsbE9wdGlvbiAmJiBmaWxsT3B0aW9uLnRhcmdldCwgZmlsbE9wdGlvbik7XG5cbiAgaWYgKGZpbGwgPT09IHVuZGVmaW5lZCkge1xuICAgIGZpbGwgPSAhIW9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgaWYgKGZpbGwgPT09IGZhbHNlIHx8IGZpbGwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoZmlsbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnb3JpZ2luJztcbiAgfVxuICByZXR1cm4gZmlsbDtcbn1cbiIsICIvKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi8uLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2NvcmUvY29yZS5zY2FsZS5qcycpLmRlZmF1bHQgfSBTY2FsZVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL2VsZW1lbnQucG9pbnQuanMnKS5kZWZhdWx0IH0gUG9pbnRFbGVtZW50XG4gKi9cblxuaW1wb3J0IHtMaW5lRWxlbWVudH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHtfaXNCZXR3ZWVufSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCB7X2NyZWF0ZUJvdW5kYXJ5TGluZX0gZnJvbSAnLi9maWxsZXIuaGVscGVyLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3sgY2hhcnQ6IENoYXJ0OyBzY2FsZTogU2NhbGU7IGluZGV4OiBudW1iZXI7IGxpbmU6IExpbmVFbGVtZW50OyB9fSBzb3VyY2VcbiAqIEByZXR1cm4ge0xpbmVFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2J1aWxkU3RhY2tMaW5lKHNvdXJjZSkge1xuICBjb25zdCB7c2NhbGUsIGluZGV4LCBsaW5lfSA9IHNvdXJjZTtcbiAgY29uc3QgcG9pbnRzID0gW107XG4gIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgY29uc3Qgc291cmNlUG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IGxpbmVzQmVsb3cgPSBnZXRMaW5lc0JlbG93KHNjYWxlLCBpbmRleCk7XG4gIGxpbmVzQmVsb3cucHVzaChfY3JlYXRlQm91bmRhcnlMaW5lKHt4OiBudWxsLCB5OiBzY2FsZS5ib3R0b219LCBsaW5lKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICBmb3IgKGxldCBqID0gc2VnbWVudC5zdGFydDsgaiA8PSBzZWdtZW50LmVuZDsgaisrKSB7XG4gICAgICBhZGRQb2ludHNCZWxvdyhwb2ludHMsIHNvdXJjZVBvaW50c1tqXSwgbGluZXNCZWxvdyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgTGluZUVsZW1lbnQoe3BvaW50cywgb3B0aW9uczoge319KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1NjYWxlfSBzY2FsZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtMaW5lRWxlbWVudFtdfVxuICovXG5mdW5jdGlvbiBnZXRMaW5lc0JlbG93KHNjYWxlLCBpbmRleCkge1xuICBjb25zdCBiZWxvdyA9IFtdO1xuICBjb25zdCBtZXRhcyA9IHNjYWxlLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCdsaW5lJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1tpXTtcbiAgICBpZiAobWV0YS5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIW1ldGEuaGlkZGVuKSB7XG4gICAgICBiZWxvdy51bnNoaWZ0KG1ldGEuZGF0YXNldCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZWxvdztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1BvaW50RWxlbWVudFtdfSBwb2ludHNcbiAqIEBwYXJhbSB7UG9pbnRFbGVtZW50fSBzb3VyY2VQb2ludFxuICogQHBhcmFtIHtMaW5lRWxlbWVudFtdfSBsaW5lc0JlbG93XG4gKi9cbmZ1bmN0aW9uIGFkZFBvaW50c0JlbG93KHBvaW50cywgc291cmNlUG9pbnQsIGxpbmVzQmVsb3cpIHtcbiAgY29uc3QgcG9zdHBvbmVkID0gW107XG4gIGZvciAobGV0IGogPSAwOyBqIDwgbGluZXNCZWxvdy5sZW5ndGg7IGorKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc0JlbG93W2pdO1xuICAgIGNvbnN0IHtmaXJzdCwgbGFzdCwgcG9pbnR9ID0gZmluZFBvaW50KGxpbmUsIHNvdXJjZVBvaW50LCAneCcpO1xuXG4gICAgaWYgKCFwb2ludCB8fCAoZmlyc3QgJiYgbGFzdCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIC8vIEZpcnN0IHBvaW50IG9mIGFuIHNlZ21lbnQgLT4gbmVlZCB0byBhZGQgYW5vdGhlciBwb2ludCBiZWZvcmUgdGhpcyxcbiAgICAgIC8vIGZyb20gbmV4dCBsaW5lIGJlbG93LlxuICAgICAgcG9zdHBvbmVkLnVuc2hpZnQocG9pbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiBzZWdtZW50LCBubyBuZWVkIHRvIGFkZCBtb3JlIHBvaW50cy5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBvaW50cy5wdXNoKC4uLnBvc3Rwb25lZCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtMaW5lRWxlbWVudH0gbGluZVxuICogQHBhcmFtIHtQb2ludEVsZW1lbnR9IHNvdXJjZVBvaW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlcbiAqIEByZXR1cm5zIHt7cG9pbnQ/OiBQb2ludEVsZW1lbnQsIGZpcnN0PzogYm9vbGVhbiwgbGFzdD86IGJvb2xlYW59fVxuICovXG5mdW5jdGlvbiBmaW5kUG9pbnQobGluZSwgc291cmNlUG9pbnQsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHBvaW50ID0gbGluZS5pbnRlcnBvbGF0ZShzb3VyY2VQb2ludCwgcHJvcGVydHkpO1xuICBpZiAoIXBvaW50KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgcG9pbnRWYWx1ZSA9IHBvaW50W3Byb3BlcnR5XTtcbiAgY29uc3Qgc2VnbWVudHMgPSBsaW5lLnNlZ21lbnRzO1xuICBjb25zdCBsaW5lUG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGxldCBmaXJzdCA9IGZhbHNlO1xuICBsZXQgbGFzdCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBsaW5lUG9pbnRzW3NlZ21lbnQuc3RhcnRdW3Byb3BlcnR5XTtcbiAgICBjb25zdCBsYXN0VmFsdWUgPSBsaW5lUG9pbnRzW3NlZ21lbnQuZW5kXVtwcm9wZXJ0eV07XG4gICAgaWYgKF9pc0JldHdlZW4ocG9pbnRWYWx1ZSwgZmlyc3RWYWx1ZSwgbGFzdFZhbHVlKSkge1xuICAgICAgZmlyc3QgPSBwb2ludFZhbHVlID09PSBmaXJzdFZhbHVlO1xuICAgICAgbGFzdCA9IHBvaW50VmFsdWUgPT09IGxhc3RWYWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge2ZpcnN0LCBsYXN0LCBwb2ludH07XG59XG4iLCAiaW1wb3J0IHtUQVV9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG4vLyBUT0RPOiB1c2UgZWxlbWVudHMuQXJjRWxlbWVudCBpbnN0ZWFkXG5leHBvcnQgY2xhc3Mgc2ltcGxlQXJjIHtcbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIHRoaXMueCA9IG9wdHMueDtcbiAgICB0aGlzLnkgPSBvcHRzLnk7XG4gICAgdGhpcy5yYWRpdXMgPSBvcHRzLnJhZGl1cztcbiAgfVxuXG4gIHBhdGhTZWdtZW50KGN0eCwgYm91bmRzLCBvcHRzKSB7XG4gICAgY29uc3Qge3gsIHksIHJhZGl1c30gPSB0aGlzO1xuICAgIGJvdW5kcyA9IGJvdW5kcyB8fCB7c3RhcnQ6IDAsIGVuZDogVEFVfTtcbiAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgYm91bmRzLmVuZCwgYm91bmRzLnN0YXJ0LCB0cnVlKTtcbiAgICByZXR1cm4gIW9wdHMuYm91bmRzO1xuICB9XG5cbiAgaW50ZXJwb2xhdGUocG9pbnQpIHtcbiAgICBjb25zdCB7eCwgeSwgcmFkaXVzfSA9IHRoaXM7XG4gICAgY29uc3QgYW5nbGUgPSBwb2ludC5hbmdsZTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCArIE1hdGguY29zKGFuZ2xlKSAqIHJhZGl1cyxcbiAgICAgIHk6IHkgKyBNYXRoLnNpbihhbmdsZSkgKiByYWRpdXMsXG4gICAgICBhbmdsZVxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQge2lzRmluaXRlfSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCB7X2NyZWF0ZUJvdW5kYXJ5TGluZX0gZnJvbSAnLi9maWxsZXIuaGVscGVyLmpzJztcbmltcG9ydCB7X2dldFRhcmdldFBpeGVsLCBfZ2V0VGFyZ2V0VmFsdWV9IGZyb20gJy4vZmlsbGVyLm9wdGlvbnMuanMnO1xuaW1wb3J0IHtfYnVpbGRTdGFja0xpbmV9IGZyb20gJy4vZmlsbGVyLnRhcmdldC5zdGFjay5qcyc7XG5pbXBvcnQge3NpbXBsZUFyY30gZnJvbSAnLi9zaW1wbGVBcmMuanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi8uLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2NvcmUvY29yZS5zY2FsZS5qcycpLmRlZmF1bHQgfSBTY2FsZVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL2VsZW1lbnQucG9pbnQuanMnKS5kZWZhdWx0IH0gUG9pbnRFbGVtZW50XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRUYXJnZXQoc291cmNlKSB7XG4gIGNvbnN0IHtjaGFydCwgZmlsbCwgbGluZX0gPSBzb3VyY2U7XG5cbiAgaWYgKGlzRmluaXRlKGZpbGwpKSB7XG4gICAgcmV0dXJuIGdldExpbmVCeUluZGV4KGNoYXJ0LCBmaWxsKTtcbiAgfVxuXG4gIGlmIChmaWxsID09PSAnc3RhY2snKSB7XG4gICAgcmV0dXJuIF9idWlsZFN0YWNrTGluZShzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGZpbGwgPT09ICdzaGFwZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kYXJ5ID0gY29tcHV0ZUJvdW5kYXJ5KHNvdXJjZSk7XG5cbiAgaWYgKGJvdW5kYXJ5IGluc3RhbmNlb2Ygc2ltcGxlQXJjKSB7XG4gICAgcmV0dXJuIGJvdW5kYXJ5O1xuICB9XG5cbiAgcmV0dXJuIF9jcmVhdGVCb3VuZGFyeUxpbmUoYm91bmRhcnksIGxpbmUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuZnVuY3Rpb24gZ2V0TGluZUJ5SW5kZXgoY2hhcnQsIGluZGV4KSB7XG4gIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gIGNvbnN0IHZpc2libGUgPSBtZXRhICYmIGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaW5kZXgpO1xuICByZXR1cm4gdmlzaWJsZSA/IG1ldGEuZGF0YXNldCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVCb3VuZGFyeShzb3VyY2UpIHtcbiAgY29uc3Qgc2NhbGUgPSBzb3VyY2Uuc2NhbGUgfHwge307XG5cbiAgaWYgKHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSkge1xuICAgIHJldHVybiBjb21wdXRlQ2lyY3VsYXJCb3VuZGFyeShzb3VyY2UpO1xuICB9XG4gIHJldHVybiBjb21wdXRlTGluZWFyQm91bmRhcnkoc291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBjb21wdXRlTGluZWFyQm91bmRhcnkoc291cmNlKSB7XG4gIGNvbnN0IHtzY2FsZSA9IHt9LCBmaWxsfSA9IHNvdXJjZTtcbiAgY29uc3QgcGl4ZWwgPSBfZ2V0VGFyZ2V0UGl4ZWwoZmlsbCwgc2NhbGUpO1xuXG4gIGlmIChpc0Zpbml0ZShwaXhlbCkpIHtcbiAgICBjb25zdCBob3Jpem9udGFsID0gc2NhbGUuaXNIb3Jpem9udGFsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogaG9yaXpvbnRhbCA/IHBpeGVsIDogbnVsbCxcbiAgICAgIHk6IGhvcml6b250YWwgPyBudWxsIDogcGl4ZWxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVDaXJjdWxhckJvdW5kYXJ5KHNvdXJjZSkge1xuICBjb25zdCB7c2NhbGUsIGZpbGx9ID0gc291cmNlO1xuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcbiAgY29uc3QgbGVuZ3RoID0gc2NhbGUuZ2V0TGFiZWxzKCkubGVuZ3RoO1xuICBjb25zdCBzdGFydCA9IG9wdGlvbnMucmV2ZXJzZSA/IHNjYWxlLm1heCA6IHNjYWxlLm1pbjtcbiAgY29uc3QgdmFsdWUgPSBfZ2V0VGFyZ2V0VmFsdWUoZmlsbCwgc2NhbGUsIHN0YXJ0KTtcbiAgY29uc3QgdGFyZ2V0ID0gW107XG5cbiAgaWYgKG9wdGlvbnMuZ3JpZC5jaXJjdWxhcikge1xuICAgIGNvbnN0IGNlbnRlciA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSgwLCBzdGFydCk7XG4gICAgcmV0dXJuIG5ldyBzaW1wbGVBcmMoe1xuICAgICAgeDogY2VudGVyLngsXG4gICAgICB5OiBjZW50ZXIueSxcbiAgICAgIHJhZGl1czogc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodmFsdWUpXG4gICAgfSk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdGFyZ2V0LnB1c2goc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGksIHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuIiwgImltcG9ydCB7Y2xpcEFyZWEsIHVuY2xpcEFyZWF9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHtfZmluZFNlZ21lbnRFbmQsIF9nZXRCb3VuZHMsIF9zZWdtZW50c30gZnJvbSAnLi9maWxsZXIuc2VnbWVudC5qcyc7XG5pbXBvcnQge19nZXRUYXJnZXR9IGZyb20gJy4vZmlsbGVyLnRhcmdldC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZHJhd2ZpbGwoY3R4LCBzb3VyY2UsIGFyZWEpIHtcbiAgY29uc3QgdGFyZ2V0ID0gX2dldFRhcmdldChzb3VyY2UpO1xuICBjb25zdCB7bGluZSwgc2NhbGUsIGF4aXN9ID0gc291cmNlO1xuICBjb25zdCBsaW5lT3B0cyA9IGxpbmUub3B0aW9ucztcbiAgY29uc3QgZmlsbE9wdGlvbiA9IGxpbmVPcHRzLmZpbGw7XG4gIGNvbnN0IGNvbG9yID0gbGluZU9wdHMuYmFja2dyb3VuZENvbG9yO1xuICBjb25zdCB7YWJvdmUgPSBjb2xvciwgYmVsb3cgPSBjb2xvcn0gPSBmaWxsT3B0aW9uIHx8IHt9O1xuICBpZiAodGFyZ2V0ICYmIGxpbmUucG9pbnRzLmxlbmd0aCkge1xuICAgIGNsaXBBcmVhKGN0eCwgYXJlYSk7XG4gICAgZG9GaWxsKGN0eCwge2xpbmUsIHRhcmdldCwgYWJvdmUsIGJlbG93LCBhcmVhLCBzY2FsZSwgYXhpc30pO1xuICAgIHVuY2xpcEFyZWEoY3R4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkb0ZpbGwoY3R4LCBjZmcpIHtcbiAgY29uc3Qge2xpbmUsIHRhcmdldCwgYWJvdmUsIGJlbG93LCBhcmVhLCBzY2FsZX0gPSBjZmc7XG4gIGNvbnN0IHByb3BlcnR5ID0gbGluZS5fbG9vcCA/ICdhbmdsZScgOiBjZmcuYXhpcztcblxuICBjdHguc2F2ZSgpO1xuXG4gIGlmIChwcm9wZXJ0eSA9PT0gJ3gnICYmIGJlbG93ICE9PSBhYm92ZSkge1xuICAgIGNsaXBWZXJ0aWNhbChjdHgsIHRhcmdldCwgYXJlYS50b3ApO1xuICAgIGZpbGwoY3R4LCB7bGluZSwgdGFyZ2V0LCBjb2xvcjogYWJvdmUsIHNjYWxlLCBwcm9wZXJ0eX0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGFyZWEuYm90dG9tKTtcbiAgfVxuICBmaWxsKGN0eCwge2xpbmUsIHRhcmdldCwgY29sb3I6IGJlbG93LCBzY2FsZSwgcHJvcGVydHl9KTtcblxuICBjdHgucmVzdG9yZSgpO1xufVxuXG5mdW5jdGlvbiBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGNsaXBZKSB7XG4gIGNvbnN0IHtzZWdtZW50cywgcG9pbnRzfSA9IHRhcmdldDtcbiAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgbGV0IGxpbmVMb29wID0gZmFsc2U7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBzZWdtZW50O1xuICAgIGNvbnN0IGZpcnN0UG9pbnQgPSBwb2ludHNbc3RhcnRdO1xuICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1tfZmluZFNlZ21lbnRFbmQoc3RhcnQsIGVuZCwgcG9pbnRzKV07XG4gICAgaWYgKGZpcnN0KSB7XG4gICAgICBjdHgubW92ZVRvKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55KTtcbiAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5saW5lVG8oZmlyc3RQb2ludC54LCBjbGlwWSk7XG4gICAgICBjdHgubGluZVRvKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55KTtcbiAgICB9XG4gICAgbGluZUxvb3AgPSAhIXRhcmdldC5wYXRoU2VnbWVudChjdHgsIHNlZ21lbnQsIHttb3ZlOiBsaW5lTG9vcH0pO1xuICAgIGlmIChsaW5lTG9vcCkge1xuICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHgubGluZVRvKGxhc3RQb2ludC54LCBjbGlwWSk7XG4gICAgfVxuICB9XG5cbiAgY3R4LmxpbmVUbyh0YXJnZXQuZmlyc3QoKS54LCBjbGlwWSk7XG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmNsaXAoKTtcbn1cblxuZnVuY3Rpb24gZmlsbChjdHgsIGNmZykge1xuICBjb25zdCB7bGluZSwgdGFyZ2V0LCBwcm9wZXJ0eSwgY29sb3IsIHNjYWxlfSA9IGNmZztcbiAgY29uc3Qgc2VnbWVudHMgPSBfc2VnbWVudHMobGluZSwgdGFyZ2V0LCBwcm9wZXJ0eSk7XG5cbiAgZm9yIChjb25zdCB7c291cmNlOiBzcmMsIHRhcmdldDogdGd0LCBzdGFydCwgZW5kfSBvZiBzZWdtZW50cykge1xuICAgIGNvbnN0IHtzdHlsZToge2JhY2tncm91bmRDb2xvciA9IGNvbG9yfSA9IHt9fSA9IHNyYztcbiAgICBjb25zdCBub3RTaGFwZSA9IHRhcmdldCAhPT0gdHJ1ZTtcblxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcblxuICAgIGNsaXBCb3VuZHMoY3R4LCBzY2FsZSwgbm90U2hhcGUgJiYgX2dldEJvdW5kcyhwcm9wZXJ0eSwgc3RhcnQsIGVuZCkpO1xuXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgY29uc3QgbGluZUxvb3AgPSAhIWxpbmUucGF0aFNlZ21lbnQoY3R4LCBzcmMpO1xuXG4gICAgbGV0IGxvb3A7XG4gICAgaWYgKG5vdFNoYXBlKSB7XG4gICAgICBpZiAobGluZUxvb3ApIHtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJwb2xhdGVkTGluZVRvKGN0eCwgdGFyZ2V0LCBlbmQsIHByb3BlcnR5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0TG9vcCA9ICEhdGFyZ2V0LnBhdGhTZWdtZW50KGN0eCwgdGd0LCB7bW92ZTogbGluZUxvb3AsIHJldmVyc2U6IHRydWV9KTtcbiAgICAgIGxvb3AgPSBsaW5lTG9vcCAmJiB0YXJnZXRMb29wO1xuICAgICAgaWYgKCFsb29wKSB7XG4gICAgICAgIGludGVycG9sYXRlZExpbmVUbyhjdHgsIHRhcmdldCwgc3RhcnQsIHByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LmZpbGwobG9vcCA/ICdldmVub2RkJyA6ICdub256ZXJvJyk7XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBCb3VuZHMoY3R4LCBzY2FsZSwgYm91bmRzKSB7XG4gIGNvbnN0IHt0b3AsIGJvdHRvbX0gPSBzY2FsZS5jaGFydC5jaGFydEFyZWE7XG4gIGNvbnN0IHtwcm9wZXJ0eSwgc3RhcnQsIGVuZH0gPSBib3VuZHMgfHwge307XG4gIGlmIChwcm9wZXJ0eSA9PT0gJ3gnKSB7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN0eC5yZWN0KHN0YXJ0LCB0b3AsIGVuZCAtIHN0YXJ0LCBib3R0b20gLSB0b3ApO1xuICAgIGN0eC5jbGlwKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVkTGluZVRvKGN0eCwgdGFyZ2V0LCBwb2ludCwgcHJvcGVydHkpIHtcbiAgY29uc3QgaW50ZXJwb2xhdGVkUG9pbnQgPSB0YXJnZXQuaW50ZXJwb2xhdGUocG9pbnQsIHByb3BlcnR5KTtcbiAgaWYgKGludGVycG9sYXRlZFBvaW50KSB7XG4gICAgY3R4LmxpbmVUbyhpbnRlcnBvbGF0ZWRQb2ludC54LCBpbnRlcnBvbGF0ZWRQb2ludC55KTtcbiAgfVxufVxuXG4iLCAiLyoqXG4gKiBQbHVnaW4gYmFzZWQgb24gZGlzY3Vzc2lvbiBmcm9tIHRoZSBmb2xsb3dpbmcgQ2hhcnQuanMgaXNzdWVzOlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjM4MCNpc3N1ZWNvbW1lbnQtMjc5OTYxNTY5XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yNDQwI2lzc3VlY29tbWVudC0yNTY0NjE4OTdcbiAqL1xuXG5pbXBvcnQgTGluZUVsZW1lbnQgZnJvbSAnLi4vLi4vZWxlbWVudHMvZWxlbWVudC5saW5lLmpzJztcbmltcG9ydCB7X2RyYXdmaWxsfSBmcm9tICcuL2ZpbGxlci5kcmF3aW5nLmpzJztcbmltcG9ydCB7X3Nob3VsZEFwcGx5RmlsbH0gZnJvbSAnLi9maWxsZXIuaGVscGVyLmpzJztcbmltcG9ydCB7X2RlY29kZUZpbGwsIF9yZXNvbHZlVGFyZ2V0fSBmcm9tICcuL2ZpbGxlci5vcHRpb25zLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2ZpbGxlcicsXG5cbiAgYWZ0ZXJEYXRhc2V0c1VwZGF0ZShjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb3VudCA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3Qgc291cmNlcyA9IFtdO1xuICAgIGxldCBtZXRhLCBpLCBsaW5lLCBzb3VyY2U7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgbGluZSA9IG1ldGEuZGF0YXNldDtcbiAgICAgIHNvdXJjZSA9IG51bGw7XG5cbiAgICAgIGlmIChsaW5lICYmIGxpbmUub3B0aW9ucyAmJiBsaW5lIGluc3RhbmNlb2YgTGluZUVsZW1lbnQpIHtcbiAgICAgICAgc291cmNlID0ge1xuICAgICAgICAgIHZpc2libGU6IGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgZmlsbDogX2RlY29kZUZpbGwobGluZSwgaSwgY291bnQpLFxuICAgICAgICAgIGNoYXJ0LFxuICAgICAgICAgIGF4aXM6IG1ldGEuY29udHJvbGxlci5vcHRpb25zLmluZGV4QXhpcyxcbiAgICAgICAgICBzY2FsZTogbWV0YS52U2NhbGUsXG4gICAgICAgICAgbGluZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbWV0YS4kZmlsbGVyID0gc291cmNlO1xuICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuZmlsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHNvdXJjZS5maWxsID0gX3Jlc29sdmVUYXJnZXQoc291cmNlcywgaSwgb3B0aW9ucy5wcm9wYWdhdGUpO1xuICAgIH1cbiAgfSxcblxuICBiZWZvcmVEcmF3KGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IGRyYXcgPSBvcHRpb25zLmRyYXdUaW1lID09PSAnYmVmb3JlRHJhdyc7XG4gICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgY29uc3QgYXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcbiAgICBmb3IgKGxldCBpID0gbWV0YXNldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IG1ldGFzZXRzW2ldLiRmaWxsZXI7XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc291cmNlLmxpbmUudXBkYXRlQ29udHJvbFBvaW50cyhhcmVhLCBzb3VyY2UuYXhpcyk7XG4gICAgICBpZiAoZHJhdyAmJiBzb3VyY2UuZmlsbCkge1xuICAgICAgICBfZHJhd2ZpbGwoY2hhcnQuY3R4LCBzb3VyY2UsIGFyZWEpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVEYXRhc2V0c0RyYXcoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZHJhd1RpbWUgIT09ICdiZWZvcmVEYXRhc2V0c0RyYXcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgZm9yIChsZXQgaSA9IG1ldGFzZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBtZXRhc2V0c1tpXS4kZmlsbGVyO1xuXG4gICAgICBpZiAoX3Nob3VsZEFwcGx5RmlsbChzb3VyY2UpKSB7XG4gICAgICAgIF9kcmF3ZmlsbChjaGFydC5jdHgsIHNvdXJjZSwgY2hhcnQuY2hhcnRBcmVhKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlRGF0YXNldERyYXcoY2hhcnQsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBhcmdzLm1ldGEuJGZpbGxlcjtcblxuICAgIGlmICghX3Nob3VsZEFwcGx5RmlsbChzb3VyY2UpIHx8IG9wdGlvbnMuZHJhd1RpbWUgIT09ICdiZWZvcmVEYXRhc2V0RHJhdycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfZHJhd2ZpbGwoY2hhcnQuY3R4LCBzb3VyY2UsIGNoYXJ0LmNoYXJ0QXJlYSk7XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBwcm9wYWdhdGU6IHRydWUsXG4gICAgZHJhd1RpbWU6ICdiZWZvcmVEYXRhc2V0RHJhdydcbiAgfVxufTtcbiIsICJpbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vY29yZS9jb3JlLmRlZmF1bHRzLmpzJztcbmltcG9ydCBFbGVtZW50IGZyb20gJy4uL2NvcmUvY29yZS5lbGVtZW50LmpzJztcbmltcG9ydCBsYXlvdXRzIGZyb20gJy4uL2NvcmUvY29yZS5sYXlvdXRzLmpzJztcbmltcG9ydCB7YWRkUm91bmRlZFJlY3RQYXRoLCBkcmF3UG9pbnRMZWdlbmQsIHJlbmRlclRleHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHtcbiAgX2lzQmV0d2VlbixcbiAgY2FsbGJhY2sgYXMgY2FsbCxcbiAgY2xpcEFyZWEsXG4gIGdldFJ0bEFkYXB0ZXIsXG4gIG92ZXJyaWRlVGV4dERpcmVjdGlvbixcbiAgcmVzdG9yZVRleHREaXJlY3Rpb24sXG4gIHRvRm9udCxcbiAgdG9QYWRkaW5nLFxuICB1bmNsaXBBcmVhLFxuICB2YWx1ZU9yRGVmYXVsdCxcbn0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG5pbXBvcnQge19hbGlnblN0YXJ0RW5kLCBfdGV4dFgsIF90b0xlZnRSaWdodENlbnRlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5pbXBvcnQge3RvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5DaGFydEV2ZW50IH0gQ2hhcnRFdmVudFxuICovXG5cbmNvbnN0IGdldEJveFNpemUgPSAobGFiZWxPcHRzLCBmb250U2l6ZSkgPT4ge1xuICBsZXQge2JveEhlaWdodCA9IGZvbnRTaXplLCBib3hXaWR0aCA9IGZvbnRTaXplfSA9IGxhYmVsT3B0cztcblxuICBpZiAobGFiZWxPcHRzLnVzZVBvaW50U3R5bGUpIHtcbiAgICBib3hIZWlnaHQgPSBNYXRoLm1pbihib3hIZWlnaHQsIGZvbnRTaXplKTtcbiAgICBib3hXaWR0aCA9IGxhYmVsT3B0cy5wb2ludFN0eWxlV2lkdGggfHwgTWF0aC5taW4oYm94V2lkdGgsIGZvbnRTaXplKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYm94V2lkdGgsXG4gICAgYm94SGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQ6IE1hdGgubWF4KGZvbnRTaXplLCBib3hIZWlnaHQpXG4gIH07XG59O1xuXG5jb25zdCBpdGVtc0VxdWFsID0gKGEsIGIpID0+IGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCAmJiBhLmRhdGFzZXRJbmRleCA9PT0gYi5kYXRhc2V0SW5kZXggJiYgYS5pbmRleCA9PT0gYi5pbmRleDtcblxuZXhwb3J0IGNsYXNzIExlZ2VuZCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3sgY3R4OiBhbnk7IG9wdGlvbnM6IGFueTsgY2hhcnQ6IGFueTsgfX0gY29uZmlnXG5cdCAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWRkZWQgPSBmYWxzZTtcblxuICAgIC8vIENvbnRhaW5zIGhpdCBib3hlcyBmb3IgZWFjaCBkYXRhc2V0IChpbiBkYXRhc2V0IG9yZGVyKVxuICAgIHRoaXMubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblxuICAgIC8qKlxuIFx0XHQgKiBAcHJpdmF0ZVxuIFx0XHQgKi9cbiAgICB0aGlzLl9ob3ZlcmVkSXRlbSA9IG51bGw7XG5cbiAgICAvLyBBcmUgd2UgaW4gZG91Z2hudXQgbW9kZSB3aGljaCBoYXMgYSBkaWZmZXJlbnQgZGF0YSB0eXBlXG4gICAgdGhpcy5kb3VnaG51dE1vZGUgPSBmYWxzZTtcblxuICAgIHRoaXMuY2hhcnQgPSBjb25maWcuY2hhcnQ7XG4gICAgdGhpcy5vcHRpb25zID0gY29uZmlnLm9wdGlvbnM7XG4gICAgdGhpcy5jdHggPSBjb25maWcuY3R4O1xuICAgIHRoaXMubGVnZW5kSXRlbXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb2x1bW5TaXplcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpbmVXaWR0aHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXhIZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxlZnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX21hcmdpbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZ1bGxTaXplID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlKG1heFdpZHRoLCBtYXhIZWlnaHQsIG1hcmdpbnMpIHtcbiAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgdGhpcy5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgdGhpcy5fbWFyZ2lucyA9IG1hcmdpbnM7XG5cbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmJ1aWxkTGFiZWxzKCk7XG4gICAgdGhpcy5maXQoKTtcbiAgfVxuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5fbWFyZ2lucy5sZWZ0O1xuICAgICAgdGhpcy5yaWdodCA9IHRoaXMud2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQ7XG4gICAgICB0aGlzLnRvcCA9IHRoaXMuX21hcmdpbnMudG9wO1xuICAgICAgdGhpcy5ib3R0b20gPSB0aGlzLmhlaWdodDtcbiAgICB9XG4gIH1cblxuICBidWlsZExhYmVscygpIHtcbiAgICBjb25zdCBsYWJlbE9wdHMgPSB0aGlzLm9wdGlvbnMubGFiZWxzIHx8IHt9O1xuICAgIGxldCBsZWdlbmRJdGVtcyA9IGNhbGwobGFiZWxPcHRzLmdlbmVyYXRlTGFiZWxzLCBbdGhpcy5jaGFydF0sIHRoaXMpIHx8IFtdO1xuXG4gICAgaWYgKGxhYmVsT3B0cy5maWx0ZXIpIHtcbiAgICAgIGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuZmlsdGVyKChpdGVtKSA9PiBsYWJlbE9wdHMuZmlsdGVyKGl0ZW0sIHRoaXMuY2hhcnQuZGF0YSkpO1xuICAgIH1cblxuICAgIGlmIChsYWJlbE9wdHMuc29ydCkge1xuICAgICAgbGVnZW5kSXRlbXMgPSBsZWdlbmRJdGVtcy5zb3J0KChhLCBiKSA9PiBsYWJlbE9wdHMuc29ydChhLCBiLCB0aGlzLmNoYXJ0LmRhdGEpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJldmVyc2UpIHtcbiAgICAgIGxlZ2VuZEl0ZW1zLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXM7XG4gIH1cblxuICBmaXQoKSB7XG4gICAgY29uc3Qge29wdGlvbnMsIGN0eH0gPSB0aGlzO1xuXG4gICAgLy8gVGhlIGxlZ2VuZCBtYXkgbm90IGJlIGRpc3BsYXllZCBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMgaW5jbHVkaW5nXG4gICAgLy8gdGhlIGZhY3QgdGhhdCB0aGUgZGVmYXVsdHMgZ290IHNldCB0byBgZmFsc2VgLlxuICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBub3QgZGlzcGxheWVkLCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyB0aGF0IHRoZSBvcHRpb25zXG4gICAgLy8gYXJlIGNvcnJlY3RseSBmb3JtYXR0ZWQgc28gd2UgbmVlZCB0byBiYWlsIG91dCBhcyBlYXJseSBhcyBwb3NzaWJsZS5cbiAgICBpZiAoIW9wdGlvbnMuZGlzcGxheSkge1xuICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbE9wdHMgPSBvcHRpb25zLmxhYmVscztcbiAgICBjb25zdCBsYWJlbEZvbnQgPSB0b0ZvbnQobGFiZWxPcHRzLmZvbnQpO1xuICAgIGNvbnN0IGZvbnRTaXplID0gbGFiZWxGb250LnNpemU7XG4gICAgY29uc3QgdGl0bGVIZWlnaHQgPSB0aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtcbiAgICBjb25zdCB7Ym94V2lkdGgsIGl0ZW1IZWlnaHR9ID0gZ2V0Qm94U2l6ZShsYWJlbE9wdHMsIGZvbnRTaXplKTtcblxuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuXG4gICAgY3R4LmZvbnQgPSBsYWJlbEZvbnQuc3RyaW5nO1xuXG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHdpZHRoID0gdGhpcy5tYXhXaWR0aDsgLy8gZmlsbCBhbGwgdGhlIHdpZHRoXG4gICAgICBoZWlnaHQgPSB0aGlzLl9maXRSb3dzKHRpdGxlSGVpZ2h0LCBmb250U2l6ZSwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpICsgMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlaWdodCA9IHRoaXMubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG4gICAgICB3aWR0aCA9IHRoaXMuX2ZpdENvbHModGl0bGVIZWlnaHQsIGxhYmVsRm9udCwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpICsgMTA7XG4gICAgfVxuXG4gICAgdGhpcy53aWR0aCA9IE1hdGgubWluKHdpZHRoLCBvcHRpb25zLm1heFdpZHRoIHx8IHRoaXMubWF4V2lkdGgpO1xuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBvcHRpb25zLm1heEhlaWdodCB8fCB0aGlzLm1heEhlaWdodCk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9maXRSb3dzKHRpdGxlSGVpZ2h0LCBmb250U2l6ZSwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpIHtcbiAgICBjb25zdCB7Y3R4LCBtYXhXaWR0aCwgb3B0aW9uczoge2xhYmVsczoge3BhZGRpbmd9fX0gPSB0aGlzO1xuICAgIGNvbnN0IGhpdGJveGVzID0gdGhpcy5sZWdlbmRIaXRCb3hlcyA9IFtdO1xuICAgIC8vIFdpZHRoIG9mIGVhY2ggbGluZSBvZiBsZWdlbmQgYm94ZXMuIExhYmVscyB3cmFwIG9udG8gbXVsdGlwbGUgbGluZXMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZml0IG9uIG9uZVxuICAgIGNvbnN0IGxpbmVXaWR0aHMgPSB0aGlzLmxpbmVXaWR0aHMgPSBbMF07XG4gICAgY29uc3QgbGluZUhlaWdodCA9IGl0ZW1IZWlnaHQgKyBwYWRkaW5nO1xuICAgIGxldCB0b3RhbEhlaWdodCA9IHRpdGxlSGVpZ2h0O1xuXG4gICAgY3R4LnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG5cbiAgICBsZXQgcm93ID0gLTE7XG4gICAgbGV0IHRvcCA9IC1saW5lSGVpZ2h0O1xuICAgIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgobGVnZW5kSXRlbSwgaSkgPT4ge1xuICAgICAgY29uc3QgaXRlbVdpZHRoID0gYm94V2lkdGggKyAoZm9udFNpemUgLyAyKSArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xuXG4gICAgICBpZiAoaSA9PT0gMCB8fCBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKyBpdGVtV2lkdGggKyAyICogcGFkZGluZyA+IG1heFdpZHRoKSB7XG4gICAgICAgIHRvdGFsSGVpZ2h0ICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgIGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGggLSAoaSA+IDAgPyAwIDogMSldID0gMDtcbiAgICAgICAgdG9wICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgIHJvdysrO1xuICAgICAgfVxuXG4gICAgICBoaXRib3hlc1tpXSA9IHtsZWZ0OiAwLCB0b3AsIHJvdywgd2lkdGg6IGl0ZW1XaWR0aCwgaGVpZ2h0OiBpdGVtSGVpZ2h0fTtcblxuICAgICAgbGluZVdpZHRoc1tsaW5lV2lkdGhzLmxlbmd0aCAtIDFdICs9IGl0ZW1XaWR0aCArIHBhZGRpbmc7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdG90YWxIZWlnaHQ7XG4gIH1cblxuICBfZml0Q29scyh0aXRsZUhlaWdodCwgbGFiZWxGb250LCBib3hXaWR0aCwgX2l0ZW1IZWlnaHQpIHtcbiAgICBjb25zdCB7Y3R4LCBtYXhIZWlnaHQsIG9wdGlvbnM6IHtsYWJlbHM6IHtwYWRkaW5nfX19ID0gdGhpcztcbiAgICBjb25zdCBoaXRib3hlcyA9IHRoaXMubGVnZW5kSGl0Qm94ZXMgPSBbXTtcbiAgICBjb25zdCBjb2x1bW5TaXplcyA9IHRoaXMuY29sdW1uU2l6ZXMgPSBbXTtcbiAgICBjb25zdCBoZWlnaHRMaW1pdCA9IG1heEhlaWdodCAtIHRpdGxlSGVpZ2h0O1xuXG4gICAgbGV0IHRvdGFsV2lkdGggPSBwYWRkaW5nO1xuICAgIGxldCBjdXJyZW50Q29sV2lkdGggPSAwO1xuICAgIGxldCBjdXJyZW50Q29sSGVpZ2h0ID0gMDtcblxuICAgIGxldCBsZWZ0ID0gMDtcbiAgICBsZXQgY29sID0gMDtcblxuICAgIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgobGVnZW5kSXRlbSwgaSkgPT4ge1xuICAgICAgY29uc3Qge2l0ZW1XaWR0aCwgaXRlbUhlaWdodH0gPSBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KTtcblxuICAgICAgLy8gSWYgdG9vIHRhbGwsIGdvIHRvIG5ldyBjb2x1bW5cbiAgICAgIGlmIChpID4gMCAmJiBjdXJyZW50Q29sSGVpZ2h0ICsgaXRlbUhlaWdodCArIDIgKiBwYWRkaW5nID4gaGVpZ2h0TGltaXQpIHtcbiAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGggKyBwYWRkaW5nO1xuICAgICAgICBjb2x1bW5TaXplcy5wdXNoKHt3aWR0aDogY3VycmVudENvbFdpZHRoLCBoZWlnaHQ6IGN1cnJlbnRDb2xIZWlnaHR9KTsgLy8gcHJldmlvdXMgY29sdW1uIHNpemVcbiAgICAgICAgbGVmdCArPSBjdXJyZW50Q29sV2lkdGggKyBwYWRkaW5nO1xuICAgICAgICBjb2wrKztcbiAgICAgICAgY3VycmVudENvbFdpZHRoID0gY3VycmVudENvbEhlaWdodCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBoaXRib3ggd2lkdGggYW5kIGhlaWdodCBoZXJlLiBGaW5hbCBwb3NpdGlvbiB3aWxsIGJlIHVwZGF0ZWQgaW4gYGRyYXdgXG4gICAgICBoaXRib3hlc1tpXSA9IHtsZWZ0LCB0b3A6IGN1cnJlbnRDb2xIZWlnaHQsIGNvbCwgd2lkdGg6IGl0ZW1XaWR0aCwgaGVpZ2h0OiBpdGVtSGVpZ2h0fTtcblxuICAgICAgLy8gR2V0IG1heCB3aWR0aFxuICAgICAgY3VycmVudENvbFdpZHRoID0gTWF0aC5tYXgoY3VycmVudENvbFdpZHRoLCBpdGVtV2lkdGgpO1xuICAgICAgY3VycmVudENvbEhlaWdodCArPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICB9KTtcblxuICAgIHRvdGFsV2lkdGggKz0gY3VycmVudENvbFdpZHRoO1xuICAgIGNvbHVtblNpemVzLnB1c2goe3dpZHRoOiBjdXJyZW50Q29sV2lkdGgsIGhlaWdodDogY3VycmVudENvbEhlaWdodH0pOyAvLyBwcmV2aW91cyBjb2x1bW4gc2l6ZVxuXG4gICAgcmV0dXJuIHRvdGFsV2lkdGg7XG4gIH1cblxuICBhZGp1c3RIaXRCb3hlcygpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpdGxlSGVpZ2h0ID0gdGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCk7XG4gICAgY29uc3Qge2xlZ2VuZEhpdEJveGVzOiBoaXRib3hlcywgb3B0aW9uczoge2FsaWduLCBsYWJlbHM6IHtwYWRkaW5nfSwgcnRsfX0gPSB0aGlzO1xuICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIocnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICBsZXQgcm93ID0gMDtcbiAgICAgIGxldCBsZWZ0ID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSB0aGlzLmxpbmVXaWR0aHNbcm93XSk7XG4gICAgICBmb3IgKGNvbnN0IGhpdGJveCBvZiBoaXRib3hlcykge1xuICAgICAgICBpZiAocm93ICE9PSBoaXRib3gucm93KSB7XG4gICAgICAgICAgcm93ID0gaGl0Ym94LnJvdztcbiAgICAgICAgICBsZWZ0ID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSB0aGlzLmxpbmVXaWR0aHNbcm93XSk7XG4gICAgICAgIH1cbiAgICAgICAgaGl0Ym94LnRvcCArPSB0aGlzLnRvcCArIHRpdGxlSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgaGl0Ym94LmxlZnQgPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueChsZWZ0KSwgaGl0Ym94LndpZHRoKTtcbiAgICAgICAgbGVmdCArPSBoaXRib3gud2lkdGggKyBwYWRkaW5nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY29sID0gMDtcbiAgICAgIGxldCB0b3AgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgdGhpcy50b3AgKyB0aXRsZUhlaWdodCArIHBhZGRpbmcsIHRoaXMuYm90dG9tIC0gdGhpcy5jb2x1bW5TaXplc1tjb2xdLmhlaWdodCk7XG4gICAgICBmb3IgKGNvbnN0IGhpdGJveCBvZiBoaXRib3hlcykge1xuICAgICAgICBpZiAoaGl0Ym94LmNvbCAhPT0gY29sKSB7XG4gICAgICAgICAgY29sID0gaGl0Ym94LmNvbDtcbiAgICAgICAgICB0b3AgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgdGhpcy50b3AgKyB0aXRsZUhlaWdodCArIHBhZGRpbmcsIHRoaXMuYm90dG9tIC0gdGhpcy5jb2x1bW5TaXplc1tjb2xdLmhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaGl0Ym94LnRvcCA9IHRvcDtcbiAgICAgICAgaGl0Ym94LmxlZnQgKz0gdGhpcy5sZWZ0ICsgcGFkZGluZztcbiAgICAgICAgaGl0Ym94LmxlZnQgPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueChoaXRib3gubGVmdCksIGhpdGJveC53aWR0aCk7XG4gICAgICAgIHRvcCArPSBoaXRib3guaGVpZ2h0ICsgcGFkZGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0hvcml6b250YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJztcbiAgfVxuXG4gIGRyYXcoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgIGNsaXBBcmVhKGN0eCwgdGhpcyk7XG5cbiAgICAgIHRoaXMuX2RyYXcoKTtcblxuICAgICAgdW5jbGlwQXJlYShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2RyYXcoKSB7XG4gICAgY29uc3Qge29wdGlvbnM6IG9wdHMsIGNvbHVtblNpemVzLCBsaW5lV2lkdGhzLCBjdHh9ID0gdGhpcztcbiAgICBjb25zdCB7YWxpZ24sIGxhYmVsczogbGFiZWxPcHRzfSA9IG9wdHM7XG4gICAgY29uc3QgZGVmYXVsdENvbG9yID0gZGVmYXVsdHMuY29sb3I7XG4gICAgY29uc3QgcnRsSGVscGVyID0gZ2V0UnRsQWRhcHRlcihvcHRzLnJ0bCwgdGhpcy5sZWZ0LCB0aGlzLndpZHRoKTtcbiAgICBjb25zdCBsYWJlbEZvbnQgPSB0b0ZvbnQobGFiZWxPcHRzLmZvbnQpO1xuICAgIGNvbnN0IHtwYWRkaW5nfSA9IGxhYmVsT3B0cztcbiAgICBjb25zdCBmb250U2l6ZSA9IGxhYmVsRm9udC5zaXplO1xuICAgIGNvbnN0IGhhbGZGb250U2l6ZSA9IGZvbnRTaXplIC8gMjtcbiAgICBsZXQgY3Vyc29yO1xuXG4gICAgdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgIC8vIENhbnZhcyBzZXR1cFxuICAgIGN0eC50ZXh0QWxpZ24gPSBydGxIZWxwZXIudGV4dEFsaWduKCdsZWZ0Jyk7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGN0eC5saW5lV2lkdGggPSAwLjU7XG4gICAgY3R4LmZvbnQgPSBsYWJlbEZvbnQuc3RyaW5nO1xuXG4gICAgY29uc3Qge2JveFdpZHRoLCBib3hIZWlnaHQsIGl0ZW1IZWlnaHR9ID0gZ2V0Qm94U2l6ZShsYWJlbE9wdHMsIGZvbnRTaXplKTtcblxuICAgIC8vIGN1cnJlbnQgcG9zaXRpb25cbiAgICBjb25zdCBkcmF3TGVnZW5kQm94ID0gZnVuY3Rpb24oeCwgeSwgbGVnZW5kSXRlbSkge1xuICAgICAgaWYgKGlzTmFOKGJveFdpZHRoKSB8fCBib3hXaWR0aCA8PSAwIHx8IGlzTmFOKGJveEhlaWdodCkgfHwgYm94SGVpZ2h0IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgY3R4IGZvciB0aGUgYm94XG4gICAgICBjdHguc2F2ZSgpO1xuXG4gICAgICBjb25zdCBsaW5lV2lkdGggPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVXaWR0aCwgMSk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5maWxsU3R5bGUsIGRlZmF1bHRDb2xvcik7XG4gICAgICBjdHgubGluZUNhcCA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZUNhcCwgJ2J1dHQnKTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZURhc2hPZmZzZXQsIDApO1xuICAgICAgY3R4LmxpbmVKb2luID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lSm9pbiwgJ21pdGVyJyk7XG4gICAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5zdHJva2VTdHlsZSwgZGVmYXVsdENvbG9yKTtcblxuICAgICAgY3R4LnNldExpbmVEYXNoKHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZURhc2gsIFtdKSk7XG5cbiAgICAgIGlmIChsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB4IGFuZCB5IGZvciBkcmF3UG9pbnQoKSBiZWNhdXNlIGl0cyBleHBlY3RpbmdcbiAgICAgICAgLy8geCBhbmQgeSB0byBiZSBjZW50ZXIgb2YgZmlndXJlIChpbnN0ZWFkIG9mIHRvcCBsZWZ0KVxuICAgICAgICBjb25zdCBkcmF3T3B0aW9ucyA9IHtcbiAgICAgICAgICByYWRpdXM6IGJveEhlaWdodCAqIE1hdGguU1FSVDIgLyAyLFxuICAgICAgICAgIHBvaW50U3R5bGU6IGxlZ2VuZEl0ZW0ucG9pbnRTdHlsZSxcbiAgICAgICAgICByb3RhdGlvbjogbGVnZW5kSXRlbS5yb3RhdGlvbixcbiAgICAgICAgICBib3JkZXJXaWR0aDogbGluZVdpZHRoXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNlbnRlclggPSBydGxIZWxwZXIueFBsdXMoeCwgYm94V2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IHkgKyBoYWxmRm9udFNpemU7XG5cbiAgICAgICAgLy8gRHJhdyBwb2ludFN0eWxlIGFzIGxlZ2VuZCBzeW1ib2xcbiAgICAgICAgZHJhd1BvaW50TGVnZW5kKGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclksIGxhYmVsT3B0cy5wb2ludFN0eWxlV2lkdGggJiYgYm94V2lkdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHJhdyBib3ggYXMgbGVnZW5kIHN5bWJvbFxuICAgICAgICAvLyBBZGp1c3QgcG9zaXRpb24gd2hlbiBib3hIZWlnaHQgPCBmb250U2l6ZSAod2FudCBpdCBjZW50ZXJlZClcbiAgICAgICAgY29uc3QgeUJveFRvcCA9IHkgKyBNYXRoLm1heCgoZm9udFNpemUgLSBib3hIZWlnaHQpIC8gMiwgMCk7XG4gICAgICAgIGNvbnN0IHhCb3hMZWZ0ID0gcnRsSGVscGVyLmxlZnRGb3JMdHIoeCwgYm94V2lkdGgpO1xuICAgICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxlZ2VuZEl0ZW0uYm9yZGVyUmFkaXVzKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoYm9yZGVyUmFkaXVzKS5zb21lKHYgPT4gdiAhPT0gMCkpIHtcbiAgICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgICB4OiB4Qm94TGVmdCxcbiAgICAgICAgICAgIHk6IHlCb3hUb3AsXG4gICAgICAgICAgICB3OiBib3hXaWR0aCxcbiAgICAgICAgICAgIGg6IGJveEhlaWdodCxcbiAgICAgICAgICAgIHJhZGl1czogYm9yZGVyUmFkaXVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eC5yZWN0KHhCb3hMZWZ0LCB5Qm94VG9wLCBib3hXaWR0aCwgYm94SGVpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgIGlmIChsaW5lV2lkdGggIT09IDApIHtcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZmlsbFRleHQgPSBmdW5jdGlvbih4LCB5LCBsZWdlbmRJdGVtKSB7XG4gICAgICByZW5kZXJUZXh0KGN0eCwgbGVnZW5kSXRlbS50ZXh0LCB4LCB5ICsgKGl0ZW1IZWlnaHQgLyAyKSwgbGFiZWxGb250LCB7XG4gICAgICAgIHN0cmlrZXRocm91Z2g6IGxlZ2VuZEl0ZW0uaGlkZGVuLFxuICAgICAgICB0ZXh0QWxpZ246IHJ0bEhlbHBlci50ZXh0QWxpZ24obGVnZW5kSXRlbS50ZXh0QWxpZ24pXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9yaXpvbnRhbFxuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgdGl0bGVIZWlnaHQgPSB0aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtcbiAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICBjdXJzb3IgPSB7XG4gICAgICAgIHg6IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gbGluZVdpZHRoc1swXSksXG4gICAgICAgIHk6IHRoaXMudG9wICsgcGFkZGluZyArIHRpdGxlSGVpZ2h0LFxuICAgICAgICBsaW5lOiAwXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJzb3IgPSB7XG4gICAgICAgIHg6IHRoaXMubGVmdCArIHBhZGRpbmcsXG4gICAgICAgIHk6IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLnRvcCArIHRpdGxlSGVpZ2h0ICsgcGFkZGluZywgdGhpcy5ib3R0b20gLSBjb2x1bW5TaXplc1swXS5oZWlnaHQpLFxuICAgICAgICBsaW5lOiAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlVGV4dERpcmVjdGlvbih0aGlzLmN0eCwgb3B0cy50ZXh0RGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICB0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKGxlZ2VuZEl0ZW0sIGkpID0+IHtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGxlZ2VuZEl0ZW0uZm9udENvbG9yOyAvLyBmb3Igc3RyaWtldGhyb3VnaCBlZmZlY3RcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBsZWdlbmRJdGVtLmZvbnRDb2xvcjsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXG5cbiAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xuICAgICAgY29uc3QgdGV4dEFsaWduID0gcnRsSGVscGVyLnRleHRBbGlnbihsZWdlbmRJdGVtLnRleHRBbGlnbiB8fCAobGVnZW5kSXRlbS50ZXh0QWxpZ24gPSBsYWJlbE9wdHMudGV4dEFsaWduKSk7XG4gICAgICBjb25zdCB3aWR0aCA9IGJveFdpZHRoICsgaGFsZkZvbnRTaXplICsgdGV4dFdpZHRoO1xuICAgICAgbGV0IHggPSBjdXJzb3IueDtcbiAgICAgIGxldCB5ID0gY3Vyc29yLnk7XG5cbiAgICAgIHJ0bEhlbHBlci5zZXRXaWR0aCh0aGlzLndpZHRoKTtcblxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBpZiAoaSA+IDAgJiYgeCArIHdpZHRoICsgcGFkZGluZyA+IHRoaXMucmlnaHQpIHtcbiAgICAgICAgICB5ID0gY3Vyc29yLnkgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICBjdXJzb3IubGluZSsrO1xuICAgICAgICAgIHggPSBjdXJzb3IueCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gbGluZVdpZHRoc1tjdXJzb3IubGluZV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGkgPiAwICYmIHkgKyBsaW5lSGVpZ2h0ID4gdGhpcy5ib3R0b20pIHtcbiAgICAgICAgeCA9IGN1cnNvci54ID0geCArIGNvbHVtblNpemVzW2N1cnNvci5saW5lXS53aWR0aCArIHBhZGRpbmc7XG4gICAgICAgIGN1cnNvci5saW5lKys7XG4gICAgICAgIHkgPSBjdXJzb3IueSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLnRvcCArIHRpdGxlSGVpZ2h0ICsgcGFkZGluZywgdGhpcy5ib3R0b20gLSBjb2x1bW5TaXplc1tjdXJzb3IubGluZV0uaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVhbFggPSBydGxIZWxwZXIueCh4KTtcblxuICAgICAgZHJhd0xlZ2VuZEJveChyZWFsWCwgeSwgbGVnZW5kSXRlbSk7XG5cbiAgICAgIHggPSBfdGV4dFgodGV4dEFsaWduLCB4ICsgYm94V2lkdGggKyBoYWxmRm9udFNpemUsIGlzSG9yaXpvbnRhbCA/IHggKyB3aWR0aCA6IHRoaXMucmlnaHQsIG9wdHMucnRsKTtcblxuICAgICAgLy8gRmlsbCB0aGUgYWN0dWFsIGxhYmVsXG4gICAgICBmaWxsVGV4dChydGxIZWxwZXIueCh4KSwgeSwgbGVnZW5kSXRlbSk7XG5cbiAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgY3Vyc29yLnggKz0gd2lkdGggKyBwYWRkaW5nO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGVnZW5kSXRlbS50ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBmb250TGluZUhlaWdodCA9IGxhYmVsRm9udC5saW5lSGVpZ2h0O1xuICAgICAgICBjdXJzb3IueSArPSBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvci55ICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN0b3JlVGV4dERpcmVjdGlvbih0aGlzLmN0eCwgb3B0cy50ZXh0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3VGl0bGUoKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0aXRsZU9wdHMgPSBvcHRzLnRpdGxlO1xuICAgIGNvbnN0IHRpdGxlRm9udCA9IHRvRm9udCh0aXRsZU9wdHMuZm9udCk7XG4gICAgY29uc3QgdGl0bGVQYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlT3B0cy5wYWRkaW5nKTtcblxuICAgIGlmICghdGl0bGVPcHRzLmRpc3BsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdHMucnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGl0bGVPcHRzLnBvc2l0aW9uO1xuICAgIGNvbnN0IGhhbGZGb250U2l6ZSA9IHRpdGxlRm9udC5zaXplIC8gMjtcbiAgICBjb25zdCB0b3BQYWRkaW5nUGx1c0hhbGZGb250U2l6ZSA9IHRpdGxlUGFkZGluZy50b3AgKyBoYWxmRm9udFNpemU7XG4gICAgbGV0IHk7XG5cbiAgICAvLyBUaGVzZSBkZWZhdWx0cyBhcmUgdXNlZCB3aGVuIHRoZSBsZWdlbmQgaXMgdmVydGljYWwuXG4gICAgLy8gV2hlbiBob3Jpem9udGFsLCB0aGV5IGFyZSBjb21wdXRlZCBiZWxvdy5cbiAgICBsZXQgbGVmdCA9IHRoaXMubGVmdDtcbiAgICBsZXQgbWF4V2lkdGggPSB0aGlzLndpZHRoO1xuXG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIC8vIE1vdmUgbGVmdCAvIHJpZ2h0IHNvIHRoYXQgdGhlIHRpdGxlIGlzIGFib3ZlIHRoZSBsZWdlbmQgbGluZXNcbiAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5saW5lV2lkdGhzKTtcbiAgICAgIHkgPSB0aGlzLnRvcCArIHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplO1xuICAgICAgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKG9wdHMuYWxpZ24sIGxlZnQsIHRoaXMucmlnaHQgLSBtYXhXaWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1vdmUgZG93biBzbyB0aGF0IHRoZSB0aXRsZSBpcyBhYm92ZSB0aGUgbGVnZW5kIHN0YWNrIGluIGV2ZXJ5IGFsaWdubWVudFxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5jb2x1bW5TaXplcy5yZWR1Y2UoKGFjYywgc2l6ZSkgPT4gTWF0aC5tYXgoYWNjLCBzaXplLmhlaWdodCksIDApO1xuICAgICAgeSA9IHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplICsgX2FsaWduU3RhcnRFbmQob3B0cy5hbGlnbiwgdGhpcy50b3AsIHRoaXMuYm90dG9tIC0gbWF4SGVpZ2h0IC0gb3B0cy5sYWJlbHMucGFkZGluZyAtIHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGlubmVyIGxlZ2VuZCBib3gsIGNvbXB1dGUgdGhlIGNvcnJlY3RcbiAgICAvLyBYIGNvb3JkaW5hdGUgZnJvbSB0aGUgdGl0bGUgYWxpZ25tZW50XG4gICAgY29uc3QgeCA9IF9hbGlnblN0YXJ0RW5kKHBvc2l0aW9uLCBsZWZ0LCBsZWZ0ICsgbWF4V2lkdGgpO1xuXG4gICAgLy8gQ2FudmFzIHNldHVwXG4gICAgY3R4LnRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24oX3RvTGVmdFJpZ2h0Q2VudGVyKHBvc2l0aW9uKSk7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IHRpdGxlT3B0cy5jb2xvcjtcbiAgICBjdHguZmlsbFN0eWxlID0gdGl0bGVPcHRzLmNvbG9yO1xuICAgIGN0eC5mb250ID0gdGl0bGVGb250LnN0cmluZztcblxuICAgIHJlbmRlclRleHQoY3R4LCB0aXRsZU9wdHMudGV4dCwgeCwgeSwgdGl0bGVGb250KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbXB1dGVUaXRsZUhlaWdodCgpIHtcbiAgICBjb25zdCB0aXRsZU9wdHMgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgY29uc3QgdGl0bGVGb250ID0gdG9Gb250KHRpdGxlT3B0cy5mb250KTtcbiAgICBjb25zdCB0aXRsZVBhZGRpbmcgPSB0b1BhZGRpbmcodGl0bGVPcHRzLnBhZGRpbmcpO1xuICAgIHJldHVybiB0aXRsZU9wdHMuZGlzcGxheSA/IHRpdGxlRm9udC5saW5lSGVpZ2h0ICsgdGl0bGVQYWRkaW5nLmhlaWdodCA6IDA7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRMZWdlbmRJdGVtQXQoeCwgeSkge1xuICAgIGxldCBpLCBoaXRCb3gsIGxoO1xuXG4gICAgaWYgKF9pc0JldHdlZW4oeCwgdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KVxuICAgICAgJiYgX2lzQmV0d2Vlbih5LCB0aGlzLnRvcCwgdGhpcy5ib3R0b20pKSB7XG4gICAgICAvLyBTZWUgaWYgd2UgYXJlIHRvdWNoaW5nIG9uZSBvZiB0aGUgZGF0YXNldCBib3hlc1xuICAgICAgbGggPSB0aGlzLmxlZ2VuZEhpdEJveGVzO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGhpdEJveCA9IGxoW2ldO1xuXG4gICAgICAgIGlmIChfaXNCZXR3ZWVuKHgsIGhpdEJveC5sZWZ0LCBoaXRCb3gubGVmdCArIGhpdEJveC53aWR0aClcbiAgICAgICAgICAmJiBfaXNCZXR3ZWVuKHksIGhpdEJveC50b3AsIGhpdEJveC50b3AgKyBoaXRCb3guaGVpZ2h0KSkge1xuICAgICAgICAgIC8vIFRvdWNoaW5nIGFuIGVsZW1lbnRcbiAgICAgICAgICByZXR1cm4gdGhpcy5sZWdlbmRJdGVtc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqL1xuICBoYW5kbGVFdmVudChlKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoIWlzTGlzdGVuZWQoZS50eXBlLCBvcHRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoYXJ0IGV2ZW50IGFscmVhZHkgaGFzIHJlbGF0aXZlIHBvc2l0aW9uIGluIGl0XG4gICAgY29uc3QgaG92ZXJlZEl0ZW0gPSB0aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LCBlLnkpO1xuXG4gICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlbW92ZScgfHwgZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX2hvdmVyZWRJdGVtO1xuICAgICAgY29uc3Qgc2FtZUl0ZW0gPSBpdGVtc0VxdWFsKHByZXZpb3VzLCBob3ZlcmVkSXRlbSk7XG4gICAgICBpZiAocHJldmlvdXMgJiYgIXNhbWVJdGVtKSB7XG4gICAgICAgIGNhbGwob3B0cy5vbkxlYXZlLCBbZSwgcHJldmlvdXMsIHRoaXNdLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJlZEl0ZW0gPSBob3ZlcmVkSXRlbTtcblxuICAgICAgaWYgKGhvdmVyZWRJdGVtICYmICFzYW1lSXRlbSkge1xuICAgICAgICBjYWxsKG9wdHMub25Ib3ZlciwgW2UsIGhvdmVyZWRJdGVtLCB0aGlzXSwgdGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChob3ZlcmVkSXRlbSkge1xuICAgICAgY2FsbChvcHRzLm9uQ2xpY2ssIFtlLCBob3ZlcmVkSXRlbSwgdGhpc10sIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KSB7XG4gIGNvbnN0IGl0ZW1XaWR0aCA9IGNhbGN1bGF0ZUl0ZW1XaWR0aChsZWdlbmRJdGVtLCBib3hXaWR0aCwgbGFiZWxGb250LCBjdHgpO1xuICBjb25zdCBpdGVtSGVpZ2h0ID0gY2FsY3VsYXRlSXRlbUhlaWdodChfaXRlbUhlaWdodCwgbGVnZW5kSXRlbSwgbGFiZWxGb250LmxpbmVIZWlnaHQpO1xuICByZXR1cm4ge2l0ZW1XaWR0aCwgaXRlbUhlaWdodH07XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUl0ZW1XaWR0aChsZWdlbmRJdGVtLCBib3hXaWR0aCwgbGFiZWxGb250LCBjdHgpIHtcbiAgbGV0IGxlZ2VuZEl0ZW1UZXh0ID0gbGVnZW5kSXRlbS50ZXh0O1xuICBpZiAobGVnZW5kSXRlbVRleHQgJiYgdHlwZW9mIGxlZ2VuZEl0ZW1UZXh0ICE9PSAnc3RyaW5nJykge1xuICAgIGxlZ2VuZEl0ZW1UZXh0ID0gbGVnZW5kSXRlbVRleHQucmVkdWNlKChhLCBiKSA9PiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpO1xuICB9XG4gIHJldHVybiBib3hXaWR0aCArIChsYWJlbEZvbnQuc2l6ZSAvIDIpICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW1UZXh0KS53aWR0aDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlSXRlbUhlaWdodChfaXRlbUhlaWdodCwgbGVnZW5kSXRlbSwgZm9udExpbmVIZWlnaHQpIHtcbiAgbGV0IGl0ZW1IZWlnaHQgPSBfaXRlbUhlaWdodDtcbiAgaWYgKHR5cGVvZiBsZWdlbmRJdGVtLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgaXRlbUhlaWdodCA9IGNhbGN1bGF0ZUxlZ2VuZEl0ZW1IZWlnaHQobGVnZW5kSXRlbSwgZm9udExpbmVIZWlnaHQpO1xuICB9XG4gIHJldHVybiBpdGVtSGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KSB7XG4gIGNvbnN0IGxhYmVsSGVpZ2h0ID0gbGVnZW5kSXRlbS50ZXh0ID8gbGVnZW5kSXRlbS50ZXh0Lmxlbmd0aCArIDAuNSA6IDA7XG4gIHJldHVybiBmb250TGluZUhlaWdodCAqIGxhYmVsSGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBpc0xpc3RlbmVkKHR5cGUsIG9wdHMpIHtcbiAgaWYgKCh0eXBlID09PSAnbW91c2Vtb3ZlJyB8fCB0eXBlID09PSAnbW91c2VvdXQnKSAmJiAob3B0cy5vbkhvdmVyIHx8IG9wdHMub25MZWF2ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAob3B0cy5vbkNsaWNrICYmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT09ICdtb3VzZXVwJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdsZWdlbmQnLFxuXG4gIC8qKlxuXHQgKiBGb3IgdGVzdHNcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9lbGVtZW50OiBMZWdlbmQsXG5cbiAgc3RhcnQoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kID0gbmV3IExlZ2VuZCh7Y3R4OiBjaGFydC5jdHgsIG9wdGlvbnMsIGNoYXJ0fSk7XG4gICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgb3B0aW9ucyk7XG4gICAgbGF5b3V0cy5hZGRCb3goY2hhcnQsIGxlZ2VuZCk7XG4gIH0sXG5cbiAgc3RvcChjaGFydCkge1xuICAgIGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCBjaGFydC5sZWdlbmQpO1xuICAgIGRlbGV0ZSBjaGFydC5sZWdlbmQ7XG4gIH0sXG5cbiAgLy8gRHVyaW5nIHRoZSBiZWZvcmVVcGRhdGUgc3RlcCwgdGhlIGxheW91dCBjb25maWd1cmF0aW9uIG5lZWRzIHRvIHJ1blxuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBpZiB0aGUgbGVnZW5kIHBvc2l0aW9uIGNoYW5nZXMgKHZpYSBhbiBvcHRpb24gdXBkYXRlKVxuICAvLyB0aGUgbGF5b3V0IHN5c3RlbSByZXNwZWN0cyB0aGUgY2hhbmdlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzc1MjdcbiAgYmVmb3JlVXBkYXRlKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IGxlZ2VuZCA9IGNoYXJ0LmxlZ2VuZDtcbiAgICBsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgbGVnZW5kLCBvcHRpb25zKTtcbiAgICBsZWdlbmQub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0sXG5cbiAgLy8gVGhlIGxhYmVscyBuZWVkIHRvIGJlIGJ1aWx0IGFmdGVyIGRhdGFzZXRzIGFyZSB1cGRhdGVkIHRvIGVuc3VyZSB0aGF0IGNvbG9yc1xuICAvLyBhbmQgb3RoZXIgc3R5bGluZyBhcmUgY29ycmVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy82OTY4XG4gIGFmdGVyVXBkYXRlKGNoYXJ0KSB7XG4gICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xuICAgIGxlZ2VuZC5idWlsZExhYmVscygpO1xuICAgIGxlZ2VuZC5hZGp1c3RIaXRCb3hlcygpO1xuICB9LFxuXG5cbiAgYWZ0ZXJFdmVudChjaGFydCwgYXJncykge1xuICAgIGlmICghYXJncy5yZXBsYXkpIHtcbiAgICAgIGNoYXJ0LmxlZ2VuZC5oYW5kbGVFdmVudChhcmdzLmV2ZW50KTtcbiAgICB9XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBkaXNwbGF5OiB0cnVlLFxuICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgZnVsbFNpemU6IHRydWUsXG4gICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgd2VpZ2h0OiAxMDAwLFxuXG4gICAgLy8gYSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlXG4gICAgb25DbGljayhlLCBsZWdlbmRJdGVtLCBsZWdlbmQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGVnZW5kSXRlbS5kYXRhc2V0SW5kZXg7XG4gICAgICBjb25zdCBjaSA9IGxlZ2VuZC5jaGFydDtcbiAgICAgIGlmIChjaS5pc0RhdGFzZXRWaXNpYmxlKGluZGV4KSkge1xuICAgICAgICBjaS5oaWRlKGluZGV4KTtcbiAgICAgICAgbGVnZW5kSXRlbS5oaWRkZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2kuc2hvdyhpbmRleCk7XG4gICAgICAgIGxlZ2VuZEl0ZW0uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXI6IG51bGwsXG4gICAgb25MZWF2ZTogbnVsbCxcblxuICAgIGxhYmVsczoge1xuICAgICAgY29sb3I6IChjdHgpID0+IGN0eC5jaGFydC5vcHRpb25zLmNvbG9yLFxuICAgICAgYm94V2lkdGg6IDQwLFxuICAgICAgcGFkZGluZzogMTAsXG4gICAgICAvLyBHZW5lcmF0ZXMgbGFiZWxzIHNob3duIGluIHRoZSBsZWdlbmRcbiAgICAgIC8vIFZhbGlkIHByb3BlcnRpZXMgdG8gcmV0dXJuOlxuICAgICAgLy8gdGV4dCA6IHRleHQgdG8gZGlzcGxheVxuICAgICAgLy8gZmlsbFN0eWxlIDogZmlsbCBvZiBjb2xvdXJlZCBib3hcbiAgICAgIC8vIHN0cm9rZVN0eWxlOiBzdHJva2Ugb2YgY29sb3VyZWQgYm94XG4gICAgICAvLyBoaWRkZW4gOiBpZiB0aGlzIGxlZ2VuZCBpdGVtIHJlZmVycyB0byBhIGhpZGRlbiBpdGVtXG4gICAgICAvLyBsaW5lQ2FwIDogY2FwIHN0eWxlIGZvciBsaW5lXG4gICAgICAvLyBsaW5lRGFzaFxuICAgICAgLy8gbGluZURhc2hPZmZzZXQgOlxuICAgICAgLy8gbGluZUpvaW4gOlxuICAgICAgLy8gbGluZVdpZHRoIDpcbiAgICAgIGdlbmVyYXRlTGFiZWxzKGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRzID0gY2hhcnQuZGF0YS5kYXRhc2V0cztcbiAgICAgICAgY29uc3Qge2xhYmVsczoge3VzZVBvaW50U3R5bGUsIHBvaW50U3R5bGUsIHRleHRBbGlnbiwgY29sb3IsIHVzZUJvcmRlclJhZGl1cywgYm9yZGVyUmFkaXVzfX0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gY2hhcnQuX2dldFNvcnRlZERhdGFzZXRNZXRhcygpLm1hcCgobWV0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0eWxlID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKHVzZVBvaW50U3R5bGUgPyAwIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRvUGFkZGluZyhzdHlsZS5ib3JkZXJXaWR0aCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogZGF0YXNldHNbbWV0YS5pbmRleF0ubGFiZWwsXG4gICAgICAgICAgICBmaWxsU3R5bGU6IHN0eWxlLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGZvbnRDb2xvcjogY29sb3IsXG4gICAgICAgICAgICBoaWRkZW46ICFtZXRhLnZpc2libGUsXG4gICAgICAgICAgICBsaW5lQ2FwOiBzdHlsZS5ib3JkZXJDYXBTdHlsZSxcbiAgICAgICAgICAgIGxpbmVEYXNoOiBzdHlsZS5ib3JkZXJEYXNoLFxuICAgICAgICAgICAgbGluZURhc2hPZmZzZXQ6IHN0eWxlLmJvcmRlckRhc2hPZmZzZXQsXG4gICAgICAgICAgICBsaW5lSm9pbjogc3R5bGUuYm9yZGVySm9pblN0eWxlLFxuICAgICAgICAgICAgbGluZVdpZHRoOiAoYm9yZGVyV2lkdGgud2lkdGggKyBib3JkZXJXaWR0aC5oZWlnaHQpIC8gNCxcbiAgICAgICAgICAgIHN0cm9rZVN0eWxlOiBzdHlsZS5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIHBvaW50U3R5bGU6IHBvaW50U3R5bGUgfHwgc3R5bGUucG9pbnRTdHlsZSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiBzdHlsZS5yb3RhdGlvbixcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dEFsaWduIHx8IHN0eWxlLnRleHRBbGlnbixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogdXNlQm9yZGVyUmFkaXVzICYmIChib3JkZXJSYWRpdXMgfHwgc3R5bGUuYm9yZGVyUmFkaXVzKSxcblxuICAgICAgICAgICAgLy8gQmVsb3cgaXMgZXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgZGF0YXNldHNcbiAgICAgICAgICAgIGRhdGFzZXRJbmRleDogbWV0YS5pbmRleFxuICAgICAgICAgIH07XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICB0aXRsZToge1xuICAgICAgY29sb3I6IChjdHgpID0+IGN0eC5jaGFydC5vcHRpb25zLmNvbG9yLFxuICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICB0ZXh0OiAnJyxcbiAgICB9XG4gIH0sXG5cbiAgZGVzY3JpcHRvcnM6IHtcbiAgICBfc2NyaXB0YWJsZTogKG5hbWUpID0+ICFuYW1lLnN0YXJ0c1dpdGgoJ29uJyksXG4gICAgbGFiZWxzOiB7XG4gICAgICBfc2NyaXB0YWJsZTogKG5hbWUpID0+ICFbJ2dlbmVyYXRlTGFiZWxzJywgJ2ZpbHRlcicsICdzb3J0J10uaW5jbHVkZXMobmFtZSksXG4gICAgfVxuICB9LFxufTtcbiIsICJpbXBvcnQgRWxlbWVudCBmcm9tICcuLi9jb3JlL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQgbGF5b3V0cyBmcm9tICcuLi9jb3JlL2NvcmUubGF5b3V0cy5qcyc7XG5pbXBvcnQge1BJLCBpc0FycmF5LCB0b1BhZGRpbmcsIHRvRm9udH0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG5pbXBvcnQge190b0xlZnRSaWdodENlbnRlciwgX2FsaWduU3RhcnRFbmR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5leHRyYXMuanMnO1xuaW1wb3J0IHtyZW5kZXJUZXh0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgRWxlbWVudCB7XG4gIC8qKlxuXHQgKiBAcGFyYW0ge3sgY3R4OiBhbnk7IG9wdGlvbnM6IGFueTsgY2hhcnQ6IGFueTsgfX0gY29uZmlnXG5cdCAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jaGFydCA9IGNvbmZpZy5jaGFydDtcbiAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICB0aGlzLmN0eCA9IGNvbmZpZy5jdHg7XG4gICAgdGhpcy5fcGFkZGluZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxlZnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53ZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mdWxsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcblxuICAgIHRoaXMubGVmdCA9IDA7XG4gICAgdGhpcy50b3AgPSAwO1xuXG4gICAgaWYgKCFvcHRzLmRpc3BsYXkpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodCA9IHRoaXMucmlnaHQgPSB0aGlzLmJvdHRvbSA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53aWR0aCA9IHRoaXMucmlnaHQgPSBtYXhXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuYm90dG9tID0gbWF4SGVpZ2h0O1xuXG4gICAgY29uc3QgbGluZUNvdW50ID0gaXNBcnJheShvcHRzLnRleHQpID8gb3B0cy50ZXh0Lmxlbmd0aCA6IDE7XG4gICAgdGhpcy5fcGFkZGluZyA9IHRvUGFkZGluZyhvcHRzLnBhZGRpbmcpO1xuICAgIGNvbnN0IHRleHRTaXplID0gbGluZUNvdW50ICogdG9Gb250KG9wdHMuZm9udCkubGluZUhlaWdodCArIHRoaXMuX3BhZGRpbmcuaGVpZ2h0O1xuXG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGV4dFNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2lkdGggPSB0ZXh0U2l6ZTtcbiAgICB9XG4gIH1cblxuICBpc0hvcml6b250YWwoKSB7XG4gICAgY29uc3QgcG9zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgIHJldHVybiBwb3MgPT09ICd0b3AnIHx8IHBvcyA9PT0gJ2JvdHRvbSc7XG4gIH1cblxuICBfZHJhd0FyZ3Mob2Zmc2V0KSB7XG4gICAgY29uc3Qge3RvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgb3B0aW9uc30gPSB0aGlzO1xuICAgIGNvbnN0IGFsaWduID0gb3B0aW9ucy5hbGlnbjtcbiAgICBsZXQgcm90YXRpb24gPSAwO1xuICAgIGxldCBtYXhXaWR0aCwgdGl0bGVYLCB0aXRsZVk7XG5cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgdGl0bGVYID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIGxlZnQsIHJpZ2h0KTtcbiAgICAgIHRpdGxlWSA9IHRvcCArIG9mZnNldDtcbiAgICAgIG1heFdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHRpdGxlWCA9IGxlZnQgKyBvZmZzZXQ7XG4gICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBib3R0b20sIHRvcCk7XG4gICAgICAgIHJvdGF0aW9uID0gUEkgKiAtMC41O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVYID0gcmlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0b3AsIGJvdHRvbSk7XG4gICAgICAgIHJvdGF0aW9uID0gUEkgKiAwLjU7XG4gICAgICB9XG4gICAgICBtYXhXaWR0aCA9IGJvdHRvbSAtIHRvcDtcbiAgICB9XG4gICAgcmV0dXJuIHt0aXRsZVgsIHRpdGxlWSwgbWF4V2lkdGgsIHJvdGF0aW9ufTtcbiAgfVxuXG4gIGRyYXcoKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmICghb3B0cy5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9udE9wdHMgPSB0b0ZvbnQob3B0cy5mb250KTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZm9udE9wdHMubGluZUhlaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMiArIHRoaXMuX3BhZGRpbmcudG9wO1xuICAgIGNvbnN0IHt0aXRsZVgsIHRpdGxlWSwgbWF4V2lkdGgsIHJvdGF0aW9ufSA9IHRoaXMuX2RyYXdBcmdzKG9mZnNldCk7XG5cbiAgICByZW5kZXJUZXh0KGN0eCwgb3B0cy50ZXh0LCAwLCAwLCBmb250T3B0cywge1xuICAgICAgY29sb3I6IG9wdHMuY29sb3IsXG4gICAgICBtYXhXaWR0aCxcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgdGV4dEFsaWduOiBfdG9MZWZ0UmlnaHRDZW50ZXIob3B0cy5hbGlnbiksXG4gICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgdHJhbnNsYXRpb246IFt0aXRsZVgsIHRpdGxlWV0sXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVGl0bGUoY2hhcnQsIHRpdGxlT3B0cykge1xuICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgY3R4OiBjaGFydC5jdHgsXG4gICAgb3B0aW9uczogdGl0bGVPcHRzLFxuICAgIGNoYXJ0XG4gIH0pO1xuXG4gIGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCB0aXRsZSwgdGl0bGVPcHRzKTtcbiAgbGF5b3V0cy5hZGRCb3goY2hhcnQsIHRpdGxlKTtcbiAgY2hhcnQudGl0bGVCbG9jayA9IHRpdGxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAndGl0bGUnLFxuXG4gIC8qKlxuXHQgKiBGb3IgdGVzdHNcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9lbGVtZW50OiBUaXRsZSxcblxuICBzdGFydChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVUaXRsZShjaGFydCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgc3RvcChjaGFydCkge1xuICAgIGNvbnN0IHRpdGxlQmxvY2sgPSBjaGFydC50aXRsZUJsb2NrO1xuICAgIGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCB0aXRsZUJsb2NrKTtcbiAgICBkZWxldGUgY2hhcnQudGl0bGVCbG9jaztcbiAgfSxcblxuICBiZWZvcmVVcGRhdGUoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGl0bGUgPSBjaGFydC50aXRsZUJsb2NrO1xuICAgIGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCB0aXRsZSwgb3B0aW9ucyk7XG4gICAgdGl0bGUub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgZGlzcGxheTogZmFsc2UsXG4gICAgZm9udDoge1xuICAgICAgd2VpZ2h0OiAnYm9sZCcsXG4gICAgfSxcbiAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICBwYWRkaW5nOiAxMCxcbiAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgdGV4dDogJycsXG4gICAgd2VpZ2h0OiAyMDAwICAgICAgICAgLy8gYnkgZGVmYXVsdCBncmVhdGVyIHRoYW4gbGVnZW5kICgxMDAwKSB0byBiZSBhYm92ZVxuICB9LFxuXG4gIGRlZmF1bHRSb3V0ZXM6IHtcbiAgICBjb2xvcjogJ2NvbG9yJ1xuICB9LFxuXG4gIGRlc2NyaXB0b3JzOiB7XG4gICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgX2luZGV4YWJsZTogZmFsc2UsXG4gIH0sXG59O1xuIiwgImltcG9ydCB7VGl0bGV9IGZyb20gJy4vcGx1Z2luLnRpdGxlLmpzJztcbmltcG9ydCBsYXlvdXRzIGZyb20gJy4uL2NvcmUvY29yZS5sYXlvdXRzLmpzJztcblxuY29uc3QgbWFwID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ3N1YnRpdGxlJyxcblxuICBzdGFydChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgICBjdHg6IGNoYXJ0LmN0eCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBjaGFydFxuICAgIH0pO1xuXG4gICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCBvcHRpb25zKTtcbiAgICBsYXlvdXRzLmFkZEJveChjaGFydCwgdGl0bGUpO1xuICAgIG1hcC5zZXQoY2hhcnQsIHRpdGxlKTtcbiAgfSxcblxuICBzdG9wKGNoYXJ0KSB7XG4gICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIG1hcC5nZXQoY2hhcnQpKTtcbiAgICBtYXAuZGVsZXRlKGNoYXJ0KTtcbiAgfSxcblxuICBiZWZvcmVVcGRhdGUoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGl0bGUgPSBtYXAuZ2V0KGNoYXJ0KTtcbiAgICBsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgdGl0bGUsIG9wdGlvbnMpO1xuICAgIHRpdGxlLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9LFxuXG4gIGRlZmF1bHRzOiB7XG4gICAgYWxpZ246ICdjZW50ZXInLFxuICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgIGZvbnQ6IHtcbiAgICAgIHdlaWdodDogJ25vcm1hbCcsXG4gICAgfSxcbiAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICBwYWRkaW5nOiAwLFxuICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICB0ZXh0OiAnJyxcbiAgICB3ZWlnaHQ6IDE1MDAgICAgICAgICAvLyBieSBkZWZhdWx0IGdyZWF0ZXIgdGhhbiBsZWdlbmQgKDEwMDApIGFuZCBzbWFsbGVyIHRoYW4gdGl0bGUgKDIwMDApXG4gIH0sXG5cbiAgZGVmYXVsdFJvdXRlczoge1xuICAgIGNvbG9yOiAnY29sb3InXG4gIH0sXG5cbiAgZGVzY3JpcHRvcnM6IHtcbiAgICBfc2NyaXB0YWJsZTogdHJ1ZSxcbiAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgfSxcbn07XG4iLCAiaW1wb3J0IEFuaW1hdGlvbnMgZnJvbSAnLi4vY29yZS9jb3JlLmFuaW1hdGlvbnMuanMnO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHthZGRSb3VuZGVkUmVjdFBhdGh9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHtlYWNoLCBub29wLCBpc051bGxPclVuZGVmLCBpc0FycmF5LCBfZWxlbWVudHNFcXVhbCwgaXNPYmplY3R9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7dG9Gb250LCB0b1BhZGRpbmcsIHRvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcbmltcG9ydCB7Z2V0UnRsQWRhcHRlciwgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uLCByZXN0b3JlVGV4dERpcmVjdGlvbn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLnJ0bC5qcyc7XG5pbXBvcnQge2Rpc3RhbmNlQmV0d2VlblBvaW50cywgX2xpbWl0VmFsdWV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7Y3JlYXRlQ29udGV4dCwgZHJhd1BvaW50fSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vcGxhdGZvcm0vcGxhdGZvcm0uYmFzZS5qcycpLkNoYXJ0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLkNoYXJ0RXZlbnQgfSBDaGFydEV2ZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5BY3RpdmVFbGVtZW50IH0gQWN0aXZlRWxlbWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5pbnRlcmFjdGlvbi5qcycpLkludGVyYWN0aW9uSXRlbSB9IEludGVyYWN0aW9uSXRlbVxuICovXG5cbmNvbnN0IHBvc2l0aW9uZXJzID0ge1xuICAvKipcblx0ICogQXZlcmFnZSBtb2RlIHBsYWNlcyB0aGUgdG9vbHRpcCBhdCB0aGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgc2hvd25cblx0ICovXG4gIGF2ZXJhZ2UoaXRlbXMpIHtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpLCBsZW47XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGNvbnN0IGVsID0gaXRlbXNbaV0uZWxlbWVudDtcbiAgICAgIGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IGVsLnRvb2x0aXBQb3NpdGlvbigpO1xuICAgICAgICB4ICs9IHBvcy54O1xuICAgICAgICB5ICs9IHBvcy55O1xuICAgICAgICArK2NvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB4IC8gY291bnQsXG4gICAgICB5OiB5IC8gY291bnRcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuXHQgKiBHZXRzIHRoZSB0b29sdGlwIHBvc2l0aW9uIG5lYXJlc3Qgb2YgdGhlIGl0ZW0gbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb25cblx0ICovXG4gIG5lYXJlc3QoaXRlbXMsIGV2ZW50UG9zaXRpb24pIHtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB4ID0gZXZlbnRQb3NpdGlvbi54O1xuICAgIGxldCB5ID0gZXZlbnRQb3NpdGlvbi55O1xuICAgIGxldCBtaW5EaXN0YW5jZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBsZXQgaSwgbGVuLCBuZWFyZXN0RWxlbWVudDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjb25zdCBlbCA9IGl0ZW1zW2ldLmVsZW1lbnQ7XG4gICAgICBpZiAoZWwgJiYgZWwuaGFzVmFsdWUoKSkge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBlbC5nZXRDZW50ZXJQb2ludCgpO1xuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGV2ZW50UG9zaXRpb24sIGNlbnRlcik7XG5cbiAgICAgICAgaWYgKGQgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgIG1pbkRpc3RhbmNlID0gZDtcbiAgICAgICAgICBuZWFyZXN0RWxlbWVudCA9IGVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RFbGVtZW50KSB7XG4gICAgICBjb25zdCB0cCA9IG5lYXJlc3RFbGVtZW50LnRvb2x0aXBQb3NpdGlvbigpO1xuICAgICAgeCA9IHRwLng7XG4gICAgICB5ID0gdHAueTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICB9XG59O1xuXG4vLyBIZWxwZXIgdG8gcHVzaCBvciBjb25jYXQgYmFzZWQgb24gaWYgdGhlIDJuZCBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb3Igbm90XG5mdW5jdGlvbiBwdXNoT3JDb25jYXQoYmFzZSwgdG9QdXNoKSB7XG4gIGlmICh0b1B1c2gpIHtcbiAgICBpZiAoaXNBcnJheSh0b1B1c2gpKSB7XG4gICAgICAvLyBiYXNlID0gYmFzZS5jb25jYXQodG9QdXNoKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGJhc2UsIHRvUHVzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2UucHVzaCh0b1B1c2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYXNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2Ygc3RyaW5ncyBzcGxpdCBieSBuZXdsaW5lXG4gKiBAcGFyYW0geyp9IHN0ciAtIFRoZSB2YWx1ZSB0byBzcGxpdCBieSBuZXdsaW5lLlxuICogQHJldHVybnMge3N0cmluZ3xzdHJpbmdbXX0gdmFsdWUgaWYgbmV3bGluZSBwcmVzZW50IC0gUmV0dXJuZWQgZnJvbSBTdHJpbmcgc3BsaXQoKSBtZXRob2RcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBzcGxpdE5ld2xpbmVzKHN0cikge1xuICBpZiAoKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IHN0ciBpbnN0YW5jZW9mIFN0cmluZykgJiYgc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICByZXR1cm4gc3RyLnNwbGl0KCdcXG4nKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5cbi8qKlxuICogUHJpdmF0ZSBoZWxwZXIgdG8gY3JlYXRlIGEgdG9vbHRpcCBpdGVtIG1vZGVsXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuICogQHBhcmFtIHtBY3RpdmVFbGVtZW50fSBpdGVtIC0ge2VsZW1lbnQsIGluZGV4LCBkYXRhc2V0SW5kZXh9IHRvIGNyZWF0ZSB0aGUgdG9vbHRpcCBpdGVtIGZvclxuICogQHJldHVybiBuZXcgdG9vbHRpcCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRvb2x0aXBJdGVtKGNoYXJ0LCBpdGVtKSB7XG4gIGNvbnN0IHtlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fSA9IGl0ZW07XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXI7XG4gIGNvbnN0IHtsYWJlbCwgdmFsdWV9ID0gY29udHJvbGxlci5nZXRMYWJlbEFuZFZhbHVlKGluZGV4KTtcblxuICByZXR1cm4ge1xuICAgIGNoYXJ0LFxuICAgIGxhYmVsLFxuICAgIHBhcnNlZDogY29udHJvbGxlci5nZXRQYXJzZWQoaW5kZXgpLFxuICAgIHJhdzogY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdLFxuICAgIGZvcm1hdHRlZFZhbHVlOiB2YWx1ZSxcbiAgICBkYXRhc2V0OiBjb250cm9sbGVyLmdldERhdGFzZXQoKSxcbiAgICBkYXRhSW5kZXg6IGluZGV4LFxuICAgIGRhdGFzZXRJbmRleCxcbiAgICBlbGVtZW50XG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaXplIG9mIHRoZSB0b29sdGlwXG4gKi9cbmZ1bmN0aW9uIGdldFRvb2x0aXBTaXplKHRvb2x0aXAsIG9wdGlvbnMpIHtcbiAgY29uc3QgY3R4ID0gdG9vbHRpcC5jaGFydC5jdHg7XG4gIGNvbnN0IHtib2R5LCBmb290ZXIsIHRpdGxlfSA9IHRvb2x0aXA7XG4gIGNvbnN0IHtib3hXaWR0aCwgYm94SGVpZ2h0fSA9IG9wdGlvbnM7XG4gIGNvbnN0IGJvZHlGb250ID0gdG9Gb250KG9wdGlvbnMuYm9keUZvbnQpO1xuICBjb25zdCB0aXRsZUZvbnQgPSB0b0ZvbnQob3B0aW9ucy50aXRsZUZvbnQpO1xuICBjb25zdCBmb290ZXJGb250ID0gdG9Gb250KG9wdGlvbnMuZm9vdGVyRm9udCk7XG4gIGNvbnN0IHRpdGxlTGluZUNvdW50ID0gdGl0bGUubGVuZ3RoO1xuICBjb25zdCBmb290ZXJMaW5lQ291bnQgPSBmb290ZXIubGVuZ3RoO1xuICBjb25zdCBib2R5TGluZUl0ZW1Db3VudCA9IGJvZHkubGVuZ3RoO1xuXG4gIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcob3B0aW9ucy5wYWRkaW5nKTtcbiAgbGV0IGhlaWdodCA9IHBhZGRpbmcuaGVpZ2h0O1xuICBsZXQgd2lkdGggPSAwO1xuXG4gIC8vIENvdW50IG9mIGFsbCBsaW5lcyBpbiB0aGUgYm9keVxuICBsZXQgY29tYmluZWRCb2R5TGVuZ3RoID0gYm9keS5yZWR1Y2UoKGNvdW50LCBib2R5SXRlbSkgPT4gY291bnQgKyBib2R5SXRlbS5iZWZvcmUubGVuZ3RoICsgYm9keUl0ZW0ubGluZXMubGVuZ3RoICsgYm9keUl0ZW0uYWZ0ZXIubGVuZ3RoLCAwKTtcbiAgY29tYmluZWRCb2R5TGVuZ3RoICs9IHRvb2x0aXAuYmVmb3JlQm9keS5sZW5ndGggKyB0b29sdGlwLmFmdGVyQm9keS5sZW5ndGg7XG5cbiAgaWYgKHRpdGxlTGluZUNvdW50KSB7XG4gICAgaGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ICogdGl0bGVGb250LmxpbmVIZWlnaHRcblx0XHRcdCsgKHRpdGxlTGluZUNvdW50IC0gMSkgKiBvcHRpb25zLnRpdGxlU3BhY2luZ1xuXHRcdFx0KyBvcHRpb25zLnRpdGxlTWFyZ2luQm90dG9tO1xuICB9XG4gIGlmIChjb21iaW5lZEJvZHlMZW5ndGgpIHtcbiAgICAvLyBCb2R5IGxpbmVzIG1heSBpbmNsdWRlIHNvbWUgZXh0cmEgaGVpZ2h0IGRlcGVuZGluZyBvbiBib3hIZWlnaHRcbiAgICBjb25zdCBib2R5TGluZUhlaWdodCA9IG9wdGlvbnMuZGlzcGxheUNvbG9ycyA/IE1hdGgubWF4KGJveEhlaWdodCwgYm9keUZvbnQubGluZUhlaWdodCkgOiBib2R5Rm9udC5saW5lSGVpZ2h0O1xuICAgIGhlaWdodCArPSBib2R5TGluZUl0ZW1Db3VudCAqIGJvZHlMaW5lSGVpZ2h0XG5cdFx0XHQrIChjb21iaW5lZEJvZHlMZW5ndGggLSBib2R5TGluZUl0ZW1Db3VudCkgKiBib2R5Rm9udC5saW5lSGVpZ2h0XG5cdFx0XHQrIChjb21iaW5lZEJvZHlMZW5ndGggLSAxKSAqIG9wdGlvbnMuYm9keVNwYWNpbmc7XG4gIH1cbiAgaWYgKGZvb3RlckxpbmVDb3VudCkge1xuICAgIGhlaWdodCArPSBvcHRpb25zLmZvb3Rlck1hcmdpblRvcFxuXHRcdFx0KyBmb290ZXJMaW5lQ291bnQgKiBmb290ZXJGb250LmxpbmVIZWlnaHRcblx0XHRcdCsgKGZvb3RlckxpbmVDb3VudCAtIDEpICogb3B0aW9ucy5mb290ZXJTcGFjaW5nO1xuICB9XG5cbiAgLy8gVGl0bGUgd2lkdGhcbiAgbGV0IHdpZHRoUGFkZGluZyA9IDA7XG4gIGNvbnN0IG1heExpbmVXaWR0aCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdHgubWVhc3VyZVRleHQobGluZSkud2lkdGggKyB3aWR0aFBhZGRpbmcpO1xuICB9O1xuXG4gIGN0eC5zYXZlKCk7XG5cbiAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuICBlYWNoKHRvb2x0aXAudGl0bGUsIG1heExpbmVXaWR0aCk7XG5cbiAgLy8gQm9keSB3aWR0aFxuICBjdHguZm9udCA9IGJvZHlGb250LnN0cmluZztcbiAgZWFjaCh0b29sdGlwLmJlZm9yZUJvZHkuY29uY2F0KHRvb2x0aXAuYWZ0ZXJCb2R5KSwgbWF4TGluZVdpZHRoKTtcblxuICAvLyBCb2R5IGxpbmVzIG1heSBpbmNsdWRlIHNvbWUgZXh0cmEgd2lkdGggZHVlIHRvIHRoZSBjb2xvciBib3hcbiAgd2lkdGhQYWRkaW5nID0gb3B0aW9ucy5kaXNwbGF5Q29sb3JzID8gKGJveFdpZHRoICsgMiArIG9wdGlvbnMuYm94UGFkZGluZykgOiAwO1xuICBlYWNoKGJvZHksIChib2R5SXRlbSkgPT4ge1xuICAgIGVhY2goYm9keUl0ZW0uYmVmb3JlLCBtYXhMaW5lV2lkdGgpO1xuICAgIGVhY2goYm9keUl0ZW0ubGluZXMsIG1heExpbmVXaWR0aCk7XG4gICAgZWFjaChib2R5SXRlbS5hZnRlciwgbWF4TGluZVdpZHRoKTtcbiAgfSk7XG5cbiAgLy8gUmVzZXQgYmFjayB0byAwXG4gIHdpZHRoUGFkZGluZyA9IDA7XG5cbiAgLy8gRm9vdGVyIHdpZHRoXG4gIGN0eC5mb250ID0gZm9vdGVyRm9udC5zdHJpbmc7XG4gIGVhY2godG9vbHRpcC5mb290ZXIsIG1heExpbmVXaWR0aCk7XG5cbiAgY3R4LnJlc3RvcmUoKTtcblxuICAvLyBBZGQgcGFkZGluZ1xuICB3aWR0aCArPSBwYWRkaW5nLndpZHRoO1xuXG4gIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSkge1xuICBjb25zdCB7eSwgaGVpZ2h0fSA9IHNpemU7XG5cbiAgaWYgKHkgPCBoZWlnaHQgLyAyKSB7XG4gICAgcmV0dXJuICd0b3AnO1xuICB9IGVsc2UgaWYgKHkgPiAoY2hhcnQuaGVpZ2h0IC0gaGVpZ2h0IC8gMikpIHtcbiAgICByZXR1cm4gJ2JvdHRvbSc7XG4gIH1cbiAgcmV0dXJuICdjZW50ZXInO1xufVxuXG5mdW5jdGlvbiBkb2VzTm90Rml0V2l0aEFsaWduKHhBbGlnbiwgY2hhcnQsIG9wdGlvbnMsIHNpemUpIHtcbiAgY29uc3Qge3gsIHdpZHRofSA9IHNpemU7XG4gIGNvbnN0IGNhcmV0ID0gb3B0aW9ucy5jYXJldFNpemUgKyBvcHRpb25zLmNhcmV0UGFkZGluZztcbiAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnICYmIHggKyB3aWR0aCArIGNhcmV0ID4gY2hhcnQud2lkdGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh4QWxpZ24gPT09ICdyaWdodCcgJiYgeCAtIHdpZHRoIC0gY2FyZXQgPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lWEFsaWduKGNoYXJ0LCBvcHRpb25zLCBzaXplLCB5QWxpZ24pIHtcbiAgY29uc3Qge3gsIHdpZHRofSA9IHNpemU7XG4gIGNvbnN0IHt3aWR0aDogY2hhcnRXaWR0aCwgY2hhcnRBcmVhOiB7bGVmdCwgcmlnaHR9fSA9IGNoYXJ0O1xuICBsZXQgeEFsaWduID0gJ2NlbnRlcic7XG5cbiAgaWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICB4QWxpZ24gPSB4IDw9IChsZWZ0ICsgcmlnaHQpIC8gMiA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gIH0gZWxzZSBpZiAoeCA8PSB3aWR0aCAvIDIpIHtcbiAgICB4QWxpZ24gPSAnbGVmdCc7XG4gIH0gZWxzZSBpZiAoeCA+PSBjaGFydFdpZHRoIC0gd2lkdGggLyAyKSB7XG4gICAgeEFsaWduID0gJ3JpZ2h0JztcbiAgfVxuXG4gIGlmIChkb2VzTm90Rml0V2l0aEFsaWduKHhBbGlnbiwgY2hhcnQsIG9wdGlvbnMsIHNpemUpKSB7XG4gICAgeEFsaWduID0gJ2NlbnRlcic7XG4gIH1cblxuICByZXR1cm4geEFsaWduO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIGFsaWdubWVudCBvZiBhIHRvb2x0aXAgZ2l2ZW4gdGhlIHNpemVcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQWxpZ25tZW50KGNoYXJ0LCBvcHRpb25zLCBzaXplKSB7XG4gIGNvbnN0IHlBbGlnbiA9IHNpemUueUFsaWduIHx8IG9wdGlvbnMueUFsaWduIHx8IGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICB4QWxpZ246IHNpemUueEFsaWduIHx8IG9wdGlvbnMueEFsaWduIHx8IGRldGVybWluZVhBbGlnbihjaGFydCwgb3B0aW9ucywgc2l6ZSwgeUFsaWduKSxcbiAgICB5QWxpZ25cbiAgfTtcbn1cblxuZnVuY3Rpb24gYWxpZ25YKHNpemUsIHhBbGlnbikge1xuICBsZXQge3gsIHdpZHRofSA9IHNpemU7XG4gIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICB4IC09IHdpZHRoO1xuICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICB4IC09ICh3aWR0aCAvIDIpO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBhbGlnblkoc2l6ZSwgeUFsaWduLCBwYWRkaW5nQW5kU2l6ZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCB7eSwgaGVpZ2h0fSA9IHNpemU7XG4gIGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XG4gICAgeSArPSBwYWRkaW5nQW5kU2l6ZTtcbiAgfSBlbHNlIGlmICh5QWxpZ24gPT09ICdib3R0b20nKSB7XG4gICAgeSAtPSBoZWlnaHQgKyBwYWRkaW5nQW5kU2l6ZTtcbiAgfSBlbHNlIHtcbiAgICB5IC09IChoZWlnaHQgLyAyKTtcbiAgfVxuICByZXR1cm4geTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IHRoZSBsb2NhdGlvbiBhIHRvb2x0aXAgbmVlZHMgdG8gYmUgcGxhY2VkIGF0IGdpdmVuIHRoZSBpbml0aWFsIHBvc2l0aW9uICh2aWEgdGhlIHZtKSBhbmQgdGhlIHNpemUgYW5kIGFsaWdubWVudFxuICovXG5mdW5jdGlvbiBnZXRCYWNrZ3JvdW5kUG9pbnQob3B0aW9ucywgc2l6ZSwgYWxpZ25tZW50LCBjaGFydCkge1xuICBjb25zdCB7Y2FyZXRTaXplLCBjYXJldFBhZGRpbmcsIGNvcm5lclJhZGl1c30gPSBvcHRpb25zO1xuICBjb25zdCB7eEFsaWduLCB5QWxpZ259ID0gYWxpZ25tZW50O1xuICBjb25zdCBwYWRkaW5nQW5kU2l6ZSA9IGNhcmV0U2l6ZSArIGNhcmV0UGFkZGluZztcbiAgY29uc3Qge3RvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodH0gPSB0b1RSQkxDb3JuZXJzKGNvcm5lclJhZGl1cyk7XG5cbiAgbGV0IHggPSBhbGlnblgoc2l6ZSwgeEFsaWduKTtcbiAgY29uc3QgeSA9IGFsaWduWShzaXplLCB5QWxpZ24sIHBhZGRpbmdBbmRTaXplKTtcblxuICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgeCArPSBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgeCAtPSBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcbiAgICB4IC09IE1hdGgubWF4KHRvcExlZnQsIGJvdHRvbUxlZnQpICsgY2FyZXRTaXplO1xuICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgIHggKz0gTWF0aC5tYXgodG9wUmlnaHQsIGJvdHRvbVJpZ2h0KSArIGNhcmV0U2l6ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogX2xpbWl0VmFsdWUoeCwgMCwgY2hhcnQud2lkdGggLSBzaXplLndpZHRoKSxcbiAgICB5OiBfbGltaXRWYWx1ZSh5LCAwLCBjaGFydC5oZWlnaHQgLSBzaXplLmhlaWdodClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25lZFgodG9vbHRpcCwgYWxpZ24sIG9wdGlvbnMpIHtcbiAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuXG4gIHJldHVybiBhbGlnbiA9PT0gJ2NlbnRlcidcbiAgICA/IHRvb2x0aXAueCArIHRvb2x0aXAud2lkdGggLyAyXG4gICAgOiBhbGlnbiA9PT0gJ3JpZ2h0J1xuICAgICAgPyB0b29sdGlwLnggKyB0b29sdGlwLndpZHRoIC0gcGFkZGluZy5yaWdodFxuICAgICAgOiB0b29sdGlwLnggKyBwYWRkaW5nLmxlZnQ7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGJ1aWxkIGJlZm9yZSBhbmQgYWZ0ZXIgYm9keSBsaW5lc1xuICovXG5mdW5jdGlvbiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyhjYWxsYmFjaykge1xuICByZXR1cm4gcHVzaE9yQ29uY2F0KFtdLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRvb2x0aXBDb250ZXh0KHBhcmVudCwgdG9vbHRpcCwgdG9vbHRpcEl0ZW1zKSB7XG4gIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgIHRvb2x0aXAsXG4gICAgdG9vbHRpcEl0ZW1zLFxuICAgIHR5cGU6ICd0b29sdGlwJ1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb3ZlcnJpZGVDYWxsYmFja3MoY2FsbGJhY2tzLCBjb250ZXh0KSB7XG4gIGNvbnN0IG92ZXJyaWRlID0gY29udGV4dCAmJiBjb250ZXh0LmRhdGFzZXQgJiYgY29udGV4dC5kYXRhc2V0LnRvb2x0aXAgJiYgY29udGV4dC5kYXRhc2V0LnRvb2x0aXAuY2FsbGJhY2tzO1xuICByZXR1cm4gb3ZlcnJpZGUgPyBjYWxsYmFja3Mub3ZlcnJpZGUob3ZlcnJpZGUpIDogY2FsbGJhY2tzO1xufVxuXG5jb25zdCBkZWZhdWx0Q2FsbGJhY2tzID0ge1xuICAvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcbiAgYmVmb3JlVGl0bGU6IG5vb3AsXG4gIHRpdGxlKHRvb2x0aXBJdGVtcykge1xuICAgIGlmICh0b29sdGlwSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRvb2x0aXBJdGVtc1swXTtcbiAgICAgIGNvbnN0IGxhYmVscyA9IGl0ZW0uY2hhcnQuZGF0YS5sYWJlbHM7XG4gICAgICBjb25zdCBsYWJlbENvdW50ID0gbGFiZWxzID8gbGFiZWxzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmICh0aGlzICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubW9kZSA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmRhdGFzZXQubGFiZWwgfHwgJyc7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0ubGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICB9IGVsc2UgaWYgKGxhYmVsQ291bnQgPiAwICYmIGl0ZW0uZGF0YUluZGV4IDwgbGFiZWxDb3VudCkge1xuICAgICAgICByZXR1cm4gbGFiZWxzW2l0ZW0uZGF0YUluZGV4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH0sXG4gIGFmdGVyVGl0bGU6IG5vb3AsXG5cbiAgLy8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXG4gIGJlZm9yZUJvZHk6IG5vb3AsXG5cbiAgLy8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcbiAgYmVmb3JlTGFiZWw6IG5vb3AsXG4gIGxhYmVsKHRvb2x0aXBJdGVtKSB7XG4gICAgaWYgKHRoaXMgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgIHJldHVybiB0b29sdGlwSXRlbS5sYWJlbCArICc6ICcgKyB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZSB8fCB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgbGFiZWwgPSB0b29sdGlwSXRlbS5kYXRhc2V0LmxhYmVsIHx8ICcnO1xuXG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBsYWJlbCArPSAnOiAnO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRvb2x0aXBJdGVtLmZvcm1hdHRlZFZhbHVlO1xuICAgIGlmICghaXNOdWxsT3JVbmRlZih2YWx1ZSkpIHtcbiAgICAgIGxhYmVsICs9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWw7XG4gIH0sXG4gIGxhYmVsQ29sb3IodG9vbHRpcEl0ZW0pIHtcbiAgICBjb25zdCBtZXRhID0gdG9vbHRpcEl0ZW0uY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcbiAgICBjb25zdCBvcHRpb25zID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKHRvb2x0aXBJdGVtLmRhdGFJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgICAgYm9yZGVyRGFzaE9mZnNldDogb3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgIH07XG4gIH0sXG4gIGxhYmVsVGV4dENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yO1xuICB9LFxuICBsYWJlbFBvaW50U3R5bGUodG9vbHRpcEl0ZW0pIHtcbiAgICBjb25zdCBtZXRhID0gdG9vbHRpcEl0ZW0uY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcbiAgICBjb25zdCBvcHRpb25zID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKHRvb2x0aXBJdGVtLmRhdGFJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvaW50U3R5bGU6IG9wdGlvbnMucG9pbnRTdHlsZSxcbiAgICAgIHJvdGF0aW9uOiBvcHRpb25zLnJvdGF0aW9uLFxuICAgIH07XG4gIH0sXG4gIGFmdGVyTGFiZWw6IG5vb3AsXG5cbiAgLy8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXG4gIGFmdGVyQm9keTogbm9vcCxcblxuICAvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcbiAgYmVmb3JlRm9vdGVyOiBub29wLFxuICBmb290ZXI6IG5vb3AsXG4gIGFmdGVyRm9vdGVyOiBub29wXG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayBmcm9tIG9iamVjdCB3aXRoIGNvbnRleHQgYW5kIGFyZ3VtZW50cy5cbiAqIElmIGNhbGxiYWNrIHJldHVybnMgYHVuZGVmaW5lZGAsIHRoZW4gd2lsbCBiZSBpbnZva2VkIGRlZmF1bHQgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1JlY29yZDxrZXlvZiB0eXBlb2YgZGVmYXVsdENhbGxiYWNrcywgRnVuY3Rpb24+fSBjYWxsYmFja3NcbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGRlZmF1bHRDYWxsYmFja3N9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gY3R4XG4gKiBAcGFyYW0geyp9IGFyZ1xuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCBuYW1lLCBjdHgsIGFyZykge1xuICBjb25zdCByZXN1bHQgPSBjYWxsYmFja3NbbmFtZV0uY2FsbChjdHgsIGFyZyk7XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRDYWxsYmFja3NbbmFtZV0uY2FsbChjdHgsIGFyZyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY2xhc3MgVG9vbHRpcCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAbmFtZXNwYWNlIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnNcbiAgICovXG4gIHN0YXRpYyBwb3NpdGlvbmVycyA9IHBvc2l0aW9uZXJzO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wYWNpdHkgPSAwO1xuICAgIHRoaXMuX2FjdGl2ZSA9IFtdO1xuICAgIHRoaXMuX2V2ZW50UG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2l6ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jYWNoZWRBbmltYXRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Rvb2x0aXBJdGVtcyA9IFtdO1xuICAgIHRoaXMuJGFuaW1hdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYXJ0ID0gY29uZmlnLmNoYXJ0O1xuICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zO1xuICAgIHRoaXMuZGF0YVBvaW50cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYmVmb3JlQm9keSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvZHkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hZnRlckJvZHkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mb290ZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54QWxpZ24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy55QWxpZ24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMueSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FyZXRYID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FyZXRZID0gdW5kZWZpbmVkO1xuICAgIC8vIFRPRE86IFY0LCBtYWtlIHRoaXMgcHJpdmF0ZSwgcmVuYW1lIHRvIGBfbGFiZWxTdHlsZXNgLCBhbmQgY29tYmluZSB3aXRoIGBsYWJlbFBvaW50U3R5bGVzYFxuICAgIC8vIGFuZCBgbGFiZWxUZXh0Q29sb3JzYCB0byBjcmVhdGUgYSBzaW5nbGUgdmFyaWFibGVcbiAgICB0aGlzLmxhYmVsQ29sb3JzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGFiZWxQb2ludFN0eWxlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxhYmVsVGV4dENvbG9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluaXRpYWxpemUob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fY2FjaGVkQW5pbWF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVzb2x2ZUFuaW1hdGlvbnMoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fY2FjaGVkQW5pbWF0aW9ucztcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMuZW5hYmxlZCAmJiBjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAmJiBvcHRpb25zLmFuaW1hdGlvbnM7XG4gICAgY29uc3QgYW5pbWF0aW9ucyA9IG5ldyBBbmltYXRpb25zKHRoaXMuY2hhcnQsIG9wdHMpO1xuICAgIGlmIChvcHRzLl9jYWNoZWFibGUpIHtcbiAgICAgIHRoaXMuX2NhY2hlZEFuaW1hdGlvbnMgPSBPYmplY3QuZnJlZXplKGFuaW1hdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmltYXRpb25zO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRleHQgfHxcblx0XHRcdCh0aGlzLiRjb250ZXh0ID0gY3JlYXRlVG9vbHRpcENvbnRleHQodGhpcy5jaGFydC5nZXRDb250ZXh0KCksIHRoaXMsIHRoaXMuX3Rvb2x0aXBJdGVtcykpO1xuICB9XG5cbiAgZ2V0VGl0bGUoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHtjYWxsYmFja3N9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGJlZm9yZVRpdGxlID0gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCAnYmVmb3JlVGl0bGUnLCB0aGlzLCBjb250ZXh0KTtcbiAgICBjb25zdCB0aXRsZSA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ3RpdGxlJywgdGhpcywgY29udGV4dCk7XG4gICAgY29uc3QgYWZ0ZXJUaXRsZSA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2FmdGVyVGl0bGUnLCB0aGlzLCBjb250ZXh0KTtcblxuICAgIGxldCBsaW5lcyA9IFtdO1xuICAgIGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGJlZm9yZVRpdGxlKSk7XG4gICAgbGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXModGl0bGUpKTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlclRpdGxlKSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBnZXRCZWZvcmVCb2R5KHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgIHJldHVybiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyhcbiAgICAgIGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKG9wdGlvbnMuY2FsbGJhY2tzLCAnYmVmb3JlQm9keScsIHRoaXMsIHRvb2x0aXBJdGVtcylcbiAgICApO1xuICB9XG5cbiAgZ2V0Qm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7Y2FsbGJhY2tzfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYm9keUl0ZW1zID0gW107XG5cbiAgICBlYWNoKHRvb2x0aXBJdGVtcywgKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlJdGVtID0ge1xuICAgICAgICBiZWZvcmU6IFtdLFxuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGFmdGVyOiBbXVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNjb3BlZCA9IG92ZXJyaWRlQ2FsbGJhY2tzKGNhbGxiYWNrcywgY29udGV4dCk7XG4gICAgICBwdXNoT3JDb25jYXQoYm9keUl0ZW0uYmVmb3JlLCBzcGxpdE5ld2xpbmVzKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2JlZm9yZUxhYmVsJywgdGhpcywgY29udGV4dCkpKTtcbiAgICAgIHB1c2hPckNvbmNhdChib2R5SXRlbS5saW5lcywgaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWwnLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgICBwdXNoT3JDb25jYXQoYm9keUl0ZW0uYWZ0ZXIsIHNwbGl0TmV3bGluZXMoaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnYWZ0ZXJMYWJlbCcsIHRoaXMsIGNvbnRleHQpKSk7XG5cbiAgICAgIGJvZHlJdGVtcy5wdXNoKGJvZHlJdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBib2R5SXRlbXM7XG4gIH1cblxuICBnZXRBZnRlckJvZHkodG9vbHRpcEl0ZW1zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGdldEJlZm9yZUFmdGVyQm9keUxpbmVzKFxuICAgICAgaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2sob3B0aW9ucy5jYWxsYmFja3MsICdhZnRlckJvZHknLCB0aGlzLCB0b29sdGlwSXRlbXMpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZm9vdGVyIGFuZCBiZWZvcmVGb290ZXIgYW5kIGFmdGVyRm9vdGVyIGxpbmVzXG4gIGdldEZvb3Rlcih0b29sdGlwSXRlbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7Y2FsbGJhY2tzfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBiZWZvcmVGb290ZXIgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdiZWZvcmVGb290ZXInLCB0aGlzLCB0b29sdGlwSXRlbXMpO1xuICAgIGNvbnN0IGZvb3RlciA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2Zvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG4gICAgY29uc3QgYWZ0ZXJGb290ZXIgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdhZnRlckZvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG5cbiAgICBsZXQgbGluZXMgPSBbXTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhiZWZvcmVGb290ZXIpKTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhmb290ZXIpKTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlckZvb3RlcikpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY3JlYXRlSXRlbXMob3B0aW9ucykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydC5kYXRhO1xuICAgIGNvbnN0IGxhYmVsQ29sb3JzID0gW107XG4gICAgY29uc3QgbGFiZWxQb2ludFN0eWxlcyA9IFtdO1xuICAgIGNvbnN0IGxhYmVsVGV4dENvbG9ycyA9IFtdO1xuICAgIGxldCB0b29sdGlwSXRlbXMgPSBbXTtcbiAgICBsZXQgaSwgbGVuO1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gYWN0aXZlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0b29sdGlwSXRlbXMucHVzaChjcmVhdGVUb29sdGlwSXRlbSh0aGlzLmNoYXJ0LCBhY3RpdmVbaV0pKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIGZpbHRlciBmdW5jdGlvbiwgdXNlIGl0IHRvIG1vZGlmeSB0aGUgdG9vbHRpcCBpdGVtc1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikge1xuICAgICAgdG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLmZpbHRlcigoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBvcHRpb25zLmZpbHRlcihlbGVtZW50LCBpbmRleCwgYXJyYXksIGRhdGEpKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIHNvcnRpbmcgZnVuY3Rpb24sIHVzZSBpdCB0byBtb2RpZnkgdGhlIHRvb2x0aXAgaXRlbXNcbiAgICBpZiAob3B0aW9ucy5pdGVtU29ydCkge1xuICAgICAgdG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLnNvcnQoKGEsIGIpID0+IG9wdGlvbnMuaXRlbVNvcnQoYSwgYiwgZGF0YSkpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBjb2xvcnMgZm9yIGJveGVzXG4gICAgZWFjaCh0b29sdGlwSXRlbXMsIChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBzY29wZWQgPSBvdmVycmlkZUNhbGxiYWNrcyhvcHRpb25zLmNhbGxiYWNrcywgY29udGV4dCk7XG4gICAgICBsYWJlbENvbG9ycy5wdXNoKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2xhYmVsQ29sb3InLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgICBsYWJlbFBvaW50U3R5bGVzLnB1c2goaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWxQb2ludFN0eWxlJywgdGhpcywgY29udGV4dCkpO1xuICAgICAgbGFiZWxUZXh0Q29sb3JzLnB1c2goaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWxUZXh0Q29sb3InLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmxhYmVsQ29sb3JzID0gbGFiZWxDb2xvcnM7XG4gICAgdGhpcy5sYWJlbFBvaW50U3R5bGVzID0gbGFiZWxQb2ludFN0eWxlcztcbiAgICB0aGlzLmxhYmVsVGV4dENvbG9ycyA9IGxhYmVsVGV4dENvbG9ycztcbiAgICB0aGlzLmRhdGFQb2ludHMgPSB0b29sdGlwSXRlbXM7XG4gICAgcmV0dXJuIHRvb2x0aXBJdGVtcztcbiAgfVxuXG4gIHVwZGF0ZShjaGFuZ2VkLCByZXBsYXkpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcbiAgICBsZXQgcHJvcGVydGllcztcbiAgICBsZXQgdG9vbHRpcEl0ZW1zID0gW107XG5cbiAgICBpZiAoIWFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLm9wYWNpdHkgIT09IDApIHtcbiAgICAgICAgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zaXRpb25lcnNbb3B0aW9ucy5wb3NpdGlvbl0uY2FsbCh0aGlzLCBhY3RpdmUsIHRoaXMuX2V2ZW50UG9zaXRpb24pO1xuICAgICAgdG9vbHRpcEl0ZW1zID0gdGhpcy5fY3JlYXRlSXRlbXMob3B0aW9ucyk7XG5cbiAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmdldFRpdGxlKHRvb2x0aXBJdGVtcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLmJlZm9yZUJvZHkgPSB0aGlzLmdldEJlZm9yZUJvZHkodG9vbHRpcEl0ZW1zLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuYm9keSA9IHRoaXMuZ2V0Qm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5hZnRlckJvZHkgPSB0aGlzLmdldEFmdGVyQm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmdldEZvb3Rlcih0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBzaXplID0gdGhpcy5fc2l6ZSA9IGdldFRvb2x0aXBTaXplKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgY29uc3QgcG9zaXRpb25BbmRTaXplID0gT2JqZWN0LmFzc2lnbih7fSwgcG9zaXRpb24sIHNpemUpO1xuICAgICAgY29uc3QgYWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KHRoaXMuY2hhcnQsIG9wdGlvbnMsIHBvc2l0aW9uQW5kU2l6ZSk7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kUG9pbnQgPSBnZXRCYWNrZ3JvdW5kUG9pbnQob3B0aW9ucywgcG9zaXRpb25BbmRTaXplLCBhbGlnbm1lbnQsIHRoaXMuY2hhcnQpO1xuXG4gICAgICB0aGlzLnhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG4gICAgICB0aGlzLnlBbGlnbiA9IGFsaWdubWVudC55QWxpZ247XG5cbiAgICAgIHByb3BlcnRpZXMgPSB7XG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHg6IGJhY2tncm91bmRQb2ludC54LFxuICAgICAgICB5OiBiYWNrZ3JvdW5kUG9pbnQueSxcbiAgICAgICAgd2lkdGg6IHNpemUud2lkdGgsXG4gICAgICAgIGhlaWdodDogc2l6ZS5oZWlnaHQsXG4gICAgICAgIGNhcmV0WDogcG9zaXRpb24ueCxcbiAgICAgICAgY2FyZXRZOiBwb3NpdGlvbi55XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX3Rvb2x0aXBJdGVtcyA9IHRvb2x0aXBJdGVtcztcbiAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKCkudXBkYXRlKHRoaXMsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkICYmIG9wdGlvbnMuZXh0ZXJuYWwpIHtcbiAgICAgIG9wdGlvbnMuZXh0ZXJuYWwuY2FsbCh0aGlzLCB7Y2hhcnQ6IHRoaXMuY2hhcnQsIHRvb2x0aXA6IHRoaXMsIHJlcGxheX0pO1xuICAgIH1cbiAgfVxuXG4gIGRyYXdDYXJldCh0b29sdGlwUG9pbnQsIGN0eCwgc2l6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSB0aGlzLmdldENhcmV0UG9zaXRpb24odG9vbHRpcFBvaW50LCBzaXplLCBvcHRpb25zKTtcblxuICAgIGN0eC5saW5lVG8oY2FyZXRQb3NpdGlvbi54MSwgY2FyZXRQb3NpdGlvbi55MSk7XG4gICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcbiAgICBjdHgubGluZVRvKGNhcmV0UG9zaXRpb24ueDMsIGNhcmV0UG9zaXRpb24ueTMpO1xuICB9XG5cbiAgZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7eEFsaWduLCB5QWxpZ259ID0gdGhpcztcbiAgICBjb25zdCB7Y2FyZXRTaXplLCBjb3JuZXJSYWRpdXN9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7dG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0fSA9IHRvVFJCTENvcm5lcnMoY29ybmVyUmFkaXVzKTtcbiAgICBjb25zdCB7eDogcHRYLCB5OiBwdFl9ID0gdG9vbHRpcFBvaW50O1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHNpemU7XG4gICAgbGV0IHgxLCB4MiwgeDMsIHkxLCB5MiwgeTM7XG5cbiAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgeTIgPSBwdFkgKyAoaGVpZ2h0IC8gMik7XG5cbiAgICAgIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICB4MSA9IHB0WDtcbiAgICAgICAgeDIgPSB4MSAtIGNhcmV0U2l6ZTtcblxuICAgICAgICAvLyBMZWZ0IGRyYXdzIGJvdHRvbSAtPiB0b3AsIHRoaXMgeTEgaXMgb24gdGhlIGJvdHRvbVxuICAgICAgICB5MSA9IHkyICsgY2FyZXRTaXplO1xuICAgICAgICB5MyA9IHkyIC0gY2FyZXRTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDEgPSBwdFggKyB3aWR0aDtcbiAgICAgICAgeDIgPSB4MSArIGNhcmV0U2l6ZTtcblxuICAgICAgICAvLyBSaWdodCBkcmF3cyB0b3AgLT4gYm90dG9tLCB0aHVzIHkxIGlzIG9uIHRoZSB0b3BcbiAgICAgICAgeTEgPSB5MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgeTMgPSB5MiArIGNhcmV0U2l6ZTtcbiAgICAgIH1cblxuICAgICAgeDMgPSB4MTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHgyID0gcHRYICsgTWF0aC5tYXgodG9wTGVmdCwgYm90dG9tTGVmdCkgKyAoY2FyZXRTaXplKTtcbiAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHgyID0gcHRYICsgd2lkdGggLSBNYXRoLm1heCh0b3BSaWdodCwgYm90dG9tUmlnaHQpIC0gY2FyZXRTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDIgPSB0aGlzLmNhcmV0WDtcbiAgICAgIH1cblxuICAgICAgaWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgeTEgPSBwdFk7XG4gICAgICAgIHkyID0geTEgLSBjYXJldFNpemU7XG5cbiAgICAgICAgLy8gVG9wIGRyYXdzIGxlZnQgLT4gcmlnaHQsIHRodXMgeDEgaXMgb24gdGhlIGxlZnRcbiAgICAgICAgeDEgPSB4MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgeDMgPSB4MiArIGNhcmV0U2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkxID0gcHRZICsgaGVpZ2h0O1xuICAgICAgICB5MiA9IHkxICsgY2FyZXRTaXplO1xuXG4gICAgICAgIC8vIEJvdHRvbSBkcmF3cyByaWdodCAtPiBsZWZ0LCB0aHVzIHgxIGlzIG9uIHRoZSByaWdodFxuICAgICAgICB4MSA9IHgyICsgY2FyZXRTaXplO1xuICAgICAgICB4MyA9IHgyIC0gY2FyZXRTaXplO1xuICAgICAgfVxuICAgICAgeTMgPSB5MTtcbiAgICB9XG4gICAgcmV0dXJuIHt4MSwgeDIsIHgzLCB5MSwgeTIsIHkzfTtcbiAgfVxuXG4gIGRyYXdUaXRsZShwdCwgY3R4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIGNvbnN0IGxlbmd0aCA9IHRpdGxlLmxlbmd0aDtcbiAgICBsZXQgdGl0bGVGb250LCB0aXRsZVNwYWNpbmcsIGk7XG5cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuXG4gICAgICBwdC54ID0gZ2V0QWxpZ25lZFgodGhpcywgb3B0aW9ucy50aXRsZUFsaWduLCBvcHRpb25zKTtcblxuICAgICAgY3R4LnRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24ob3B0aW9ucy50aXRsZUFsaWduKTtcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuICAgICAgdGl0bGVGb250ID0gdG9Gb250KG9wdGlvbnMudGl0bGVGb250KTtcbiAgICAgIHRpdGxlU3BhY2luZyA9IG9wdGlvbnMudGl0bGVTcGFjaW5nO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy50aXRsZUNvbG9yO1xuICAgICAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KHRpdGxlW2ldLCBydGxIZWxwZXIueChwdC54KSwgcHQueSArIHRpdGxlRm9udC5saW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIHB0LnkgKz0gdGl0bGVGb250LmxpbmVIZWlnaHQgKyB0aXRsZVNwYWNpbmc7IC8vIExpbmUgSGVpZ2h0IGFuZCBzcGFjaW5nXG5cbiAgICAgICAgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBwdC55ICs9IG9wdGlvbnMudGl0bGVNYXJnaW5Cb3R0b20gLSB0aXRsZVNwYWNpbmc7IC8vIElmIExhc3QsIGFkZCBtYXJnaW4sIHJlbW92ZSBzcGFjaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9kcmF3Q29sb3JCb3goY3R4LCBwdCwgaSwgcnRsSGVscGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGFiZWxDb2xvcnMgPSB0aGlzLmxhYmVsQ29sb3JzW2ldO1xuICAgIGNvbnN0IGxhYmVsUG9pbnRTdHlsZSA9IHRoaXMubGFiZWxQb2ludFN0eWxlc1tpXTtcbiAgICBjb25zdCB7Ym94SGVpZ2h0LCBib3hXaWR0aCwgYm94UGFkZGluZ30gPSBvcHRpb25zO1xuICAgIGNvbnN0IGJvZHlGb250ID0gdG9Gb250KG9wdGlvbnMuYm9keUZvbnQpO1xuICAgIGNvbnN0IGNvbG9yWCA9IGdldEFsaWduZWRYKHRoaXMsICdsZWZ0Jywgb3B0aW9ucyk7XG4gICAgY29uc3QgcnRsQ29sb3JYID0gcnRsSGVscGVyLngoY29sb3JYKTtcbiAgICBjb25zdCB5T2ZmU2V0ID0gYm94SGVpZ2h0IDwgYm9keUZvbnQubGluZUhlaWdodCA/IChib2R5Rm9udC5saW5lSGVpZ2h0IC0gYm94SGVpZ2h0KSAvIDIgOiAwO1xuICAgIGNvbnN0IGNvbG9yWSA9IHB0LnkgKyB5T2ZmU2V0O1xuXG4gICAgaWYgKG9wdGlvbnMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgY29uc3QgZHJhd09wdGlvbnMgPSB7XG4gICAgICAgIHJhZGl1czogTWF0aC5taW4oYm94V2lkdGgsIGJveEhlaWdodCkgLyAyLCAvLyBmaXQgdGhlIGNpcmNsZSBpbiB0aGUgYm94XG4gICAgICAgIHBvaW50U3R5bGU6IGxhYmVsUG9pbnRTdHlsZS5wb2ludFN0eWxlLFxuICAgICAgICByb3RhdGlvbjogbGFiZWxQb2ludFN0eWxlLnJvdGF0aW9uLFxuICAgICAgICBib3JkZXJXaWR0aDogMVxuICAgICAgfTtcbiAgICAgIC8vIFJlY2FsY3VsYXRlIHggYW5kIHkgZm9yIGRyYXdQb2ludCgpIGJlY2F1c2UgaXRzIGV4cGVjdGluZ1xuICAgICAgLy8geCBhbmQgeSB0byBiZSBjZW50ZXIgb2YgZmlndXJlIChpbnN0ZWFkIG9mIHRvcCBsZWZ0KVxuICAgICAgY29uc3QgY2VudGVyWCA9IHJ0bEhlbHBlci5sZWZ0Rm9yTHRyKHJ0bENvbG9yWCwgYm94V2lkdGgpICsgYm94V2lkdGggLyAyO1xuICAgICAgY29uc3QgY2VudGVyWSA9IGNvbG9yWSArIGJveEhlaWdodCAvIDI7XG5cbiAgICAgIC8vIEZpbGwgdGhlIHBvaW50IHdpdGggd2hpdGUgc28gdGhhdCBjb2xvdXJzIG1lcmdlIG5pY2VseSBpZiB0aGUgb3BhY2l0eSBpcyA8IDFcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdGlvbnMubXVsdGlLZXlCYWNrZ3JvdW5kO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMubXVsdGlLZXlCYWNrZ3JvdW5kO1xuICAgICAgZHJhd1BvaW50KGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclkpO1xuXG4gICAgICAvLyBEcmF3IHRoZSBwb2ludFxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGFiZWxDb2xvcnMuYm9yZGVyQ29sb3I7XG4gICAgICBjdHguZmlsbFN0eWxlID0gbGFiZWxDb2xvcnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgZHJhd1BvaW50KGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3JkZXJcbiAgICAgIGN0eC5saW5lV2lkdGggPSBpc09iamVjdChsYWJlbENvbG9ycy5ib3JkZXJXaWR0aCkgPyBNYXRoLm1heCguLi5PYmplY3QudmFsdWVzKGxhYmVsQ29sb3JzLmJvcmRlcldpZHRoKSkgOiAobGFiZWxDb2xvcnMuYm9yZGVyV2lkdGggfHwgMSk7IC8vIFRPRE8sIHY0IHJlbW92ZSBmYWxsYmFja1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGFiZWxDb2xvcnMuYm9yZGVyQ29sb3I7XG4gICAgICBjdHguc2V0TGluZURhc2gobGFiZWxDb2xvcnMuYm9yZGVyRGFzaCB8fCBbXSk7XG4gICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBsYWJlbENvbG9ycy5ib3JkZXJEYXNoT2Zmc2V0IHx8IDA7XG5cbiAgICAgIC8vIEZpbGwgYSB3aGl0ZSByZWN0IHNvIHRoYXQgY29sb3VycyBtZXJnZSBuaWNlbHkgaWYgdGhlIG9wYWNpdHkgaXMgPCAxXG4gICAgICBjb25zdCBvdXRlclggPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxDb2xvclgsIGJveFdpZHRoIC0gYm94UGFkZGluZyk7XG4gICAgICBjb25zdCBpbm5lclggPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueFBsdXMocnRsQ29sb3JYLCAxKSwgYm94V2lkdGggLSBib3hQYWRkaW5nIC0gMik7XG4gICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxhYmVsQ29sb3JzLmJvcmRlclJhZGl1cyk7XG5cbiAgICAgIGlmIChPYmplY3QudmFsdWVzKGJvcmRlclJhZGl1cykuc29tZSh2ID0+IHYgIT09IDApKSB7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMubXVsdGlLZXlCYWNrZ3JvdW5kO1xuICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgeDogb3V0ZXJYLFxuICAgICAgICAgIHk6IGNvbG9yWSxcbiAgICAgICAgICB3OiBib3hXaWR0aCxcbiAgICAgICAgICBoOiBib3hIZWlnaHQsXG4gICAgICAgICAgcmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICAgIH0pO1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgLy8gSW5uZXIgc3F1YXJlXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBsYWJlbENvbG9ycy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgIHg6IGlubmVyWCxcbiAgICAgICAgICB5OiBjb2xvclkgKyAxLFxuICAgICAgICAgIHc6IGJveFdpZHRoIC0gMixcbiAgICAgICAgICBoOiBib3hIZWlnaHQgLSAyLFxuICAgICAgICAgIHJhZGl1czogYm9yZGVyUmFkaXVzLFxuICAgICAgICB9KTtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCByZWN0XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLm11bHRpS2V5QmFja2dyb3VuZDtcbiAgICAgICAgY3R4LmZpbGxSZWN0KG91dGVyWCwgY29sb3JZLCBib3hXaWR0aCwgYm94SGVpZ2h0KTtcbiAgICAgICAgY3R4LnN0cm9rZVJlY3Qob3V0ZXJYLCBjb2xvclksIGJveFdpZHRoLCBib3hIZWlnaHQpO1xuICAgICAgICAvLyBJbm5lciBzcXVhcmVcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxhYmVsQ29sb3JzLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgY3R4LmZpbGxSZWN0KGlubmVyWCwgY29sb3JZICsgMSwgYm94V2lkdGggLSAyLCBib3hIZWlnaHQgLSAyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIGZpbGxTdHlsZVxuICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLmxhYmVsVGV4dENvbG9yc1tpXTtcbiAgfVxuXG4gIGRyYXdCb2R5KHB0LCBjdHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7Ym9keX0gPSB0aGlzO1xuICAgIGNvbnN0IHtib2R5U3BhY2luZywgYm9keUFsaWduLCBkaXNwbGF5Q29sb3JzLCBib3hIZWlnaHQsIGJveFdpZHRoLCBib3hQYWRkaW5nfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYm9keUZvbnQgPSB0b0ZvbnQob3B0aW9ucy5ib2R5Rm9udCk7XG4gICAgbGV0IGJvZHlMaW5lSGVpZ2h0ID0gYm9keUZvbnQubGluZUhlaWdodDtcbiAgICBsZXQgeExpbmVQYWRkaW5nID0gMDtcblxuICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIob3B0aW9ucy5ydGwsIHRoaXMueCwgdGhpcy53aWR0aCk7XG5cbiAgICBjb25zdCBmaWxsTGluZU9mVGV4dCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIGN0eC5maWxsVGV4dChsaW5lLCBydGxIZWxwZXIueChwdC54ICsgeExpbmVQYWRkaW5nKSwgcHQueSArIGJvZHlMaW5lSGVpZ2h0IC8gMik7XG4gICAgICBwdC55ICs9IGJvZHlMaW5lSGVpZ2h0ICsgYm9keVNwYWNpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uID0gcnRsSGVscGVyLnRleHRBbGlnbihib2R5QWxpZ24pO1xuICAgIGxldCBib2R5SXRlbSwgdGV4dENvbG9yLCBsaW5lcywgaSwgaiwgaWxlbiwgamxlbjtcblxuICAgIGN0eC50ZXh0QWxpZ24gPSBib2R5QWxpZ247XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGN0eC5mb250ID0gYm9keUZvbnQuc3RyaW5nO1xuXG4gICAgcHQueCA9IGdldEFsaWduZWRYKHRoaXMsIGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uLCBvcHRpb25zKTtcblxuICAgIC8vIEJlZm9yZSBib2R5IGxpbmVzXG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYm9keUNvbG9yO1xuICAgIGVhY2godGhpcy5iZWZvcmVCb2R5LCBmaWxsTGluZU9mVGV4dCk7XG5cbiAgICB4TGluZVBhZGRpbmcgPSBkaXNwbGF5Q29sb3JzICYmIGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uICE9PSAncmlnaHQnXG4gICAgICA/IGJvZHlBbGlnbiA9PT0gJ2NlbnRlcicgPyAoYm94V2lkdGggLyAyICsgYm94UGFkZGluZykgOiAoYm94V2lkdGggKyAyICsgYm94UGFkZGluZylcbiAgICAgIDogMDtcblxuICAgIC8vIERyYXcgYm9keSBsaW5lcyBub3dcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gYm9keS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGJvZHlJdGVtID0gYm9keVtpXTtcbiAgICAgIHRleHRDb2xvciA9IHRoaXMubGFiZWxUZXh0Q29sb3JzW2ldO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gdGV4dENvbG9yO1xuICAgICAgZWFjaChib2R5SXRlbS5iZWZvcmUsIGZpbGxMaW5lT2ZUZXh0KTtcblxuICAgICAgbGluZXMgPSBib2R5SXRlbS5saW5lcztcbiAgICAgIC8vIERyYXcgTGVnZW5kLWxpa2UgYm94ZXMgaWYgbmVlZGVkXG4gICAgICBpZiAoZGlzcGxheUNvbG9ycyAmJiBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fZHJhd0NvbG9yQm94KGN0eCwgcHQsIGksIHJ0bEhlbHBlciwgb3B0aW9ucyk7XG4gICAgICAgIGJvZHlMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoYm9keUZvbnQubGluZUhlaWdodCwgYm94SGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChqID0gMCwgamxlbiA9IGxpbmVzLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuICAgICAgICBmaWxsTGluZU9mVGV4dChsaW5lc1tqXSk7XG4gICAgICAgIC8vIFJlc2V0IGZvciBhbnkgbGluZXMgdGhhdCBkb24ndCBpbmNsdWRlIGNvbG9yYm94XG4gICAgICAgIGJvZHlMaW5lSGVpZ2h0ID0gYm9keUZvbnQubGluZUhlaWdodDtcbiAgICAgIH1cblxuICAgICAgZWFjaChib2R5SXRlbS5hZnRlciwgZmlsbExpbmVPZlRleHQpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGJhY2sgdG8gMCBmb3IgYWZ0ZXIgYm9keVxuICAgIHhMaW5lUGFkZGluZyA9IDA7XG4gICAgYm9keUxpbmVIZWlnaHQgPSBib2R5Rm9udC5saW5lSGVpZ2h0O1xuXG4gICAgLy8gQWZ0ZXIgYm9keSBsaW5lc1xuICAgIGVhY2godGhpcy5hZnRlckJvZHksIGZpbGxMaW5lT2ZUZXh0KTtcbiAgICBwdC55IC09IGJvZHlTcGFjaW5nOyAvLyBSZW1vdmUgbGFzdCBib2R5IHNwYWNpbmdcbiAgfVxuXG4gIGRyYXdGb290ZXIocHQsIGN0eCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZm9vdGVyO1xuICAgIGNvbnN0IGxlbmd0aCA9IGZvb3Rlci5sZW5ndGg7XG4gICAgbGV0IGZvb3RlckZvbnQsIGk7XG5cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuXG4gICAgICBwdC54ID0gZ2V0QWxpZ25lZFgodGhpcywgb3B0aW9ucy5mb290ZXJBbGlnbiwgb3B0aW9ucyk7XG4gICAgICBwdC55ICs9IG9wdGlvbnMuZm9vdGVyTWFyZ2luVG9wO1xuXG4gICAgICBjdHgudGV4dEFsaWduID0gcnRsSGVscGVyLnRleHRBbGlnbihvcHRpb25zLmZvb3RlckFsaWduKTtcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuICAgICAgZm9vdGVyRm9udCA9IHRvRm9udChvcHRpb25zLmZvb3RlckZvbnQpO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5mb290ZXJDb2xvcjtcbiAgICAgIGN0eC5mb250ID0gZm9vdGVyRm9udC5zdHJpbmc7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICBjdHguZmlsbFRleHQoZm9vdGVyW2ldLCBydGxIZWxwZXIueChwdC54KSwgcHQueSArIGZvb3RlckZvbnQubGluZUhlaWdodCAvIDIpO1xuICAgICAgICBwdC55ICs9IGZvb3RlckZvbnQubGluZUhlaWdodCArIG9wdGlvbnMuZm9vdGVyU3BhY2luZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkcmF3QmFja2dyb3VuZChwdCwgY3R4LCB0b29sdGlwU2l6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHt4QWxpZ24sIHlBbGlnbn0gPSB0aGlzO1xuICAgIGNvbnN0IHt4LCB5fSA9IHB0O1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHRvb2x0aXBTaXplO1xuICAgIGNvbnN0IHt0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHR9ID0gdG9UUkJMQ29ybmVycyhvcHRpb25zLmNvcm5lclJhZGl1cyk7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcbiAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcblxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKHggKyB0b3BMZWZ0LCB5KTtcbiAgICBpZiAoeUFsaWduID09PSAndG9wJykge1xuICAgICAgdGhpcy5kcmF3Q2FyZXQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHRvcFJpZ2h0LCB5KTtcbiAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHRvcFJpZ2h0KTtcbiAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJyAmJiB4QWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSBib3R0b21SaWdodCk7XG4gICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSBib3R0b21SaWdodCwgeSArIGhlaWdodCk7XG4gICAgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY3R4LmxpbmVUbyh4ICsgYm90dG9tTGVmdCwgeSArIGhlaWdodCk7XG4gICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIGJvdHRvbUxlZnQpO1xuICAgIGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICB0aGlzLmRyYXdDYXJldChwdCwgY3R4LCB0b29sdGlwU2l6ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGN0eC5saW5lVG8oeCwgeSArIHRvcExlZnQpO1xuICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyB0b3BMZWZ0LCB5KTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICBjdHguZmlsbCgpO1xuXG4gICAgaWYgKG9wdGlvbnMuYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIFVwZGF0ZSB4L3kgYW5pbWF0aW9uIHRhcmdldHMgd2hlbiBfYWN0aXZlIGVsZW1lbnRzIGFyZSBhbmltYXRpbmcgdG9vXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgYW5pbXMgPSB0aGlzLiRhbmltYXRpb25zO1xuICAgIGNvbnN0IGFuaW1YID0gYW5pbXMgJiYgYW5pbXMueDtcbiAgICBjb25zdCBhbmltWSA9IGFuaW1zICYmIGFuaW1zLnk7XG4gICAgaWYgKGFuaW1YIHx8IGFuaW1ZKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdGlvbnMucG9zaXRpb25dLmNhbGwodGhpcywgdGhpcy5fYWN0aXZlLCB0aGlzLl9ldmVudFBvc2l0aW9uKTtcbiAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX3NpemUgPSBnZXRUb29sdGlwU2l6ZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uQW5kU2l6ZSA9IE9iamVjdC5hc3NpZ24oe30sIHBvc2l0aW9uLCB0aGlzLl9zaXplKTtcbiAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRldGVybWluZUFsaWdubWVudChjaGFydCwgb3B0aW9ucywgcG9zaXRpb25BbmRTaXplKTtcbiAgICAgIGNvbnN0IHBvaW50ID0gZ2V0QmFja2dyb3VuZFBvaW50KG9wdGlvbnMsIHBvc2l0aW9uQW5kU2l6ZSwgYWxpZ25tZW50LCBjaGFydCk7XG4gICAgICBpZiAoYW5pbVguX3RvICE9PSBwb2ludC54IHx8IGFuaW1ZLl90byAhPT0gcG9pbnQueSkge1xuICAgICAgICB0aGlzLnhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG4gICAgICAgIHRoaXMueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcbiAgICAgICAgdGhpcy53aWR0aCA9IHNpemUud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY2FyZXRYID0gcG9zaXRpb24ueDtcbiAgICAgICAgdGhpcy5jYXJldFkgPSBwb3NpdGlvbi55O1xuICAgICAgICB0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLCBwb2ludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgdG9vbHRpcCB3aWxsIGRyYXcgYW55dGhpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRvb2x0aXAgd2lsbCByZW5kZXJcbiAgICovXG4gIF93aWxsUmVuZGVyKCkge1xuICAgIHJldHVybiAhIXRoaXMub3BhY2l0eTtcbiAgfVxuXG4gIGRyYXcoY3R4KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICBsZXQgb3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblxuICAgIGlmICghb3BhY2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUFuaW1hdGlvblRhcmdldChvcHRpb25zKTtcblxuICAgIGNvbnN0IHRvb2x0aXBTaXplID0ge1xuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfTtcbiAgICBjb25zdCBwdCA9IHtcbiAgICAgIHg6IHRoaXMueCxcbiAgICAgIHk6IHRoaXMueVxuICAgIH07XG5cbiAgICAvLyBJRTExL0VkZ2UgZG9lcyBub3QgbGlrZSB2ZXJ5IHNtYWxsIG9wYWNpdGllcywgc28gc25hcCB0byAwXG4gICAgb3BhY2l0eSA9IE1hdGguYWJzKG9wYWNpdHkpIDwgMWUtMyA/IDAgOiBvcGFjaXR5O1xuXG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuXG4gICAgLy8gVHJ1dGh5L2ZhbHNleSB2YWx1ZSBmb3IgZW1wdHkgdG9vbHRpcFxuICAgIGNvbnN0IGhhc1Rvb2x0aXBDb250ZW50ID0gdGhpcy50aXRsZS5sZW5ndGggfHwgdGhpcy5iZWZvcmVCb2R5Lmxlbmd0aCB8fCB0aGlzLmJvZHkubGVuZ3RoIHx8IHRoaXMuYWZ0ZXJCb2R5Lmxlbmd0aCB8fCB0aGlzLmZvb3Rlci5sZW5ndGg7XG5cbiAgICBpZiAob3B0aW9ucy5lbmFibGVkICYmIGhhc1Rvb2x0aXBDb250ZW50KSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgLy8gRHJhdyBCYWNrZ3JvdW5kXG4gICAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kKHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcblxuICAgICAgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eCwgb3B0aW9ucy50ZXh0RGlyZWN0aW9uKTtcblxuICAgICAgcHQueSArPSBwYWRkaW5nLnRvcDtcblxuICAgICAgLy8gVGl0bGVzXG4gICAgICB0aGlzLmRyYXdUaXRsZShwdCwgY3R4LCBvcHRpb25zKTtcblxuICAgICAgLy8gQm9keVxuICAgICAgdGhpcy5kcmF3Qm9keShwdCwgY3R4LCBvcHRpb25zKTtcblxuICAgICAgLy8gRm9vdGVyXG4gICAgICB0aGlzLmRyYXdGb290ZXIocHQsIGN0eCwgb3B0aW9ucyk7XG5cbiAgICAgIHJlc3RvcmVUZXh0RGlyZWN0aW9uKGN0eCwgb3B0aW9ucy50ZXh0RGlyZWN0aW9uKTtcblxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogR2V0IGFjdGl2ZSBlbGVtZW50cyBpbiB0aGUgdG9vbHRpcFxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUgdG9vbHRpcFxuXHQgKi9cbiAgZ2V0QWN0aXZlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBTZXQgYWN0aXZlIGVsZW1lbnRzIGluIHRoZSB0b29sdGlwXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGFjdGl2ZUVsZW1lbnRzIEFycmF5IG9mIGFjdGl2ZSBkYXRhc2V0SW5kZXgvaW5kZXggcGFpcnMuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudFBvc2l0aW9uIFN5bnRoZXRpYyBldmVudCBwb3NpdGlvbiB1c2VkIGluIHBvc2l0aW9uaW5nXG5cdCAqL1xuICBzZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50cywgZXZlbnRQb3NpdGlvbikge1xuICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmU7XG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlRWxlbWVudHMubWFwKCh7ZGF0YXNldEluZGV4LCBpbmRleH0pID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCAnICsgZGF0YXNldEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YXNldEluZGV4LFxuICAgICAgICBlbGVtZW50OiBtZXRhLmRhdGFbaW5kZXhdLFxuICAgICAgICBpbmRleCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgY2hhbmdlZCA9ICFfZWxlbWVudHNFcXVhbChsYXN0QWN0aXZlLCBhY3RpdmUpO1xuICAgIGNvbnN0IHBvc2l0aW9uQ2hhbmdlZCA9IHRoaXMuX3Bvc2l0aW9uQ2hhbmdlZChhY3RpdmUsIGV2ZW50UG9zaXRpb24pO1xuXG4gICAgaWYgKGNoYW5nZWQgfHwgcG9zaXRpb25DaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBhY3RpdmU7XG4gICAgICB0aGlzLl9ldmVudFBvc2l0aW9uID0gZXZlbnRQb3NpdGlvbjtcbiAgICAgIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cyA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogSGFuZGxlIGFuIGV2ZW50XG5cdCAqIEBwYXJhbSB7Q2hhcnRFdmVudH0gZSAtIFRoZSBldmVudCB0byBoYW5kbGVcblx0ICogQHBhcmFtIHtib29sZWFufSBbcmVwbGF5XSAtIFRoaXMgaXMgYSByZXBsYXllZCBldmVudCAoZnJvbSB1cGRhdGUpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luQ2hhcnRBcmVhXSAtIFRoZSBldmVudCBpcyBpbnNpZGUgY2hhcnRBcmVhXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSB0b29sdGlwIGNoYW5nZWRcblx0ICovXG4gIGhhbmRsZUV2ZW50KGUsIHJlcGxheSwgaW5DaGFydEFyZWEgPSB0cnVlKSB7XG4gICAgaWYgKHJlcGxheSAmJiB0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzID0gZmFsc2U7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5fZ2V0QWN0aXZlRWxlbWVudHMoZSwgbGFzdEFjdGl2ZSwgcmVwbGF5LCBpbkNoYXJ0QXJlYSk7XG5cbiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpdGVtcyBzaG93biwgYnV0IHRoZSB0b29sdGlwIHBvc2l0aW9uIGlzIG5lYXJlc3QgbW9kZVxuICAgIC8vIGFuIHVwZGF0ZSBtYXkgbmVlZCB0byBiZSBtYWRlIGJlY2F1c2Ugb3VyIHBvc2l0aW9uIG1heSBoYXZlIGNoYW5nZWQgZXZlbiB0aG91Z2hcbiAgICAvLyB0aGUgaXRlbXMgYXJlIHRoZSBzYW1lIGFzIGJlZm9yZS5cbiAgICBjb25zdCBwb3NpdGlvbkNoYW5nZWQgPSB0aGlzLl9wb3NpdGlvbkNoYW5nZWQoYWN0aXZlLCBlKTtcblxuICAgIC8vIFJlbWVtYmVyIExhc3QgQWN0aXZlc1xuICAgIGNvbnN0IGNoYW5nZWQgPSByZXBsYXkgfHwgIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSkgfHwgcG9zaXRpb25DaGFuZ2VkO1xuXG4gICAgLy8gT25seSBoYW5kbGUgdGFyZ2V0IGV2ZW50IG9uIHRvb2x0aXAgY2hhbmdlXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGFjdGl2ZTtcblxuICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlZCB8fCBvcHRpb25zLmV4dGVybmFsKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50UG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogZS54LFxuICAgICAgICAgIHk6IGUueVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRydWUsIHJlcGxheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICAvKipcblx0ICogSGVscGVyIGZvciBkZXRlcm1pbmluZyB0aGUgYWN0aXZlIGVsZW1lbnRzIGZvciBldmVudFxuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqIEBwYXJhbSB7SW50ZXJhY3Rpb25JdGVtW119IGxhc3RBY3RpdmUgLSBQcmV2aW91c2x5IGFjdGl2ZSBlbGVtZW50c1xuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXBsYXldIC0gVGhpcyBpcyBhIHJlcGxheWVkIGV2ZW50IChmcm9tIHVwZGF0ZSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbaW5DaGFydEFyZWFdIC0gVGhlIGV2ZW50IGlzIGluc2lkZSBjaGFydEFyZWFcblx0ICogQHJldHVybnMge0ludGVyYWN0aW9uSXRlbVtdfSAtIEFjdGl2ZSBlbGVtZW50c1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIHJlcGxheSwgaW5DaGFydEFyZWEpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghaW5DaGFydEFyZWEpIHtcbiAgICAgIC8vIExldCB1c2VyIGNvbnRyb2wgdGhlIGFjdGl2ZSBlbGVtZW50cyBvdXRzaWRlIGNoYXJ0QXJlYS4gRWcuIHVzaW5nIExlZ2VuZC5cbiAgICAgIHJldHVybiBsYXN0QWN0aXZlO1xuICAgIH1cblxuICAgIC8vIEZpbmQgQWN0aXZlIEVsZW1lbnRzIGZvciB0b29sdGlwc1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY2hhcnQuZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZShlLCBvcHRpb25zLm1vZGUsIG9wdGlvbnMsIHJlcGxheSk7XG5cbiAgICBpZiAob3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICBhY3RpdmUucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3RpdmU7XG4gIH1cblxuICAvKipcblx0ICogRGV0ZXJtaW5lIGlmIHRoZSBhY3RpdmUgZWxlbWVudHMgKyBldmVudCBjb21iaW5hdGlvbiBjaGFuZ2VzIHRoZVxuXHQgKiB0b29sdGlwIHBvc2l0aW9uXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGFjdGl2ZSAtIEFjdGl2ZSBlbGVtZW50c1xuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBFdmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgcG9zaXRpb24gY2hhbmdlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwb3NpdGlvbiBoYXMgY2hhbmdlZFxuXHQgKi9cbiAgX3Bvc2l0aW9uQ2hhbmdlZChhY3RpdmUsIGUpIHtcbiAgICBjb25zdCB7Y2FyZXRYLCBjYXJldFksIG9wdGlvbnN9ID0gdGhpcztcbiAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdGlvbnMucG9zaXRpb25dLmNhbGwodGhpcywgYWN0aXZlLCBlKTtcbiAgICByZXR1cm4gcG9zaXRpb24gIT09IGZhbHNlICYmIChjYXJldFggIT09IHBvc2l0aW9uLnggfHwgY2FyZXRZICE9PSBwb3NpdGlvbi55KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAndG9vbHRpcCcsXG4gIF9lbGVtZW50OiBUb29sdGlwLFxuICBwb3NpdGlvbmVycyxcblxuICBhZnRlckluaXQoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNoYXJ0LnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh7Y2hhcnQsIG9wdGlvbnN9KTtcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlVXBkYXRlKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGlmIChjaGFydC50b29sdGlwKSB7XG4gICAgICBjaGFydC50b29sdGlwLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIHJlc2V0KGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGlmIChjaGFydC50b29sdGlwKSB7XG4gICAgICBjaGFydC50b29sdGlwLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIGFmdGVyRHJhdyhjaGFydCkge1xuICAgIGNvbnN0IHRvb2x0aXAgPSBjaGFydC50b29sdGlwO1xuXG4gICAgaWYgKHRvb2x0aXAgJiYgdG9vbHRpcC5fd2lsbFJlbmRlcigpKSB7XG4gICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICB0b29sdGlwXG4gICAgICB9O1xuXG4gICAgICBpZiAoY2hhcnQubm90aWZ5UGx1Z2lucygnYmVmb3JlVG9vbHRpcERyYXcnLCB7Li4uYXJncywgY2FuY2VsYWJsZTogdHJ1ZX0pID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRvb2x0aXAuZHJhdyhjaGFydC5jdHgpO1xuXG4gICAgICBjaGFydC5ub3RpZnlQbHVnaW5zKCdhZnRlclRvb2x0aXBEcmF3JywgYXJncyk7XG4gICAgfVxuICB9LFxuXG4gIGFmdGVyRXZlbnQoY2hhcnQsIGFyZ3MpIHtcbiAgICBpZiAoY2hhcnQudG9vbHRpcCkge1xuICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIHJlcGxheWVkIGZyb20gYHVwZGF0ZWAsIHdlIHNob3VsZCBldmFsdWF0ZSB3aXRoIHRoZSBmaW5hbCBwb3NpdGlvbnMuXG4gICAgICBjb25zdCB1c2VGaW5hbFBvc2l0aW9uID0gYXJncy5yZXBsYXk7XG4gICAgICBpZiAoY2hhcnQudG9vbHRpcC5oYW5kbGVFdmVudChhcmdzLmV2ZW50LCB1c2VGaW5hbFBvc2l0aW9uLCBhcmdzLmluQ2hhcnRBcmVhKSkge1xuICAgICAgICAvLyBub3RpZnkgY2hhcnQgYWJvdXQgdGhlIGNoYW5nZSwgc28gaXQgd2lsbCByZW5kZXJcbiAgICAgICAgYXJncy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGV4dGVybmFsOiBudWxsLFxuICAgIHBvc2l0aW9uOiAnYXZlcmFnZScsXG4gICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjgpJyxcbiAgICB0aXRsZUNvbG9yOiAnI2ZmZicsXG4gICAgdGl0bGVGb250OiB7XG4gICAgICB3ZWlnaHQ6ICdib2xkJyxcbiAgICB9LFxuICAgIHRpdGxlU3BhY2luZzogMixcbiAgICB0aXRsZU1hcmdpbkJvdHRvbTogNixcbiAgICB0aXRsZUFsaWduOiAnbGVmdCcsXG4gICAgYm9keUNvbG9yOiAnI2ZmZicsXG4gICAgYm9keVNwYWNpbmc6IDIsXG4gICAgYm9keUZvbnQ6IHtcbiAgICB9LFxuICAgIGJvZHlBbGlnbjogJ2xlZnQnLFxuICAgIGZvb3RlckNvbG9yOiAnI2ZmZicsXG4gICAgZm9vdGVyU3BhY2luZzogMixcbiAgICBmb290ZXJNYXJnaW5Ub3A6IDYsXG4gICAgZm9vdGVyRm9udDoge1xuICAgICAgd2VpZ2h0OiAnYm9sZCcsXG4gICAgfSxcbiAgICBmb290ZXJBbGlnbjogJ2xlZnQnLFxuICAgIHBhZGRpbmc6IDYsXG4gICAgY2FyZXRQYWRkaW5nOiAyLFxuICAgIGNhcmV0U2l6ZTogNSxcbiAgICBjb3JuZXJSYWRpdXM6IDYsXG4gICAgYm94SGVpZ2h0OiAoY3R4LCBvcHRzKSA9PiBvcHRzLmJvZHlGb250LnNpemUsXG4gICAgYm94V2lkdGg6IChjdHgsIG9wdHMpID0+IG9wdHMuYm9keUZvbnQuc2l6ZSxcbiAgICBtdWx0aUtleUJhY2tncm91bmQ6ICcjZmZmJyxcbiAgICBkaXNwbGF5Q29sb3JzOiB0cnVlLFxuICAgIGJveFBhZGRpbmc6IDAsXG4gICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsMCwwLDApJyxcbiAgICBib3JkZXJXaWR0aDogMCxcbiAgICBhbmltYXRpb246IHtcbiAgICAgIGR1cmF0aW9uOiA0MDAsXG4gICAgICBlYXNpbmc6ICdlYXNlT3V0UXVhcnQnLFxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgbnVtYmVyczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgcHJvcGVydGllczogWyd4JywgJ3knLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2NhcmV0WCcsICdjYXJldFknXSxcbiAgICAgIH0sXG4gICAgICBvcGFjaXR5OiB7XG4gICAgICAgIGVhc2luZzogJ2xpbmVhcicsXG4gICAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbGxiYWNrczogZGVmYXVsdENhbGxiYWNrc1xuICB9LFxuXG4gIGRlZmF1bHRSb3V0ZXM6IHtcbiAgICBib2R5Rm9udDogJ2ZvbnQnLFxuICAgIGZvb3RlckZvbnQ6ICdmb250JyxcbiAgICB0aXRsZUZvbnQ6ICdmb250J1xuICB9LFxuXG4gIGRlc2NyaXB0b3JzOiB7XG4gICAgX3NjcmlwdGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnZmlsdGVyJyAmJiBuYW1lICE9PSAnaXRlbVNvcnQnICYmIG5hbWUgIT09ICdleHRlcm5hbCcsXG4gICAgX2luZGV4YWJsZTogZmFsc2UsXG4gICAgY2FsbGJhY2tzOiB7XG4gICAgICBfc2NyaXB0YWJsZTogZmFsc2UsXG4gICAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgX2ZhbGxiYWNrOiBmYWxzZVxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgX2ZhbGxiYWNrOiAnYW5pbWF0aW9uJ1xuICAgIH1cbiAgfSxcblxuICAvLyBSZXNvbHZlIGFkZGl0aW9uYWxseSBmcm9tIGBpbnRlcmFjdGlvbmAgb3B0aW9ucyBhbmQgZGVmYXVsdHMuXG4gIGFkZGl0aW9uYWxPcHRpb25TY29wZXM6IFsnaW50ZXJhY3Rpb24nXVxufTtcbiIsICJpbXBvcnQgU2NhbGUgZnJvbSAnLi4vY29yZS9jb3JlLnNjYWxlLmpzJztcbmltcG9ydCB7aXNOdWxsT3JVbmRlZiwgdmFsdWVPckRlZmF1bHQsIF9saW1pdFZhbHVlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuY29uc3QgYWRkSWZTdHJpbmcgPSAobGFiZWxzLCByYXcsIGluZGV4LCBhZGRlZExhYmVscykgPT4ge1xuICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICBpbmRleCA9IGxhYmVscy5wdXNoKHJhdykgLSAxO1xuICAgIGFkZGVkTGFiZWxzLnVuc2hpZnQoe2luZGV4LCBsYWJlbDogcmF3fSk7XG4gIH0gZWxzZSBpZiAoaXNOYU4ocmF3KSkge1xuICAgIGluZGV4ID0gbnVsbDtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5mdW5jdGlvbiBmaW5kT3JBZGRMYWJlbChsYWJlbHMsIHJhdywgaW5kZXgsIGFkZGVkTGFiZWxzKSB7XG4gIGNvbnN0IGZpcnN0ID0gbGFiZWxzLmluZGV4T2YocmF3KTtcbiAgaWYgKGZpcnN0ID09PSAtMSkge1xuICAgIHJldHVybiBhZGRJZlN0cmluZyhsYWJlbHMsIHJhdywgaW5kZXgsIGFkZGVkTGFiZWxzKTtcbiAgfVxuICBjb25zdCBsYXN0ID0gbGFiZWxzLmxhc3RJbmRleE9mKHJhdyk7XG4gIHJldHVybiBmaXJzdCAhPT0gbGFzdCA/IGluZGV4IDogZmlyc3Q7XG59XG5cbmNvbnN0IHZhbGlkSW5kZXggPSAoaW5kZXgsIG1heCkgPT4gaW5kZXggPT09IG51bGwgPyBudWxsIDogX2xpbWl0VmFsdWUoTWF0aC5yb3VuZChpbmRleCksIDAsIG1heCk7XG5cbmZ1bmN0aW9uIF9nZXRMYWJlbEZvclZhbHVlKHZhbHVlKSB7XG4gIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG5cbiAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPCBsYWJlbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGxhYmVsc1t2YWx1ZV07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeVNjYWxlIGV4dGVuZHMgU2NhbGUge1xuXG4gIHN0YXRpYyBpZCA9ICdjYXRlZ29yeSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgdGlja3M6IHtcbiAgICAgIGNhbGxiYWNrOiBfZ2V0TGFiZWxGb3JWYWx1ZVxuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcihjZmcpO1xuXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92YWx1ZVJhbmdlID0gMDtcbiAgICB0aGlzLl9hZGRlZExhYmVscyA9IFtdO1xuICB9XG5cbiAgaW5pdChzY2FsZU9wdGlvbnMpIHtcbiAgICBjb25zdCBhZGRlZCA9IHRoaXMuX2FkZGVkTGFiZWxzO1xuICAgIGlmIChhZGRlZC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgICBmb3IgKGNvbnN0IHtpbmRleCwgbGFiZWx9IG9mIGFkZGVkKSB7XG4gICAgICAgIGlmIChsYWJlbHNbaW5kZXhdID09PSBsYWJlbCkge1xuICAgICAgICAgIGxhYmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9hZGRlZExhYmVscyA9IFtdO1xuICAgIH1cbiAgICBzdXBlci5pbml0KHNjYWxlT3B0aW9ucyk7XG4gIH1cblxuICBwYXJzZShyYXcsIGluZGV4KSB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWYocmF3KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgaW5kZXggPSBpc0Zpbml0ZShpbmRleCkgJiYgbGFiZWxzW2luZGV4XSA9PT0gcmF3ID8gaW5kZXhcbiAgICAgIDogZmluZE9yQWRkTGFiZWwobGFiZWxzLCByYXcsIHZhbHVlT3JEZWZhdWx0KGluZGV4LCByYXcpLCB0aGlzLl9hZGRlZExhYmVscyk7XG4gICAgcmV0dXJuIHZhbGlkSW5kZXgoaW5kZXgsIGxhYmVscy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgY29uc3Qge21pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IHttaW4sIG1heH0gPSB0aGlzLmdldE1pbk1heCh0cnVlKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICBpZiAoIW1pbkRlZmluZWQpIHtcbiAgICAgICAgbWluID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICghbWF4RGVmaW5lZCkge1xuICAgICAgICBtYXggPSB0aGlzLmdldExhYmVscygpLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH1cblxuICBidWlsZFRpY2tzKCkge1xuICAgIGNvbnN0IG1pbiA9IHRoaXMubWluO1xuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4O1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub3B0aW9ucy5vZmZzZXQ7XG4gICAgY29uc3QgdGlja3MgPSBbXTtcbiAgICBsZXQgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcblxuICAgIC8vIElmIHdlIGFyZSB2aWV3aW5nIHNvbWUgc3Vic2V0IG9mIGxhYmVscywgc2xpY2UgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgbGFiZWxzID0gKG1pbiA9PT0gMCAmJiBtYXggPT09IGxhYmVscy5sZW5ndGggLSAxKSA/IGxhYmVscyA6IGxhYmVscy5zbGljZShtaW4sIG1heCArIDEpO1xuXG4gICAgdGhpcy5fdmFsdWVSYW5nZSA9IE1hdGgubWF4KGxhYmVscy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpLCAxKTtcbiAgICB0aGlzLl9zdGFydFZhbHVlID0gdGhpcy5taW4gLSAob2Zmc2V0ID8gMC41IDogMCk7XG5cbiAgICBmb3IgKGxldCB2YWx1ZSA9IG1pbjsgdmFsdWUgPD0gbWF4OyB2YWx1ZSsrKSB7XG4gICAgICB0aWNrcy5wdXNoKHt2YWx1ZX0pO1xuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICBnZXRMYWJlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9nZXRMYWJlbEZvclZhbHVlLmNhbGwodGhpcywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGNvbmZpZ3VyZSgpIHtcbiAgICBzdXBlci5jb25maWd1cmUoKTtcblxuICAgIGlmICghdGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHZlcnRpY2FsIGNhdGVnb3J5IHNjYWxlIHJldmVyc2UgaXMgaW52ZXJ0ZWQuXG4gICAgICB0aGlzLl9yZXZlcnNlUGl4ZWxzID0gIXRoaXMuX3JldmVyc2VQaXhlbHM7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlZCB0byBnZXQgZGF0YSB2YWx1ZSBsb2NhdGlvbnMuIFZhbHVlIGNhbiBlaXRoZXIgYmUgYW4gaW5kZXggb3IgYSBudW1lcmljYWwgdmFsdWVcbiAgZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMucGFyc2UodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IE5hTiA6IHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh2YWx1ZSAtIHRoaXMuX3N0YXJ0VmFsdWUpIC8gdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cblxuICAvLyBNdXN0IG92ZXJyaWRlIGJhc2UgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBpdCBjYWxscyBnZXRQaXhlbEZvclZhbHVlXG4gIC8vIGFuZCBjYXRlZ29yeSBzY2FsZSBjYW4gaGF2ZSBkdXBsaWNhdGUgdmFsdWVzXG4gIGdldFBpeGVsRm9yVGljayhpbmRleCkge1xuICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlja3MubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGlja3NbaW5kZXhdLnZhbHVlKTtcbiAgfVxuXG4gIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLl9zdGFydFZhbHVlICsgdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpICogdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cblxuICBnZXRCYXNlUGl4ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYm90dG9tO1xuICB9XG59XG4iLCAiaW1wb3J0IHtpc051bGxPclVuZGVmfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge2FsbW9zdEVxdWFscywgYWxtb3N0V2hvbGUsIG5pY2VOdW0sIF9kZWNpbWFsUGxhY2VzLCBfc2V0TWluQW5kTWF4QnlLZXksIHNpZ24sIHRvUmFkaWFuc30gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuaW1wb3J0IFNjYWxlIGZyb20gJy4uL2NvcmUvY29yZS5zY2FsZS5qcyc7XG5pbXBvcnQge2Zvcm1hdE51bWJlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmludGwuanMnO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxpbmVhciB0aWNrcyBmb3IgYW4gYXhpc1xuICogMS4gSWYgZ2VuZXJhdGlvbk9wdGlvbnMubWluLCBnZW5lcmF0aW9uT3B0aW9ucy5tYXgsIGFuZCBnZW5lcmF0aW9uT3B0aW9ucy5zdGVwIGFyZSBkZWZpbmVkOlxuICogICAgaWYgKG1heCAtIG1pbikgLyBzdGVwIGlzIGFuIGludGVnZXIsIHRpY2tzIGFyZSBnZW5lcmF0ZWQgYXMgW21pbiwgbWluICsgc3RlcCwgLi4uLCBtYXhdXG4gKiAgICBOb3RlIHRoYXQgdGhlIGdlbmVyYXRpb25PcHRpb25zLm1heENvdW50IHNldHRpbmcgaXMgcmVzcGVjdGVkIGluIHRoaXMgc2NlbmFyaW9cbiAqXG4gKiAyLiBJZiBnZW5lcmF0aW9uT3B0aW9ucy5taW4sIGdlbmVyYXRpb25PcHRpb25zLm1heCwgYW5kIGdlbmVyYXRpb25PcHRpb25zLmNvdW50IGlzIGRlZmluZWRcbiAqICAgIHNwYWNpbmcgPSAobWF4IC0gbWluKSAvIGNvdW50XG4gKiAgICBUaWNrcyBhcmUgZ2VuZXJhdGVkIGFzIFttaW4sIG1pbiArIHNwYWNpbmcsIC4uLiwgbWF4XVxuICpcbiAqIDMuIElmIGdlbmVyYXRpb25PcHRpb25zLmNvdW50IGlzIGRlZmluZWRcbiAqICAgIHNwYWNpbmcgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gY291bnRcbiAqXG4gKiA0LiBDb21wdXRlIG9wdGltYWwgc3BhY2luZyBvZiB0aWNrcyB1c2luZyBuaWNlTnVtIGFsZ29yaXRobVxuICpcbiAqIEBwYXJhbSBnZW5lcmF0aW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0aWNrc1xuICogQHBhcmFtIGRhdGFSYW5nZSB0aGUgcmFuZ2Ugb2YgdGhlIGRhdGFcbiAqIEByZXR1cm5zIHtvYmplY3RbXX0gYXJyYXkgb2YgdGljayBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVGlja3MoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xuICBjb25zdCB0aWNrcyA9IFtdO1xuICAvLyBUbyBnZXQgYSBcIm5pY2VcIiB2YWx1ZSBmb3IgdGhlIHRpY2sgc3BhY2luZywgd2Ugd2lsbCB1c2UgdGhlIGFwcHJvcHJpYXRlbHkgbmFtZWRcbiAgLy8gXCJuaWNlIG51bWJlclwiIGFsZ29yaXRobS4gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg1MDY4ODEvbmljZS1sYWJlbC1hbGdvcml0aG0tZm9yLWNoYXJ0cy13aXRoLW1pbmltdW0tdGlja3NcbiAgLy8gZm9yIGRldGFpbHMuXG5cbiAgY29uc3QgTUlOX1NQQUNJTkcgPSAxZS0xNDtcbiAgY29uc3Qge2JvdW5kcywgc3RlcCwgbWluLCBtYXgsIHByZWNpc2lvbiwgY291bnQsIG1heFRpY2tzLCBtYXhEaWdpdHMsIGluY2x1ZGVCb3VuZHN9ID0gZ2VuZXJhdGlvbk9wdGlvbnM7XG4gIGNvbnN0IHVuaXQgPSBzdGVwIHx8IDE7XG4gIGNvbnN0IG1heFNwYWNlcyA9IG1heFRpY2tzIC0gMTtcbiAgY29uc3Qge21pbjogcm1pbiwgbWF4OiBybWF4fSA9IGRhdGFSYW5nZTtcbiAgY29uc3QgbWluRGVmaW5lZCA9ICFpc051bGxPclVuZGVmKG1pbik7XG4gIGNvbnN0IG1heERlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihtYXgpO1xuICBjb25zdCBjb3VudERlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihjb3VudCk7XG4gIGNvbnN0IG1pblNwYWNpbmcgPSAocm1heCAtIHJtaW4pIC8gKG1heERpZ2l0cyArIDEpO1xuICBsZXQgc3BhY2luZyA9IG5pY2VOdW0oKHJtYXggLSBybWluKSAvIG1heFNwYWNlcyAvIHVuaXQpICogdW5pdDtcbiAgbGV0IGZhY3RvciwgbmljZU1pbiwgbmljZU1heCwgbnVtU3BhY2VzO1xuXG4gIC8vIEJleW9uZCBNSU5fU1BBQ0lORyBmbG9hdGluZyBwb2ludCBudW1iZXJzIGJlaW5nIHRvIGxvc2UgcHJlY2lzaW9uXG4gIC8vIHN1Y2ggdGhhdCB3ZSBjYW4ndCBkbyB0aGUgbWF0aCBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgdGlja3NcbiAgaWYgKHNwYWNpbmcgPCBNSU5fU1BBQ0lORyAmJiAhbWluRGVmaW5lZCAmJiAhbWF4RGVmaW5lZCkge1xuICAgIHJldHVybiBbe3ZhbHVlOiBybWlufSwge3ZhbHVlOiBybWF4fV07XG4gIH1cblxuICBudW1TcGFjZXMgPSBNYXRoLmNlaWwocm1heCAvIHNwYWNpbmcpIC0gTWF0aC5mbG9vcihybWluIC8gc3BhY2luZyk7XG4gIGlmIChudW1TcGFjZXMgPiBtYXhTcGFjZXMpIHtcbiAgICAvLyBJZiB0aGUgY2FsY3VsYXRlZCBudW0gb2Ygc3BhY2VzIGV4Y2VlZHMgbWF4TnVtU3BhY2VzLCByZWNhbGN1bGF0ZSBpdFxuICAgIHNwYWNpbmcgPSBuaWNlTnVtKG51bVNwYWNlcyAqIHNwYWNpbmcgLyBtYXhTcGFjZXMgLyB1bml0KSAqIHVuaXQ7XG4gIH1cblxuICBpZiAoIWlzTnVsbE9yVW5kZWYocHJlY2lzaW9uKSkge1xuICAgIC8vIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHByZWNpc2lvbiwgcm91bmQgdG8gdGhhdCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAgICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcbiAgICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcgKiBmYWN0b3IpIC8gZmFjdG9yO1xuICB9XG5cbiAgaWYgKGJvdW5kcyA9PT0gJ3RpY2tzJykge1xuICAgIG5pY2VNaW4gPSBNYXRoLmZsb29yKHJtaW4gLyBzcGFjaW5nKSAqIHNwYWNpbmc7XG4gICAgbmljZU1heCA9IE1hdGguY2VpbChybWF4IC8gc3BhY2luZykgKiBzcGFjaW5nO1xuICB9IGVsc2Uge1xuICAgIG5pY2VNaW4gPSBybWluO1xuICAgIG5pY2VNYXggPSBybWF4O1xuICB9XG5cbiAgaWYgKG1pbkRlZmluZWQgJiYgbWF4RGVmaW5lZCAmJiBzdGVwICYmIGFsbW9zdFdob2xlKChtYXggLSBtaW4pIC8gc3RlcCwgc3BhY2luZyAvIDEwMDApKSB7XG4gICAgLy8gQ2FzZSAxOiBJZiBtaW4sIG1heCBhbmQgc3RlcFNpemUgYXJlIHNldCBhbmQgdGhleSBtYWtlIGFuIGV2ZW5seSBzcGFjZWQgc2NhbGUgdXNlIGl0LlxuICAgIC8vIHNwYWNpbmcgPSBzdGVwO1xuICAgIC8vIG51bVNwYWNlcyA9IChtYXggLSBtaW4pIC8gc3BhY2luZztcbiAgICAvLyBOb3RlIHRoYXQgd2Ugcm91bmQgaGVyZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYWxtb3N0V2hvbGUgdHJhbnNsYXRlZCBhbiBGUCBlcnJvclxuICAgIG51bVNwYWNlcyA9IE1hdGgucm91bmQoTWF0aC5taW4oKG1heCAtIG1pbikgLyBzcGFjaW5nLCBtYXhUaWNrcykpO1xuICAgIHNwYWNpbmcgPSAobWF4IC0gbWluKSAvIG51bVNwYWNlcztcbiAgICBuaWNlTWluID0gbWluO1xuICAgIG5pY2VNYXggPSBtYXg7XG4gIH0gZWxzZSBpZiAoY291bnREZWZpbmVkKSB7XG4gICAgLy8gQ2FzZXMgMiAmIDMsIHdlIGhhdmUgYSBjb3VudCBzcGVjaWZpZWQuIEhhbmRsZSBvcHRpb25hbCB1c2VyIGRlZmluZWQgZWRnZXMgdG8gdGhlIHJhbmdlLlxuICAgIC8vIFNvbWV0aW1lcyB0aGVzZSBhcmUgbm8tb3BzLCBidXQgaXQgbWFrZXMgdGhlIGNvZGUgYSBsb3QgY2xlYXJlclxuICAgIC8vIGFuZCB3aGVuIGEgdXNlciBkZWZpbmVkIHJhbmdlIGlzIHNwZWNpZmllZCwgd2Ugd2FudCB0aGUgY29ycmVjdCB0aWNrc1xuICAgIG5pY2VNaW4gPSBtaW5EZWZpbmVkID8gbWluIDogbmljZU1pbjtcbiAgICBuaWNlTWF4ID0gbWF4RGVmaW5lZCA/IG1heCA6IG5pY2VNYXg7XG4gICAgbnVtU3BhY2VzID0gY291bnQgLSAxO1xuICAgIHNwYWNpbmcgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gbnVtU3BhY2VzO1xuICB9IGVsc2Uge1xuICAgIC8vIENhc2UgNFxuICAgIG51bVNwYWNlcyA9IChuaWNlTWF4IC0gbmljZU1pbikgLyBzcGFjaW5nO1xuXG4gICAgLy8gSWYgdmVyeSBjbG9zZSB0byBvdXIgcm91bmRlZCB2YWx1ZSwgdXNlIGl0LlxuICAgIGlmIChhbG1vc3RFcXVhbHMobnVtU3BhY2VzLCBNYXRoLnJvdW5kKG51bVNwYWNlcyksIHNwYWNpbmcgLyAxMDAwKSkge1xuICAgICAgbnVtU3BhY2VzID0gTWF0aC5yb3VuZChudW1TcGFjZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1TcGFjZXMgPSBNYXRoLmNlaWwobnVtU3BhY2VzKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgc3BhY2luZyB3aWxsIGhhdmUgY2hhbmdlZCBpbiBjYXNlcyAxLCAyLCBhbmQgMyBzbyB0aGUgZmFjdG9yIGNhbm5vdCBiZSBjb21wdXRlZFxuICAvLyB1bnRpbCB0aGlzIHBvaW50XG4gIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBNYXRoLm1heChcbiAgICBfZGVjaW1hbFBsYWNlcyhzcGFjaW5nKSxcbiAgICBfZGVjaW1hbFBsYWNlcyhuaWNlTWluKVxuICApO1xuICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgaXNOdWxsT3JVbmRlZihwcmVjaXNpb24pID8gZGVjaW1hbFBsYWNlcyA6IHByZWNpc2lvbik7XG4gIG5pY2VNaW4gPSBNYXRoLnJvdW5kKG5pY2VNaW4gKiBmYWN0b3IpIC8gZmFjdG9yO1xuICBuaWNlTWF4ID0gTWF0aC5yb3VuZChuaWNlTWF4ICogZmFjdG9yKSAvIGZhY3RvcjtcblxuICBsZXQgaiA9IDA7XG4gIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgaWYgKGluY2x1ZGVCb3VuZHMgJiYgbmljZU1pbiAhPT0gbWluKSB7XG4gICAgICB0aWNrcy5wdXNoKHt2YWx1ZTogbWlufSk7XG5cbiAgICAgIGlmIChuaWNlTWluIDwgbWluKSB7XG4gICAgICAgIGorKzsgLy8gU2tpcCBuaWNlTWluXG4gICAgICB9XG4gICAgICAvLyBJZiB0aGUgbmV4dCBuaWNlIHRpY2sgaXMgY2xvc2UgdG8gbWluLCBza2lwIGl0XG4gICAgICBpZiAoYWxtb3N0RXF1YWxzKE1hdGgucm91bmQoKG5pY2VNaW4gKyBqICogc3BhY2luZykgKiBmYWN0b3IpIC8gZmFjdG9yLCBtaW4sIHJlbGF0aXZlTGFiZWxTaXplKG1pbiwgbWluU3BhY2luZywgZ2VuZXJhdGlvbk9wdGlvbnMpKSkge1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuaWNlTWluIDwgbWluKSB7XG4gICAgICBqKys7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBudW1TcGFjZXM7ICsraikge1xuICAgIHRpY2tzLnB1c2goe3ZhbHVlOiBNYXRoLnJvdW5kKChuaWNlTWluICsgaiAqIHNwYWNpbmcpICogZmFjdG9yKSAvIGZhY3Rvcn0pO1xuICB9XG5cbiAgaWYgKG1heERlZmluZWQgJiYgaW5jbHVkZUJvdW5kcyAmJiBuaWNlTWF4ICE9PSBtYXgpIHtcbiAgICAvLyBJZiB0aGUgcHJldmlvdXMgdGljayBpcyB0b28gY2xvc2UgdG8gbWF4LCByZXBsYWNlIGl0IHdpdGggbWF4LCBlbHNlIGFkZCBtYXhcbiAgICBpZiAodGlja3MubGVuZ3RoICYmIGFsbW9zdEVxdWFscyh0aWNrc1t0aWNrcy5sZW5ndGggLSAxXS52YWx1ZSwgbWF4LCByZWxhdGl2ZUxhYmVsU2l6ZShtYXgsIG1pblNwYWNpbmcsIGdlbmVyYXRpb25PcHRpb25zKSkpIHtcbiAgICAgIHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlID0gbWF4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aWNrcy5wdXNoKHt2YWx1ZTogbWF4fSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFtYXhEZWZpbmVkIHx8IG5pY2VNYXggPT09IG1heCkge1xuICAgIHRpY2tzLnB1c2goe3ZhbHVlOiBuaWNlTWF4fSk7XG4gIH1cblxuICByZXR1cm4gdGlja3M7XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZlTGFiZWxTaXplKHZhbHVlLCBtaW5TcGFjaW5nLCB7aG9yaXpvbnRhbCwgbWluUm90YXRpb259KSB7XG4gIGNvbnN0IHJhZCA9IHRvUmFkaWFucyhtaW5Sb3RhdGlvbik7XG4gIGNvbnN0IHJhdGlvID0gKGhvcml6b250YWwgPyBNYXRoLnNpbihyYWQpIDogTWF0aC5jb3MocmFkKSkgfHwgMC4wMDE7XG4gIGNvbnN0IGxlbmd0aCA9IDAuNzUgKiBtaW5TcGFjaW5nICogKCcnICsgdmFsdWUpLmxlbmd0aDtcbiAgcmV0dXJuIE1hdGgubWluKG1pblNwYWNpbmcgLyByYXRpbywgbGVuZ3RoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGluZWFyU2NhbGVCYXNlIGV4dGVuZHMgU2NhbGUge1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKGNmZyk7XG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuZW5kID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuX3N0YXJ0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fZW5kVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmFsdWVSYW5nZSA9IDA7XG4gIH1cblxuICBwYXJzZShyYXcsIGluZGV4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBpZiAoaXNOdWxsT3JVbmRlZihyYXcpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCh0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyB8fCByYXcgaW5zdGFuY2VvZiBOdW1iZXIpICYmICFpc0Zpbml0ZSgrcmF3KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuICtyYXc7XG4gIH1cblxuICBoYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCkge1xuICAgIGNvbnN0IHtiZWdpbkF0WmVyb30gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qge21pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IHttaW4sIG1heH0gPSB0aGlzO1xuXG4gICAgY29uc3Qgc2V0TWluID0gdiA9PiAobWluID0gbWluRGVmaW5lZCA/IG1pbiA6IHYpO1xuICAgIGNvbnN0IHNldE1heCA9IHYgPT4gKG1heCA9IG1heERlZmluZWQgPyBtYXggOiB2KTtcblxuICAgIGlmIChiZWdpbkF0WmVybykge1xuICAgICAgY29uc3QgbWluU2lnbiA9IHNpZ24obWluKTtcbiAgICAgIGNvbnN0IG1heFNpZ24gPSBzaWduKG1heCk7XG5cbiAgICAgIGlmIChtaW5TaWduIDwgMCAmJiBtYXhTaWduIDwgMCkge1xuICAgICAgICBzZXRNYXgoMCk7XG4gICAgICB9IGVsc2UgaWYgKG1pblNpZ24gPiAwICYmIG1heFNpZ24gPiAwKSB7XG4gICAgICAgIHNldE1pbigwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIGxldCBvZmZzZXQgPSBtYXggPT09IDAgPyAxIDogTWF0aC5hYnMobWF4ICogMC4wNSk7XG5cbiAgICAgIHNldE1heChtYXggKyBvZmZzZXQpO1xuXG4gICAgICBpZiAoIWJlZ2luQXRaZXJvKSB7XG4gICAgICAgIHNldE1pbihtaW4gLSBvZmZzZXQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgfVxuXG4gIGdldFRpY2tMaW1pdCgpIHtcbiAgICBjb25zdCB0aWNrT3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHttYXhUaWNrc0xpbWl0LCBzdGVwU2l6ZX0gPSB0aWNrT3B0cztcbiAgICBsZXQgbWF4VGlja3M7XG5cbiAgICBpZiAoc3RlcFNpemUpIHtcbiAgICAgIG1heFRpY2tzID0gTWF0aC5jZWlsKHRoaXMubWF4IC8gc3RlcFNpemUpIC0gTWF0aC5mbG9vcih0aGlzLm1pbiAvIHN0ZXBTaXplKSArIDE7XG4gICAgICBpZiAobWF4VGlja3MgPiAxMDAwKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7c3RlcFNpemV9IHdvdWxkIHJlc3VsdCBnZW5lcmF0aW5nIHVwIHRvICR7bWF4VGlja3N9IHRpY2tzLiBMaW1pdGluZyB0byAxMDAwLmApO1xuICAgICAgICBtYXhUaWNrcyA9IDEwMDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1heFRpY2tzID0gdGhpcy5jb21wdXRlVGlja0xpbWl0KCk7XG4gICAgICBtYXhUaWNrc0xpbWl0ID0gbWF4VGlja3NMaW1pdCB8fCAxMTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGlja3NMaW1pdCkge1xuICAgICAgbWF4VGlja3MgPSBNYXRoLm1pbihtYXhUaWNrc0xpbWl0LCBtYXhUaWNrcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heFRpY2tzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGNvbXB1dGVUaWNrTGltaXQoKSB7XG4gICAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgfVxuXG4gIGJ1aWxkVGlja3MoKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cbiAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdGhlIG1heCBudW1iZXIgb2YgdGlja3Mgd2UgY2FuIHN1cHBvcnQgaXQgaXMgYmFzZWQgb24gdGhlIHNpemUgb2ZcbiAgICAvLyB0aGUgYXhpcyBhcmVhLiBGb3Igbm93LCB3ZSBzYXkgdGhhdCB0aGUgbWluaW11bSB0aWNrIHNwYWNpbmcgaW4gcGl4ZWxzIG11c3QgYmUgNDBcbiAgICAvLyBXZSBhbHNvIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyB0byAxMSB3aGljaCBnaXZlcyBhIG5pY2UgMTAgc3F1YXJlcyBvblxuICAgIC8vIHRoZSBncmFwaC4gTWFrZSBzdXJlIHdlIGFsd2F5cyBoYXZlIGF0IGxlYXN0IDIgdGlja3NcbiAgICBsZXQgbWF4VGlja3MgPSB0aGlzLmdldFRpY2tMaW1pdCgpO1xuICAgIG1heFRpY2tzID0gTWF0aC5tYXgoMiwgbWF4VGlja3MpO1xuXG4gICAgY29uc3QgbnVtZXJpY0dlbmVyYXRvck9wdGlvbnMgPSB7XG4gICAgICBtYXhUaWNrcyxcbiAgICAgIGJvdW5kczogb3B0cy5ib3VuZHMsXG4gICAgICBtaW46IG9wdHMubWluLFxuICAgICAgbWF4OiBvcHRzLm1heCxcbiAgICAgIHByZWNpc2lvbjogdGlja09wdHMucHJlY2lzaW9uLFxuICAgICAgc3RlcDogdGlja09wdHMuc3RlcFNpemUsXG4gICAgICBjb3VudDogdGlja09wdHMuY291bnQsXG4gICAgICBtYXhEaWdpdHM6IHRoaXMuX21heERpZ2l0cygpLFxuICAgICAgaG9yaXpvbnRhbDogdGhpcy5pc0hvcml6b250YWwoKSxcbiAgICAgIG1pblJvdGF0aW9uOiB0aWNrT3B0cy5taW5Sb3RhdGlvbiB8fCAwLFxuICAgICAgaW5jbHVkZUJvdW5kczogdGlja09wdHMuaW5jbHVkZUJvdW5kcyAhPT0gZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0IGRhdGFSYW5nZSA9IHRoaXMuX3JhbmdlIHx8IHRoaXM7XG4gICAgY29uc3QgdGlja3MgPSBnZW5lcmF0ZVRpY2tzKG51bWVyaWNHZW5lcmF0b3JPcHRpb25zLCBkYXRhUmFuZ2UpO1xuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG1heCBhbmQgbWluIGdpdmVuIHRoZSB0aWNrIHZhbHVlcyxcbiAgICAvLyBzaW5jZSB3ZSBwcm9iYWJseSBoYXZlIGV4cGFuZGVkIHRoZSByYW5nZSBvZiB0aGUgc2NhbGVcbiAgICBpZiAob3B0cy5ib3VuZHMgPT09ICd0aWNrcycpIHtcbiAgICAgIF9zZXRNaW5BbmRNYXhCeUtleSh0aWNrcywgdGhpcywgJ3ZhbHVlJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2ZXJzZSkge1xuICAgICAgdGlja3MucmV2ZXJzZSgpO1xuXG4gICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5tYXg7XG4gICAgICB0aGlzLmVuZCA9IHRoaXMubWluO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5taW47XG4gICAgICB0aGlzLmVuZCA9IHRoaXMubWF4O1xuICAgIH1cblxuICAgIHJldHVybiB0aWNrcztcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBjb25maWd1cmUoKSB7XG4gICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgIGxldCBzdGFydCA9IHRoaXMubWluO1xuICAgIGxldCBlbmQgPSB0aGlzLm1heDtcblxuICAgIHN1cGVyLmNvbmZpZ3VyZSgpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vZmZzZXQgJiYgdGlja3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSAoZW5kIC0gc3RhcnQpIC8gTWF0aC5tYXgodGlja3MubGVuZ3RoIC0gMSwgMSkgLyAyO1xuICAgICAgc3RhcnQgLT0gb2Zmc2V0O1xuICAgICAgZW5kICs9IG9mZnNldDtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHN0YXJ0O1xuICAgIHRoaXMuX2VuZFZhbHVlID0gZW5kO1xuICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSBlbmQgLSBzdGFydDtcbiAgfVxuXG4gIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLCB0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KTtcbiAgfVxufVxuIiwgImltcG9ydCB7aXNGaW5pdGV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCBMaW5lYXJTY2FsZUJhc2UgZnJvbSAnLi9zY2FsZS5saW5lYXJiYXNlLmpzJztcbmltcG9ydCBUaWNrcyBmcm9tICcuLi9jb3JlL2NvcmUudGlja3MuanMnO1xuaW1wb3J0IHt0b1JhZGlhbnN9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lYXJTY2FsZSBleHRlbmRzIExpbmVhclNjYWxlQmFzZSB7XG5cbiAgc3RhdGljIGlkID0gJ2xpbmVhcic7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgdGlja3M6IHtcbiAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLm51bWVyaWNcbiAgICB9XG4gIH07XG5cblxuICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge1xuICAgIGNvbnN0IHttaW4sIG1heH0gPSB0aGlzLmdldE1pbk1heCh0cnVlKTtcblxuICAgIHRoaXMubWluID0gaXNGaW5pdGUobWluKSA/IG1pbiA6IDA7XG4gICAgdGhpcy5tYXggPSBpc0Zpbml0ZShtYXgpID8gbWF4IDogMTtcblxuICAgIC8vIENvbW1vbiBiYXNlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBtaW4sIG1heCwgYmVnaW5BdFplcm9cbiAgICB0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyBiYXNlZCBvbiB0aGUgc2NhbGUgZGltZW5zaW9uXG5cdCAqIEBwcm90ZWN0ZWRcbiBcdCAqL1xuICBjb21wdXRlVGlja0xpbWl0KCkge1xuICAgIGNvbnN0IGhvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGhvcml6b250YWwgPyB0aGlzLndpZHRoIDogdGhpcy5oZWlnaHQ7XG4gICAgY29uc3QgbWluUm90YXRpb24gPSB0b1JhZGlhbnModGhpcy5vcHRpb25zLnRpY2tzLm1pblJvdGF0aW9uKTtcbiAgICBjb25zdCByYXRpbyA9IChob3Jpem9udGFsID8gTWF0aC5zaW4obWluUm90YXRpb24pIDogTWF0aC5jb3MobWluUm90YXRpb24pKSB8fCAwLjAwMTtcbiAgICBjb25zdCB0aWNrRm9udCA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChsZW5ndGggLyBNYXRoLm1pbig0MCwgdGlja0ZvbnQubGluZUhlaWdodCAvIHJhdGlvKSk7XG4gIH1cblxuICAvLyBVdGlsc1xuICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwoKHZhbHVlIC0gdGhpcy5fc3RhcnRWYWx1ZSkgLyB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgfVxuXG4gIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRWYWx1ZSArIHRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKSAqIHRoaXMuX3ZhbHVlUmFuZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQge2Zpbml0ZU9yRGVmYXVsdCwgaXNGaW5pdGV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Zm9ybWF0TnVtYmVyfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuaW50bC5qcyc7XG5pbXBvcnQge19zZXRNaW5BbmRNYXhCeUtleSwgbG9nMTB9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCBTY2FsZSBmcm9tICcuLi9jb3JlL2NvcmUuc2NhbGUuanMnO1xuaW1wb3J0IExpbmVhclNjYWxlQmFzZSBmcm9tICcuL3NjYWxlLmxpbmVhcmJhc2UuanMnO1xuaW1wb3J0IFRpY2tzIGZyb20gJy4uL2NvcmUvY29yZS50aWNrcy5qcyc7XG5cbmNvbnN0IGxvZzEwRmxvb3IgPSB2ID0+IE1hdGguZmxvb3IobG9nMTAodikpO1xuY29uc3QgY2hhbmdlRXhwb25lbnQgPSAodiwgbSkgPT4gTWF0aC5wb3coMTAsIGxvZzEwRmxvb3IodikgKyBtKTtcblxuZnVuY3Rpb24gaXNNYWpvcih0aWNrVmFsKSB7XG4gIGNvbnN0IHJlbWFpbiA9IHRpY2tWYWwgLyAoTWF0aC5wb3coMTAsIGxvZzEwRmxvb3IodGlja1ZhbCkpKTtcbiAgcmV0dXJuIHJlbWFpbiA9PT0gMTtcbn1cblxuZnVuY3Rpb24gc3RlcHMobWluLCBtYXgsIHJhbmdlRXhwKSB7XG4gIGNvbnN0IHJhbmdlU3RlcCA9IE1hdGgucG93KDEwLCByYW5nZUV4cCk7XG4gIGNvbnN0IHN0YXJ0ID0gTWF0aC5mbG9vcihtaW4gLyByYW5nZVN0ZXApO1xuICBjb25zdCBlbmQgPSBNYXRoLmNlaWwobWF4IC8gcmFuZ2VTdGVwKTtcbiAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufVxuXG5mdW5jdGlvbiBzdGFydEV4cChtaW4sIG1heCkge1xuICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgbGV0IHJhbmdlRXhwID0gbG9nMTBGbG9vcihyYW5nZSk7XG4gIHdoaWxlIChzdGVwcyhtaW4sIG1heCwgcmFuZ2VFeHApID4gMTApIHtcbiAgICByYW5nZUV4cCsrO1xuICB9XG4gIHdoaWxlIChzdGVwcyhtaW4sIG1heCwgcmFuZ2VFeHApIDwgMTApIHtcbiAgICByYW5nZUV4cC0tO1xuICB9XG4gIHJldHVybiBNYXRoLm1pbihyYW5nZUV4cCwgbG9nMTBGbG9vcihtaW4pKTtcbn1cblxuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxvZ2FyaXRobWljIHRpY2tzXG4gKiBAcGFyYW0gZ2VuZXJhdGlvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGlja3NcbiAqIEBwYXJhbSBkYXRhUmFuZ2UgdGhlIHJhbmdlIG9mIHRoZSBkYXRhXG4gKiBAcmV0dXJucyB7b2JqZWN0W119IGFycmF5IG9mIHRpY2sgb2JqZWN0c1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCB7bWluLCBtYXh9KSB7XG4gIG1pbiA9IGZpbml0ZU9yRGVmYXVsdChnZW5lcmF0aW9uT3B0aW9ucy5taW4sIG1pbik7XG4gIGNvbnN0IHRpY2tzID0gW107XG4gIGNvbnN0IG1pbkV4cCA9IGxvZzEwRmxvb3IobWluKTtcbiAgbGV0IGV4cCA9IHN0YXJ0RXhwKG1pbiwgbWF4KTtcbiAgbGV0IHByZWNpc2lvbiA9IGV4cCA8IDAgPyBNYXRoLnBvdygxMCwgTWF0aC5hYnMoZXhwKSkgOiAxO1xuICBjb25zdCBzdGVwU2l6ZSA9IE1hdGgucG93KDEwLCBleHApO1xuICBjb25zdCBiYXNlID0gbWluRXhwID4gZXhwID8gTWF0aC5wb3coMTAsIG1pbkV4cCkgOiAwO1xuICBjb25zdCBzdGFydCA9IE1hdGgucm91bmQoKG1pbiAtIGJhc2UpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcbiAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5mbG9vcigobWluIC0gYmFzZSkgLyBzdGVwU2l6ZSAvIDEwKSAqIHN0ZXBTaXplICogMTA7XG4gIGxldCBzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IoKHN0YXJ0IC0gb2Zmc2V0KSAvIE1hdGgucG93KDEwLCBleHApKTtcbiAgbGV0IHZhbHVlID0gZmluaXRlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1pbiwgTWF0aC5yb3VuZCgoYmFzZSArIG9mZnNldCArIHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCkpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbik7XG4gIHdoaWxlICh2YWx1ZSA8IG1heCkge1xuICAgIHRpY2tzLnB1c2goe3ZhbHVlLCBtYWpvcjogaXNNYWpvcih2YWx1ZSksIHNpZ25pZmljYW5kfSk7XG4gICAgaWYgKHNpZ25pZmljYW5kID49IDEwKSB7XG4gICAgICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kIDwgMTUgPyAxNSA6IDIwO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduaWZpY2FuZCsrO1xuICAgIH1cbiAgICBpZiAoc2lnbmlmaWNhbmQgPj0gMjApIHtcbiAgICAgIGV4cCsrO1xuICAgICAgc2lnbmlmaWNhbmQgPSAyO1xuICAgICAgcHJlY2lzaW9uID0gZXhwID49IDAgPyAxIDogcHJlY2lzaW9uO1xuICAgIH1cbiAgICB2YWx1ZSA9IE1hdGgucm91bmQoKGJhc2UgKyBvZmZzZXQgKyBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApKSAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG4gIH1cbiAgY29uc3QgbGFzdFRpY2sgPSBmaW5pdGVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWF4LCB2YWx1ZSk7XG4gIHRpY2tzLnB1c2goe3ZhbHVlOiBsYXN0VGljaywgbWFqb3I6IGlzTWFqb3IobGFzdFRpY2spLCBzaWduaWZpY2FuZH0pO1xuXG4gIHJldHVybiB0aWNrcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nYXJpdGhtaWNTY2FsZSBleHRlbmRzIFNjYWxlIHtcblxuICBzdGF0aWMgaWQgPSAnbG9nYXJpdGhtaWMnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIHRpY2tzOiB7XG4gICAgICBjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxcbiAgICAgIG1ham9yOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcihjZmcpO1xuXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5zdGFydCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLmVuZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLl9zdGFydFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSAwO1xuICB9XG5cbiAgcGFyc2UocmF3LCBpbmRleCkge1xuICAgIGNvbnN0IHZhbHVlID0gTGluZWFyU2NhbGVCYXNlLnByb3RvdHlwZS5wYXJzZS5hcHBseSh0aGlzLCBbcmF3LCBpbmRleF0pO1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgdGhpcy5femVybyA9IHRydWU7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgY29uc3Qge21pbiwgbWF4fSA9IHRoaXMuZ2V0TWluTWF4KHRydWUpO1xuXG4gICAgdGhpcy5taW4gPSBpc0Zpbml0ZShtaW4pID8gTWF0aC5tYXgoMCwgbWluKSA6IG51bGw7XG4gICAgdGhpcy5tYXggPSBpc0Zpbml0ZShtYXgpID8gTWF0aC5tYXgoMCwgbWF4KSA6IG51bGw7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvKSB7XG4gICAgICB0aGlzLl96ZXJvID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBkYXRhIGhhcyBgMGAgaW4gaXQgb3IgYGJlZ2luQXRaZXJvYCBpcyB0cnVlLCBtaW4gKG5vbiB6ZXJvKSB2YWx1ZSBpcyBhdCBib3R0b21cbiAgICAvLyBvZiBzY2FsZSwgYW5kIGl0IGRvZXMgbm90IGVxdWFsIHN1Z2dlc3RlZE1pbiwgbG93ZXIgdGhlIG1pbiBib3VuZCBieSBvbmUgZXhwLlxuICAgIGlmICh0aGlzLl96ZXJvICYmIHRoaXMubWluICE9PSB0aGlzLl9zdWdnZXN0ZWRNaW4gJiYgIWlzRmluaXRlKHRoaXMuX3VzZXJNaW4pKSB7XG4gICAgICB0aGlzLm1pbiA9IG1pbiA9PT0gY2hhbmdlRXhwb25lbnQodGhpcy5taW4sIDApID8gY2hhbmdlRXhwb25lbnQodGhpcy5taW4sIC0xKSA6IGNoYW5nZUV4cG9uZW50KHRoaXMubWluLCAwKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcbiAgfVxuXG4gIGhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKSB7XG4gICAgY29uc3Qge21pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IG1pbiA9IHRoaXMubWluO1xuICAgIGxldCBtYXggPSB0aGlzLm1heDtcblxuICAgIGNvbnN0IHNldE1pbiA9IHYgPT4gKG1pbiA9IG1pbkRlZmluZWQgPyBtaW4gOiB2KTtcbiAgICBjb25zdCBzZXRNYXggPSB2ID0+IChtYXggPSBtYXhEZWZpbmVkID8gbWF4IDogdik7XG5cbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIGlmIChtaW4gPD0gMCkgeyAvLyBpbmNsdWRlcyBudWxsXG4gICAgICAgIHNldE1pbigxKTtcbiAgICAgICAgc2V0TWF4KDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE1pbihjaGFuZ2VFeHBvbmVudChtaW4sIC0xKSk7XG4gICAgICAgIHNldE1heChjaGFuZ2VFeHBvbmVudChtYXgsICsxKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtaW4gPD0gMCkge1xuICAgICAgc2V0TWluKGNoYW5nZUV4cG9uZW50KG1heCwgLTEpKTtcbiAgICB9XG4gICAgaWYgKG1heCA8PSAwKSB7XG5cbiAgICAgIHNldE1heChjaGFuZ2VFeHBvbmVudChtaW4sICsxKSk7XG4gICAgfVxuXG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH1cblxuICBidWlsZFRpY2tzKCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCBnZW5lcmF0aW9uT3B0aW9ucyA9IHtcbiAgICAgIG1pbjogdGhpcy5fdXNlck1pbixcbiAgICAgIG1heDogdGhpcy5fdXNlck1heFxuICAgIH07XG4gICAgY29uc3QgdGlja3MgPSBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCB0aGlzKTtcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gdXBkYXRlIG91ciBtYXggYW5kIG1pbiBnaXZlbiB0aGUgdGljayB2YWx1ZXMsXG4gICAgLy8gc2luY2Ugd2UgcHJvYmFibHkgaGF2ZSBleHBhbmRlZCB0aGUgcmFuZ2Ugb2YgdGhlIHNjYWxlXG4gICAgaWYgKG9wdHMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICBfc2V0TWluQW5kTWF4QnlLZXkodGlja3MsIHRoaXMsICd2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnJldmVyc2UpIHtcbiAgICAgIHRpY2tzLnJldmVyc2UoKTtcblxuICAgICAgdGhpcy5zdGFydCA9IHRoaXMubWF4O1xuICAgICAgdGhpcy5lbmQgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydCA9IHRoaXMubWluO1xuICAgICAgdGhpcy5lbmQgPSB0aGlzLm1heDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG4gIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAnMCdcbiAgICAgIDogZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLCB0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBjb25maWd1cmUoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcblxuICAgIHN1cGVyLmNvbmZpZ3VyZSgpO1xuXG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IGxvZzEwKHN0YXJ0KTtcbiAgICB0aGlzLl92YWx1ZVJhbmdlID0gbG9nMTAodGhpcy5tYXgpIC0gbG9nMTAoc3RhcnQpO1xuICB9XG5cbiAgZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMubWluO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwodmFsdWUgPT09IHRoaXMubWluXG4gICAgICA/IDBcbiAgICAgIDogKGxvZzEwKHZhbHVlKSAtIHRoaXMuX3N0YXJ0VmFsdWUpIC8gdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cblxuICBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7XG4gICAgY29uc3QgZGVjaW1hbCA9IHRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKTtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXJ0VmFsdWUgKyBkZWNpbWFsICogdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vY29yZS9jb3JlLmRlZmF1bHRzLmpzJztcbmltcG9ydCB7X2xvbmdlc3RUZXh0LCBhZGRSb3VuZGVkUmVjdFBhdGgsIHJlbmRlclRleHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHtIQUxGX1BJLCBUQVUsIHRvRGVncmVlcywgdG9SYWRpYW5zLCBfbm9ybWFsaXplQW5nbGUsIFBJfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5pbXBvcnQgTGluZWFyU2NhbGVCYXNlIGZyb20gJy4vc2NhbGUubGluZWFyYmFzZS5qcyc7XG5pbXBvcnQgVGlja3MgZnJvbSAnLi4vY29yZS9jb3JlLnRpY2tzLmpzJztcbmltcG9ydCB7dmFsdWVPckRlZmF1bHQsIGlzQXJyYXksIGlzRmluaXRlLCBjYWxsYmFjayBhcyBjYWxsQ2FsbGJhY2ssIGlzTnVsbE9yVW5kZWZ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Y3JlYXRlQ29udGV4dCwgdG9Gb250LCB0b1BhZGRpbmcsIHRvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuZnVuY3Rpb24gZ2V0VGlja0JhY2tkcm9wSGVpZ2h0KG9wdHMpIHtcbiAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXG4gIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmIG9wdHMuZGlzcGxheSkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcodGlja09wdHMuYmFja2Ryb3BQYWRkaW5nKTtcbiAgICByZXR1cm4gdmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udCAmJiB0aWNrT3B0cy5mb250LnNpemUsIGRlZmF1bHRzLmZvbnQuc2l6ZSkgKyBwYWRkaW5nLmhlaWdodDtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gbWVhc3VyZUxhYmVsU2l6ZShjdHgsIGZvbnQsIGxhYmVsKSB7XG4gIGxhYmVsID0gaXNBcnJheShsYWJlbCkgPyBsYWJlbCA6IFtsYWJlbF07XG4gIHJldHVybiB7XG4gICAgdzogX2xvbmdlc3RUZXh0KGN0eCwgZm9udC5zdHJpbmcsIGxhYmVsKSxcbiAgICBoOiBsYWJlbC5sZW5ndGggKiBmb250LmxpbmVIZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb3MsIHNpemUsIG1pbiwgbWF4KSB7XG4gIGlmIChhbmdsZSA9PT0gbWluIHx8IGFuZ2xlID09PSBtYXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHBvcyAtIChzaXplIC8gMiksXG4gICAgICBlbmQ6IHBvcyArIChzaXplIC8gMilcbiAgICB9O1xuICB9IGVsc2UgaWYgKGFuZ2xlIDwgbWluIHx8IGFuZ2xlID4gbWF4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBwb3MgLSBzaXplLFxuICAgICAgZW5kOiBwb3NcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcG9zLFxuICAgIGVuZDogcG9zICsgc2l6ZVxuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBmaXQgYSByYWRpYWwgbGluZWFyIHNjYWxlIHdpdGggcG9pbnQgbGFiZWxzXG4gKi9cbmZ1bmN0aW9uIGZpdFdpdGhQb2ludExhYmVscyhzY2FsZSkge1xuXG4gIC8vIFJpZ2h0LCB0aGlzIGlzIHJlYWxseSBjb25mdXNpbmcgYW5kIHRoZXJlIGlzIGEgbG90IG9mIG1hdGhzIGdvaW5nIG9uIGhlcmVcbiAgLy8gVGhlIGdpc3Qgb2YgdGhlIHByb2JsZW0gaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbm5uaWNrLzY5NmNjOWM1NWY0YjBiZWI4ZmU5XG4gIC8vXG4gIC8vIFJlYWN0aW9uOiBodHRwczovL2RsLmRyb3Bib3h1c2VyY29udGVudC5jb20vdS8zNDYwMTM2My90b29tdWNoc2NpZW5jZS5naWZcbiAgLy9cbiAgLy8gU29sdXRpb246XG4gIC8vXG4gIC8vIFdlIGFzc3VtZSB0aGUgcmFkaXVzIG9mIHRoZSBwb2x5Z29uIGlzIGhhbGYgdGhlIHNpemUgb2YgdGhlIGNhbnZhcyBhdCBmaXJzdFxuICAvLyBhdCBlYWNoIGluZGV4IHdlIGNoZWNrIGlmIHRoZSB0ZXh0IG92ZXJsYXBzLlxuICAvL1xuICAvLyBXaGVyZSBpdCBkb2VzLCB3ZSBzdG9yZSB0aGF0IGFuZ2xlIGFuZCB0aGF0IGluZGV4LlxuICAvL1xuICAvLyBBZnRlciBmaW5kaW5nIHRoZSBsYXJnZXN0IGluZGV4IGFuZCBhbmdsZSB3ZSBjYWxjdWxhdGUgaG93IG11Y2ggd2UgbmVlZCB0byByZW1vdmVcbiAgLy8gZnJvbSB0aGUgc2hhcGUgcmFkaXVzIHRvIG1vdmUgdGhlIHBvaW50IGlud2FyZHMgYnkgdGhhdCB4LlxuICAvL1xuICAvLyBXZSBhdmVyYWdlIHRoZSBsZWZ0IGFuZCByaWdodCBkaXN0YW5jZXMgdG8gZ2V0IHRoZSBtYXhpbXVtIHNoYXBlIHJhZGl1cyB0aGF0IGNhbiBmaXQgaW4gdGhlIGJveFxuICAvLyBhbG9uZyB3aXRoIGxhYmVscy5cbiAgLy9cbiAgLy8gT25jZSB3ZSBoYXZlIHRoYXQsIHdlIGNhbiBmaW5kIHRoZSBjZW50cmUgcG9pbnQgZm9yIHRoZSBjaGFydCwgYnkgdGFraW5nIHRoZSB4IHRleHQgcHJvdHJ1c2lvblxuICAvLyBvbiBlYWNoIHNpZGUsIHJlbW92aW5nIHRoYXQgZnJvbSB0aGUgc2l6ZSwgaGFsdmluZyBpdCBhbmQgYWRkaW5nIHRoZSBsZWZ0IHggcHJvdHJ1c2lvbiB3aWR0aC5cbiAgLy9cbiAgLy8gVGhpcyB3aWxsIG1lYW4gd2UgaGF2ZSBhIHNoYXBlIGZpdHRlZCB0byB0aGUgY2FudmFzLCBhcyBsYXJnZSBhcyBpdCBjYW4gYmUgd2l0aCB0aGUgbGFiZWxzXG4gIC8vIGFuZCBwb3NpdGlvbiBpdCBpbiB0aGUgbW9zdCBzcGFjZSBlZmZpY2llbnQgbWFubmVyXG4gIC8vXG4gIC8vIGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzM0NjAxMzYzL3llYWhzY2llbmNlLmdpZlxuXG4gIC8vIEdldCBtYXhpbXVtIHJhZGl1cyBvZiB0aGUgcG9seWdvbi4gRWl0aGVyIGhhbGYgdGhlIGhlaWdodCAobWludXMgdGhlIHRleHQgd2lkdGgpIG9yIGhhbGYgdGhlIHdpZHRoLlxuICAvLyBVc2UgdGhpcyB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCArIGNoYW5nZS4gLSBNYWtlIHN1cmUgTC9SIHByb3RydXNpb24gaXMgYXQgbGVhc3QgMCB0byBzdG9wIGlzc3VlcyB3aXRoIGNlbnRyZSBwb2ludHNcbiAgY29uc3Qgb3JpZyA9IHtcbiAgICBsOiBzY2FsZS5sZWZ0ICsgc2NhbGUuX3BhZGRpbmcubGVmdCxcbiAgICByOiBzY2FsZS5yaWdodCAtIHNjYWxlLl9wYWRkaW5nLnJpZ2h0LFxuICAgIHQ6IHNjYWxlLnRvcCArIHNjYWxlLl9wYWRkaW5nLnRvcCxcbiAgICBiOiBzY2FsZS5ib3R0b20gLSBzY2FsZS5fcGFkZGluZy5ib3R0b21cbiAgfTtcbiAgY29uc3QgbGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZyk7XG4gIGNvbnN0IGxhYmVsU2l6ZXMgPSBbXTtcbiAgY29uc3QgcGFkZGluZyA9IFtdO1xuICBjb25zdCB2YWx1ZUNvdW50ID0gc2NhbGUuX3BvaW50TGFiZWxzLmxlbmd0aDtcbiAgY29uc3QgcG9pbnRMYWJlbE9wdHMgPSBzY2FsZS5vcHRpb25zLnBvaW50TGFiZWxzO1xuICBjb25zdCBhZGRpdGlvbmFsQW5nbGUgPSBwb2ludExhYmVsT3B0cy5jZW50ZXJQb2ludExhYmVscyA/IFBJIC8gdmFsdWVDb3VudCA6IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHtcbiAgICBjb25zdCBvcHRzID0gcG9pbnRMYWJlbE9wdHMuc2V0Q29udGV4dChzY2FsZS5nZXRQb2ludExhYmVsQ29udGV4dChpKSk7XG4gICAgcGFkZGluZ1tpXSA9IG9wdHMucGFkZGluZztcbiAgICBjb25zdCBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCBzY2FsZS5kcmF3aW5nQXJlYSArIHBhZGRpbmdbaV0sIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgY29uc3QgcGxGb250ID0gdG9Gb250KG9wdHMuZm9udCk7XG4gICAgY29uc3QgdGV4dFNpemUgPSBtZWFzdXJlTGFiZWxTaXplKHNjYWxlLmN0eCwgcGxGb250LCBzY2FsZS5fcG9pbnRMYWJlbHNbaV0pO1xuICAgIGxhYmVsU2l6ZXNbaV0gPSB0ZXh0U2l6ZTtcblxuICAgIGNvbnN0IGFuZ2xlUmFkaWFucyA9IF9ub3JtYWxpemVBbmdsZShzY2FsZS5nZXRJbmRleEFuZ2xlKGkpICsgYWRkaXRpb25hbEFuZ2xlKTtcbiAgICBjb25zdCBhbmdsZSA9IE1hdGgucm91bmQodG9EZWdyZWVzKGFuZ2xlUmFkaWFucykpO1xuICAgIGNvbnN0IGhMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueCwgdGV4dFNpemUudywgMCwgMTgwKTtcbiAgICBjb25zdCB2TGltaXRzID0gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb2ludFBvc2l0aW9uLnksIHRleHRTaXplLmgsIDkwLCAyNzApO1xuICAgIHVwZGF0ZUxpbWl0cyhsaW1pdHMsIG9yaWcsIGFuZ2xlUmFkaWFucywgaExpbWl0cywgdkxpbWl0cyk7XG4gIH1cblxuICBzY2FsZS5zZXRDZW50ZXJQb2ludChcbiAgICBvcmlnLmwgLSBsaW1pdHMubCxcbiAgICBsaW1pdHMuciAtIG9yaWcucixcbiAgICBvcmlnLnQgLSBsaW1pdHMudCxcbiAgICBsaW1pdHMuYiAtIG9yaWcuYlxuICApO1xuXG4gIC8vIE5vdyB0aGF0IHRleHQgc2l6ZSBpcyBkZXRlcm1pbmVkLCBjb21wdXRlIHRoZSBmdWxsIHBvc2l0aW9uc1xuICBzY2FsZS5fcG9pbnRMYWJlbEl0ZW1zID0gYnVpbGRQb2ludExhYmVsSXRlbXMoc2NhbGUsIGxhYmVsU2l6ZXMsIHBhZGRpbmcpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW1pdHMobGltaXRzLCBvcmlnLCBhbmdsZSwgaExpbWl0cywgdkxpbWl0cykge1xuICBjb25zdCBzaW4gPSBNYXRoLmFicyhNYXRoLnNpbihhbmdsZSkpO1xuICBjb25zdCBjb3MgPSBNYXRoLmFicyhNYXRoLmNvcyhhbmdsZSkpO1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcbiAgaWYgKGhMaW1pdHMuc3RhcnQgPCBvcmlnLmwpIHtcbiAgICB4ID0gKG9yaWcubCAtIGhMaW1pdHMuc3RhcnQpIC8gc2luO1xuICAgIGxpbWl0cy5sID0gTWF0aC5taW4obGltaXRzLmwsIG9yaWcubCAtIHgpO1xuICB9IGVsc2UgaWYgKGhMaW1pdHMuZW5kID4gb3JpZy5yKSB7XG4gICAgeCA9IChoTGltaXRzLmVuZCAtIG9yaWcucikgLyBzaW47XG4gICAgbGltaXRzLnIgPSBNYXRoLm1heChsaW1pdHMuciwgb3JpZy5yICsgeCk7XG4gIH1cbiAgaWYgKHZMaW1pdHMuc3RhcnQgPCBvcmlnLnQpIHtcbiAgICB5ID0gKG9yaWcudCAtIHZMaW1pdHMuc3RhcnQpIC8gY29zO1xuICAgIGxpbWl0cy50ID0gTWF0aC5taW4obGltaXRzLnQsIG9yaWcudCAtIHkpO1xuICB9IGVsc2UgaWYgKHZMaW1pdHMuZW5kID4gb3JpZy5iKSB7XG4gICAgeSA9ICh2TGltaXRzLmVuZCAtIG9yaWcuYikgLyBjb3M7XG4gICAgbGltaXRzLmIgPSBNYXRoLm1heChsaW1pdHMuYiwgb3JpZy5iICsgeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQb2ludExhYmVsSXRlbXMoc2NhbGUsIGxhYmVsU2l6ZXMsIHBhZGRpbmcpIHtcbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgY29uc3QgdmFsdWVDb3VudCA9IHNjYWxlLl9wb2ludExhYmVscy5sZW5ndGg7XG4gIGNvbnN0IG9wdHMgPSBzY2FsZS5vcHRpb25zO1xuICBjb25zdCBleHRyYSA9IGdldFRpY2tCYWNrZHJvcEhlaWdodChvcHRzKSAvIDI7XG4gIGNvbnN0IG91dGVyRGlzdGFuY2UgPSBzY2FsZS5kcmF3aW5nQXJlYTtcbiAgY29uc3QgYWRkaXRpb25hbEFuZ2xlID0gb3B0cy5wb2ludExhYmVscy5jZW50ZXJQb2ludExhYmVscyA/IFBJIC8gdmFsdWVDb3VudCA6IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHtcbiAgICBjb25zdCBwb2ludExhYmVsUG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIG91dGVyRGlzdGFuY2UgKyBleHRyYSArIHBhZGRpbmdbaV0sIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLnJvdW5kKHRvRGVncmVlcyhfbm9ybWFsaXplQW5nbGUocG9pbnRMYWJlbFBvc2l0aW9uLmFuZ2xlICsgSEFMRl9QSSkpKTtcbiAgICBjb25zdCBzaXplID0gbGFiZWxTaXplc1tpXTtcbiAgICBjb25zdCB5ID0geUZvckFuZ2xlKHBvaW50TGFiZWxQb3NpdGlvbi55LCBzaXplLmgsIGFuZ2xlKTtcbiAgICBjb25zdCB0ZXh0QWxpZ24gPSBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSk7XG4gICAgY29uc3QgbGVmdCA9IGxlZnRGb3JUZXh0QWxpZ24ocG9pbnRMYWJlbFBvc2l0aW9uLngsIHNpemUudywgdGV4dEFsaWduKTtcblxuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgLy8gVGV4dCBwb3NpdGlvblxuICAgICAgeDogcG9pbnRMYWJlbFBvc2l0aW9uLngsXG4gICAgICB5LFxuXG4gICAgICAvLyBUZXh0IHJlbmRlcmluZyBkYXRhXG4gICAgICB0ZXh0QWxpZ24sXG5cbiAgICAgIC8vIEJvdW5kaW5nIGJveFxuICAgICAgbGVmdCxcbiAgICAgIHRvcDogeSxcbiAgICAgIHJpZ2h0OiBsZWZ0ICsgc2l6ZS53LFxuICAgICAgYm90dG9tOiB5ICsgc2l6ZS5oXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5mdW5jdGlvbiBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSkge1xuICBpZiAoYW5nbGUgPT09IDAgfHwgYW5nbGUgPT09IDE4MCkge1xuICAgIHJldHVybiAnY2VudGVyJztcbiAgfSBlbHNlIGlmIChhbmdsZSA8IDE4MCkge1xuICAgIHJldHVybiAnbGVmdCc7XG4gIH1cblxuICByZXR1cm4gJ3JpZ2h0Jztcbn1cblxuZnVuY3Rpb24gbGVmdEZvclRleHRBbGlnbih4LCB3LCBhbGlnbikge1xuICBpZiAoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICB4IC09IHc7XG4gIH0gZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgeCAtPSAodyAvIDIpO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiB5Rm9yQW5nbGUoeSwgaCwgYW5nbGUpIHtcbiAgaWYgKGFuZ2xlID09PSA5MCB8fCBhbmdsZSA9PT0gMjcwKSB7XG4gICAgeSAtPSAoaCAvIDIpO1xuICB9IGVsc2UgaWYgKGFuZ2xlID4gMjcwIHx8IGFuZ2xlIDwgOTApIHtcbiAgICB5IC09IGg7XG4gIH1cbiAgcmV0dXJuIHk7XG59XG5cbmZ1bmN0aW9uIGRyYXdQb2ludExhYmVscyhzY2FsZSwgbGFiZWxDb3VudCkge1xuICBjb25zdCB7Y3R4LCBvcHRpb25zOiB7cG9pbnRMYWJlbHN9fSA9IHNjYWxlO1xuXG4gIGZvciAobGV0IGkgPSBsYWJlbENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBvcHRzQXRJbmRleCA9IHBvaW50TGFiZWxzLnNldENvbnRleHQoc2NhbGUuZ2V0UG9pbnRMYWJlbENvbnRleHQoaSkpO1xuICAgIGNvbnN0IHBsRm9udCA9IHRvRm9udChvcHRzQXRJbmRleC5mb250KTtcbiAgICBjb25zdCB7eCwgeSwgdGV4dEFsaWduLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b219ID0gc2NhbGUuX3BvaW50TGFiZWxJdGVtc1tpXTtcbiAgICBjb25zdCB7YmFja2Ryb3BDb2xvcn0gPSBvcHRzQXRJbmRleDtcblxuICAgIGlmICghaXNOdWxsT3JVbmRlZihiYWNrZHJvcENvbG9yKSkge1xuICAgICAgY29uc3QgYm9yZGVyUmFkaXVzID0gdG9UUkJMQ29ybmVycyhvcHRzQXRJbmRleC5ib3JkZXJSYWRpdXMpO1xuICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRzQXRJbmRleC5iYWNrZHJvcFBhZGRpbmcpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tkcm9wQ29sb3I7XG5cbiAgICAgIGNvbnN0IGJhY2tkcm9wTGVmdCA9IGxlZnQgLSBwYWRkaW5nLmxlZnQ7XG4gICAgICBjb25zdCBiYWNrZHJvcFRvcCA9IHRvcCAtIHBhZGRpbmcudG9wO1xuICAgICAgY29uc3QgYmFja2Ryb3BXaWR0aCA9IHJpZ2h0IC0gbGVmdCArIHBhZGRpbmcud2lkdGg7XG4gICAgICBjb25zdCBiYWNrZHJvcEhlaWdodCA9IGJvdHRvbSAtIHRvcCArIHBhZGRpbmcuaGVpZ2h0O1xuXG4gICAgICBpZiAoT2JqZWN0LnZhbHVlcyhib3JkZXJSYWRpdXMpLnNvbWUodiA9PiB2ICE9PSAwKSkge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGFkZFJvdW5kZWRSZWN0UGF0aChjdHgsIHtcbiAgICAgICAgICB4OiBiYWNrZHJvcExlZnQsXG4gICAgICAgICAgeTogYmFja2Ryb3BUb3AsXG4gICAgICAgICAgdzogYmFja2Ryb3BXaWR0aCxcbiAgICAgICAgICBoOiBiYWNrZHJvcEhlaWdodCxcbiAgICAgICAgICByYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZmlsbFJlY3QoYmFja2Ryb3BMZWZ0LCBiYWNrZHJvcFRvcCwgYmFja2Ryb3BXaWR0aCwgYmFja2Ryb3BIZWlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlclRleHQoXG4gICAgICBjdHgsXG4gICAgICBzY2FsZS5fcG9pbnRMYWJlbHNbaV0sXG4gICAgICB4LFxuICAgICAgeSArIChwbEZvbnQubGluZUhlaWdodCAvIDIpLFxuICAgICAgcGxGb250LFxuICAgICAge1xuICAgICAgICBjb2xvcjogb3B0c0F0SW5kZXguY29sb3IsXG4gICAgICAgIHRleHRBbGlnbjogdGV4dEFsaWduLFxuICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRoUmFkaXVzTGluZShzY2FsZSwgcmFkaXVzLCBjaXJjdWxhciwgbGFiZWxDb3VudCkge1xuICBjb25zdCB7Y3R4fSA9IHNjYWxlO1xuICBpZiAoY2lyY3VsYXIpIHtcbiAgICAvLyBEcmF3IGNpcmN1bGFyIGFyY3MgYmV0d2VlbiB0aGUgcG9pbnRzXG4gICAgY3R4LmFyYyhzY2FsZS54Q2VudGVyLCBzY2FsZS55Q2VudGVyLCByYWRpdXMsIDAsIFRBVSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRHJhdyBzdHJhaWdodCBsaW5lcyBjb25uZWN0aW5nIGVhY2ggaW5kZXhcbiAgICBsZXQgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oMCwgcmFkaXVzKTtcbiAgICBjdHgubW92ZVRvKHBvaW50UG9zaXRpb24ueCwgcG9pbnRQb3NpdGlvbi55KTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XG4gICAgICBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCByYWRpdXMpO1xuICAgICAgY3R4LmxpbmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdSYWRpdXNMaW5lKHNjYWxlLCBncmlkTGluZU9wdHMsIHJhZGl1cywgbGFiZWxDb3VudCwgYm9yZGVyT3B0cykge1xuICBjb25zdCBjdHggPSBzY2FsZS5jdHg7XG4gIGNvbnN0IGNpcmN1bGFyID0gZ3JpZExpbmVPcHRzLmNpcmN1bGFyO1xuXG4gIGNvbnN0IHtjb2xvciwgbGluZVdpZHRofSA9IGdyaWRMaW5lT3B0cztcblxuICBpZiAoKCFjaXJjdWxhciAmJiAhbGFiZWxDb3VudCkgfHwgIWNvbG9yIHx8ICFsaW5lV2lkdGggfHwgcmFkaXVzIDwgMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGN0eC5zYXZlKCk7XG4gIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICBjdHguc2V0TGluZURhc2goYm9yZGVyT3B0cy5kYXNoKTtcbiAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gYm9yZGVyT3B0cy5kYXNoT2Zmc2V0O1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgcGF0aFJhZGl1c0xpbmUoc2NhbGUsIHJhZGl1cywgY2lyY3VsYXIsIGxhYmVsQ291bnQpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5zdHJva2UoKTtcbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUG9pbnRMYWJlbENvbnRleHQocGFyZW50LCBpbmRleCwgbGFiZWwpIHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgbGFiZWwsXG4gICAgaW5kZXgsXG4gICAgdHlwZTogJ3BvaW50TGFiZWwnXG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpYWxMaW5lYXJTY2FsZSBleHRlbmRzIExpbmVhclNjYWxlQmFzZSB7XG5cbiAgc3RhdGljIGlkID0gJ3JhZGlhbExpbmVhcic7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGlzcGxheTogdHJ1ZSxcblxuICAgIC8vIEJvb2xlYW4gLSBXaGV0aGVyIHRvIGFuaW1hdGUgc2NhbGluZyB0aGUgY2hhcnQgZnJvbSB0aGUgY2VudHJlXG4gICAgYW5pbWF0ZTogdHJ1ZSxcbiAgICBwb3NpdGlvbjogJ2NoYXJ0QXJlYScsXG5cbiAgICBhbmdsZUxpbmVzOiB7XG4gICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiAxLFxuICAgICAgYm9yZGVyRGFzaDogW10sXG4gICAgICBib3JkZXJEYXNoT2Zmc2V0OiAwLjBcbiAgICB9LFxuXG4gICAgZ3JpZDoge1xuICAgICAgY2lyY3VsYXI6IGZhbHNlXG4gICAgfSxcblxuICAgIHN0YXJ0QW5nbGU6IDAsXG5cbiAgICAvLyBsYWJlbCBzZXR0aW5nc1xuICAgIHRpY2tzOiB7XG4gICAgICAvLyBCb29sZWFuIC0gU2hvdyBhIGJhY2tkcm9wIHRvIHRoZSBzY2FsZSBsYWJlbFxuICAgICAgc2hvd0xhYmVsQmFja2Ryb3A6IHRydWUsXG5cbiAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLm51bWVyaWNcbiAgICB9LFxuXG4gICAgcG9pbnRMYWJlbHM6IHtcbiAgICAgIGJhY2tkcm9wQ29sb3I6IHVuZGVmaW5lZCxcblxuICAgICAgLy8gTnVtYmVyIC0gVGhlIGJhY2tkcm9wIHBhZGRpbmcgYWJvdmUgJiBiZWxvdyB0aGUgbGFiZWwgaW4gcGl4ZWxzXG4gICAgICBiYWNrZHJvcFBhZGRpbmc6IDIsXG5cbiAgICAgIC8vIEJvb2xlYW4gLSBpZiB0cnVlLCBzaG93IHBvaW50IGxhYmVsc1xuICAgICAgZGlzcGxheTogdHJ1ZSxcblxuICAgICAgLy8gTnVtYmVyIC0gUG9pbnQgbGFiZWwgZm9udCBzaXplIGluIHBpeGVsc1xuICAgICAgZm9udDoge1xuICAgICAgICBzaXplOiAxMFxuICAgICAgfSxcblxuICAgICAgLy8gRnVuY3Rpb24gLSBVc2VkIHRvIGNvbnZlcnQgcG9pbnQgbGFiZWxzXG4gICAgICBjYWxsYmFjayhsYWJlbCkge1xuICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICB9LFxuXG4gICAgICAvLyBOdW1iZXIgLSBBZGRpdGlvbmwgcGFkZGluZyBiZXR3ZWVuIHNjYWxlIGFuZCBwb2ludExhYmVsXG4gICAgICBwYWRkaW5nOiA1LFxuXG4gICAgICAvLyBCb29sZWFuIC0gaWYgdHJ1ZSwgY2VudGVyIHBvaW50IGxhYmVscyB0byBzbGljZXMgaW4gcG9sYXIgY2hhcnRcbiAgICAgIGNlbnRlclBvaW50TGFiZWxzOiBmYWxzZVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICAnYW5nbGVMaW5lcy5jb2xvcic6ICdib3JkZXJDb2xvcicsXG4gICAgJ3BvaW50TGFiZWxzLmNvbG9yJzogJ2NvbG9yJyxcbiAgICAndGlja3MuY29sb3InOiAnY29sb3InXG4gIH07XG5cbiAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgIGFuZ2xlTGluZXM6IHtcbiAgICAgIF9mYWxsYmFjazogJ2dyaWQnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKGNmZyk7XG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnhDZW50ZXIgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy55Q2VudGVyID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuZHJhd2luZ0FyZWEgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLl9wb2ludExhYmVscyA9IFtdO1xuICAgIHRoaXMuX3BvaW50TGFiZWxJdGVtcyA9IFtdO1xuICB9XG5cbiAgc2V0RGltZW5zaW9ucygpIHtcbiAgICAvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLl9wYWRkaW5nID0gdG9QYWRkaW5nKGdldFRpY2tCYWNrZHJvcEhlaWdodCh0aGlzLm9wdGlvbnMpIC8gMik7XG4gICAgY29uc3QgdyA9IHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoIC0gcGFkZGluZy53aWR0aDtcbiAgICBjb25zdCBoID0gdGhpcy5oZWlnaHQgPSB0aGlzLm1heEhlaWdodCAtIHBhZGRpbmcuaGVpZ2h0O1xuICAgIHRoaXMueENlbnRlciA9IE1hdGguZmxvb3IodGhpcy5sZWZ0ICsgdyAvIDIgKyBwYWRkaW5nLmxlZnQpO1xuICAgIHRoaXMueUNlbnRlciA9IE1hdGguZmxvb3IodGhpcy50b3AgKyBoIC8gMiArIHBhZGRpbmcudG9wKTtcbiAgICB0aGlzLmRyYXdpbmdBcmVhID0gTWF0aC5mbG9vcihNYXRoLm1pbih3LCBoKSAvIDIpO1xuICB9XG5cbiAgZGV0ZXJtaW5lRGF0YUxpbWl0cygpIHtcbiAgICBjb25zdCB7bWluLCBtYXh9ID0gdGhpcy5nZXRNaW5NYXgoZmFsc2UpO1xuXG4gICAgdGhpcy5taW4gPSBpc0Zpbml0ZShtaW4pICYmICFpc05hTihtaW4pID8gbWluIDogMDtcbiAgICB0aGlzLm1heCA9IGlzRmluaXRlKG1heCkgJiYgIWlzTmFOKG1heCkgPyBtYXggOiAwO1xuXG4gICAgLy8gQ29tbW9uIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gaGFuZGxlIG1pbiwgbWF4LCBiZWdpbkF0WmVyb1xuICAgIHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2tzIGJhc2VkIG9uIHRoZSBzY2FsZSBkaW1lbnNpb25cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgY29tcHV0ZVRpY2tMaW1pdCgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuZHJhd2luZ0FyZWEgLyBnZXRUaWNrQmFja2Ryb3BIZWlnaHQodGhpcy5vcHRpb25zKSk7XG4gIH1cblxuICBnZW5lcmF0ZVRpY2tMYWJlbHModGlja3MpIHtcbiAgICBMaW5lYXJTY2FsZUJhc2UucHJvdG90eXBlLmdlbmVyYXRlVGlja0xhYmVscy5jYWxsKHRoaXMsIHRpY2tzKTtcblxuICAgIC8vIFBvaW50IGxhYmVsc1xuICAgIHRoaXMuX3BvaW50TGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKVxuICAgICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gY2FsbENhbGxiYWNrKHRoaXMub3B0aW9ucy5wb2ludExhYmVscy5jYWxsYmFjaywgW3ZhbHVlLCBpbmRleF0sIHRoaXMpO1xuICAgICAgICByZXR1cm4gbGFiZWwgfHwgbGFiZWwgPT09IDAgPyBsYWJlbCA6ICcnO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYsIGkpID0+IHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkpO1xuICB9XG5cbiAgZml0KCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAob3B0cy5kaXNwbGF5ICYmIG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xuICAgICAgZml0V2l0aFBvaW50TGFiZWxzKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldENlbnRlclBvaW50KDAsIDAsIDAsIDApO1xuICAgIH1cbiAgfVxuXG4gIHNldENlbnRlclBvaW50KGxlZnRNb3ZlbWVudCwgcmlnaHRNb3ZlbWVudCwgdG9wTW92ZW1lbnQsIGJvdHRvbU1vdmVtZW50KSB7XG4gICAgdGhpcy54Q2VudGVyICs9IE1hdGguZmxvb3IoKGxlZnRNb3ZlbWVudCAtIHJpZ2h0TW92ZW1lbnQpIC8gMik7XG4gICAgdGhpcy55Q2VudGVyICs9IE1hdGguZmxvb3IoKHRvcE1vdmVtZW50IC0gYm90dG9tTW92ZW1lbnQpIC8gMik7XG4gICAgdGhpcy5kcmF3aW5nQXJlYSAtPSBNYXRoLm1pbih0aGlzLmRyYXdpbmdBcmVhIC8gMiwgTWF0aC5tYXgobGVmdE1vdmVtZW50LCByaWdodE1vdmVtZW50LCB0b3BNb3ZlbWVudCwgYm90dG9tTW92ZW1lbnQpKTtcbiAgfVxuXG4gIGdldEluZGV4QW5nbGUoaW5kZXgpIHtcbiAgICBjb25zdCBhbmdsZU11bHRpcGxpZXIgPSBUQVUgLyAodGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSB0aGlzLm9wdGlvbnMuc3RhcnRBbmdsZSB8fCAwO1xuXG4gICAgcmV0dXJuIF9ub3JtYWxpemVBbmdsZShpbmRleCAqIGFuZ2xlTXVsdGlwbGllciArIHRvUmFkaWFucyhzdGFydEFuZ2xlKSk7XG4gIH1cblxuICBnZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG5cbiAgICAvLyBUYWtlIGludG8gYWNjb3VudCBoYWxmIGZvbnQgc2l6ZSArIHRoZSB5UGFkZGluZyBvZiB0aGUgdG9wIHZhbHVlXG4gICAgY29uc3Qgc2NhbGluZ0ZhY3RvciA9IHRoaXMuZHJhd2luZ0FyZWEgLyAodGhpcy5tYXggLSB0aGlzLm1pbik7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICByZXR1cm4gKHRoaXMubWF4IC0gdmFsdWUpICogc2NhbGluZ0ZhY3RvcjtcbiAgICB9XG4gICAgcmV0dXJuICh2YWx1ZSAtIHRoaXMubWluKSAqIHNjYWxpbmdGYWN0b3I7XG4gIH1cblxuICBnZXRWYWx1ZUZvckRpc3RhbmNlRnJvbUNlbnRlcihkaXN0YW5jZSkge1xuICAgIGlmIChpc051bGxPclVuZGVmKGRpc3RhbmNlKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZWREaXN0YW5jZSA9IGRpc3RhbmNlIC8gKHRoaXMuZHJhd2luZ0FyZWEgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpO1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZSA/IHRoaXMubWF4IC0gc2NhbGVkRGlzdGFuY2UgOiB0aGlzLm1pbiArIHNjYWxlZERpc3RhbmNlO1xuICB9XG5cbiAgZ2V0UG9pbnRMYWJlbENvbnRleHQoaW5kZXgpIHtcbiAgICBjb25zdCBwb2ludExhYmVscyA9IHRoaXMuX3BvaW50TGFiZWxzIHx8IFtdO1xuXG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwb2ludExhYmVscy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBvaW50TGFiZWwgPSBwb2ludExhYmVsc1tpbmRleF07XG4gICAgICByZXR1cm4gY3JlYXRlUG9pbnRMYWJlbENvbnRleHQodGhpcy5nZXRDb250ZXh0KCksIGluZGV4LCBwb2ludExhYmVsKTtcbiAgICB9XG4gIH1cblxuICBnZXRQb2ludFBvc2l0aW9uKGluZGV4LCBkaXN0YW5jZUZyb21DZW50ZXIsIGFkZGl0aW9uYWxBbmdsZSA9IDApIHtcbiAgICBjb25zdCBhbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZShpbmRleCkgLSBIQUxGX1BJICsgYWRkaXRpb25hbEFuZ2xlO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBNYXRoLmNvcyhhbmdsZSkgKiBkaXN0YW5jZUZyb21DZW50ZXIgKyB0aGlzLnhDZW50ZXIsXG4gICAgICB5OiBNYXRoLnNpbihhbmdsZSkgKiBkaXN0YW5jZUZyb21DZW50ZXIgKyB0aGlzLnlDZW50ZXIsXG4gICAgICBhbmdsZVxuICAgIH07XG4gIH1cblxuICBnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpbmRleCwgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0QmFzZVBvc2l0aW9uKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGluZGV4IHx8IDAsIHRoaXMuZ2V0QmFzZVZhbHVlKCkpO1xuICB9XG5cbiAgZ2V0UG9pbnRMYWJlbFBvc2l0aW9uKGluZGV4KSB7XG4gICAgY29uc3Qge2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbX0gPSB0aGlzLl9wb2ludExhYmVsSXRlbXNbaW5kZXhdO1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3QmFja2dyb3VuZCgpIHtcbiAgICBjb25zdCB7YmFja2dyb3VuZENvbG9yLCBncmlkOiB7Y2lyY3VsYXJ9fSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBwYXRoUmFkaXVzTGluZSh0aGlzLCB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHRoaXMuX2VuZFZhbHVlKSwgY2lyY3VsYXIsIHRoaXMuX3BvaW50TGFiZWxzLmxlbmd0aCk7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdHcmlkKCkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qge2FuZ2xlTGluZXMsIGdyaWQsIGJvcmRlcn0gPSBvcHRzO1xuICAgIGNvbnN0IGxhYmVsQ291bnQgPSB0aGlzLl9wb2ludExhYmVscy5sZW5ndGg7XG5cbiAgICBsZXQgaSwgb2Zmc2V0LCBwb3NpdGlvbjtcblxuICAgIGlmIChvcHRzLnBvaW50TGFiZWxzLmRpc3BsYXkpIHtcbiAgICAgIGRyYXdQb2ludExhYmVscyh0aGlzLCBsYWJlbENvdW50KTtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZC5kaXNwbGF5KSB7XG4gICAgICB0aGlzLnRpY2tzLmZvckVhY2goKHRpY2ssIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGljay52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChpbmRleCk7XG4gICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXggPSBncmlkLnNldENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXhCb3JkZXIgPSBib3JkZXIuc2V0Q29udGV4dChjb250ZXh0KTtcblxuICAgICAgICAgIGRyYXdSYWRpdXNMaW5lKHRoaXMsIG9wdHNBdEluZGV4LCBvZmZzZXQsIGxhYmVsQ291bnQsIG9wdHNBdEluZGV4Qm9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFuZ2xlTGluZXMuZGlzcGxheSkge1xuICAgICAgY3R4LnNhdmUoKTtcblxuICAgICAgZm9yIChpID0gbGFiZWxDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gYW5nbGVMaW5lcy5zZXRDb250ZXh0KHRoaXMuZ2V0UG9pbnRMYWJlbENvbnRleHQoaSkpO1xuICAgICAgICBjb25zdCB7Y29sb3IsIGxpbmVXaWR0aH0gPSBvcHRzQXRJbmRleDtcblxuICAgICAgICBpZiAoIWxpbmVXaWR0aCB8fCAhY29sb3IpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG4gICAgICAgIGN0eC5zZXRMaW5lRGFzaChvcHRzQXRJbmRleC5ib3JkZXJEYXNoKTtcbiAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gb3B0c0F0SW5kZXguYm9yZGVyRGFzaE9mZnNldDtcblxuICAgICAgICBvZmZzZXQgPSB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKG9wdHMudGlja3MucmV2ZXJzZSA/IHRoaXMubWluIDogdGhpcy5tYXgpO1xuICAgICAgICBwb3NpdGlvbiA9IHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpLCBvZmZzZXQpO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8odGhpcy54Q2VudGVyLCB0aGlzLnlDZW50ZXIpO1xuICAgICAgICBjdHgubGluZVRvKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICB9XG5cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdCb3JkZXIoKSB7fVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3TGFiZWxzKCkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXG4gICAgaWYgKCF0aWNrT3B0cy5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRBbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZSgwKTtcbiAgICBsZXQgb2Zmc2V0LCB3aWR0aDtcblxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsIHRoaXMueUNlbnRlcik7XG4gICAgY3R4LnJvdGF0ZShzdGFydEFuZ2xlKTtcbiAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXG4gICAgdGhpcy50aWNrcy5mb3JFYWNoKCh0aWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSAwICYmICFvcHRzLnJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRzQXRJbmRleCA9IHRpY2tPcHRzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGluZGV4KSk7XG4gICAgICBjb25zdCB0aWNrRm9udCA9IHRvRm9udChvcHRzQXRJbmRleC5mb250KTtcbiAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy50aWNrc1tpbmRleF0udmFsdWUpO1xuXG4gICAgICBpZiAob3B0c0F0SW5kZXguc2hvd0xhYmVsQmFja2Ryb3ApIHtcbiAgICAgICAgY3R4LmZvbnQgPSB0aWNrRm9udC5zdHJpbmc7XG4gICAgICAgIHdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KHRpY2subGFiZWwpLndpZHRoO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0c0F0SW5kZXguYmFja2Ryb3BDb2xvcjtcblxuICAgICAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKG9wdHNBdEluZGV4LmJhY2tkcm9wUGFkZGluZyk7XG4gICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAtd2lkdGggLyAyIC0gcGFkZGluZy5sZWZ0LFxuICAgICAgICAgIC1vZmZzZXQgLSB0aWNrRm9udC5zaXplIC8gMiAtIHBhZGRpbmcudG9wLFxuICAgICAgICAgIHdpZHRoICsgcGFkZGluZy53aWR0aCxcbiAgICAgICAgICB0aWNrRm9udC5zaXplICsgcGFkZGluZy5oZWlnaHRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyVGV4dChjdHgsIHRpY2subGFiZWwsIDAsIC1vZmZzZXQsIHRpY2tGb250LCB7XG4gICAgICAgIGNvbG9yOiBvcHRzQXRJbmRleC5jb2xvcixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3VGl0bGUoKSB7fVxufVxuIiwgImltcG9ydCBhZGFwdGVycyBmcm9tICcuLi9jb3JlL2NvcmUuYWRhcHRlcnMuanMnO1xuaW1wb3J0IHtjYWxsYmFjayBhcyBjYWxsLCBpc0Zpbml0ZSwgaXNOdWxsT3JVbmRlZiwgbWVyZ2VJZiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7dG9SYWRpYW5zLCBpc051bWJlciwgX2xpbWl0VmFsdWV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCBTY2FsZSBmcm9tICcuLi9jb3JlL2NvcmUuc2NhbGUuanMnO1xuaW1wb3J0IHtfYXJyYXlVbmlxdWUsIF9maWx0ZXJCZXR3ZWVuLCBfbG9va3VwfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29sbGVjdGlvbi5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5hZGFwdGVycy5qcycpLlRpbWVVbml0IH0gVW5pdFxuICogQHR5cGVkZWYge3tjb21tb246IGJvb2xlYW4sIHNpemU6IG51bWJlciwgc3RlcHM/OiBudW1iZXJ9fSBJbnRlcnZhbFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5hZGFwdGVycy5qcycpLkRhdGVBZGFwdGVyIH0gRGF0ZUFkYXB0ZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtPYmplY3Q8VW5pdCwgSW50ZXJ2YWw+fVxuICovXG5jb25zdCBJTlRFUlZBTFMgPSB7XG4gIG1pbGxpc2Vjb25kOiB7Y29tbW9uOiB0cnVlLCBzaXplOiAxLCBzdGVwczogMTAwMH0sXG4gIHNlY29uZDoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMTAwMCwgc3RlcHM6IDYwfSxcbiAgbWludXRlOiB7Y29tbW9uOiB0cnVlLCBzaXplOiA2MDAwMCwgc3RlcHM6IDYwfSxcbiAgaG91cjoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMzYwMDAwMCwgc3RlcHM6IDI0fSxcbiAgZGF5OiB7Y29tbW9uOiB0cnVlLCBzaXplOiA4NjQwMDAwMCwgc3RlcHM6IDMwfSxcbiAgd2Vlazoge2NvbW1vbjogZmFsc2UsIHNpemU6IDYwNDgwMDAwMCwgc3RlcHM6IDR9LFxuICBtb250aDoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMi42MjhlOSwgc3RlcHM6IDEyfSxcbiAgcXVhcnRlcjoge2NvbW1vbjogZmFsc2UsIHNpemU6IDcuODg0ZTksIHN0ZXBzOiA0fSxcbiAgeWVhcjoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMy4xNTRlMTB9XG59O1xuXG4vKipcbiAqIEB0eXBlIHtVbml0W119XG4gKi9cbmNvbnN0IFVOSVRTID0gLyoqIEB0eXBlIFVuaXRbXSAqLyAvKiAjX19QVVJFX18gKi8gKE9iamVjdC5rZXlzKElOVEVSVkFMUykpO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYlxuICovXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYikge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUaW1lU2NhbGV9IHNjYWxlXG4gKiBAcGFyYW0geyp9IGlucHV0XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHNjYWxlLCBpbnB1dCkge1xuICBpZiAoaXNOdWxsT3JVbmRlZihpbnB1dCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBzY2FsZS5fYWRhcHRlcjtcbiAgY29uc3Qge3BhcnNlciwgcm91bmQsIGlzb1dlZWtkYXl9ID0gc2NhbGUuX3BhcnNlT3B0cztcbiAgbGV0IHZhbHVlID0gaW5wdXQ7XG5cbiAgaWYgKHR5cGVvZiBwYXJzZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YWx1ZSA9IHBhcnNlcih2YWx1ZSk7XG4gIH1cblxuICAvLyBPbmx5IHBhcnNlIGlmIGl0cyBub3QgYSB0aW1lc3RhbXAgYWxyZWFkeVxuICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgIHZhbHVlID0gdHlwZW9mIHBhcnNlciA9PT0gJ3N0cmluZydcbiAgICAgID8gYWRhcHRlci5wYXJzZSh2YWx1ZSwgLyoqIEB0eXBlIHtVbml0fSAqLyAocGFyc2VyKSlcbiAgICAgIDogYWRhcHRlci5wYXJzZSh2YWx1ZSk7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChyb3VuZCkge1xuICAgIHZhbHVlID0gcm91bmQgPT09ICd3ZWVrJyAmJiAoaXNOdW1iZXIoaXNvV2Vla2RheSkgfHwgaXNvV2Vla2RheSA9PT0gdHJ1ZSlcbiAgICAgID8gYWRhcHRlci5zdGFydE9mKHZhbHVlLCAnaXNvV2VlaycsIGlzb1dlZWtkYXkpXG4gICAgICA6IGFkYXB0ZXIuc3RhcnRPZih2YWx1ZSwgcm91bmQpO1xuICB9XG5cbiAgcmV0dXJuICt2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaWd1cmVzIG91dCB3aGF0IHVuaXQgcmVzdWx0cyBpbiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXV0by1nZW5lcmF0ZWQgdGlja3NcbiAqIEBwYXJhbSB7VW5pdH0gbWluVW5pdFxuICogQHBhcmFtIHtudW1iZXJ9IG1pblxuICogQHBhcmFtIHtudW1iZXJ9IG1heFxuICogQHBhcmFtIHtudW1iZXJ9IGNhcGFjaXR5XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZVVuaXRGb3JBdXRvVGlja3MobWluVW5pdCwgbWluLCBtYXgsIGNhcGFjaXR5KSB7XG4gIGNvbnN0IGlsZW4gPSBVTklUUy5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGkgPCBpbGVuIC0gMTsgKytpKSB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBJTlRFUlZBTFNbVU5JVFNbaV1dO1xuICAgIGNvbnN0IGZhY3RvciA9IGludGVydmFsLnN0ZXBzID8gaW50ZXJ2YWwuc3RlcHMgOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuICAgIGlmIChpbnRlcnZhbC5jb21tb24gJiYgTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKGZhY3RvciAqIGludGVydmFsLnNpemUpKSA8PSBjYXBhY2l0eSkge1xuICAgICAgcmV0dXJuIFVOSVRTW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBVTklUU1tpbGVuIC0gMV07XG59XG5cbi8qKlxuICogRmlndXJlcyBvdXQgd2hhdCB1bml0IHRvIGZvcm1hdCBhIHNldCBvZiB0aWNrcyB3aXRoXG4gKiBAcGFyYW0ge1RpbWVTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1UaWNrc1xuICogQHBhcmFtIHtVbml0fSBtaW5Vbml0XG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcmV0dXJuIHtVbml0fVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVVbml0Rm9yRm9ybWF0dGluZyhzY2FsZSwgbnVtVGlja3MsIG1pblVuaXQsIG1pbiwgbWF4KSB7XG4gIGZvciAobGV0IGkgPSBVTklUUy5sZW5ndGggLSAxOyBpID49IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGktLSkge1xuICAgIGNvbnN0IHVuaXQgPSBVTklUU1tpXTtcbiAgICBpZiAoSU5URVJWQUxTW3VuaXRdLmNvbW1vbiAmJiBzY2FsZS5fYWRhcHRlci5kaWZmKG1heCwgbWluLCB1bml0KSA+PSBudW1UaWNrcyAtIDEpIHtcbiAgICAgIHJldHVybiB1bml0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBVTklUU1ttaW5Vbml0ID8gVU5JVFMuaW5kZXhPZihtaW5Vbml0KSA6IDBdO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7VW5pdH0gdW5pdFxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVNYWpvclVuaXQodW5pdCkge1xuICBmb3IgKGxldCBpID0gVU5JVFMuaW5kZXhPZih1bml0KSArIDEsIGlsZW4gPSBVTklUUy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBpZiAoSU5URVJWQUxTW1VOSVRTW2ldXS5jb21tb24pIHtcbiAgICAgIHJldHVybiBVTklUU1tpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gdGlja3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lXG4gKiBAcGFyYW0ge251bWJlcltdfSBbdGltZXN0YW1wc10gLSBpZiBkZWZpbmVkLCBzbmFwIHRvIHRoZXNlIHRpbWVzdGFtcHNcbiAqL1xuZnVuY3Rpb24gYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcykge1xuICBpZiAoIXRpbWVzdGFtcHMpIHtcbiAgICB0aWNrc1t0aW1lXSA9IHRydWU7XG4gIH0gZWxzZSBpZiAodGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICBjb25zdCB7bG8sIGhpfSA9IF9sb29rdXAodGltZXN0YW1wcywgdGltZSk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGltZXN0YW1wc1tsb10gPj0gdGltZSA/IHRpbWVzdGFtcHNbbG9dIDogdGltZXN0YW1wc1toaV07XG4gICAgdGlja3NbdGltZXN0YW1wXSA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RpbWVTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7b2JqZWN0W119IHRpY2tzXG4gKiBAcGFyYW0ge29iamVjdH0gbWFwXG4gKiBAcGFyYW0ge1VuaXR9IG1ham9yVW5pdFxuICogQHJldHVybiB7b2JqZWN0W119XG4gKi9cbmZ1bmN0aW9uIHNldE1ham9yVGlja3Moc2NhbGUsIHRpY2tzLCBtYXAsIG1ham9yVW5pdCkge1xuICBjb25zdCBhZGFwdGVyID0gc2NhbGUuX2FkYXB0ZXI7XG4gIGNvbnN0IGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZih0aWNrc1swXS52YWx1ZSwgbWFqb3JVbml0KTtcbiAgY29uc3QgbGFzdCA9IHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlO1xuICBsZXQgbWFqb3IsIGluZGV4O1xuXG4gIGZvciAobWFqb3IgPSBmaXJzdDsgbWFqb3IgPD0gbGFzdDsgbWFqb3IgPSArYWRhcHRlci5hZGQobWFqb3IsIDEsIG1ham9yVW5pdCkpIHtcbiAgICBpbmRleCA9IG1hcFttYWpvcl07XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRpY2tzW2luZGV4XS5tYWpvciA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aWNrcztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RpbWVTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyW119IHZhbHVlc1xuICogQHBhcmFtIHtVbml0fHVuZGVmaW5lZH0gW21ham9yVW5pdF1cbiAqIEByZXR1cm4ge29iamVjdFtdfVxuICovXG5mdW5jdGlvbiB0aWNrc0Zyb21UaW1lc3RhbXBzKHNjYWxlLCB2YWx1ZXMsIG1ham9yVW5pdCkge1xuICBjb25zdCB0aWNrcyA9IFtdO1xuICAvKiogQHR5cGUge09iamVjdDxudW1iZXIsb2JqZWN0Pn0gKi9cbiAgY29uc3QgbWFwID0ge307XG4gIGNvbnN0IGlsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICBsZXQgaSwgdmFsdWU7XG5cbiAgZm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xuICAgIHZhbHVlID0gdmFsdWVzW2ldO1xuICAgIG1hcFt2YWx1ZV0gPSBpO1xuXG4gICAgdGlja3MucHVzaCh7XG4gICAgICB2YWx1ZSxcbiAgICAgIG1ham9yOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2Ugc2V0IHRoZSBtYWpvciB0aWNrcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSBjYWxsaW5nIHN0YXJ0T2YgZm9yIGV2ZXJ5IHRpY2tcbiAgLy8gaXMgZXhwZW5zaXZlIHdoZW4gdGhlcmUgaXMgYSBsYXJnZSBudW1iZXIgb2YgdGlja3NcbiAgcmV0dXJuIChpbGVuID09PSAwIHx8ICFtYWpvclVuaXQpID8gdGlja3MgOiBzZXRNYWpvclRpY2tzKHNjYWxlLCB0aWNrcywgbWFwLCBtYWpvclVuaXQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lU2NhbGUgZXh0ZW5kcyBTY2FsZSB7XG5cbiAgc3RhdGljIGlkID0gJ3RpbWUnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC8qKlxuICAgICAqIFNjYWxlIGJvdW5kYXJ5IHN0cmF0ZWd5IChieXBhc3NlZCBieSBtaW4vbWF4IHRpbWUgb3B0aW9ucylcbiAgICAgKiAtIGBkYXRhYDogbWFrZSBzdXJlIGRhdGEgYXJlIGZ1bGx5IHZpc2libGUsIHRpY2tzIG91dHNpZGUgYXJlIHJlbW92ZWRcbiAgICAgKiAtIGB0aWNrc2A6IG1ha2Ugc3VyZSB0aWNrcyBhcmUgZnVsbHkgdmlzaWJsZSwgZGF0YSBvdXRzaWRlIGFyZSB0cnVuY2F0ZWRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvNDU1NlxuICAgICAqIEBzaW5jZSAyLjcuMFxuICAgICAqL1xuICAgIGJvdW5kczogJ2RhdGEnLFxuXG4gICAgYWRhcHRlcnM6IHt9LFxuICAgIHRpbWU6IHtcbiAgICAgIHBhcnNlcjogZmFsc2UsIC8vIGZhbHNlID09IGEgcGF0dGVybiBzdHJpbmcgZnJvbSBvciBhIGN1c3RvbSBjYWxsYmFjayB0aGF0IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIHRpbWVzdGFtcFxuICAgICAgdW5pdDogZmFsc2UsIC8vIGZhbHNlID09IGF1dG9tYXRpYyBvciBvdmVycmlkZSB3aXRoIHdlZWssIG1vbnRoLCB5ZWFyLCBldGMuXG4gICAgICByb3VuZDogZmFsc2UsIC8vIG5vbmUsIG9yIG92ZXJyaWRlIHdpdGggd2VlaywgbW9udGgsIHllYXIsIGV0Yy5cbiAgICAgIGlzb1dlZWtkYXk6IGZhbHNlLCAvLyBvdmVycmlkZSB3ZWVrIHN0YXJ0IGRheVxuICAgICAgbWluVW5pdDogJ21pbGxpc2Vjb25kJyxcbiAgICAgIGRpc3BsYXlGb3JtYXRzOiB7fVxuICAgIH0sXG4gICAgdGlja3M6IHtcbiAgICAgIC8qKlxuICAgICAgICogVGlja3MgZ2VuZXJhdGlvbiBpbnB1dCB2YWx1ZXM6XG4gICAgICAgKiAtICdhdXRvJzogZ2VuZXJhdGVzIFwib3B0aW1hbFwiIHRpY2tzIGJhc2VkIG9uIHNjYWxlIHNpemUgYW5kIHRpbWUgb3B0aW9ucy5cbiAgICAgICAqIC0gJ2RhdGEnOiBnZW5lcmF0ZXMgdGlja3MgZnJvbSBkYXRhIChpbmNsdWRpbmcgbGFiZWxzIGZyb20gZGF0YSB7dHx4fHl9IG9iamVjdHMpLlxuICAgICAgICogLSAnbGFiZWxzJzogZ2VuZXJhdGVzIHRpY2tzIGZyb20gdXNlciBnaXZlbiBgZGF0YS5sYWJlbHNgIHZhbHVlcyBPTkxZLlxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1MDdcbiAgICAgICAqIEBzaW5jZSAyLjcuMFxuICAgICAgICovXG4gICAgICBzb3VyY2U6ICdhdXRvJyxcblxuICAgICAgY2FsbGJhY2s6IGZhbHNlLFxuXG4gICAgICBtYWpvcjoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcblx0ICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG5cdCAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIC8qKiBAdHlwZSB7e2RhdGE6IG51bWJlcltdLCBsYWJlbHM6IG51bWJlcltdLCBhbGw6IG51bWJlcltdfX0gKi9cbiAgICB0aGlzLl9jYWNoZSA9IHtcbiAgICAgIGRhdGE6IFtdLFxuICAgICAgbGFiZWxzOiBbXSxcbiAgICAgIGFsbDogW11cbiAgICB9O1xuXG4gICAgLyoqIEB0eXBlIHtVbml0fSAqL1xuICAgIHRoaXMuX3VuaXQgPSAnZGF5JztcbiAgICAvKiogQHR5cGUge1VuaXQ9fSAqL1xuICAgIHRoaXMuX21ham9yVW5pdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vZmZzZXRzID0ge307XG4gICAgdGhpcy5fbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BhcnNlT3B0cyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluaXQoc2NhbGVPcHRzLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCB0aW1lID0gc2NhbGVPcHRzLnRpbWUgfHwgKHNjYWxlT3B0cy50aW1lID0ge30pO1xuICAgIC8qKiBAdHlwZSB7RGF0ZUFkYXB0ZXJ9ICovXG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXIgPSBuZXcgYWRhcHRlcnMuX2RhdGUoc2NhbGVPcHRzLmFkYXB0ZXJzLmRhdGUpO1xuXG4gICAgYWRhcHRlci5pbml0KG9wdHMpO1xuXG4gICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eTogYmVmb3JlIGludHJvZHVjaW5nIGFkYXB0ZXIsIGBkaXNwbGF5Rm9ybWF0c2Agd2FzXG4gICAgLy8gc3VwcG9zZWQgdG8gY29udGFpbiAqYWxsKiB1bml0L3N0cmluZyBwYWlycyBidXQgdGhpcyBjYW4ndCBiZSByZXNvbHZlZFxuICAgIC8vIHdoZW4gbG9hZGluZyB0aGUgc2NhbGUgKGFkYXB0ZXJzIGFyZSBsb2FkZWQgYWZ0ZXJ3YXJkKSwgc28gbGV0J3MgcG9wdWxhdGVcbiAgICAvLyBtaXNzaW5nIGZvcm1hdHMgb24gdXBkYXRlXG4gICAgbWVyZ2VJZih0aW1lLmRpc3BsYXlGb3JtYXRzLCBhZGFwdGVyLmZvcm1hdHMoKSk7XG5cbiAgICB0aGlzLl9wYXJzZU9wdHMgPSB7XG4gICAgICBwYXJzZXI6IHRpbWUucGFyc2VyLFxuICAgICAgcm91bmQ6IHRpbWUucm91bmQsXG4gICAgICBpc29XZWVrZGF5OiB0aW1lLmlzb1dlZWtkYXlcbiAgICB9O1xuXG4gICAgc3VwZXIuaW5pdChzY2FsZU9wdHMpO1xuXG4gICAgdGhpcy5fbm9ybWFsaXplZCA9IG9wdHMubm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0geyp9IHJhd1xuXHQgKiBAcGFyYW0ge251bWJlcj99IFtpbmRleF1cblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cbiAgcGFyc2UocmF3LCBpbmRleCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlKHRoaXMsIHJhdyk7XG4gIH1cblxuICBiZWZvcmVMYXlvdXQoKSB7XG4gICAgc3VwZXIuYmVmb3JlTGF5b3V0KCk7XG4gICAgdGhpcy5fY2FjaGUgPSB7XG4gICAgICBkYXRhOiBbXSxcbiAgICAgIGxhYmVsczogW10sXG4gICAgICBhbGw6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcjtcbiAgICBjb25zdCB1bml0ID0gb3B0aW9ucy50aW1lLnVuaXQgfHwgJ2RheSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG5cbiAgICAvKipcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gYm91bmRzXG5cdFx0ICovXG4gICAgZnVuY3Rpb24gX2FwcGx5Qm91bmRzKGJvdW5kcykge1xuICAgICAgaWYgKCFtaW5EZWZpbmVkICYmICFpc05hTihib3VuZHMubWluKSkge1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGJvdW5kcy5taW4pO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXhEZWZpbmVkICYmICFpc05hTihib3VuZHMubWF4KSkge1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGJvdW5kcy5tYXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgdXNlciBwcm92aWRlZCBgbWluYCBhbmQgYG1heGAgbGFiZWxzIC8gZGF0YSBib3VuZHMgY2FuIGJlIGlnbm9yZWRcbiAgICBpZiAoIW1pbkRlZmluZWQgfHwgIW1heERlZmluZWQpIHtcbiAgICAgIC8vIExhYmVscyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQsIHdoZW4gdXNlciBkaWQgbm90IGZvcmNlIGJvdW5kc1xuICAgICAgX2FwcGx5Qm91bmRzKHRoaXMuX2dldExhYmVsQm91bmRzKCkpO1xuXG4gICAgICAvLyBJZiBgYm91bmRzYCBpcyBgJ3RpY2tzJ2AgYW5kIGB0aWNrcy5zb3VyY2VgIGlzIGAnbGFiZWxzJ2AsXG4gICAgICAvLyBkYXRhIGJvdW5kcyBhcmUgaWdub3JlZCAoYW5kIGRvbid0IG5lZWQgdG8gYmUgZGV0ZXJtaW5lZClcbiAgICAgIGlmIChvcHRpb25zLmJvdW5kcyAhPT0gJ3RpY2tzJyB8fCBvcHRpb25zLnRpY2tzLnNvdXJjZSAhPT0gJ2xhYmVscycpIHtcbiAgICAgICAgX2FwcGx5Qm91bmRzKHRoaXMuZ2V0TWluTWF4KGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWluID0gaXNGaW5pdGUobWluKSAmJiAhaXNOYU4obWluKSA/IG1pbiA6ICthZGFwdGVyLnN0YXJ0T2YoRGF0ZS5ub3coKSwgdW5pdCk7XG4gICAgbWF4ID0gaXNGaW5pdGUobWF4KSAmJiAhaXNOYU4obWF4KSA/IG1heCA6ICthZGFwdGVyLmVuZE9mKERhdGUubm93KCksIHVuaXQpICsgMTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG1heCBpcyBzdHJpY3RseSBoaWdoZXIgdGhhbiBtaW4gKHJlcXVpcmVkIGJ5IHRoZSB0aW1lc2VyaWVzIGxvb2t1cCB0YWJsZSlcbiAgICB0aGlzLm1pbiA9IE1hdGgubWluKG1pbiwgbWF4IC0gMSk7XG4gICAgdGhpcy5tYXggPSBNYXRoLm1heChtaW4gKyAxLCBtYXgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0TGFiZWxCb3VuZHMoKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5nZXRMYWJlbFRpbWVzdGFtcHMoKTtcbiAgICBsZXQgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGxldCBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgICBpZiAoYXJyLmxlbmd0aCkge1xuICAgICAgbWluID0gYXJyWzBdO1xuICAgICAgbWF4ID0gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIHttaW4sIG1heH07XG4gIH1cblxuICAvKipcblx0ICogQHJldHVybiB7b2JqZWN0W119XG5cdCAqL1xuICBidWlsZFRpY2tzKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IHRpbWVzdGFtcHMgPSB0aWNrT3B0cy5zb3VyY2UgPT09ICdsYWJlbHMnID8gdGhpcy5nZXRMYWJlbFRpbWVzdGFtcHMoKSA6IHRoaXMuX2dlbmVyYXRlKCk7XG5cbiAgICBpZiAob3B0aW9ucy5ib3VuZHMgPT09ICd0aWNrcycgJiYgdGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWluID0gdGhpcy5fdXNlck1pbiB8fCB0aW1lc3RhbXBzWzBdO1xuICAgICAgdGhpcy5tYXggPSB0aGlzLl91c2VyTWF4IHx8IHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSB0aGlzLm1pbjtcbiAgICBjb25zdCBtYXggPSB0aGlzLm1heDtcblxuICAgIGNvbnN0IHRpY2tzID0gX2ZpbHRlckJldHdlZW4odGltZXN0YW1wcywgbWluLCBtYXgpO1xuXG4gICAgLy8gUFJJVkFURVxuICAgIC8vIGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nIHJlbGllcyBvbiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNvIHdlIGRvbid0IHVzZSBpdCB3aGVuXG4gICAgLy8gYXV0b1NraXAgaXMgZW5hYmxlZCBiZWNhdXNlIHdlIGRvbid0IHlldCBrbm93IHdoYXQgdGhlIGZpbmFsIG51bWJlciBvZiB0aWNrcyB3aWxsIGJlXG4gICAgdGhpcy5fdW5pdCA9IHRpbWVPcHRzLnVuaXQgfHwgKHRpY2tPcHRzLmF1dG9Ta2lwXG4gICAgICA/IGRldGVybWluZVVuaXRGb3JBdXRvVGlja3ModGltZU9wdHMubWluVW5pdCwgdGhpcy5taW4sIHRoaXMubWF4LCB0aGlzLl9nZXRMYWJlbENhcGFjaXR5KG1pbikpXG4gICAgICA6IGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nKHRoaXMsIHRpY2tzLmxlbmd0aCwgdGltZU9wdHMubWluVW5pdCwgdGhpcy5taW4sIHRoaXMubWF4KSk7XG4gICAgdGhpcy5fbWFqb3JVbml0ID0gIXRpY2tPcHRzLm1ham9yLmVuYWJsZWQgfHwgdGhpcy5fdW5pdCA9PT0gJ3llYXInID8gdW5kZWZpbmVkXG4gICAgICA6IGRldGVybWluZU1ham9yVW5pdCh0aGlzLl91bml0KTtcbiAgICB0aGlzLmluaXRPZmZzZXRzKHRpbWVzdGFtcHMpO1xuXG4gICAgaWYgKG9wdGlvbnMucmV2ZXJzZSkge1xuICAgICAgdGlja3MucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWNrc0Zyb21UaW1lc3RhbXBzKHRoaXMsIHRpY2tzLCB0aGlzLl9tYWpvclVuaXQpO1xuICB9XG5cbiAgYWZ0ZXJBdXRvU2tpcCgpIHtcbiAgICAvLyBPZmZzZXRzIGZvciBiYXIgY2hhcnRzIG5lZWQgdG8gYmUgaGFuZGxlZCB3aXRoIHRoZSBhdXRvIHNraXBwZWRcbiAgICAvLyB0aWNrcy4gT25jZSB0aWNrcyBoYXZlIGJlZW4gc2tpcHBlZCwgd2UgcmUtY29tcHV0ZSB0aGUgb2Zmc2V0cy5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9mZnNldEFmdGVyQXV0b3NraXApIHtcbiAgICAgIHRoaXMuaW5pdE9mZnNldHModGhpcy50aWNrcy5tYXAodGljayA9PiArdGljay52YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgZnJvbSBlZGdlcyBpbiB0aGUgZm9ybSBvZiB7c3RhcnQsIGVuZH1cblx0ICogd2hlcmUgZWFjaCB2YWx1ZSBpcyBhIHJlbGF0aXZlIHdpZHRoIHRvIHRoZSBzY2FsZSBhbmQgcmFuZ2VzIGJldHdlZW4gMCBhbmQgMS5cblx0ICogVGhleSBhZGQgZXh0cmEgbWFyZ2lucyBvbiB0aGUgYm90aCBzaWRlcyBieSBzY2FsaW5nIGRvd24gdGhlIG9yaWdpbmFsIHNjYWxlLlxuXHQgKiBPZmZzZXRzIGFyZSBhZGRlZCB3aGVuIHRoZSBgb2Zmc2V0YCBvcHRpb24gaXMgdHJ1ZS5cblx0ICogQHBhcmFtIHtudW1iZXJbXX0gdGltZXN0YW1wc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBpbml0T2Zmc2V0cyh0aW1lc3RhbXBzID0gW10pIHtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBlbmQgPSAwO1xuICAgIGxldCBmaXJzdCwgbGFzdDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMub2Zmc2V0ICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICBmaXJzdCA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbMF0pO1xuICAgICAgaWYgKHRpbWVzdGFtcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHN0YXJ0ID0gMSAtIGZpcnN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSAodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodGltZXN0YW1wc1sxXSkgLSBmaXJzdCkgLyAyO1xuICAgICAgfVxuICAgICAgbGFzdCA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSk7XG4gICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZW5kID0gbGFzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IChsYXN0IC0gdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodGltZXN0YW1wc1t0aW1lc3RhbXBzLmxlbmd0aCAtIDJdKSkgLyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsaW1pdCA9IHRpbWVzdGFtcHMubGVuZ3RoIDwgMyA/IDAuNSA6IDAuMjU7XG4gICAgc3RhcnQgPSBfbGltaXRWYWx1ZShzdGFydCwgMCwgbGltaXQpO1xuICAgIGVuZCA9IF9saW1pdFZhbHVlKGVuZCwgMCwgbGltaXQpO1xuXG4gICAgdGhpcy5fb2Zmc2V0cyA9IHtzdGFydCwgZW5kLCBmYWN0b3I6IDEgLyAoc3RhcnQgKyAxICsgZW5kKX07XG4gIH1cblxuICAvKipcblx0ICogR2VuZXJhdGVzIGEgbWF4aW11bSBvZiBgY2FwYWNpdHlgIHRpbWVzdGFtcHMgYmV0d2VlbiBtaW4gYW5kIG1heCwgcm91bmRlZCB0byB0aGVcblx0ICogYG1pbm9yYCB1bml0IHVzaW5nIHRoZSBnaXZlbiBzY2FsZSB0aW1lIGBvcHRpb25zYC5cblx0ICogSW1wb3J0YW50OiB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIHRpY2tzIG91dHNpZGUgdGhlIG1pbiBhbmQgbWF4IHJhbmdlLCBpdCdzIHRoZVxuXHQgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBjb2RlIHRvIGNsYW1wIHZhbHVlcyBpZiBuZWVkZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2VuZXJhdGUoKSB7XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXI7XG4gICAgY29uc3QgbWluID0gdGhpcy5taW47XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXg7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0aW1lT3B0cyA9IG9wdGlvbnMudGltZTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbWlub3IgPSB0aW1lT3B0cy51bml0IHx8IGRldGVybWluZVVuaXRGb3JBdXRvVGlja3ModGltZU9wdHMubWluVW5pdCwgbWluLCBtYXgsIHRoaXMuX2dldExhYmVsQ2FwYWNpdHkobWluKSk7XG4gICAgY29uc3Qgc3RlcFNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnRpY2tzLnN0ZXBTaXplLCAxKTtcbiAgICBjb25zdCB3ZWVrZGF5ID0gbWlub3IgPT09ICd3ZWVrJyA/IHRpbWVPcHRzLmlzb1dlZWtkYXkgOiBmYWxzZTtcbiAgICBjb25zdCBoYXNXZWVrZGF5ID0gaXNOdW1iZXIod2Vla2RheSkgfHwgd2Vla2RheSA9PT0gdHJ1ZTtcbiAgICBjb25zdCB0aWNrcyA9IHt9O1xuICAgIGxldCBmaXJzdCA9IG1pbjtcbiAgICBsZXQgdGltZSwgY291bnQ7XG5cbiAgICAvLyBGb3IgJ3dlZWsnIHVuaXQsIGhhbmRsZSB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgb3B0aW9uXG4gICAgaWYgKGhhc1dlZWtkYXkpIHtcbiAgICAgIGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZihmaXJzdCwgJ2lzb1dlZWsnLCB3ZWVrZGF5KTtcbiAgICB9XG5cbiAgICAvLyBBbGlnbiBmaXJzdCB0aWNrcyBvbiB1bml0XG4gICAgZmlyc3QgPSArYWRhcHRlci5zdGFydE9mKGZpcnN0LCBoYXNXZWVrZGF5ID8gJ2RheScgOiBtaW5vcik7XG5cbiAgICAvLyBQcmV2ZW50IGJyb3dzZXIgZnJvbSBmcmVlemluZyBpbiBjYXNlIHVzZXIgb3B0aW9ucyByZXF1ZXN0IG1pbGxpb25zIG9mIG1pbGxpc2Vjb25kc1xuICAgIGlmIChhZGFwdGVyLmRpZmYobWF4LCBtaW4sIG1pbm9yKSA+IDEwMDAwMCAqIHN0ZXBTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWluICsgJyBhbmQgJyArIG1heCArICcgYXJlIHRvbyBmYXIgYXBhcnQgd2l0aCBzdGVwU2l6ZSBvZiAnICsgc3RlcFNpemUgKyAnICcgKyBtaW5vcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wcyA9IG9wdGlvbnMudGlja3Muc291cmNlID09PSAnZGF0YScgJiYgdGhpcy5nZXREYXRhVGltZXN0YW1wcygpO1xuICAgIGZvciAodGltZSA9IGZpcnN0LCBjb3VudCA9IDA7IHRpbWUgPCBtYXg7IHRpbWUgPSArYWRhcHRlci5hZGQodGltZSwgc3RlcFNpemUsIG1pbm9yKSwgY291bnQrKykge1xuICAgICAgYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcyk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWUgPT09IG1heCB8fCBvcHRpb25zLmJvdW5kcyA9PT0gJ3RpY2tzJyB8fCBjb3VudCA9PT0gMSkge1xuICAgICAgYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aWNrcykuc29ydCgoYSwgYikgPT4gYSAtIGIpLm1hcCh4ID0+ICt4KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cbiAgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVyO1xuICAgIGNvbnN0IHRpbWVPcHRzID0gdGhpcy5vcHRpb25zLnRpbWU7XG5cbiAgICBpZiAodGltZU9wdHMudG9vbHRpcEZvcm1hdCkge1xuICAgICAgcmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lT3B0cy50b29sdGlwRm9ybWF0KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lT3B0cy5kaXNwbGF5Rm9ybWF0cy5kYXRldGltZSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gZm9ybWF0XG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG4gIGZvcm1hdCh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBmb3JtYXRzID0gb3B0aW9ucy50aW1lLmRpc3BsYXlGb3JtYXRzO1xuICAgIGNvbnN0IHVuaXQgPSB0aGlzLl91bml0O1xuICAgIGNvbnN0IGZtdCA9IGZvcm1hdCB8fCBmb3JtYXRzW3VuaXRdO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh2YWx1ZSwgZm10KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgYW4gaW5kaXZpZHVhbCB0aWNrIG1hcmtcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IHRpY2tzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gW2Zvcm1hdF1cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3RpY2tGb3JtYXRGdW5jdGlvbih0aW1lLCBpbmRleCwgdGlja3MsIGZvcm1hdCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gb3B0aW9ucy50aWNrcy5jYWxsYmFjaztcblxuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBjYWxsKGZvcm1hdHRlciwgW3RpbWUsIGluZGV4LCB0aWNrc10sIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHMgPSBvcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHM7XG4gICAgY29uc3QgdW5pdCA9IHRoaXMuX3VuaXQ7XG4gICAgY29uc3QgbWFqb3JVbml0ID0gdGhpcy5fbWFqb3JVbml0O1xuICAgIGNvbnN0IG1pbm9yRm9ybWF0ID0gdW5pdCAmJiBmb3JtYXRzW3VuaXRdO1xuICAgIGNvbnN0IG1ham9yRm9ybWF0ID0gbWFqb3JVbml0ICYmIGZvcm1hdHNbbWFqb3JVbml0XTtcbiAgICBjb25zdCB0aWNrID0gdGlja3NbaW5kZXhdO1xuICAgIGNvbnN0IG1ham9yID0gbWFqb3JVbml0ICYmIG1ham9yRm9ybWF0ICYmIHRpY2sgJiYgdGljay5tYWpvcjtcblxuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh0aW1lLCBmb3JtYXQgfHwgKG1ham9yID8gbWFqb3JGb3JtYXQgOiBtaW5vckZvcm1hdCkpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IHRpY2tzXG5cdCAqL1xuICBnZW5lcmF0ZVRpY2tMYWJlbHModGlja3MpIHtcbiAgICBsZXQgaSwgaWxlbiwgdGljaztcblxuICAgIGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHRpY2sgPSB0aWNrc1tpXTtcbiAgICAgIHRpY2subGFiZWwgPSB0aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24odGljay52YWx1ZSwgaSwgdGlja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQylcblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cbiAgZ2V0RGVjaW1hbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogKHZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgY29uc3QgcG9zID0gdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgob2Zmc2V0cy5zdGFydCArIHBvcykgKiBvZmZzZXRzLmZhY3Rvcik7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBpeGVsXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG4gIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICBjb25zdCBvZmZzZXRzID0gdGhpcy5fb2Zmc2V0cztcbiAgICBjb25zdCBwb3MgPSB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgLyBvZmZzZXRzLmZhY3RvciAtIG9mZnNldHMuZW5kO1xuICAgIHJldHVybiB0aGlzLm1pbiArIHBvcyAqICh0aGlzLm1heCAtIHRoaXMubWluKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcblx0ICogQHJldHVybiB7e3c6bnVtYmVyLCBoOm51bWJlcn19XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0TGFiZWxTaXplKGxhYmVsKSB7XG4gICAgY29uc3QgdGlja3NPcHRzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IHRpY2tMYWJlbFdpZHRoID0gdGhpcy5jdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoO1xuICAgIGNvbnN0IGFuZ2xlID0gdG9SYWRpYW5zKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aWNrc09wdHMubWF4Um90YXRpb24gOiB0aWNrc09wdHMubWluUm90YXRpb24pO1xuICAgIGNvbnN0IGNvc1JvdGF0aW9uID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGNvbnN0IHRpY2tGb250U2l6ZSA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCkuc2l6ZTtcblxuICAgIHJldHVybiB7XG4gICAgICB3OiAodGlja0xhYmVsV2lkdGggKiBjb3NSb3RhdGlvbikgKyAodGlja0ZvbnRTaXplICogc2luUm90YXRpb24pLFxuICAgICAgaDogKHRpY2tMYWJlbFdpZHRoICogc2luUm90YXRpb24pICsgKHRpY2tGb250U2l6ZSAqIGNvc1JvdGF0aW9uKVxuICAgIH07XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IGV4YW1wbGVUaW1lXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRMYWJlbENhcGFjaXR5KGV4YW1wbGVUaW1lKSB7XG4gICAgY29uc3QgdGltZU9wdHMgPSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICBjb25zdCBkaXNwbGF5Rm9ybWF0cyA9IHRpbWVPcHRzLmRpc3BsYXlGb3JtYXRzO1xuXG4gICAgLy8gcGljayB0aGUgbG9uZ2VzdCBmb3JtYXQgKG1pbGxpc2Vjb25kcykgZm9yIGd1ZXN0aW1hdGlvblxuICAgIGNvbnN0IGZvcm1hdCA9IGRpc3BsYXlGb3JtYXRzW3RpbWVPcHRzLnVuaXRdIHx8IGRpc3BsYXlGb3JtYXRzLm1pbGxpc2Vjb25kO1xuICAgIGNvbnN0IGV4YW1wbGVMYWJlbCA9IHRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihleGFtcGxlVGltZSwgMCwgdGlja3NGcm9tVGltZXN0YW1wcyh0aGlzLCBbZXhhbXBsZVRpbWVdLCB0aGlzLl9tYWpvclVuaXQpLCBmb3JtYXQpO1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRMYWJlbFNpemUoZXhhbXBsZUxhYmVsKTtcbiAgICAvLyBzdWJ0cmFjdCAxIC0gaWYgb2Zmc2V0IHRoZW4gdGhlcmUncyBvbmUgbGVzcyBsYWJlbCB0aGFuIHRpY2tcbiAgICAvLyBpZiBub3Qgb2Zmc2V0IHRoZW4gb25lIGhhbGYgbGFiZWwgcGFkZGluZyBpcyBhZGRlZCB0byBlYWNoIGVuZCBsZWF2aW5nIHJvb20gZm9yIG9uZSBsZXNzIGxhYmVsXG4gICAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoIC8gc2l6ZS53IDogdGhpcy5oZWlnaHQgLyBzaXplLmgpIC0gMTtcbiAgICByZXR1cm4gY2FwYWNpdHkgPiAwID8gY2FwYWNpdHkgOiAxO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldERhdGFUaW1lc3RhbXBzKCkge1xuICAgIGxldCB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUuZGF0YSB8fCBbXTtcbiAgICBsZXQgaSwgaWxlbjtcblxuICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXMgPSB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7XG5cbiAgICBpZiAodGhpcy5fbm9ybWFsaXplZCAmJiBtZXRhcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fY2FjaGUuZGF0YSA9IG1ldGFzWzBdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB0aW1lc3RhbXBzID0gdGltZXN0YW1wcy5jb25jYXQobWV0YXNbaV0uY29udHJvbGxlci5nZXRBbGxQYXJzZWRWYWx1ZXModGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5fY2FjaGUuZGF0YSA9IHRoaXMubm9ybWFsaXplKHRpbWVzdGFtcHMpKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBnZXRMYWJlbFRpbWVzdGFtcHMoKSB7XG4gICAgY29uc3QgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmxhYmVscyB8fCBbXTtcbiAgICBsZXQgaSwgaWxlbjtcblxuICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbGFiZWxzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgdGltZXN0YW1wcy5wdXNoKHBhcnNlKHRoaXMsIGxhYmVsc1tpXSkpO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5fY2FjaGUubGFiZWxzID0gdGhpcy5fbm9ybWFsaXplZCA/IHRpbWVzdGFtcHMgOiB0aGlzLm5vcm1hbGl6ZSh0aW1lc3RhbXBzKSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJbXX0gdmFsdWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIG5vcm1hbGl6ZSh2YWx1ZXMpIHtcbiAgICAvLyBJdCBzZWVtcyB0byBiZSBzb21ld2hhdCBmYXN0ZXIgdG8gZG8gc29ydGluZyBmaXJzdFxuICAgIHJldHVybiBfYXJyYXlVbmlxdWUodmFsdWVzLnNvcnQoc29ydGVyKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgVGltZVNjYWxlIGZyb20gJy4vc2NhbGUudGltZS5qcyc7XG5pbXBvcnQge19sb29rdXBCeUtleX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvbGxlY3Rpb24uanMnO1xuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGUgZ2l2ZW4gc291cmNlIGB2YWxgIHVzaW5nIHRoZSB0YWJsZS4gSWYgdmFsdWUgaXMgb3V0IG9mIGJvdW5kcywgdmFsdWVzXG4gKiBhdCBlZGdlcyBhcmUgdXNlZCBmb3IgdGhlIGludGVycG9sYXRpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gdGFibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2VdIGxvb2t1cCB0aW1lIGJhc2VkIG9uIHBvc2l0aW9uIGluc3RlYWQgb2YgdmljZSB2ZXJzYVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh0YWJsZSwgdmFsLCByZXZlcnNlKSB7XG4gIGxldCBsbyA9IDA7XG4gIGxldCBoaSA9IHRhYmxlLmxlbmd0aCAtIDE7XG4gIGxldCBwcmV2U291cmNlLCBuZXh0U291cmNlLCBwcmV2VGFyZ2V0LCBuZXh0VGFyZ2V0O1xuICBpZiAocmV2ZXJzZSkge1xuICAgIGlmICh2YWwgPj0gdGFibGVbbG9dLnBvcyAmJiB2YWwgPD0gdGFibGVbaGldLnBvcykge1xuICAgICAgKHtsbywgaGl9ID0gX2xvb2t1cEJ5S2V5KHRhYmxlLCAncG9zJywgdmFsKSk7XG4gICAgfVxuICAgICh7cG9zOiBwcmV2U291cmNlLCB0aW1lOiBwcmV2VGFyZ2V0fSA9IHRhYmxlW2xvXSk7XG4gICAgKHtwb3M6IG5leHRTb3VyY2UsIHRpbWU6IG5leHRUYXJnZXR9ID0gdGFibGVbaGldKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsID49IHRhYmxlW2xvXS50aW1lICYmIHZhbCA8PSB0YWJsZVtoaV0udGltZSkge1xuICAgICAgKHtsbywgaGl9ID0gX2xvb2t1cEJ5S2V5KHRhYmxlLCAndGltZScsIHZhbCkpO1xuICAgIH1cbiAgICAoe3RpbWU6IHByZXZTb3VyY2UsIHBvczogcHJldlRhcmdldH0gPSB0YWJsZVtsb10pO1xuICAgICh7dGltZTogbmV4dFNvdXJjZSwgcG9zOiBuZXh0VGFyZ2V0fSA9IHRhYmxlW2hpXSk7XG4gIH1cblxuICBjb25zdCBzcGFuID0gbmV4dFNvdXJjZSAtIHByZXZTb3VyY2U7XG4gIHJldHVybiBzcGFuID8gcHJldlRhcmdldCArIChuZXh0VGFyZ2V0IC0gcHJldlRhcmdldCkgKiAodmFsIC0gcHJldlNvdXJjZSkgLyBzcGFuIDogcHJldlRhcmdldDtcbn1cblxuY2xhc3MgVGltZVNlcmllc1NjYWxlIGV4dGVuZHMgVGltZVNjYWxlIHtcblxuICBzdGF0aWMgaWQgPSAndGltZXNlcmllcyc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSBUaW1lU2NhbGUuZGVmYXVsdHM7XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuXHQgKi9cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAvKiogQHR5cGUge29iamVjdFtdfSAqL1xuICAgIHRoaXMuX3RhYmxlID0gW107XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fbWluUG9zID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuX3RhYmxlUmFuZ2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgaW5pdE9mZnNldHMoKSB7XG4gICAgY29uc3QgdGltZXN0YW1wcyA9IHRoaXMuX2dldFRpbWVzdGFtcHNGb3JUYWJsZSgpO1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fdGFibGUgPSB0aGlzLmJ1aWxkTG9va3VwVGFibGUodGltZXN0YW1wcyk7XG4gICAgdGhpcy5fbWluUG9zID0gaW50ZXJwb2xhdGUodGFibGUsIHRoaXMubWluKTtcbiAgICB0aGlzLl90YWJsZVJhbmdlID0gaW50ZXJwb2xhdGUodGFibGUsIHRoaXMubWF4KSAtIHRoaXMuX21pblBvcztcbiAgICBzdXBlci5pbml0T2Zmc2V0cyh0aW1lc3RhbXBzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHt0aW1lLCBwb3N9IG9iamVjdHMgdXNlZCB0byBpbnRlcnBvbGF0ZSBhIHNwZWNpZmljIGB0aW1lYCBvciBwb3NpdGlvblxuXHQgKiAoYHBvc2ApIG9uIHRoZSBzY2FsZSwgYnkgc2VhcmNoaW5nIGVudHJpZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmVxdWVzdGVkIHZhbHVlLiBgcG9zYCBpc1xuXHQgKiBhIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxOiAwIGJlaW5nIHRoZSBzdGFydCBvZiB0aGUgc2NhbGUgKGxlZnQgb3IgdG9wKSBhbmQgMSB0aGUgb3RoZXJcblx0ICogZXh0cmVtaXR5IChsZWZ0ICsgd2lkdGggb3IgdG9wICsgaGVpZ2h0KS4gTm90ZSB0aGF0IGl0IHdvdWxkIGJlIG1vcmUgb3B0aW1pemVkIHRvIGRpcmVjdGx5XG5cdCAqIHN0b3JlIHByZS1jb21wdXRlZCBwaXhlbHMsIGJ1dCB0aGUgc2NhbGUgZGltZW5zaW9ucyBhcmUgbm90IGd1YXJhbnRlZWQgYXQgdGhlIHRpbWUgd2UgbmVlZFxuXHQgKiB0byBjcmVhdGUgdGhlIGxvb2t1cCB0YWJsZS4gVGhlIHRhYmxlIEFMV0FZUyBjb250YWlucyBhdCBsZWFzdCB0d28gaXRlbXM6IG1pbiBhbmQgbWF4LlxuXHQgKiBAcGFyYW0ge251bWJlcltdfSB0aW1lc3RhbXBzXG5cdCAqIEByZXR1cm4ge29iamVjdFtdfVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBidWlsZExvb2t1cFRhYmxlKHRpbWVzdGFtcHMpIHtcbiAgICBjb25zdCB7bWluLCBtYXh9ID0gdGhpcztcbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGNvbnN0IHRhYmxlID0gW107XG4gICAgbGV0IGksIGlsZW4sIHByZXYsIGN1cnIsIG5leHQ7XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gdGltZXN0YW1wcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGN1cnIgPSB0aW1lc3RhbXBzW2ldO1xuICAgICAgaWYgKGN1cnIgPj0gbWluICYmIGN1cnIgPD0gbWF4KSB7XG4gICAgICAgIGl0ZW1zLnB1c2goY3Vycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlcmUgaXMgbGVzcyB0aGF0IDIgdGltZXN0YW1wcyBiZXR3ZWVuIG1pbiBhbmQgbWF4LCB0aGUgc2NhbGUgaXMgZGVmaW5lZCBieSBtaW4gYW5kIG1heFxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge3RpbWU6IG1pbiwgcG9zOiAwfSxcbiAgICAgICAge3RpbWU6IG1heCwgcG9zOiAxfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBuZXh0ID0gaXRlbXNbaSArIDFdO1xuICAgICAgcHJldiA9IGl0ZW1zW2kgLSAxXTtcbiAgICAgIGN1cnIgPSBpdGVtc1tpXTtcblxuICAgICAgLy8gb25seSBhZGQgcG9pbnRzIHRoYXQgYnJlYWtzIHRoZSBzY2FsZSBsaW5lYXJpdHlcbiAgICAgIGlmIChNYXRoLnJvdW5kKChuZXh0ICsgcHJldikgLyAyKSAhPT0gY3Vycikge1xuICAgICAgICB0YWJsZS5wdXNoKHt0aW1lOiBjdXJyLCBwb3M6IGkgLyAoaWxlbiAtIDEpfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWJsZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aW1lc3RhbXBzXG5cdCAqIEByZXR1cm4ge251bWJlcltdfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldFRpbWVzdGFtcHNGb3JUYWJsZSgpIHtcbiAgICBsZXQgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmFsbCB8fCBbXTtcblxuICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7XG4gICAgaWYgKGRhdGEubGVuZ3RoICYmIGxhYmVsLmxlbmd0aCkge1xuICAgICAgLy8gSWYgY29tYmluaW5nIGxhYmVscyBhbmQgZGF0YSAoZGF0YSBtaWdodCBub3QgY29udGFpbiBhbGwgbGFiZWxzKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gcmVjaGVjayB1bmlxdWVuZXNzIGFuZCBzb3J0XG4gICAgICB0aW1lc3RhbXBzID0gdGhpcy5ub3JtYWxpemUoZGF0YS5jb25jYXQobGFiZWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZXN0YW1wcyA9IGRhdGEubGVuZ3RoID8gZGF0YSA6IGxhYmVsO1xuICAgIH1cbiAgICB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUuYWxsID0gdGltZXN0YW1wcztcblxuICAgIHJldHVybiB0aW1lc3RhbXBzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXREZWNpbWFsRm9yVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gKGludGVycG9sYXRlKHRoaXMuX3RhYmxlLCB2YWx1ZSkgLSB0aGlzLl9taW5Qb3MpIC8gdGhpcy5fdGFibGVSYW5nZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWxcblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cbiAgZ2V0VmFsdWVGb3JQaXhlbChwaXhlbCkge1xuICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLl9vZmZzZXRzO1xuICAgIGNvbnN0IGRlY2ltYWwgPSB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgLyBvZmZzZXRzLmZhY3RvciAtIG9mZnNldHMuZW5kO1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZSh0aGlzLl90YWJsZSwgZGVjaW1hbCAqIHRoaXMuX3RhYmxlUmFuZ2UgKyB0aGlzLl9taW5Qb3MsIHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWVTZXJpZXNTY2FsZTtcbiIsICJleHBvcnQgKiBmcm9tICcuL2NvbnRyb2xsZXJzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VsZW1lbnRzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGxhdGZvcm0vaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wbHVnaW5zL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NhbGVzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgY29udHJvbGxlcnMgZnJvbSAnLi9jb250cm9sbGVycy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyBlbGVtZW50cyBmcm9tICcuL2VsZW1lbnRzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi9wbHVnaW5zL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHNjYWxlcyBmcm9tICcuL3NjYWxlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB7XG4gIGNvbnRyb2xsZXJzLFxuICBlbGVtZW50cyxcbiAgcGx1Z2lucyxcbiAgc2NhbGVzLFxufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyYWJsZXMgPSBbXG4gIGNvbnRyb2xsZXJzLFxuICBlbGVtZW50cyxcbiAgcGx1Z2lucyxcbiAgc2NhbGVzLFxuXTtcbiIsICJpbXBvcnQgeyBJdGVtVmlldywgV29ya3NwYWNlTGVhZiwgTWVudSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHR5cGUgU1JQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyBDT0xMQVBTRV9JQ09OIH0gZnJvbSBcInNyYy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJldmlld0RlY2sgfSBmcm9tIFwic3JjL3Jldmlldy1kZWNrXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcInNyYy9sYW5nL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNvbnN0IFJFVklFV19RVUVVRV9WSUVXX1RZUEUgPSBcInJldmlldy1xdWV1ZS1saXN0LXZpZXdcIjtcblxuZXhwb3J0IGNsYXNzIFJldmlld1F1ZXVlTGlzdFZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgcHJpdmF0ZSBwbHVnaW46IFNSUGx1Z2luO1xuXG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBTUlBsdWdpbikge1xuICAgICAgICBzdXBlcihsZWFmKTtcblxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImZpbGUtb3BlblwiLCAoKSA9PiB0aGlzLnJlZHJhdygpKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbihcInJlbmFtZVwiLCAoKSA9PiB0aGlzLnJlZHJhdygpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBSRVZJRVdfUVVFVUVfVklFV19UWVBFO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdChcIk5PVEVTX1JFVklFV19RVUVVRVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SWNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJTcGFjZWRSZXBJY29uXCI7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGVhZGVyTWVudShtZW51OiBNZW51KTogdm9pZCB7XG4gICAgICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRUaXRsZSh0KFwiQ0xPU0VcIikpXG4gICAgICAgICAgICAgICAgLnNldEljb24oXCJjcm9zc1wiKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShSRVZJRVdfUVVFVUVfVklFV19UWVBFKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZHJhdygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWN0aXZlRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblxuICAgICAgICBjb25zdCByb290RWw6IEhUTUxFbGVtZW50ID0gY3JlYXRlRGl2KFwibmF2LWZvbGRlciBtb2Qtcm9vdFwiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5FbDogSFRNTEVsZW1lbnQgPSByb290RWwuY3JlYXRlRGl2KFwibmF2LWZvbGRlci1jaGlsZHJlblwiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRlY2tLZXkgaW4gdGhpcy5wbHVnaW4ucmV2aWV3RGVja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2s6IFJldmlld0RlY2sgPSB0aGlzLnBsdWdpbi5yZXZpZXdEZWNrc1tkZWNrS2V5XTtcblxuICAgICAgICAgICAgY29uc3QgZGVja0NvbGxhcHNlZCA9ICFkZWNrLmFjdGl2ZUZvbGRlcnMuaGFzKGRlY2suZGVja05hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBkZWNrRm9sZGVyRWw6IEhUTUxFbGVtZW50ID0gdGhpcy5jcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5FbCxcbiAgICAgICAgICAgICAgICBkZWNrS2V5LFxuICAgICAgICAgICAgICAgIGRlY2tDb2xsYXBzZWQsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZGVja1xuICAgICAgICAgICAgKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibmF2LWZvbGRlci1jaGlsZHJlblwiKVswXSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGRlY2submV3Tm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vdGVzRm9sZGVyRWw6IEhUTUxFbGVtZW50ID0gdGhpcy5jcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgICAgICAgICAgICAgIGRlY2tGb2xkZXJFbCxcbiAgICAgICAgICAgICAgICAgICAgdChcIk5FV1wiKSxcbiAgICAgICAgICAgICAgICAgICAgIWRlY2suYWN0aXZlRm9sZGVycy5oYXModChcIk5FV1wiKSksXG4gICAgICAgICAgICAgICAgICAgIGRlY2tDb2xsYXBzZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlY2tcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZXdGaWxlIG9mIGRlY2submV3Tm90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUlzT3BlbiA9IGFjdGl2ZUZpbGUgJiYgbmV3RmlsZS5wYXRoID09PSBhY3RpdmVGaWxlLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlSXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLmFjdGl2ZUZvbGRlcnMuYWRkKGRlY2suZGVja05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjay5hY3RpdmVGb2xkZXJzLmFkZCh0KFwiTkVXXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRm9sZGVySWNvblRvRXhwYW5kZWQobmV3Tm90ZXNGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUZvbGRlckljb25Ub0V4cGFuZGVkKGRlY2tGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSaWdodFBhbmVGaWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm90ZXNGb2xkZXJFbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSXNPcGVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgIWRlY2suYWN0aXZlRm9sZGVycy5oYXModChcIk5FV1wiKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZWNrLnNjaGVkdWxlZE5vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJVbml4ID0gLTE7XG4gICAgICAgICAgICAgICAgbGV0IHNjaGVkRm9sZGVyRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhEYXlzVG9SZW5kZXI6IG51bWJlciA9IHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzTm90ZSBvZiBkZWNrLnNjaGVkdWxlZE5vdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzTm90ZS5kdWVVbml4ICE9IGN1cnJVbml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuRGF5czogbnVtYmVyID0gTWF0aC5jZWlsKChzTm90ZS5kdWVVbml4IC0gbm93KSAvICgyNCAqIDM2MDAgKiAxMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuRGF5cyA+IG1heERheXNUb1JlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkRheXMgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVGl0bGUgPSB0KFwiWUVTVEVSREFZXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuRGF5cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlID0gdChcIlRPREFZXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuRGF5cyA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlID0gdChcIlRPTU9SUk9XXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJUaXRsZSA9IG5ldyBEYXRlKHNOb3RlLmR1ZVVuaXgpLnRvRGF0ZVN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZEZvbGRlckVsID0gdGhpcy5jcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVja0ZvbGRlckVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZWNrLmFjdGl2ZUZvbGRlcnMuaGFzKGZvbGRlclRpdGxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNrQ29sbGFwc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyVW5peCA9IHNOb3RlLmR1ZVVuaXg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlSXNPcGVuID0gYWN0aXZlRmlsZSAmJiBzTm90ZS5ub3RlLnBhdGggPT09IGFjdGl2ZUZpbGUucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVJc09wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2suYWN0aXZlRm9sZGVycy5hZGQoZGVjay5kZWNrTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLmFjdGl2ZUZvbGRlcnMuYWRkKGZvbGRlclRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRm9sZGVySWNvblRvRXhwYW5kZWQoc2NoZWRGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUZvbGRlckljb25Ub0V4cGFuZGVkKGRlY2tGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJpZ2h0UGFuZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZEZvbGRlckVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc05vdGUubm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJc09wZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAhZGVjay5hY3RpdmVGb2xkZXJzLmhhcyhmb2xkZXJUaXRsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50RWw6IEVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzFdO1xuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKHJvb3RFbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgIHBhcmVudEVsOiBIVE1MRWxlbWVudCxcbiAgICAgICAgZm9sZGVyVGl0bGU6IHN0cmluZyxcbiAgICAgICAgY29sbGFwc2VkOiBib29sZWFuLFxuICAgICAgICBoaWRkZW46IGJvb2xlYW4sXG4gICAgICAgIGRlY2s6IFJldmlld0RlY2tcbiAgICApOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGZvbGRlckVsOiBIVE1MRGl2RWxlbWVudCA9IHBhcmVudEVsLmNyZWF0ZURpdihcIm5hdi1mb2xkZXJcIik7XG4gICAgICAgIGNvbnN0IGZvbGRlclRpdGxlRWw6IEhUTUxEaXZFbGVtZW50ID0gZm9sZGVyRWwuY3JlYXRlRGl2KFwibmF2LWZvbGRlci10aXRsZVwiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5FbDogSFRNTERpdkVsZW1lbnQgPSBmb2xkZXJFbC5jcmVhdGVEaXYoXCJuYXYtZm9sZGVyLWNoaWxkcmVuXCIpO1xuICAgICAgICBjb25zdCBjb2xsYXBzZUljb25FbDogSFRNTERpdkVsZW1lbnQgPSBmb2xkZXJUaXRsZUVsLmNyZWF0ZURpdihcbiAgICAgICAgICAgIFwibmF2LWZvbGRlci1jb2xsYXBzZS1pbmRpY2F0b3IgY29sbGFwc2UtaWNvblwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29sbGFwc2VJY29uRWwuaW5uZXJIVE1MID0gQ09MTEFQU0VfSUNPTjtcbiAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xuICAgICAgICAgICAgKGNvbGxhcHNlSWNvbkVsLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnRyYW5zZm9ybSA9IFwicm90YXRlKC05MGRlZylcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvbGRlclRpdGxlRWwuY3JlYXRlRGl2KFwibmF2LWZvbGRlci10aXRsZS1jb250ZW50XCIpLnNldFRleHQoZm9sZGVyVGl0bGUpO1xuXG4gICAgICAgIGlmIChoaWRkZW4pIHtcbiAgICAgICAgICAgIGZvbGRlckVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvbGRlclRpdGxlRWwub25DbGlja0V2ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5FbC5jaGlsZE5vZGVzIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0eWxlLmRpc3BsYXkgPT09IFwiYmxvY2tcIiB8fCBjaGlsZC5zdHlsZS5kaXNwbGF5ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgKGNvbGxhcHNlSWNvbkVsLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnRyYW5zZm9ybSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcInJvdGF0ZSgtOTBkZWcpXCI7XG4gICAgICAgICAgICAgICAgICAgIGRlY2suYWN0aXZlRm9sZGVycy5kZWxldGUoZm9sZGVyVGl0bGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgIChjb2xsYXBzZUljb25FbC5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBkZWNrLmFjdGl2ZUZvbGRlcnMuYWRkKGZvbGRlclRpdGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb2xkZXJFbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVJpZ2h0UGFuZUZpbGUoXG4gICAgICAgIGZvbGRlckVsOiBIVE1MRWxlbWVudCxcbiAgICAgICAgZmlsZTogVEZpbGUsXG4gICAgICAgIGZpbGVFbEFjdGl2ZTogYm9vbGVhbixcbiAgICAgICAgaGlkZGVuOiBib29sZWFuLFxuICAgICAgICBkZWNrOiBSZXZpZXdEZWNrLFxuICAgICAgICBwbHVnaW46IFNSUGx1Z2luXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5hdkZpbGVFbDogSFRNTEVsZW1lbnQgPSBmb2xkZXJFbFxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJuYXYtZm9sZGVyLWNoaWxkcmVuXCIpWzBdXG4gICAgICAgICAgICAuY3JlYXRlRGl2KFwibmF2LWZpbGVcIik7XG4gICAgICAgIGlmIChoaWRkZW4pIHtcbiAgICAgICAgICAgIG5hdkZpbGVFbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYXZGaWxlVGl0bGU6IEhUTUxFbGVtZW50ID0gbmF2RmlsZUVsLmNyZWF0ZURpdihcIm5hdi1maWxlLXRpdGxlXCIpO1xuICAgICAgICBpZiAoZmlsZUVsQWN0aXZlKSB7XG4gICAgICAgICAgICBuYXZGaWxlVGl0bGUuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBuYXZGaWxlVGl0bGUuY3JlYXRlRGl2KFwibmF2LWZpbGUtdGl0bGUtY29udGVudFwiKS5zZXRUZXh0KGZpbGUuYmFzZW5hbWUpO1xuICAgICAgICBuYXZGaWxlVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICAgIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmxhc3RTZWxlY3RlZFJldmlld0RlY2sgPSBkZWNrLmRlY2tOYW1lO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCkub3BlbkZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgbmF2RmlsZVRpdGxlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImNvbnRleHRtZW51XCIsXG4gICAgICAgICAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVNZW51OiBNZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UudHJpZ2dlcihcImZpbGUtbWVudVwiLCBmaWxlTWVudSwgZmlsZSwgXCJteS1jb250ZXh0LW1lbnVcIiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgZmlsZU1lbnUuc2hvd0F0UG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICB4OiBldmVudC5wYWdlWCxcbiAgICAgICAgICAgICAgICAgICAgeTogZXZlbnQucGFnZVksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VGb2xkZXJJY29uVG9FeHBhbmRlZChmb2xkZXJFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sbGFwc2VJY29uRWwgPSBmb2xkZXJFbC5maW5kKFwiZGl2Lm5hdi1mb2xkZXItY29sbGFwc2UtaW5kaWNhdG9yXCIpO1xuICAgICAgICAoY29sbGFwc2VJY29uRWwuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBGdXp6eVN1Z2dlc3RNb2RhbCwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgU2NoZWROb3RlIH0gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcInNyYy9sYW5nL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJldmlld0RlY2sge1xuICAgIHB1YmxpYyBkZWNrTmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBuZXdOb3RlczogVEZpbGVbXSA9IFtdO1xuICAgIHB1YmxpYyBzY2hlZHVsZWROb3RlczogU2NoZWROb3RlW10gPSBbXTtcbiAgICBwdWJsaWMgYWN0aXZlRm9sZGVyczogU2V0PHN0cmluZz47XG4gICAgcHVibGljIGR1ZU5vdGVzQ291bnQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGVja05hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmFjdGl2ZUZvbGRlcnMgPSBuZXcgU2V0KFt0aGlzLmRlY2tOYW1lLCB0KFwiVE9EQVlcIildKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc29ydE5vdGVzKHBhZ2VyYW5rczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IHZvaWQge1xuICAgICAgICAvLyBzb3J0IG5ldyBub3RlcyBieSBpbXBvcnRhbmNlXG4gICAgICAgIHRoaXMubmV3Tm90ZXMgPSB0aGlzLm5ld05vdGVzLnNvcnQoXG4gICAgICAgICAgICAoYTogVEZpbGUsIGI6IFRGaWxlKSA9PiAocGFnZXJhbmtzW2IucGF0aF0gfHwgMCkgLSAocGFnZXJhbmtzW2EucGF0aF0gfHwgMClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBzb3J0IHNjaGVkdWxlZCBub3RlcyBieSBkYXRlICYgd2l0aGluIHRob3NlIGRheXMsIHNvcnQgdGhlbSBieSBpbXBvcnRhbmNlXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkTm90ZXMgPSB0aGlzLnNjaGVkdWxlZE5vdGVzLnNvcnQoKGE6IFNjaGVkTm90ZSwgYjogU2NoZWROb3RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhLmR1ZVVuaXggLSBiLmR1ZVVuaXg7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChwYWdlcmFua3NbYi5ub3RlLnBhdGhdIHx8IDApIC0gKHBhZ2VyYW5rc1thLm5vdGUucGF0aF0gfHwgMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldmlld0RlY2tTZWxlY3Rpb25Nb2RhbCBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPHN0cmluZz4ge1xuICAgIHB1YmxpYyBkZWNrS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgc3VibWl0Q2FsbGJhY2s6IChkZWNrS2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZGVja0tleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuZGVja0tleXMgPSBkZWNrS2V5cztcbiAgICB9XG5cbiAgICBnZXRJdGVtcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY2tLZXlzO1xuICAgIH1cblxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIG9uQ2hvb3NlSXRlbShkZWNrS2V5OiBzdHJpbmcsIF86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5zdWJtaXRDYWxsYmFjayhkZWNrS2V5KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ2FyZFR5cGUgfSBmcm9tIFwic3JjL3NjaGVkdWxpbmdcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGZsYXNoY2FyZHMgZm91bmQgaW4gYHRleHRgXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBleHRyYWN0IGZsYXNoY2FyZHMgZnJvbVxuICogQHBhcmFtIHNpbmdsZWxpbmVDYXJkU2VwYXJhdG9yIC0gU2VwYXJhdG9yIGZvciBpbmxpbmUgYmFzaWMgY2FyZHNcbiAqIEBwYXJhbSBzaW5nbGVsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yIC0gU2VwYXJhdG9yIGZvciBpbmxpbmUgcmV2ZXJzZWQgY2FyZHNcbiAqIEBwYXJhbSBtdWx0aWxpbmVDYXJkU2VwYXJhdG9yIC0gU2VwYXJhdG9yIGZvciBtdWx0aWxpbmUgYmFzaWMgY2FyZHNcbiAqIEBwYXJhbSBtdWx0aWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IgLSBTZXBhcmF0b3IgZm9yIG11bHRpbGluZSBiYXNpYyBjYXJkXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBbQ2FyZFR5cGUsIGNhcmQgdGV4dCwgbGluZSBudW1iZXJdIHR1cGxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHNpbmdsZWxpbmVDYXJkU2VwYXJhdG9yOiBzdHJpbmcsXG4gICAgc2luZ2xlbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvcjogc3RyaW5nLFxuICAgIG11bHRpbGluZUNhcmRTZXBhcmF0b3I6IHN0cmluZyxcbiAgICBtdWx0aWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3I6IHN0cmluZyxcbiAgICBjb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzOiBib29sZWFuLFxuICAgIGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzOiBib29sZWFuLFxuICAgIGNvbnZlcnRDdXJseUJyYWNrZXRzVG9DbG96ZXM6IGJvb2xlYW5cbik6IFtDYXJkVHlwZSwgc3RyaW5nLCBudW1iZXJdW10ge1xuICAgIGxldCBjYXJkVGV4dCA9IFwiXCI7XG4gICAgY29uc3QgY2FyZHM6IFtDYXJkVHlwZSwgc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgY2FyZFR5cGU6IENhcmRUeXBlIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxpbmVObyA9IDA7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSB0ZXh0LnJlcGxhY2VBbGwoXCJcXHJcXG5cIiwgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobGluZXNbaV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoY2FyZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXJkcy5wdXNoKFtjYXJkVHlwZSwgY2FyZFRleHQsIGxpbmVOb10pO1xuICAgICAgICAgICAgICAgIGNhcmRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FyZFRleHQgPSBcIlwiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZXNbaV0uc3RhcnRzV2l0aChcIjwhLS1cIikgJiYgIWxpbmVzW2ldLnN0YXJ0c1dpdGgoXCI8IS0tU1I6XCIpKSB7XG4gICAgICAgICAgICB3aGlsZSAoaSArIDEgPCBsaW5lcy5sZW5ndGggJiYgIWxpbmVzW2ldLmluY2x1ZGVzKFwiLS0+XCIpKSBpKys7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYXJkVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjYXJkVGV4dCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGNhcmRUZXh0ICs9IGxpbmVzW2ldO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxpbmVzW2ldLmluY2x1ZGVzKHNpbmdsZWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IpIHx8XG4gICAgICAgICAgICBsaW5lc1tpXS5pbmNsdWRlcyhzaW5nbGVsaW5lQ2FyZFNlcGFyYXRvcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjYXJkVHlwZSA9IGxpbmVzW2ldLmluY2x1ZGVzKHNpbmdsZWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IpXG4gICAgICAgICAgICAgICAgPyBDYXJkVHlwZS5TaW5nbGVMaW5lUmV2ZXJzZWRcbiAgICAgICAgICAgICAgICA6IENhcmRUeXBlLlNpbmdsZUxpbmVCYXNpYztcbiAgICAgICAgICAgIGNhcmRUZXh0ID0gbGluZXNbaV07XG4gICAgICAgICAgICBsaW5lTm8gPSBpO1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2kgKyAxXS5zdGFydHNXaXRoKFwiPCEtLVNSOlwiKSkge1xuICAgICAgICAgICAgICAgIGNhcmRUZXh0ICs9IFwiXFxuXCIgKyBsaW5lc1tpICsgMV07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FyZHMucHVzaChbY2FyZFR5cGUsIGNhcmRUZXh0LCBsaW5lTm9dKTtcbiAgICAgICAgICAgIGNhcmRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgIGNhcmRUZXh0ID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNhcmRUeXBlID09PSBudWxsICYmXG4gICAgICAgICAgICAoKGNvbnZlcnRIaWdobGlnaHRzVG9DbG96ZXMgJiYgLz09Lio/PT0vZ20udGVzdChsaW5lc1tpXSkpIHx8XG4gICAgICAgICAgICAgICAgKGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzICYmIC9cXCpcXCouKj9cXCpcXCovZ20udGVzdChsaW5lc1tpXSkpIHx8XG4gICAgICAgICAgICAgICAgKGNvbnZlcnRDdXJseUJyYWNrZXRzVG9DbG96ZXMgJiYgL3t7Lio/fX0vZ20udGVzdChsaW5lc1tpXSkpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNhcmRUeXBlID0gQ2FyZFR5cGUuQ2xvemU7XG4gICAgICAgICAgICBsaW5lTm8gPSBpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzW2ldID09PSBtdWx0aWxpbmVDYXJkU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBjYXJkVHlwZSA9IENhcmRUeXBlLk11bHRpTGluZUJhc2ljO1xuICAgICAgICAgICAgbGluZU5vID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lc1tpXSA9PT0gbXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBjYXJkVHlwZSA9IENhcmRUeXBlLk11bHRpTGluZVJldmVyc2VkO1xuICAgICAgICAgICAgbGluZU5vID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKFwiYGBgXCIpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoXCJ+fn5cIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVCbG9ja0Nsb3NlID0gbGluZXNbaV0ubWF0Y2goL2ArfH4rLylbMF07XG4gICAgICAgICAgICB3aGlsZSAoaSArIDEgPCBsaW5lcy5sZW5ndGggJiYgIWxpbmVzW2kgKyAxXS5zdGFydHNXaXRoKGNvZGVCbG9ja0Nsb3NlKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBjYXJkVGV4dCArPSBcIlxcblwiICsgbGluZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXJkVGV4dCArPSBcIlxcblwiICsgY29kZUJsb2NrQ2xvc2U7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FyZFR5cGUgJiYgY2FyZFRleHQpIHtcbiAgICAgICAgY2FyZHMucHVzaChbY2FyZFR5cGUsIGNhcmRUZXh0LCBsaW5lTm9dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FyZHM7XG59XG4iLCAiaW1wb3J0IHsgYWRkSWNvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwSWNvbigpIHtcbiAgICBhZGRJY29uKFxuICAgICAgICBcIlNwYWNlZFJlcEljb25cIixcbiAgICAgICAgYDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTSA4OC45NjA5MzggMTcuMjU3ODEyIEwgNDcuNDU3MDMxIDE3LjI1NzgxMiBDIDQ1LjY3OTY4OCAxNy4yNTc4MTIgNDQuMjMwNDY5IDE4LjcwMzEyNSA0NC4yMzA0NjkgMjAuNDg0Mzc1IEwgNDQuMjMwNDY5IDg2LjU1ODU5NCBDIDQ0LjIzMDQ2OSA4OC4zMzU5MzggNDUuNjc5Njg4IDg5Ljc4NTE1NiA0Ny40NTcwMzEgODkuNzg1MTU2IEwgODguOTYwOTM4IDg5Ljc4NTE1NiBDIDkwLjczODI4MSA4OS43ODUxNTYgOTIuMTg3NSA4OC4zMzU5MzggOTIuMTg3NSA4Ni41NTg1OTQgTCA5Mi4xODc1IDIwLjQ4NDM3NSBDIDkyLjE4NzUgMTguNzAzMTI1IDkwLjczODI4MSAxNy4yNTc4MTIgODguOTYwOTM4IDE3LjI1NzgxMiBaIE0gODguMjgxMjUgODUuODc4OTA2IEwgNDguMTM2NzE5IDg1Ljg3ODkwNiBMIDQ4LjEzNjcxOSAyMS4xNjQwNjIgTCA4OC4yODEyNSAyMS4xNjQwNjIgWiBNIDg4LjI4MTI1IDg1Ljg3ODkwNiBcIi8+XG4gICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiAgZD1cIk0gODguOTYwOTM4IDkuNDQ1MzEyIEwgNjEuNjY3OTY5IDkuNDQ1MzEyIEMgNTkuOTI1NzgxIDMuODE2NDA2IDU0LjAxMTcxOSAwLjUxNTYyNSA0OC4yNjk1MzEgMi4wNTQ2ODggTCA4LjE4MzU5NCAxMi43OTY4NzUgQyAyLjMwNDY4OCAxNC4zNzEwOTQgLTEuMTk5MjE5IDIwLjQzNzUgMC4zNzg5MDYgMjYuMzE2NDA2IEwgMTcuNDc2NTYyIDkwLjE0MDYyNSBDIDE4Ljc5Njg3NSA5NS4wNjY0MDYgMjMuMjY5NTMxIDk4LjMyNDIxOSAyOC4xNDQ1MzEgOTguMzI0MjE5IEMgMjkuMDg1OTM4IDk4LjMyNDIxOSAzMC4wNDY4NzUgOTguMTk5MjE5IDMxIDk3Ljk0NTMxMiBMIDQwLjc2NTYyNSA5NS4zMjgxMjUgQyA0Mi42MjUgOTYuNzUgNDQuOTQxNDA2IDk3LjU5NzY1NiA0Ny40NTcwMzEgOTcuNTk3NjU2IEwgODguOTYwOTM4IDk3LjU5NzY1NiBDIDk1LjA0Njg3NSA5Ny41OTc2NTYgMTAwIDkyLjY0NDUzMSAxMDAgODYuNTU4NTk0IEwgMTAwIDIwLjQ4NDM3NSBDIDEwMCAxNC4zOTg0MzggOTUuMDQ2ODc1IDkuNDQ1MzEyIDg4Ljk2MDkzOCA5LjQ0NTMxMiBaIE0gMjkuOTg4MjgxIDk0LjE3MTg3NSBDIDI2LjE4NzUgOTUuMTkxNDA2IDIyLjI2OTUzMSA5Mi45MjU3ODEgMjEuMjUgODkuMTI4OTA2IEwgNC4xNTIzNDQgMjUuMzA0Njg4IEMgMy4xMzI4MTIgMjEuNTA3ODEyIDUuMzk0NTMxIDE3LjU4NTkzOCA5LjE5NTMxMiAxNi41NzAzMTIgTCA0OS4yODEyNSA1LjgyODEyNSBDIDUyLjU3ODEyNSA0Ljk0NTMxMiA1NS45NjA5MzggNi41MzEyNSA1Ny40NjQ4NDQgOS40NDUzMTIgTCA0Ny40NTcwMzEgOS40NDUzMTIgQyA0MS4zNzEwOTQgOS40NDUzMTIgMzYuNDE3OTY5IDE0LjM5ODQzOCAzNi40MTc5NjkgMjAuNDg0Mzc1IEwgMzYuNDE3OTY5IDg2LjU1ODU5NCBDIDM2LjQxNzk2OSA4OC41NTg1OTQgMzYuOTU3MDMxIDkwLjQzMzU5NCAzNy44OTA2MjUgOTIuMDU0Njg4IFogTSA5Ni4wOTM3NSA4Ni41NTg1OTQgQyA5Ni4wOTM3NSA5MC40OTIxODggOTIuODk0NTMxIDkzLjY5MTQwNiA4OC45NjA5MzggOTMuNjkxNDA2IEwgNDcuNDU3MDMxIDkzLjY5MTQwNiBDIDQzLjUyMzQzOCA5My42OTE0MDYgNDAuMzI0MjE5IDkwLjQ5MjE4OCA0MC4zMjQyMTkgODYuNTU4NTk0IEwgNDAuMzI0MjE5IDIwLjQ4NDM3NSBDIDQwLjMyNDIxOSAxNi41NTA3ODEgNDMuNTIzNDM4IDEzLjM1MTU2MiA0Ny40NTcwMzEgMTMuMzUxNTYyIEwgODguOTYwOTM4IDEzLjM1MTU2MiBDIDkyLjg5NDUzMSAxMy4zNTE1NjIgOTYuMDkzNzUgMTYuNTUwNzgxIDk2LjA5Mzc1IDIwLjQ4NDM3NSBaIE0gOTYuMDkzNzUgODYuNTU4NTk0IFwiLz5cbiAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiICBkPVwiTSA1NC4xMDE1NjIgNTMuMDkzNzUgTCA2MC4wNzAzMTIgNTcuNDEwMTU2IEwgNTcuNzg5MDYyIDY0LjM3ODkwNiBDIDU2LjkwNjI1IDY3LjA3NDIxOSA1OS45OTYwOTQgNjkuMzIwMzEyIDYyLjI4NTE1NiA2Ny42NDg0MzggTCA2OC4yMTA5MzggNjMuMzI0MjE5IEwgNzQuMTMyODEyIDY3LjY0ODQzOCBDIDc2LjQyMTg3NSA2OS4zMjAzMTIgNzkuNTExNzE5IDY3LjA3NDIxOSA3OC42Mjg5MDYgNjQuMzc4OTA2IEwgNzYuMzQ3NjU2IDU3LjQxMDE1NiBMIDgyLjMyMDMxMiA1My4wOTM3NSBDIDg0LjYxMzI4MSA1MS40MzM1OTQgODMuNDQxNDA2IDQ3LjgwNDY4OCA4MC42MDU0NjkgNDcuODA0Njg4IEwgNzMuMjQyMTg4IDQ3LjgwNDY4OCBMIDcwLjk4ODI4MSA0MC44Mzk4NDQgQyA3MC4xMTcxODggMzguMTQ0NTMxIDY2LjMwMDc4MSAzOC4xNDQ1MzEgNjUuNDI5Njg4IDQwLjgzOTg0NCBMIDYzLjE3OTY4OCA0Ny44MDQ2ODggTCA1NS44MTI1IDQ3LjgwNDY4OCBDIDUyLjk4MDQ2OSA0Ny44MDQ2ODggNTEuODA0Njg4IDUxLjQzMzU5NCA1NC4xMDE1NjIgNTMuMDkzNzUgWiBNIDU0LjEwMTU2MiA1My4wOTM3NSBcIi8+XG4gICAgICAgIGBcbiAgICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSxtREFBQUEsU0FBQTtBQUFBO0FBRUEsYUFBUyxPQUFPLFFBQVFDLFdBQVU7QUFDOUIsVUFBSyxPQUFPLFdBQVcsWUFBYyxPQUFPQSxjQUFhLFlBQWE7QUFDbEUsaUJBQVMsT0FBTyxRQUFRO0FBQ3BCLGNBQUksT0FBTyxlQUFlLEdBQUcsTUFBTSxNQUFNO0FBQ3JDLGdCQUFJQSxVQUFTLEtBQUssT0FBTyxHQUFHLENBQUMsTUFBTSxPQUFPO0FBQ3RDO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxJQUFBRCxRQUFPLFVBQVcsV0FBWTtBQUMxQixVQUFJLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxRQUNQLE9BQU8sQ0FBQztBQUFBLFFBQ1IsT0FBTyxDQUFDO0FBQUEsTUFDWjtBQUVBLFdBQUssT0FBTyxTQUFVLFFBQVEsUUFBUSxRQUFRO0FBQzFDLFlBQUssU0FBUyxNQUFNLE1BQU0sUUFBVSxXQUFXLE1BQU87QUFDbEQsbUJBQVM7QUFBQSxRQUNiO0FBRUEsaUJBQVMsV0FBVyxNQUFNO0FBRTFCLFlBQUksS0FBSyxNQUFNLGVBQWUsTUFBTSxNQUFNLE1BQU07QUFDNUMsZUFBSztBQUNMLGVBQUssTUFBTSxNQUFNLElBQUk7QUFBQSxZQUNqQixRQUFRO0FBQUEsWUFDUixVQUFVO0FBQUEsVUFDZDtBQUFBLFFBQ0o7QUFFQSxhQUFLLE1BQU0sTUFBTSxFQUFFLFlBQVk7QUFFL0IsWUFBSSxLQUFLLE1BQU0sZUFB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QUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsY0FBYztBQUFBLEVBQ2QsSUFBSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsVUFBVTtBQUFBLEVBQ1YsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsSUFBSTtBQUFBLEVBQ0osVUFBVTtB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LGVBQVcsR0FBRyxXQUFXO0FBQUEsRUFDN0I7QUFDQSxTQUFPLFFBQVEsTUFBTSxHQUFHLEVBQUU7QUFDOUI7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJjYWxsYmFjayIsICJhbHBoYSIsICJlc2MiLCAiU3RyaW5nIiwgInN0ciIsICJyZXBsYWNlIiwgIm1hcCIsICJzIiwgInNldElubmVySFRNTEF0dHIiLCAiRE9NQXR0cmlidXRlTmFtZXMiLCAic2FuaXRpemVkIiwgImgiLCAibmFtZSIsICJhdHRycyIsICJzdGFjayIsICJpIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAicHVzaCIsICJjaGlsZHJlbiIsICJyZXZlcnNlIiwgImVtcHR5VGFncyIsICJpbmRleE9mIiwgIl9faHRtbCIsICJjaGlsZCIsICJwb3AiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJuYW1lcyIsICJjYWxsYmFjayIsICJhcHAiLCAiaW1wb3J0X29ic2lkaWFuIiwgImgxIiwgImgyIiwgImFwcCIsICJyZXNvbHZlIiwgImNhbGxiYWNrIiwgInZhbHVlIiwgImgiLCAibGluayIsICJkZWNrIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfdmh0bWwiLCAiaCIsICJoIiwgImludGVycG9sYXRlIiwgInQiLCAiY29sb3IiLCAibm9vcCIsICJ1aWQiLCAiaWQiLCAiaXNOdWxsT3JVbmRlZiIsICJ2YWx1ZSIsICJpc0FycmF5IiwgIkFycmF5IiwgInR5cGUiLCAiT2JqZWN0IiwgInByb3RvdHlwZSIsICJ0b1N0cmluZyIsICJjYWxsIiwgInNsaWNlIiwgImlzT2JqZWN0IiwgImlzTnVtYmVyRmluaXRlIiwgIk51bWJlciIsICJpc0Zpbml0ZSIsICJmaW5pdGVPckRlZmF1bHQiLCAiZGVmYXVsdFZhbHVlIiwgInZhbHVlT3JEZWZhdWx0IiwgInRvUGVyY2VudGFnZSIsICJkaW1lbnNpb24iLCAiZW5kc1dpdGgiLCAicGFyc2VGbG9hdCIsICJ0b0RpbWVuc2lvbiIsICJjYWxsYmFjayIsICJmbiIsICJhcmdzIiwgInRoaXNBcmciLCAiYXBwbHkiLCAiZWFjaCIsICJsb29wYWJsZSIsICJyZXZlcnNlIiwgImkiLCAibGVuIiwgImtleXMiLCAibGVuZ3RoIiwgIl9lbGVtZW50c0VxdWFsIiwgImEwIiwgImExIiwgImlsZW4iLCAidjAiLCAidjEiLCAiZGF0YXNldEluZGV4IiwgImluZGV4IiwgImNsb25lIiwgInNvdXJjZSIsICJtYXAiLCAidGFyZ2V0IiwgImNyZWF0ZSIsICJrbGVuIiwgImsiLCAiaXNWYWxpZEtleSIsICJrZXkiLCAiaW5kZXhPZiIsICJfbWVyZ2VyIiwgIm9wdGlvbnMiLCAidHZhbCIsICJzdmFsIiwgIm1lcmdlIiwgInNvdXJjZXMiLCAibWVyZ2VyIiwgImN1cnJlbnQiLCAibWVyZ2VJZiIsICJfbWVyZ2VySWYiLCAiaGFzT3duUHJvcGVydHkiLCAia2V5UmVzb2x2ZXJzIiwgInYiLCAieCIsICJvIiwgInkiLCAiX3NwbGl0S2V5IiwgImtleSIsICJwYXJ0cyIsICJzcGxpdCIsICJrZXlzIiwgInRtcCIsICJwYXJ0IiwgImVuZHNXaXRoIiwgInNsaWNlIiwgInB1c2giLCAiX2dldEtleVJlc29sdmVyIiwgIm9iaiIsICJrIiwgInJlc29sdmVPYmplY3RLZXkiLCAicmVzb2x2ZXIiLCAiX2NhcGl0YWxpemUiLCAic3RyIiwgImNoYXJBdCIsICJ0b1VwcGVyQ2FzZSIsICJkZWZpbmVkIiwgInZhbHVlIiwgImlzRnVuY3Rpb24iLCAic2V0c0VxdWFsIiwgImEiLCAiYiIsICJzaXplIiwgIml0ZW0iLCAiaGFzIiwgIl9pc0NsaWNrRXZlbnQiLCAiZSIsICJ0eXBlIiwgIlBJIiwgIk1hdGgiLCAiVEFVIiwgIlBJVEFVIiwgIklORklOSVRZIiwgIk51bWJlciIsICJQT1NJVElWRV9JTkZJTklUWSIsICJSQURfUEVSX0RFRyIsICJIQUxGX1BJIiwgIlFVQVJURVJfUEkiLCAiVFdPX1RISVJEU19QSSIsICJsb2cxMCIsICJzaWduIiwgImFsbW9zdEVxdWFscyIsICJlcHNpbG9uIiwgImFicyIsICJuaWNlTnVtIiwgInJhbmdlIiwgInJvdW5kZWRSYW5nZSIsICJyb3VuZCIsICJuaWNlUmFuZ2UiLCAicG93IiwgImZsb29yIiwgImZyYWN0aW9uIiwgIm5pY2VGcmFjdGlvbiIsICJfZmFjdG9yaXplIiwgInJlc3VsdCIsICJzcXJ0IiwgImkiLCAic29ydCIsICJwb3AiLCAiaXNOdW1iZXIiLCAibiIsICJpc05hTiIsICJwYXJzZUZsb2F0IiwgImlzRmluaXRlIiwgImFsbW9zdFdob2xlIiwgInJvdW5kZWQiLCAiX3NldE1pbkFuZE1heEJ5S2V5IiwgImFycmF5IiwgInRhcmdldCIsICJwcm9wZXJ0eSIsICJpbGVuIiwgImxlbmd0aCIsICJtaW4iLCAibWF4IiwgInRvUmFkaWFucyIsICJkZWdyZWVzIiwgInRvRGVncmVlcyIsICJyYWRpYW5zIiwgIl9kZWNpbWFsUGxhY2VzIiwgImlzRmluaXRlTnVtYmVyIiwgInAiLCAiZ2V0QW5nbGVGcm9tUG9pbnQiLCAiY2VudHJlUG9pbnQiLCAiYW5nbGVQb2ludCIsICJkaXN0YW5jZUZyb21YQ2VudGVyIiwgImRpc3RhbmNlRnJvbVlDZW50ZXIiLCAicmFkaWFsRGlzdGFuY2VGcm9tQ2VudGVyIiwgImFuZ2xlIiwgImF0YW4yIiwgImRpc3RhbmNlIiwgImRpc3RhbmNlQmV0d2VlblBvaW50cyIsICJwdDEiLCAicHQyIiwgIl9ub3JtYWxpemVBbmdsZSIsICJhIiwgIlRBVSIsICJfYW5nbGVCZXR3ZWVuIiwgImFuZ2xlIiwgInN0YXJ0IiwgImVuZCIsICJzYW1lQW5nbGVJc0Z1bGxDaXJjbGUiLCAicyIsICJlIiwgImFuZ2xlVG9TdGFydCIsICJhbmdsZVRvRW5kIiwgInN0YXJ0VG9BbmdsZSIsICJlbmRUb0FuZ2xlIiwgIl9saW1pdFZhbHVlIiwgInZhbHVlIiwgIm1pbiIsICJtYXgiLCAiTWF0aCIsICJfaW50MTZSYW5nZSIsICJfaXNCZXR3ZWVuIiwgImVwc2lsb24iLCAiX2xvb2t1cCIsICJ0YWJsZSIsICJjbXAiLCAiaW5kZXgiLCAiaGkiLCAibGVuZ3RoIiwgImxvIiwgIm1pZCIsICJfbG9va3VwQnlLZXkiLCAia2V5IiwgImxhc3QiLCAidGkiLCAiX3Jsb29rdXBCeUtleSIsICJfZmlsdGVyQmV0d2VlbiIsICJ2YWx1ZXMiLCAic2xpY2UiLCAiYXJyYXlFdmVudHMiLCAibGlzdGVuQXJyYXlFdmVudHMiLCAiYXJyYXkiLCAibGlzdGVuZXIiLCAiX2NoYXJ0anMiLCAibGlzdGVuZXJzIiwgInB1c2giLCAiT2JqZWN0IiwgImRlZmluZVByb3BlcnR5IiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgImZvckVhY2giLCAibWV0aG9kIiwgIl9jYXBpdGFsaXplIiwgImJhc2UiLCAiYXJncyIsICJyZXMiLCAiYXBwbHkiLCAib2JqZWN0IiwgInVubGlzdGVuQXJyYXlFdmVudHMiLCAic3R1YiIsICJpbmRleE9mIiwgInNwbGljZSIsICJfYXJyYXlVbmlxdWUiLCAiaXRlbXMiLCAic2V0IiwgIlNldCIsICJpIiwgImlsZW4iLCAiYWRkIiwgInNpemUiLCAiQXJyYXkiLCAiZnJvbSIsICJyZXF1ZXN0QW5pbUZyYW1lIiwgIndpbmRvdyIsICJjYWxsYmFjayIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAidGhyb3R0bGVkIiwgImZuIiwgInRoaXNBcmciLCAiYXJnc1RvVXNlIiwgInRpY2tpbmciLCAiYXJncyIsICJjYWxsIiwgImFwcGx5IiwgImRlYm91bmNlIiwgImRlbGF5IiwgInRpbWVvdXQiLCAiY2xlYXJUaW1lb3V0IiwgInNldFRpbWVvdXQiLCAiX3RvTGVmdFJpZ2h0Q2VudGVyIiwgImFsaWduIiwgIl9hbGlnblN0YXJ0RW5kIiwgInN0YXJ0IiwgImVuZCIsICJfdGV4dFgiLCAibGVmdCIsICJyaWdodCIsICJydGwiLCAiY2hlY2siLCAiYXRFZGdlIiwgInQiLCAiZWxhc3RpY0luIiwgInMiLCAicCIsICJNYXRoIiwgInBvdyIsICJzaW4iLCAiVEFVIiwgImVsYXN0aWNPdXQiLCAiZWZmZWN0cyIsICJsaW5lYXIiLCAiZWFzZUluUXVhZCIsICJlYXNlT3V0UXVhZCIsICJlYXNlSW5PdXRRdWFkIiwgImVhc2VJbkN1YmljIiwgImVhc2VPdXRDdWJpYyIsICJlYXNlSW5PdXRDdWJpYyIsICJlYXNlSW5RdWFydCIsICJlYXNlT3V0UXVhcnQiLCAiZWFzZUluT3V0UXVhcnQiLCAiZWFzZUluUXVpbnQiLCAiZWFzZU91dFF1aW50IiwgImVhc2VJbk91dFF1aW50IiwgImVhc2VJblNpbmUiLCAiY29zIiwgIkhBTEZfUEkiLCAiZWFzZU91dFNpbmUiLCAiZWFzZUluT3V0U2luZSIsICJQSSIsICJlYXNlSW5FeHBvIiwgImVhc2VPdXRFeHBvIiwgImVhc2VJbk91dEV4cG8iLCAiZWFzZUluQ2lyYyIsICJzcXJ0IiwgImVhc2VPdXRDaXJjIiwgImVhc2VJbk91dENpcmMiLCAiZWFzZUluRWxhc3RpYyIsICJlYXNlT3V0RWxhc3RpYyIsICJlYXNlSW5PdXRFbGFzdGljIiwgImVhc2VJbkJhY2siLCAiZWFzZU91dEJhY2siLCAiZWFzZUluT3V0QmFjayIsICJlYXNlSW5Cb3VuY2UiLCAiZWFzZU91dEJvdW5jZSIsICJtIiwgImQiLCAiZWFzZUluT3V0Qm91bmNlIiwgImlzUGF0dGVybk9yR3JhZGllbnQiLCAidmFsdWUiLCAidHlwZSIsICJ0b1N0cmluZyIsICJjb2xvciIsICJDb2xvciIsICJnZXRIb3ZlckNvbG9yIiwgInNhdHVyYXRlIiwgImRhcmtlbiIsICJoZXhTdHJpbmciLCAibnVtYmVycyIsICJjb2xvcnMiLCAiYXBwbHlBbmltYXRpb25zRGVmYXVsdHMiLCAiZGVmYXVsdHMiLCAic2V0IiwgImRlbGF5IiwgInVuZGVmaW5lZCIsICJkdXJhdGlvbiIsICJlYXNpbmciLCAiZm4iLCAiZnJvbSIsICJsb29wIiwgInRvIiwgImRlc2NyaWJlIiwgIl9mYWxsYmFjayIsICJfaW5kZXhhYmxlIiwgIl9zY3JpcHRhYmxlIiwgIm5hbWUiLCAicHJvcGVydGllcyIsICJhY3RpdmUiLCAiYW5pbWF0aW9uIiwgInJlc2l6ZSIsICJzaG93IiwgImFuaW1hdGlvbnMiLCAidmlzaWJsZSIsICJoaWRlIiwgInYiLCAiYXBwbHlMYXlvdXRzRGVmYXVsdHMiLCAiYXV0b1BhZGRpbmciLCAicGFkZGluZyIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiLCAiaW50bENhY2hlIiwgIk1hcCIsICJnZXROdW1iZXJGb3JtYXQiLCAibG9jYWxlIiwgIm9wdGlvbnMiLCAiY2FjaGVLZXkiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiZm9ybWF0dGVyIiwgImdldCIsICJJbnRsIiwgIk51bWJlckZvcm1hdCIsICJmb3JtYXROdW1iZXIiLCAibnVtIiwgImZvcm1hdCIsICJmb3JtYXR0ZXJzIiwgInZhbHVlcyIsICJpc0FycmF5IiwgIm51bWVyaWMiLCAidGlja1ZhbHVlIiwgImluZGV4IiwgInRpY2tzIiwgImNoYXJ0IiwgIm5vdGF0aW9uIiwgImRlbHRhIiwgImxlbmd0aCIsICJtYXhUaWNrIiwgIm1heCIsICJhYnMiLCAiY2FsY3VsYXRlRGVsdGEiLCAibG9nRGVsdGEiLCAibG9nMTAiLCAibnVtRGVjaW1hbCIsICJtaW4iLCAiZmxvb3IiLCAibWluaW11bUZyYWN0aW9uRGlnaXRzIiwgIm1heGltdW1GcmFjdGlvbkRpZ2l0cyIsICJPYmplY3QiLCAiYXNzaWduIiwgImxvZ2FyaXRobWljIiwgInJlbWFpbiIsICJzaWduaWZpY2FuZCIsICJpbmNsdWRlcyIsICJjYWxsIiwgImFwcGx5U2NhbGVEZWZhdWx0cyIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJyZXZlcnNlIiwgImJlZ2luQXRaZXJvIiwgImJvdW5kcyIsICJncmFjZSIsICJncmlkIiwgImxpbmVXaWR0aCIsICJkcmF3T25DaGFydEFyZWEiLCAiZHJhd1RpY2tzIiwgInRpY2tMZW5ndGgiLCAidGlja1dpZHRoIiwgIl9jdHgiLCAidGlja0NvbG9yIiwgImJvcmRlciIsICJkYXNoIiwgImRhc2hPZmZzZXQiLCAid2lkdGgiLCAidGl0bGUiLCAidGV4dCIsICJtaW5Sb3RhdGlvbiIsICJtYXhSb3RhdGlvbiIsICJtaXJyb3IiLCAidGV4dFN0cm9rZVdpZHRoIiwgInRleHRTdHJva2VDb2xvciIsICJhdXRvU2tpcCIsICJhdXRvU2tpcFBhZGRpbmciLCAibGFiZWxPZmZzZXQiLCAiY2FsbGJhY2siLCAiVGlja3MiLCAibWlub3IiLCAibWFqb3IiLCAiYWxpZ24iLCAiY3Jvc3NBbGlnbiIsICJzaG93TGFiZWxCYWNrZHJvcCIsICJiYWNrZHJvcENvbG9yIiwgImJhY2tkcm9wUGFkZGluZyIsICJyb3V0ZSIsICJzdGFydHNXaXRoIiwgIm92ZXJyaWRlcyIsICJjcmVhdGUiLCAiZGVzY3JpcHRvcnMiLCAiZ2V0U2NvcGUiLCAibm9kZSIsICJrZXkiLCAia2V5cyIsICJzcGxpdCIsICJpIiwgIm4iLCAiayIsICJyb290IiwgInNjb3BlIiwgIm1lcmdlIiwgIkRlZmF1bHRzIiwgImNvbnN0cnVjdG9yIiwgIl9kZXNjcmlwdG9ycyIsICJfYXBwbGllcnMiLCAiYmFja2dyb3VuZENvbG9yIiwgImJvcmRlckNvbG9yIiwgImRhdGFzZXRzIiwgImRldmljZVBpeGVsUmF0aW8iLCAiY29udGV4dCIsICJwbGF0Zm9ybSIsICJnZXREZXZpY2VQaXhlbFJhdGlvIiwgImVsZW1lbnRzIiwgImV2ZW50cyIsICJmb250IiwgImZhbWlseSIsICJzaXplIiwgInN0eWxlIiwgImxpbmVIZWlnaHQiLCAid2VpZ2h0IiwgImhvdmVyIiwgImhvdmVyQmFja2dyb3VuZENvbG9yIiwgImN0eCIsICJob3ZlckJvcmRlckNvbG9yIiwgImhvdmVyQ29sb3IiLCAiaW5kZXhBeGlzIiwgImludGVyYWN0aW9uIiwgIm1vZGUiLCAiaW50ZXJzZWN0IiwgImluY2x1ZGVJbnZpc2libGUiLCAibWFpbnRhaW5Bc3BlY3RSYXRpbyIsICJvbkhvdmVyIiwgIm9uQ2xpY2siLCAicGFyc2luZyIsICJwbHVnaW5zIiwgInJlc3BvbnNpdmUiLCAic2NhbGUiLCAic2NhbGVzIiwgInNob3dMaW5lIiwgImRyYXdBY3RpdmVFbGVtZW50c09uVG9wIiwgImFwcGx5IiwgIm92ZXJyaWRlIiwgInRhcmdldFNjb3BlIiwgInRhcmdldE5hbWUiLCAic2NvcGVPYmplY3QiLCAidGFyZ2V0U2NvcGVPYmplY3QiLCAicHJpdmF0ZU5hbWUiLCAiZGVmaW5lUHJvcGVydGllcyIsICJ3cml0YWJsZSIsICJlbnVtZXJhYmxlIiwgImxvY2FsIiwgInRhcmdldCIsICJpc09iamVjdCIsICJ2YWx1ZU9yRGVmYXVsdCIsICJhcHBsaWVycyIsICJmb3JFYWNoIiwgInRvRm9udFN0cmluZyIsICJpc051bGxPclVuZGVmIiwgIl9tZWFzdXJlVGV4dCIsICJkYXRhIiwgImdjIiwgImxvbmdlc3QiLCAic3RyaW5nIiwgInRleHRXaWR0aCIsICJtZWFzdXJlVGV4dCIsICJwdXNoIiwgIl9sb25nZXN0VGV4dCIsICJhcnJheU9mVGhpbmdzIiwgImNhY2hlIiwgImdhcmJhZ2VDb2xsZWN0IiwgInNhdmUiLCAiaWxlbiIsICJqIiwgImpsZW4iLCAidGhpbmciLCAibmVzdGVkVGhpbmciLCAicmVzdG9yZSIsICJnY0xlbiIsICJzcGxpY2UiLCAiX2FsaWduUGl4ZWwiLCAicGl4ZWwiLCAiY3VycmVudERldmljZVBpeGVsUmF0aW8iLCAiaGFsZldpZHRoIiwgInJvdW5kIiwgImNsZWFyQ2FudmFzIiwgImNhbnZhcyIsICJnZXRDb250ZXh0IiwgInJlc2V0VHJhbnNmb3JtIiwgImNsZWFyUmVjdCIsICJoZWlnaHQiLCAiZHJhd1BvaW50IiwgIngiLCAieSIsICJkcmF3UG9pbnRMZWdlbmQiLCAidyIsICJ4T2Zmc2V0IiwgInlPZmZzZXQiLCAiY29ybmVyUmFkaXVzIiwgInhPZmZzZXRXIiwgInlPZmZzZXRXIiwgInBvaW50U3R5bGUiLCAicm90YXRpb24iLCAicmFkaXVzIiwgInJhZCIsICJSQURfUEVSX0RFRyIsICJ0cmFuc2xhdGUiLCAicm90YXRlIiwgImRyYXdJbWFnZSIsICJpc05hTiIsICJiZWdpblBhdGgiLCAiZWxsaXBzZSIsICJhcmMiLCAiY2xvc2VQYXRoIiwgIm1vdmVUbyIsICJUV09fVEhJUkRTX1BJIiwgImxpbmVUbyIsICJRVUFSVEVSX1BJIiwgIlNRUlQxXzIiLCAicmVjdCIsICJmaWxsIiwgImJvcmRlcldpZHRoIiwgInN0cm9rZSIsICJfaXNQb2ludEluQXJlYSIsICJwb2ludCIsICJhcmVhIiwgIm1hcmdpbiIsICJjbGlwQXJlYSIsICJjbGlwIiwgInVuY2xpcEFyZWEiLCAicmVuZGVyVGV4dCIsICJjdHgiLCAidGV4dCIsICJ4IiwgInkiLCAiZm9udCIsICJvcHRzIiwgImxpbmVzIiwgImlzQXJyYXkiLCAic3Ryb2tlIiwgInN0cm9rZVdpZHRoIiwgInN0cm9rZUNvbG9yIiwgImkiLCAibGluZSIsICJzYXZlIiwgInN0cmluZyIsICJzZXRSZW5kZXJPcHRzIiwgImxlbmd0aCIsICJiYWNrZHJvcCIsICJkcmF3QmFja2Ryb3AiLCAic3Ryb2tlU3R5bGUiLCAiaXNOdWxsT3JVbmRlZiIsICJsaW5lV2lkdGgiLCAic3Ryb2tlVGV4dCIsICJtYXhXaWR0aCIsICJmaWxsVGV4dCIsICJkZWNvcmF0ZVRleHQiLCAibGluZUhlaWdodCIsICJyZXN0b3JlIiwgInRyYW5zbGF0aW9uIiwgInRyYW5zbGF0ZSIsICJyb3RhdGlvbiIsICJyb3RhdGUiLCAiY29sb3IiLCAiZmlsbFN0eWxlIiwgInRleHRBbGlnbiIsICJ0ZXh0QmFzZWxpbmUiLCAic3RyaWtldGhyb3VnaCIsICJ1bmRlcmxpbmUiLCAibWV0cmljcyIsICJtZWFzdXJlVGV4dCIsICJsZWZ0IiwgImFjdHVhbEJvdW5kaW5nQm94TGVmdCIsICJyaWdodCIsICJhY3R1YWxCb3VuZGluZ0JveFJpZ2h0IiwgInRvcCIsICJhY3R1YWxCb3VuZGluZ0JveEFzY2VudCIsICJib3R0b20iLCAiYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50IiwgInlEZWNvcmF0aW9uIiwgImJlZ2luUGF0aCIsICJkZWNvcmF0aW9uV2lkdGgiLCAibW92ZVRvIiwgImxpbmVUbyIsICJvbGRDb2xvciIsICJmaWxsUmVjdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAiYWRkUm91bmRlZFJlY3RQYXRoIiwgInJlY3QiLCAidyIsICJoIiwgInJhZGl1cyIsICJhcmMiLCAidG9wTGVmdCIsICJIQUxGX1BJIiwgIlBJIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAidG9wUmlnaHQiLCAiTElORV9IRUlHSFQiLCAiRk9OVF9TVFlMRSIsICJ0b0xpbmVIZWlnaHQiLCAidmFsdWUiLCAic2l6ZSIsICJtYXRjaGVzIiwgIm1hdGNoIiwgIm51bWJlck9yWmVybyIsICJ2IiwgIl9yZWFkVmFsdWVUb1Byb3BzIiwgInByb3BzIiwgInJldCIsICJvYmpQcm9wcyIsICJpc09iamVjdCIsICJrZXlzIiwgIk9iamVjdCIsICJyZWFkIiwgInByb3AiLCAidmFsdWVPckRlZmF1bHQiLCAidG9UUkJMIiwgInRvVFJCTENvcm5lcnMiLCAidG9QYWRkaW5nIiwgIm9iaiIsICJ0b0ZvbnQiLCAib3B0aW9ucyIsICJmYWxsYmFjayIsICJkZWZhdWx0cyIsICJwYXJzZUludCIsICJzdHlsZSIsICJjb25zb2xlIiwgIndhcm4iLCAidW5kZWZpbmVkIiwgImZhbWlseSIsICJ3ZWlnaHQiLCAidG9Gb250U3RyaW5nIiwgInJlc29sdmUiLCAiaW5wdXRzIiwgImNvbnRleHQiLCAiaW5kZXgiLCAiaW5mbyIsICJjYWNoZWFibGUiLCAiaWxlbiIsICJfYWRkR3JhY2UiLCAibWlubWF4IiwgImdyYWNlIiwgImJlZ2luQXRaZXJvIiwgIm1pbiIsICJtYXgiLCAiY2hhbmdlIiwgInRvRGltZW5zaW9uIiwgImtlZXBaZXJvIiwgImFkZCIsICJNYXRoIiwgImFicyIsICJjcmVhdGVDb250ZXh0IiwgInBhcmVudENvbnRleHQiLCAiYXNzaWduIiwgImNyZWF0ZSIsICJfY3JlYXRlUmVzb2x2ZXIiLCAic2NvcGVzIiwgInByZWZpeGVzIiwgInJvb3RTY29wZXMiLCAiZ2V0VGFyZ2V0IiwgImRlZmluZWQiLCAiX3Jlc29sdmUiLCAiY2FjaGUiLCAiU3ltYm9sIiwgInRvU3RyaW5nVGFnIiwgIl9jYWNoZWFibGUiLCAiX3Njb3BlcyIsICJfcm9vdFNjb3BlcyIsICJfZmFsbGJhY2siLCAiX2dldFRhcmdldCIsICJvdmVycmlkZSIsICJzY29wZSIsICJQcm94eSIsICJkZWxldGVQcm9wZXJ0eSIsICJ0YXJnZXQiLCAiX2tleXMiLCAiZ2V0IiwgIl9jYWNoZWQiLCAiX3Jlc29sdmVXaXRoUHJlZml4ZXMiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIlJlZmxlY3QiLCAiZ2V0UHJvdG90eXBlT2YiLCAiaGFzIiwgImdldEtleXNGcm9tQWxsU2NvcGVzIiwgImluY2x1ZGVzIiwgIm93bktleXMiLCAic2V0IiwgInN0b3JhZ2UiLCAiX3N0b3JhZ2UiLCAiX2F0dGFjaENvbnRleHQiLCAicHJveHkiLCAic3ViUHJveHkiLCAiZGVzY3JpcHRvckRlZmF1bHRzIiwgIl9wcm94eSIsICJfY29udGV4dCIsICJfc3ViUHJveHkiLCAiX3N0YWNrIiwgIlNldCIsICJfZGVzY3JpcHRvcnMiLCAic2V0Q29udGV4dCIsICJyZWNlaXZlciIsICJfcmVzb2x2ZVdpdGhDb250ZXh0IiwgImFsbEtleXMiLCAiZW51bWVyYWJsZSIsICJjb25maWd1cmFibGUiLCAic2NyaXB0YWJsZSIsICJpbmRleGFibGUiLCAiX3NjcmlwdGFibGUiLCAiX2luZGV4YWJsZSIsICJfYWxsS2V5cyIsICJpc1NjcmlwdGFibGUiLCAiaXNGdW5jdGlvbiIsICJpc0luZGV4YWJsZSIsICJyZWFkS2V5IiwgInByZWZpeCIsICJuYW1lIiwgIl9jYXBpdGFsaXplIiwgIm5lZWRzU3ViUmVzb2x2ZXIiLCAiY29uc3RydWN0b3IiLCAicHJvdG90eXBlIiwgImhhc093blByb3BlcnR5IiwgImNhbGwiLCAiZGVzY3JpcHRvcnMiLCAiX3Jlc29sdmVTY3JpcHRhYmxlIiwgIl9yZXNvbHZlQXJyYXkiLCAiRXJyb3IiLCAiQXJyYXkiLCAiZnJvbSIsICJqb2luIiwgImRlbGV0ZSIsICJjcmVhdGVTdWJSZXNvbHZlciIsICJhcnIiLCAiZmlsdGVyIiwgInMiLCAiaXRlbSIsICJyZXNvbHZlciIsICJwdXNoIiwgInJlc29sdmVGYWxsYmFjayIsICJnZXRTY29wZSIsICJrZXkiLCAicGFyZW50IiwgInJlc29sdmVPYmplY3RLZXkiLCAiYWRkU2NvcGVzIiwgInBhcmVudFNjb3BlcyIsICJwYXJlbnRGYWxsYmFjayIsICJhbGxTY29wZXMiLCAiYWRkU2NvcGVzRnJvbUtleSIsICJzdWJHZXRUYXJnZXQiLCAicmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzIiwgImsiLCAic3RhcnRzV2l0aCIsICJFUFNJTE9OIiwgIk51bWJlciIsICJfaXNEb21TdXBwb3J0ZWQiLCAid2luZG93IiwgImRvY3VtZW50IiwgIl9nZXRQYXJlbnROb2RlIiwgImRvbU5vZGUiLCAicGFyZW50IiwgInBhcmVudE5vZGUiLCAidG9TdHJpbmciLCAiaG9zdCIsICJwYXJzZU1heFN0eWxlIiwgInN0eWxlVmFsdWUiLCAibm9kZSIsICJwYXJlbnRQcm9wZXJ0eSIsICJ2YWx1ZUluUGl4ZWxzIiwgInBhcnNlSW50IiwgImluZGV4T2YiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlbGVtZW50IiwgIm93bmVyRG9jdW1lbnQiLCAiZGVmYXVsdFZpZXciLCAiZ2V0U3R5bGUiLCAiZWwiLCAicHJvcGVydHkiLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJwb3NpdGlvbnMiLCAiZ2V0UG9zaXRpb25lZFN0eWxlIiwgInN0eWxlcyIsICJzdHlsZSIsICJzdWZmaXgiLCAicmVzdWx0IiwgImkiLCAicG9zIiwgInBhcnNlRmxvYXQiLCAid2lkdGgiLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAidG9wIiwgImJvdHRvbSIsICJ1c2VPZmZzZXRQb3MiLCAieCIsICJ5IiwgInRhcmdldCIsICJzaGFkb3dSb290IiwgImdldENhbnZhc1Bvc2l0aW9uIiwgImUiLCAiY2FudmFzIiwgInRvdWNoZXMiLCAic291cmNlIiwgImxlbmd0aCIsICJvZmZzZXRYIiwgIm9mZnNldFkiLCAiYm94IiwgInJlY3QiLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgImNsaWVudFgiLCAiY2xpZW50WSIsICJnZXRSZWxhdGl2ZVBvc2l0aW9uIiwgImV2ZW50IiwgImNoYXJ0IiwgImN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIiwgImJvcmRlckJveCIsICJib3hTaXppbmciLCAicGFkZGluZ3MiLCAiYm9yZGVycyIsICJ4T2Zmc2V0IiwgInlPZmZzZXQiLCAiTWF0aCIsICJyb3VuZCIsICJnZXRDb250YWluZXJTaXplIiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ1bmRlZmluZWQiLCAiY29udGFpbmVyIiwgImNsaWVudFdpZHRoIiwgImNsaWVudEhlaWdodCIsICJjb250YWluZXJTdHlsZSIsICJjb250YWluZXJCb3JkZXIiLCAiY29udGFpbmVyUGFkZGluZyIsICJJTkZJTklUWSIsICJyb3VuZDEiLCAidiIsICJnZXRNYXhpbXVtU2l6ZSIsICJiYldpZHRoIiwgImJiSGVpZ2h0IiwgImFzcGVjdFJhdGlvIiwgIm1hcmdpbnMiLCAiY29udGFpbmVyU2l6ZSIsICJtYXgiLCAibWluIiwgIm1haW50YWluSGVpZ2h0IiwgImZsb29yIiwgInJldGluYVNjYWxlIiwgImZvcmNlUmF0aW8iLCAiZm9yY2VTdHlsZSIsICJwaXhlbFJhdGlvIiwgImRldmljZUhlaWdodCIsICJkZXZpY2VXaWR0aCIsICJjdHgiLCAic2V0VHJhbnNmb3JtIiwgInN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAicGFzc2l2ZVN1cHBvcnRlZCIsICJvcHRpb25zIiwgInBhc3NpdmUiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgInJlYWRVc2VkU2l6ZSIsICJ2YWx1ZSIsICJtYXRjaGVzIiwgIm1hdGNoIiwgImdldFJpZ2h0VG9MZWZ0QWRhcHRlciIsICJyZWN0WCIsICJ3aWR0aCIsICJ4IiwgInNldFdpZHRoIiwgInciLCAidGV4dEFsaWduIiwgImFsaWduIiwgInhQbHVzIiwgInZhbHVlIiwgImxlZnRGb3JMdHIiLCAiaXRlbVdpZHRoIiwgImdldExlZnRUb1JpZ2h0QWRhcHRlciIsICJfaXRlbVdpZHRoIiwgImdldFJ0bEFkYXB0ZXIiLCAicnRsIiwgIm92ZXJyaWRlVGV4dERpcmVjdGlvbiIsICJjdHgiLCAiZGlyZWN0aW9uIiwgInN0eWxlIiwgIm9yaWdpbmFsIiwgImNhbnZhcyIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgImdldFByb3BlcnR5UHJpb3JpdHkiLCAic2V0UHJvcGVydHkiLCAicHJldlRleHREaXJlY3Rpb24iLCAicmVzdG9yZVRleHREaXJlY3Rpb24iLCAidW5kZWZpbmVkIiwgIkFuaW1hdG9yIiwgImNvbnN0cnVjdG9yIiwgIl9yZXF1ZXN0IiwgIl9jaGFydHMiLCAiTWFwIiwgIl9ydW5uaW5nIiwgIl9sYXN0RGF0ZSIsICJ1bmRlZmluZWQiLCAiX25vdGlmeSIsICJjaGFydCIsICJhbmltcyIsICJkYXRlIiwgInR5cGUiLCAiY2FsbGJhY2tzIiwgImxpc3RlbmVycyIsICJudW1TdGVwcyIsICJkdXJhdGlvbiIsICJmb3JFYWNoIiwgImZuIiwgImluaXRpYWwiLCAiY3VycmVudFN0ZXAiLCAiTWF0aCIsICJtaW4iLCAic3RhcnQiLCAiX3JlZnJlc2giLCAicmVxdWVzdEFuaW1GcmFtZSIsICJjYWxsIiwgIndpbmRvdyIsICJfdXBkYXRlIiwgIkRhdGUiLCAibm93IiwgInJlbWFpbmluZyIsICJydW5uaW5nIiwgIml0ZW1zIiwgImxlbmd0aCIsICJpIiwgImRyYXciLCAiaXRlbSIsICJfYWN0aXZlIiwgIl90b3RhbCIsICJ0aWNrIiwgInBvcCIsICJfZ2V0QW5pbXMiLCAiY2hhcnRzIiwgImdldCIsICJjb21wbGV0ZSIsICJwcm9ncmVzcyIsICJzZXQiLCAibGlzdGVuIiwgImV2ZW50IiwgImNiIiwgInB1c2giLCAiYWRkIiwgImhhcyIsICJyZWR1Y2UiLCAiYWNjIiwgImN1ciIsICJtYXgiLCAiX2R1cmF0aW9uIiwgInN0b3AiLCAiY2FuY2VsIiwgInJlbW92ZSIsICJkZWxldGUiLCAidHJhbnNwYXJlbnQiLCAiaW50ZXJwb2xhdG9ycyIsICJib29sZWFuIiwgImZyb20iLCAidG8iLCAiZmFjdG9yIiwgImNvbG9yIiwgImMwIiwgImhlbHBlcnNDb2xvciIsICJjMSIsICJ2YWxpZCIsICJtaXgiLCAiaGV4U3RyaW5nIiwgIm51bWJlciIsICJBbmltYXRpb24iLCAiY2ZnIiwgInRhcmdldCIsICJwcm9wIiwgImN1cnJlbnRWYWx1ZSIsICJyZXNvbHZlIiwgIl9mbiIsICJfZWFzaW5nIiwgImVmZmVjdHMiLCAiZWFzaW5nIiwgImxpbmVhciIsICJfc3RhcnQiLCAiZmxvb3IiLCAiZGVsYXkiLCAiX2xvb3AiLCAibG9vcCIsICJfdGFyZ2V0IiwgIl9wcm9wIiwgIl9mcm9tIiwgIl90byIsICJfcHJvbWlzZXMiLCAiYWN0aXZlIiwgInVwZGF0ZSIsICJlbGFwc2VkIiwgInJlbWFpbiIsICJ3YWl0IiwgInByb21pc2VzIiwgIlByb21pc2UiLCAicmVzIiwgInJlaiIsICJyZXNvbHZlZCIsICJtZXRob2QiLCAiQW5pbWF0aW9ucyIsICJjb25maWciLCAiX2NoYXJ0IiwgIl9wcm9wZXJ0aWVzIiwgImNvbmZpZ3VyZSIsICJpc09iamVjdCIsICJhbmltYXRpb25PcHRpb25zIiwgIk9iamVjdCIsICJrZXlzIiwgImRlZmF1bHRzIiwgImFuaW1hdGlvbiIsICJhbmltYXRlZFByb3BzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAia2V5IiwgIm9wdGlvbiIsICJpc0FycmF5IiwgInByb3BlcnRpZXMiLCAiX2FuaW1hdGVPcHRpb25zIiwgInZhbHVlcyIsICJuZXdPcHRpb25zIiwgIm9wdGlvbnMiLCAicmVzb2x2ZVRhcmdldE9wdGlvbnMiLCAiYW5pbWF0aW9ucyIsICJfY3JlYXRlQW5pbWF0aW9ucyIsICIkc2hhcmVkIiwgImF3YWl0QWxsIiwgIiRhbmltYXRpb25zIiwgInRoZW4iLCAicHJvcHMiLCAiY2hhckF0IiwgInZhbHVlIiwgInNpemUiLCAiYXNzaWduIiwgImFuaW1hdG9yIiwgImFuaW0iLCAiYWxsIiwgInNjYWxlQ2xpcCIsICJzY2FsZSIsICJhbGxvd2VkT3ZlcmZsb3ciLCAib3B0cyIsICJyZXZlcnNlIiwgImVuZCIsICJkZWZhdWx0Q2xpcCIsICJ4U2NhbGUiLCAieVNjYWxlIiwgIngiLCAieSIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiLCAidG9DbGlwIiwgInQiLCAiciIsICJiIiwgImwiLCAiZGlzYWJsZWQiLCAiZ2V0U29ydGVkRGF0YXNldEluZGljZXMiLCAiZmlsdGVyVmlzaWJsZSIsICJtZXRhc2V0cyIsICJfZ2V0U29ydGVkRGF0YXNldE1ldGFzIiwgImlsZW4iLCAiaW5kZXgiLCAiYXBwbHlTdGFjayIsICJzdGFjayIsICJkc0luZGV4IiwgInNpbmdsZU1vZGUiLCAibW9kZSIsICJkYXRhc2V0SW5kZXgiLCAib3RoZXJWYWx1ZSIsICJpc0Zpbml0ZSIsICJzaWduIiwgImNvbnZlcnRPYmplY3REYXRhVG9BcnJheSIsICJkYXRhIiwgImFkYXRhIiwgIkFycmF5IiwgImlzU3RhY2tlZCIsICJtZXRhIiwgInN0YWNrZWQiLCAiZ2V0U3RhY2tLZXkiLCAiaW5kZXhTY2FsZSIsICJ2YWx1ZVNjYWxlIiwgImlkIiwgImdldFVzZXJCb3VuZHMiLCAibWluRGVmaW5lZCIsICJtYXhEZWZpbmVkIiwgIk51bWJlciIsICJORUdBVElWRV9JTkZJTklUWSIsICJQT1NJVElWRV9JTkZJTklUWSIsICJnZXRPckNyZWF0ZVN0YWNrIiwgInN0YWNrcyIsICJzdGFja0tleSIsICJpbmRleFZhbHVlIiwgInN1YlN0YWNrIiwgImdldExhc3RJbmRleEluU3RhY2siLCAidlNjYWxlIiwgInBvc2l0aXZlIiwgImdldE1hdGNoaW5nVmlzaWJsZU1ldGFzIiwgInVwZGF0ZVN0YWNrcyIsICJjb250cm9sbGVyIiwgInBhcnNlZCIsICJfY2FjaGVkTWV0YSIsICJfc3RhY2tzIiwgImlTY2FsZSIsICJpQXhpcyIsICJheGlzIiwgInZBeGlzIiwgIml0ZW1TdGFja3MiLCAiX3RvcCIsICJfYm90dG9tIiwgInZpc3VhbFZhbHVlcyIsICJfdmlzdWFsVmFsdWVzIiwgImdldEZpcnN0U2NhbGVJZCIsICJzY2FsZXMiLCAiZmlsdGVyIiwgInNoaWZ0IiwgImNyZWF0ZURhdGFzZXRDb250ZXh0IiwgInBhcmVudCIsICJjcmVhdGVDb250ZXh0IiwgImRhdGFzZXQiLCAiY3JlYXRlRGF0YUNvbnRleHQiLCAiZWxlbWVudCIsICJkYXRhSW5kZXgiLCAicmF3IiwgImNsZWFyU3RhY2tzIiwgIl9wYXJzZWQiLCAiaXNEaXJlY3RVcGRhdGVNb2RlIiwgImNsb25lSWZOb3RTaGFyZWQiLCAiY2FjaGVkIiwgInNoYXJlZCIsICJjcmVhdGVTdGFjayIsICJjYW5TdGFjayIsICJoaWRkZW4iLCAiX3N0YWNrZWQiLCAiRGF0YXNldENvbnRyb2xsZXIiLCAiX2N0eCIsICJjdHgiLCAiX2NhY2hlZERhdGFPcHRzIiwgImdldE1ldGEiLCAiX3R5cGUiLCAiX3BhcnNpbmciLCAiX2RhdGEiLCAiX29iamVjdERhdGEiLCAiX3NoYXJlZE9wdGlvbnMiLCAiX2RyYXdTdGFydCIsICJfZHJhd0NvdW50IiwgImVuYWJsZU9wdGlvblNoYXJpbmciLCAic3VwcG9ydHNEZWNpbWF0aW9uIiwgIiRjb250ZXh0IiwgIl9zeW5jTGlzdCIsICJkYXRhc2V0RWxlbWVudFR5cGUiLCAiZGF0YUVsZW1lbnRUeXBlIiwgImluaXRpYWxpemUiLCAibGlua1NjYWxlcyIsICJhZGRFbGVtZW50cyIsICJmaWxsIiwgImlzUGx1Z2luRW5hYmxlZCIsICJjb25zb2xlIiwgIndhcm4iLCAidXBkYXRlSW5kZXgiLCAiZ2V0RGF0YXNldCIsICJjaG9vc2VJZCIsICJ4aWQiLCAieEF4aXNJRCIsICJ2YWx1ZU9yRGVmYXVsdCIsICJ5aWQiLCAieUF4aXNJRCIsICJyaWQiLCAickF4aXNJRCIsICJpbmRleEF4aXMiLCAiaWlkIiwgImlBeGlzSUQiLCAidmlkIiwgInZBeGlzSUQiLCAiZ2V0U2NhbGVGb3JJZCIsICJyU2NhbGUiLCAiZGF0YXNldHMiLCAiZ2V0RGF0YXNldE1ldGEiLCAic2NhbGVJRCIsICJfZ2V0T3RoZXJTY2FsZSIsICJyZXNldCIsICJfZGVzdHJveSIsICJ1bmxpc3RlbkFycmF5RXZlbnRzIiwgIl9kYXRhQ2hlY2siLCAiaXNFeHRlbnNpYmxlIiwgImxpc3RlbkFycmF5RXZlbnRzIiwgImJ1aWxkT3JVcGRhdGVFbGVtZW50cyIsICJyZXNldE5ld0VsZW1lbnRzIiwgInN0YWNrQ2hhbmdlZCIsICJvbGRTdGFja2VkIiwgIl9yZXN5bmNFbGVtZW50cyIsICJzY29wZUtleXMiLCAiZGF0YXNldFNjb3BlS2V5cyIsICJzY29wZXMiLCAiZ2V0T3B0aW9uU2NvcGVzIiwgImNyZWF0ZVJlc29sdmVyIiwgImdldENvbnRleHQiLCAicGFyc2luZyIsICJwYXJzZSIsICJjb3VudCIsICJzb3J0ZWQiLCAiX3NvcnRlZCIsICJwcmV2IiwgInBhcnNlQXJyYXlEYXRhIiwgInBhcnNlT2JqZWN0RGF0YSIsICJwYXJzZVByaW1pdGl2ZURhdGEiLCAiaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYiLCAibGFiZWxzIiwgImdldExhYmVscyIsICJzaW5nbGVTY2FsZSIsICJ4QXhpc0tleSIsICJ5QXhpc0tleSIsICJyZXNvbHZlT2JqZWN0S2V5IiwgImdldFBhcnNlZCIsICJnZXREYXRhRWxlbWVudCIsICJ1cGRhdGVSYW5nZUZyb21QYXJzZWQiLCAicmFuZ2UiLCAicGFyc2VkVmFsdWUiLCAiTmFOIiwgImdldE1pbk1heCIsICJvdGhlclNjYWxlIiwgIm90aGVyTWluIiwgIm90aGVyTWF4IiwgIl9za2lwIiwgImdldEFsbFBhcnNlZFZhbHVlcyIsICJnZXRNYXhPdmVyZmxvdyIsICJnZXRMYWJlbEFuZFZhbHVlIiwgImxhYmVsIiwgImdldExhYmVsRm9yVmFsdWUiLCAiX2NsaXAiLCAiY2xpcCIsICJlbGVtZW50cyIsICJhcmVhIiwgImNoYXJ0QXJlYSIsICJkcmF3QWN0aXZlRWxlbWVudHNPblRvcCIsICJnZXRTdHlsZSIsICJyZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zIiwgInJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMiLCAiY29udGV4dCIsICJfcmVzb2x2ZUVsZW1lbnRPcHRpb25zIiwgImVsZW1lbnRUeXBlIiwgImNhY2hlIiwgImNhY2hlS2V5IiwgInNoYXJpbmciLCAiZGVmaW5lZCIsICJkYXRhc2V0RWxlbWVudFNjb3BlS2V5cyIsICJwcmVmaXhlcyIsICJuYW1lcyIsICJyZXNvbHZlTmFtZWRPcHRpb25zIiwgImZyZWV6ZSIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAidHJhbnNpdGlvbiIsICJkYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzIiwgIl9jYWNoZWFibGUiLCAiZ2V0U2hhcmVkT3B0aW9ucyIsICJpbmNsdWRlT3B0aW9ucyIsICJzaGFyZWRPcHRpb25zIiwgIl9hbmltYXRpb25zRGlzYWJsZWQiLCAiX2dldFNoYXJlZE9wdGlvbnMiLCAiZmlyc3RPcHRzIiwgInByZXZpb3VzbHlTaGFyZWRPcHRpb25zIiwgInVwZGF0ZVNoYXJlZE9wdGlvbnMiLCAidXBkYXRlRWxlbWVudCIsICJfc2V0U3R5bGUiLCAicmVtb3ZlSG92ZXJTdHlsZSIsICJzZXRIb3ZlclN0eWxlIiwgIl9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSIsICJfc2V0RGF0YXNldEhvdmVyU3R5bGUiLCAiYXJnMSIsICJhcmcyIiwgIm51bU1ldGEiLCAibnVtRGF0YSIsICJfaW5zZXJ0RWxlbWVudHMiLCAiX3JlbW92ZUVsZW1lbnRzIiwgIm1vdmUiLCAiYXJyIiwgInVwZGF0ZUVsZW1lbnRzIiwgInJlbW92ZWQiLCAic3BsaWNlIiwgIl9zeW5jIiwgImFyZ3MiLCAiX2RhdGFDaGFuZ2VzIiwgIl9vbkRhdGFQdXNoIiwgImFyZ3VtZW50cyIsICJfb25EYXRhUG9wIiwgIl9vbkRhdGFTaGlmdCIsICJfb25EYXRhU3BsaWNlIiwgIm5ld0NvdW50IiwgIl9vbkRhdGFVbnNoaWZ0IiwgImdldEFsbFNjYWxlVmFsdWVzIiwgIl9jYWNoZSIsICIkYmFyIiwgInZpc2libGVNZXRhcyIsICJjb25jYXQiLCAiX2FycmF5VW5pcXVlIiwgInNvcnQiLCAiYSIsICJjb21wdXRlTWluU2FtcGxlU2l6ZSIsICJfbGVuZ3RoIiwgImN1cnIiLCAidXBkYXRlTWluQW5kUHJldiIsICJhYnMiLCAiZ2V0UGl4ZWxGb3JWYWx1ZSIsICJ0aWNrcyIsICJnZXRQaXhlbEZvclRpY2siLCAiY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzIiwgInJ1bGVyIiwgInN0YWNrQ291bnQiLCAidGhpY2tuZXNzIiwgImJhclRoaWNrbmVzcyIsICJyYXRpbyIsICJpc051bGxPclVuZGVmIiwgImNhdGVnb3J5UGVyY2VudGFnZSIsICJiYXJQZXJjZW50YWdlIiwgImNodW5rIiwgInBpeGVscyIsICJjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzIiwgIm5leHQiLCAicGVyY2VudCIsICJwYXJzZUZsb2F0QmFyIiwgImVudHJ5IiwgInN0YXJ0VmFsdWUiLCAiZW5kVmFsdWUiLCAiYmFyU3RhcnQiLCAiYmFyRW5kIiwgIl9jdXN0b20iLCAicGFyc2VWYWx1ZSIsICJwYXJzZUFycmF5T3JQcmltaXRpdmUiLCAiaXNGbG9hdEJhciIsICJjdXN0b20iLCAiYmFyU2lnbiIsICJhY3R1YWxCYXNlIiwgImlzSG9yaXpvbnRhbCIsICJib3JkZXJQcm9wcyIsICJob3Jpem9udGFsIiwgImJhc2UiLCAic2V0Qm9yZGVyU2tpcHBlZCIsICJlZGdlIiwgImJvcmRlclNraXBwZWQiLCAiZW5hYmxlQm9yZGVyUmFkaXVzIiwgInBhcnNlRWRnZSIsICJzd2FwIiwgInN0YXJ0RW5kIiwgIm9yaWciLCAidjEiLCAidjIiLCAidiIsICJzZXRJbmZsYXRlQW1vdW50IiwgImluZmxhdGVBbW91bnQiLCAiQmFyQ29udHJvbGxlciIsICJpQXhpc0tleSIsICJ2QXhpc0tleSIsICJvYmoiLCAiYmFycyIsICJnZXRCYXNlUGl4ZWwiLCAiX2dldFJ1bGVyIiwgInZwaXhlbHMiLCAiaGVhZCIsICJfY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMiLCAiaXBpeGVscyIsICJfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMiLCAiY2VudGVyIiwgImhlaWdodCIsICJ3aWR0aCIsICJfZ2V0U3RhY2tzIiwgImxhc3QiLCAiZ3JvdXBlZCIsICJza2lwTnVsbCIsICJ2YWwiLCAiaXNOYU4iLCAiaW5kZXhPZiIsICJfZ2V0U3RhY2tDb3VudCIsICJfZ2V0U3RhY2tJbmRleCIsICJuYW1lIiwgIl9zdGFydFBpeGVsIiwgIl9lbmRQaXhlbCIsICJiYXNlVmFsdWUiLCAibWluQmFyTGVuZ3RoIiwgImZsb2F0aW5nIiwgImdldERhdGFWaXNpYmlsaXR5IiwgInN0YXJ0UGl4ZWwiLCAiZ2V0UGl4ZWxGb3JEZWNpbWFsIiwgImVuZFBpeGVsIiwgImdldFZhbHVlRm9yUGl4ZWwiLCAiaGFsZkdyaWQiLCAiZ2V0TGluZVdpZHRoRm9yVmFsdWUiLCAibWF4QmFyVGhpY2tuZXNzIiwgIkluZmluaXR5IiwgInN0YWNrSW5kZXgiLCAicmVjdHMiLCAibnVtYmVycyIsICJvdmVycmlkZXMiLCAiX2luZGV4XyIsICJvZmZzZXQiLCAiZ3JpZCIsICJfdmFsdWVfIiwgImJlZ2luQXRaZXJvIiwgImdldFJhdGlvQW5kT2Zmc2V0IiwgInJvdGF0aW9uIiwgImNpcmN1bWZlcmVuY2UiLCAiY3V0b3V0IiwgInJhdGlvWCIsICJyYXRpb1kiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgIlRBVSIsICJzdGFydEFuZ2xlIiwgImVuZEFuZ2xlIiwgInN0YXJ0WCIsICJNYXRoIiwgImNvcyIsICJzdGFydFkiLCAic2luIiwgImVuZFgiLCAiZW5kWSIsICJjYWxjTWF4IiwgImFuZ2xlIiwgImEiLCAiYiIsICJfYW5nbGVCZXR3ZWVuIiwgIm1heCIsICJjYWxjTWluIiwgIm1pbiIsICJtYXhYIiwgIm1heFkiLCAiSEFMRl9QSSIsICJtaW5YIiwgIlBJIiwgIm1pblkiLCAiRG91Z2hudXRDb250cm9sbGVyIiwgIkRhdGFzZXRDb250cm9sbGVyIiwgImNvbnN0cnVjdG9yIiwgImNoYXJ0IiwgImRhdGFzZXRJbmRleCIsICJlbmFibGVPcHRpb25TaGFyaW5nIiwgImlubmVyUmFkaXVzIiwgInVuZGVmaW5lZCIsICJvdXRlclJhZGl1cyIsICJsaW5rU2NhbGVzIiwgInBhcnNlIiwgInN0YXJ0IiwgImNvdW50IiwgImRhdGEiLCAiZ2V0RGF0YXNldCIsICJtZXRhIiwgIl9jYWNoZWRNZXRhIiwgIl9wYXJzaW5nIiwgIl9wYXJzZWQiLCAiZ2V0dGVyIiwgImkiLCAiaXNPYmplY3QiLCAia2V5IiwgInJlc29sdmVPYmplY3RLZXkiLCAiaWxlbiIsICJfZ2V0Um90YXRpb24iLCAidG9SYWRpYW5zIiwgIm9wdGlvbnMiLCAiX2dldENpcmN1bWZlcmVuY2UiLCAiX2dldFJvdGF0aW9uRXh0ZW50cyIsICJkYXRhc2V0cyIsICJsZW5ndGgiLCAiaXNEYXRhc2V0VmlzaWJsZSIsICJnZXREYXRhc2V0TWV0YSIsICJ0eXBlIiwgIl90eXBlIiwgImNvbnRyb2xsZXIiLCAidXBkYXRlIiwgIm1vZGUiLCAiY2hhcnRBcmVhIiwgImFyY3MiLCAic3BhY2luZyIsICJnZXRNYXhCb3JkZXJXaWR0aCIsICJnZXRNYXhPZmZzZXQiLCAibWF4U2l6ZSIsICJ3aWR0aCIsICJoZWlnaHQiLCAidG9QZXJjZW50YWdlIiwgImNoYXJ0V2VpZ2h0IiwgIl9nZXRSaW5nV2VpZ2h0IiwgImluZGV4IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJtYXhSYWRpdXMiLCAidG9EaW1lbnNpb24iLCAicmFkaXVzIiwgInJhZGl1c0xlbmd0aCIsICJfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCIsICJ0b3RhbCIsICJjYWxjdWxhdGVUb3RhbCIsICJfZ2V0UmluZ1dlaWdodE9mZnNldCIsICJ1cGRhdGVFbGVtZW50cyIsICJfY2lyY3VtZmVyZW5jZSIsICJyZXNldCIsICJvcHRzIiwgImFuaW1hdGlvbiIsICJhbmltYXRlUm90YXRlIiwgImdldERhdGFWaXNpYmlsaXR5IiwgImhpZGRlbiIsICJjYWxjdWxhdGVDaXJjdW1mZXJlbmNlIiwgImFuaW1hdGlvbk9wdHMiLCAiY2VudGVyWCIsICJsZWZ0IiwgInJpZ2h0IiwgImNlbnRlclkiLCAidG9wIiwgImJvdHRvbSIsICJhbmltYXRlU2NhbGUiLCAic2hhcmVkT3B0aW9ucyIsICJpbmNsdWRlT3B0aW9ucyIsICJfZ2V0U2hhcmVkT3B0aW9ucyIsICJhcmMiLCAicHJvcGVydGllcyIsICJ4IiwgInkiLCAicmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyIsICJhY3RpdmUiLCAidXBkYXRlRWxlbWVudCIsICJtZXRhRGF0YSIsICJ2YWx1ZSIsICJpc05hTiIsICJhYnMiLCAiZ2V0TGFiZWxBbmRWYWx1ZSIsICJsYWJlbHMiLCAiZm9ybWF0TnVtYmVyIiwgImxvY2FsZSIsICJsYWJlbCIsICJib3JkZXJBbGlnbiIsICJib3JkZXJXaWR0aCIsICJob3ZlckJvcmRlcldpZHRoIiwgIm9mZnNldCIsICJob3Zlck9mZnNldCIsICJyaW5nV2VpZ2h0T2Zmc2V0IiwgInZhbHVlT3JEZWZhdWx0IiwgIndlaWdodCIsICJpZCIsICJkZWZhdWx0cyIsICJkYXRhc2V0RWxlbWVudFR5cGUiLCAiZGF0YUVsZW1lbnRUeXBlIiwgImFuaW1hdGlvbnMiLCAibnVtYmVycyIsICJpbmRleEF4aXMiLCAiZGVzY3JpcHRvcnMiLCAiX3NjcmlwdGFibGUiLCAibmFtZSIsICJfaW5kZXhhYmxlIiwgIm92ZXJyaWRlcyIsICJhc3BlY3RSYXRpbyIsICJwbHVnaW5zIiwgImxlZ2VuZCIsICJnZW5lcmF0ZUxhYmVscyIsICJwb2ludFN0eWxlIiwgImNvbG9yIiwgIm1hcCIsICJzdHlsZSIsICJnZXRTdHlsZSIsICJ0ZXh0IiwgImZpbGxTdHlsZSIsICJiYWNrZ3JvdW5kQ29sb3IiLCAic3Ryb2tlU3R5bGUiLCAiYm9yZGVyQ29sb3IiLCAiZm9udENvbG9yIiwgImxpbmVXaWR0aCIsICJvbkNsaWNrIiwgImUiLCAibGVnZW5kSXRlbSIsICJ0b2dnbGVEYXRhVmlzaWJpbGl0eSIsICJQaWVDb250cm9sbGVyIiwgIkRvdWdobnV0Q29udHJvbGxlciIsICJpZCIsICJkZWZhdWx0cyIsICJjdXRvdXQiLCAicm90YXRpb24iLCAiY2lyY3VtZmVyZW5jZSIsICJyYWRpdXMiLCAiYWJzdHJhY3QiLCAiRXJyb3IiLCAiRGF0ZUFkYXB0ZXJCYXNlIiwgIm92ZXJyaWRlIiwgIm1lbWJlcnMiLCAiT2JqZWN0IiwgImFzc2lnbiIsICJwcm90b3R5cGUiLCAiY29uc3RydWN0b3IiLCAib3B0aW9ucyIsICJpbml0IiwgImZvcm1hdHMiLCAicGFyc2UiLCAiZm9ybWF0IiwgImFkZCIsICJkaWZmIiwgInN0YXJ0T2YiLCAiZW5kT2YiLCAiX2RhdGUiLCAiYmluYXJ5U2VhcmNoIiwgIm1ldGFzZXQiLCAiYXhpcyIsICJ2YWx1ZSIsICJpbnRlcnNlY3QiLCAiY29udHJvbGxlciIsICJkYXRhIiwgIl9zb3J0ZWQiLCAiaVNjYWxlIiwgIl9jYWNoZWRNZXRhIiwgImxlbmd0aCIsICJsb29rdXBNZXRob2QiLCAiX3JldmVyc2VQaXhlbHMiLCAiX3Jsb29rdXBCeUtleSIsICJfbG9va3VwQnlLZXkiLCAiX3NoYXJlZE9wdGlvbnMiLCAiZWwiLCAicmFuZ2UiLCAiZ2V0UmFuZ2UiLCAic3RhcnQiLCAiZW5kIiwgImxvIiwgImhpIiwgImV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyIsICJjaGFydCIsICJwb3NpdGlvbiIsICJoYW5kbGVyIiwgIm1ldGFzZXRzIiwgImdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMiLCAiaSIsICJpbGVuIiwgImluZGV4IiwgImoiLCAiZWxlbWVudCIsICJza2lwIiwgImdldERpc3RhbmNlTWV0cmljRm9yQXhpcyIsICJ1c2VYIiwgImluZGV4T2YiLCAidXNlWSIsICJwdDEiLCAicHQyIiwgImRlbHRhWCIsICJNYXRoIiwgImFicyIsICJ4IiwgImRlbHRhWSIsICJ5IiwgInNxcnQiLCAicG93IiwgImdldEludGVyc2VjdEl0ZW1zIiwgInVzZUZpbmFsUG9zaXRpb24iLCAiaW5jbHVkZUludmlzaWJsZSIsICJpdGVtcyIsICJpc1BvaW50SW5BcmVhIiwgImV2YWx1YXRpb25GdW5jIiwgImRhdGFzZXRJbmRleCIsICJfaXNQb2ludEluQXJlYSIsICJjaGFydEFyZWEiLCAiaW5SYW5nZSIsICJwdXNoIiwgImdldE5lYXJlc3RSYWRpYWxJdGVtcyIsICJzdGFydEFuZ2xlIiwgImVuZEFuZ2xlIiwgImdldFByb3BzIiwgImFuZ2xlIiwgImdldEFuZ2xlRnJvbVBvaW50IiwgIl9hbmdsZUJldHdlZW4iLCAiZ2V0TmVhcmVzdENhcnRlc2lhbkl0ZW1zIiwgImRpc3RhbmNlTWV0cmljIiwgIm1pbkRpc3RhbmNlIiwgIk51bWJlciIsICJQT1NJVElWRV9JTkZJTklUWSIsICJjZW50ZXIiLCAiZ2V0Q2VudGVyUG9pbnQiLCAicG9pbnRJbkFyZWEiLCAiZGlzdGFuY2UiLCAiZ2V0TmVhcmVzdEl0ZW1zIiwgImdldEF4aXNJdGVtcyIsICJyYW5nZU1ldGhvZCIsICJpbnRlcnNlY3RzSXRlbSIsICJtb2RlcyIsICJlIiwgImdldFJlbGF0aXZlUG9zaXRpb24iLCAiZWxlbWVudHMiLCAiZm9yRWFjaCIsICJtZXRhIiwgImRhdGFzZXQiLCAiZ2V0RGF0YXNldE1ldGEiLCAicG9pbnQiLCAibmVhcmVzdCIsICJTVEFUSUNfUE9TSVRJT05TIiwgImZpbHRlckJ5UG9zaXRpb24iLCAiYXJyYXkiLCAiZmlsdGVyIiwgInYiLCAicG9zIiwgImZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyIsICJib3giLCAic29ydEJ5V2VpZ2h0IiwgInJldmVyc2UiLCAic29ydCIsICJhIiwgImIiLCAidjAiLCAidjEiLCAid2VpZ2h0IiwgIndyYXBCb3hlcyIsICJib3hlcyIsICJsYXlvdXRCb3hlcyIsICJzdGFjayIsICJzdGFja1dlaWdodCIsICJob3Jpem9udGFsIiwgImlzSG9yaXpvbnRhbCIsICJidWlsZFN0YWNrcyIsICJsYXlvdXRzIiwgInN0YWNrcyIsICJ3cmFwIiwgImluY2x1ZGVzIiwgIl9zdGFjayIsICJjb3VudCIsICJwbGFjZWQiLCAic2l6ZSIsICJzZXRMYXlvdXREaW1zIiwgInBhcmFtcyIsICJ2Qm94TWF4V2lkdGgiLCAiaEJveE1heEhlaWdodCIsICJsYXlvdXQiLCAiZnVsbFNpemUiLCAiZmFjdG9yIiwgIndpZHRoIiwgImF2YWlsYWJsZVdpZHRoIiwgImhlaWdodCIsICJhdmFpbGFibGVIZWlnaHQiLCAiYnVpbGRMYXlvdXRCb3hlcyIsICJsZWZ0IiwgInJpZ2h0IiwgInRvcCIsICJib3R0b20iLCAiY2VudGVySG9yaXpvbnRhbCIsICJjZW50ZXJWZXJ0aWNhbCIsICJsZWZ0QW5kVG9wIiwgImNvbmNhdCIsICJyaWdodEFuZEJvdHRvbSIsICJ2ZXJ0aWNhbCIsICJnZXRDb21iaW5lZE1heCIsICJtYXhQYWRkaW5nIiwgIm1heCIsICJ1cGRhdGVNYXhQYWRkaW5nIiwgImJveFBhZGRpbmciLCAidXBkYXRlRGltcyIsICJpc09iamVjdCIsICJnZXRQYWRkaW5nIiwgIm5ld1dpZHRoIiwgIm91dGVyV2lkdGgiLCAibmV3SGVpZ2h0IiwgIm91dGVySGVpZ2h0IiwgIndpZHRoQ2hhbmdlZCIsICJ3IiwgImhlaWdodENoYW5nZWQiLCAiaCIsICJzYW1lIiwgIm90aGVyIiwgImhhbmRsZU1heFBhZGRpbmciLCAidXBkYXRlUG9zIiwgImNoYW5nZSIsICJnZXRNYXJnaW5zIiwgIm1hcmdpbkZvclBvc2l0aW9ucyIsICJwb3NpdGlvbnMiLCAibWFyZ2luIiwgImZpdEJveGVzIiwgInJlZml0Qm94ZXMiLCAicmVmaXQiLCAiY2hhbmdlZCIsICJ1cGRhdGUiLCAic2V0Qm94RGltcyIsICJwbGFjZUJveGVzIiwgInVzZXJQYWRkaW5nIiwgInBhZGRpbmciLCAiZGVmaW5lZCIsICJhZGRCb3giLCAiaXRlbSIsICJfbGF5ZXJzIiwgInoiLCAiZHJhdyIsICJyZW1vdmVCb3giLCAibGF5b3V0SXRlbSIsICJzcGxpY2UiLCAiY29uZmlndXJlIiwgIm1pblBhZGRpbmciLCAidG9QYWRkaW5nIiwgInZlcnRpY2FsQm94ZXMiLCAiaG9yaXpvbnRhbEJveGVzIiwgImVhY2giLCAiYmVmb3JlTGF5b3V0IiwgInZpc2libGVWZXJ0aWNhbEJveENvdW50IiwgInJlZHVjZSIsICJ0b3RhbCIsICJkaXNwbGF5IiwgImZyZWV6ZSIsICJCYXNlUGxhdGZvcm0iLCAiYWNxdWlyZUNvbnRleHQiLCAiY2FudmFzIiwgImFzcGVjdFJhdGlvIiwgInJlbGVhc2VDb250ZXh0IiwgImNvbnRleHQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJ0eXBlIiwgImxpc3RlbmVyIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsICJnZXRNYXhpbXVtU2l6ZSIsICJmbG9vciIsICJpc0F0dGFjaGVkIiwgInVwZGF0ZUNvbmZpZyIsICJjb25maWciLCAiQmFzaWNQbGF0Zm9ybSIsICJnZXRDb250ZXh0IiwgImFuaW1hdGlvbiIsICJFWFBBTkRPX0tFWSIsICJFVkVOVF9UWVBFUyIsICJ0b3VjaHN0YXJ0IiwgInRvdWNobW92ZSIsICJ0b3VjaGVuZCIsICJwb2ludGVyZW50ZXIiLCAicG9pbnRlcmRvd24iLCAicG9pbnRlcm1vdmUiLCAicG9pbnRlcnVwIiwgInBvaW50ZXJsZWF2ZSIsICJwb2ludGVyb3V0IiwgImlzTnVsbE9yRW1wdHkiLCAiaW5pdENhbnZhcyIsICJzdHlsZSIsICJyZW5kZXJIZWlnaHQiLCAiZ2V0QXR0cmlidXRlIiwgInJlbmRlcldpZHRoIiwgImluaXRpYWwiLCAiYm94U2l6aW5nIiwgImRpc3BsYXlXaWR0aCIsICJyZWFkVXNlZFNpemUiLCAidW5kZWZpbmVkIiwgImRpc3BsYXlIZWlnaHQiLCAiZXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAic3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyIsICJwYXNzaXZlIiwgImFkZExpc3RlbmVyIiwgIm5vZGUiLCAicmVtb3ZlTGlzdGVuZXIiLCAiZnJvbU5hdGl2ZUV2ZW50IiwgImV2ZW50IiwgIm5hdGl2ZSIsICJub2RlTGlzdENvbnRhaW5zIiwgIm5vZGVMaXN0IiwgImNvbnRhaW5zIiwgImNyZWF0ZUF0dGFjaE9ic2VydmVyIiwgIm9ic2VydmVyIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZW50cmllcyIsICJ0cmlnZ2VyIiwgImVudHJ5IiwgImFkZGVkTm9kZXMiLCAicmVtb3ZlZE5vZGVzIiwgIm9ic2VydmUiLCAiZG9jdW1lbnQiLCAiY2hpbGRMaXN0IiwgInN1YnRyZWUiLCAiY3JlYXRlRGV0YWNoT2JzZXJ2ZXIiLCAiZHJwTGlzdGVuaW5nQ2hhcnRzIiwgIk1hcCIsICJvbGREZXZpY2VQaXhlbFJhdGlvIiwgIm9uV2luZG93UmVzaXplIiwgImRwciIsICJ3aW5kb3ciLCAiZGV2aWNlUGl4ZWxSYXRpbyIsICJyZXNpemUiLCAiY3VycmVudERldmljZVBpeGVsUmF0aW8iLCAibGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMiLCAic2V0IiwgInVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMiLCAiZGVsZXRlIiwgImNyZWF0ZVJlc2l6ZU9ic2VydmVyIiwgImNvbnRhaW5lciIsICJfZ2V0UGFyZW50Tm9kZSIsICJ0aHJvdHRsZWQiLCAiY2xpZW50V2lkdGgiLCAiUmVzaXplT2JzZXJ2ZXIiLCAiY29udGVudFJlY3QiLCAicmVsZWFzZU9ic2VydmVyIiwgImRpc2Nvbm5lY3QiLCAiY3JlYXRlUHJveHlBbmRMaXN0ZW4iLCAicHJveHkiLCAiY3R4IiwgIkRvbVBsYXRmb3JtIiwgInByb3AiLCAiaXNOdWxsT3JVbmRlZiIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImtleXMiLCAia2V5IiwgInByb3hpZXMiLCAiJHByb3hpZXMiLCAiaGFuZGxlcnMiLCAiYXR0YWNoIiwgImRldGFjaCIsICJpc0Nvbm5lY3RlZCIsICJfZGV0ZWN0UGxhdGZvcm0iLCAiX2lzRG9tU3VwcG9ydGVkIiwgIk9mZnNjcmVlbkNhbnZhcyIsICJFbGVtZW50IiwgImFjdGl2ZSIsICJ0b29sdGlwUG9zaXRpb24iLCAiaGFzVmFsdWUiLCAiaXNOdW1iZXIiLCAicHJvcHMiLCAiZmluYWwiLCAiYW5pbXMiLCAiJGFuaW1hdGlvbnMiLCAicmV0IiwgIl90byIsICJkZWZhdWx0cyIsICJkZWZhdWx0Um91dGVzIiwgImF1dG9Ta2lwIiwgInNjYWxlIiwgInRpY2tzIiwgInRpY2tPcHRzIiwgImRldGVybWluZWRNYXhUaWNrcyIsICJkZXRlcm1pbmVNYXhUaWNrcyIsICJ0aWNrc0xpbWl0IiwgIm1pbiIsICJtYXhUaWNrc0xpbWl0IiwgIm1ham9ySW5kaWNlcyIsICJtYWpvciIsICJlbmFibGVkIiwgImdldE1ham9ySW5kaWNlcyIsICJudW1NYWpvckluZGljZXMiLCAiZmlyc3QiLCAibGFzdCIsICJuZXdUaWNrcyIsICJza2lwTWFqb3JzIiwgInNwYWNpbmciLCAiY2FsY3VsYXRlU3BhY2luZyIsICJhdmdNYWpvclNwYWNpbmciLCAicm91bmQiLCAib2Zmc2V0IiwgInRpY2tMZW5ndGgiLCAiX3RpY2tTaXplIiwgIm1heFNjYWxlIiwgIl9sZW5ndGgiLCAibWF4Q2hhcnQiLCAiX21heExlbmd0aCIsICJldmVuTWFqb3JTcGFjaW5nIiwgImdldEV2ZW5TcGFjaW5nIiwgImZhY3RvcnMiLCAiX2ZhY3Rvcml6ZSIsICJyZXN1bHQiLCAibmV4dCIsICJjZWlsIiwgIm1ham9yU3RhcnQiLCAibWFqb3JFbmQiLCAidmFsdWVPckRlZmF1bHQiLCAiYXJyIiwgImxlbiIsICJyZXZlcnNlQWxpZ24iLCAiYWxpZ24iLCAib2Zmc2V0RnJvbUVkZ2UiLCAiZWRnZSIsICJnZXRUaWNrc0xpbWl0IiwgInRpY2tzTGVuZ3RoIiwgInNhbXBsZSIsICJudW1JdGVtcyIsICJpbmNyZW1lbnQiLCAiZ2V0UGl4ZWxGb3JHcmlkTGluZSIsICJvZmZzZXRHcmlkTGluZXMiLCAidmFsaWRJbmRleCIsICJfc3RhcnRQaXhlbCIsICJfZW5kUGl4ZWwiLCAiZXBzaWxvbiIsICJsaW5lVmFsdWUiLCAiZ2V0UGl4ZWxGb3JUaWNrIiwgImdhcmJhZ2VDb2xsZWN0IiwgImNhY2hlcyIsICJjYWNoZSIsICJnYyIsICJnY0xlbiIsICJnZXRUaWNrTWFya0xlbmd0aCIsICJkcmF3VGlja3MiLCAiZ2V0VGl0bGVIZWlnaHQiLCAiZmFsbGJhY2siLCAiZm9udCIsICJ0b0ZvbnQiLCAibGluZXMiLCAiaXNBcnJheSIsICJ0ZXh0IiwgImxpbmVIZWlnaHQiLCAiY3JlYXRlU2NhbGVDb250ZXh0IiwgInBhcmVudCIsICJjcmVhdGVDb250ZXh0IiwgImNyZWF0ZVRpY2tDb250ZXh0IiwgInRpY2siLCAidGl0bGVBbGlnbiIsICJfdG9MZWZ0UmlnaHRDZW50ZXIiLCAidGl0bGVBcmdzIiwgInNjYWxlcyIsICJyb3RhdGlvbiIsICJtYXhXaWR0aCIsICJ0aXRsZVgiLCAidGl0bGVZIiwgIl9hbGlnblN0YXJ0RW5kIiwgInBvc2l0aW9uQXhpc0lEIiwgImdldFBpeGVsRm9yVmFsdWUiLCAiSEFMRl9QSSIsICJTY2FsZSIsICJjZmciLCAiaWQiLCAiX21hcmdpbnMiLCAibWF4SGVpZ2h0IiwgInBhZGRpbmdUb3AiLCAicGFkZGluZ0JvdHRvbSIsICJwYWRkaW5nTGVmdCIsICJwYWRkaW5nUmlnaHQiLCAibGFiZWxSb3RhdGlvbiIsICJfcmFuZ2UiLCAiX2dyaWRMaW5lSXRlbXMiLCAiX2xhYmVsSXRlbXMiLCAiX2xhYmVsU2l6ZXMiLCAiX2xvbmdlc3RUZXh0Q2FjaGUiLCAiX3VzZXJNYXgiLCAiX3VzZXJNaW4iLCAiX3N1Z2dlc3RlZE1heCIsICJfc3VnZ2VzdGVkTWluIiwgIl90aWNrc0xlbmd0aCIsICJfYm9yZGVyVmFsdWUiLCAiX2NhY2hlIiwgIl9kYXRhTGltaXRzQ2FjaGVkIiwgIiRjb250ZXh0IiwgInNldENvbnRleHQiLCAic3VnZ2VzdGVkTWluIiwgInN1Z2dlc3RlZE1heCIsICJyYXciLCAiZ2V0VXNlckJvdW5kcyIsICJmaW5pdGVPckRlZmF1bHQiLCAiTkVHQVRJVkVfSU5GSU5JVFkiLCAibWluRGVmaW5lZCIsICJpc0Zpbml0ZSIsICJtYXhEZWZpbmVkIiwgImdldE1pbk1heCIsICJjYW5TdGFjayIsICJtZXRhcyIsICJnZXRNYXRjaGluZ1Zpc2libGVNZXRhcyIsICJnZXRUaWNrcyIsICJnZXRMYWJlbHMiLCAibGFiZWxzIiwgInhMYWJlbHMiLCAieUxhYmVscyIsICJnZXRMYWJlbEl0ZW1zIiwgIl9jb21wdXRlTGFiZWxJdGVtcyIsICJiZWZvcmVVcGRhdGUiLCAiY2FsbCIsICJtYXJnaW5zIiwgImJlZ2luQXRaZXJvIiwgImdyYWNlIiwgInNhbXBsZVNpemUiLCAiYmVmb3JlU2V0RGltZW5zaW9ucyIsICJzZXREaW1lbnNpb25zIiwgImFmdGVyU2V0RGltZW5zaW9ucyIsICJiZWZvcmVEYXRhTGltaXRzIiwgImRldGVybWluZURhdGFMaW1pdHMiLCAiYWZ0ZXJEYXRhTGltaXRzIiwgIl9hZGRHcmFjZSIsICJiZWZvcmVCdWlsZFRpY2tzIiwgImJ1aWxkVGlja3MiLCAiYWZ0ZXJCdWlsZFRpY2tzIiwgInNhbXBsaW5nRW5hYmxlZCIsICJfY29udmVydFRpY2tzVG9MYWJlbHMiLCAiYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiIsICJjYWxjdWxhdGVMYWJlbFJvdGF0aW9uIiwgImFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiIsICJzb3VyY2UiLCAiYWZ0ZXJBdXRvU2tpcCIsICJiZWZvcmVGaXQiLCAiZml0IiwgImFmdGVyRml0IiwgImFmdGVyVXBkYXRlIiwgInJldmVyc2VQaXhlbHMiLCAic3RhcnRQaXhlbCIsICJlbmRQaXhlbCIsICJfYWxpZ25Ub1BpeGVscyIsICJhbGlnblRvUGl4ZWxzIiwgIl9jYWxsSG9va3MiLCAibmFtZSIsICJub3RpZnlQbHVnaW5zIiwgImJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbiIsICJnZW5lcmF0ZVRpY2tMYWJlbHMiLCAibGFiZWwiLCAiY2FsbGJhY2siLCAiYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24iLCAibnVtVGlja3MiLCAibWluUm90YXRpb24iLCAibWF4Um90YXRpb24iLCAidGlja1dpZHRoIiwgIm1heExhYmVsRGlhZ29uYWwiLCAiX2lzVmlzaWJsZSIsICJsYWJlbFNpemVzIiwgIl9nZXRMYWJlbFNpemVzIiwgIm1heExhYmVsV2lkdGgiLCAid2lkZXN0IiwgIm1heExhYmVsSGVpZ2h0IiwgImhpZ2hlc3QiLCAiX2xpbWl0VmFsdWUiLCAiZ3JpZCIsICJ0aXRsZSIsICJ0b0RlZ3JlZXMiLCAiYXNpbiIsICJtaW5TaXplIiwgInRpdGxlT3B0cyIsICJncmlkT3B0cyIsICJ0aXRsZUhlaWdodCIsICJ0aWNrUGFkZGluZyIsICJhbmdsZVJhZGlhbnMiLCAidG9SYWRpYW5zIiwgImNvcyIsICJzaW4iLCAibGFiZWxIZWlnaHQiLCAibWlycm9yIiwgImxhYmVsV2lkdGgiLCAiX2NhbGN1bGF0ZVBhZGRpbmciLCAiX2hhbmRsZU1hcmdpbnMiLCAiaXNSb3RhdGVkIiwgImxhYmVsc0JlbG93VGlja3MiLCAib2Zmc2V0TGVmdCIsICJvZmZzZXRSaWdodCIsICJpc0Z1bGxTaXplIiwgIl9jb21wdXRlTGFiZWxTaXplcyIsICJ3aWR0aHMiLCAiaGVpZ2h0cyIsICJ3aWRlc3RMYWJlbFNpemUiLCAiaGlnaGVzdExhYmVsU2l6ZSIsICJqbGVuIiwgInRpY2tGb250IiwgImZvbnRTdHJpbmciLCAibmVzdGVkTGFiZWwiLCAiX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMiLCAic3RyaW5nIiwgIl9tZWFzdXJlVGV4dCIsICJ2YWx1ZUF0IiwgImlkeCIsICJnZXRMYWJlbEZvclZhbHVlIiwgIk5hTiIsICJnZXRWYWx1ZUZvclBpeGVsIiwgInBpeGVsIiwgImdldFBpeGVsRm9yRGVjaW1hbCIsICJkZWNpbWFsIiwgIl9pbnQxNlJhbmdlIiwgIl9hbGlnblBpeGVsIiwgImdldERlY2ltYWxGb3JQaXhlbCIsICJnZXRCYXNlUGl4ZWwiLCAiZ2V0QmFzZVZhbHVlIiwgIm9wdGlvblRpY2tzIiwgInJvdCIsICJhdXRvU2tpcFBhZGRpbmciLCAiX2NvbXB1dGVHcmlkTGluZUl0ZW1zIiwgImJvcmRlciIsICJ0bCIsICJib3JkZXJPcHRzIiwgImF4aXNXaWR0aCIsICJheGlzSGFsZldpZHRoIiwgImFsaWduQm9yZGVyVmFsdWUiLCAiYm9yZGVyVmFsdWUiLCAiYWxpZ25lZExpbmVWYWx1ZSIsICJ0eDEiLCAidHkxIiwgInR4MiIsICJ0eTIiLCAieDEiLCAieTEiLCAieDIiLCAieTIiLCAibGltaXQiLCAic3RlcCIsICJvcHRzQXRJbmRleCIsICJvcHRzQXRJbmRleEJvcmRlciIsICJsaW5lV2lkdGgiLCAibGluZUNvbG9yIiwgImNvbG9yIiwgImJvcmRlckRhc2giLCAiZGFzaCIsICJib3JkZXJEYXNoT2Zmc2V0IiwgImRhc2hPZmZzZXQiLCAidGlja0NvbG9yIiwgInRpY2tCb3JkZXJEYXNoIiwgInRpY2tCb3JkZXJEYXNoT2Zmc2V0IiwgImNyb3NzQWxpZ24iLCAidGlja0FuZFBhZGRpbmciLCAiaFRpY2tBbmRQYWRkaW5nIiwgInRleHRBbGlnbiIsICJsaW5lQ291bnQiLCAidGV4dE9mZnNldCIsICJ0ZXh0QmFzZWxpbmUiLCAiX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQiLCAiX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQiLCAibGFiZWxPZmZzZXQiLCAiaGFsZkNvdW50IiwgInN0cm9rZUNvbG9yIiwgInRleHRTdHJva2VDb2xvciIsICJzdHJva2VXaWR0aCIsICJ0ZXh0U3Ryb2tlV2lkdGgiLCAidGlja1RleHRBbGlnbiIsICJzaG93TGFiZWxCYWNrZHJvcCIsICJiYWNrZHJvcCIsICJsYWJlbFBhZGRpbmciLCAiYmFja2Ryb3BQYWRkaW5nIiwgImJhY2tkcm9wQ29sb3IiLCAidHJhbnNsYXRpb24iLCAiX2NvbXB1dGVMYWJlbEFyZWEiLCAiZHJhd0JhY2tncm91bmQiLCAiYmFja2dyb3VuZENvbG9yIiwgInNhdmUiLCAiZmlsbFN0eWxlIiwgImZpbGxSZWN0IiwgInJlc3RvcmUiLCAiZ2V0TGluZVdpZHRoRm9yVmFsdWUiLCAiZmluZEluZGV4IiwgInQiLCAib3B0cyIsICJkcmF3R3JpZCIsICJkcmF3TGluZSIsICJwMSIsICJwMiIsICJzdHJva2VTdHlsZSIsICJzZXRMaW5lRGFzaCIsICJsaW5lRGFzaE9mZnNldCIsICJiZWdpblBhdGgiLCAibW92ZVRvIiwgImxpbmVUbyIsICJzdHJva2UiLCAiZHJhd09uQ2hhcnRBcmVhIiwgImRyYXdCb3JkZXIiLCAibGFzdExpbmVXaWR0aCIsICJkcmF3TGFiZWxzIiwgImFyZWEiLCAiY2xpcEFyZWEiLCAicmVuZGVyVGV4dE9wdGlvbnMiLCAicmVuZGVyVGV4dCIsICJ1bmNsaXBBcmVhIiwgImRyYXdUaXRsZSIsICJ0eiIsICJneiIsICJieiIsICJheGlzSUQiLCAiX21heERpZ2l0cyIsICJmb250U2l6ZSIsICJUeXBlZFJlZ2lzdHJ5IiwgInNjb3BlIiwgImNyZWF0ZSIsICJpc0ZvclR5cGUiLCAiaXNQcm90b3R5cGVPZiIsICJyZWdpc3RlciIsICJwcm90byIsICJnZXRQcm90b3R5cGVPZiIsICJwYXJlbnRTY29wZSIsICJpc0lDaGFydENvbXBvbmVudCIsICJyZWdpc3RlckRlZmF1bHRzIiwgIm92ZXJyaWRlcyIsICJnZXQiLCAidW5yZWdpc3RlciIsICJpdGVtRGVmYXVsdHMiLCAibWVyZ2UiLCAicm91dGVEZWZhdWx0cyIsICJkZXNjcmlwdG9ycyIsICJkZXNjcmliZSIsICJyb3V0ZXMiLCAicHJvcGVydHkiLCAicHJvcGVydHlQYXJ0cyIsICJzcGxpdCIsICJzb3VyY2VOYW1lIiwgInBvcCIsICJzb3VyY2VTY29wZSIsICJqb2luIiwgInBhcnRzIiwgInRhcmdldE5hbWUiLCAidGFyZ2V0U2NvcGUiLCAicm91dGUiLCAiUmVnaXN0cnkiLCAiY29udHJvbGxlcnMiLCAiRGF0YXNldENvbnRyb2xsZXIiLCAicGx1Z2lucyIsICJfdHlwZWRSZWdpc3RyaWVzIiwgImFyZ3MiLCAiX2VhY2giLCAicmVtb3ZlIiwgImFkZENvbnRyb2xsZXJzIiwgImFkZEVsZW1lbnRzIiwgImFkZFBsdWdpbnMiLCAiYWRkU2NhbGVzIiwgImdldENvbnRyb2xsZXIiLCAiX2dldCIsICJnZXRFbGVtZW50IiwgImdldFBsdWdpbiIsICJnZXRTY2FsZSIsICJyZW1vdmVDb250cm9sbGVycyIsICJyZW1vdmVFbGVtZW50cyIsICJyZW1vdmVQbHVnaW5zIiwgInJlbW92ZVNjYWxlcyIsICJtZXRob2QiLCAidHlwZWRSZWdpc3RyeSIsICJhcmciLCAicmVnIiwgIl9nZXRSZWdpc3RyeUZvclR5cGUiLCAiX2V4ZWMiLCAiaXRlbVJlZyIsICJyZWdpc3RyeSIsICJjb21wb25lbnQiLCAiY2FtZWxNZXRob2QiLCAiX2NhcGl0YWxpemUiLCAiUGx1Z2luU2VydmljZSIsICJfaW5pdCIsICJub3RpZnkiLCAiaG9vayIsICJfY3JlYXRlRGVzY3JpcHRvcnMiLCAiX25vdGlmeSIsICJfZGVzY3JpcHRvcnMiLCAiZGVzY3JpcHRvciIsICJwbHVnaW4iLCAiY2FsbENhbGxiYWNrIiwgImNhbmNlbGFibGUiLCAiaW52YWxpZGF0ZSIsICJfb2xkQ2FjaGUiLCAiX25vdGlmeVN0YXRlQ2hhbmdlcyIsICJhbGwiLCAiYWxsUGx1Z2lucyIsICJjcmVhdGVEZXNjcmlwdG9ycyIsICJwcmV2aW91c0Rlc2NyaXB0b3JzIiwgInNvbWUiLCAibG9jYWxJZHMiLCAibG9jYWwiLCAiZ2V0T3B0cyIsICJwbHVnaW5PcHRzIiwgInBsdWdpblNjb3BlS2V5cyIsICJzY29wZXMiLCAiZ2V0T3B0aW9uU2NvcGVzIiwgImNyZWF0ZVJlc29sdmVyIiwgInNjcmlwdGFibGUiLCAiaW5kZXhhYmxlIiwgImFsbEtleXMiLCAiZ2V0SW5kZXhBeGlzIiwgImRhdGFzZXREZWZhdWx0cyIsICJkYXRhc2V0cyIsICJkYXRhc2V0T3B0aW9ucyIsICJpbmRleEF4aXMiLCAiZ2V0QXhpc0Zyb21EZWZhdWx0U2NhbGVJRCIsICJnZXREZWZhdWx0U2NhbGVJREZyb21BeGlzIiwgImF4aXNGcm9tUG9zaXRpb24iLCAiZGV0ZXJtaW5lQXhpcyIsICJzY2FsZU9wdGlvbnMiLCAidG9Mb3dlckNhc2UiLCAibWVyZ2VTY2FsZUNvbmZpZyIsICJjaGFydERlZmF1bHRzIiwgImNvbmZpZ1NjYWxlcyIsICJjaGFydEluZGV4QXhpcyIsICJzY2FsZUNvbmYiLCAiY29uc29sZSIsICJlcnJvciIsICJfcHJveHkiLCAid2FybiIsICJkZWZhdWx0SWQiLCAiZGVmYXVsdFNjYWxlT3B0aW9ucyIsICJtZXJnZUlmIiwgImRlZmF1bHRJRCIsICJpbml0T3B0aW9ucyIsICJpbml0RGF0YSIsICJpbml0Q29uZmlnIiwgImtleUNhY2hlIiwgImtleXNDYWNoZWQiLCAiU2V0IiwgImNhY2hlZEtleXMiLCAiY2FjaGVLZXkiLCAiZ2VuZXJhdGUiLCAiYWRkSWZGb3VuZCIsICJvYmoiLCAicmVzb2x2ZU9iamVjdEtleSIsICJDb25maWciLCAiX2NvbmZpZyIsICJfc2NvcGVDYWNoZSIsICJfcmVzb2x2ZXJDYWNoZSIsICJwbGF0Zm9ybSIsICJjbGVhckNhY2hlIiwgImNsZWFyIiwgImRhdGFzZXRTY29wZUtleXMiLCAiZGF0YXNldFR5cGUiLCAiZGF0YXNldEFuaW1hdGlvblNjb3BlS2V5cyIsICJ0cmFuc2l0aW9uIiwgImRhdGFzZXRFbGVtZW50U2NvcGVLZXlzIiwgImVsZW1lbnRUeXBlIiwgImFkZGl0aW9uYWxPcHRpb25TY29wZXMiLCAiX2NhY2hlZFNjb3BlcyIsICJtYWluU2NvcGUiLCAicmVzZXRDYWNoZSIsICJrZXlMaXN0cyIsICJjYWNoZWQiLCAiQXJyYXkiLCAiZnJvbSIsICJoYXMiLCAiY2hhcnRPcHRpb25TY29wZXMiLCAicmVzb2x2ZU5hbWVkT3B0aW9ucyIsICJuYW1lcyIsICJwcmVmaXhlcyIsICIkc2hhcmVkIiwgInJlc29sdmVyIiwgInN1YlByZWZpeGVzIiwgImdldFJlc29sdmVyIiwgIm5lZWRDb250ZXh0IiwgImlzRnVuY3Rpb24iLCAic3ViUmVzb2x2ZXIiLCAiX2F0dGFjaENvbnRleHQiLCAiZGVzY3JpcHRvckRlZmF1bHRzIiwgInJlc29sdmVyQ2FjaGUiLCAiX2NyZWF0ZVJlc29sdmVyIiwgInAiLCAiaGFzRnVuY3Rpb24iLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJhY2MiLCAiaXNTY3JpcHRhYmxlIiwgImlzSW5kZXhhYmxlIiwgIktOT1dOX1BPU0lUSU9OUyIsICJwb3NpdGlvbklzSG9yaXpvbnRhbCIsICJjb21wYXJlMkxldmVsIiwgImwxIiwgImwyIiwgIm9uQW5pbWF0aW9uc0NvbXBsZXRlIiwgImFuaW1hdGlvbk9wdGlvbnMiLCAib25Db21wbGV0ZSIsICJvbkFuaW1hdGlvblByb2dyZXNzIiwgIm9uUHJvZ3Jlc3MiLCAiZ2V0Q2FudmFzIiwgImdldEVsZW1lbnRCeUlkIiwgImluc3RhbmNlcyIsICJnZXRDaGFydCIsICJ2YWx1ZXMiLCAiYyIsICJtb3ZlTnVtZXJpY0tleXMiLCAibW92ZSIsICJpbnRLZXkiLCAiZGV0ZXJtaW5lTGFzdEV2ZW50IiwgImxhc3RFdmVudCIsICJpbkNoYXJ0QXJlYSIsICJpc0NsaWNrIiwgImdldERhdGFzZXRBcmVhIiwgInhTY2FsZSIsICJ5U2NhbGUiLCAiQ2hhcnQiLCAiaW52YWxpZGF0ZVBsdWdpbnMiLCAidXNlckNvbmZpZyIsICJpbml0aWFsQ2FudmFzIiwgImV4aXN0aW5nQ2hhcnQiLCAidWlkIiwgIl9vcHRpb25zIiwgIl9hc3BlY3RSYXRpbyIsICJfbWV0YXNldHMiLCAiX3N0YWNrcyIsICJfYWN0aXZlIiwgIl9sYXN0RXZlbnQiLCAiX2xpc3RlbmVycyIsICJfcmVzcG9uc2l2ZUxpc3RlbmVycyIsICJfc29ydGVkTWV0YXNldHMiLCAiX3BsdWdpbnMiLCAiX2hpZGRlbkluZGljZXMiLCAiYXR0YWNoZWQiLCAiX2FuaW1hdGlvbnNEaXNhYmxlZCIsICJfZG9SZXNpemUiLCAiZGVib3VuY2UiLCAibW9kZSIsICJyZXNpemVEZWxheSIsICJfZGF0YUNoYW5nZXMiLCAiYW5pbWF0b3IiLCAibGlzdGVuIiwgIl9pbml0aWFsaXplIiwgIm1haW50YWluQXNwZWN0UmF0aW8iLCAicmVzcG9uc2l2ZSIsICJyZXRpbmFTY2FsZSIsICJiaW5kRXZlbnRzIiwgImNsZWFyQ2FudmFzIiwgInN0b3AiLCAicnVubmluZyIsICJfcmVzaXplIiwgIl9yZXNpemVCZWZvcmVEcmF3IiwgIm5ld1NpemUiLCAibmV3UmF0aW8iLCAib25SZXNpemUiLCAicmVuZGVyIiwgImVuc3VyZVNjYWxlc0hhdmVJRHMiLCAic2NhbGVzT3B0aW9ucyIsICJheGlzT3B0aW9ucyIsICJidWlsZE9yVXBkYXRlU2NhbGVzIiwgInNjYWxlT3B0cyIsICJ1cGRhdGVkIiwgIm1hcCIsICJpc1JhZGlhbCIsICJkcG9zaXRpb24iLCAiZHR5cGUiLCAic2NhbGVUeXBlIiwgInNjYWxlQ2xhc3MiLCAiaGFzVXBkYXRlZCIsICJfdXBkYXRlTWV0YXNldHMiLCAibnVtRGF0YSIsICJudW1NZXRhIiwgIl9kZXN0cm95RGF0YXNldE1ldGEiLCAic2xpY2UiLCAiX3JlbW92ZVVucmVmZXJlbmNlZE1ldGFzZXRzIiwgIl9kYXRhc2V0IiwgImJ1aWxkT3JVcGRhdGVDb250cm9sbGVycyIsICJuZXdDb250cm9sbGVycyIsICJvcmRlciIsICJ2aXNpYmxlIiwgImlzRGF0YXNldFZpc2libGUiLCAidXBkYXRlSW5kZXgiLCAibGlua1NjYWxlcyIsICJDb250cm9sbGVyQ2xhc3MiLCAiZGF0YXNldEVsZW1lbnRUeXBlIiwgImRhdGFFbGVtZW50VHlwZSIsICJfcmVzZXRFbGVtZW50cyIsICJyZXNldCIsICJhbmltc0Rpc2FibGVkIiwgIl91cGRhdGVTY2FsZXMiLCAiX2NoZWNrRXZlbnRCaW5kaW5ncyIsICJfdXBkYXRlSGlkZGVuSW5kaWNlcyIsICJidWlsZE9yVXBkYXRlRWxlbWVudHMiLCAiZ2V0TWF4T3ZlcmZsb3ciLCAiX21pblBhZGRpbmciLCAiYXV0b1BhZGRpbmciLCAiX3VwZGF0ZUxheW91dCIsICJfdXBkYXRlRGF0YXNldHMiLCAiX2V2ZW50SGFuZGxlciIsICJfdXBkYXRlSG92ZXJTdHlsZXMiLCAiZXhpc3RpbmdFdmVudHMiLCAibmV3RXZlbnRzIiwgImV2ZW50cyIsICJzZXRzRXF1YWwiLCAidW5iaW5kRXZlbnRzIiwgImNoYW5nZXMiLCAiX2dldFVuaWZvcm1EYXRhQ2hhbmdlcyIsICJkYXRhc2V0Q291bnQiLCAibWFrZVNldCIsICJjaGFuZ2VTZXQiLCAibm9BcmVhIiwgIl9pZHgiLCAiX3VwZGF0ZURhdGFzZXQiLCAiX3VwZGF0ZSIsICJsYXllcnMiLCAiX2RyYXdEYXRhc2V0cyIsICJfZ2V0U29ydGVkRGF0YXNldE1ldGFzIiwgImZpbHRlclZpc2libGUiLCAiX2RyYXdEYXRhc2V0IiwgImNsaXAiLCAiX2NsaXAiLCAidXNlQ2xpcCIsICJkaXNhYmxlZCIsICJnZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlIiwgIkludGVyYWN0aW9uIiwgImhpZGRlbiIsICJ4QXhpc0lEIiwgInlBeGlzSUQiLCAiX3BhcnNlZCIsICJnZXRWaXNpYmxlRGF0YXNldENvdW50IiwgInNldERhdGFzZXRWaXNpYmlsaXR5IiwgInRvZ2dsZURhdGFWaXNpYmlsaXR5IiwgImdldERhdGFWaXNpYmlsaXR5IiwgIl91cGRhdGVWaXNpYmlsaXR5IiwgImRhdGFJbmRleCIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAiaGlkZSIsICJzaG93IiwgIl9kZXN0cm95IiwgIl9zdG9wIiwgImRlc3Ryb3kiLCAidG9CYXNlNjRJbWFnZSIsICJ0b0RhdGFVUkwiLCAiYmluZFVzZXJFdmVudHMiLCAiYmluZFJlc3BvbnNpdmVFdmVudHMiLCAibGlzdGVuZXJzIiwgIl9hZGQiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgIl9yZW1vdmUiLCAiZGV0YWNoZWQiLCAidXBkYXRlSG92ZXJTdHlsZSIsICJwcmVmaXgiLCAiZ2V0QWN0aXZlRWxlbWVudHMiLCAic2V0QWN0aXZlRWxlbWVudHMiLCAiYWN0aXZlRWxlbWVudHMiLCAibGFzdEFjdGl2ZSIsICJfZWxlbWVudHNFcXVhbCIsICJpc1BsdWdpbkVuYWJsZWQiLCAicGx1Z2luSWQiLCAicmVwbGF5IiwgImhvdmVyT3B0aW9ucyIsICJob3ZlciIsICJkZWFjdGl2YXRlZCIsICJhY3RpdmF0ZWQiLCAiZXZlbnRGaWx0ZXIiLCAiX2hhbmRsZUV2ZW50IiwgIl9nZXRBY3RpdmVFbGVtZW50cyIsICJfaXNDbGlja0V2ZW50IiwgIm9uSG92ZXIiLCAib25DbGljayIsICJ2ZXJzaW9uIiwgImNsaXBBcmMiLCAicGl4ZWxNYXJnaW4iLCAib3V0ZXJSYWRpdXMiLCAiaW5uZXJSYWRpdXMiLCAiYW5nbGVNYXJnaW4iLCAiYXJjIiwgImNsb3NlUGF0aCIsICJ0b1JhZGl1c0Nvcm5lcnMiLCAiX3JlYWRWYWx1ZVRvUHJvcHMiLCAicGFyc2VCb3JkZXJSYWRpdXMiLCAiYW5nbGVEZWx0YSIsICJvIiwgImJvcmRlclJhZGl1cyIsICJoYWxmVGhpY2tuZXNzIiwgImlubmVyTGltaXQiLCAiY29tcHV0ZU91dGVyTGltaXQiLCAidmFsIiwgIm91dGVyQXJjTGltaXQiLCAib3V0ZXJTdGFydCIsICJvdXRlckVuZCIsICJpbm5lclN0YXJ0IiwgImlubmVyRW5kIiwgInJUaGV0YVRvWFkiLCAiciIsICJ0aGV0YSIsICJwYXRoQXJjIiwgImNpcmN1bGFyIiwgImlubmVyUiIsICJzcGFjaW5nT2Zmc2V0IiwgImFscGhhIiwgIm5vU3BhY2luZ0lubmVyUmFkaXVzIiwgIm5vU3BhY2luZ091dGVyUmFkaXVzIiwgImF2Tm9nU3BhY2luZ1JhZGl1cyIsICJhZGp1c3RlZEFuZ2xlIiwgImJldGEiLCAiUEkiLCAiYW5nbGVPZmZzZXQiLCAib3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzIiwgIm91dGVyRW5kQWRqdXN0ZWRSYWRpdXMiLCAib3V0ZXJTdGFydEFkanVzdGVkQW5nbGUiLCAib3V0ZXJFbmRBZGp1c3RlZEFuZ2xlIiwgImlubmVyU3RhcnRBZGp1c3RlZFJhZGl1cyIsICJpbm5lckVuZEFkanVzdGVkUmFkaXVzIiwgImlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlIiwgImlubmVyRW5kQWRqdXN0ZWRBbmdsZSIsICJvdXRlck1pZEFkanVzdGVkQW5nbGUiLCAicENlbnRlciIsICJwNCIsICJpbm5lck1pZEFkanVzdGVkQW5nbGUiLCAicDgiLCAib3V0ZXJTdGFydFgiLCAib3V0ZXJTdGFydFkiLCAib3V0ZXJFbmRYIiwgIm91dGVyRW5kWSIsICJkcmF3QXJjIiwgImZ1bGxDaXJjbGVzIiwgImNpcmN1bWZlcmVuY2UiLCAiZmlsbCIsICJpc05hTiIsICJUQVUiLCAiYm9yZGVyV2lkdGgiLCAiYm9yZGVySm9pblN0eWxlIiwgImlubmVyIiwgImJvcmRlckFsaWduIiwgImxpbmVKb2luIiwgIkFyY0VsZW1lbnQiLCAiY2hhcnRYIiwgImNoYXJ0WSIsICJyQWRqdXN0IiwgIl9jaXJjdW1mZXJlbmNlIiwgImJldHdlZW5BbmdsZXMiLCAid2l0aGluUmFkaXVzIiwgIl9pc0JldHdlZW4iLCAiaGFsZkFuZ2xlIiwgImhhbGZSYWRpdXMiLCAidHJhbnNsYXRlIiwgImZpeCIsICJyYWRpdXNPZmZzZXQiLCAiYm9yZGVyQ29sb3IiLCAiZ2V0QmFyQm91bmRzIiwgImJhciIsICJ1c2VGaW5hbFBvc2l0aW9uIiwgIngiLCAieSIsICJiYXNlIiwgIndpZHRoIiwgImhlaWdodCIsICJnZXRQcm9wcyIsICJsZWZ0IiwgInJpZ2h0IiwgInRvcCIsICJib3R0b20iLCAiaGFsZiIsICJob3Jpem9udGFsIiwgIk1hdGgiLCAibWluIiwgIm1heCIsICJza2lwT3JMaW1pdCIsICJza2lwIiwgInZhbHVlIiwgIl9saW1pdFZhbHVlIiwgInBhcnNlQm9yZGVyV2lkdGgiLCAibWF4VyIsICJtYXhIIiwgIm9wdGlvbnMiLCAiYm9yZGVyV2lkdGgiLCAiYm9yZGVyU2tpcHBlZCIsICJvIiwgInRvVFJCTCIsICJ0IiwgInIiLCAiYiIsICJsIiwgInBhcnNlQm9yZGVyUmFkaXVzIiwgImVuYWJsZUJvcmRlclJhZGl1cyIsICJib3JkZXJSYWRpdXMiLCAidG9UUkJMQ29ybmVycyIsICJtYXhSIiwgImVuYWJsZUJvcmRlciIsICJpc09iamVjdCIsICJ0b3BMZWZ0IiwgInRvcFJpZ2h0IiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAiYm91bmRpbmdSZWN0cyIsICJib3VuZHMiLCAiYm9yZGVyIiwgInJhZGl1cyIsICJvdXRlciIsICJ3IiwgImgiLCAiaW5uZXIiLCAiaW5SYW5nZSIsICJza2lwWCIsICJza2lwWSIsICJza2lwQm90aCIsICJfaXNCZXR3ZWVuIiwgImhhc1JhZGl1cyIsICJhZGROb3JtYWxSZWN0UGF0aCIsICJjdHgiLCAicmVjdCIsICJpbmZsYXRlUmVjdCIsICJhbW91bnQiLCAicmVmUmVjdCIsICJCYXJFbGVtZW50IiwgIkVsZW1lbnQiLCAiY29uc3RydWN0b3IiLCAiY2ZnIiwgInVuZGVmaW5lZCIsICJpbmZsYXRlQW1vdW50IiwgIk9iamVjdCIsICJhc3NpZ24iLCAiZHJhdyIsICJib3JkZXJDb2xvciIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWRkUmVjdFBhdGgiLCAiYWRkUm91bmRlZFJlY3RQYXRoIiwgInNhdmUiLCAiYmVnaW5QYXRoIiwgImNsaXAiLCAiZmlsbFN0eWxlIiwgImZpbGwiLCAicmVzdG9yZSIsICJtb3VzZVgiLCAibW91c2VZIiwgImluWFJhbmdlIiwgImluWVJhbmdlIiwgImdldENlbnRlclBvaW50IiwgImdldFJhbmdlIiwgImF4aXMiLCAiaWQiLCAiZGVmYXVsdHMiLCAicG9pbnRTdHlsZSIsICJkZWZhdWx0Um91dGVzIiwgImdldEJveFNpemUiLCAibGFiZWxPcHRzIiwgImZvbnRTaXplIiwgImJveEhlaWdodCIsICJib3hXaWR0aCIsICJ1c2VQb2ludFN0eWxlIiwgIk1hdGgiLCAibWluIiwgInBvaW50U3R5bGVXaWR0aCIsICJpdGVtSGVpZ2h0IiwgIm1heCIsICJpdGVtc0VxdWFsIiwgImEiLCAiYiIsICJkYXRhc2V0SW5kZXgiLCAiaW5kZXgiLCAiTGVnZW5kIiwgIkVsZW1lbnQiLCAiY29uc3RydWN0b3IiLCAiY29uZmlnIiwgIl9hZGRlZCIsICJsZWdlbmRIaXRCb3hlcyIsICJfaG92ZXJlZEl0ZW0iLCAiZG91Z2hudXRNb2RlIiwgImNoYXJ0IiwgIm9wdGlvbnMiLCAiY3R4IiwgImxlZ2VuZEl0ZW1zIiwgInVuZGVmaW5lZCIsICJjb2x1bW5TaXplcyIsICJsaW5lV2lkdGhzIiwgIm1heEhlaWdodCIsICJtYXhXaWR0aCIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiwgIl9tYXJnaW5zIiwgInBvc2l0aW9uIiwgIndlaWdodCIsICJmdWxsU2l6ZSIsICJ1cGRhdGUiLCAibWFyZ2lucyIsICJzZXREaW1lbnNpb25zIiwgImJ1aWxkTGFiZWxzIiwgImZpdCIsICJpc0hvcml6b250YWwiLCAibGFiZWxzIiwgImNhbGwiLCAiZ2VuZXJhdGVMYWJlbHMiLCAiZmlsdGVyIiwgIml0ZW0iLCAiZGF0YSIsICJzb3J0IiwgInJldmVyc2UiLCAiZGlzcGxheSIsICJsYWJlbEZvbnQiLCAidG9Gb250IiwgImZvbnQiLCAic2l6ZSIsICJ0aXRsZUhlaWdodCIsICJfY29tcHV0ZVRpdGxlSGVpZ2h0IiwgInN0cmluZyIsICJfZml0Um93cyIsICJfZml0Q29scyIsICJwYWRkaW5nIiwgImhpdGJveGVzIiwgImxpbmVIZWlnaHQiLCAidG90YWxIZWlnaHQiLCAidGV4dEFsaWduIiwgInRleHRCYXNlbGluZSIsICJyb3ciLCAiZm9yRWFjaCIsICJsZWdlbmRJdGVtIiwgImkiLCAiaXRlbVdpZHRoIiwgIm1lYXN1cmVUZXh0IiwgInRleHQiLCAibGVuZ3RoIiwgIl9pdGVtSGVpZ2h0IiwgImhlaWdodExpbWl0IiwgInRvdGFsV2lkdGgiLCAiY3VycmVudENvbFdpZHRoIiwgImN1cnJlbnRDb2xIZWlnaHQiLCAiY29sIiwgImNhbGN1bGF0ZUl0ZW1TaXplIiwgInB1c2giLCAiYWRqdXN0SGl0Qm94ZXMiLCAiYWxpZ24iLCAicnRsIiwgInJ0bEhlbHBlciIsICJnZXRSdGxBZGFwdGVyIiwgIl9hbGlnblN0YXJ0RW5kIiwgImhpdGJveCIsICJsZWZ0Rm9yTHRyIiwgIngiLCAiZHJhdyIsICJjbGlwQXJlYSIsICJfZHJhdyIsICJ1bmNsaXBBcmVhIiwgIm9wdHMiLCAiZGVmYXVsdENvbG9yIiwgImRlZmF1bHRzIiwgImNvbG9yIiwgImhhbGZGb250U2l6ZSIsICJjdXJzb3IiLCAiZHJhd1RpdGxlIiwgImxpbmVXaWR0aCIsICJkcmF3TGVnZW5kQm94IiwgInkiLCAiaXNOYU4iLCAic2F2ZSIsICJ2YWx1ZU9yRGVmYXVsdCIsICJmaWxsU3R5bGUiLCAibGluZUNhcCIsICJsaW5lRGFzaE9mZnNldCIsICJsaW5lSm9pbiIsICJzdHJva2VTdHlsZSIsICJzZXRMaW5lRGFzaCIsICJsaW5lRGFzaCIsICJkcmF3T3B0aW9ucyIsICJyYWRpdXMiLCAiU1FSVDIiLCAicG9pbnRTdHlsZSIsICJyb3RhdGlvbiIsICJib3JkZXJXaWR0aCIsICJjZW50ZXJYIiwgInhQbHVzIiwgImNlbnRlclkiLCAiZHJhd1BvaW50TGVnZW5kIiwgInlCb3hUb3AiLCAieEJveExlZnQiLCAiYm9yZGVyUmFkaXVzIiwgInRvVFJCTENvcm5lcnMiLCAiYmVnaW5QYXRoIiwgIk9iamVjdCIsICJ2YWx1ZXMiLCAic29tZSIsICJ2IiwgImFkZFJvdW5kZWRSZWN0UGF0aCIsICJ3IiwgImgiLCAicmVjdCIsICJmaWxsIiwgInN0cm9rZSIsICJyZXN0b3JlIiwgImZpbGxUZXh0IiwgInJlbmRlclRleHQiLCAic3RyaWtldGhyb3VnaCIsICJoaWRkZW4iLCAibGluZSIsICJvdmVycmlkZVRleHREaXJlY3Rpb24iLCAidGV4dERpcmVjdGlvbiIsICJmb250Q29sb3IiLCAidGV4dFdpZHRoIiwgInNldFdpZHRoIiwgInJlYWxYIiwgIl90ZXh0WCIsICJmb250TGluZUhlaWdodCIsICJjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0IiwgInJlc3RvcmVUZXh0RGlyZWN0aW9uIiwgInRpdGxlT3B0cyIsICJ0aXRsZSIsICJ0aXRsZUZvbnQiLCAidGl0bGVQYWRkaW5nIiwgInRvUGFkZGluZyIsICJ0b3BQYWRkaW5nUGx1c0hhbGZGb250U2l6ZSIsICJyZWR1Y2UiLCAiYWNjIiwgIl90b0xlZnRSaWdodENlbnRlciIsICJfZ2V0TGVnZW5kSXRlbUF0IiwgImhpdEJveCIsICJsaCIsICJfaXNCZXR3ZWVuIiwgImhhbmRsZUV2ZW50IiwgImUiLCAiaXNMaXN0ZW5lZCIsICJ0eXBlIiwgImhvdmVyZWRJdGVtIiwgInByZXZpb3VzIiwgInNhbWVJdGVtIiwgIm9uTGVhdmUiLCAib25Ib3ZlciIsICJvbkNsaWNrIiwgImNhbGN1bGF0ZUl0ZW1XaWR0aCIsICJjYWxjdWxhdGVJdGVtSGVpZ2h0IiwgImxlZ2VuZEl0ZW1UZXh0IiwgImxhYmVsSGVpZ2h0IiwgImlkIiwgIl9lbGVtZW50IiwgInN0YXJ0IiwgIl9hcmdzIiwgImxlZ2VuZCIsICJsYXlvdXRzIiwgImNvbmZpZ3VyZSIsICJhZGRCb3giLCAic3RvcCIsICJyZW1vdmVCb3giLCAiYmVmb3JlVXBkYXRlIiwgImFmdGVyVXBkYXRlIiwgImFmdGVyRXZlbnQiLCAiYXJncyIsICJyZXBsYXkiLCAiZXZlbnQiLCAiY2kiLCAiaXNEYXRhc2V0VmlzaWJsZSIsICJoaWRlIiwgInNob3ciLCAiZGF0YXNldHMiLCAidXNlQm9yZGVyUmFkaXVzIiwgIl9nZXRTb3J0ZWREYXRhc2V0TWV0YXMiLCAibWFwIiwgIm1ldGEiLCAic3R5bGUiLCAiY29udHJvbGxlciIsICJnZXRTdHlsZSIsICJsYWJlbCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAidmlzaWJsZSIsICJib3JkZXJDYXBTdHlsZSIsICJib3JkZXJEYXNoIiwgImJvcmRlckRhc2hPZmZzZXQiLCAiYm9yZGVySm9pblN0eWxlIiwgImJvcmRlckNvbG9yIiwgImRlc2NyaXB0b3JzIiwgIl9zY3JpcHRhYmxlIiwgIm5hbWUiLCAic3RhcnRzV2l0aCIsICJpbmNsdWRlcyIsICJUaXRsZSIsICJfcGFkZGluZyIsICJsaW5lQ291bnQiLCAiaXNBcnJheSIsICJ0ZXh0U2l6ZSIsICJwb3MiLCAiX2RyYXdBcmdzIiwgIm9mZnNldCIsICJ0aXRsZVgiLCAidGl0bGVZIiwgIlBJIiwgImZvbnRPcHRzIiwgInRyYW5zbGF0aW9uIiwgImNyZWF0ZVRpdGxlIiwgInRpdGxlQmxvY2siLCAiZGVmYXVsdFJvdXRlcyIsICJfaW5kZXhhYmxlIiwgIldlYWtNYXAiLCAic2V0IiwgImdldCIsICJkZWxldGUiLCAicG9zaXRpb25lcnMiLCAiYXZlcmFnZSIsICJpdGVtcyIsICJsZW4iLCAiY291bnQiLCAiZWwiLCAiZWxlbWVudCIsICJoYXNWYWx1ZSIsICJ0b29sdGlwUG9zaXRpb24iLCAibmVhcmVzdCIsICJldmVudFBvc2l0aW9uIiwgIm1pbkRpc3RhbmNlIiwgIk51bWJlciIsICJQT1NJVElWRV9JTkZJTklUWSIsICJuZWFyZXN0RWxlbWVudCIsICJjZW50ZXIiLCAiZ2V0Q2VudGVyUG9pbnQiLCAiZCIsICJkaXN0YW5jZUJldHdlZW5Qb2ludHMiLCAidHAiLCAicHVzaE9yQ29uY2F0IiwgImJhc2UiLCAidG9QdXNoIiwgIkFycmF5IiwgInByb3RvdHlwZSIsICJhcHBseSIsICJzcGxpdE5ld2xpbmVzIiwgInN0ciIsICJTdHJpbmciLCAiaW5kZXhPZiIsICJzcGxpdCIsICJjcmVhdGVUb29sdGlwSXRlbSIsICJnZXREYXRhc2V0TWV0YSIsICJ2YWx1ZSIsICJnZXRMYWJlbEFuZFZhbHVlIiwgInBhcnNlZCIsICJnZXRQYXJzZWQiLCAicmF3IiwgImZvcm1hdHRlZFZhbHVlIiwgImRhdGFzZXQiLCAiZ2V0RGF0YXNldCIsICJkYXRhSW5kZXgiLCAiZ2V0VG9vbHRpcFNpemUiLCAidG9vbHRpcCIsICJib2R5IiwgImZvb3RlciIsICJib2R5Rm9udCIsICJmb290ZXJGb250IiwgInRpdGxlTGluZUNvdW50IiwgImZvb3RlckxpbmVDb3VudCIsICJib2R5TGluZUl0ZW1Db3VudCIsICJjb21iaW5lZEJvZHlMZW5ndGgiLCAiYm9keUl0ZW0iLCAiYmVmb3JlIiwgImxpbmVzIiwgImFmdGVyIiwgImJlZm9yZUJvZHkiLCAiYWZ0ZXJCb2R5IiwgInRpdGxlU3BhY2luZyIsICJ0aXRsZU1hcmdpbkJvdHRvbSIsICJib2R5TGluZUhlaWdodCIsICJkaXNwbGF5Q29sb3JzIiwgImJvZHlTcGFjaW5nIiwgImZvb3Rlck1hcmdpblRvcCIsICJmb290ZXJTcGFjaW5nIiwgIndpZHRoUGFkZGluZyIsICJtYXhMaW5lV2lkdGgiLCAiZWFjaCIsICJjb25jYXQiLCAiYm94UGFkZGluZyIsICJkZXRlcm1pbmVZQWxpZ24iLCAiZG9lc05vdEZpdFdpdGhBbGlnbiIsICJ4QWxpZ24iLCAiY2FyZXQiLCAiY2FyZXRTaXplIiwgImNhcmV0UGFkZGluZyIsICJkZXRlcm1pbmVYQWxpZ24iLCAieUFsaWduIiwgImNoYXJ0V2lkdGgiLCAiY2hhcnRBcmVhIiwgImRldGVybWluZUFsaWdubWVudCIsICJhbGlnblgiLCAiYWxpZ25ZIiwgInBhZGRpbmdBbmRTaXplIiwgImdldEJhY2tncm91bmRQb2ludCIsICJhbGlnbm1lbnQiLCAiY29ybmVyUmFkaXVzIiwgInRvcExlZnQiLCAidG9wUmlnaHQiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJfbGltaXRWYWx1ZSIsICJnZXRBbGlnbmVkWCIsICJnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyIsICJjYWxsYmFjayIsICJjcmVhdGVUb29sdGlwQ29udGV4dCIsICJwYXJlbnQiLCAidG9vbHRpcEl0ZW1zIiwgImNyZWF0ZUNvbnRleHQiLCAib3ZlcnJpZGVDYWxsYmFja3MiLCAiY2FsbGJhY2tzIiwgImNvbnRleHQiLCAib3ZlcnJpZGUiLCAiZGVmYXVsdENhbGxiYWNrcyIsICJiZWZvcmVUaXRsZSIsICJub29wIiwgImxhYmVsQ291bnQiLCAibW9kZSIsICJhZnRlclRpdGxlIiwgImJlZm9yZUxhYmVsIiwgInRvb2x0aXBJdGVtIiwgImlzTnVsbE9yVW5kZWYiLCAibGFiZWxDb2xvciIsICJsYWJlbFRleHRDb2xvciIsICJib2R5Q29sb3IiLCAibGFiZWxQb2ludFN0eWxlIiwgImFmdGVyTGFiZWwiLCAiYmVmb3JlRm9vdGVyIiwgImFmdGVyRm9vdGVyIiwgImludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrIiwgImFyZyIsICJyZXN1bHQiLCAiVG9vbHRpcCIsICJvcGFjaXR5IiwgIl9hY3RpdmUiLCAiX2V2ZW50UG9zaXRpb24iLCAiX3NpemUiLCAiX2NhY2hlZEFuaW1hdGlvbnMiLCAiX3Rvb2x0aXBJdGVtcyIsICIkYW5pbWF0aW9ucyIsICIkY29udGV4dCIsICJkYXRhUG9pbnRzIiwgImNhcmV0WCIsICJjYXJldFkiLCAibGFiZWxDb2xvcnMiLCAibGFiZWxQb2ludFN0eWxlcyIsICJsYWJlbFRleHRDb2xvcnMiLCAiaW5pdGlhbGl6ZSIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAiY2FjaGVkIiwgInNldENvbnRleHQiLCAiZ2V0Q29udGV4dCIsICJlbmFibGVkIiwgImFuaW1hdGlvbiIsICJhbmltYXRpb25zIiwgIkFuaW1hdGlvbnMiLCAiX2NhY2hlYWJsZSIsICJmcmVlemUiLCAiZ2V0VGl0bGUiLCAiZ2V0QmVmb3JlQm9keSIsICJnZXRCb2R5IiwgImJvZHlJdGVtcyIsICJzY29wZWQiLCAiZ2V0QWZ0ZXJCb2R5IiwgImdldEZvb3RlciIsICJfY3JlYXRlSXRlbXMiLCAiYWN0aXZlIiwgImFycmF5IiwgIml0ZW1Tb3J0IiwgImNoYW5nZWQiLCAicHJvcGVydGllcyIsICJwb3NpdGlvbkFuZFNpemUiLCAiYXNzaWduIiwgImJhY2tncm91bmRQb2ludCIsICJleHRlcm5hbCIsICJkcmF3Q2FyZXQiLCAidG9vbHRpcFBvaW50IiwgImNhcmV0UG9zaXRpb24iLCAiZ2V0Q2FyZXRQb3NpdGlvbiIsICJsaW5lVG8iLCAieDEiLCAieTEiLCAieDIiLCAieTIiLCAieDMiLCAieTMiLCAicHRYIiwgInB0WSIsICJwdCIsICJ0aXRsZUFsaWduIiwgInRpdGxlQ29sb3IiLCAiX2RyYXdDb2xvckJveCIsICJjb2xvclgiLCAicnRsQ29sb3JYIiwgInlPZmZTZXQiLCAiY29sb3JZIiwgIm11bHRpS2V5QmFja2dyb3VuZCIsICJkcmF3UG9pbnQiLCAiaXNPYmplY3QiLCAib3V0ZXJYIiwgImlubmVyWCIsICJmaWxsUmVjdCIsICJzdHJva2VSZWN0IiwgImRyYXdCb2R5IiwgImJvZHlBbGlnbiIsICJ4TGluZVBhZGRpbmciLCAiZmlsbExpbmVPZlRleHQiLCAiYm9keUFsaWduRm9yQ2FsY3VsYXRpb24iLCAidGV4dENvbG9yIiwgImoiLCAiaWxlbiIsICJqbGVuIiwgImRyYXdGb290ZXIiLCAiZm9vdGVyQWxpZ24iLCAiZm9vdGVyQ29sb3IiLCAiZHJhd0JhY2tncm91bmQiLCAidG9vbHRpcFNpemUiLCAibW92ZVRvIiwgInF1YWRyYXRpY0N1cnZlVG8iLCAiY2xvc2VQYXRoIiwgIl91cGRhdGVBbmltYXRpb25UYXJnZXQiLCAiYW5pbXMiLCAiYW5pbVgiLCAiYW5pbVkiLCAicG9pbnQiLCAiX3RvIiwgIl93aWxsUmVuZGVyIiwgImFicyIsICJoYXNUb29sdGlwQ29udGVudCIsICJnbG9iYWxBbHBoYSIsICJnZXRBY3RpdmVFbGVtZW50cyIsICJzZXRBY3RpdmVFbGVtZW50cyIsICJhY3RpdmVFbGVtZW50cyIsICJsYXN0QWN0aXZlIiwgIkVycm9yIiwgIl9lbGVtZW50c0VxdWFsIiwgInBvc2l0aW9uQ2hhbmdlZCIsICJfcG9zaXRpb25DaGFuZ2VkIiwgIl9pZ25vcmVSZXBsYXlFdmVudHMiLCAiaW5DaGFydEFyZWEiLCAiX2dldEFjdGl2ZUVsZW1lbnRzIiwgImdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUiLCAiYWZ0ZXJJbml0IiwgInJlc2V0IiwgImFmdGVyRHJhdyIsICJub3RpZnlQbHVnaW5zIiwgImNhbmNlbGFibGUiLCAidXNlRmluYWxQb3NpdGlvbiIsICJkdXJhdGlvbiIsICJlYXNpbmciLCAibnVtYmVycyIsICJfZmFsbGJhY2siLCAiYWRkaXRpb25hbE9wdGlvblNjb3BlcyIsICJhZGRJZlN0cmluZyIsICJsYWJlbHMiLCAicmF3IiwgImluZGV4IiwgImFkZGVkTGFiZWxzIiwgInB1c2giLCAidW5zaGlmdCIsICJsYWJlbCIsICJpc05hTiIsICJmaW5kT3JBZGRMYWJlbCIsICJmaXJzdCIsICJpbmRleE9mIiwgImxhc3QiLCAibGFzdEluZGV4T2YiLCAidmFsaWRJbmRleCIsICJtYXgiLCAiX2xpbWl0VmFsdWUiLCAiTWF0aCIsICJyb3VuZCIsICJfZ2V0TGFiZWxGb3JWYWx1ZSIsICJ2YWx1ZSIsICJnZXRMYWJlbHMiLCAibGVuZ3RoIiwgIkNhdGVnb3J5U2NhbGUiLCAiU2NhbGUiLCAiY29uc3RydWN0b3IiLCAiY2ZnIiwgIl9zdGFydFZhbHVlIiwgInVuZGVmaW5lZCIsICJfdmFsdWVSYW5nZSIsICJfYWRkZWRMYWJlbHMiLCAiaW5pdCIsICJzY2FsZU9wdGlvbnMiLCAiYWRkZWQiLCAic3BsaWNlIiwgInBhcnNlIiwgImlzTnVsbE9yVW5kZWYiLCAiaXNGaW5pdGUiLCAidmFsdWVPckRlZmF1bHQiLCAiZGV0ZXJtaW5lRGF0YUxpbWl0cyIsICJtaW5EZWZpbmVkIiwgIm1heERlZmluZWQiLCAiZ2V0VXNlckJvdW5kcyIsICJtaW4iLCAiZ2V0TWluTWF4IiwgIm9wdGlvbnMiLCAiYm91bmRzIiwgImJ1aWxkVGlja3MiLCAib2Zmc2V0IiwgInRpY2tzIiwgInNsaWNlIiwgImdldExhYmVsRm9yVmFsdWUiLCAiY2FsbCIsICJjb25maWd1cmUiLCAiaXNIb3Jpem9udGFsIiwgIl9yZXZlcnNlUGl4ZWxzIiwgImdldFBpeGVsRm9yVmFsdWUiLCAiTmFOIiwgImdldFBpeGVsRm9yRGVjaW1hbCIsICJnZXRQaXhlbEZvclRpY2siLCAiZ2V0VmFsdWVGb3JQaXhlbCIsICJwaXhlbCIsICJnZXREZWNpbWFsRm9yUGl4ZWwiLCAiZ2V0QmFzZVBpeGVsIiwgImJvdHRvbSIsICJpZCIsICJkZWZhdWx0cyIsICJjYWxsYmFjayIsICJnZW5lcmF0ZVRpY2tzIiwgImdlbmVyYXRpb25PcHRpb25zIiwgImRhdGFSYW5nZSIsICJNSU5fU1BBQ0lORyIsICJzdGVwIiwgInByZWNpc2lvbiIsICJjb3VudCIsICJtYXhUaWNrcyIsICJtYXhEaWdpdHMiLCAiaW5jbHVkZUJvdW5kcyIsICJ1bml0IiwgIm1heFNwYWNlcyIsICJybWluIiwgInJtYXgiLCAiY291bnREZWZpbmVkIiwgIm1pblNwYWNpbmciLCAic3BhY2luZyIsICJuaWNlTnVtIiwgImZhY3RvciIsICJuaWNlTWluIiwgIm5pY2VNYXgiLCAibnVtU3BhY2VzIiwgImNlaWwiLCAiZmxvb3IiLCAicG93IiwgImFsbW9zdFdob2xlIiwgImFsbW9zdEVxdWFscyIsICJkZWNpbWFsUGxhY2VzIiwgIl9kZWNpbWFsUGxhY2VzIiwgImoiLCAicmVsYXRpdmVMYWJlbFNpemUiLCAiaG9yaXpvbnRhbCIsICJtaW5Sb3RhdGlvbiIsICJyYWQiLCAidG9SYWRpYW5zIiwgInJhdGlvIiwgInNpbiIsICJjb3MiLCAiTGluZWFyU2NhbGVCYXNlIiwgInN0YXJ0IiwgImVuZCIsICJfZW5kVmFsdWUiLCAiTnVtYmVyIiwgImhhbmRsZVRpY2tSYW5nZU9wdGlvbnMiLCAiYmVnaW5BdFplcm8iLCAic2V0TWluIiwgInYiLCAic2V0TWF4IiwgIm1pblNpZ24iLCAic2lnbiIsICJtYXhTaWduIiwgImFicyIsICJnZXRUaWNrTGltaXQiLCAidGlja09wdHMiLCAibWF4VGlja3NMaW1pdCIsICJzdGVwU2l6ZSIsICJjb25zb2xlIiwgIndhcm4iLCAiY29tcHV0ZVRpY2tMaW1pdCIsICJQT1NJVElWRV9JTkZJTklUWSIsICJvcHRzIiwgIm51bWVyaWNHZW5lcmF0b3JPcHRpb25zIiwgIl9tYXhEaWdpdHMiLCAiX3JhbmdlIiwgIl9zZXRNaW5BbmRNYXhCeUtleSIsICJyZXZlcnNlIiwgImZvcm1hdE51bWJlciIsICJjaGFydCIsICJsb2NhbGUiLCAiZm9ybWF0IiwgIkxpbmVhclNjYWxlIiwgIndpZHRoIiwgImhlaWdodCIsICJ0aWNrRm9udCIsICJfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyIsICJsaW5lSGVpZ2h0IiwgIlRpY2tzIiwgImZvcm1hdHRlcnMiLCAibnVtZXJpYyIsICJsb2cxMEZsb29yIiwgImxvZzEwIiwgImNoYW5nZUV4cG9uZW50IiwgIm0iLCAiaXNNYWpvciIsICJ0aWNrVmFsIiwgInJlbWFpbiIsICJzdGVwcyIsICJyYW5nZUV4cCIsICJyYW5nZVN0ZXAiLCAic3RhcnRFeHAiLCAicmFuZ2UiLCAiZmluaXRlT3JEZWZhdWx0IiwgIm1pbkV4cCIsICJleHAiLCAiYmFzZSIsICJzaWduaWZpY2FuZCIsICJtYWpvciIsICJsYXN0VGljayIsICJMb2dhcml0aG1pY1NjYWxlIiwgInByb3RvdHlwZSIsICJhcHBseSIsICJfemVybyIsICJfc3VnZ2VzdGVkTWluIiwgIl91c2VyTWluIiwgIl91c2VyTWF4IiwgImRlY2ltYWwiLCAibG9nYXJpdGhtaWMiLCAiZW5hYmxlZCIsICJnZXRUaWNrQmFja2Ryb3BIZWlnaHQiLCAiZGlzcGxheSIsICJwYWRkaW5nIiwgInRvUGFkZGluZyIsICJiYWNrZHJvcFBhZGRpbmciLCAiZm9udCIsICJzaXplIiwgIm1lYXN1cmVMYWJlbFNpemUiLCAiY3R4IiwgImlzQXJyYXkiLCAidyIsICJfbG9uZ2VzdFRleHQiLCAic3RyaW5nIiwgImgiLCAiZGV0ZXJtaW5lTGltaXRzIiwgImFuZ2xlIiwgInBvcyIsICJmaXRXaXRoUG9pbnRMYWJlbHMiLCAic2NhbGUiLCAib3JpZyIsICJsIiwgImxlZnQiLCAiX3BhZGRpbmciLCAiciIsICJyaWdodCIsICJ0IiwgInRvcCIsICJiIiwgImxpbWl0cyIsICJPYmplY3QiLCAiYXNzaWduIiwgImxhYmVsU2l6ZXMiLCAidmFsdWVDb3VudCIsICJfcG9pbnRMYWJlbHMiLCAicG9pbnRMYWJlbE9wdHMiLCAicG9pbnRMYWJlbHMiLCAiYWRkaXRpb25hbEFuZ2xlIiwgImNlbnRlclBvaW50TGFiZWxzIiwgIlBJIiwgImkiLCAic2V0Q29udGV4dCIsICJnZXRQb2ludExhYmVsQ29udGV4dCIsICJwb2ludFBvc2l0aW9uIiwgImdldFBvaW50UG9zaXRpb24iLCAiZHJhd2luZ0FyZWEiLCAicGxGb250IiwgInRvRm9udCIsICJ0ZXh0U2l6ZSIsICJhbmdsZVJhZGlhbnMiLCAiX25vcm1hbGl6ZUFuZ2xlIiwgImdldEluZGV4QW5nbGUiLCAidG9EZWdyZWVzIiwgImhMaW1pdHMiLCAieCIsICJ2TGltaXRzIiwgInkiLCAidXBkYXRlTGltaXRzIiwgInNldENlbnRlclBvaW50IiwgIl9wb2ludExhYmVsSXRlbXMiLCAiYnVpbGRQb2ludExhYmVsSXRlbXMiLCAiaXRlbXMiLCAiZXh0cmEiLCAib3V0ZXJEaXN0YW5jZSIsICJwb2ludExhYmVsUG9zaXRpb24iLCAiSEFMRl9QSSIsICJ5Rm9yQW5nbGUiLCAidGV4dEFsaWduIiwgImdldFRleHRBbGlnbkZvckFuZ2xlIiwgImxlZnRGb3JUZXh0QWxpZ24iLCAiYWxpZ24iLCAiZHJhd1BvaW50TGFiZWxzIiwgImxhYmVsQ291bnQiLCAib3B0c0F0SW5kZXgiLCAiYmFja2Ryb3BDb2xvciIsICJib3JkZXJSYWRpdXMiLCAidG9UUkJMQ29ybmVycyIsICJmaWxsU3R5bGUiLCAiYmFja2Ryb3BMZWZ0IiwgImJhY2tkcm9wVG9wIiwgImJhY2tkcm9wV2lkdGgiLCAiYmFja2Ryb3BIZWlnaHQiLCAidmFsdWVzIiwgInNvbWUiLCAiYmVnaW5QYXRoIiwgImFkZFJvdW5kZWRSZWN0UGF0aCIsICJyYWRpdXMiLCAiZmlsbCIsICJmaWxsUmVjdCIsICJyZW5kZXJUZXh0IiwgImNvbG9yIiwgInRleHRCYXNlbGluZSIsICJwYXRoUmFkaXVzTGluZSIsICJjaXJjdWxhciIsICJhcmMiLCAieENlbnRlciIsICJ5Q2VudGVyIiwgIlRBVSIsICJtb3ZlVG8iLCAibGluZVRvIiwgImRyYXdSYWRpdXNMaW5lIiwgImdyaWRMaW5lT3B0cyIsICJib3JkZXJPcHRzIiwgImxpbmVXaWR0aCIsICJzYXZlIiwgInN0cm9rZVN0eWxlIiwgInNldExpbmVEYXNoIiwgImRhc2giLCAibGluZURhc2hPZmZzZXQiLCAiZGFzaE9mZnNldCIsICJjbG9zZVBhdGgiLCAic3Ryb2tlIiwgInJlc3RvcmUiLCAiY3JlYXRlUG9pbnRMYWJlbENvbnRleHQiLCAicGFyZW50IiwgImNyZWF0ZUNvbnRleHQiLCAidHlwZSIsICJSYWRpYWxMaW5lYXJTY2FsZSIsICJzZXREaW1lbnNpb25zIiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJnZW5lcmF0ZVRpY2tMYWJlbHMiLCAibWFwIiwgImNhbGxDYWxsYmFjayIsICJmaWx0ZXIiLCAiZ2V0RGF0YVZpc2liaWxpdHkiLCAiZml0IiwgImxlZnRNb3ZlbWVudCIsICJyaWdodE1vdmVtZW50IiwgInRvcE1vdmVtZW50IiwgImJvdHRvbU1vdmVtZW50IiwgImFuZ2xlTXVsdGlwbGllciIsICJzdGFydEFuZ2xlIiwgImdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlIiwgInNjYWxpbmdGYWN0b3IiLCAiZ2V0VmFsdWVGb3JEaXN0YW5jZUZyb21DZW50ZXIiLCAiZGlzdGFuY2UiLCAic2NhbGVkRGlzdGFuY2UiLCAicG9pbnRMYWJlbCIsICJnZXRDb250ZXh0IiwgImRpc3RhbmNlRnJvbUNlbnRlciIsICJnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUiLCAiZ2V0QmFzZVBvc2l0aW9uIiwgImdldEJhc2VWYWx1ZSIsICJnZXRQb2ludExhYmVsUG9zaXRpb24iLCAiZHJhd0JhY2tncm91bmQiLCAiYmFja2dyb3VuZENvbG9yIiwgImdyaWQiLCAiZHJhd0dyaWQiLCAiYW5nbGVMaW5lcyIsICJib3JkZXIiLCAicG9zaXRpb24iLCAiZm9yRWFjaCIsICJ0aWNrIiwgImNvbnRleHQiLCAib3B0c0F0SW5kZXhCb3JkZXIiLCAiYm9yZGVyRGFzaCIsICJib3JkZXJEYXNoT2Zmc2V0IiwgImRyYXdCb3JkZXIiLCAiZHJhd0xhYmVscyIsICJ0cmFuc2xhdGUiLCAicm90YXRlIiwgInNob3dMYWJlbEJhY2tkcm9wIiwgIm1lYXN1cmVUZXh0IiwgImRyYXdUaXRsZSIsICJhbmltYXRlIiwgImRlZmF1bHRSb3V0ZXMiLCAiZGVzY3JpcHRvcnMiLCAiX2ZhbGxiYWNrIiwgIklOVEVSVkFMUyIsICJtaWxsaXNlY29uZCIsICJjb21tb24iLCAic2Vjb25kIiwgIm1pbnV0ZSIsICJob3VyIiwgImRheSIsICJ3ZWVrIiwgIm1vbnRoIiwgInF1YXJ0ZXIiLCAieWVhciIsICJVTklUUyIsICJrZXlzIiwgInNvcnRlciIsICJhIiwgImlucHV0IiwgImFkYXB0ZXIiLCAiX2FkYXB0ZXIiLCAicGFyc2VyIiwgImlzb1dlZWtkYXkiLCAiX3BhcnNlT3B0cyIsICJpc051bWJlciIsICJzdGFydE9mIiwgImRldGVybWluZVVuaXRGb3JBdXRvVGlja3MiLCAibWluVW5pdCIsICJjYXBhY2l0eSIsICJpbGVuIiwgImludGVydmFsIiwgIk1BWF9TQUZFX0lOVEVHRVIiLCAiZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmciLCAibnVtVGlja3MiLCAiZGlmZiIsICJkZXRlcm1pbmVNYWpvclVuaXQiLCAiYWRkVGljayIsICJ0aW1lIiwgInRpbWVzdGFtcHMiLCAibG8iLCAiaGkiLCAiX2xvb2t1cCIsICJ0aW1lc3RhbXAiLCAic2V0TWFqb3JUaWNrcyIsICJtYWpvclVuaXQiLCAiYWRkIiwgInRpY2tzRnJvbVRpbWVzdGFtcHMiLCAiVGltZVNjYWxlIiwgInByb3BzIiwgIl9jYWNoZSIsICJkYXRhIiwgImFsbCIsICJfdW5pdCIsICJfbWFqb3JVbml0IiwgIl9vZmZzZXRzIiwgIl9ub3JtYWxpemVkIiwgInNjYWxlT3B0cyIsICJhZGFwdGVycyIsICJfZGF0ZSIsICJkYXRlIiwgIm1lcmdlSWYiLCAiZGlzcGxheUZvcm1hdHMiLCAiZm9ybWF0cyIsICJub3JtYWxpemVkIiwgImJlZm9yZUxheW91dCIsICJfYXBwbHlCb3VuZHMiLCAiX2dldExhYmVsQm91bmRzIiwgInNvdXJjZSIsICJEYXRlIiwgIm5vdyIsICJlbmRPZiIsICJhcnIiLCAiZ2V0TGFiZWxUaW1lc3RhbXBzIiwgIk5FR0FUSVZFX0lORklOSVRZIiwgInRpbWVPcHRzIiwgIl9nZW5lcmF0ZSIsICJfZmlsdGVyQmV0d2VlbiIsICJhdXRvU2tpcCIsICJfZ2V0TGFiZWxDYXBhY2l0eSIsICJpbml0T2Zmc2V0cyIsICJhZnRlckF1dG9Ta2lwIiwgIm9mZnNldEFmdGVyQXV0b3NraXAiLCAiZ2V0RGVjaW1hbEZvclZhbHVlIiwgImxpbWl0IiwgIm1pbm9yIiwgIndlZWtkYXkiLCAiaGFzV2Vla2RheSIsICJFcnJvciIsICJnZXREYXRhVGltZXN0YW1wcyIsICJzb3J0IiwgInRvb2x0aXBGb3JtYXQiLCAiZGF0ZXRpbWUiLCAiZm10IiwgIl90aWNrRm9ybWF0RnVuY3Rpb24iLCAiZm9ybWF0dGVyIiwgIm1pbm9yRm9ybWF0IiwgIm1ham9yRm9ybWF0IiwgIm9mZnNldHMiLCAiX2dldExhYmVsU2l6ZSIsICJ0aWNrc09wdHMiLCAidGlja0xhYmVsV2lkdGgiLCAibWF4Um90YXRpb24iLCAiY29zUm90YXRpb24iLCAic2luUm90YXRpb24iLCAidGlja0ZvbnRTaXplIiwgImV4YW1wbGVUaW1lIiwgImV4YW1wbGVMYWJlbCIsICJtZXRhcyIsICJnZXRNYXRjaGluZ1Zpc2libGVNZXRhcyIsICJjb250cm9sbGVyIiwgImdldEFsbFBhcnNlZFZhbHVlcyIsICJjb25jYXQiLCAibm9ybWFsaXplIiwgIl9hcnJheVVuaXF1ZSIsICJpbnRlcnBvbGF0ZSIsICJ0YWJsZSIsICJ2YWwiLCAicHJldlNvdXJjZSIsICJuZXh0U291cmNlIiwgInByZXZUYXJnZXQiLCAibmV4dFRhcmdldCIsICJfbG9va3VwQnlLZXkiLCAic3BhbiIsICJUaW1lU2VyaWVzU2NhbGUiLCAiX3RhYmxlIiwgIl9taW5Qb3MiLCAiX3RhYmxlUmFuZ2UiLCAiX2dldFRpbWVzdGFtcHNGb3JUYWJsZSIsICJidWlsZExvb2t1cFRhYmxlIiwgInByZXYiLCAiY3VyciIsICJuZXh0IiwgImFwcCIsICJoIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAibmFtZSIsICJhcHAiLCAicGFyc2UiLCAiaW1wb3J0X29ic2lkaWFuIiwgInJhbmsiLCAiZWFzZSIsICJwYXJzZSIsICJzaWJsaW5ncyJdCn0K diff --git a/src/flashcard-modal.tsx b/src/flashcard-modal.tsx index 7b4cba98..8e7f3845 100644 --- a/src/flashcard-modal.tsx +++ b/src/flashcard-modal.tsx @@ -193,6 +193,7 @@ export class FlashcardModal extends Modal { // Checks if the input textbox is in focus before processing keyboard shortcuts. if ( document.activeElement.nodeName != "TEXTAREA" && + document.activeElement.nodeName !== "INPUT" && this.mode !== FlashcardModalMode.DecksList ) { const consume = () => { @@ -413,7 +414,29 @@ export class FlashcardModal extends Modal { this.currentDeck.nextCard(this); } + private getClozeBackView(inputs: string[]): string { + const { convertBoldTextToClozes, convertHighlightsToClozes, convertCurlyBracketsToClozes } = + this.plugin.data.settings; + + const clozeMatches = this.currentCard.cardText.match(/==\w+==/g); + const clozes = clozeMatches.map((match) => match.replaceAll("==", "")); + + const output = clozes.reduce((acc, answer, index) => { + return acc.replace( + clozeMatches[index], + answer === inputs[index] + ? `${inputs[index]}` + : `[${inputs[index]}${answer}]` + ); + }, this.currentCard.cardText); + + return output; + } + private showAnswer(): void { + const clozeInputFields = Array.from(document.getElementsByClassName("cloze-input")); + const clozeInputs = clozeInputFields.map((clozeInput) => clozeInput.value); + this.mode = FlashcardModalMode.Back; this.answerBtn.style.display = "none"; @@ -428,6 +451,7 @@ export class FlashcardModal extends Modal { hr.setAttribute("id", "sr-hr-card-divide"); this.flashcardView.appendChild(hr); } else { + this.currentCard.back = this.getClozeBackView(clozeInputs); this.flashcardView.empty(); } diff --git a/src/main.ts b/src/main.ts index 5704b1d7..0b7473e7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -710,32 +710,16 @@ export default class SRPlugin extends Plugin { return 0; }); - let front: string, back: string; - for (const m of siblings) { - const deletionStart: number = m.index, - deletionEnd: number = deletionStart + m[0].length; - front = - cardText.substring(0, deletionStart) + - "[...]" + - cardText.substring(deletionEnd); - front = front - .replace(/==/gm, "") - .replace(/\*\*/gm, "") - .replace(/{{/gm, "") - .replace(/}}/gm, ""); - back = - cardText.substring(0, deletionStart) + - "" + - cardText.substring(deletionStart, deletionEnd) + - "" + - cardText.substring(deletionEnd); - back = back - .replace(/==/gm, "") - .replace(/\*\*/gm, "") - .replace(/{{/gm, "") - .replace(/}}/gm, ""); - siblingMatches.push([front, back]); - } + const front = siblings.reduce((acc, sibling) => { + const inputHTML = ``; + + return acc + ? acc.replace(sibling[0], inputHTML) + : acc + sibling.input.replace(sibling[0], inputHTML); + }, ""); + + // back is being created in flashcard-modal.tsx with getClozeBackView() + siblingMatches.push([front, ""]); } else { let idx: number; if (cardType === CardType.SingleLineBasic) { diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..6c76945c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3388 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.7.2": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + +"@eslint/eslintrc@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" + integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.35.0": + version "8.35.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" + integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@kurkle/color@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" + integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/codemirror@0.0.108": + version "0.0.108" + resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.108.tgz#e640422b666bf49251b384c390cdeb2362585bde" + integrity sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw== + dependencies: + "@types/tern" "*" + +"@types/estree@*": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.2.4": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/node@*", "@types/node@^18.11.13": + version "18.15.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" + integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/tern@*": + version "0.23.4" + resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" + integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== + dependencies: + "@types/estree" "*" + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/vhtml@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@types/vhtml/-/vhtml-2.2.4.tgz#761bce4b2aa63782b5b9a290c8e0c271b29f57cd" + integrity sha512-H7/C7RZuaoc45JRPKNTsyVwgCMNY9u20QKs1fz4pKKjwpnQe5Jo+YhFq5UQI+h5orsHg+3OZ2tJlUkxkIHUa2w== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.22" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" + integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.46.0": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" + integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== + dependencies: + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/type-utils" "5.54.1" + "@typescript-eslint/utils" "5.54.1" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.46.0": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" + integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== + dependencies: + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" + integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== + dependencies: + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" + +"@typescript-eslint/type-utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" + integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== + dependencies: + "@typescript-eslint/typescript-estree" "5.54.1" + "@typescript-eslint/utils" "5.54.1" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" + integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== + +"@typescript-eslint/typescript-estree@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" + integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== + dependencies: + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/visitor-keys" "5.54.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" + integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.54.1" + "@typescript-eslint/types" "5.54.1" + "@typescript-eslint/typescript-estree" "5.54.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.54.1": + version "5.54.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" + integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== + dependencies: + "@typescript-eslint/types" "5.54.1" + eslint-visitor-keys "^3.3.0" + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.1.0, acorn@^8.8.0, acorn@^8.8.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001449: + version "1.0.30001464" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" + integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chart.js@^4.0.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.2.1.tgz#d2bd5c98e9a0ae35408975b638f40513b067ba1d" + integrity sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw== + dependencies: + "@kurkle/color" "^0.3.0" + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" + integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +electron-to-chromium@^1.4.284: + version "1.4.327" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.327.tgz#288b106518cfed0a60f7de8a0480432a9be45477" + integrity sha512-DIk2H4g/3ZhjgiABJjVdQvUdMlSABOsjeCm6gmUzIdKxAuFrGiJ8QXMm3i09grZdDBMC/d8MELMrdwYRC0+YHg== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +esbuild@~0.16.4: + version "0.16.17" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + optionalDependencies: + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@^8.29.0: + version "8.35.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" + integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== + dependencies: + "@eslint/eslintrc" "^2.0.0" + "@eslint/js" "8.35.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.4.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-jsdom@^29.3.1: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + jsdom "^20.0.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-expect-message@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/jest-expect-message/-/jest-expect-message-1.1.3.tgz#a3f6bd4503f5bd5d2e37b70d3126a2bdb215ec58" + integrity sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg== + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" + +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + +jest-util@^29.0.0, jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.3.1: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== + dependencies: + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" + import-local "^3.0.2" + jest-cli "^29.5.0" + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +moment@2.29.4, moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" + integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + +obsidian@^0.16.3: + version "0.16.3" + resolved "https://registry.yarnpkg.com/obsidian/-/obsidian-0.16.3.tgz#137b7e91f949517a1bc817b1d7ef9b8aefb219bc" + integrity sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw== + dependencies: + "@types/codemirror" "0.0.108" + moment "2.29.4" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pagerank.js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pagerank.js/-/pagerank.js-1.0.2.tgz#8f0d8b2b68eb6fadde0aad780df045d226f77584" + integrity sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier@^2.8.1: + version "2.8.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pure-rand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.0.tgz#701996ceefa253507923a0e864c17ab421c04a7c" + integrity sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.1.tgz#cee884cd4e3f355660e501fa3276b27d7ffe5a20" + integrity sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw== + +resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +semver@7.x, semver@^7.3.5, semver@^7.3.7: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +ts-jest@^29.0.3: + version "29.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" + integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +tslib@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@4.9.4: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +vhtml@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vhtml/-/vhtml-2.2.0.tgz#369e6823ed6c32cbb9f6e33395bae7c65faa014c" + integrity sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ== + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@^8.11.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 2786922e760878ccb2eb02e760d2725b62945865 Mon Sep 17 00:00:00 2001 From: Goran Zdjelar Date: Sun, 12 Mar 2023 19:29:57 +0100 Subject: [PATCH 2/3] Respect cloze settings --- esbuild.config.mjs | 2 +- src/cloze-matching.ts | 27 +++++++++++++++++++++++++++ src/flashcard-modal.tsx | 22 ++++++++++------------ src/main.ts | 38 +++++++++++--------------------------- 4 files changed, 49 insertions(+), 40 deletions(-) create mode 100644 src/cloze-matching.ts diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 3200e727..57268723 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -25,6 +25,6 @@ esbuild sourcemap: "inline", sourcesContent: !prod, treeShaking: true, - outfile: "main.js", + outfile: "build/main.js", }) .catch(() => process.exit(1)); diff --git a/src/cloze-matching.ts b/src/cloze-matching.ts new file mode 100644 index 00000000..464e7fd1 --- /dev/null +++ b/src/cloze-matching.ts @@ -0,0 +1,27 @@ +import { SRSettings } from "./settings"; + +export function matchClozesWithinCardText( + cardText: string, + settings: SRSettings +): RegExpMatchArray[] { + const siblings: RegExpMatchArray[] = []; + if (settings.convertHighlightsToClozes) { + siblings.push(...cardText.matchAll(/==(.*?)==/gm)); + } + if (settings.convertBoldTextToClozes) { + siblings.push(...cardText.matchAll(/\*\*(.*?)\*\*/gm)); + } + if (settings.convertCurlyBracketsToClozes) { + siblings.push(...cardText.matchAll(/{{(.*?)}}/gm)); + } + + return siblings.sort((a, b) => { + if (a.index < b.index) { + return -1; + } + if (a.index > b.index) { + return 1; + } + return 0; + }); +} diff --git a/src/flashcard-modal.tsx b/src/flashcard-modal.tsx index 8e7f3845..fda459dc 100644 --- a/src/flashcard-modal.tsx +++ b/src/flashcard-modal.tsx @@ -24,6 +24,7 @@ import { } from "src/constants"; import { escapeRegexString, cyrb53 } from "src/utils"; import { t } from "src/lang/helpers"; +import { matchClozesWithinCardText } from "./cloze-matching"; export enum FlashcardModalMode { DecksList, @@ -414,23 +415,20 @@ export class FlashcardModal extends Modal { this.currentDeck.nextCard(this); } - private getClozeBackView(inputs: string[]): string { - const { convertBoldTextToClozes, convertHighlightsToClozes, convertCurlyBracketsToClozes } = - this.plugin.data.settings; + private getClozeBackView(clozeInputs: string[]): string { + const { cardText } = this.currentCard; - const clozeMatches = this.currentCard.cardText.match(/==\w+==/g); - const clozes = clozeMatches.map((match) => match.replaceAll("==", "")); + const clozeMatches = matchClozesWithinCardText(cardText, this.plugin.data.settings); + const correctAnswers = clozeMatches.map((match) => match[1]); - const output = clozes.reduce((acc, answer, index) => { + return correctAnswers.reduce((acc, answer, index) => { return acc.replace( - clozeMatches[index], - answer === inputs[index] - ? `${inputs[index]}` - : `[${inputs[index]}${answer}]` + clozeMatches[index][0], + answer === clozeInputs[index] + ? `${clozeInputs[index]}` + : `[${clozeInputs[index]}${answer}]` ); }, this.currentCard.cardText); - - return output; } private showAnswer(): void { diff --git a/src/main.ts b/src/main.ts index 0b7473e7..35353491 100644 --- a/src/main.ts +++ b/src/main.ts @@ -25,6 +25,7 @@ import { ReviewDeck, ReviewDeckSelectionModal } from "src/review-deck"; import { t } from "src/lang/helpers"; import { parse } from "src/parser"; import { appIcon } from "src/icons/appicon"; +import { matchClozesWithinCardText } from "./cloze-matching"; interface PluginData { settings: SRSettings; @@ -690,33 +691,16 @@ export default class SRPlugin extends Plugin { const siblingMatches: [string, string][] = []; if (cardType === CardType.Cloze) { - const siblings: RegExpMatchArray[] = []; - if (settings.convertHighlightsToClozes) { - siblings.push(...cardText.matchAll(/==(.*?)==/gm)); - } - if (settings.convertBoldTextToClozes) { - siblings.push(...cardText.matchAll(/\*\*(.*?)\*\*/gm)); - } - if (settings.convertCurlyBracketsToClozes) { - siblings.push(...cardText.matchAll(/{{(.*?)}}/gm)); - } - siblings.sort((a, b) => { - if (a.index < b.index) { - return -1; - } - if (a.index > b.index) { - return 1; - } - return 0; - }); - - const front = siblings.reduce((acc, sibling) => { - const inputHTML = ``; - - return acc - ? acc.replace(sibling[0], inputHTML) - : acc + sibling.input.replace(sibling[0], inputHTML); - }, ""); + const front = matchClozesWithinCardText(cardText, this.data.settings).reduce( + (acc, sibling) => { + const inputHTML = ``; + + return acc + ? acc.replace(sibling[0], inputHTML) + : acc + sibling.input.replace(sibling[0], inputHTML); + }, + "" + ); // back is being created in flashcard-modal.tsx with getClozeBackView() siblingMatches.push([front, ""]); From 6f02924ba8ae57cabc51bc603b9db1c3ff7f8207 Mon Sep 17 00:00:00 2001 From: Goran Zdjelar Date: Wed, 22 Mar 2023 17:28:48 +0100 Subject: [PATCH 3/3] Remove accidentally commited files --- main.js | 16173 ---------------------------------------------------- yarn.lock | 3388 ----------- 2 files changed, 19561 deletions(-) delete mode 100644 main.js delete mode 100644 yarn.lock diff --git a/main.js b/main.js deleted file mode 100644 index c0cf3907..00000000 --- a/main.js +++ /dev/null @@ -1,16173 +0,0 @@ -/* -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 __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; -}; -var __export = (target, all) => { - for (var name2 in all) - __defProp(target, name2, { get: all[name2], enumerable: true }); -}; -var __copyProps = (to2, from2, except, desc) => { - if (from2 && typeof from2 === "object" || typeof from2 === "function") { - for (let key of __getOwnPropNames(from2)) - if (!__hasOwnProp.call(to2, key) && key !== except) - __defProp(to2, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc(from2, key)) || desc.enumerable }); - } - return to2; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var __publicField = (obj, key, value) => { - __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); - return value; -}; - -// node_modules/pagerank.js/lib/index.js -var require_lib = __commonJS({ - "node_modules/pagerank.js/lib/index.js"(exports, module2) { - "use strict"; - function forOwn(object, callback2) { - if (typeof object === "object" && typeof callback2 === "function") { - for (var key in object) { - if (object.hasOwnProperty(key) === true) { - if (callback2(key, object[key]) === false) { - break; - } - } - } - } - } - module2.exports = function() { - var self = { - count: 0, - edges: {}, - nodes: {} - }; - self.link = function(source, target, weight) { - if (isFinite(weight) !== true || weight === null) { - weight = 1; - } - weight = parseFloat(weight); - if (self.nodes.hasOwnProperty(source) !== true) { - self.count++; - self.nodes[source] = { - weight: 0, - outbound: 0 - }; - } - self.nodes[source].outbound += weight; - if (self.nodes.hasOwnProperty(target) !== true) { - self.count++; - self.nodes[target] = { - weight: 0, - outbound: 0 - }; - } - if (self.edges.hasOwnProperty(source) !== true) { - self.edges[source] = {}; - } - if (self.edges[source].hasOwnProperty(target) !== true) { - self.edges[source][target] = 0; - } - self.edges[source][target] += weight; - }; - self.rank = function(alpha2, epsilon, callback2) { - var delta = 1, inverse = 1 / self.count; - forOwn(self.edges, function(source) { - if (self.nodes[source].outbound > 0) { - forOwn(self.edges[source], function(target) { - self.edges[source][target] /= self.nodes[source].outbound; - }); - } - }); - forOwn(self.nodes, function(key) { - self.nodes[key].weight = inverse; - }); - while (delta > epsilon) { - var leak = 0, nodes = {}; - forOwn(self.nodes, function(key, value) { - nodes[key] = value.weight; - if (value.outbound === 0) { - leak += value.weight; - } - self.nodes[key].weight = 0; - }); - leak *= alpha2; - forOwn(self.nodes, function(source) { - forOwn(self.edges[source], function(target, weight) { - self.nodes[target].weight += alpha2 * nodes[source] * weight; - }); - self.nodes[source].weight += (1 - alpha2) * inverse + leak * inverse; - }); - delta = 0; - forOwn(self.nodes, function(key, value) { - delta += Math.abs(value.weight - nodes[key]); - }); - } - forOwn(self.nodes, function(key) { - return callback2(key, self.nodes[key].weight); - }); - }; - self.reset = function() { - self.count = 0; - self.edges = {}; - self.nodes = {}; - }; - return self; - }(); - } -}); - -// node_modules/vhtml/dist/vhtml.js -var require_vhtml = __commonJS({ - "node_modules/vhtml/dist/vhtml.js"(exports, module2) { - (function(global, factory) { - typeof exports === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.vhtml = factory(); - })(exports, function() { - "use strict"; - var emptyTags = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; - var esc = function esc2(str) { - return String(str).replace(/[&<>"']/g, function(s) { - return "&" + map3[s] + ";"; - }); - }; - var map3 = { "&": "amp", "<": "lt", ">": "gt", '"': "quot", "'": "apos" }; - var setInnerHTMLAttr = "dangerouslySetInnerHTML"; - var DOMAttributeNames = { - className: "class", - htmlFor: "for" - }; - var sanitized = {}; - function h4(name2, attrs) { - var stack = [], s = ""; - attrs = attrs || {}; - for (var i = arguments.length; i-- > 2; ) { - stack.push(arguments[i]); - } - if (typeof name2 === "function") { - attrs.children = stack.reverse(); - return name2(attrs); - } - if (name2) { - s += "<" + name2; - if (attrs) - for (var _i in attrs) { - if (attrs[_i] !== false && attrs[_i] != null && _i !== setInnerHTMLAttr) { - s += " " + (DOMAttributeNames[_i] ? DOMAttributeNames[_i] : esc(_i)) + '="' + esc(attrs[_i]) + '"'; - } - } - s += ">"; - } - if (emptyTags.indexOf(name2) === -1) { - if (attrs[setInnerHTMLAttr]) { - s += attrs[setInnerHTMLAttr].__html; - } else - while (stack.length) { - var child = stack.pop(); - if (child) { - if (child.pop) { - for (var _i2 = child.length; _i2--; ) { - stack.push(child[_i2]); - } - } else { - s += sanitized[child] === true ? child : esc(child); - } - } - } - s += name2 ? "" : ""; - } - sanitized[s] = true; - return s; - } - return h4; - }); - } -}); - -// src/main.ts -var main_exports = {}; -__export(main_exports, { - default: () => SRPlugin -}); -module.exports = __toCommonJS(main_exports); -var import_obsidian8 = require("obsidian"); -var graph = __toESM(require_lib()); - -// src/settings.ts -var import_obsidian2 = require("obsidian"); - -// src/lang/helpers.ts -var import_obsidian = require("obsidian"); - -// src/lang/locale/af.ts -var af_default = {}; - -// src/lang/locale/ar.ts -var ar_default = { - // flashcard-modal.tsx - DECKS: "\u0627\u0644\u0631\u064F\u0632\u0645\u064E\u0627\u062A", - DUE_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u064F\u0633\u062A\u062D\u0642\u0629", - NEW_CARDS: "\u0628\u0637\u0627\u0642\u0627\u062A \u062C\u062F\u064A\u062F\u0629", - TOTAL_CARDS: "\u0625\u062C\u0645\u0627\u0644\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", - BACK: "\u0631\u062C\u0648\u0639", - SKIP: "Skip", - EDIT_CARD: "\u062A\u0639\u062F\u064A\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", - RESET_CARD_PROGRESS: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645\u0652 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", - HARD: "\u0635\u0639\u0628", - GOOD: "\u062C\u064A\u062F", - EASY: "\u0633\u0647\u0644", - SHOW_ANSWER: "\u0623\u0638\u0647\u0650\u0631 \u0627\u0644\u0625\u062C\u0627\u0628\u0629", - CARD_PROGRESS_RESET: ".\u062A\u0645\u0651\u064E\u062A \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u062A\u0642\u062F\u0651\u064F\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", - SAVE: "\u062D\u0641\u0638", - CANCEL: "\u0625\u0644\u063A\u0627\u0621", - NO_INPUT: ".\u0644\u0645 \u064A\u062A\u0650\u0645 \u062A\u0642\u062F\u064A\u0645 \u0623\u064A \u0645\u064F\u062F\u062E\u0644\u0627\u062A", - CURRENT_EASE_HELP_TEXT: ":\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629", - CURRENT_INTERVAL_HELP_TEXT: ":\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0627\u0644\u062D\u0627\u0644\u064A", - CARD_GENERATED_FROM: "${notePath} :\u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646", - // main.ts - OPEN_NOTE_FOR_REVIEW: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", - REVIEW_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", - REVIEW_EASY_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u0633\u0647\u0644", - REVIEW_GOOD_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u062C\u064A\u062F", - REVIEW_HARD_FILE_MENU: "\u0645\u0631\u0627\u062C\u0639\u0629: \u0635\u0639\u0628", - REVIEW_NOTE_EASY_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u0633\u0647\u0644\u0629", - REVIEW_NOTE_GOOD_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u062C\u064A\u062F\u0629", - REVIEW_NOTE_HARD_CMD: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0643\u0640 \u0635\u0639\u0628\u0629", - CRAM_ALL_CARDS: "\u062D\u062F\u062F \u0631\u064F\u0632\u0645\u064E\u0629 \u0644\u0644\u062D\u0634\u0631", - REVIEW_ALL_CARDS: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u062C\u0645\u064A\u0639 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A", - REVIEW_CARDS_IN_NOTE: "\u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629", - CRAM_CARDS_IN_NOTE: "\u0623\u062D\u0634\u0631 \u062C\u0645\u064A\u0639 \u0628\u0637\u0627\u0642\u0627\u062A \u0647\u0630\u0647 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629", - VIEW_STATS: "\u0639\u0631\u0636 \u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A", - STATUS_BAR: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 ${dueFlashcardsCount},\u0645\u0644\u0627\u062D\u0638\u0627\u062A ${dueNotesCount}:\u0645\u0631\u0627\u062C\u0639\u0629", - SYNC_TIME_TAKEN: "${t}ms \u0627\u0633\u062A\u063A\u0631\u0627\u0642 \u0627\u0644\u0645\u0632\u0627\u0645\u0646\u0629", - NOTE_IN_IGNORED_FOLDER: ".\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u064A\u062A\u0645 \u062D\u0641\u0638\u0647\u0627 \u0636\u0645\u0646 \u0627\u0644\u0645\u062C\u0644\u062F \u0627\u0644\u0630\u064A \u062A\u0645 \u062A\u062C\u0627\u0647\u0644\u0647 (\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)", - PLEASE_TAG_NOTE: ".\u064A\u0631\u062C\u0649 \u0648\u0636\u0639 \u0648\u0633\u0645 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0628\u0634\u0643\u0644 \u0645\u0646\u0627\u0633\u0628 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629 (\u0641\u064A \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A)", - RESPONSE_RECEIVED: ".\u0627\u0633\u062A\u064F\u0644\u0645\u062A \u0627\u0644\u0627\u0633\u062A\u062C\u0627\u0628\u0629", - NO_DECK_EXISTS: "${deckName} \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u064F\u0632\u0645\u064E\u0629", - ALL_CAUGHT_UP: "\u{1F606} \u0644\u0642\u062F \u062A\u0645 \u0627\u0644\u0642\u0628\u0636 \u0639\u0644\u064A\u0643\u0645 \u062C\u0645\u064A\u0639\u0627 \u0627\u0644\u0622\u0646", - // scheduling.ts - DAYS_STR_IVL: "\u064A\u0648\u0645/\u0623\u064A\u0627\u0645 ${interval}", - MONTHS_STR_IVL: "\u0634\u0647\u0631/\u0623\u0634\u0647\u0631 ${interval}", - YEARS_STR_IVL: "\u0633\u0646\u0629/\u0633\u0646\u0648\u0627\u062A ${interval}", - DAYS_STR_IVL_MOBILE: "\u064A${interval}", - MONTHS_STR_IVL_MOBILE: "\u0634${interval}", - YEARS_STR_IVL_MOBILE: "\u0633${interval}", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", - CHECK_WIKI: '.wiki \u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u060C \u062A\u062D\u0642\u0642 \u0645\u0646', - FOLDERS_TO_IGNORE: "\u0645\u062C\u0644\u062F\u0627\u062A \u0644\u062A\u062C\u0627\u0647\u0644\u0647\u0627", - FOLDERS_TO_IGNORE_DESC: "Templates Meta/Scripts : \u0623\u062F\u062E\u0644 \u0645\u0633\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u062C\u0644\u062F \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0648\u0627\u0633\u0637\u0629 \u0633\u0637\u0648\u0631 \u062C\u062F\u064A\u062F\u0629,\u0645\u062B\u0627\u0644", - FLASHCARDS: "\u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", - FLASHCARD_EASY_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0633\u0647\u0644", - FLASHCARD_GOOD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u062C\u064A\u062F", - FLASHCARD_HARD_LABEL: "\u0646\u0635 \u0627\u0644\u0632\u0631 \u0635\u0639\u0628", - FLASHCARD_EASY_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0633\u0647\u0644', - FLASHCARD_GOOD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u062C\u064A\u062F', - FLASHCARD_HARD_DESC: '"\u062A\u062E\u0635\u064A\u0635 \u0627\u0644\u062A\u0633\u0645\u064A\u0629 \u0644\u0644\u0632\u0631 "\u0635\u0639\u0628', - FLASHCARD_TAGS: "\u0648\u064F\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", - FLASHCARD_TAGS_DESC: "#2\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u064F\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u0623\u0633\u0637\u0631 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A# \u0631\u0632\u0645\u06293# \u0631\u0632\u0645\u0629", - CONVERT_FOLDERS_TO_DECKS: "\u062A\u062D\u0648\u064A\u0644 \u0627\u0644\u0645\u062C\u0644\u062F\u0627\u062A \u0625\u0644\u0649 \u0645\u0644\u0641\u0627\u062A \u0623\u0635\u0644\u064A\u0629 \u0648 \u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629\u061F", - CONVERT_FOLDERS_TO_DECKS_DESC: ".\u0647\u0630\u0627 \u0647\u0648 \u0628\u062F\u064A\u0644 \u0644\u062E\u064A\u0627\u0631 \u0648\u0633\u0648\u0645 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0623\u0639\u0644\u0627\u0647", - INLINE_SCHEDULING_COMMENTS: "\u062D\u0641\u0638 \u062A\u0639\u0644\u064A\u0642 \u0627\u0644\u062C\u062F\u0648\u0644\u0629 \u0639\u0644\u0649 \u0646\u0641\u0633 \u0627\u0644\u0633\u0637\u0631 \u0645\u062B\u0644 \u0627\u0644\u0633\u0637\u0631 \u0627\u0644\u0623\u062E\u064A\u0631 \u0644\u0644\u0628\u0637\u0627\u0642\u0629 \u061F", - INLINE_SCHEDULING_COMMENTS_DESC: "\u0644\u0627 \u062A\u0643\u0633\u0631 \u062A\u0646\u0633\u064A\u0642 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 HTML \u0633\u064A\u0624\u062F\u064A \u062A\u0634\u063A\u064A\u0644 \u0647\u0630\u0627 \u0625\u0644\u0649 \u062C\u0639\u0644 \u062A\u0639\u0644\u064A\u0642\u0627\u062A", - BURY_SIBLINGS_TILL_NEXT_DAY: "\u0623\u062E\u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u062D\u062A\u0649 \u0627\u0644\u064A\u0648\u0645 \u0627\u0644\u062A\u0627\u0644\u064A", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "cloze deletions : \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0634\u0642\u064A\u0642\u0629 \u0647\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u0646\u0641\u0633 \u0646\u0635 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 \u0643\u0640", - SHOW_CARD_CONTEXT: "\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u0633\u064A\u0627\u0642 \u0641\u064A \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A\u061F", - SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", - CARD_MODAL_HEIGHT_PERCENT: "\u0646\u0633\u0628\u0629 \u0627\u0631\u062A\u0641\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", - CARD_MODAL_SIZE_PERCENT_DESC: "\u064A\u062C\u0628 \u0636\u0628\u0637\u0647\u0627 \u0639\u0644\u0649 100 \u066A \u0639\u0644\u0649 \u0627\u0644\u0647\u0627\u062A\u0641 \u0627\u0644\u0645\u062D\u0645\u0648\u0644 \u0623\u0648 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0635\u0648\u0631 \u0643\u0628\u064A\u0631\u0629 \u062C\u062F\u064B\u0627", - RESET_DEFAULT: "\u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0625\u0644\u0649 \u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A", - CARD_MODAL_WIDTH_PERCENT: "\u0646\u0633\u0628\u0629 \u0639\u0631\u0636 \u0627\u0644\u0628\u0637\u0627\u0642\u0629", - RANDOMIZE_CARD_ORDER: "\u062A\u0631\u062A\u064A\u0628 \u0628\u0637\u0627\u0642\u0629 \u0639\u0634\u0648\u0627\u0626\u064A \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629\u061F", - DISABLE_CLOZE_CARDS: "\u061Fcloze \u062A\u0639\u0637\u064A\u0644 \u0628\u0637\u0627\u0642\u0627\u062A", - CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?", - CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?", - INLINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0636\u0645\u0646\u0629", - FIX_SEPARATORS_MANUALLY_WARNING: "\u0636\u0639 \u0641\u064A \u062D\u0633\u0627\u0628\u0643 \u0623\u0646\u0647 \u0628\u0639\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u060C \u064A\u062C\u0628 \u0639\u0644\u064A\u0643 \u062A\u0639\u062F\u064A\u0644 \u0623\u064A \u0628\u0637\u0627\u0642\u0627\u062A \u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u064A\u062F\u0648\u064A\u064B\u0627", - INLINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u0636\u0645\u0646\u0629", - MULTILINE_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629", - MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0641\u0627\u0635\u0644 \u0645\u0646 \u0623\u062C\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0639\u0643\u0633\u064A\u0629 \u0627\u0644\u0645\u062A\u0639\u062F\u062F\u0629", - NOTES: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A", - REVIEW_PANE_ON_STARTUP: "\u062A\u0645\u0643\u064A\u0646 \u062C\u0632\u0621 \u0645\u0631\u0627\u062C\u0639\u0629 \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0639\u0646\u062F \u0628\u062F\u0621 \u0627\u0644\u062A\u0634\u063A\u064A\u0644", - TAGS_TO_REVIEW: "\u0648\u0633\u0648\u0645 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", - TAGS_TO_REVIEW_DESC: "#\u0623\u062F\u062E\u0644 \u0627\u0644\u0648\u0633\u0648\u0645 \u0645\u0641\u0635\u0648\u0644\u0629 \u0628\u0645\u0633\u0627\u0641\u0627\u062A \u0623\u0648 \u062E\u0637\u0648\u0637 \u062C\u062F\u064A\u062F\u0629 \u060C \u0623\u064A : \u0645\u0631\u0627\u062C\u0639\u0629# \u0648\u0633\u06452# \u0648\u0633\u06453", - OPEN_RANDOM_NOTE: "\u0627\u0641\u062A\u062D \u0645\u0644\u0627\u062D\u0638\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 \u0644\u0644\u0645\u0631\u0627\u062C\u0639\u0629", - OPEN_RANDOM_NOTE_DESC: "(Pagerank) \u0639\u0646\u062F \u062A\u0639\u0637\u064A\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u060C\u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0633\u064A\u062A\u0645 \u062A\u0631\u062A\u064A\u0628\u064F\u0647\u0627 \u062D\u0633\u0628 \u0627\u0644\u0623\u0647\u0645\u064A\u0629", - AUTO_NEXT_NOTE: "\u0627\u0641\u062A\u062D \u0627\u0644\u0645\u0644\u0627\u062D\u0638\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u064B\u0627 \u0628\u0639\u062F \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u062A\u0639\u0637\u064A\u0644 \u062E\u064A\u0627\u0631\u0627\u062A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0641\u064A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u060C \u0623\u064A \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629:\u0627\u0644\u0633\u0647\u0644 \u0627\u0644\u0635\u0639\u0628 \u0627\u0644\u062C\u064A\u062F", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u0639\u0646\u062F \u062A\u063A\u064A\u064A\u0631 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 Obsidian \u0623\u0639\u062F \u062A\u0634\u063A\u064A\u0644 , command hotkeys. \u0628\u0639\u062F \u0627\u0644\u062A\u0639\u0637\u064A\u0644 \u060C \u064A\u0645\u0643\u0646\u0643 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0627\u0633\u062A\u062E\u062F\u0627\u0645", - MAX_N_DAYS_REVIEW_QUEUE: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 \u0627\u0644\u062A\u064A \u064A\u062C\u0628 \u0639\u0631\u0636\u0647\u0627 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062D\u0629 \u0627\u0644\u064A\u0645\u0646\u0649", - MIN_ONE_DAY: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0639\u062F\u062F \u0627\u0644\u0623\u064A\u0627\u0645 1 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644", - VALID_NUMBER_WARNING: "\u064A\u0631\u062C\u0649 \u062A\u0642\u062F\u064A\u0645 \u0631\u0642\u0645 \u0635\u0627\u0644\u062D", - UI_PREFERENCES: "\u062A\u0641\u0636\u064A\u0644\u0627\u062A \u0648\u0627\u062C\u0647\u0629 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0634\u062C\u0631\u064A \u0644\u0644\u0631\u064F\u0632\u0645 \u0645\u0648\u0633\u0639 \u0628\u062D\u064A\u062B \u062A\u0637\u0647\u0631 \u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629 \u0643\u0644\u0647\u0627", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: " \u0639\u0637\u0644 \u0647\u0630\u0627 \u0627\u0644\u062E\u064A\u0627\u0631 \u0644\u0637\u064A \u0627\u0644\u0631\u064F\u0632\u0645 \u0627\u0644\u0645\u062A\u062F\u0627\u062E\u0644\u0629 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0628\u0637\u0627\u0642\u0629 , \u0645\u0641\u064A\u062F \u0625\u0630\u0627 \u0643\u0627\u0646 \u0644\u062F\u064A\u0643 \u0628\u0637\u0627\u0642\u0627\u062A \u062A\u0646\u062A\u0645\u064A \u0625\u0644\u0649 \u0627\u0644\u0639\u062F\u064A\u062F \u0645\u0646 \u0627\u0644\u0631\u064F\u0632\u0645 \u0641\u064A \u0646\u0641\u0633 \u0627\u0644\u0645\u0644\u0641", - ALGORITHM: "\u062E\u0648\u0627\u0631\u0632\u0645\u064A\u0629", - CHECK_ALGORITHM_WIKI: 'algorithm implementation :\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062A \u062A\u062D\u0642\u0642 \u0645\u0646', - BASE_EASE: "\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629", - BASE_EASE_DESC: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 130 \u060C \u0648\u064A\u0641\u0636\u0644 \u062D\u0648\u0627\u0644\u064A 250.", - BASE_EASE_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0642\u0627\u0639\u062F\u0629 130 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", - LAPSE_INTERVAL_CHANGE: "\u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u064A\u062A\u063A\u064A\u0631 \u0639\u0646\u062F \u0645\u0631\u0627\u062C\u0639\u0629 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 \u0635\u0639\u0628\u0629", - LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.", - EASY_BONUS: "\u0645\u0643\u0627\u0641\u0623\u0629 \u0633\u0647\u0644\u0629", - EASY_BONUS_DESC: "\u062A\u062A\u064A\u062D \u0644\u0643 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 \u0636\u0628\u0637 \u0627\u0644\u0641\u0631\u0642 \u0641\u064A \u0627\u0644\u0641\u0648\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A\u0629 \u0628\u064A\u0646 \u0627\u0644\u0631\u062F \u0627\u0644\u062C\u064A\u062F \u0648\u0627\u0644\u0633\u0647\u0644 \u0639\u0644\u0649 \u0628\u0637\u0627\u0642\u0629/\u0645\u0644\u0627\u062D\u0638\u0629 (\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u062F\u0646\u0649 = 100 \u066A).", - EASY_BONUS_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u062A\u0643\u0648\u0646 \u0627\u0644\u0645\u0643\u0627\u0641\u0623\u0629 \u0627\u0644\u0633\u0647\u0644\u0629 100 \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", - MAX_INTERVAL: "\u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644", - MAX_INTERVAL_DESC: "\u064A\u062A\u064A\u062D \u0644\u0643 \u0648\u0636\u0639 \u062D\u062F \u0623\u0639\u0644\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A (\u0627\u0641\u062A\u0631\u0627\u0636\u064A = 100 \u0639\u0627\u0645).", - MAX_INTERVAL_MIN_WARNING: "\u064A\u062C\u0628 \u0623\u0646 \u064A\u0643\u0648\u0646 \u0627\u0644\u062D\u062F \u0627\u0644\u0623\u0642\u0635\u0649 \u0644\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A \u0644\u0645\u062F\u0629 \u064A\u0648\u0645 \u0648\u0627\u062D\u062F \u0639\u0644\u0649 \u0627\u0644\u0623\u0642\u0644.", - MAX_LINK_CONTRIB: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0627\u0631\u062A\u0628\u0627\u0637", - MAX_LINK_CONTRIB_DESC: "\u0623\u0642\u0635\u0649 \u0645\u0633\u0627\u0647\u0645\u0629 \u0644\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0645\u0631\u062C\u062D\u0629 \u0644\u0644\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0627\u0644\u0645\u0631\u062A\u0628\u0637\u0629 \u0628\u0627\u0644\u0633\u0647\u0648\u0644\u0629 \u0627\u0644\u0623\u0648\u0644\u064A\u0629.", - LOGGING: "\u062A\u0633\u062C\u064A\u0644", - DISPLAY_DEBUG_INFO: "\u0639\u0631\u0636 \u0645\u0639\u0644\u0648\u0645\u0627\u062A \u0627\u0644\u062A\u0635\u062D\u064A\u062D \u0639\u0644\u0649 \u0648\u062D\u062F\u0629 \u062A\u062D\u0643\u0645 \u0627\u0644\u0645\u0637\u0648\u0631\u061F", - // sidebar.ts - NOTES_REVIEW_QUEUE: "\u0645\u0644\u0627\u062D\u0638\u0627\u062A \u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629", - CLOSE: "\u0623\u063A\u0644\u0642", - NEW: "\u062C\u062F\u064A\u062F", - YESTERDAY: "\u0627\u0644\u0628\u0627\u0631\u062D\u0629", - TODAY: "\u0627\u0644\u064A\u0648\u0645", - TOMORROW: "\u0627\u0644\u063A\u062F", - // stats-modal.tsx - STATS_TITLE: "\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A", - MONTH: "\u0634\u0647\u0631", - QUARTER: "\u0631\u0628\u0639 \u0627\u0644\u0633\u0646\u0629", - YEAR: "\u0633\u0646\u0629", - LIFETIME: "", - FORECAST: "", - FORECAST_DESC: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u0633\u062A\u062D\u0642\u0629 \u0641\u064A \u0627\u0644\u0645\u0633\u062A\u0642\u0628\u0644", - SCHEDULED: "\u0627\u0644\u0645\u0642\u0631\u0631", - DAYS: "\u0623\u064A\u0627\u0645", - NUMBER_OF_CARDS: "\u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", - REVIEWS_PER_DAY: "\u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A/\u0627\u0644\u064A\u0648\u0645 ${avg} :\u0645\u062A\u0648\u0633\u0637", - INTERVALS: "\u0641\u0648\u0627\u0635\u0644 \u0632\u0645\u0646\u064A\u0629", - INTERVALS_DESC: "\u0627\u0644\u062A\u0623\u062E\u064A\u0631 \u062D\u062A\u0649 \u064A\u062A\u0645 \u0639\u0631\u0636 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0627\u062A \u0645\u0631\u0629 \u0623\u062E\u0631\u0649", - COUNT: "\u0639\u062F\u062F", - INTERVALS_SUMMARY: "${longest} : \u0623\u0637\u0648\u0644 \u0641\u0627\u0635\u0644 \u0632\u0645\u0646\u064A ,${avg} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0641\u0627\u0635\u0644 \u0627\u0644\u0632\u0645\u0646\u064A", - EASES: "\u0627\u0644\u0633\u0647\u0648\u0644\u0629", - EASES_SUMMARY: "${avgEase} :\u0645\u062A\u0648\u0633\u0637 \u0627\u0644\u0633\u0647\u0648\u0644\u0629", - CARD_TYPES: "\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A", - CARD_TYPES_DESC: "\u0648\u0647\u0630\u0627 \u064A\u0634\u0645\u0644 \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A \u0627\u0644\u0645\u062E\u0641\u064A\u0629 \u0643\u0630\u0644\u0643 \u060C \u0625\u0646 \u0648\u062C\u062F\u062A", - CARD_TYPE_NEW: "\u062C\u062F\u064A\u062F\u0629", - CARD_TYPE_YOUNG: "\u0635\u063A\u064A\u0631\u0629", - CARD_TYPE_MATURE: "\u0646\u0627\u0636\u062C\u0629", - CARD_TYPES_SUMMARY: " ${totalCardsCount} :\u0625\u062C\u0645\u0627\u0644\u064A \u0639\u062F\u062F \u0627\u0644\u0628\u0637\u0627\u0642\u0627\u062A" -}; - -// src/lang/locale/cz.ts -var cz_default = { - // flashcard-modal.tsx - DECKS: "Bal\xED\u010Dky", - DUE_CARDS: "Karti\u010Dky po term\xEDnu", - NEW_CARDS: "Nov\xE9 karti\u010Dky", - TOTAL_CARDS: "Karti\u010Dek celkem", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "Vynulovat pokrok karti\u010Dky", - HARD: "Te\u017Ek\xE9", - GOOD: "Dobr\xE9", - EASY: "Jednoduch\xE9", - SHOW_ANSWER: "Uk\xE1zat odpov\u011B\u010F", - CARD_PROGRESS_RESET: "Pokrok karti\u010Dky byl vynulov\xE1n.", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "Otev\u0159\xEDt pozn\xE1mku k revizi", - REVIEW_CARDS: "Pozn\xE1mek k revizi", - REVIEW_EASY_FILE_MENU: "Revize: Jednoduch\xE9", - REVIEW_GOOD_FILE_MENU: "Revize: Dobr\xE9", - REVIEW_HARD_FILE_MENU: "Revize: T\u011B\u017Ek\xE9", - REVIEW_NOTE_EASY_CMD: "Ozna\u010Dit pozn\xE1mku jako jednoduchou", - REVIEW_NOTE_GOOD_CMD: "Ozna\u010Dit pozn\xE1mku jako dobrou", - REVIEW_NOTE_HARD_CMD: "Ozna\u010Dit pozn\xE1mku jako te\u017Ekou", - REVIEW_ALL_CARDS: "Revidovat karti\u010Dky ve v\u0161ech pozn\xE1mk\xE1ch", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "Revidovat karti\u010Dky v t\xE9to pozn\xE1mce.", - CRAM_CARDS_IN_NOTE: "Cram karti\u010Dky v t\xE9to pozn\xE1mce.", - VIEW_STATS: "Uk\xE1zat statistiky", - STATUS_BAR: "Revize: ${dueNotesCount} pozn\xE1mek, ${dueFlashcardsCount} karti\u010Dek po term\xEDnu", - SYNC_TIME_TAKEN: "Synchronizace trvala ${t}ms", - NOTE_IN_IGNORED_FOLDER: "Pozn\xE1mka je ulo\u017Eena v ignorovan\xE9 slo\u017Ece (zkontrolujte nastaven\xED).", - PLEASE_TAG_NOTE: "Pros\xEDm ozna\u010Dne pozn\xE1mku odpov\xEDdaj\xEDc\xEDm tagem pro revizi (v nastaven\xED).", - RESPONSE_RECEIVED: "Odpov\u011B\u010F p\u0159ijata.", - NO_DECK_EXISTS: "Neexistuje \u017E\xE1dn\xFD bal\xED\u010Dek pro ${deckName}", - ALL_CAUGHT_UP: "V\u0161e zrevidov\xE1no", - // scheduling.ts - DAYS_STR_IVL: "${interval} den/dn\xED", - MONTHS_STR_IVL: "${interval} m\u011Bs\xEDc(\u016F)", - YEARS_STR_IVL: "${interval} rok(\u016F)", - DAYS_STR_IVL_MOBILE: "${interval}d", - MONTHS_STR_IVL_MOBILE: "${interval}m", - YEARS_STR_IVL_MOBILE: "${interval}r", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Nastaven\xED", - CHECK_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na wiki.', - FOLDERS_TO_IGNORE: "Ignorovan\xE9 slo\u017Eky", - FOLDERS_TO_IGNORE_DESC: "Zadejte cesty ke slo\u017Ek\xE1m odd\u011Blen\xE9 od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDkad. \u0160ablony Meta/Scripts", - FLASHCARDS: "Karti\u010Dky", - FLASHCARD_EASY_LABEL: "Easy Button Text", - FLASHCARD_GOOD_LABEL: "Good Button Text", - FLASHCARD_HARD_LABEL: "Hard Button Text", - FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', - FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', - FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', - FLASHCARD_TAGS: "Tag pro karti\u010Dky", - FLASHCARD_TAGS_DESC: "Zadete tagy ood\u011Blen\xE9 mezerou nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad. #karti\u010Dky #bal\xED\u010Dke2 #bal\xED\u010Dek3.", - CONVERT_FOLDERS_TO_DECKS: "P\u0159ev\xE9st slo\u017Eky na bal\xED\u010Dky a podbal\xED\u010Dky?", - CONVERT_FOLDERS_TO_DECKS_DESC: "Toto je alternativa k tag\u016Fm karti\u010Dek viz nastaven\xED v\xFD\u0161e.", - INLINE_SCHEDULING_COMMENTS: "Ulo\u017Eit pl\xE1novac\xED koment\xE1\u0159 na stejn\xFD \u0159\xE1dek jako posledn\xED polo\u017Eka karti\u010Dky?", - INLINE_SCHEDULING_COMMENTS_DESC: "Zapnut\xED t\xE9to volby zp\u016Fsob\xED, \u017Ee HTML koment\xE1\u0159e nebudou rozb\xEDjet form\xE1tov\xE1n\xED list\u016F.", - BURY_SIBLINGS_TILL_NEXT_DAY: "Odlo\u017Eit p\u0159\xEDbuzn\xE9 karti\u010Dky na dal\u0161\xED den?", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "P\u0159\xEDbuzn\xE9 karti\u010Dky jsou karti\u010Dky generovan\xE9 z textu stejn\xE9 pozn\xE1mky nap\u0159\xEDklad cloze smaz\xE1n\xED", - SHOW_CARD_CONTEXT: "Uk\xE1zat kontext v karti\u010Dce?", - SHOW_CARD_CONTEXT_DESC: "nap\u0159\xEDklad Titulek > Nadpis1 > Podnadpis > ... > Podnadpis", - CARD_MODAL_HEIGHT_PERCENT: "V\xFD\u0161ka karti\u010Dek v procentech", - CARD_MODAL_SIZE_PERCENT_DESC: "M\u011Blo by b\xFDt nastaveno na 100% na mobilu nebo kdy\u017E pou\u017E\xEDv\xE1te velk\xE9 obr\xE1zky", - RESET_DEFAULT: "Resetovat v\xFDchoz\xED nastaven\xED", - CARD_MODAL_WIDTH_PERCENT: "\u0160\xED\u0159ka karti\u010Dek v procentech", - RANDOMIZE_CARD_ORDER: "N\xE1hodn\u011B zm\u011Bnit po\u0159ad\xED karti\u010Dek b\u011Bhem revize?", - DISABLE_CLOZE_CARDS: "Vypnout cloze karti\u010Dky?", - CONVERT_HIGHLIGHTS_TO_CLOZES: "P\u0159ev\xE9st ==zv\xFDrazn\u011Bn\xED== na clozes?", - CONVERT_BOLD_TEXT_TO_CLOZES: "P\u0159ev\xE9st **tu\u010Dn\xFD text** na clozes?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "P\u0159ev\xE9st {{slo\u017Een\xE9 z\xE1vorky}} na clozes?", - INLINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro inline karti\u010Dky", - FIX_SEPARATORS_MANUALLY_WARNING: "Pozor. Jakmile toto zm\u011Bn\xEDte, budete muset ru\u010Dn\u011B upravit v\u0161echny existuj\xEDc\xED karti\u010Dky.", - INLINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro oto\u010Den\xE9 inline karti\u010Dky", - MULTILINE_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkov\xE9 karti\u010Dky", - MULTILINE_REVERSED_CARDS_SEPARATOR: "Odd\u011Blova\u010D pro v\xEDce\u0159\xE1dkove oto\u010Den\xE9 karti\u010Dky", - NOTES: "Pozn\xE1mky", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "Tag pro revizi", - TAGS_TO_REVIEW_DESC: "Zadejte tagy odd\u011Blen\xE9 mezerami nebo od\u0159\xE1dkov\xE1n\xEDm nap\u0159\xEDklad #review #tag2 #tag3.", - OPEN_RANDOM_NOTE: "Otev\u0159\xEDt n\xE1hodnou pozn\xE1mku pro revizi", - OPEN_RANDOM_NOTE_DESC: "Pokud toto vypnete, pozn\xE1mky budou \u0159azeny dle d\u016Fle\u017Eitosti (PageRank).", - AUTO_NEXT_NOTE: "Otev\u0159\xEDt automaticky dal\u0161\xED pozn\xE1mku po dokon\u010Den\xED revize", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "Vypnout volby revize v menu souboru nap\u0159\xEDklad 'Revize: Jednoduch\xE9'", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Po vypnut\xED m\u016F\u017Eete pou\u017E\xEDvat kl\xE1vesov\xE9 zkratky. Restartujte Obsidian po zm\u011Bn\u011B nastaven\xED.", - MAX_N_DAYS_REVIEW_QUEUE: "Maxim\xE1ln\xED po\u010Det dn\xED zobrazen\xFDch v prav\xE9m panelu", - MIN_ONE_DAY: "Po\u010Det dn\xED mus\xED b\xFDt minim\xE1ln\u011B 1.", - VALID_NUMBER_WARNING: "Pros\xEDm zadejte validn\xED \u010D\xEDslo.", - UI_PREFERENCES: "P\u0159edvolby u\u017Eivatelsk\xE9ho rozhran\xED", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Stromy bal\xED\u010Dky by m\u011Bly b\xFDt zpo\u010D\xE1tku zobrazeny jako rozbalen\xE9", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Vypn\u011Bte toto, chcete-li sbalit vno\u0159en\xE9 bal\xED\u010Dky na stejn\xE9 kart\u011B. To je u\u017Eite\u010Dn\xE9, pokud m\xE1te karti\u010Dky, kter\xE9 pat\u0159\xED k mnoha bal\xED\u010Dk\u016Fm ve stejn\xE9m souboru.", - ALGORITHM: "Algoritmus", - CHECK_ALGORITHM_WIKI: 'Pro v\xEDce informac\xED jd\u011Bte na popis algoritmu.', - BASE_EASE: "Z\xE1kladn\xED slo\u017Eitost", - BASE_EASE_DESC: "minimum = 130, nejl\xE9pe p\u0159ibli\u017En\u011B 250.", - BASE_EASE_MIN_WARNING: "Z\xE1kladn\xED slo\u017Eitost mus\xED b\xFDt minim\xE1ln\u011B 130.", - LAPSE_INTERVAL_CHANGE: "Zm\u011Bna intervalu pokud karti\u010Dku/pozn\xE1mku ozna\u010D\xEDte jako slo\u017Eitou", - LAPSE_INTERVAL_CHANGE_DESC: "nov\xFD_inteval = star\xFD_interval * zm\u011Bna_intevalu / 100.", - EASY_BONUS: "Bonus pro jednoduch\xE9", - EASY_BONUS_DESC: "Tento bonus umo\u017E\u0148uje nastavit rozd\xEDl intervalu mezi jednoduch\xFDmi a dobr\xFDmi karti\u010Dkami/pozn\xE1mkami (minimum = 100%).", - EASY_BONUS_MIN_WARNING: "Bonus pro jednoduchost mus\xED b\xFDt minim\xE1ln\u011B 100.", - MAX_INTERVAL: "Maxim\xE1ln\xED interval", - MAX_INTERVAL_DESC: "Umo\u017E\u0148uje nastavit horn\xED limit pro interval (defaultn\u011B = 100 let).", - MAX_INTERVAL_MIN_WARNING: "Maxim\xE1ln\xED interval mus\xED b\xFDt alespo\u0148 1 den.", - MAX_LINK_CONTRIB: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bv\u011Bk prolinkov\xE1n\xED", - MAX_LINK_CONTRIB_DESC: "Maxim\xE1ln\xED p\u0159\xEDsp\u011Bvek v\xE1\u017Een\xE9 slo\u017Eitosti prolinkovan\xFDch pozn\xE1mek pou\u017Eit\xFD pro ur\u010Den\xED po\u010D\xE1te\u010Dn\xED slo\u017Eitosti.", - LOGGING: "Zaznamen\xE1v\xE1m", - DISPLAY_DEBUG_INFO: "Zobrazit informace pro lad\u011Bn\xED na v\xFDvoj\xE1\u0159sk\xE9 konzoli?", - // sidebar.ts - NOTES_REVIEW_QUEUE: "Fronta pozn\xE1mek k revizi", - CLOSE: "Uzav\u0159en\xE9", - NEW: "Nov\xE9", - YESTERDAY: "V\u010Dera", - TODAY: "Dnes", - TOMORROW: "Z\xEDtra", - // stats-modal.tsx - STATS_TITLE: "Statistiky", - MONTH: "M\u011Bs\xEDc", - QUARTER: "\u010Ctvrtlet\xED", - YEAR: "Rok", - LIFETIME: "Celkov\u011B", - FORECAST: "P\u0159edpov\u011B\u010F", - FORECAST_DESC: "Celkov\xFD po\u010Det karti\u010Dek, kter\xFDm vypr\u0161\xED term\xEDn", - SCHEDULED: "Napl\xE1nov\xE1no", - DAYS: "Dn\xED", - NUMBER_OF_CARDS: "Po\u010Det karti\u010Dek", - REVIEWS_PER_DAY: "Pr\u016Fm\u011Br: ${avg} revize/den", - INTERVALS: "Intervaly", - INTERVALS_DESC: "Doba, za kterou bude znovu zobrazeno k revize", - COUNT: "Po\u010Det", - INTERVALS_SUMMARY: "Pr\u016Fm\u011Brn\xFD interval: ${avg}, Nejdel\u0161\xED interval: ${longest}", - EASES: "Slo\u017Eitost", - EASES_SUMMARY: "Pr\u016Fm\u011Brn\xE1 slo\u017Eitost: ${avgEase}", - CARD_TYPES: "Typy karti\u010Dek", - CARD_TYPES_DESC: "Obsahuje i odlo\u017Een\xE9 karti\u010Dky (pokud existuj\xED)", - CARD_TYPE_NEW: "Nov\xE1", - CARD_TYPE_YOUNG: "Mlad\xE1", - CARD_TYPE_MATURE: "Dosp\u011Bl\xE1", - CARD_TYPES_SUMMARY: "Karti\u010Dek celkem: ${totalCardsCount}" -}; - -// src/lang/locale/bn.ts -var bn_default = {}; - -// src/lang/locale/da.ts -var da_default = {}; - -// src/lang/locale/de.ts -var de_default = { - // flashcard-modal.tsx - DECKS: "Stapel", - DUE_CARDS: "Anstehende Karten", - NEW_CARDS: "Neue Karten", - TOTAL_CARDS: "Alle Karten", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "Kartenfortschritt zur\xFCcksetzten", - HARD: "Schwer", - GOOD: "Gut", - EASY: "Einfach", - SHOW_ANSWER: "Zeige Antwort", - CARD_PROGRESS_RESET: "Kartenfortschritt wurde zur\xFCckgesetzt.", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "Notiz zur Wiederholung \xF6ffnen", - REVIEW_CARDS: "Lernkarten wiederholen", - REVIEW_EASY_FILE_MENU: "Notiz abschliessen als: Einfach", - REVIEW_GOOD_FILE_MENU: "Notiz abschliessen als: Gut", - REVIEW_HARD_FILE_MENU: "Notiz abschliessen als: Schwer", - REVIEW_NOTE_EASY_CMD: "Notiz abschliessen als: Einfach", - REVIEW_NOTE_GOOD_CMD: "Notiz abschliessen als: Gut", - REVIEW_NOTE_HARD_CMD: "Notiz abschliessen als: Schwer", - REVIEW_ALL_CARDS: "Alle Lernkarten wiederholen", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "Lernkarten in dieser Notiz wiederholen", - CRAM_CARDS_IN_NOTE: "Lernkarten in dieser Notiz pauken.", - VIEW_STATS: "Statistiken anzeigen", - STATUS_BAR: "Wiederholung: ${dueNotesCount} Notiz(en), ${dueFlashcardsCount} Karte(n) anstehend", - SYNC_TIME_TAKEN: "Sync dauerte ${t}ms", - NOTE_IN_IGNORED_FOLDER: "Notiz befindet sich in einem ausgeschlossenen Ordner (siehe Einstellungen).", - PLEASE_TAG_NOTE: "Bitte die Notiz f\xFCr Wiederholungen entsprechend taggen (siehe Einstellungen).", - RESPONSE_RECEIVED: "Antwort erhalten.", - NO_DECK_EXISTS: "Kein Stapel f\xFCr ${deckName} gefunden.", - ALL_CAUGHT_UP: "Yuhu! Alles geschafft! :D.", - // scheduling.ts - DAYS_STR_IVL: "${interval} Tag(e)", - MONTHS_STR_IVL: "${interval} Monat(e)", - YEARS_STR_IVL: "${interval} Jahr(e)", - DAYS_STR_IVL_MOBILE: "${interval}d", - MONTHS_STR_IVL_MOBILE: "${interval}m", - YEARS_STR_IVL_MOBILE: "${interval}y", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Einstellungen", - CHECK_WIKI: 'Weitere Informationen gibt es im Wiki (english).', - FOLDERS_TO_IGNORE: "Ausgeschlossene Ordner", - FOLDERS_TO_IGNORE_DESC: "Mehrere Ordner mit Zeilenumbr\xFCchen getrennt angeben. Bsp. OrdnerA[Zeilenumbruch]OrdnerB/Unterordner", - FLASHCARDS: "Lernkarten", - FLASHCARD_EASY_LABEL: "Easy Button Text", - FLASHCARD_GOOD_LABEL: "Good Button Text", - FLASHCARD_HARD_LABEL: "Hard Button Text", - FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', - FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', - FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', - FLASHCARD_TAGS: "Lernkarten Tags", - FLASHCARD_TAGS_DESC: "Mehrere Tags mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angeben. Bsp. #karte #stapel2 #stapel3.", - CONVERT_FOLDERS_TO_DECKS: "Ordner in Stapel und Substapel umwandeln?", - CONVERT_FOLDERS_TO_DECKS_DESC: 'Eine Alternative zur oberen "Lernkarten Tags" Option.', - INLINE_SCHEDULING_COMMENTS: "Den Fortschritt in der gleichen Zeile wie die letzte Zeile einer Lernkartei speichern?", - INLINE_SCHEDULING_COMMENTS_DESC: "Wenn aktiviert, wird der HTML Kommentar die umgebende Liste nicht aufbrechen.", - BURY_SIBLINGS_TILL_NEXT_DAY: "Verwandte Karten auf den n\xE4chsten Tag verlegen?", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Verwandte Karten sind aus der gleichen Karte generiert worden (z.B. L\xFCckentextkarten oder beidseitige Karten).", - SHOW_CARD_CONTEXT: "Kontext in den Karten anzeigen?", - SHOW_CARD_CONTEXT_DESC: "Bsp. Titel > \xDCberschrift 1 > Sektion > ... > Untersektion", - CARD_MODAL_HEIGHT_PERCENT: "H\xF6he der Lernkartei in Prozent", - CARD_MODAL_SIZE_PERCENT_DESC: "Auf kleinen Bildschirmen (z.B. Smartphones) oder bei sehr grossen Bildern sollte dieser Wert auf 100% gesetzt werden.", - RESET_DEFAULT: "Standardeinstellung wiederherstellen", - CARD_MODAL_WIDTH_PERCENT: "Breite einer Lernkarte in Prozent", - RANDOMIZE_CARD_ORDER: "W\xE4hrend der Wiederhoung die Reihenfolge zuf\xE4llig mischen?", - DISABLE_CLOZE_CARDS: "L\xFCckentextkarten (cloze deletions) deaktivieren?", - CONVERT_HIGHLIGHTS_TO_CLOZES: "==Hervorgehobenen== Text in L\xFCckentextkarten umwandeln?", - CONVERT_BOLD_TEXT_TO_CLOZES: "**Fettgedruckten** Text in L\xFCckentextkarten umwandeln?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{Geschweifte Klammern}} Text in L\xFCckentextkarten umwandeln?", - INLINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige Lernkarten", - FIX_SEPARATORS_MANUALLY_WARNING: "Wenn diese Einstellung ge\xE4ndert wird, dann m\xFCssen die entsprechenden Lernkarten manuell angepasst werden.", - INLINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr einzeilige beidseitige Lernkarten", - MULTILINE_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige Lernkarten", - MULTILINE_REVERSED_CARDS_SEPARATOR: "Trennzeichen f\xFCr mehrzeilige beidseitige Lernkarten", - NOTES: "Notizen", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "Zu wiederholende Tags", - TAGS_TO_REVIEW_DESC: "Mehrere Tags k\xF6nnen mit Leerzeichen oder Zeilenumbr\xFCchen getrennt angegeben werden. Bsp. #karte #tag1 #tag2.", - OPEN_RANDOM_NOTE: "Zuf\xE4llige Karten wiederholen", - OPEN_RANDOM_NOTE_DESC: "Wenn dies deaktiviert wird, dann werden die Notizen nach Wichtigkeit wiederholt (PageRank).", - AUTO_NEXT_NOTE: "Nach einer Wiederholung automatisch die n\xE4chste Karte \xF6ffnen", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "Optionen zur Wiederholung im Men\xFC einer Datei deaktivieren. Bsp. Wiederholen: Einfach Gut Schwer", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Nach dem Deaktivieren k\xF6nnen die Tastenk\xFCrzel zur Wiederholung verwendet werden. Obsidian muss nach einer \xC4nderung neu geladen weren.", - MAX_N_DAYS_REVIEW_QUEUE: "Maximale Anzahl anstehender Notizen, die im rechten Fensterbereich angezeigt werden", - MIN_ONE_DAY: "Anzahl der Tage muss mindestens 1 sein.", - VALID_NUMBER_WARNING: "Bitte eine g\xFCltige Zahl eingeben.", - UI_PREFERENCES: "Einstellungen der Benutzeroberfl\xE4che", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deckb\xE4ume sollten anf\xE4nglich erweitert angezeigt werden", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Deaktivieren Sie dies, um verschachtelte Decks in derselben Karte zu reduzieren. N\xFCtzlich, wenn Sie Karten haben, die zu vielen Decks in derselben Datei geh\xF6ren.", - ALGORITHM: "Algorithmus", - CHECK_ALGORITHM_WIKI: 'Weiterf\xFChrende Informationen: Implementierung des Algorithmus (english).', - BASE_EASE: "Basis der Einfachheit", - BASE_EASE_DESC: "Minimum ist 130. Empfohlen wird ca. 250.", - BASE_EASE_MIN_WARNING: "Basis der Einfachheit muss mindestens 130 sein.", - LAPSE_INTERVAL_CHANGE: "Anpassungsfaktor des Intervalls wenn eine Notiz / Karte 'Schwer' abgeschlossen wird", - LAPSE_INTERVAL_CHANGE_DESC: "neuesIntervall = altesIntervall * anpassungsfaktor / 100.", - EASY_BONUS: "Einfachheit-Bonus", - EASY_BONUS_DESC: "Der Einfachheit-Bonus gibt an um welchen Faktor (in Prozent) das Intervall l\xE4nger sein soll, wenn eine Notiz / Karte 'Einfach' statt 'Gut' abgeschlossen wird. Minimum ist 100%.", - EASY_BONUS_MIN_WARNING: "Der Einfachheit-Bonus muss mindestens 100 sein.", - MAX_INTERVAL: "Maximales Intervall", - MAX_INTERVAL_DESC: "Das maximale Intervall (in Tagen) f\xFCr Wiederholungen. Standard sind 100 Jahre.", - MAX_INTERVAL_MIN_WARNING: "Das maximale Interall muss mindestens ein Tag sein.", - MAX_LINK_CONTRIB: "Maximaler Einfluss von Links", - MAX_LINK_CONTRIB_DESC: "Maximaler Einfluss der Einfachheiten verlinkter Notizen zur gewichteten initialen Einfachheit einer neuen Lernkarte.", - LOGGING: "Logging", - DISPLAY_DEBUG_INFO: "Informationen zum Debugging in der Entwicklerkonsole anzeigen?", - // sidebar.ts - NOTES_REVIEW_QUEUE: "Anstehende Notizen zur Wiederholung", - CLOSE: "Schliessen", - NEW: "Neu", - YESTERDAY: "Gestern", - TODAY: "Heute", - TOMORROW: "Morgen", - // stats-modal.tsx - STATS_TITLE: "Statistiken", - MONTH: "Month", - QUARTER: "Quarter", - YEAR: "Year", - LIFETIME: "Lifetime", - FORECAST: "Prognose", - FORECAST_DESC: "Anzahl der k\xFCnftig anstehenden Karten", - SCHEDULED: "Anstehend", - DAYS: "Tage", - NUMBER_OF_CARDS: "Anzahl der Karten", - REVIEWS_PER_DAY: "Durchschnitt: ${avg} Wiederholungen/Tag", - INTERVALS: "Intervalle", - INTERVALS_DESC: "Intervalle bis Wiederholungen anstehen", - COUNT: "Anzahl", - INTERVALS_SUMMARY: "Durchschnittliches Intervall: ${avg}, L\xE4ngstes Intervall: ${longest}", - EASES: "Einfachheit", - EASES_SUMMARY: "Durchschnittliche Einfachheit: ${avgEase}", - CARD_TYPES: "Kategorisierung", - CARD_TYPES_DESC: "Verlegte Karten eingeschlossen", - CARD_TYPE_NEW: "Neu", - CARD_TYPE_YOUNG: "Jung", - CARD_TYPE_MATURE: "Ausgereift", - CARD_TYPES_SUMMARY: "Insgesamt ${totalCardsCount} Karten" -}; - -// src/lang/locale/en.ts -var en_default = { - // flashcard-modal.tsx - DECKS: "Decks", - DUE_CARDS: "Due Cards", - NEW_CARDS: "New Cards", - TOTAL_CARDS: "Total Cards", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "Reset card's progress", - HARD: "Hard", - GOOD: "Good", - EASY: "Easy", - SHOW_ANSWER: "Show Answer", - CARD_PROGRESS_RESET: "Card's progress has been reset.", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "Open a note for review", - REVIEW_CARDS: "Review flashcards", - REVIEW_EASY_FILE_MENU: "Review: Easy", - REVIEW_GOOD_FILE_MENU: "Review: Good", - REVIEW_HARD_FILE_MENU: "Review: Hard", - REVIEW_NOTE_EASY_CMD: "Review note as easy", - REVIEW_NOTE_GOOD_CMD: "Review note as good", - REVIEW_NOTE_HARD_CMD: "Review note as hard", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_ALL_CARDS: "Review flashcards from all notes", - REVIEW_CARDS_IN_NOTE: "Review flashcards in this note", - CRAM_CARDS_IN_NOTE: "Cram flashcards in this note", - VIEW_STATS: "View statistics", - STATUS_BAR: "Review: ${dueNotesCount} note(s), ${dueFlashcardsCount} card(s) due", - SYNC_TIME_TAKEN: "Sync took ${t}ms", - NOTE_IN_IGNORED_FOLDER: "Note is saved under ignored folder (check settings).", - PLEASE_TAG_NOTE: "Please tag the note appropriately for reviewing (in settings).", - RESPONSE_RECEIVED: "Response received.", - NO_DECK_EXISTS: "No deck exists for ${deckName}", - ALL_CAUGHT_UP: "You're all caught up now :D.", - // scheduling.ts - DAYS_STR_IVL: "${interval} day(s)", - MONTHS_STR_IVL: "${interval} month(s)", - YEARS_STR_IVL: "${interval} year(s)", - DAYS_STR_IVL_MOBILE: "${interval}d", - MONTHS_STR_IVL_MOBILE: "${interval}m", - YEARS_STR_IVL_MOBILE: "${interval}y", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - Settings", - CHECK_WIKI: 'For more information, check the wiki.', - FOLDERS_TO_IGNORE: "Folders to ignore", - FOLDERS_TO_IGNORE_DESC: "Enter folder paths separated by newlines i.e. Templates Meta/Scripts", - FLASHCARDS: "Flashcards", - FLASHCARD_EASY_LABEL: "Easy Button Text", - FLASHCARD_GOOD_LABEL: "Good Button Text", - FLASHCARD_HARD_LABEL: "Hard Button Text", - FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', - FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', - FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', - FLASHCARD_TAGS: "Flashcard tags", - FLASHCARD_TAGS_DESC: "Enter tags separated by spaces or newlines i.e. #flashcards #deck2 #deck3.", - CONVERT_FOLDERS_TO_DECKS: "Convert folders to decks and subdecks?", - CONVERT_FOLDERS_TO_DECKS_DESC: "This is an alternative to the Flashcard tags option above.", - INLINE_SCHEDULING_COMMENTS: "Save scheduling comment on the same line as the flashcard's last line?", - INLINE_SCHEDULING_COMMENTS_DESC: "Turning this on will make the HTML comments not break list formatting.", - BURY_SIBLINGS_TILL_NEXT_DAY: "Bury sibling cards until the next day?", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Siblings are cards generated from the same card text i.e. cloze deletions", - SHOW_CARD_CONTEXT: "Show context in cards?", - SHOW_CARD_CONTEXT_DESC: "i.e. Title > Heading 1 > Subheading > ... > Subheading", - CARD_MODAL_HEIGHT_PERCENT: "Flashcard Height Percentage", - CARD_MODAL_SIZE_PERCENT_DESC: "Should be set to 100% on mobile or if you have very large images", - RESET_DEFAULT: "Reset to default", - CARD_MODAL_WIDTH_PERCENT: "Flashcard Width Percentage", - RANDOMIZE_CARD_ORDER: "Randomize card order during review?", - DISABLE_CLOZE_CARDS: "Disable cloze cards?", - CONVERT_HIGHLIGHTS_TO_CLOZES: "Convert ==hightlights== to clozes?", - CONVERT_BOLD_TEXT_TO_CLOZES: "Convert **bolded text** to clozes?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "Convert {{curly brackets}} to clozes?", - INLINE_CARDS_SEPARATOR: "Separator for inline flashcards", - FIX_SEPARATORS_MANUALLY_WARNING: "Note that after changing this you have to manually edit any flashcards you already have.", - INLINE_REVERSED_CARDS_SEPARATOR: "Separator for inline reversed flashcards", - MULTILINE_CARDS_SEPARATOR: "Separator for multiline flashcards", - MULTILINE_REVERSED_CARDS_SEPARATOR: "Separator for multiline reversed flashcards", - NOTES: "Notes", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "Tags to review", - TAGS_TO_REVIEW_DESC: "Enter tags separated by spaces or newlines i.e. #review #tag2 #tag3.", - OPEN_RANDOM_NOTE: "Open a random note for review", - OPEN_RANDOM_NOTE_DESC: "When you turn this off, notes are ordered by importance (PageRank).", - AUTO_NEXT_NOTE: "Open next note automatically after a review", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "Disable review options in the file menu i.e. Review: Easy Good Hard", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "After disabling, you can review using the command hotkeys. Reload Obsidian after changing this.", - MAX_N_DAYS_REVIEW_QUEUE: "Maximum number of days to display on right panel", - MIN_ONE_DAY: "The number of days must be at least 1.", - VALID_NUMBER_WARNING: "Please provide a valid number.", - UI_PREFERENCES: "UI Preferences", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "Deck trees should be initially displayed as expanded", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Turn this off to collapse nested decks in the same card. Useful if you have cards which belong to many decks in the same file.", - ALGORITHM: "Algorithm", - CHECK_ALGORITHM_WIKI: 'For more information, check the algorithm implementation.', - BASE_EASE: "Base ease", - BASE_EASE_DESC: "minimum = 130, preferrably approximately 250.", - BASE_EASE_MIN_WARNING: "The base ease must be at least 130.", - LAPSE_INTERVAL_CHANGE: "Interval change when you review a flashcard/note as hard", - LAPSE_INTERVAL_CHANGE_DESC: "newInterval = oldInterval * intervalChange / 100.", - EASY_BONUS: "Easy Bonus", - EASY_BONUS_DESC: "The easy bonus allows you to set the difference in intervals between answering Good and Easy on a flashcard/note (minimum = 100%).", - EASY_BONUS_MIN_WARNING: "The easy bonus must be at least 100.", - MAX_INTERVAL: "Maximum Interval", - MAX_INTERVAL_DESC: "Allows you to place an upper limit on the interval (default = 100 years).", - MAX_INTERVAL_MIN_WARNING: "The maximum interval must be at least 1 day.", - MAX_LINK_CONTRIB: "Maximum link contribution", - MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", - LOGGING: "Logging", - DISPLAY_DEBUG_INFO: "Display debugging information on the developer console?", - // sidebar.ts - NOTES_REVIEW_QUEUE: "Notes Review Queue", - CLOSE: "Close", - NEW: "New", - YESTERDAY: "Yesterday", - TODAY: "Today", - TOMORROW: "Tomorrow", - // stats-modal.tsx - STATS_TITLE: "Statistics", - MONTH: "Month", - QUARTER: "Quarter", - YEAR: "Year", - LIFETIME: "Lifetime", - FORECAST: "Forecast", - FORECAST_DESC: "The number of cards due in the future", - SCHEDULED: "Scheduled", - DAYS: "Days", - NUMBER_OF_CARDS: "Number of cards", - REVIEWS_PER_DAY: "Average: ${avg} reviews/day", - INTERVALS: "Intervals", - INTERVALS_DESC: "Delays until reviews are shown again", - COUNT: "Count", - INTERVALS_SUMMARY: "Average interval: ${avg}, Longest interval: ${longest}", - EASES: "Eases", - EASES_SUMMARY: "Average ease: ${avgEase}", - CARD_TYPES: "Card Types", - CARD_TYPES_DESC: "This includes buried cards as well, if any", - CARD_TYPE_NEW: "New", - CARD_TYPE_YOUNG: "Young", - CARD_TYPE_MATURE: "Mature", - CARD_TYPES_SUMMARY: "Total cards: ${totalCardsCount}" -}; - -// src/lang/locale/en-gb.ts -var en_gb_default = {}; - -// src/lang/locale/es.ts -var es_default = {}; - -// src/lang/locale/fr.ts -var fr_default = {}; - -// src/lang/locale/hi.ts -var hi_default = {}; - -// src/lang/locale/id.ts -var id_default = {}; - -// src/lang/locale/it.ts -var it_default = {}; - -// src/lang/locale/ja.ts -var ja_default = { - // flashcard-modal.tsx - DECKS: "\u30C7\u30C3\u30AD", - DUE_CARDS: "\u671F\u65E5\u306E\u30AB\u30FC\u30C9", - NEW_CARDS: "\u65B0\u898F\u306E\u30AB\u30FC\u30C9", - TOTAL_CARDS: "\u30AB\u30FC\u30C9\u5408\u8A08", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u3092\u30EA\u30BB\u30C3\u30C8", - HARD: "Hard", - GOOD: "Good", - EASY: "Easy", - SHOW_ANSWER: "\u89E3\u7B54\u3092\u8868\u793A", - CARD_PROGRESS_RESET: "\u30AB\u30FC\u30C9\u306E\u9032\u6357\u304C\u30EA\u30BB\u30C3\u30C8\u3055\u308C\u307E\u3057\u305F\u3002", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u30CE\u30FC\u30C8\u3092\u958B\u304F", - REVIEW_CARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u30EC\u30D3\u30E5\u30FC", - REVIEW_EASY_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Easy", - REVIEW_GOOD_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Good", - REVIEW_HARD_FILE_MENU: "\u30EC\u30D3\u30E5\u30FC: Hard", - REVIEW_NOTE_EASY_CMD: "\u30CE\u30FC\u30C8\u3092Easy\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", - REVIEW_NOTE_GOOD_CMD: "\u30CE\u30FC\u30C8\u3092Good\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", - REVIEW_NOTE_HARD_CMD: "\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", - REVIEW_ALL_CARDS: "\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C8\u304B\u3089\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u30EC\u30D3\u30E5\u30FC\u3059\u308B", - CRAM_CARDS_IN_NOTE: "\u3053\u306E\u30CE\u30FC\u30C8\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u8A70\u3081\u8FBC\u307F\u5B66\u7FD2\u3059\u308B", - VIEW_STATS: "\u7D71\u8A08\u3092\u95B2\u89A7\u3059\u308B", - STATUS_BAR: "\u30EC\u30D3\u30E5\u30FC: ${dueNotesCount}\u30CE\u30FC\u30C8, ${dueFlashcardsCount}\u30AB\u30FC\u30C9\u304C\u671F\u65E5", - SYNC_TIME_TAKEN: "\u540C\u671F\u306B${t}ms\u304B\u304B\u308A\u307E\u3057\u305F\u3002", - NOTE_IN_IGNORED_FOLDER: "\u30CE\u30FC\u30C8\u304C\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002", - PLEASE_TAG_NOTE: "\u30EC\u30D3\u30E5\u30FC\u3092\u884C\u3046\u306B\u306F\u30CE\u30FC\u30C8\u306B\u5BFE\u3057\u3066\u6B63\u3057\u304F\u30BF\u30B0\u4ED8\u3051\u3057\u3066\u304F\u3060\u3055\u3044(\u8A2D\u5B9A\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044)\u3002", - RESPONSE_RECEIVED: "\u7B54\u3048\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\u3002", - NO_DECK_EXISTS: "${deckName}\u306B\u306F\u30C7\u30C3\u30AD\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002", - ALL_CAUGHT_UP: "\u4ECA\u65E5\u306E\u8AB2\u984C\u3092\u3059\u3079\u3066\u9054\u6210\u3057\u307E\u3057\u305F :D", - // scheduling.ts - DAYS_STR_IVL: "${interval}\u65E5\u5F8C", - MONTHS_STR_IVL: "${interval}\u6708\u5F8C", - YEARS_STR_IVL: "${interval}\u5E74\u5F8C", - DAYS_STR_IVL_MOBILE: "${interval}d", - MONTHS_STR_IVL_MOBILE: "${interval}m", - YEARS_STR_IVL_MOBILE: "${interval}y", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - \u8A2D\u5B9A", - CHECK_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306Fwiki\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002', - FOLDERS_TO_IGNORE: "\u7121\u8996\u3059\u308B\u30D5\u30A9\u30EB\u30C0", - FOLDERS_TO_IGNORE_DESC: '\u30D5\u30A9\u30EB\u30C0\u30D1\u30B9\u3092\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"Templates Meta/Scripts" \u306E\u3088\u3046\u306A\u30B9\u30DA\u30FC\u30B9\u306B\u3088\u308B\u533A\u5207\u308A\u3067\u306E\u66F8\u304D\u65B9\u306F\u7121\u52B9\u3067\u3059\u3002', - FLASHCARDS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9", - FLASHCARD_EASY_LABEL: "Easy Button Text", - FLASHCARD_GOOD_LABEL: "Good Button Text", - FLASHCARD_HARD_LABEL: "Hard Button Text", - FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', - FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', - FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', - FLASHCARD_TAGS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0", - FLASHCARD_TAGS_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#flashcards #deck2 #deck3"', - CONVERT_FOLDERS_TO_DECKS: "\u30D5\u30A9\u30EB\u30C0\u3092\u30C7\u30C3\u30AD\u3068\u30B5\u30D6\u30C7\u30C3\u30AD\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", - CONVERT_FOLDERS_TO_DECKS_DESC: "\u3053\u308C\u306F\u4E0A\u8A18\u306E\u30BF\u30B0\u3092\u4F7F\u7528\u3057\u305F\u30C7\u30C3\u30AD\u69CB\u7BC9\u306E\u4EE3\u66FF\u3068\u306A\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3059\u3002", - INLINE_SCHEDULING_COMMENTS: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6700\u7D42\u884C\u3068\u540C\u4E00\u306E\u884C\u306B\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u30B3\u30E1\u30F3\u30C8\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F", - INLINE_SCHEDULING_COMMENTS_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u5316\u3059\u308B\u3068\u3001HTML\u30B3\u30E1\u30F3\u30C8\u306B\u3088\u3063\u3066Markdown\u306E\u30EA\u30B9\u30C8\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u304C\u5D29\u308C\u306A\u304F\u306A\u308A\u307E\u3059\u3002", - BURY_SIBLINGS_TILL_NEXT_DAY: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u307E\u3067\u30B7\u30D6\u30EA\u30F3\u30B0\u3092\u5EF6\u671F\u3057\u307E\u3059\u304B\uFF1F", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u30B7\u30D6\u30EA\u30F3\u30B0\u306F\u540C\u4E00\u306E\u30AB\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u304B\u3089\u751F\u6210\u3055\u308C\u305F\u30AB\u30FC\u30C9\u3001\u3064\u307E\u308A\u7A74\u57CB\u3081\u554F\u984C\u306E\u6D3E\u751F\u30AB\u30FC\u30C9\u3067\u3059\u3002", - SHOW_CARD_CONTEXT: "\u30AB\u30FC\u30C9\u306B\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F", - SHOW_CARD_CONTEXT_DESC: "\uFF62\u30BF\u30A4\u30C8\u30EB > \u898B\u51FA\u3057 1 > \u526F\u898B\u51FA\u3057 > ... > \u526F\u898B\u51FA\u3057\uFF63\u306E\u8868\u793A\u3092\u884C\u3046\u304B\u3069\u3046\u304B\u3092\u6C7A\u3081\u307E\u3059\u3002", - CARD_MODAL_HEIGHT_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u7E26\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8", - CARD_MODAL_SIZE_PERCENT_DESC: "\u30E2\u30D0\u30A4\u30EB\u7248\u3001\u307E\u305F\u306F\u975E\u5E38\u306B\u5927\u304D\u306A\u30B5\u30A4\u30BA\u306E\u753B\u50CF\u304C\u3042\u308B\u5834\u5408\u306B\u306F100%\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002", - RESET_DEFAULT: "\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306B\u30EA\u30BB\u30C3\u30C8\u3059\u308B", - CARD_MODAL_WIDTH_PERCENT: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306E\u6A2A\u30B5\u30A4\u30BA\u306E\u30D1\u30FC\u30BB\u30F3\u30C6\u30FC\u30B8", - RANDOMIZE_CARD_ORDER: "\u30EC\u30D3\u30E5\u30FC\u4E2D\u306E\u30AB\u30FC\u30C9\u306E\u9806\u756A\u3092\u30E9\u30F3\u30C0\u30E0\u306B\u3057\u307E\u3059\u304B\uFF1F", - DISABLE_CLOZE_CARDS: "\u7A74\u57CB\u3081\u30AB\u30FC\u30C9\u3092\u7121\u52B9\u5316\u3057\u307E\u3059\u304B\uFF1F", - CONVERT_HIGHLIGHTS_TO_CLOZES: "==\u30CF\u30A4\u30E9\u30A4\u30C8==\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", - CONVERT_BOLD_TEXT_TO_CLOZES: "**\u30DC\u30FC\u30EB\u30C9\u4F53**\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{\u4E2D\u62EC\u5F27}}\u3092\u7A74\u57CB\u3081\u3068\u3057\u3066\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F", - INLINE_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", - FIX_SEPARATORS_MANUALLY_WARNING: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3059\u308B\u5834\u5408\u306B\u306F\u3001\u4F5C\u6210\u6E08\u307F\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u3092\u624B\u52D5\u3067\u7DE8\u96C6\u3057\u76F4\u3059\u5FC5\u8981\u304C\u3042\u308B\u3053\u3068\u306B\u6CE8\u610F\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - INLINE_REVERSED_CARDS_SEPARATOR: "\u30A4\u30F3\u30E9\u30A4\u30F3\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", - MULTILINE_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", - MULTILINE_REVERSED_CARDS_SEPARATOR: "\u8907\u6570\u884C\u306E\u8868\u88CF\u53CD\u8EE2\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9\u306B\u4F7F\u7528\u3059\u308B\u30BB\u30D1\u30EC\u30FC\u30BF\u30FC", - NOTES: "\u30CE\u30FC\u30C8", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "\u30EC\u30D3\u30E5\u30FC\u306B\u4F7F\u7528\u3059\u308B\u30BF\u30B0", - TAGS_TO_REVIEW_DESC: '\u30BF\u30B0\u3092\u30B9\u30DA\u30FC\u30B9\u307E\u305F\u306F\u6539\u884C\u3067\u533A\u5207\u3063\u3066\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F8B: "#review #tag2 #tag3"', - OPEN_RANDOM_NOTE: "\u30E9\u30F3\u30C0\u30E0\u306B\u30CE\u30FC\u30C8\u3092\u958B\u3044\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B", - OPEN_RANDOM_NOTE_DESC: "\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u7121\u52B9\u5316\u3055\u308C\u3066\u3044\u308B\u72B6\u614B\u3067\u306F\u3001\u30CE\u30FC\u30C8\u306F\u91CD\u8981\u5EA6(\u30DA\u30FC\u30B8\u30E9\u30F3\u30AF)\u306B\u3088\u308B\u9806\u756A\u3067\u8868\u793A\u3055\u308C\u307E\u3059\u3002", - AUTO_NEXT_NOTE: "\u30EC\u30D3\u30E5\u30FC\u5F8C\u306B\u6B21\u306E\u30CE\u30FC\u30C8\u3092\u81EA\u52D5\u7684\u306B\u958B\u304F", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u30D5\u30A1\u30A4\u30EB\u30E1\u30CB\u30E5\u30FC\u3067\u306E\u30EC\u30D3\u30E5\u30FC\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u5316(\uFF62\u30EC\u30D3\u30E5\u30FC: Easy\uFF63\u7B49\u306E\u9805\u76EE\u3092\u975E\u8868\u793A\u306B\u3059\u308B)", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u7121\u52B9\u5316\u3057\u305F\u5F8C\u3001\u30B3\u30DE\u30F3\u30C9\u30DB\u30C3\u30C8\u30AD\u30FC\u3092\u4F7F\u3063\u3066\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u3053\u3068\u304C\u53EF\u80FD\u306B\u306A\u308A\u307E\u3059\u3002\u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u5909\u66F4\u3057\u305F\u5834\u5408\u306B\u306FObsidian\u3092\u30EA\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u30D1\u30CD\u30EB\u306B\u8868\u793A\u3059\u308B\u6700\u5927\u306E\u65E5\u6570", - MIN_ONE_DAY: "\u65E5\u6570\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - VALID_NUMBER_WARNING: "\u6709\u52B9\u306A\u6570\u5B57\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - UI_PREFERENCES: "\u30E6\u30FC\u30B6\u30FC \u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9\u306E\u8A2D\u5B9A", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u30C7\u30C3\u30AD \u30C4\u30EA\u30FC\u306F\u6700\u521D\u306F\u5C55\u958B\u3057\u3066\u8868\u793A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u3053\u308C\u3092\u30AA\u30D5\u306B\u3059\u308B\u3068\u3001\u540C\u3058\u30AB\u30FC\u30C9\u5185\u306E\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30C7\u30C3\u30AD\u304C\u6298\u308A\u305F\u305F\u307E\u308C\u307E\u3059\u3002\u540C\u3058\u30D5\u30A1\u30A4\u30EB\u306B\u591A\u304F\u306E\u30C7\u30C3\u30AD\u306B\u5C5E\u3059\u308B\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u4FBF\u5229\u3067\u3059\u3002", - ALGORITHM: "\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0", - CHECK_ALGORITHM_WIKI: '\u8A73\u7D30\u306B\u3064\u3044\u3066\u306F\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u5B9F\u88C5\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002', - BASE_EASE: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055", - BASE_EASE_DESC: "\u6700\u5C0F\u5024\u306F130\u3067\u3059\u304C\u3001 \u9069\u6B63\u5024\u306F\u304A\u304A\u3088\u305D250\u3067\u3059\u3002", - BASE_EASE_MIN_WARNING: "\u30D9\u30FC\u30B9\u306E\u6613\u3057\u3055\u306B\u306F130\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - LAPSE_INTERVAL_CHANGE: "\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u3092Hard\u3068\u3057\u3066\u30EC\u30D3\u30E5\u30FC\u3057\u305F\u969B\u306E\u9593\u9694\u5909\u66F4", - LAPSE_INTERVAL_CHANGE_DESC: '"\u65B0\u3057\u3044\u9593\u9694 = \u4EE5\u524D\u306E\u9593\u9694 * \u9593\u9694\u5909\u66F4 / 100" \u3068\u3057\u3066\u8A08\u7B97\u3055\u308C\u307E\u3059\u3002', - EASY_BONUS: "Easy\u30DC\u30FC\u30CA\u30B9", - EASY_BONUS_DESC: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u3088\u3063\u3066\u30D5\u30E9\u30C3\u30B7\u30E5\u30AB\u30FC\u30C9/\u30CE\u30FC\u30C8\u306B\u304A\u3051\u308B\u9593\u9694\u306E\u5DEE\u5206\u3092\u8A2D\u5B9A\u3067\u304D\u307E\u3059(\u6700\u5C0F\u5024 = 100%)\u3002", - EASY_BONUS_MIN_WARNING: "Easy\u30DC\u30FC\u30CA\u30B9\u306B\u306F100\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - MAX_INTERVAL: "\u9593\u9694\u306E\u6700\u5927\u5024", - MAX_INTERVAL_DESC: "\u9593\u9694\u306B\u4E0A\u9650\u5024\u3092\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8\u5024 = 100\u5E74)\u3002", - MAX_INTERVAL_MIN_WARNING: "\u9593\u9694\u306E\u6700\u5927\u5024\u306B\u306F1\u4EE5\u4E0A\u306E\u6570\u5B57\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - MAX_LINK_CONTRIB: "\u30EA\u30F3\u30AF\u30B3\u30F3\u30C8\u30EA\u30D3\u30E5\u30FC\u30B7\u30E7\u30F3\u306E\u6700\u5927\u5024", - MAX_LINK_CONTRIB_DESC: "\u6700\u521D\u306E\u6613\u3057\u3055\u306B\u5BFE\u3057\u3066\u3001\u30EA\u30F3\u30AF\u3055\u308C\u305F\u30CE\u30FC\u30C8\u306E\u91CD\u307F\u4ED8\u3051\u3055\u308C\u305F\u6613\u3057\u3055\u304C\u5BC4\u4E0E\u3059\u308B\u6700\u5927\u5024\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002", - LOGGING: "\u30ED\u30B0\u7BA1\u7406", - DISPLAY_DEBUG_INFO: "\u30C7\u30D9\u30ED\u30C3\u30D1\u30FC\u30B3\u30F3\u30BD\u30FC\u30EB\u306B\u3066\u30C7\u30D0\u30C3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F", - // sidebar.ts - NOTES_REVIEW_QUEUE: "\u30CE\u30FC\u30C8\u30EC\u30D3\u30E5\u30FC\u306E\u30AD\u30E5\u30FC", - CLOSE: "\u9589\u3058\u308B", - NEW: "\u65B0\u898F", - YESTERDAY: "\u6628\u65E5", - TODAY: "\u4ECA\u65E5", - TOMORROW: "\u660E\u65E5", - // stats-modal.tsx - STATS_TITLE: "\u7D71\u8A08", - MONTH: "Month", - QUARTER: "Quarter", - YEAR: "Year", - LIFETIME: "Lifetime", - FORECAST: "\u4E88\u6E2C", - FORECAST_DESC: "\u5FA9\u7FD2\u671F\u65E5\u304C\u6765\u308B\u30AB\u30FC\u30C9\u306E\u679A\u6570", - SCHEDULED: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EA\u30F3\u30B0\u6E08\u307F", - DAYS: "\u65E5", - NUMBER_OF_CARDS: "\u30AB\u30FC\u30C9\u6570", - REVIEWS_PER_DAY: "\u5E73\u5747: ${avg}\u30EC\u30D3\u30E5\u30FC/\u65E5", - INTERVALS: "\u9593\u9694", - INTERVALS_DESC: "\u6B21\u306E\u30EC\u30D3\u30E5\u30FC\u4E88\u5B9A\u65E5", - COUNT: "\u30AB\u30A6\u30F3\u30C8", - INTERVALS_SUMMARY: "\u9593\u9694\u306E\u5E73\u5747\u5024: ${avg}, \u6700\u9577\u306E\u9593\u9694: ${longest}", - EASES: "\u6613\u3057\u3055", - EASES_SUMMARY: "\u6613\u3057\u3055\u306E\u5E73\u5747\u5024: ${avgEase}", - CARD_TYPES: "\u30AB\u30FC\u30C9\u30BF\u30A4\u30D7", - CARD_TYPES_DESC: "\u5EF6\u671F\u306E\u30AB\u30FC\u30C9\u304C\u3042\u308B\u5834\u5408\u306B\u306F\u3053\u308C\u306B\u542B\u307E\u308C\u307E\u3059", - CARD_TYPE_NEW: "\u65B0\u898F", - CARD_TYPE_YOUNG: "\u5FA9\u7FD2(\u521D\u671F)", - CARD_TYPE_MATURE: "\u5FA9\u7FD2(\u5F8C\u671F)", - CARD_TYPES_SUMMARY: "\u30AB\u30FC\u30C9\u306E\u5408\u8A08: ${totalCardsCount}\u679A" -}; - -// src/lang/locale/ko.ts -var ko_default = { - // flashcard-modal.tsx - DECKS: "\uB371", - DUE_CARDS: "\uB2E4\uC2DC \uBCFC \uCE74\uB4DC\uB4E4", - NEW_CARDS: "\uC0C8\uB85C\uC6B4 \uCE74\uB4DC\uB4E4", - TOTAL_CARDS: "\uC804\uCCB4 \uCE74\uB4DC\uB4E4", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.", - HARD: "\uC5B4\uB824\uC6C0(Hard)", - GOOD: "\uC88B\uC74C(Good)", - EASY: "\uC26C\uC6C0(Easy)", - SHOW_ANSWER: "\uC815\uB2F5 \uD655\uC778\uD558\uAE30", - CARD_PROGRESS_RESET: "\uCE74\uB4DC\uC758 \uC9C4\uD589\uC0C1\uD669\uC774 \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uC5F4\uAE30", - REVIEW_CARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB9AC\uBDF0", - REVIEW_EASY_FILE_MENU: "\uB9AC\uBDF0: \uC26C\uC6C0(Easy)", - REVIEW_GOOD_FILE_MENU: "\uB9AC\uBDF0: \uC88B\uC74C(Good)", - REVIEW_HARD_FILE_MENU: "\uB9AC\uBDF0: \uC5B4\uB824\uC6C0(Hard)", - REVIEW_NOTE_EASY_CMD: "\uB178\uD2B8\uB97C \uC26C\uC6C0(easy)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", - REVIEW_NOTE_GOOD_CMD: "\uB178\uD2B8\uB97C \uC88B\uC74C(good)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", - REVIEW_NOTE_HARD_CMD: "\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(hard)\uC73C\uB85C \uB9AC\uBDF0\uD569\uB2C8\uB2E4", - REVIEW_ALL_CARDS: "\uBAA8\uB4E0 \uB178\uD2B8\uB4E4\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uB9AC\uBDF0\uD569\uB2C8\uB2E4", - CRAM_CARDS_IN_NOTE: "\uC774 \uB178\uD2B8\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC\uB4E4\uC744 \uBCBC\uB77D\uCE58\uAE30\uD569\uB2C8\uB2E4.", - VIEW_STATS: "\uD1B5\uACC4 \uD655\uC778", - STATUS_BAR: "--\uB9AC\uBDF0: ${dueNotesCount} \uB178\uD2B8, ${dueFlashcardsCount} \uCE74\uB4DC \uB0A8\uC558\uC2B5\uB2C8\uB2E4.", - SYNC_TIME_TAKEN: "\uB3D9\uAE30\uD654\uC5D0 ${t}\uBC00\uB9AC\uCD08 \uAC78\uB838\uC2B5\uB2C8\uB2E4", - NOTE_IN_IGNORED_FOLDER: "\uB178\uD2B8\uAC00 \uBB34\uC2DC\uB41C \uD3F4\uB354 \uC544\uB798\uC5D0 \uC800\uC7A5\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)", - PLEASE_TAG_NOTE: "\uB9AC\uBDF0\uB97C \uD558\uAE30\uC704\uD574 \uB178\uD2B8\uC5D0 \uC801\uC808\uD788 \uD0DC\uADF8\uD574\uC8FC\uC138\uC694. (\uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694)", - RESPONSE_RECEIVED: "\uC694\uCCAD\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4", - NO_DECK_EXISTS: "${deckName}\uC774\uB77C\uB294 \uC774\uB984\uC758 \uB371\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", - ALL_CAUGHT_UP: "\uBAA8\uB450 \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4. :D", - // scheduling.ts - DAYS_STR_IVL: "${interval} \uC77C \uD6C4", - MONTHS_STR_IVL: "${interval} \uAC1C\uC6D4 \uD6C4", - YEARS_STR_IVL: "${interval} \uB144 \uD6C4", - DAYS_STR_IVL_MOBILE: "${interval}d", - MONTHS_STR_IVL_MOBILE: "${interval}m", - YEARS_STR_IVL_MOBILE: "${interval}y", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition Plugin - \uC124\uC815", - CHECK_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, wiki\uB97C \uD655\uC778\uD574\uC8FC\uC138\uC694.', - FOLDERS_TO_IGNORE: "\uBB34\uC2DC\uD560 \uD3F4\uB354\uB4E4", - FOLDERS_TO_IGNORE_DESC: "\uD3F4\uB354 \uACBD\uB85C\uB97C \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. 'Templates Meta/Scripts' \uC640 \uAC19\uC774 \uC785\uB825\uD558\uB294 \uAC83\uC740 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", - FLASHCARDS: "\uD50C\uB798\uC2DC\uCE74\uB4DC", - FLASHCARD_EASY_LABEL: "Easy Button Text", - FLASHCARD_GOOD_LABEL: "Good Button Text", - FLASHCARD_HARD_LABEL: "Hard Button Text", - FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', - FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', - FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', - FLASHCARD_TAGS: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8", - FLASHCARD_TAGS_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#flashcards #deck2 #deck3'", - CONVERT_FOLDERS_TO_DECKS: "\uD3F4\uB354\uB97C \uB371\uACFC \uC11C\uBE0C\uB371\uC73C\uB85C \uC0AC\uC6A9\uD560\uAE4C\uC694?", - CONVERT_FOLDERS_TO_DECKS_DESC: "\uC774 \uAE30\uB2A5\uC740 \uC704\uC758 \uD50C\uB798\uC2DC\uCE74\uB4DC \uD0DC\uADF8 \uC635\uC158\uC744 \uB300\uCCB4\uD569\uB2C8\uB2E4.", - INLINE_SCHEDULING_COMMENTS: "\uD50C\uB798\uC2DC\uCE74\uB4DC\uC758 \uB9C8\uC9C0\uB9C9 \uC904\uACFC \uB3D9\uC77C\uD55C \uC904\uC5D0 \uC2A4\uCF00\uC904\uB9C1 \uCF54\uBA58\uD2B8\uB97C \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - INLINE_SCHEDULING_COMMENTS_DESC: "\uC774 \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 HTML \uC8FC\uC11D\uC774 \uBAA9\uB85D\uC758 \uD3EC\uB9E4\uD305\uC744 \uBB34\uB108\uD2B8\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.", - BURY_SIBLINGS_TILL_NEXT_DAY: "Sibling \uCE74\uB4DC\uB97C \uB2E4\uC74C\uB0A0\uAE4C\uC9C0 \uBB3B\uC5B4\uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Sibling \uCE74\uB4DC\uB294 \uB3D9\uC77C\uD55C \uCE74\uB4DC \uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC0DD\uC131\uB41C \uCE74\uB4DC\uC785\uB2C8\uB2E4. i.e. cloze deletions", - SHOW_CARD_CONTEXT: "\uCE74\uB4DC\uC758 \uBB38\uB9E5(context)\uC744 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - SHOW_CARD_CONTEXT_DESC: "\uCE74\uB4DC\uC5D0\uC11C 'Title > Heading 1 > Subheading > ... > Subheading' \uC758 \uD45C\uC2DC\uB97C \uD560\uC9C0 \uC124\uC815\uD569\uB2C8\uB2E4.", - CARD_MODAL_HEIGHT_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB192\uC774 \uBE44\uC728", - CARD_MODAL_SIZE_PERCENT_DESC: "\uBAA8\uBC14\uC77C \uBC84\uC804 \uD639\uC740 \uB9E4\uC6B0 \uD070 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uACBD\uC6B0 100%\uB85C \uC124\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.", - RESET_DEFAULT: "\uAE30\uBCF8\uAC12\uC73C\uB85C \uCD08\uAE30\uD654", - CARD_MODAL_WIDTH_PERCENT: "\uD50C\uB798\uC2DC\uCE74\uB4DC \uB108\uBE44 \uBE44\uC728", - RANDOMIZE_CARD_ORDER: "\uB9AC\uBDF0\uC911\uC778 \uCE74\uB4DC\uC758 \uC21C\uC11C\uB97C \uB79C\uB364\uC73C\uB85C \uB450\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - DISABLE_CLOZE_CARDS: "\uBE48 \uCE78 \uCC44\uC6B0\uAE30 \uCE74\uB4DC\uB97C \uBE44\uD65C\uC131\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - CONVERT_HIGHLIGHTS_TO_CLOZES: "==hightlights== \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - CONVERT_BOLD_TEXT_TO_CLOZES: "**bolded text** \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "{{curly brackets}} \uB97C \uBE48 \uCE78 \uCC44\uC6B0\uAE30\uB85C \uC804\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - INLINE_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", - FIX_SEPARATORS_MANUALLY_WARNING: "\uC8FC\uC758: \uC774 \uC635\uC158\uC744 \uC218\uC815\uD55C \uD6C4\uC5D0\uB294 \uC774\uBBF8 \uC791\uC131\uB41C \uD50C\uB798\uC2DC\uCE74\uB4DC\uB97C \uC218\uB3D9\uC73C\uB85C \uC218\uC815\uD574\uC57C \uD568\uC744 \uC8FC\uC758\uD558\uC2ED\uC2DC\uC624.", - INLINE_REVERSED_CARDS_SEPARATOR: "\uC778\uB77C\uC778 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", - MULTILINE_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", - MULTILINE_REVERSED_CARDS_SEPARATOR: "\uC5EC\uB7EC \uC904 \uBC18\uC804 \uD50C\uB798\uC2DC\uCE74\uB4DC \uAD6C\uBD84\uC790", - NOTES: "\uB178\uD2B8", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "\uB9AC\uBDF0\uC5D0 \uC0AC\uC6A9\uD560 \uD0DC\uADF8", - TAGS_TO_REVIEW_DESC: "\uD0DC\uADF8\uB97C \uACF5\uBC31 \uB610\uB294 \uBE48 \uC904\uB85C \uAD6C\uBD84\uD574\uC11C \uC785\uB825\uD574\uC8FC\uC138\uC694. \uC608) '#review #tag2 #tag3'", - OPEN_RANDOM_NOTE: "\uB9AC\uBDF0\uB97C \uC704\uD574 \uB79C\uB364 \uB178\uD2B8\uB97C \uC5FD\uB2C8\uB2E4.", - OPEN_RANDOM_NOTE_DESC: "\uC774 \uC635\uC158\uC774 \uAEBC\uC838\uC788\uC73C\uBA74, \uB178\uD2B8\uB294 \uC911\uC694\uB3C4(\uD398\uC774\uC9C0 \uB7AD\uD06C)\uC5D0 \uB530\uB77C \uC815\uB82C\uB429\uB2C8\uB2E4.", - AUTO_NEXT_NOTE: "\uB9AC\uBDF0 \uD6C4\uC5D0 \uB2E4\uC74C \uB178\uD2B8\uB97C \uC790\uB3D9\uC73C\uB85C \uC5FD\uB2C8\uB2E4.", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "\uD30C\uC77C \uBA54\uB274\uC5D0\uC11C\uC758 \uB9AC\uBDF0 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD569\uB2C8\uB2E4. \uC608) \uB9AC\uBDF0: Easy Good Hard", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\uC774 \uC635\uC158\uC744 \uBE44\uD65C\uC131\uD654 \uD55C \uD6C4, \uBA85\uB839 \uB2E8\uCD95\uD0A4\uB97C \uC774\uC6A9\uD574 \uB9AC\uBDF0\uD558\uC2E4 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uC635\uC158\uC744 \uBCC0\uACBD\uD55C \uD6C4\uC5D0 \uC635\uC2DC\uB514\uC5B8\uC744 \uC0C8\uB85C\uACE0\uCE68 \uD558\uC2ED\uC2DC\uC624.", - MAX_N_DAYS_REVIEW_QUEUE: "\uC624\uB978\uCABD \uD328\uB110\uC5D0 \uD45C\uC2DC\uD560 \uCD5C\uB300 \uC77C\uC218", - MIN_ONE_DAY: "\uC801\uC5B4\uB3C4 1\uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", - VALID_NUMBER_WARNING: "\uC720\uD6A8\uD55C \uC22B\uC790\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694.", - UI_PREFERENCES: "\uC0AC\uC6A9\uC790 \uC778\uD130\uD398\uC774\uC2A4 \uAE30\uBCF8 \uC124\uC815", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\uB371 \uD2B8\uB9AC\uB294 \uCC98\uC74C\uC5D0 \uD655\uC7A5\uB41C \uAC83\uC73C\uB85C \uD45C\uC2DC\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\uAC19\uC740 \uCE74\uB4DC\uC5D0 \uC911\uCCA9\uB41C \uB371\uC744 \uC811\uC73C\uB824\uBA74 \uC774 \uC635\uC158\uC744 \uB044\uC2ED\uC2DC\uC624. \uAC19\uC740 \uD30C\uC77C\uC5D0 \uC5EC\uB7EC \uB371\uC5D0 \uC18D\uD55C \uCE74\uB4DC\uAC00 \uC788\uB294 \uACBD\uC6B0 \uC720\uC6A9\uD569\uB2C8\uB2E4.", - ALGORITHM: "\uC54C\uACE0\uB9AC\uC998", - CHECK_ALGORITHM_WIKI: '\uB354 \uB9CE\uC740 \uC815\uBCF4\uB97C \uC6D0\uD558\uC2DC\uBA74, algorithm implementation\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694.', - BASE_EASE: "\uAE30\uBCF8 ease", - BASE_EASE_DESC: "\uCD5C\uC19F\uAC12 = 130, \uC801\uC815\uCE58\uB294 \uB300\uB7B5 250\uC785\uB2C8\uB2E4.", - BASE_EASE_MIN_WARNING: "\uAE30\uBCF8 ease\uB294 \uC801\uC5B4\uB3C4 130 \uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", - LAPSE_INTERVAL_CHANGE: "\uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uB97C \uC5B4\uB824\uC6C0(Hard)\uC73C\uB85C \uB9AC\uBDF0\uD588\uC744 \uB54C\uC758 \uAC04\uACA9 \uBCC0\uACBD", - LAPSE_INTERVAL_CHANGE_DESC: "\uC0C8\uB85C\uC6B4 \uAC04\uACA9 = \uC774\uC804 \uAC04\uACA9 * \uAC04\uACA9\uBCC0\uACBD \uAC12 / 100.", - EASY_BONUS: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4", - EASY_BONUS_DESC: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uD50C\uB798\uC2DC\uCE74\uB4DC/\uB178\uD2B8\uC5D0\uC11C \uC88B\uC74C(Good)\uACFC \uC26C\uC6C0(Easy) \uC0AC\uC774\uC758 \uAC04\uACA9 \uCC28\uC774\uB97C \uC124\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uCD5C\uC18C = 100%)", - EASY_BONUS_MIN_WARNING: "\uC26C\uC6C0(Easy) \uBCF4\uB108\uC2A4\uB294 \uC801\uC5B4\uB3C4 100\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", - MAX_INTERVAL: "\uCD5C\uB300 \uAC04\uACA9", - MAX_INTERVAL_DESC: "\uAC04\uACA9\uC758 \uC0C1\uD55C\uC120\uC744 \uB458 \uC218 \uC788\uC2B5\uB2C8\uB2E4. (\uAE30\uBCF8\uAC12 = 100\uB144)", - MAX_INTERVAL_MIN_WARNING: "\uCD5C\uB300 \uAC04\uACA9\uC740 \uC801\uC5B4\uB3C4 1\uC77C\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4.", - MAX_LINK_CONTRIB: "\uCD5C\uB300 \uC5F0\uACB0 \uAE30\uC5EC\uB3C4", - MAX_LINK_CONTRIB_DESC: "\uB9C1\uD06C\uB41C \uB178\uD2B8\uC758 \uCD08\uAE30 ease\uC5D0 \uB300\uD55C \uAC00\uC911\uCE58\uAC00 \uC801\uC6A9\uB41C ease\uC758 \uCD5C\uB300 \uAE30\uC5EC\uB3C4\uC785\uB2C8\uB2E4.", - LOGGING: "\uB85C\uAE45", - DISPLAY_DEBUG_INFO: "\uB514\uBC84\uAE45 \uC815\uBCF4\uB97C \uAC1C\uBC1C\uC790 \uCF58\uC194\uC5D0 \uD45C\uC2DC\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?", - // sidebar.ts - NOTES_REVIEW_QUEUE: "\uB9AC\uBDF0\uD560 \uB178\uD2B8 \uB300\uAE30\uC5F4", - CLOSE: "\uB2EB\uAE30", - NEW: "New", - YESTERDAY: "\uC5B4\uC81C", - TODAY: "\uC624\uB298", - TOMORROW: "\uB0B4\uC77C", - // stats-modal.tsx - STATS_TITLE: "\uD1B5\uACC4", - MONTH: "\uC6D4", - QUARTER: "\uBD84\uAE30", - YEAR: "\uB144", - LIFETIME: "\uD3C9\uC0DD", - FORECAST: "\uC608\uCE21", - FORECAST_DESC: "\uC774\uD6C4\uC5D0 \uD559\uC2B5\uD560 \uCE74\uB4DC\uC758 \uC218", - SCHEDULED: "Scheduled", - DAYS: "\uC77C", - NUMBER_OF_CARDS: "\uCE74\uB4DC\uC758 \uC218", - REVIEWS_PER_DAY: "\uD3C9\uADE0: ${avg} \uB9AC\uBDF0/\uC77C", - INTERVALS: "\uAC04\uACA9", - INTERVALS_DESC: "\uB9AC\uBDF0\uB97C \uB2E4\uC2DC \uD560 \uB54C \uAE4C\uC9C0\uC758 \uAE30\uAC04", - COUNT: "Count", - INTERVALS_SUMMARY: "\uD3C9\uADE0 \uAC04\uACA9: ${avg}, \uAC00\uC7A5 \uAE34 \uAC04\uACA9: ${longest}", - EASES: "Eases", - EASES_SUMMARY: "Average ease: ${avgEase}", - CARD_TYPES: "\uCE74\uB4DC \uD0C0\uC785", - CARD_TYPES_DESC: "\uC5EC\uAE30\uC5D0\uB294 \uBB3B\uC5B4\uB454 \uCE74\uB4DC\uB3C4 \uD3EC\uD568\uB429\uB2C8\uB2E4.", - CARD_TYPE_NEW: "New", - CARD_TYPE_YOUNG: "Young", - CARD_TYPE_MATURE: "Mature", - CARD_TYPES_SUMMARY: "\uC804\uCCB4 \uCE74\uB4DC \uC218: ${totalCardsCount}" -}; - -// src/lang/locale/mr.ts -var mr_default = {}; - -// src/lang/locale/nl.ts -var nl_default = {}; - -// src/lang/locale/no.ts -var no_default = {}; - -// src/lang/locale/pl.ts -var pl_default = {}; - -// src/lang/locale/pt.ts -var pt_default = {}; - -// src/lang/locale/pt-br.ts -var pt_br_default = { - // flashcard-modal.tsx - DECKS: "Baralhos", - DUE_CARDS: "Cartas para Colocar em Dia", - NEW_CARDS: "Novas Cartas", - TOTAL_CARDS: "Total de Cartas", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "Reiniciar o Progresso da Carta", - HARD: "Dif\xEDcil", - GOOD: "OK", - EASY: "F\xE1cil", - SHOW_ANSWER: "Mostrar Resposta", - CARD_PROGRESS_RESET: "O Progresso da Carta foi reiniciado", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "Abrir uma nota para revisar", - REVIEW_CARDS: "Revisar flashcards", - REVIEW_EASY_FILE_MENU: "Revis\xE3o: F\xE1cil", - REVIEW_GOOD_FILE_MENU: "Revis\xE3o: OK", - REVIEW_HARD_FILE_MENU: "Revis\xE3o: Dif\xEDcil", - REVIEW_NOTE_EASY_CMD: "Revisar nota como f\xE1cil", - REVIEW_NOTE_GOOD_CMD: "Revisar nota como OK", - REVIEW_NOTE_HARD_CMD: "Revisar nota como dif\xEDcil", - REVIEW_ALL_CARDS: "Revisar flashcards de todas as notas", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "Revisar flashcards nessa nota", - CRAM_CARDS_IN_NOTE: "Revisar todas as flashcards nessa nota", - VIEW_STATS: "Ver estat\xEDsticas", - STATUS_BAR: "Revis\xE3o: ${dueNotesCount} nota(s), ${dueFlashcardsCount} Carta(s) para colocar em dia", - SYNC_TIME_TAKEN: "Sicroniza\xE7\xE3o levou ${t}ms", - NOTE_IN_IGNORED_FOLDER: "Nota \xE9 salva na pasta ignorada (cheque as configura\xE7\xF5es).", - PLEASE_TAG_NOTE: "Por favor etiquete a nota apropriadamente para revisar (nas configura\xE7\xF5es).", - RESPONSE_RECEIVED: "Resposta recebida.", - NO_DECK_EXISTS: "Nenhum baralho existe para ${deckName}", - ALL_CAUGHT_UP: "Voc\xEA colocou tudo em prazo agora :D.", - // scheduling.ts - DAYS_STR_IVL: "${interval} dia(s)", - MONTHS_STR_IVL: "${interval} m\xEAs(es)", - YEARS_STR_IVL: "${interval} ano(s)", - DAYS_STR_IVL_MOBILE: "${interval}d", - MONTHS_STR_IVL_MOBILE: "${interval}m", - YEARS_STR_IVL_MOBILE: "${interval}a", - // settings.ts - SETTINGS_HEADER: "Plguin Spaced Repetition - Configura\xE7\xE3o", - CHECK_WIKI: 'Para mais informa\xE7\xF5es, checke o wiki.', - FOLDERS_TO_IGNORE: "Pastas para ignorar", - FOLDERS_TO_IGNORE_DESC: "Ensira o caminho das pastas separado por quebras de linha ex: Templates Meta/Scripts", - FLASHCARDS: "Flashcards", - FLASHCARD_EASY_LABEL: "Texto do Bot\xE3o de F\xE1cil", - FLASHCARD_GOOD_LABEL: "Texto do Bot\xE3o de OK", - FLASHCARD_HARD_LABEL: "Texto do Bot\xE3o de Dif\xEDcil", - FLASHCARD_EASY_DESC: 'Costumize o r\xF3tulo para o bot\xE3o de "F\xE1cil"', - FLASHCARD_GOOD_DESC: 'Costumize o r\xF3tulo para o bot\xE3o de "OK"', - FLASHCARD_HARD_DESC: 'Customize o r\xF3tulo para o bot\xE3o de "Dif\xEDcil"', - FLASHCARD_TAGS: "Etiquetas dos Flashcards", - FLASHCARD_TAGS_DESC: "Ensira etiquetas separadas por espa\xE7os ou quebras de linha ex: #flashcards #baralho2 #baralho3.", - CONVERT_FOLDERS_TO_DECKS: "Converter pastas para baralhos e sub-baralhos?", - CONVERT_FOLDERS_TO_DECKS_DESC: "Isso \xE9 uma alternativa para a op\xE7\xE3o de etiqueta dos Flashcards em cima.", - INLINE_SCHEDULING_COMMENTS: "Salvar coment\xE1rios de agendamento na mesma linha que a \xFAltima linha do flashcard?", - INLINE_SCHEDULING_COMMENTS_DESC: "Ligar isso vai fazer com que os coment\xE1rios em HTML n\xE3o quebrem a formata\xE7\xE3o de listas.", - BURY_SIBLINGS_TILL_NEXT_DAY: "Enterrar cartas irm\xE3s at\xE9 o pr\xF3ximo dia?", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "Cartas irm\xE3s s\xE3o geradas pelo texto da mesma carta ex: omiss\xE3o de palavras", - SHOW_CARD_CONTEXT: "Mostrar conxtexto nas cartas?", - SHOW_CARD_CONTEXT_DESC: "ex: T\xEDtulo > Cabe\xE7alho 1 > Subcabe\xE7alho > ... > Subcabe\xE7alho", - CARD_MODAL_HEIGHT_PERCENT: "Porcentagem da Altura do Flashcard", - CARD_MODAL_SIZE_PERCENT_DESC: "Deveria estar configurado em 100% em dispositivos m\xF3veis ou se voc\xEA tem imagens muito grandes", - RESET_DEFAULT: "Reiniciar para a pr\xE9-defini\xE7\xE3o", - CARD_MODAL_WIDTH_PERCENT: "Porcentagem de Largura do Flashcard", - RANDOMIZE_CARD_ORDER: "Aleatorizar a ordem das cartas durante a revis\xE3o?", - DISABLE_CLOZE_CARDS: "Desabilitar cartas que usam omiss\xE3o de palavras?", - CONVERT_HIGHLIGHTS_TO_CLOZES: "Converter ==marca-texto== em omiss\xF5es?", - CONVERT_BOLD_TEXT_TO_CLOZES: "Converter **texto em negrito** em omiss\xF5es?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "Converter {{chaves}} em omiss\xF5es?", - INLINE_CARDS_SEPARATOR: "Separador para flashcards inline", - FIX_SEPARATORS_MANUALLY_WARNING: "Note que depois de mudar isso voc\xEA vai ter que manualmente mudar quaisquer flashcards que voc\xEA tenha.", - INLINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards inline reversos", - MULTILINE_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas", - MULTILINE_REVERSED_CARDS_SEPARATOR: "Separador para flashcards de m\xFAltiplas linhas reversos", - NOTES: "Notas", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "Etiquetas para revisar", - TAGS_TO_REVIEW_DESC: "Ensira etiquetas separadas por espa\xE7os ou quebra de linhas ex: #revisar #etiqueta2 #etiqueta3.", - OPEN_RANDOM_NOTE: "Abrir uma nota aleat\xF3ria para revisar", - OPEN_RANDOM_NOTE_DESC: "Quando voc\xEA desabilitar isso, as notas v\xE3o ser ordenadas por import\xE2ncia (PageRank).", - AUTO_NEXT_NOTE: "Abrir a pr\xF3xima nota automaticamente depois de uma revis\xE3o", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "Desabilitar op\xE7\xF5es de revis\xE3o no menu de arquivos ex: Revis\xE3o: F\xE1cil OK Dif\xEDcil", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "Depois de desabilitar, voc\xEA pode revisar usando os atalhos de comando. Reinicie Obsidian depois de mudar isso.", - MAX_N_DAYS_REVIEW_QUEUE: "N\xFAmero m\xE1ximo de dias para exibir no painel direito", - MIN_ONE_DAY: "O n\xFAmero de dias deve ser pelo menos 1.", - VALID_NUMBER_WARNING: "Por favor ensira um n\xFAmero v\xE1lido.", - UI_PREFERENCES: "Prefer\xEAncias de UI", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\xC1rvores de baralhos devem inicialmente serem exibidas como expandidas", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "Desabilite isso para colapsar baralhos que est\xE3o um dentro do outro na mesma carta. \xDAtil se voc\xEA tem cartas que pertencem a muitos baralhos em um mesmo arquivo.", - ALGORITHM: "Algor\xEDtmo", - CHECK_ALGORITHM_WIKI: 'Para mais informa\xE7\xF5es, cheque a implementa\xE7\xE3o do algor\xEDtmo.', - BASE_EASE: "Facilidade base", - BASE_EASE_DESC: "m\xEDnimo = 130, preferivelmente aproximadamente 250.", - BASE_EASE_MIN_WARNING: "A facilidade base deve ser pelo menos 130.", - LAPSE_INTERVAL_CHANGE: "Mudan\xE7a de intervalo quando voc\xEA revisa um(a) flashcard/nota como dif\xEDcil", - LAPSE_INTERVAL_CHANGE_DESC: "novoIntervalo = velhoIntervalo * mudancaIntervalo / 100.", - EASY_BONUS: "B\xF4nus de F\xE1cil", - EASY_BONUS_DESC: "O b\xF4nus de f\xE1cil te permite mudar a difer\xEAncia entre intervalos de responder OK e F\xE1cil em um(a) flashcard/nota (m\xEDnimo = 100%).", - EASY_BONUS_MIN_WARNING: "O b\xF4nus de f\xE1cil deve ser pelo menos 100.", - MAX_INTERVAL: "Intervalo M\xE1ximo", - MAX_INTERVAL_DESC: "Te permite colocar um limite m\xE1ximo no intervalo (pr\xE9-defini\xE7\xE3o = 100 anos).", - MAX_INTERVAL_MIN_WARNING: "O intervalo m\xE1ximo deve ser pelo menos 1 dia.", - MAX_LINK_CONTRIB: "Contribui\xE7\xE3o M\xE1xima de Links", - MAX_LINK_CONTRIB_DESC: "Contribui\xE7\xE3o m\xE1xima da facilidade ponderada das notas linkadas \xE0 facilidade inicial.", - LOGGING: "Logging", - DISPLAY_DEBUG_INFO: "Mostrar informa\xE7\xE3o de debugging no console de desenvolvimento?", - // sidebar.ts - NOTES_REVIEW_QUEUE: "Fila de Notas para Revisar", - CLOSE: "Fechar", - NEW: "Novo", - YESTERDAY: "Ontem", - TODAY: "Hoje", - TOMORROW: "Amanh\xE3", - // stats-modal.tsx - STATS_TITLE: "Estat\xEDsticas", - MONTH: "M\xEAs", - QUARTER: "Quarto", - YEAR: "Ano", - LIFETIME: "Tempo Total", - FORECAST: "Previs\xE3o", - FORECAST_DESC: "O n\xFAmero de cartas a serem colocadas em dia no futuro", - SCHEDULED: "Agendado", - DAYS: "Dias", - NUMBER_OF_CARDS: "N\xFAmero de cartas", - REVIEWS_PER_DAY: "M\xE9dia: ${avg} revis\xF5es/dia", - INTERVALS: "Intervalos", - INTERVALS_DESC: "Atrasos at\xE9 que as revis\xF5es sejam exibidas de novo", - COUNT: "Contagem", - INTERVALS_SUMMARY: "Intervalo em m\xE9dia: ${avg}, Maior intervalo: ${longest}", - EASES: "Facilidades", - EASES_SUMMARY: "Facilidade em m\xE9dia: ${avgEase}", - CARD_TYPES: "Tipos de Cartas", - CARD_TYPES_DESC: "Isso tamb\xE9m inclui cartas enterrados, caso existam", - CARD_TYPE_NEW: "Novo", - CARD_TYPE_YOUNG: "Jovem", - CARD_TYPE_MATURE: "Amadurecido", - CARD_TYPES_SUMMARY: "Total de cartas: ${totalCardsCount}" -}; - -// src/lang/locale/ro.ts -var ro_default = {}; - -// src/lang/locale/ru.ts -var ru_default = { - // flashcard-modal.tsx - DECKS: "\u0423\u0440\u043E\u0432\u043D\u0438", - DUE_CARDS: "\u041F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - NEW_CARDS: "\u041D\u043E\u0432\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - TOTAL_CARDS: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - HARD: "\u0421\u043B\u043E\u0436\u043D\u043E", - GOOD: "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E", - EASY: "\u041B\u0435\u0433\u043A\u043E", - SHOW_ANSWER: "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u0442\u0432\u0435\u0442", - CARD_PROGRESS_RESET: "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441 \u0438\u0437\u0443\u0447\u0435\u043D\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", - REVIEW_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - REVIEW_EASY_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E", - REVIEW_GOOD_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E", - REVIEW_HARD_FILE_MENU: "\u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u0421\u043B\u043E\u0436\u043D\u043E", - REVIEW_NOTE_EASY_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u041B\u0451\u0433\u043A\u0443\u044E", - REVIEW_NOTE_GOOD_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u0443\u044E", - REVIEW_NOTE_HARD_CMD: "\u041F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u0421\u043B\u043E\u0436\u043D\u0443\u044E", - REVIEW_ALL_CARDS: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u0432\u0441\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043C\u0435\u0442\u043A\u0430\u0445", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435", - CRAM_CARDS_IN_NOTE: "\u0417\u0443\u0431\u0440\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0437\u0430\u043C\u0435\u0442\u043A\u0435", - VIEW_STATS: "\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443", - STATUS_BAR: "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C: ${dueNotesCount} \u0437\u0430\u043C\u0435\u0442\u043E\u043A(-\u043A\u0438), ${dueFlashcardsCount} \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A(-\u043A\u0438) \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u0438\u0442", - SYNC_TIME_TAKEN: "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044F \u0437\u0430\u043D\u044F\u043B\u0430 ${t}\u043C\u0441", - NOTE_IN_IGNORED_FOLDER: "\u0417\u0430\u043C\u0435\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0432 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u0443\u044E \u043F\u0430\u043F\u043A\u0443 (\u0441\u043C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).", - PLEASE_TAG_NOTE: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u043F\u043E\u043C\u0435\u0442\u044C\u0442\u0435 \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u043A\u0430\u043A \u043D\u0430\u0434\u043E \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F (\u0441\u043C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438).", - RESPONSE_RECEIVED: "\u041E\u0442\u0432\u0435\u0442 \u043F\u043E\u043B\u0443\u0447\u0435\u043D.", - NO_DECK_EXISTS: "\u041D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0443\u0440\u043E\u0432\u043D\u044F ${deckName}", - ALL_CAUGHT_UP: "\u0415\u0441\u0442\u044C! \u0422\u044B \u0441\u043F\u0440\u0430\u0432\u0438\u043B\u0441\u044F! :D.", - // scheduling.ts - DAYS_STR_IVL: "${interval} \u0434\u043D\u0435\u0439", - MONTHS_STR_IVL: "${interval} \u043C\u0435\u0441\u044F\u0446\u043E\u0432", - YEARS_STR_IVL: "${interval} \u0433\u043E\u0434\u0430(\u043B\u0435\u0442)", - DAYS_STR_IVL_MOBILE: "${interval}\u0434", - MONTHS_STR_IVL_MOBILE: "${interval}\u043C", - YEARS_STR_IVL_MOBILE: "${interval}\u0433", - // settings.ts - SETTINGS_HEADER: "Spaced Repetition \u041F\u043B\u0430\u0433\u0438\u043D - \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", - CHECK_WIKI: '\u0414\u043B\u044F \u0434\u043E\u043F \u0438\u043D\u0444\u044B, \u0441\u043C\u043E\u0442\u0440\u0438 wiki. \u0421\u043A\u043E\u0440\u043E \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0432\u043E\u0434 :3', - FOLDERS_TO_IGNORE: "\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u043C\u044B\u0435 \u043F\u0430\u043F\u043A\u0438", - FOLDERS_TO_IGNORE_DESC: "\u0412\u0435\u0434\u0438\u0442\u0435 \u043F\u0443\u0442\u0438 \u043F\u0430\u043F\u043E\u043A \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 enter'\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u0440: Templates Meta/Scripts", - FLASHCARDS: "\u041A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - FLASHCARD_EASY_LABEL: "Easy Button Text", - FLASHCARD_GOOD_LABEL: "Good Button Text", - FLASHCARD_HARD_LABEL: "Hard Button Text", - FLASHCARD_EASY_DESC: 'Customize the label for the "Easy" Button', - FLASHCARD_GOOD_DESC: 'Customize the label for the "Good" Button', - FLASHCARD_HARD_DESC: 'Customize the label for the "Hard" Button', - FLASHCARD_TAGS: "\u0422\u044D\u0433\u0438 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - FLASHCARD_TAGS_DESC: "\u0412\u0435\u0434\u0438\u0442\u0435 \u0442\u044D\u0433\u0438 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 enter'\u043E\u043C \u0438\u043B\u0438 \u043F\u0440\u043E\u0431\u0435\u043B\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u0440: #flashcards #deck2 #deck3.", - CONVERT_FOLDERS_TO_DECKS: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0438 \u0432 \u0443\u0440\u043E\u0432\u043D\u0438 \u0438 \u043F\u043E\u0434\u0443\u0440\u043E\u0432\u043D\u0438?", - CONVERT_FOLDERS_TO_DECKS_DESC: "\u042D\u0442\u043E \u0430\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u0430 \u0442\u044D\u0433\u0430\u043C \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A, \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0441\u0432\u0435\u0440\u0445\u0443.", - INLINE_SCHEDULING_COMMENTS: "\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439 \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0430 \u0441\u0442\u0440\u043E\u043A\u0435 \u043F\u043E\u0441\u043B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A?", - INLINE_SCHEDULING_COMMENTS_DESC: "\u0412\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 \u044D\u0442\u043E\u0433\u043E \u0441\u0434\u0435\u043B\u0430\u0435\u0442 \u0442\u0430\u043A, \u0447\u0442\u043E HTML \u043A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0438 \u043D\u0435 \u0431\u0443\u0434\u0443\u0442 \u043B\u043E\u043C\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0441\u043F\u0438\u0441\u043A\u0430.", - BURY_SIBLINGS_TILL_NEXT_DAY: "\u041F\u0440\u044F\u0442\u0430\u0442\u044C \u0440\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0434\u043E \u0441\u043B\u0435\u0434. \u0434\u043D\u044F?", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u0420\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 - \u0442\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u043D\u044B \u0438\u0437 \u043E\u0434\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438([...])", - SHOW_CARD_CONTEXT: "\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442(\u0443\u0440\u043E\u0432\u0435\u043D\u044C) \u0432 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430\u0445(\u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F)?", - SHOW_CARD_CONTEXT_DESC: "\u043F\u0440\u0438\u043C\u0435\u0440: Title > Heading 1 > Subheading > ... > Subheading", - CARD_MODAL_HEIGHT_PERCENT: "\u0412\u044B\u0441\u043E\u0442\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432\u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445", - CARD_MODAL_SIZE_PERCENT_DESC: "\u0415\u0441\u043B\u0438 \u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435\u0441\u044C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u043E\u043C, \u0432\u044B\u0441\u0442\u0430\u0432\u044C\u0442\u0435 100% \u0438\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u043E\u0433\u0440\u043E\u043C\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", - RESET_DEFAULT: "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E", - CARD_MODAL_WIDTH_PERCENT: "\u0428\u0438\u0440\u0438\u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438 \u0432 \u043F\u0440\u043E\u0446\u0435\u043D\u0442\u0430\u0445", - RANDOMIZE_CARD_ORDER: "\u0421\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0439 \u043F\u043E\u0440\u044F\u0434\u043E\u043A \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F?", - DISABLE_CLOZE_CARDS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043A\u0430\u0440\u0442\u044B \u0441 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u043C\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", - CONVERT_HIGHLIGHTS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C ==\u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442== \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", - CONVERT_BOLD_TEXT_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C **\u0436\u0438\u0440\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442** \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u041A\u043E\u043D\u0432\u0435\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C {{\u0444\u0438\u0433\u0443\u0440\u043D\u044B\u0435 \u0441\u043A\u043E\u0431\u043A\u0438}} \u0432 \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0438(\u043F\u0440\u0438\u043C\u0435\u0440: [...])?", - INLINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - FIX_SEPARATORS_MANUALLY_WARNING: "\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435! \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E \u0432\u0430\u043C \u043F\u0440\u0438\u0434\u0451\u0442\u0441\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438", - INLINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u0432\u043D\u0443\u0442\u0440\u0438\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - MULTILINE_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - MULTILINE_REVERSED_CARDS_SEPARATOR: "\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C \u0434\u043B\u044F \u043E\u0431\u0440\u0430\u0442\u043D\u044B\u0445 \u043C\u043D\u043E\u0433\u043E\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0445 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - NOTES: "\u0417\u0430\u043C\u0435\u0442\u043A\u0438", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "\u0422\u044D\u0433\u0438 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", - TAGS_TO_REVIEW_DESC: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u044D\u0433\u0438, \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u043F\u0440\u043E\u0431\u0435\u043B\u0430\u043C\u0438 \u0438\u043B\u0438 enter`\u0430\u043C\u0438, \u043F\u0440\u0438\u043C\u0435\u0440: #review #tag2 #tag3.", - OPEN_RANDOM_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0443 \u0434\u043B\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", - OPEN_RANDOM_NOTE_DESC: "\u0415\u0441\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C, \u0442\u043E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u044C \u043F\u043E \u0432\u0430\u0436\u043D\u043E\u0441\u0442\u0438 (PageRank).", - AUTO_NEXT_NOTE: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u0437\u0430\u043C\u0435\u0442\u043A\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u0412\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0431\u043E\u0440 \u0441\u043B\u043E\u0436\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u0432 \u043C\u0435\u043D\u044E \u0444\u0430\u0439\u043B\u0430, \u043F\u0440\u0438\u043C\u0435\u0440: \u041F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435: \u041B\u0435\u0433\u043A\u043E \u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E \u0421\u043B\u043E\u0436\u043D\u043E", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u041F\u043E\u0441\u043B\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u0432\u0442\u043E\u0440\u044F\u0442\u044C \u043F\u0440\u0438 \u043F\u043E\u043C\u043E\u0449\u0438 \u0445\u043E\u0442\u043A\u0435\u0435\u0432. \u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 Obsidian \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0433\u043E.", - MAX_N_DAYS_REVIEW_QUEUE: "\u041D\u0430\u0438\u0431\u043E\u043B\u044C\u0448\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u0438 \u0441\u043F\u0440\u0430\u0432\u0430", - MIN_ONE_DAY: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043D\u0435\u0439 \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.", - VALID_NUMBER_WARNING: "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0435\u0435 \u0447\u0438\u0441\u043B\u043E.", - UI_PREFERENCES: "\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u0414\u0435\u0440\u0435\u0432\u044C\u044F \u043A\u043E\u043B\u043E\u0434 \u0434\u043E\u043B\u0436\u043D\u044B \u0438\u0437\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C\u0441\u044F \u043A\u0430\u043A \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u044D\u0442\u043E\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440, \u0447\u0442\u043E\u0431\u044B \u0441\u0432\u0435\u0440\u043D\u0443\u0442\u044C \u0432\u043B\u043E\u0436\u0435\u043D\u043D\u044B\u0435 \u043A\u043E\u043B\u043E\u0434\u044B \u043D\u0430 \u043E\u0434\u043D\u043E\u0439 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435. \u041F\u043E\u043B\u0435\u0437\u043D\u043E, \u0435\u0441\u043B\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044C \u043A\u0430\u0440\u0442\u044B, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u0440\u0438\u043D\u0430\u0434\u043B\u0435\u0436\u0430\u0442 \u043C\u043D\u043E\u0433\u0438\u043C \u043A\u043E\u043B\u043E\u0434\u0430\u043C \u0432 \u043E\u0434\u043D\u043E\u043C \u0444\u0430\u0439\u043B\u0435.", - ALGORITHM: "\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u043C", - CHECK_ALGORITHM_WIKI: '\u0417\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0439 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0435\u0439 \u043E\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044C \u043A \u0440\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430(\u0441\u043A\u043E\u0440\u043E \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0432\u043E\u0434).', - BASE_EASE: "\u0411\u0430\u0437\u043E\u0432\u0430\u044F \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C", - BASE_EASE_DESC: "\u043C\u0438\u043D\u0438\u043C\u0443\u043C = 130, \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0442\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u043A\u043E\u043B\u043E 250.", - BASE_EASE_MIN_WARNING: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043C\u0438\u043D\u0438\u043C\u0443\u043C 130.", - LAPSE_INTERVAL_CHANGE: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 \u043A\u043E\u0433\u0434\u0430 \u0432\u044B \u043E\u0442\u0432\u0435\u0447\u0430\u0435\u0442\u0435 \u0421\u043B\u043E\u0436\u043D\u043E \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438/\u0437\u0430\u043C\u0435\u0442\u043A\u0438", - LAPSE_INTERVAL_CHANGE_DESC: "\u043D\u043E\u0432\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A = \u0441\u0442\u0430\u0440\u044B\u0439\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A * \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430 / 100.", - EASY_BONUS: "\u041B\u0435\u0433\u043A\u043E: \u0431\u043E\u043D\u0443\u0441", - EASY_BONUS_DESC: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u043D\u0438\u0446\u0443 \u0432 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0430\u0445 \u043C\u0435\u0436\u0434\u0443 \u043E\u0442\u0432\u0435\u0442\u0430\u043C\u0438 \u0425\u043E\u0440\u043E\u0448\u043E \u0438 \u041B\u0435\u0433\u043A\u043E \u043D\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0435/\u0437\u0430\u043C\u0435\u0442\u043A\u0435 (\u043C\u0438\u043D. = 100%).", - EASY_BONUS_MIN_WARNING: "\u0411\u043E\u043D\u0443\u0441 \u0437\u0430 \u041B\u0435\u0433\u043A\u043E \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 100.", - MAX_INTERVAL: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A(\u043E\u0442\u043A\u043B\u0430\u0434\u044B\u0432\u0430\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438)", - MAX_INTERVAL_DESC: "\u041F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u0430\u043C \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C \u0432\u0435\u0440\u0445\u043D\u044E\u044E \u0433\u0440\u0430\u043D\u0438\u0446\u0443 \u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A (\u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = 100 years).", - MAX_INTERVAL_MIN_WARNING: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043D\u0435 \u043C\u0435\u043D\u044C\u0448\u0435 1.", - MAX_LINK_CONTRIB: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0441\u0432\u044F\u0437\u0438(\u0441\u0441\u044B\u043B\u043A\u0438)", - MAX_LINK_CONTRIB_DESC: "\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0432\u043A\u043B\u0430\u0434 \u0432\u0437\u0432\u0435\u0448\u0435\u043D\u043D\u043E\u0439 \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438 \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0445 \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u0432 \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0443\u044E \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C.", - LOGGING: "\u0412\u0435\u0434\u0435\u043D\u0438\u0435 \u043B\u043E\u0433\u0430", - DISPLAY_DEBUG_INFO: "\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u043E\u0442\u043B\u0430\u0434\u043A\u0438 \u043D\u0430 \u043A\u043E\u043D\u0441\u043E\u043B\u044C \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430(developer console)?", - // sidebar.ts - NOTES_REVIEW_QUEUE: "\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0437\u0430\u043C\u0435\u0442\u043E\u043A \u043D\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0435", - CLOSE: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C", - NEW: "\u041D\u043E\u0432\u044B\u0435", - YESTERDAY: "\u0412\u0447\u0435\u0440\u0430\u0448\u043D\u0438\u0435", - TODAY: "\u0421\u0435\u0433\u043E\u0434\u043D\u044F\u0448\u043D\u0438\u0435", - TOMORROW: "\u0417\u0430\u0432\u0442\u0440\u0430\u0448\u043D\u0438\u0435", - // stats-modal.tsx - STATS_TITLE: "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430", - MONTH: "\u041C\u0435\u0441\u044F\u0446", - QUARTER: "\u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044C", - YEAR: "\u0413\u043E\u0434", - LIFETIME: "\u0412\u0441\u0451 \u0432\u0440\u0435\u043C\u044F", - FORECAST: "\u041F\u0440\u043E\u0433\u043D\u043E\u0437", - FORECAST_DESC: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u043F\u0440\u0435\u0434\u0441\u0442\u043E\u044F\u0449\u0438\u0445 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043C", - SCHEDULED: "\u0417\u0430\u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043E", - DAYS: "\u0414\u043D\u0435\u0439", - NUMBER_OF_CARDS: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - REVIEWS_PER_DAY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0441\u0442\u0432\u043E: ${avg} \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u0439/\u0434\u0435\u043D\u044C", - //!!! - INTERVALS: "\u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u044B", - INTERVALS_DESC: "\u041F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043A\u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u043E \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0433\u043E \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u0435\u043D\u0438\u044F", - COUNT: "\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E", - INTERVALS_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${avg}, \u0421\u0430\u043C\u044B\u0439 \u0434\u043B\u0438\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u043C\u0435\u0436\u0443\u0442\u043E\u043A: ${longest}", - EASES: "\u041B\u0451\u0433\u043A\u043E\u0441\u0442\u044C(\u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0435, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0432\u043B\u0438\u044F\u0435\u0442 \u043D\u0430 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0438 \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u043A\u0430\u0437\u0430 \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A) \n (\u043E\u0442 \u0430\u043D\u0433\u043B. ease, \u0441\u043C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430)", - EASES_SUMMARY: "\u0421\u0440\u0435\u0434\u043D\u0435\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u041B\u0451\u0433\u043A\u043E\u0441\u0442\u0438: ${avgEase}", - CARD_TYPES: "\u0422\u0438\u043F\u044B \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A", - CARD_TYPES_DESC: "\u042D\u0442\u043E \u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0441\u043F\u0440\u044F\u0442\u0430\u043D\u043D\u044B\u0435 \u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0438, \u0435\u0441\u043B\u0438 \u0447\u0442\u043E:", - CARD_TYPE_NEW: "\u041D\u043E\u0432\u044B\u0445", - CARD_TYPE_YOUNG: "\u041C\u043E\u043B\u043E\u0434\u044B\u0445", - CARD_TYPE_MATURE: "\u0412\u0437\u0440\u043E\u0441\u043B\u044B\u0445", - CARD_TYPES_SUMMARY: "\u0412\u0441\u0435\u0433\u043E \u043A\u0430\u0440\u0442\u043E\u0447\u0435\u043A: ${totalCardsCount}" -}; - -// src/lang/locale/ta.ts -var ta_default = {}; - -// src/lang/locale/te.ts -var te_default = {}; - -// src/lang/locale/th.ts -var th_default = {}; - -// src/lang/locale/tr.ts -var tr_default = {}; - -// src/lang/locale/uk.ts -var uk_default = {}; - -// src/lang/locale/ur.ts -var ur_default = {}; - -// src/lang/locale/vi.ts -var vi_default = {}; - -// src/lang/locale/zh-cn.ts -var zh_cn_default = { - // flashcard-modal.tsx - DECKS: "\u5361\u7EC4", - DUE_CARDS: "\u5230\u671F\u5361\u7247", - NEW_CARDS: "\u65B0\u5361\u7247", - TOTAL_CARDS: "\u5168\u90E8\u5361\u7247", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247", - HARD: "\u8F83\u96BE", - GOOD: "\u8BB0\u5F97", - EASY: "\u7B80\u5355", - SHOW_ANSWER: "\u663E\u793A\u7B54\u6848", - CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "\u6253\u5F00\u4E00\u4E2A\u7B14\u8BB0\u5F00\u59CB\u590D\u4E60", - REVIEW_CARDS: "\u590D\u4E60\u5361\u7247", - REVIEW_EASY_FILE_MENU: "\u590D\u4E60\uFF1A\u7B80\u5355", - REVIEW_GOOD_FILE_MENU: "\u590D\u4E60\uFF1A\u8BB0\u5F97", - REVIEW_HARD_FILE_MENU: "\u590D\u4E60\uFF1A\u8F83\u96BE", - REVIEW_NOTE_EASY_CMD: "\u6807\u8BB0\u4E3A\u201C\u7B80\u5355\u201D", - REVIEW_NOTE_GOOD_CMD: "\u6807\u8BB0\u4E3A\u201C\u8BB0\u5F97\u201D", - REVIEW_NOTE_HARD_CMD: "\u6807\u8BB0\u4E3A\u201C\u8F83\u96BE\u201D", - REVIEW_ALL_CARDS: "\u590D\u4E60\u6240\u6709\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", - CRAM_ALL_CARDS: "Select a deck to cram", - REVIEW_CARDS_IN_NOTE: "\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", - CRAM_CARDS_IN_NOTE: "\u96C6\u4E2D\u590D\u4E60\u6B64\u7B14\u8BB0\u4E2D\u7684\u5361\u7247", - VIEW_STATS: "\u67E5\u770B\u6570\u636E", - STATUS_BAR: "\u590D\u4E60: ${dueNotesCount} \u7B14\u8BB0, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F", - SYNC_TIME_TAKEN: "\u540C\u6B65\u65F6\u95F4 ${t}ms", - NOTE_IN_IGNORED_FOLDER: "\u7B14\u8BB0\u4FDD\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F84\u4E2D\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002", - PLEASE_TAG_NOTE: "\u8BF7\u5C06\u9700\u8981\u590D\u4E60\u7684\u7B14\u8BB0\u4E2D\u52A0\u5165\u6B63\u786E\u7684\u6807\u7B7E\uFF08\u68C0\u67E5\u8BBE\u7F6E\u9009\u9879\uFF09\u3002", - RESPONSE_RECEIVED: "\u53CD\u9988\u5DF2\u6536\u5230", - NO_DECK_EXISTS: "\u6CA1\u6709 ${deckName} \u5361\u7EC4", - ALL_CAUGHT_UP: "\u90FD\u590D\u4E60\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01", - // scheduling.ts - DAYS_STR_IVL: "${interval} \u5929", - MONTHS_STR_IVL: "${interval} \u6708", - YEARS_STR_IVL: "${interval} \u5E74", - DAYS_STR_IVL_MOBILE: "${interval}\u5929", - MONTHS_STR_IVL_MOBILE: "${interval}\u6708", - YEARS_STR_IVL_MOBILE: "${interval}\u5E74", - // settings.ts - SETTINGS_HEADER: "\u95F4\u9694\u91CD\u590D\u63D2\u4EF6 - \u8BBE\u7F6E", - CHECK_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB wiki.', - FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u6587\u4EF6\u5939", - FOLDERS_TO_IGNORE_DESC: "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84\uFF0C\u7528\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts", - FLASHCARDS: "\u5361\u7247", - FLASHCARD_EASY_LABEL: "\u201C\u7B80\u5355\u201D\u6309\u94AE\u6587\u672C", - FLASHCARD_GOOD_LABEL: "\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u6587\u672C", - FLASHCARD_HARD_LABEL: "\u201C\u8F83\u96BE\u201D\u6309\u94AE\u6587\u672C", - FLASHCARD_EASY_DESC: "\u81EA\u5B9A\u4E49\u201C\u7B80\u5355\u201D\u6309\u94AE\u7684\u6807\u7B7E", - FLASHCARD_GOOD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8BB0\u5F97\u201D\u6309\u94AE\u7684\u6807\u7B7E", - FLASHCARD_HARD_DESC: "\u81EA\u5B9A\u4E49\u201C\u8F83\u96BE\u201D\u6309\u94AE\u7684\u6807\u7B7E", - FLASHCARD_TAGS: "\u5361\u7247\u6807\u7B7E", - FLASHCARD_TAGS_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.", - CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C06\u6587\u4EF6\u5939\u5185\u5BB9\u8F6C\u6362\u4E3A\u5361\u7247\u7EC4\u548C\u5B50\u5361\u7247\u7EC4\uFF1F", - CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9009\u9879\u4E3A\u5361\u7247\u6807\u7B7E\u9009\u9879\u7684\u66FF\u4EE3\u9009\u9879\u3002", - INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C06\u8BA1\u5212\u91CD\u590D\u65F6\u95F4\u4FDD\u5B58\u5728\u5361\u7247\u6700\u540E\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F", - INLINE_SCHEDULING_COMMENTS_DESC: "HTML\u6CE8\u91CA\u4E0D\u518D\u7834\u574F\u5217\u8868\u683C\u5F0F", - BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C06\u5173\u8054\u5361\u7247\u9690\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u5173\u8054\u5361\u7247\u662F\u6765\u81EA\u540C\u4E00\u5361\u7247\u7684\u4E0D\u540C\u5F62\u5F0F\uFF0C \u4F8B\u5982\uFF1A\u5B8C\u5F62\u586B\u7A7A\u5361\u7247", - SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u663E\u793A\u4E0A\u4E0B\u6587\uFF1F", - SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6807\u9898 > \u526F\u6807\u9898 > \u5C0F\u6807\u9898 > ... > \u5C0F\u6807\u9898", - CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4", - CARD_MODAL_SIZE_PERCENT_DESC: "\u8BF7\u5728\u79FB\u52A8\u7AEF\u4F7F\u7528\u5E76\u9700\u8981\u6D4F\u89C8\u8F83\u5927\u56FE\u7247\u65F6\u8BBE\u4E3A100%", - RESET_DEFAULT: "\u91CD\u7F6E\u4E3A\u9ED8\u8BA4", - CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BBD\u5EA6\u767E\u5206\u6BD4", - RANDOMIZE_CARD_ORDER: "\u590D\u4E60\u65F6\u968F\u673A\u663E\u793A\u5361\u7247\uFF1F", - DISABLE_CLOZE_CARDS: "\u4E0D\u8FDB\u884C\u5B8C\u5F62\u586B\u7A7A\uFF1F", - CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C06 ==\u9AD8\u4EAE== \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", - CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C06 **\u7C97\u4F53** \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C06 {{\u5927\u62EC\u53F7}} \u8F6C\u6362\u4E3A\u5B8C\u5F62\u586B\u7A7A\uFF1F", - INLINE_CARDS_SEPARATOR: "\u5355\u884C\u5361\u7247\u7684\u5206\u9694\u7B26", - FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9009\u9879\u540E\u4F60\u5C06\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u7B26\u3002", - INLINE_REVERSED_CARDS_SEPARATOR: "\u5355\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26", - MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u7B26", - MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F6C\u5361\u7247\u7684\u5206\u9694\u7B26", - NOTES: "\u7B14\u8BB0", - REVIEW_PANE_ON_STARTUP: "Enable note review pane on startup", - TAGS_TO_REVIEW: "\u590D\u4E60\u6807\u7B7E", - TAGS_TO_REVIEW_DESC: "\u8F93\u5165\u6807\u7B7E\uFF0C\u7528\u7A7A\u683C\u6216\u65B0\u5EFA\u884C\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.", - OPEN_RANDOM_NOTE: "\u590D\u4E60\u968F\u673A\u7B14\u8BB0", - OPEN_RANDOM_NOTE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\uFF0C\u7B14\u8BB0\u5C06\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002", - AUTO_NEXT_NOTE: "\u590D\u4E60\u540E\u81EA\u52A8\u6253\u5F00\u4E0B\u4E00\u4E2A\u7B14\u8BB0", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u5173\u95ED\u6587\u4EF6\u9009\u5355\u4E2D\u7684\u590D\u4E60\u9009\u9879 \u4F8B\u5982\uFF1A\u590D\u4E60\uFF1A\u7B80\u5355 \u8BB0\u5F97 \u8F83\u96BE", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u540E\u4F60\u53EF\u4EE5\u4F7F\u7528\u5FEB\u6377\u952E\u5F00\u59CB\u590D\u4E60\u3002\u91CD\u65B0\u542F\u52A8Obsidian\u4F7F\u672C\u9009\u9879\u751F\u6548\u3002", - MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u8FB9\u680F\u4E2D\u663E\u793A\u7684\u6700\u5927\u5929\u6570", - MIN_ONE_DAY: "\u5929\u6570\u6700\u5C0F\u503C\u4E3A1", - VALID_NUMBER_WARNING: "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57\u3002", - UI_PREFERENCES: "\u7528\u6237\u754C\u9762\u9996\u9009\u9879", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u7532\u677F\u6811\u6700\u521D\u5E94\u663E\u793A\u4E3A\u5C55\u5F00", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u5173\u95ED\u6B64\u9009\u9879\u53EF\u6298\u53E0\u540C\u4E00\u5F20\u5361\u7247\u4E2D\u7684\u5D4C\u5957\u724C\u7EC4\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C5E\u4E8E\u540C\u4E00\u6587\u4EF6\u4E2D\u7684\u8BB8\u591A\u5957\u724C\uFF0C\u5219\u5F88\u6709\u7528\u3002", - ALGORITHM: "\u7B97\u6CD5", - CHECK_ALGORITHM_WIKI: '\u4E86\u89E3\u66F4\u591A, \u8BF7\u70B9\u51FB algorithm implementation.', - BASE_EASE: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6", - BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u8350\u503C\u7EA6250.", - BASE_EASE_MIN_WARNING: "\u57FA\u7840\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u4E3A130\u3002", - LAPSE_INTERVAL_CHANGE: "\u5C06\u590D\u4E60\u65F6\u6807\u6CE8\u4E3A\u201C\u8F83\u96BE\u201D\u7684\u5361\u7247\u6216\u7B14\u8BB0\u590D\u4E60\u95F4\u9694\u7F29\u77ED", - LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u590D\u4E60\u95F4\u9694 = \u539F\u590D\u4E60\u95F4\u9694 * \u95F4\u9694\u6539\u53D8\u7CFB\u6570 / 100.", - EASY_BONUS: "\u7B80\u5355\u5956\u52B1", - EASY_BONUS_DESC: "\u7B80\u5355\u5956\u52B1\u8BBE\u5B9A\u201C\u8BB0\u5F97\u201D\u548C\u201C\u7B80\u5355\u201D\u5361\u7247\u6216\u7B14\u8BB0\u7684\u590D\u4E60\u95F4\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002", - EASY_BONUS_MIN_WARNING: "\u7B80\u5355\u5956\u52B1\u81F3\u5C11\u4E3A100\u3002", - MAX_INTERVAL: "\u6700\u5927\u95F4\u9694", - MAX_INTERVAL_DESC: "\u8BBE\u5B9A\u590D\u4E60\u7684\u6700\u5927\u95F4\u9694\u65F6\u95F4\uFF08\u9ED8\u8BA4\u503C100\u5E74\uFF09\u3002", - MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u95F4\u9694\u81F3\u5C11\u4E3A1\u5929", - MAX_LINK_CONTRIB: "\u6700\u5927\u94FE\u63A5\u6536\u76CA", - MAX_LINK_CONTRIB_DESC: "\u7531\u539F\u638C\u63E1\u7A0B\u5EA6\u94FE\u63A5\u7684\u7B14\u8BB0\u7ED9\u4E0E\u7684\u6700\u5927\u52A0\u6743\u638C\u63E1\u5EA6\u6536\u76CA\u3002", - LOGGING: "\u8BB0\u5F55\u4E2D", - DISPLAY_DEBUG_INFO: "\u5728\u5F00\u53D1\u8005\u63A7\u5236\u53F0\u4E2D\u663E\u793A\u8C03\u8BD5\u4FE1\u606F\uFF1F", - // sidebar.ts - NOTES_REVIEW_QUEUE: "\u7B14\u8BB0\u590D\u4E60\u5E8F\u5217", - CLOSE: "\u4E34\u8FD1", - NEW: "\u65B0", - YESTERDAY: "\u6628\u5929", - TODAY: "\u4ECA\u5929", - TOMORROW: "\u660E\u5929", - // stats-modal.tsx - STATS_TITLE: "\u6570\u636E", - MONTH: "\u6708", - QUARTER: "\u5B63", - YEAR: "\u5E74", - LIFETIME: "\u5168\u90E8", - FORECAST: "\u9884\u671F", - FORECAST_DESC: "\u5C06\u8981\u5230\u671F\u7684\u5361\u7247\u6570\u91CF", - SCHEDULED: "\u5DF2\u6392\u671F", - DAYS: "\u5929", - NUMBER_OF_CARDS: "\u5361\u7247\u6570\u91CF", - REVIEWS_PER_DAY: "\u5E73\u5747: \u590D\u4E60${avg} /\u5929", - INTERVALS: "\u95F4\u9694", - INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u590D\u4E60\u7684\u65F6\u95F4\u95F4\u9694", - COUNT: "\u8BA1\u6570", - INTERVALS_SUMMARY: "\u5E73\u5747\u95F4\u9694\u65F6\u95F4: ${avg}, \u6700\u957F\u95F4\u9694\u65F6\u95F4: ${longest}", - EASES: "Eases", - EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}", - CARD_TYPES: "\u5361\u7247\u7C7B\u578B", - CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C06\u663E\u793A\u9690\u85CF\u7684\u5361\u7247", - CARD_TYPE_NEW: "\u65B0", - CARD_TYPE_YOUNG: "\u8F83\u65B0", - CARD_TYPE_MATURE: "\u719F\u6089", - CARD_TYPES_SUMMARY: "\u603B\u5361\u7247\u6570: ${totalCardsCount}" -}; - -// src/lang/locale/zh-tw.ts -var zh_tw_default = { - // flashcard-modal.tsx - DECKS: "\u724C\u7D44", - DUE_CARDS: "\u5230\u671F\u5361\u7247", - NEW_CARDS: "\u65B0\u5361\u7247", - TOTAL_CARDS: "\u5168\u90E8\u5361\u7247", - BACK: "Back", - SKIP: "Skip", - EDIT_CARD: "Edit Card", - RESET_CARD_PROGRESS: "\u91CD\u7F6E\u5361\u7247", - HARD: "\u8F03\u96E3", - GOOD: "\u8A18\u5F97", - EASY: "\u7C21\u55AE", - SHOW_ANSWER: "\u986F\u793A\u7B54\u6848", - CARD_PROGRESS_RESET: "\u5361\u7247\u5DF2\u88AB\u91CD\u7F6E\u3002", - SAVE: "Save", - CANCEL: "Cancel", - NO_INPUT: "No input provided.", - CURRENT_EASE_HELP_TEXT: "Current Ease: ", - CURRENT_INTERVAL_HELP_TEXT: "Current Interval: ", - CARD_GENERATED_FROM: "Generated from: ${notePath}", - // main.ts - OPEN_NOTE_FOR_REVIEW: "\u6253\u958B\u4E00\u500B\u7B46\u8A18\u958B\u59CB\u5FA9\u7FD2", - REVIEW_CARDS: "\u5FA9\u7FD2\u5361\u7247", - REVIEW_EASY_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u7C21\u55AE", - REVIEW_GOOD_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u8A18\u5F97", - REVIEW_HARD_FILE_MENU: "\u5FA9\u7FD2\uFF1A\u8F03\u96E3", - REVIEW_NOTE_EASY_CMD: "\u6A19\u8A18\u70BA\u300C\u7C21\u55AE\u300D", - REVIEW_NOTE_GOOD_CMD: "\u6A19\u8A18\u70BA\u300C\u8A18\u5F97\u300D", - REVIEW_NOTE_HARD_CMD: "\u6A19\u8A18\u70BA\u300C\u8F03\u96E3\u300D", - REVIEW_CARDS_IN_NOTE: "\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247", - CRAM_CARDS_IN_NOTE: "\u4E0D\u8A08\u96E3\u6613\u5EA6\u5FA9\u7FD2\u6B64\u7B46\u8A18\u4E2D\u7684\u5361\u7247", - REVIEW_ALL_CARDS: "\u5FA9\u7FD2\u6240\u6709\u7B46\u8A18\u4E2D\u7684\u5361\u7247", - CRAM_ALL_CARDS: "Select a deck to cram", - VIEW_STATS: "\u6AA2\u8996\u6578\u64DA", - STATUS_BAR: "\u5FA9\u7FD2: ${dueNotesCount} \u7B46\u8A18, ${dueFlashcardsCount} \u5361\u7247\u5DF2\u5230\u671F", - SYNC_TIME_TAKEN: "\u540C\u6B65\u6642\u9593 ${t}ms", - NOTE_IN_IGNORED_FOLDER: "\u7B46\u8A18\u5132\u5B58\u5728\u5DF2\u88AB\u5FFD\u7565\u7684\u8DEF\u5F91\u4E2D\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002", - PLEASE_TAG_NOTE: "\u8ACB\u5C07\u9700\u8981\u5FA9\u7FD2\u7684\u7B46\u8A18\u4E2D\u52A0\u5165\u6B63\u78BA\u7684\u6A19\u7C64\uFF08\u6AA2\u67E5\u8A2D\u5B9A\u9078\u9805\uFF09\u3002", - RESPONSE_RECEIVED: "\u56DE\u994B\u5DF2\u6536\u5230", - NO_DECK_EXISTS: "\u6C92\u6709 ${deckName} \u724C\u7D44", - ALL_CAUGHT_UP: "\u90FD\u5FA9\u7FD2\u5B8C\u5566\uFF0C\u4F60\u771F\u68D2\uFF01", - // scheduling.ts - DAYS_STR_IVL: "${interval} \u5929", - MONTHS_STR_IVL: "${interval} \u6708", - YEARS_STR_IVL: "${interval} \u5E74", - DAYS_STR_IVL_MOBILE: "${interval}\u5929", - MONTHS_STR_IVL_MOBILE: "${interval}\u6708", - YEARS_STR_IVL_MOBILE: "${interval}\u5E74", - // settings.ts - SETTINGS_HEADER: "\u9593\u9694\u91CD\u8907\u5916\u639B - \u8A2D\u5B9A", - CHECK_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078 wiki.', - FOLDERS_TO_IGNORE: "\u5FFD\u7565\u6B64\u8CC7\u6599\u593E", - FOLDERS_TO_IGNORE_DESC: "\u8F38\u5165\u8CC7\u6599\u593E\u8DEF\u5F91\uFF08\u7528\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1ATemplates Meta/Scripts", - FLASHCARDS: "\u5361\u7247", - FLASHCARD_EASY_LABEL: "\u7C21\u55AE\u6309\u9215\u6587\u5B57", - FLASHCARD_GOOD_LABEL: "\u8A18\u5F97\u6309\u9215\u6587\u5B57", - FLASHCARD_HARD_LABEL: "\u8F03\u96E3\u6309\u9215\u6587\u5B57", - FLASHCARD_EASY_DESC: "\u81EA\u8A02\u300C\u7C21\u55AE\u300D\u6309\u9215\u7684\u6A19\u7C64", - FLASHCARD_GOOD_DESC: "\u81EA\u8A02\u300C\u8A18\u5F97\u300D\u6309\u9215\u7684\u6A19\u7C64", - FLASHCARD_HARD_DESC: "\u81EA\u8A02\u300C\u8F03\u96E3\u300D\u6309\u9215\u7684\u6A19\u7C64", - FLASHCARD_TAGS: "\u5361\u7247\u6A19\u7C64", - FLASHCARD_TAGS_DESC: "\u8F38\u5165\u6A19\u7C64\uFF08\u7528\u7A7A\u767D\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF09\uFF0C\u4F8B\u5982\uFF1A#flashcards #deck2 #deck3.", - CONVERT_FOLDERS_TO_DECKS: "\u662F\u5426\u5C07\u8CC7\u6599\u593E\u5167\u5BB9\u8F49\u63DB\u70BA\u724C\u7D44\u548C\u5B50\u724C\u7D44\uFF1F", - CONVERT_FOLDERS_TO_DECKS_DESC: "\u6B64\u9078\u9805\u70BA\u5361\u7247\u6A19\u7C64\u9078\u9805\u7684\u66FF\u4EE3\u9078\u9805\u3002", - INLINE_SCHEDULING_COMMENTS: "\u662F\u5426\u5C07\u8A08\u5283\u91CD\u8907\u6642\u9593\u5132\u5B58\u5728\u5361\u7247\u6700\u5F8C\u4E00\u884C\u7684\u540C\u4E00\u884C\uFF1F", - INLINE_SCHEDULING_COMMENTS_DESC: "\u52FE\u9078\u5F8CHTML\u8A3B\u89E3\u4E0D\u6703\u7834\u58DE\u5217\u8868\u683C\u5F0F\u554F\u984C\u3002", - BURY_SIBLINGS_TILL_NEXT_DAY: "\u5C07\u53CD\u8F49\u5361\u7247\u96B1\u85CF\u81F3\u4E0B\u4E00\u5929\uFF1F", - BURY_SIBLINGS_TILL_NEXT_DAY_DESC: "\u53CD\u8F49\u5361\u7247\u7531\u540C\u4E00\u5361\u7247\u6587\u5B57\u7522\u751F\uFF0C\u4F8B\u5982\uFF1A\u586B\u7A7A\u514B\u6F0F\u5B57", - SHOW_CARD_CONTEXT: "\u5728\u5361\u7247\u4E2D\u986F\u793A\u4E0A\u4E0B\u6587\uFF1F", - SHOW_CARD_CONTEXT_DESC: "\u4F8B\u5982\uFF1A\u6A19\u984C > \u526F\u6A19\u984C > \u5C0F\u6A19\u984C > ... > \u5C0F\u6A19\u984C", - CARD_MODAL_HEIGHT_PERCENT: "\u5361\u7247\u9AD8\u5EA6\u767E\u5206\u6BD4", - CARD_MODAL_SIZE_PERCENT_DESC: "\u5728\u79FB\u52D5\u7AEF\u6216\u9700\u8981\u8F03\u5927\u5716\u7247\u6642\u61C9\u8A2D\u5B9A\u70BA100%", - RESET_DEFAULT: "\u91CD\u7F6E\u70BA\u9810\u8A2D\u503C", - CARD_MODAL_WIDTH_PERCENT: "\u5361\u7247\u5BEC\u5EA6\u767E\u5206\u6BD4", - RANDOMIZE_CARD_ORDER: "\u5FA9\u7FD2\u6642\u96A8\u6A5F\u986F\u793A\u5361\u7247\uFF1F", - DISABLE_CLOZE_CARDS: "\u505C\u7528\u586B\u7A7A\u514B\u6F0F\u5B57\u5361\u7247\uFF1F", - CONVERT_HIGHLIGHTS_TO_CLOZES: "\u5C07 ==\u9AD8\u4EAE== \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", - CONVERT_BOLD_TEXT_TO_CLOZES: "\u5C07 **\u7C97\u9AD4** \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", - CONVERT_CURLY_BRACKETS_TO_CLOZES: "\u5C07 {{\u5927\u62EC\u865F}} \u8F49\u63DB\u70BA\u586B\u7A7A\u514B\u6F0F\u5B57\uFF1F", - INLINE_CARDS_SEPARATOR: "\u55AE\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", - FIX_SEPARATORS_MANUALLY_WARNING: "\u6CE8\u610F\uFF1A\u66F4\u6539\u6B64\u9078\u9805\u5F8C\u4F60\u5C07\u9700\u8981\u81EA\u884C\u66F4\u6539\u5DF2\u5B58\u5728\u5361\u7247\u7684\u5206\u9694\u5B57\u5143\u3002", - INLINE_REVERSED_CARDS_SEPARATOR: "\u55AE\u884C\u53CD\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", - MULTILINE_CARDS_SEPARATOR: "\u591A\u884C\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", - MULTILINE_REVERSED_CARDS_SEPARATOR: "\u591A\u884C\u7FFB\u8F49\u5361\u7247\u7684\u5206\u9694\u5B57\u5143", - NOTES: "\u7B46\u8A18", - REVIEW_PANE_ON_STARTUP: "\u555F\u52D5\u6642\u958B\u555F\u7B46\u8A18\u5FA9\u7FD2\u7A97\u683C", - TAGS_TO_REVIEW: "\u5FA9\u7FD2\u6A19\u7C64", - TAGS_TO_REVIEW_DESC: "\u8F38\u5165\u6A19\u7C64\uFF0C\u7528\u7A7A\u683C\u6216\u63DB\u884C\u5B57\u5143\u5206\u9694\uFF0C\u4F8B\u5982\uFF1A#review #tag2 #tag3.", - OPEN_RANDOM_NOTE: "\u5FA9\u7FD2\u96A8\u6A5F\u7B46\u8A18", - OPEN_RANDOM_NOTE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\uFF0C\u7B46\u8A18\u5C07\u4EE5\u91CD\u8981\u5EA6(PageRank)\u6392\u5E8F\u3002", - AUTO_NEXT_NOTE: "\u5FA9\u7FD2\u5F8C\u81EA\u52D5\u6253\u958B\u4E0B\u4E00\u500B\u7B46\u8A18", - DISABLE_FILE_MENU_REVIEW_OPTIONS: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u4E2D\u7684\u5FA9\u7FD2\u9078\u9805 \u4F8B\u5982\uFF1A\u5FA9\u7FD2\uFF1A\u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3", - DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC: "\u95DC\u9589\u6A94\u6848\u9078\u55AE\u7684\u5FA9\u7FD2\u9078\u9805\uFF0C\u4F8B\u5982\uFF1A\u5FA9\u7FD2: \u7C21\u55AE \u8A18\u5F97 \u8F03\u96E3\u3002", - MAX_N_DAYS_REVIEW_QUEUE: "\u53F3\u908A\u9762\u677F\u986F\u793A\u7684\u6700\u5927\u5929\u6578", - MIN_ONE_DAY: "\u5929\u6578\u6700\u5C0F\u503C\u70BA1", - VALID_NUMBER_WARNING: "\u8ACB\u8F38\u5165\u6709\u6548\u7684\u6578\u5B57\u3002", - UI_PREFERENCES: "\u7528\u6236\u4ECB\u9762\u9996\u9078\u9805", - INITIALLY_EXPAND_SUBDECKS_IN_TREE: "\u724C\u7D44\u6A39\u6700\u521D\u61C9\u986F\u793A\u70BA\u5C55\u958B", - INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC: "\u95DC\u9589\u6B64\u9078\u9805\u53EF\u647A\u758A\u540C\u4E00\u5F35\u5361\u7247\u4E2D\u7684\u5DE2\u72C0\u724C\u7D44\u3002\u5982\u679C\u60A8\u7684\u5361\u7247\u5C6C\u65BC\u540C\u4E00\u6A94\u6848\u4E2D\u7684\u8A31\u591A\u5957\u724C\uFF0C\u5247\u5F88\u6709\u7528\u3002", - ALGORITHM: "\u6F14\u7B97\u6CD5", - CHECK_ALGORITHM_WIKI: '\u77AD\u89E3\u66F4\u591A, \u8ACB\u9EDE\u9078 algorithm implementation.', - BASE_EASE: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6", - BASE_EASE_DESC: "\u6700\u5C0F\u503C130\uFF0C\u63A8\u85A6\u503C\u7D04250.", - BASE_EASE_MIN_WARNING: "\u57FA\u790E\u638C\u63E1\u7A0B\u5EA6\u7684\u6700\u5C0F\u503C\u70BA130\u3002", - LAPSE_INTERVAL_CHANGE: "\u5C07\u5FA9\u7FD2\u6642\u6A19\u8A3B\u70BA\u300C\u8F03\u96E3\u300D\u7684\u5361\u7247\u6216\u7B46\u8A18\u5FA9\u7FD2\u9593\u9694\u7E2E\u77ED", - LAPSE_INTERVAL_CHANGE_DESC: "\u65B0\u5FA9\u7FD2\u9593\u9694 = \u539F\u5FA9\u7FD2\u9593\u9694 * \u9593\u9694\u6539\u8B8A\u4FC2\u6578 / 100.", - EASY_BONUS: "\u7C21\u55AE\u734E\u52F5", - EASY_BONUS_DESC: "\u7C21\u55AE\u734E\u52F5\u8A2D\u5B9A\u300C\u8A18\u5F97\u300D\u548C\u300C\u7C21\u55AE\u300D\u5361\u7247\u6216\u7B46\u8A18\u7684\u5FA9\u7FD2\u9593\u9694\u5DEE\u8DDD\uFF08\u6700\u5C0F\u503C100%\uFF09\u3002", - EASY_BONUS_MIN_WARNING: "\u7C21\u55AE\u734E\u52F5\u81F3\u5C11\u70BA100\u3002", - MAX_INTERVAL: "\u6700\u5927\u9593\u9694", - MAX_INTERVAL_DESC: "\u8A2D\u5B9A\u5FA9\u7FD2\u7684\u6700\u5927\u9593\u9694\u6642\u9593\uFF08\u9810\u8A2D\u503C100\u5E74\uFF09\u3002", - MAX_INTERVAL_MIN_WARNING: "\u6700\u5927\u9593\u9694\u81F3\u5C11\u70BA1\u5929", - MAX_LINK_CONTRIB: "\u6700\u5927\u93C8\u63A5\u8CA2\u737B", - MAX_LINK_CONTRIB_DESC: "Maximum contribution of the weighted ease of linked notes to the initial ease.", - LOGGING: "\u8A18\u9304\u4E2D", - DISPLAY_DEBUG_INFO: "\u5728\u958B\u767C\u8005\u63A7\u5236\u53F0\u4E2D\u986F\u793A\u9664\u932F\u8CC7\u8A0A\uFF1F", - // sidebar.ts - NOTES_REVIEW_QUEUE: "\u7B46\u8A18\u5FA9\u7FD2\u5E8F\u5217", - CLOSE: "\u81E8\u8FD1", - NEW: "\u65B0", - YESTERDAY: "\u6628\u5929", - TODAY: "\u4ECA\u5929", - TOMORROW: "\u660E\u5929", - // stats-modal.tsx - STATS_TITLE: "\u7D71\u8A08", - MONTH: "\u6708", - QUARTER: "\u5B63", - YEAR: "\u5E74", - LIFETIME: "\u5168\u90E8", - FORECAST: "\u9810\u6E2C", - FORECAST_DESC: "\u5C07\u8981\u5230\u671F\u7684\u5361\u7247\u6578\u91CF", - SCHEDULED: "\u5DF2\u6392\u7A0B", - DAYS: "\u5929", - NUMBER_OF_CARDS: "\u5361\u7247\u6578\u91CF", - REVIEWS_PER_DAY: "\u5E73\u5747: \u5FA9\u7FD2${avg} /\u5929", - INTERVALS: "\u9593\u9694", - INTERVALS_DESC: "\u5230\u4E0B\u4E00\u6B21\u5FA9\u7FD2\u7684\u6642\u9593\u9593\u9694", - COUNT: "\u8A08\u6578", - INTERVALS_SUMMARY: "\u5E73\u5747\u9593\u9694\u6642\u9593: ${avg}, \u6700\u9577\u9593\u9694\u6642\u9593: ${longest}", - EASES: "Eases", - EASES_SUMMARY: "\u5E73\u5747\u638C\u63E1\u7A0B\u5EA6: ${avgEase}", - CARD_TYPES: "\u5361\u7247\u578B\u5225", - CARD_TYPES_DESC: "\u5982\u6709\uFF0C\u5C07\u986F\u793A\u96B1\u85CF\u7684\u5361\u7247", - CARD_TYPE_NEW: "\u65B0", - CARD_TYPE_YOUNG: "\u8F03\u65B0", - CARD_TYPE_MATURE: "\u719F\u6089", - CARD_TYPES_SUMMARY: "\u7E3D\u5361\u7247\u6578: ${totalCardsCount}" -}; - -// src/lang/helpers.ts -var localeMap = { - af: af_default, - ar: ar_default, - bn: bn_default, - cs: cz_default, - da: da_default, - de: de_default, - en: en_default, - "en-gb": en_gb_default, - es: es_default, - fr: fr_default, - hi: hi_default, - id: id_default, - it: it_default, - ja: ja_default, - ko: ko_default, - mr: mr_default, - nl: nl_default, - nn: no_default, - pl: pl_default, - pt: pt_default, - "pt-br": pt_br_default, - ro: ro_default, - ru: ru_default, - ta: ta_default, - te: te_default, - th: th_default, - tr: tr_default, - uk: uk_default, - ur: ur_default, - vi: vi_default, - "zh-cn": zh_cn_default, - "zh-tw": zh_tw_default -}; -var locale = localeMap[import_obsidian.moment.locale()]; -function interpolate(str, params) { - const names2 = Object.keys(params); - const vals = Object.values(params); - return new Function(...names2, `return \`${str}\`;`)(...vals); -} -function t(str, params) { - if (!locale) { - console.error(`SRS error: Locale ${import_obsidian.moment.locale()} not found.`); - } - const result = locale && locale[str] || en_default[str]; - if (params) { - return interpolate(result, params); - } - return result; -} - -// src/settings.ts -var DEFAULT_SETTINGS = { - // flashcards - flashcardEasyText: t("EASY"), - flashcardGoodText: t("GOOD"), - flashcardHardText: t("HARD"), - flashcardTags: ["#flashcards"], - convertFoldersToDecks: false, - cardCommentOnSameLine: false, - burySiblingCards: false, - showContextInCards: true, - flashcardHeightPercentage: import_obsidian2.Platform.isMobile ? 100 : 80, - flashcardWidthPercentage: import_obsidian2.Platform.isMobile ? 100 : 40, - randomizeCardOrder: true, - convertHighlightsToClozes: true, - convertBoldTextToClozes: false, - convertCurlyBracketsToClozes: false, - singleLineCardSeparator: "::", - singleLineReversedCardSeparator: ":::", - multilineCardSeparator: "?", - multilineReversedCardSeparator: "??", - editLaterTag: "#edit-later", - // notes - enableNoteReviewPaneOnStartup: true, - tagsToReview: ["#review"], - noteFoldersToIgnore: [], - openRandomNote: false, - autoNextNote: false, - disableFileMenuReviewOptions: false, - maxNDaysNotesReviewQueue: 365, - // UI settings - initiallyExpandAllSubdecksInTree: false, - // algorithm - baseEase: 250, - lapsesIntervalChange: 0.5, - easyBonus: 1.3, - maximumInterval: 36525, - maxLinkFactor: 1, - // logging - showDebugMessages: false -}; -var applyDebounceTimer = 0; -function applySettingsUpdate(callback2) { - clearTimeout(applyDebounceTimer); - applyDebounceTimer = window.setTimeout(callback2, 512); -} -var SRSettingTab = class extends import_obsidian2.PluginSettingTab { - constructor(app2, plugin) { - super(app2, plugin); - this.plugin = plugin; - } - display() { - const { containerEl } = this; - containerEl.empty(); - const header = containerEl.createEl("h1", { text: `${t("SETTINGS_HEADER")}` }); - header.addClass("sr-centered"); - containerEl.createDiv().innerHTML = t("CHECK_WIKI", { - wiki_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/" - }); - new import_obsidian2.Setting(containerEl).setName(t("FOLDERS_TO_IGNORE")).setDesc(t("FOLDERS_TO_IGNORE_DESC")).addTextArea( - (text) => text.setValue(this.plugin.data.settings.noteFoldersToIgnore.join("\n")).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.noteFoldersToIgnore = value.split(/\n+/).map((v) => v.trim()).filter((v) => v); - await this.plugin.savePluginData(); - }); - }) - ); - containerEl.createEl("h3", { text: `${t("FLASHCARDS")}` }); - new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_TAGS")).setDesc(t("FLASHCARD_TAGS_DESC")).addTextArea( - (text) => text.setValue(this.plugin.data.settings.flashcardTags.join(" ")).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.flashcardTags = value.split(/\s+/); - await this.plugin.savePluginData(); - }); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("CONVERT_FOLDERS_TO_DECKS")).setDesc(t("CONVERT_FOLDERS_TO_DECKS_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.convertFoldersToDecks).onChange(async (value) => { - this.plugin.data.settings.convertFoldersToDecks = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("INLINE_SCHEDULING_COMMENTS")).setDesc(t("INLINE_SCHEDULING_COMMENTS_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.cardCommentOnSameLine).onChange(async (value) => { - this.plugin.data.settings.cardCommentOnSameLine = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("BURY_SIBLINGS_TILL_NEXT_DAY")).setDesc(t("BURY_SIBLINGS_TILL_NEXT_DAY_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.burySiblingCards).onChange(async (value) => { - this.plugin.data.settings.burySiblingCards = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("SHOW_CARD_CONTEXT")).setDesc(t("SHOW_CARD_CONTEXT_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.showContextInCards).onChange(async (value) => { - this.plugin.data.settings.showContextInCards = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_HEIGHT_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider( - (slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardHeightPercentage).setDynamicTooltip().onChange(async (value) => { - this.plugin.data.settings.flashcardHeightPercentage = value; - await this.plugin.savePluginData(); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.flashcardHeightPercentage = DEFAULT_SETTINGS.flashcardHeightPercentage; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("CARD_MODAL_WIDTH_PERCENT")).setDesc(t("CARD_MODAL_SIZE_PERCENT_DESC")).addSlider( - (slider) => slider.setLimits(10, 100, 5).setValue(this.plugin.data.settings.flashcardWidthPercentage).setDynamicTooltip().onChange(async (value) => { - this.plugin.data.settings.flashcardWidthPercentage = value; - await this.plugin.savePluginData(); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.flashcardWidthPercentage = DEFAULT_SETTINGS.flashcardWidthPercentage; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("RANDOMIZE_CARD_ORDER")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.randomizeCardOrder).onChange(async (value) => { - this.plugin.data.settings.randomizeCardOrder = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("CONVERT_HIGHLIGHTS_TO_CLOZES")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.convertHighlightsToClozes).onChange(async (value) => { - this.plugin.data.settings.convertHighlightsToClozes = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("CONVERT_BOLD_TEXT_TO_CLOZES")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.convertBoldTextToClozes).onChange(async (value) => { - this.plugin.data.settings.convertBoldTextToClozes = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("CONVERT_CURLY_BRACKETS_TO_CLOZES")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.convertCurlyBracketsToClozes).onChange(async (value) => { - this.plugin.data.settings.convertCurlyBracketsToClozes = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("INLINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( - (text) => text.setValue(this.plugin.data.settings.singleLineCardSeparator).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.singleLineCardSeparator = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.singleLineCardSeparator = DEFAULT_SETTINGS.singleLineCardSeparator; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("INLINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( - (text) => text.setValue(this.plugin.data.settings.singleLineReversedCardSeparator).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.singleLineReversedCardSeparator = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.singleLineReversedCardSeparator = DEFAULT_SETTINGS.singleLineReversedCardSeparator; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( - (text) => text.setValue(this.plugin.data.settings.multilineCardSeparator).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.multilineCardSeparator = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.multilineCardSeparator = DEFAULT_SETTINGS.multilineCardSeparator; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("MULTILINE_REVERSED_CARDS_SEPARATOR")).setDesc(t("FIX_SEPARATORS_MANUALLY_WARNING")).addText( - (text) => text.setValue(this.plugin.data.settings.multilineReversedCardSeparator).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.multilineReversedCardSeparator = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.multilineReversedCardSeparator = DEFAULT_SETTINGS.multilineReversedCardSeparator; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_EASY_LABEL")).setDesc(t("FLASHCARD_EASY_DESC")).addText( - (text) => text.setValue(this.plugin.data.settings.flashcardEasyText).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.flashcardEasyText = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.flashcardEasyText = DEFAULT_SETTINGS.flashcardEasyText; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_GOOD_LABEL")).setDesc(t("FLASHCARD_GOOD_DESC")).addText( - (text) => text.setValue(this.plugin.data.settings.flashcardGoodText).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.flashcardGoodText = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.flashcardGoodText = DEFAULT_SETTINGS.flashcardGoodText; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("FLASHCARD_HARD_LABEL")).setDesc(t("FLASHCARD_HARD_DESC")).addText( - (text) => text.setValue(this.plugin.data.settings.flashcardHardText).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.flashcardHardText = value; - await this.plugin.savePluginData(); - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.flashcardHardText = DEFAULT_SETTINGS.flashcardHardText; - await this.plugin.savePluginData(); - this.display(); - }); - }); - containerEl.createEl("h3", { text: `${t("NOTES")}` }); - new import_obsidian2.Setting(containerEl).setName(t("REVIEW_PANE_ON_STARTUP")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.enableNoteReviewPaneOnStartup).onChange(async (value) => { - this.plugin.data.settings.enableNoteReviewPaneOnStartup = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("TAGS_TO_REVIEW")).setDesc(t("TAGS_TO_REVIEW_DESC")).addTextArea( - (text) => text.setValue(this.plugin.data.settings.tagsToReview.join(" ")).onChange((value) => { - applySettingsUpdate(async () => { - this.plugin.data.settings.tagsToReview = value.split(/\s+/); - await this.plugin.savePluginData(); - }); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("OPEN_RANDOM_NOTE")).setDesc(t("OPEN_RANDOM_NOTE_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.openRandomNote).onChange(async (value) => { - this.plugin.data.settings.openRandomNote = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("AUTO_NEXT_NOTE")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.autoNextNote).onChange(async (value) => { - this.plugin.data.settings.autoNextNote = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("DISABLE_FILE_MENU_REVIEW_OPTIONS")).setDesc(t("DISABLE_FILE_MENU_REVIEW_OPTIONS_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.disableFileMenuReviewOptions).onChange(async (value) => { - this.plugin.data.settings.disableFileMenuReviewOptions = value; - await this.plugin.savePluginData(); - }) - ); - new import_obsidian2.Setting(containerEl).setName(t("MAX_N_DAYS_REVIEW_QUEUE")).addText( - (text) => text.setValue(this.plugin.data.settings.maxNDaysNotesReviewQueue.toString()).onChange((value) => { - applySettingsUpdate(async () => { - const numValue = Number.parseInt(value); - if (!isNaN(numValue)) { - if (numValue < 1) { - new import_obsidian2.Notice(t("MIN_ONE_DAY")); - text.setValue( - this.plugin.data.settings.maxNDaysNotesReviewQueue.toString() - ); - return; - } - this.plugin.data.settings.maxNDaysNotesReviewQueue = numValue; - await this.plugin.savePluginData(); - } else { - new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); - } - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.maxNDaysNotesReviewQueue = DEFAULT_SETTINGS.maxNDaysNotesReviewQueue; - await this.plugin.savePluginData(); - this.display(); - }); - }); - containerEl.createEl("h3", { text: `${t("UI_PREFERENCES")}` }); - new import_obsidian2.Setting(containerEl).setName(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE")).setDesc(t("INITIALLY_EXPAND_SUBDECKS_IN_TREE_DESC")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.initiallyExpandAllSubdecksInTree).onChange(async (value) => { - this.plugin.data.settings.initiallyExpandAllSubdecksInTree = value; - await this.plugin.savePluginData(); - }) - ); - containerEl.createEl("h3", { text: `${t("ALGORITHM")}` }); - containerEl.createDiv().innerHTML = t("CHECK_ALGORITHM_WIKI", { - algo_url: "https://www.stephenmwangi.com/obsidian-spaced-repetition/algorithms/" - }); - new import_obsidian2.Setting(containerEl).setName(t("BASE_EASE")).setDesc(t("BASE_EASE_DESC")).addText( - (text) => text.setValue(this.plugin.data.settings.baseEase.toString()).onChange((value) => { - applySettingsUpdate(async () => { - const numValue = Number.parseInt(value); - if (!isNaN(numValue)) { - if (numValue < 130) { - new import_obsidian2.Notice(t("BASE_EASE_MIN_WARNING")); - text.setValue(this.plugin.data.settings.baseEase.toString()); - return; - } - this.plugin.data.settings.baseEase = numValue; - await this.plugin.savePluginData(); - } else { - new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); - } - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.baseEase = DEFAULT_SETTINGS.baseEase; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("LAPSE_INTERVAL_CHANGE")).setDesc(t("LAPSE_INTERVAL_CHANGE_DESC")).addSlider( - (slider) => slider.setLimits(1, 99, 1).setValue(this.plugin.data.settings.lapsesIntervalChange * 100).setDynamicTooltip().onChange(async (value) => { - this.plugin.data.settings.lapsesIntervalChange = value / 100; - await this.plugin.savePluginData(); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.lapsesIntervalChange = DEFAULT_SETTINGS.lapsesIntervalChange; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("EASY_BONUS")).setDesc(t("EASY_BONUS_DESC")).addText( - (text) => text.setValue((this.plugin.data.settings.easyBonus * 100).toString()).onChange((value) => { - applySettingsUpdate(async () => { - const numValue = Number.parseInt(value) / 100; - if (!isNaN(numValue)) { - if (numValue < 1) { - new import_obsidian2.Notice(t("EASY_BONUS_MIN_WARNING")); - text.setValue( - (this.plugin.data.settings.easyBonus * 100).toString() - ); - return; - } - this.plugin.data.settings.easyBonus = numValue; - await this.plugin.savePluginData(); - } else { - new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); - } - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.easyBonus = DEFAULT_SETTINGS.easyBonus; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("MAX_INTERVAL")).setDesc(t("MAX_INTERVAL_DESC")).addText( - (text) => text.setValue(this.plugin.data.settings.maximumInterval.toString()).onChange((value) => { - applySettingsUpdate(async () => { - const numValue = Number.parseInt(value); - if (!isNaN(numValue)) { - if (numValue < 1) { - new import_obsidian2.Notice(t("MAX_INTERVAL_MIN_WARNING")); - text.setValue( - this.plugin.data.settings.maximumInterval.toString() - ); - return; - } - this.plugin.data.settings.maximumInterval = numValue; - await this.plugin.savePluginData(); - } else { - new import_obsidian2.Notice(t("VALID_NUMBER_WARNING")); - } - }); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.maximumInterval = DEFAULT_SETTINGS.maximumInterval; - await this.plugin.savePluginData(); - this.display(); - }); - }); - new import_obsidian2.Setting(containerEl).setName(t("MAX_LINK_CONTRIB")).setDesc(t("MAX_LINK_CONTRIB_DESC")).addSlider( - (slider) => slider.setLimits(0, 100, 1).setValue(this.plugin.data.settings.maxLinkFactor * 100).setDynamicTooltip().onChange(async (value) => { - this.plugin.data.settings.maxLinkFactor = value / 100; - await this.plugin.savePluginData(); - }) - ).addExtraButton((button) => { - button.setIcon("reset").setTooltip(t("RESET_DEFAULT")).onClick(async () => { - this.plugin.data.settings.maxLinkFactor = DEFAULT_SETTINGS.maxLinkFactor; - await this.plugin.savePluginData(); - this.display(); - }); - }); - containerEl.createEl("h3", { text: `${t("LOGGING")}` }); - new import_obsidian2.Setting(containerEl).setName(t("DISPLAY_DEBUG_INFO")).addToggle( - (toggle) => toggle.setValue(this.plugin.data.settings.showDebugMessages).onChange(async (value) => { - this.plugin.data.settings.showDebugMessages = value; - await this.plugin.savePluginData(); - }) - ); - } -}; - -// src/flashcard-modal.tsx -var import_obsidian3 = require("obsidian"); -var import_vhtml = __toESM(require_vhtml()); - -// src/scheduling.ts -function schedule(response, interval, ease, delayBeforeReview, settingsObj, dueDates) { - delayBeforeReview = Math.max(0, Math.floor(delayBeforeReview / (24 * 3600 * 1e3))); - if (response === 0 /* Easy */) { - ease += 20; - interval = (interval + delayBeforeReview) * ease / 100; - interval *= settingsObj.easyBonus; - } else if (response === 1 /* Good */) { - interval = (interval + delayBeforeReview / 2) * ease / 100; - } else if (response === 2 /* Hard */) { - ease = Math.max(130, ease - 20); - interval = Math.max( - 1, - (interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange - ); - } - if (dueDates !== void 0) { - interval = Math.round(interval); - if (!Object.prototype.hasOwnProperty.call(dueDates, interval)) { - dueDates[interval] = 0; - } else { - if (interval > 4) { - let fuzz = 0; - if (interval < 7) - fuzz = 1; - else if (interval < 30) - fuzz = Math.max(2, Math.floor(interval * 0.15)); - else - fuzz = Math.max(4, Math.floor(interval * 0.05)); - const originalInterval = interval; - outer: - for (let i = 1; i <= fuzz; i++) { - for (const ivl of [originalInterval - i, originalInterval + i]) { - if (!Object.prototype.hasOwnProperty.call(dueDates, ivl)) { - dueDates[ivl] = 0; - interval = ivl; - break outer; - } - if (dueDates[ivl] < dueDates[interval]) - interval = ivl; - } - } - } - } - dueDates[interval]++; - } - interval = Math.min(interval, settingsObj.maximumInterval); - return { interval: Math.round(interval * 10) / 10, ease }; -} -function textInterval(interval, isMobile) { - if (interval === void 0) { - return t("NEW"); - } - const m = Math.round(interval / 3.04375) / 10, y = Math.round(interval / 36.525) / 10; - if (isMobile) { - if (m < 1) - return t("DAYS_STR_IVL_MOBILE", { interval }); - else if (y < 1) - return t("MONTHS_STR_IVL_MOBILE", { interval: m }); - else - return t("YEARS_STR_IVL_MOBILE", { interval: y }); - } else { - if (m < 1) - return t("DAYS_STR_IVL", { interval }); - else if (y < 1) - return t("MONTHS_STR_IVL", { interval: m }); - else - return t("YEARS_STR_IVL", { interval: y }); - } -} - -// src/constants.ts -var SCHEDULING_INFO_REGEX = /^---\n((?:.*\n)*)sr-due: (.+)\nsr-interval: (\d+)\nsr-ease: (\d+)\n((?:.*\n)?)---/; -var YAML_FRONT_MATTER_REGEX = /^---\n((?:.*\n)*?)---/; -var MULTI_SCHEDULING_EXTRACTOR = /!([\d-]+),(\d+),(\d+)/gm; -var LEGACY_SCHEDULING_EXTRACTOR = //gm; -var IMAGE_FORMATS = [ - "jpg", - "jpeg", - "gif", - "png", - "svg", - "webp", - "apng", - "avif", - "jfif", - "pjpeg", - "pjp", - "bmp" -]; -var AUDIO_FORMATS = ["mp3", "webm", "m4a", "wav", "ogg"]; -var VIDEO_FORMATS = ["mp4", "mkv", "avi", "mov"]; -var COLLAPSE_ICON = ''; - -// src/utils.ts -function getTypedObjectEntries(obj) { - return Object.entries(obj); -} -var getKeysPreserveType = Object.keys; -var escapeRegexString = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); -function cyrb53(str, seed = 0) { - let h12 = 3735928559 ^ seed, h22 = 1103547991 ^ seed; - for (let i = 0, ch; i < str.length; i++) { - ch = str.charCodeAt(i); - h12 = Math.imul(h12 ^ ch, 2654435761); - h22 = Math.imul(h22 ^ ch, 1597334677); - } - h12 = Math.imul(h12 ^ h12 >>> 16, 2246822507) ^ Math.imul(h22 ^ h22 >>> 13, 3266489909); - h22 = Math.imul(h22 ^ h22 >>> 16, 2246822507) ^ Math.imul(h12 ^ h12 >>> 13, 3266489909); - return (4294967296 * (2097151 & h22) + (h12 >>> 0)).toString(16); -} - -// src/flashcard-modal.tsx -var FlashcardEditModal = class extends import_obsidian3.Modal { - constructor(app2, plugin, existingText) { - super(app2); - this.didSubmit = false; - this.submitClickCallback = (_) => this.submit(); - this.cancelClickCallback = (_) => this.cancel(); - this.submitEnterCallback = (evt) => { - if ((evt.ctrlKey || evt.metaKey) && evt.key === "Enter") { - evt.preventDefault(); - this.submit(); - } - }; - this.plugin = plugin; - this.titleEl.setText(t("EDIT_CARD")); - this.titleEl.addClass("sr-centered"); - this.modalText = existingText; - this.waitForClose = new Promise((resolve2, reject) => { - this.resolvePromise = resolve2; - this.rejectPromise = reject; - }); - this.display(); - this.open(); - } - static Prompt(app2, plugin, placeholder) { - const newPromptModal = new FlashcardEditModal(app2, plugin, placeholder); - return newPromptModal.waitForClose; - } - display() { - this.contentEl.empty(); - this.modalEl.addClass("sr-flashcard-input-modal"); - const mainContentContainer = this.contentEl.createDiv(); - mainContentContainer.addClass("sr-flashcard-input-area"); - this.inputComponent = this.createInputField(mainContentContainer, this.modalText); - this.createButtonBar(mainContentContainer); - } - createButton(container, text, callback2) { - const btn = new import_obsidian3.ButtonComponent(container); - btn.setButtonText(text).onClick(callback2); - return btn; - } - createButtonBar(mainContentContainer) { - const buttonBarContainer = mainContentContainer.createDiv(); - buttonBarContainer.addClass("sr-flashcard-edit-button-bar"); - this.createButton( - buttonBarContainer, - t("SAVE"), - this.submitClickCallback - ).setCta().buttonEl.style.marginRight = "0"; - this.createButton(buttonBarContainer, t("CANCEL"), this.cancelClickCallback); - } - createInputField(container, value) { - const textComponent = new import_obsidian3.TextAreaComponent(container); - textComponent.inputEl.style.width = "100%"; - textComponent.setValue(value != null ? value : "").onChange((value2) => this.input = value2).inputEl.addEventListener("keydown", this.submitEnterCallback); - return textComponent; - } - submit() { - this.didSubmit = true; - this.close(); - } - cancel() { - this.close(); - } - onOpen() { - super.onOpen(); - this.inputComponent.inputEl.focus(); - } - onClose() { - super.onClose(); - this.resolveInput(); - this.removeInputListener(); - } - resolveInput() { - if (!this.didSubmit) - this.rejectPromise(t("NO_INPUT")); - else - this.resolvePromise(this.input); - } - removeInputListener() { - this.inputComponent.inputEl.removeEventListener("keydown", this.submitEnterCallback); - } -}; -var FlashcardModal = class extends import_obsidian3.Modal { - constructor(app2, plugin, ignoreStats = false) { - super(app2); - this.plugin = plugin; - this.ignoreStats = ignoreStats; - this.titleEl.setText(t("DECKS")); - this.titleEl.addClass("sr-centered"); - if (import_obsidian3.Platform.isMobile) { - this.contentEl.style.display = "block"; - } - this.modalEl.style.height = this.plugin.data.settings.flashcardHeightPercentage + "%"; - this.modalEl.style.width = this.plugin.data.settings.flashcardWidthPercentage + "%"; - this.contentEl.style.position = "relative"; - this.contentEl.style.height = "92%"; - this.contentEl.addClass("sr-modal-content"); - document.body.onkeydown = (e) => { - if (document.activeElement.nodeName != "TEXTAREA" && document.activeElement.nodeName !== "INPUT" && this.mode !== 0 /* DecksList */) { - const consume = () => { - e.preventDefault(); - e.stopPropagation(); - }; - if (this.mode !== 3 /* Closed */ && e.code === "KeyS") { - this.skipCurrentCard(); - consume(); - } else if (this.mode === 1 /* Front */ && (e.code === "Space" || e.code === "Enter")) { - this.showAnswer(); - consume(); - } else if (this.mode === 2 /* Back */) { - if (e.code === "Numpad1" || e.code === "Digit1") { - this.processReview(2 /* Hard */); - consume(); - } else if (e.code === "Numpad2" || e.code === "Digit2" || e.code === "Space") { - this.processReview(1 /* Good */); - consume(); - } else if (e.code === "Numpad3" || e.code === "Digit3") { - this.processReview(0 /* Easy */); - consume(); - } else if (e.code === "Numpad0" || e.code === "Digit0") { - this.processReview(3 /* Reset */); - consume(); - } - } - } - }; - } - onOpen() { - this.decksList(); - } - onClose() { - this.mode = 3 /* Closed */; - } - decksList() { - const aimDeck = this.plugin.deckTree.subdecks.filter( - (deck) => deck.deckName === this.plugin.data.historyDeck - ); - if (this.plugin.data.historyDeck && aimDeck.length > 0) { - const deck = aimDeck[0]; - this.currentDeck = deck; - this.checkDeck = deck.parent; - this.setupCardsView(); - deck.nextCard(this); - return; - } - this.mode = 0 /* DecksList */; - this.titleEl.setText(t("DECKS")); - this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("p", { style: "margin:0px;line-height:12px;" }, /* @__PURE__ */ (0, import_vhtml.default)( - "span", - { - style: "background-color:#4caf50;color:#ffffff;", - "aria-label": t("DUE_CARDS"), - class: "tag-pane-tag-count tree-item-flair sr-deck-counts" - }, - this.plugin.deckTree.dueFlashcardsCount.toString() - ), /* @__PURE__ */ (0, import_vhtml.default)( - "span", - { - style: "background-color:#2196f3;", - "aria-label": t("NEW_CARDS"), - class: "tag-pane-tag-count tree-item-flair sr-deck-counts" - }, - this.plugin.deckTree.newFlashcardsCount.toString() - ), /* @__PURE__ */ (0, import_vhtml.default)( - "span", - { - style: "background-color:#ff7043;", - "aria-label": t("TOTAL_CARDS"), - class: "tag-pane-tag-count tree-item-flair sr-deck-counts" - }, - this.plugin.deckTree.totalFlashcards.toString() - )); - this.contentEl.empty(); - this.contentEl.setAttribute("id", "sr-flashcard-view"); - for (const deck of this.plugin.deckTree.subdecks) { - deck.render(this.contentEl, this); - } - } - setupCardsView() { - this.contentEl.empty(); - const flashCardMenu = this.contentEl.createDiv("sr-flashcard-menu"); - const backButton = flashCardMenu.createEl("button"); - backButton.addClass("sr-flashcard-menu-item"); - (0, import_obsidian3.setIcon)(backButton, "arrow-left"); - backButton.setAttribute("aria-label", t("BACK")); - backButton.addEventListener("click", () => { - this.plugin.data.historyDeck = ""; - this.decksList(); - }); - this.editButton = flashCardMenu.createEl("button"); - this.editButton.addClass("sr-flashcard-menu-item"); - (0, import_obsidian3.setIcon)(this.editButton, "edit"); - this.editButton.setAttribute("aria-label", t("EDIT_CARD")); - this.editButton.addEventListener("click", async () => { - const textPromptArr = this.currentCard.cardText.split("\n"); - let textPrompt = ""; - if (textPromptArr[textPromptArr.length - 1].startsWith("`; - } else { - let scheduling = [ - ...this.currentCard.cardText.matchAll(MULTI_SCHEDULING_EXTRACTOR) - ]; - if (scheduling.length === 0) { - scheduling = [...this.currentCard.cardText.matchAll(LEGACY_SCHEDULING_EXTRACTOR)]; - } - const currCardSched = ["0", dueString, interval.toString(), ease.toString()]; - if (this.currentCard.isDue) { - scheduling[this.currentCard.siblingIdx] = currCardSched; - } else { - scheduling.push(currCardSched); - } - this.currentCard.cardText = this.currentCard.cardText.replace(//gm, ""); - this.currentCard.cardText += ""; - } - fileText = fileText.replace(replacementRegex, () => this.currentCard.cardText); - for (const sibling of this.currentCard.siblings) { - sibling.cardText = this.currentCard.cardText; - } - if (this.plugin.data.settings.burySiblingCards) { - this.burySiblingCards(true); - } - await this.app.vault.modify(this.currentCard.note, fileText); - this.currentDeck.nextCard(this); - } - async burySiblingCards(tillNextDay) { - if (tillNextDay) { - this.plugin.data.buryList.push(cyrb53(this.currentCard.cardText)); - await this.plugin.savePluginData(); - } - for (const sibling of this.currentCard.siblings) { - const dueIdx = this.currentDeck.dueFlashcards.indexOf(sibling); - const newIdx = this.currentDeck.newFlashcards.indexOf(sibling); - if (dueIdx !== -1) { - this.currentDeck.deleteFlashcardAtIndex( - dueIdx, - this.currentDeck.dueFlashcards[dueIdx].isDue - ); - } else if (newIdx !== -1) { - this.currentDeck.deleteFlashcardAtIndex( - newIdx, - this.currentDeck.newFlashcards[newIdx].isDue - ); - } - } - } - skipCurrentCard() { - this.currentDeck.deleteFlashcardAtIndex(this.currentCardIdx, this.currentCard.isDue); - this.burySiblingCards(false); - this.currentDeck.nextCard(this); - } - // slightly modified version of the renderMarkdown function in - // https://github.com/mgmeyers/obsidian-kanban/blob/main/src/KanbanView.tsx - async renderMarkdownWrapper(markdownString, containerEl, recursiveDepth = 0) { - if (recursiveDepth > 4) - return; - import_obsidian3.MarkdownRenderer.renderMarkdown( - markdownString, - containerEl, - this.currentCard.note.path, - this.plugin - ); - containerEl.findAll(".internal-embed").forEach((el) => { - const link2 = this.parseLink(el.getAttribute("src")); - if (!link2.target) { - el.innerText = link2.text; - } else if (link2.target instanceof import_obsidian3.TFile) { - if (link2.target.extension !== "md") { - this.embedMediaFile(el, link2.target); - } else { - el.innerText = ""; - this.renderTransclude(el, link2, recursiveDepth); - } - } - }); - } - parseLink(src) { - const linkComponentsRegex = /^(?[^#^]+)?(?:#(?!\^)(?.+)|#\^(?.+)|#)?$/; - const matched = typeof src === "string" && src.match(linkComponentsRegex); - const file = matched.groups.file || this.currentCard.note.path; - const target = this.plugin.app.metadataCache.getFirstLinkpathDest( - file, - this.currentCard.note.path - ); - return { - text: matched[0], - file: matched.groups.file, - heading: matched.groups.heading, - blockId: matched.groups.blockId, - target - }; - } - embedMediaFile(el, target) { - el.innerText = ""; - if (IMAGE_FORMATS.includes(target.extension)) { - el.createEl( - "img", - { - attr: { - src: this.plugin.app.vault.getResourcePath(target) - } - }, - (img) => { - if (el.hasAttribute("width")) - img.setAttribute("width", el.getAttribute("width")); - else - img.setAttribute("width", "100%"); - if (el.hasAttribute("alt")) - img.setAttribute("alt", el.getAttribute("alt")); - el.addEventListener( - "click", - (ev) => ev.target.style.minWidth = ev.target.style.minWidth === "100%" ? null : "100%" - ); - } - ); - el.addClasses(["image-embed", "is-loaded"]); - } else if (AUDIO_FORMATS.includes(target.extension) || VIDEO_FORMATS.includes(target.extension)) { - el.createEl( - AUDIO_FORMATS.includes(target.extension) ? "audio" : "video", - { - attr: { - controls: "", - src: this.plugin.app.vault.getResourcePath(target) - } - }, - (audio) => { - if (el.hasAttribute("alt")) - audio.setAttribute("alt", el.getAttribute("alt")); - } - ); - el.addClasses(["media-embed", "is-loaded"]); - } else { - el.innerText = target.path; - } - } - async renderTransclude(el, link2, recursiveDepth) { - var _a, _b, _c, _d; - const cache = this.app.metadataCache.getCache(link2.target.path); - const text = await this.app.vault.cachedRead(link2.target); - let blockText; - if (link2.heading) { - const clean = (s) => s.replace(/[\W\s]/g, ""); - const headingIndex = (_a = cache.headings) == null ? void 0 : _a.findIndex( - (h4) => clean(h4.heading) === clean(link2.heading) - ); - const heading = cache.headings[headingIndex]; - const startAt = heading.position.start.offset; - const endAt = ((_d = (_c = (_b = cache.headings.slice(headingIndex + 1).find((h4) => h4.level <= heading.level)) == null ? void 0 : _b.position) == null ? void 0 : _c.start) == null ? void 0 : _d.offset) || text.length; - blockText = text.substring(startAt, endAt); - } else if (link2.blockId) { - const block = cache.blocks[link2.blockId]; - const startAt = block.position.start.offset; - const endAt = block.position.end.offset; - blockText = text.substring(startAt, endAt); - } else { - blockText = text; - } - this.renderMarkdownWrapper(blockText, el, recursiveDepth + 1); - } -}; -var Deck = class { - constructor(deckName, parent) { - this.newFlashcardsCount = 0; - this.dueFlashcardsCount = 0; - // counts those in subdecks too - this.totalFlashcards = 0; - this.deckName = deckName; - this.newFlashcards = []; - this.newFlashcardsCount = 0; - this.dueFlashcards = []; - this.dueFlashcardsCount = 0; - this.totalFlashcards = 0; - this.subdecks = []; - this.parent = parent; - } - createDeck(deckPath) { - if (deckPath.length === 0) { - return; - } - const deckName = deckPath.shift(); - for (const deck2 of this.subdecks) { - if (deckName === deck2.deckName) { - deck2.createDeck(deckPath); - return; - } - } - const deck = new Deck(deckName, this); - this.subdecks.push(deck); - deck.createDeck(deckPath); - } - insertFlashcard(deckPath, cardObj) { - if (cardObj.isDue) { - this.dueFlashcardsCount++; - } else { - this.newFlashcardsCount++; - } - this.totalFlashcards++; - if (deckPath.length === 0) { - if (cardObj.isDue) { - this.dueFlashcards.push(cardObj); - } else { - this.newFlashcards.push(cardObj); - } - return; - } - const deckName = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.insertFlashcard(deckPath, cardObj); - return; - } - } - } - // count flashcards that have either been buried - // or aren't due yet - countFlashcard(deckPath, n = 1) { - this.totalFlashcards += n; - const deckName = deckPath.shift(); - for (const deck of this.subdecks) { - if (deckName === deck.deckName) { - deck.countFlashcard(deckPath, n); - return; - } - } - } - deleteFlashcardAtIndex(index, cardIsDue) { - if (cardIsDue) { - this.dueFlashcards.splice(index, 1); - this.dueFlashcardsCount--; - } else { - this.newFlashcards.splice(index, 1); - this.newFlashcardsCount--; - } - let deck = this.parent; - while (deck !== null) { - if (cardIsDue) { - deck.dueFlashcardsCount--; - } else { - deck.newFlashcardsCount--; - } - deck = deck.parent; - } - } - sortSubdecksList() { - this.subdecks.sort((a, b) => { - if (a.deckName < b.deckName) { - return -1; - } else if (a.deckName > b.deckName) { - return 1; - } - return 0; - }); - for (const deck of this.subdecks) { - deck.sortSubdecksList(); - } - } - render(containerEl, modal) { - const deckView = containerEl.createDiv("tree-item"); - const deckViewSelf = deckView.createDiv( - "tree-item-self tag-pane-tag is-clickable" - ); - const shouldBeInitiallyExpanded = modal.plugin.data.settings.initiallyExpandAllSubdecksInTree; - let collapsed = shouldBeInitiallyExpanded; - let collapseIconEl = null; - if (this.subdecks.length > 0) { - collapseIconEl = deckViewSelf.createDiv("tree-item-icon collapse-icon"); - collapseIconEl.innerHTML = COLLAPSE_ICON; - collapseIconEl.childNodes[0].style.transform = shouldBeInitiallyExpanded ? "" : "rotate(-90deg)"; - } - const deckViewInner = deckViewSelf.createDiv("tree-item-inner"); - deckViewInner.addEventListener("click", () => { - modal.plugin.data.historyDeck = this.deckName; - modal.currentDeck = this; - modal.checkDeck = this.parent; - modal.setupCardsView(); - this.nextCard(modal); - }); - const deckViewInnerText = deckViewInner.createDiv("tag-pane-tag-text"); - deckViewInnerText.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", { class: "tag-pane-tag-self" }, this.deckName); - const deckViewOuter = deckViewSelf.createDiv("tree-item-flair-outer"); - deckViewOuter.innerHTML += /* @__PURE__ */ (0, import_vhtml.default)("span", null, /* @__PURE__ */ (0, import_vhtml.default)( - "span", - { - style: "background-color:#4caf50;", - class: "tag-pane-tag-count tree-item-flair sr-deck-counts" - }, - this.dueFlashcardsCount.toString() - ), /* @__PURE__ */ (0, import_vhtml.default)( - "span", - { - style: "background-color:#2196f3;", - class: "tag-pane-tag-count tree-item-flair sr-deck-counts" - }, - this.newFlashcardsCount.toString() - ), /* @__PURE__ */ (0, import_vhtml.default)( - "span", - { - style: "background-color:#ff7043;", - class: "tag-pane-tag-count tree-item-flair sr-deck-counts" - }, - this.totalFlashcards.toString() - )); - const deckViewChildren = deckView.createDiv("tree-item-children"); - deckViewChildren.style.display = shouldBeInitiallyExpanded ? "block" : "none"; - if (this.subdecks.length > 0) { - collapseIconEl.addEventListener("click", () => { - if (collapsed) { - collapseIconEl.childNodes[0].style.transform = ""; - deckViewChildren.style.display = "block"; - } else { - collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; - deckViewChildren.style.display = "none"; - } - collapsed = !collapsed; - }); - } - for (const deck of this.subdecks) { - deck.render(deckViewChildren, modal); - } - } - nextCard(modal) { - if (this.newFlashcards.length + this.dueFlashcards.length === 0) { - if (this.dueFlashcardsCount + this.newFlashcardsCount > 0) { - for (const deck of this.subdecks) { - if (deck.dueFlashcardsCount + deck.newFlashcardsCount > 0) { - modal.currentDeck = deck; - deck.nextCard(modal); - return; - } - } - } - if (this.parent == modal.checkDeck) { - modal.plugin.data.historyDeck = ""; - modal.decksList(); - } else { - this.parent.nextCard(modal); - } - return; - } - modal.responseDiv.style.display = "none"; - modal.resetButton.disabled = true; - modal.titleEl.setText( - `${this.deckName}: ${this.dueFlashcardsCount + this.newFlashcardsCount}` - ); - modal.answerBtn.style.display = "initial"; - modal.flashcardView.empty(); - modal.mode = 1 /* Front */; - let interval = 1, ease = modal.plugin.data.settings.baseEase, delayBeforeReview = 0; - if (this.dueFlashcards.length > 0) { - if (modal.plugin.data.settings.randomizeCardOrder) { - modal.currentCardIdx = Math.floor(Math.random() * this.dueFlashcards.length); - } else { - modal.currentCardIdx = 0; - } - modal.currentCard = this.dueFlashcards[modal.currentCardIdx]; - modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); - interval = modal.currentCard.interval; - ease = modal.currentCard.ease; - delayBeforeReview = modal.currentCard.delayBeforeReview; - } else if (this.newFlashcards.length > 0) { - if (modal.plugin.data.settings.randomizeCardOrder) { - const pickedCardIdx = Math.floor(Math.random() * this.newFlashcards.length); - modal.currentCardIdx = pickedCardIdx; - const pickedCard = this.newFlashcards[pickedCardIdx]; - let idx = pickedCardIdx; - while (idx >= 0 && pickedCard.siblings.includes(this.newFlashcards[idx])) { - if (!this.newFlashcards[idx].isDue) { - modal.currentCardIdx = idx; - } - idx--; - } - } else { - modal.currentCardIdx = 0; - } - modal.currentCard = this.newFlashcards[modal.currentCardIdx]; - modal.renderMarkdownWrapper(modal.currentCard.front, modal.flashcardView); - if (Object.prototype.hasOwnProperty.call( - modal.plugin.easeByPath, - modal.currentCard.note.path - )) { - ease = modal.plugin.easeByPath[modal.currentCard.note.path]; - } - } - const hardInterval = schedule( - 2 /* Hard */, - interval, - ease, - delayBeforeReview, - modal.plugin.data.settings - ).interval; - const goodInterval = schedule( - 1 /* Good */, - interval, - ease, - delayBeforeReview, - modal.plugin.data.settings - ).interval; - const easyInterval = schedule( - 0 /* Easy */, - interval, - ease, - delayBeforeReview, - modal.plugin.data.settings - ).interval; - if (modal.ignoreStats) { - modal.hardBtn.setText(`${modal.plugin.data.settings.flashcardHardText}`); - modal.easyBtn.setText(`${modal.plugin.data.settings.flashcardEasyText}`); - } else if (import_obsidian3.Platform.isMobile) { - modal.hardBtn.setText(textInterval(hardInterval, true)); - modal.goodBtn.setText(textInterval(goodInterval, true)); - modal.easyBtn.setText(textInterval(easyInterval, true)); - } else { - modal.hardBtn.setText( - `${modal.plugin.data.settings.flashcardHardText} - ${textInterval( - hardInterval, - false - )}` - ); - modal.goodBtn.setText( - `${modal.plugin.data.settings.flashcardGoodText} - ${textInterval( - goodInterval, - false - )}` - ); - modal.easyBtn.setText( - `${modal.plugin.data.settings.flashcardEasyText} - ${textInterval( - easyInterval, - false - )}` - ); - } - if (modal.plugin.data.settings.showContextInCards) - modal.contextView.setText(modal.currentCard.context); - } -}; - -// src/stats-modal.tsx -var import_obsidian4 = require("obsidian"); -var import_vhtml2 = __toESM(require_vhtml()); - -// node_modules/@kurkle/color/dist/color.esm.js -function round(v) { - return v + 0.5 | 0; -} -var lim = (v, l, h4) => Math.max(Math.min(v, h4), l); -function p2b(v) { - return lim(round(v * 2.55), 0, 255); -} -function n2b(v) { - return lim(round(v * 255), 0, 255); -} -function b2n(v) { - return lim(round(v / 2.55) / 100, 0, 1); -} -function n2p(v) { - return lim(round(v * 100), 0, 100); -} -var map$1 = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15 }; -var hex = [..."0123456789ABCDEF"]; -var h1 = (b) => hex[b & 15]; -var h2 = (b) => hex[(b & 240) >> 4] + hex[b & 15]; -var eq = (b) => (b & 240) >> 4 === (b & 15); -var isShort = (v) => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a); -function hexParse(str) { - var len = str.length; - var ret; - if (str[0] === "#") { - if (len === 4 || len === 5) { - ret = { - r: 255 & map$1[str[1]] * 17, - g: 255 & map$1[str[2]] * 17, - b: 255 & map$1[str[3]] * 17, - a: len === 5 ? map$1[str[4]] * 17 : 255 - }; - } else if (len === 7 || len === 9) { - ret = { - r: map$1[str[1]] << 4 | map$1[str[2]], - g: map$1[str[3]] << 4 | map$1[str[4]], - b: map$1[str[5]] << 4 | map$1[str[6]], - a: len === 9 ? map$1[str[7]] << 4 | map$1[str[8]] : 255 - }; - } - } - return ret; -} -var alpha = (a, f) => a < 255 ? f(a) : ""; -function hexString(v) { - var f = isShort(v) ? h1 : h2; - return v ? "#" + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f) : void 0; -} -var HUE_RE = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/; -function hsl2rgbn(h4, s, l) { - const a = s * Math.min(l, 1 - l); - const f = (n, k = (n + h4 / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); - return [f(0), f(8), f(4)]; -} -function hsv2rgbn(h4, s, v) { - const f = (n, k = (n + h4 / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0); - return [f(5), f(3), f(1)]; -} -function hwb2rgbn(h4, w, b) { - const rgb = hsl2rgbn(h4, 1, 0.5); - let i; - if (w + b > 1) { - i = 1 / (w + b); - w *= i; - b *= i; - } - for (i = 0; i < 3; i++) { - rgb[i] *= 1 - w - b; - rgb[i] += w; - } - return rgb; -} -function hueValue(r, g, b, d, max) { - if (r === max) { - return (g - b) / d + (g < b ? 6 : 0); - } - if (g === max) { - return (b - r) / d + 2; - } - return (r - g) / d + 4; -} -function rgb2hsl(v) { - const range = 255; - const r = v.r / range; - const g = v.g / range; - const b = v.b / range; - const max = Math.max(r, g, b); - const min = Math.min(r, g, b); - const l = (max + min) / 2; - let h4, s, d; - if (max !== min) { - d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - h4 = hueValue(r, g, b, d, max); - h4 = h4 * 60 + 0.5; - } - return [h4 | 0, s || 0, l]; -} -function calln(f, a, b, c) { - return (Array.isArray(a) ? f(a[0], a[1], a[2]) : f(a, b, c)).map(n2b); -} -function hsl2rgb(h4, s, l) { - return calln(hsl2rgbn, h4, s, l); -} -function hwb2rgb(h4, w, b) { - return calln(hwb2rgbn, h4, w, b); -} -function hsv2rgb(h4, s, v) { - return calln(hsv2rgbn, h4, s, v); -} -function hue(h4) { - return (h4 % 360 + 360) % 360; -} -function hueParse(str) { - const m = HUE_RE.exec(str); - let a = 255; - let v; - if (!m) { - return; - } - if (m[5] !== v) { - a = m[6] ? p2b(+m[5]) : n2b(+m[5]); - } - const h4 = hue(+m[2]); - const p1 = +m[3] / 100; - const p2 = +m[4] / 100; - if (m[1] === "hwb") { - v = hwb2rgb(h4, p1, p2); - } else if (m[1] === "hsv") { - v = hsv2rgb(h4, p1, p2); - } else { - v = hsl2rgb(h4, p1, p2); - } - return { - r: v[0], - g: v[1], - b: v[2], - a - }; -} -function rotate(v, deg) { - var h4 = rgb2hsl(v); - h4[0] = hue(h4[0] + deg); - h4 = hsl2rgb(h4); - v.r = h4[0]; - v.g = h4[1]; - v.b = h4[2]; -} -function hslString(v) { - if (!v) { - return; - } - const a = rgb2hsl(v); - const h4 = a[0]; - const s = n2p(a[1]); - const l = n2p(a[2]); - return v.a < 255 ? `hsla(${h4}, ${s}%, ${l}%, ${b2n(v.a)})` : `hsl(${h4}, ${s}%, ${l}%)`; -} -var map = { - x: "dark", - Z: "light", - Y: "re", - X: "blu", - W: "gr", - V: "medium", - U: "slate", - A: "ee", - T: "ol", - S: "or", - B: "ra", - C: "lateg", - D: "ights", - R: "in", - Q: "turquois", - E: "hi", - P: "ro", - O: "al", - N: "le", - M: "de", - L: "yello", - F: "en", - K: "ch", - G: "arks", - H: "ea", - I: "ightg", - J: "wh" -}; -var names$1 = { - OiceXe: "f0f8ff", - antiquewEte: "faebd7", - aqua: "ffff", - aquamarRe: "7fffd4", - azuY: "f0ffff", - beige: "f5f5dc", - bisque: "ffe4c4", - black: "0", - blanKedOmond: "ffebcd", - Xe: "ff", - XeviTet: "8a2be2", - bPwn: "a52a2a", - burlywood: "deb887", - caMtXe: "5f9ea0", - KartYuse: "7fff00", - KocTate: "d2691e", - cSO: "ff7f50", - cSnflowerXe: "6495ed", - cSnsilk: "fff8dc", - crimson: "dc143c", - cyan: "ffff", - xXe: "8b", - xcyan: "8b8b", - xgTMnPd: "b8860b", - xWay: "a9a9a9", - xgYF: "6400", - xgYy: "a9a9a9", - xkhaki: "bdb76b", - xmagFta: "8b008b", - xTivegYF: "556b2f", - xSange: "ff8c00", - xScEd: "9932cc", - xYd: "8b0000", - xsOmon: "e9967a", - xsHgYF: "8fbc8f", - xUXe: "483d8b", - xUWay: "2f4f4f", - xUgYy: "2f4f4f", - xQe: "ced1", - xviTet: "9400d3", - dAppRk: "ff1493", - dApskyXe: "bfff", - dimWay: "696969", - dimgYy: "696969", - dodgerXe: "1e90ff", - fiYbrick: "b22222", - flSOwEte: "fffaf0", - foYstWAn: "228b22", - fuKsia: "ff00ff", - gaRsbSo: "dcdcdc", - ghostwEte: "f8f8ff", - gTd: "ffd700", - gTMnPd: "daa520", - Way: "808080", - gYF: "8000", - gYFLw: "adff2f", - gYy: "808080", - honeyMw: "f0fff0", - hotpRk: "ff69b4", - RdianYd: "cd5c5c", - Rdigo: "4b0082", - ivSy: "fffff0", - khaki: "f0e68c", - lavFMr: "e6e6fa", - lavFMrXsh: "fff0f5", - lawngYF: "7cfc00", - NmoncEffon: "fffacd", - ZXe: "add8e6", - ZcSO: "f08080", - Zcyan: "e0ffff", - ZgTMnPdLw: "fafad2", - ZWay: "d3d3d3", - ZgYF: "90ee90", - ZgYy: "d3d3d3", - ZpRk: "ffb6c1", - ZsOmon: "ffa07a", - ZsHgYF: "20b2aa", - ZskyXe: "87cefa", - ZUWay: "778899", - ZUgYy: "778899", - ZstAlXe: "b0c4de", - ZLw: "ffffe0", - lime: "ff00", - limegYF: "32cd32", - lRF: "faf0e6", - magFta: "ff00ff", - maPon: "800000", - VaquamarRe: "66cdaa", - VXe: "cd", - VScEd: "ba55d3", - VpurpN: "9370db", - VsHgYF: "3cb371", - VUXe: "7b68ee", - VsprRggYF: "fa9a", - VQe: "48d1cc", - VviTetYd: "c71585", - midnightXe: "191970", - mRtcYam: "f5fffa", - mistyPse: "ffe4e1", - moccasR: "ffe4b5", - navajowEte: "ffdead", - navy: "80", - Tdlace: "fdf5e6", - Tive: "808000", - TivedBb: "6b8e23", - Sange: "ffa500", - SangeYd: "ff4500", - ScEd: "da70d6", - pOegTMnPd: "eee8aa", - pOegYF: "98fb98", - pOeQe: "afeeee", - pOeviTetYd: "db7093", - papayawEp: "ffefd5", - pHKpuff: "ffdab9", - peru: "cd853f", - pRk: "ffc0cb", - plum: "dda0dd", - powMrXe: "b0e0e6", - purpN: "800080", - YbeccapurpN: "663399", - Yd: "ff0000", - Psybrown: "bc8f8f", - PyOXe: "4169e1", - saddNbPwn: "8b4513", - sOmon: "fa8072", - sandybPwn: "f4a460", - sHgYF: "2e8b57", - sHshell: "fff5ee", - siFna: "a0522d", - silver: "c0c0c0", - skyXe: "87ceeb", - UXe: "6a5acd", - UWay: "708090", - UgYy: "708090", - snow: "fffafa", - sprRggYF: "ff7f", - stAlXe: "4682b4", - tan: "d2b48c", - teO: "8080", - tEstN: "d8bfd8", - tomato: "ff6347", - Qe: "40e0d0", - viTet: "ee82ee", - JHt: "f5deb3", - wEte: "ffffff", - wEtesmoke: "f5f5f5", - Lw: "ffff00", - LwgYF: "9acd32" -}; -function unpack() { - const unpacked = {}; - const keys = Object.keys(names$1); - const tkeys = Object.keys(map); - let i, j, k, ok, nk; - for (i = 0; i < keys.length; i++) { - ok = nk = keys[i]; - for (j = 0; j < tkeys.length; j++) { - k = tkeys[j]; - nk = nk.replace(k, map[k]); - } - k = parseInt(names$1[ok], 16); - unpacked[nk] = [k >> 16 & 255, k >> 8 & 255, k & 255]; - } - return unpacked; -} -var names; -function nameParse(str) { - if (!names) { - names = unpack(); - names.transparent = [0, 0, 0, 0]; - } - const a = names[str.toLowerCase()]; - return a && { - r: a[0], - g: a[1], - b: a[2], - a: a.length === 4 ? a[3] : 255 - }; -} -var RGB_RE = /^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/; -function rgbParse(str) { - const m = RGB_RE.exec(str); - let a = 255; - let r, g, b; - if (!m) { - return; - } - if (m[7] !== r) { - const v = +m[7]; - a = m[8] ? p2b(v) : lim(v * 255, 0, 255); - } - r = +m[1]; - g = +m[3]; - b = +m[5]; - r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255)); - g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255)); - b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255)); - return { - r, - g, - b, - a - }; -} -function rgbString(v) { - return v && (v.a < 255 ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})` : `rgb(${v.r}, ${v.g}, ${v.b})`); -} -var to = (v) => v <= 31308e-7 ? v * 12.92 : Math.pow(v, 1 / 2.4) * 1.055 - 0.055; -var from = (v) => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); -function interpolate2(rgb1, rgb2, t2) { - const r = from(b2n(rgb1.r)); - const g = from(b2n(rgb1.g)); - const b = from(b2n(rgb1.b)); - return { - r: n2b(to(r + t2 * (from(b2n(rgb2.r)) - r))), - g: n2b(to(g + t2 * (from(b2n(rgb2.g)) - g))), - b: n2b(to(b + t2 * (from(b2n(rgb2.b)) - b))), - a: rgb1.a + t2 * (rgb2.a - rgb1.a) - }; -} -function modHSL(v, i, ratio) { - if (v) { - let tmp = rgb2hsl(v); - tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1)); - tmp = hsl2rgb(tmp); - v.r = tmp[0]; - v.g = tmp[1]; - v.b = tmp[2]; - } -} -function clone(v, proto) { - return v ? Object.assign(proto || {}, v) : v; -} -function fromObject(input) { - var v = { r: 0, g: 0, b: 0, a: 255 }; - if (Array.isArray(input)) { - if (input.length >= 3) { - v = { r: input[0], g: input[1], b: input[2], a: 255 }; - if (input.length > 3) { - v.a = n2b(input[3]); - } - } - } else { - v = clone(input, { r: 0, g: 0, b: 0, a: 1 }); - v.a = n2b(v.a); - } - return v; -} -function functionParse(str) { - if (str.charAt(0) === "r") { - return rgbParse(str); - } - return hueParse(str); -} -var Color = class { - constructor(input) { - if (input instanceof Color) { - return input; - } - const type = typeof input; - let v; - if (type === "object") { - v = fromObject(input); - } else if (type === "string") { - v = hexParse(input) || nameParse(input) || functionParse(input); - } - this._rgb = v; - this._valid = !!v; - } - get valid() { - return this._valid; - } - get rgb() { - var v = clone(this._rgb); - if (v) { - v.a = b2n(v.a); - } - return v; - } - set rgb(obj) { - this._rgb = fromObject(obj); - } - rgbString() { - return this._valid ? rgbString(this._rgb) : void 0; - } - hexString() { - return this._valid ? hexString(this._rgb) : void 0; - } - hslString() { - return this._valid ? hslString(this._rgb) : void 0; - } - mix(color2, weight) { - if (color2) { - const c1 = this.rgb; - const c2 = color2.rgb; - let w2; - const p = weight === w2 ? 0.5 : weight; - const w = 2 * p - 1; - const a = c1.a - c2.a; - const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2; - w2 = 1 - w1; - c1.r = 255 & w1 * c1.r + w2 * c2.r + 0.5; - c1.g = 255 & w1 * c1.g + w2 * c2.g + 0.5; - c1.b = 255 & w1 * c1.b + w2 * c2.b + 0.5; - c1.a = p * c1.a + (1 - p) * c2.a; - this.rgb = c1; - } - return this; - } - interpolate(color2, t2) { - if (color2) { - this._rgb = interpolate2(this._rgb, color2._rgb, t2); - } - return this; - } - clone() { - return new Color(this.rgb); - } - alpha(a) { - this._rgb.a = n2b(a); - return this; - } - clearer(ratio) { - const rgb = this._rgb; - rgb.a *= 1 - ratio; - return this; - } - greyscale() { - const rgb = this._rgb; - const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11); - rgb.r = rgb.g = rgb.b = val; - return this; - } - opaquer(ratio) { - const rgb = this._rgb; - rgb.a *= 1 + ratio; - return this; - } - negate() { - const v = this._rgb; - v.r = 255 - v.r; - v.g = 255 - v.g; - v.b = 255 - v.b; - return this; - } - lighten(ratio) { - modHSL(this._rgb, 2, ratio); - return this; - } - darken(ratio) { - modHSL(this._rgb, 2, -ratio); - return this; - } - saturate(ratio) { - modHSL(this._rgb, 1, ratio); - return this; - } - desaturate(ratio) { - modHSL(this._rgb, 1, -ratio); - return this; - } - rotate(deg) { - rotate(this._rgb, deg); - return this; - } -}; - -// node_modules/chart.js/dist/chunks/helpers.segment.js -function noop() { -} -var uid = (() => { - let id = 0; - return () => id++; -})(); -function isNullOrUndef(value) { - return value === null || typeof value === "undefined"; -} -function isArray(value) { - if (Array.isArray && Array.isArray(value)) { - return true; - } - const type = Object.prototype.toString.call(value); - if (type.slice(0, 7) === "[object" && type.slice(-6) === "Array]") { - return true; - } - return false; -} -function isObject(value) { - return value !== null && Object.prototype.toString.call(value) === "[object Object]"; -} -function isNumberFinite(value) { - return (typeof value === "number" || value instanceof Number) && isFinite(+value); -} -function finiteOrDefault(value, defaultValue) { - return isNumberFinite(value) ? value : defaultValue; -} -function valueOrDefault(value, defaultValue) { - return typeof value === "undefined" ? defaultValue : value; -} -var toPercentage = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 : +value / dimension; -var toDimension = (value, dimension) => typeof value === "string" && value.endsWith("%") ? parseFloat(value) / 100 * dimension : +value; -function callback(fn, args, thisArg) { - if (fn && typeof fn.call === "function") { - return fn.apply(thisArg, args); - } -} -function each(loopable, fn, thisArg, reverse) { - let i, len, keys; - if (isArray(loopable)) { - len = loopable.length; - if (reverse) { - for (i = len - 1; i >= 0; i--) { - fn.call(thisArg, loopable[i], i); - } - } else { - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[i], i); - } - } - } else if (isObject(loopable)) { - keys = Object.keys(loopable); - len = keys.length; - for (i = 0; i < len; i++) { - fn.call(thisArg, loopable[keys[i]], keys[i]); - } - } -} -function _elementsEqual(a0, a1) { - let i, ilen, v0, v1; - if (!a0 || !a1 || a0.length !== a1.length) { - return false; - } - for (i = 0, ilen = a0.length; i < ilen; ++i) { - v0 = a0[i]; - v1 = a1[i]; - if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) { - return false; - } - } - return true; -} -function clone2(source) { - if (isArray(source)) { - return source.map(clone2); - } - if (isObject(source)) { - const target = /* @__PURE__ */ Object.create(null); - const keys = Object.keys(source); - const klen = keys.length; - let k = 0; - for (; k < klen; ++k) { - target[keys[k]] = clone2(source[keys[k]]); - } - return target; - } - return source; -} -function isValidKey(key) { - return [ - "__proto__", - "prototype", - "constructor" - ].indexOf(key) === -1; -} -function _merger(key, target, source, options) { - if (!isValidKey(key)) { - return; - } - const tval = target[key]; - const sval = source[key]; - if (isObject(tval) && isObject(sval)) { - merge(tval, sval, options); - } else { - target[key] = clone2(sval); - } -} -function merge(target, source, options) { - const sources = isArray(source) ? source : [ - source - ]; - const ilen = sources.length; - if (!isObject(target)) { - return target; - } - options = options || {}; - const merger = options.merger || _merger; - let current; - for (let i = 0; i < ilen; ++i) { - current = sources[i]; - if (!isObject(current)) { - continue; - } - const keys = Object.keys(current); - for (let k = 0, klen = keys.length; k < klen; ++k) { - merger(keys[k], target, current, options); - } - } - return target; -} -function mergeIf(target, source) { - return merge(target, source, { - merger: _mergerIf - }); -} -function _mergerIf(key, target, source) { - if (!isValidKey(key)) { - return; - } - const tval = target[key]; - const sval = source[key]; - if (isObject(tval) && isObject(sval)) { - mergeIf(tval, sval); - } else if (!Object.prototype.hasOwnProperty.call(target, key)) { - target[key] = clone2(sval); - } -} -var keyResolvers = { - // Chart.helpers.core resolveObjectKey should resolve empty key to root object - "": (v) => v, - // default resolvers - x: (o) => o.x, - y: (o) => o.y -}; -function _splitKey(key) { - const parts = key.split("."); - const keys = []; - let tmp = ""; - for (const part of parts) { - tmp += part; - if (tmp.endsWith("\\")) { - tmp = tmp.slice(0, -1) + "."; - } else { - keys.push(tmp); - tmp = ""; - } - } - return keys; -} -function _getKeyResolver(key) { - const keys = _splitKey(key); - return (obj) => { - for (const k of keys) { - if (k === "") { - break; - } - obj = obj && obj[k]; - } - return obj; - }; -} -function resolveObjectKey(obj, key) { - const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key)); - return resolver(obj); -} -function _capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); -} -var defined = (value) => typeof value !== "undefined"; -var isFunction = (value) => typeof value === "function"; -var setsEqual = (a, b) => { - if (a.size !== b.size) { - return false; - } - for (const item of a) { - if (!b.has(item)) { - return false; - } - } - return true; -}; -function _isClickEvent(e) { - return e.type === "mouseup" || e.type === "click" || e.type === "contextmenu"; -} -var PI = Math.PI; -var TAU = 2 * PI; -var PITAU = TAU + PI; -var INFINITY = Number.POSITIVE_INFINITY; -var RAD_PER_DEG = PI / 180; -var HALF_PI = PI / 2; -var QUARTER_PI = PI / 4; -var TWO_THIRDS_PI = PI * 2 / 3; -var log10 = Math.log10; -var sign = Math.sign; -function almostEquals(x, y, epsilon) { - return Math.abs(x - y) < epsilon; -} -function niceNum(range) { - const roundedRange = Math.round(range); - range = almostEquals(range, roundedRange, range / 1e3) ? roundedRange : range; - const niceRange = Math.pow(10, Math.floor(log10(range))); - const fraction = range / niceRange; - const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10; - return niceFraction * niceRange; -} -function _factorize(value) { - const result = []; - const sqrt = Math.sqrt(value); - let i; - for (i = 1; i < sqrt; i++) { - if (value % i === 0) { - result.push(i); - result.push(value / i); - } - } - if (sqrt === (sqrt | 0)) { - result.push(sqrt); - } - result.sort((a, b) => a - b).pop(); - return result; -} -function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} -function almostWhole(x, epsilon) { - const rounded = Math.round(x); - return rounded - epsilon <= x && rounded + epsilon >= x; -} -function _setMinAndMaxByKey(array, target, property) { - let i, ilen, value; - for (i = 0, ilen = array.length; i < ilen; i++) { - value = array[i][property]; - if (!isNaN(value)) { - target.min = Math.min(target.min, value); - target.max = Math.max(target.max, value); - } - } -} -function toRadians(degrees) { - return degrees * (PI / 180); -} -function toDegrees(radians) { - return radians * (180 / PI); -} -function _decimalPlaces(x) { - if (!isNumberFinite(x)) { - return; - } - let e = 1; - let p = 0; - while (Math.round(x * e) / e !== x) { - e *= 10; - p++; - } - return p; -} -function getAngleFromPoint(centrePoint, anglePoint) { - const distanceFromXCenter = anglePoint.x - centrePoint.x; - const distanceFromYCenter = anglePoint.y - centrePoint.y; - const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); - let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); - if (angle < -0.5 * PI) { - angle += TAU; - } - return { - angle, - distance: radialDistanceFromCenter - }; -} -function distanceBetweenPoints(pt1, pt2) { - return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); -} -function _normalizeAngle(a) { - return (a % TAU + TAU) % TAU; -} -function _angleBetween(angle, start, end, sameAngleIsFullCircle) { - const a = _normalizeAngle(angle); - const s = _normalizeAngle(start); - const e = _normalizeAngle(end); - const angleToStart = _normalizeAngle(s - a); - const angleToEnd = _normalizeAngle(e - a); - const startToAngle = _normalizeAngle(a - s); - const endToAngle = _normalizeAngle(a - e); - return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle; -} -function _limitValue(value, min, max) { - return Math.max(min, Math.min(max, value)); -} -function _int16Range(value) { - return _limitValue(value, -32768, 32767); -} -function _isBetween(value, start, end, epsilon = 1e-6) { - return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon; -} -function _lookup(table, value, cmp) { - cmp = cmp || ((index) => table[index] < value); - let hi = table.length - 1; - let lo = 0; - let mid; - while (hi - lo > 1) { - mid = lo + hi >> 1; - if (cmp(mid)) { - lo = mid; - } else { - hi = mid; - } - } - return { - lo, - hi - }; -} -var _lookupByKey = (table, key, value, last) => _lookup(table, value, last ? (index) => { - const ti = table[index][key]; - return ti < value || ti === value && table[index + 1][key] === value; -} : (index) => table[index][key] < value); -var _rlookupByKey = (table, key, value) => _lookup(table, value, (index) => table[index][key] >= value); -function _filterBetween(values, min, max) { - let start = 0; - let end = values.length; - while (start < end && values[start] < min) { - start++; - } - while (end > start && values[end - 1] > max) { - end--; - } - return start > 0 || end < values.length ? values.slice(start, end) : values; -} -var arrayEvents = [ - "push", - "pop", - "shift", - "splice", - "unshift" -]; -function listenArrayEvents(array, listener) { - if (array._chartjs) { - array._chartjs.listeners.push(listener); - return; - } - Object.defineProperty(array, "_chartjs", { - configurable: true, - enumerable: false, - value: { - listeners: [ - listener - ] - } - }); - arrayEvents.forEach((key) => { - const method = "_onData" + _capitalize(key); - const base = array[key]; - Object.defineProperty(array, key, { - configurable: true, - enumerable: false, - value(...args) { - const res = base.apply(this, args); - array._chartjs.listeners.forEach((object) => { - if (typeof object[method] === "function") { - object[method](...args); - } - }); - return res; - } - }); - }); -} -function unlistenArrayEvents(array, listener) { - const stub = array._chartjs; - if (!stub) { - return; - } - const listeners = stub.listeners; - const index = listeners.indexOf(listener); - if (index !== -1) { - listeners.splice(index, 1); - } - if (listeners.length > 0) { - return; - } - arrayEvents.forEach((key) => { - delete array[key]; - }); - delete array._chartjs; -} -function _arrayUnique(items) { - const set2 = /* @__PURE__ */ new Set(); - let i, ilen; - for (i = 0, ilen = items.length; i < ilen; ++i) { - set2.add(items[i]); - } - if (set2.size === ilen) { - return items; - } - return Array.from(set2); -} -var requestAnimFrame = function() { - if (typeof window === "undefined") { - return function(callback2) { - return callback2(); - }; - } - return window.requestAnimationFrame; -}(); -function throttled(fn, thisArg) { - let argsToUse = []; - let ticking = false; - return function(...args) { - argsToUse = args; - if (!ticking) { - ticking = true; - requestAnimFrame.call(window, () => { - ticking = false; - fn.apply(thisArg, argsToUse); - }); - } - }; -} -function debounce(fn, delay) { - let timeout; - return function(...args) { - if (delay) { - clearTimeout(timeout); - timeout = setTimeout(fn, delay, args); - } else { - fn.apply(this, args); - } - return delay; - }; -} -var _toLeftRightCenter = (align) => align === "start" ? "left" : align === "end" ? "right" : "center"; -var _alignStartEnd = (align, start, end) => align === "start" ? start : align === "end" ? end : (start + end) / 2; -var _textX = (align, left, right, rtl) => { - const check = rtl ? "left" : "right"; - return align === check ? right : align === "center" ? (left + right) / 2 : left; -}; -var atEdge = (t2) => t2 === 0 || t2 === 1; -var elasticIn = (t2, s, p) => -(Math.pow(2, 10 * (t2 -= 1)) * Math.sin((t2 - s) * TAU / p)); -var elasticOut = (t2, s, p) => Math.pow(2, -10 * t2) * Math.sin((t2 - s) * TAU / p) + 1; -var effects = { - linear: (t2) => t2, - easeInQuad: (t2) => t2 * t2, - easeOutQuad: (t2) => -t2 * (t2 - 2), - easeInOutQuad: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 : -0.5 * (--t2 * (t2 - 2) - 1), - easeInCubic: (t2) => t2 * t2 * t2, - easeOutCubic: (t2) => (t2 -= 1) * t2 * t2 + 1, - easeInOutCubic: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 + 2), - easeInQuart: (t2) => t2 * t2 * t2 * t2, - easeOutQuart: (t2) => -((t2 -= 1) * t2 * t2 * t2 - 1), - easeInOutQuart: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 : -0.5 * ((t2 -= 2) * t2 * t2 * t2 - 2), - easeInQuint: (t2) => t2 * t2 * t2 * t2 * t2, - easeOutQuint: (t2) => (t2 -= 1) * t2 * t2 * t2 * t2 + 1, - easeInOutQuint: (t2) => (t2 /= 0.5) < 1 ? 0.5 * t2 * t2 * t2 * t2 * t2 : 0.5 * ((t2 -= 2) * t2 * t2 * t2 * t2 + 2), - easeInSine: (t2) => -Math.cos(t2 * HALF_PI) + 1, - easeOutSine: (t2) => Math.sin(t2 * HALF_PI), - easeInOutSine: (t2) => -0.5 * (Math.cos(PI * t2) - 1), - easeInExpo: (t2) => t2 === 0 ? 0 : Math.pow(2, 10 * (t2 - 1)), - easeOutExpo: (t2) => t2 === 1 ? 1 : -Math.pow(2, -10 * t2) + 1, - easeInOutExpo: (t2) => atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * Math.pow(2, 10 * (t2 * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t2 * 2 - 1)) + 2), - easeInCirc: (t2) => t2 >= 1 ? t2 : -(Math.sqrt(1 - t2 * t2) - 1), - easeOutCirc: (t2) => Math.sqrt(1 - (t2 -= 1) * t2), - easeInOutCirc: (t2) => (t2 /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t2 * t2) - 1) : 0.5 * (Math.sqrt(1 - (t2 -= 2) * t2) + 1), - easeInElastic: (t2) => atEdge(t2) ? t2 : elasticIn(t2, 0.075, 0.3), - easeOutElastic: (t2) => atEdge(t2) ? t2 : elasticOut(t2, 0.075, 0.3), - easeInOutElastic(t2) { - const s = 0.1125; - const p = 0.45; - return atEdge(t2) ? t2 : t2 < 0.5 ? 0.5 * elasticIn(t2 * 2, s, p) : 0.5 + 0.5 * elasticOut(t2 * 2 - 1, s, p); - }, - easeInBack(t2) { - const s = 1.70158; - return t2 * t2 * ((s + 1) * t2 - s); - }, - easeOutBack(t2) { - const s = 1.70158; - return (t2 -= 1) * t2 * ((s + 1) * t2 + s) + 1; - }, - easeInOutBack(t2) { - let s = 1.70158; - if ((t2 /= 0.5) < 1) { - return 0.5 * (t2 * t2 * (((s *= 1.525) + 1) * t2 - s)); - } - return 0.5 * ((t2 -= 2) * t2 * (((s *= 1.525) + 1) * t2 + s) + 2); - }, - easeInBounce: (t2) => 1 - effects.easeOutBounce(1 - t2), - easeOutBounce(t2) { - const m = 7.5625; - const d = 2.75; - if (t2 < 1 / d) { - return m * t2 * t2; - } - if (t2 < 2 / d) { - return m * (t2 -= 1.5 / d) * t2 + 0.75; - } - if (t2 < 2.5 / d) { - return m * (t2 -= 2.25 / d) * t2 + 0.9375; - } - return m * (t2 -= 2.625 / d) * t2 + 0.984375; - }, - easeInOutBounce: (t2) => t2 < 0.5 ? effects.easeInBounce(t2 * 2) * 0.5 : effects.easeOutBounce(t2 * 2 - 1) * 0.5 + 0.5 -}; -function isPatternOrGradient(value) { - if (value && typeof value === "object") { - const type = value.toString(); - return type === "[object CanvasPattern]" || type === "[object CanvasGradient]"; - } - return false; -} -function color(value) { - return isPatternOrGradient(value) ? value : new Color(value); -} -function getHoverColor(value) { - return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString(); -} -var numbers = [ - "x", - "y", - "borderWidth", - "radius", - "tension" -]; -var colors = [ - "color", - "borderColor", - "backgroundColor" -]; -function applyAnimationsDefaults(defaults2) { - defaults2.set("animation", { - delay: void 0, - duration: 1e3, - easing: "easeOutQuart", - fn: void 0, - from: void 0, - loop: void 0, - to: void 0, - type: void 0 - }); - defaults2.describe("animation", { - _fallback: false, - _indexable: false, - _scriptable: (name2) => name2 !== "onProgress" && name2 !== "onComplete" && name2 !== "fn" - }); - defaults2.set("animations", { - colors: { - type: "color", - properties: colors - }, - numbers: { - type: "number", - properties: numbers - } - }); - defaults2.describe("animations", { - _fallback: "animation" - }); - defaults2.set("transitions", { - active: { - animation: { - duration: 400 - } - }, - resize: { - animation: { - duration: 0 - } - }, - show: { - animations: { - colors: { - from: "transparent" - }, - visible: { - type: "boolean", - duration: 0 - } - } - }, - hide: { - animations: { - colors: { - to: "transparent" - }, - visible: { - type: "boolean", - easing: "linear", - fn: (v) => v | 0 - } - } - } - }); -} -function applyLayoutsDefaults(defaults2) { - defaults2.set("layout", { - autoPadding: true, - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - } - }); -} -var intlCache = /* @__PURE__ */ new Map(); -function getNumberFormat(locale2, options) { - options = options || {}; - const cacheKey = locale2 + JSON.stringify(options); - let formatter = intlCache.get(cacheKey); - if (!formatter) { - formatter = new Intl.NumberFormat(locale2, options); - intlCache.set(cacheKey, formatter); - } - return formatter; -} -function formatNumber(num, locale2, options) { - return getNumberFormat(locale2, options).format(num); -} -var formatters = { - values(value) { - return isArray(value) ? value : "" + value; - }, - numeric(tickValue, index, ticks) { - if (tickValue === 0) { - return "0"; - } - const locale2 = this.chart.options.locale; - let notation; - let delta = tickValue; - if (ticks.length > 1) { - const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value)); - if (maxTick < 1e-4 || maxTick > 1e15) { - notation = "scientific"; - } - delta = calculateDelta(tickValue, ticks); - } - const logDelta = log10(Math.abs(delta)); - const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0); - const options = { - notation, - minimumFractionDigits: numDecimal, - maximumFractionDigits: numDecimal - }; - Object.assign(options, this.options.ticks.format); - return formatNumber(tickValue, locale2, options); - }, - logarithmic(tickValue, index, ticks) { - if (tickValue === 0) { - return "0"; - } - const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue))); - if ([ - 1, - 2, - 3, - 5, - 10, - 15 - ].includes(remain) || index > 0.8 * ticks.length) { - return formatters.numeric.call(this, tickValue, index, ticks); - } - return ""; - } -}; -function calculateDelta(tickValue, ticks) { - let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value; - if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) { - delta = tickValue - Math.floor(tickValue); - } - return delta; -} -var Ticks = { - formatters -}; -function applyScaleDefaults(defaults2) { - defaults2.set("scale", { - display: true, - offset: false, - reverse: false, - beginAtZero: false, - bounds: "ticks", - grace: 0, - grid: { - display: true, - lineWidth: 1, - drawOnChartArea: true, - drawTicks: true, - tickLength: 8, - tickWidth: (_ctx, options) => options.lineWidth, - tickColor: (_ctx, options) => options.color, - offset: false - }, - border: { - display: true, - dash: [], - dashOffset: 0, - width: 1 - }, - title: { - display: false, - text: "", - padding: { - top: 4, - bottom: 4 - } - }, - ticks: { - minRotation: 0, - maxRotation: 50, - mirror: false, - textStrokeWidth: 0, - textStrokeColor: "", - padding: 3, - display: true, - autoSkip: true, - autoSkipPadding: 3, - labelOffset: 0, - callback: Ticks.formatters.values, - minor: {}, - major: {}, - align: "center", - crossAlign: "near", - showLabelBackdrop: false, - backdropColor: "rgba(255, 255, 255, 0.75)", - backdropPadding: 2 - } - }); - defaults2.route("scale.ticks", "color", "", "color"); - defaults2.route("scale.grid", "color", "", "borderColor"); - defaults2.route("scale.border", "color", "", "borderColor"); - defaults2.route("scale.title", "color", "", "color"); - defaults2.describe("scale", { - _fallback: false, - _scriptable: (name2) => !name2.startsWith("before") && !name2.startsWith("after") && name2 !== "callback" && name2 !== "parser", - _indexable: (name2) => name2 !== "borderDash" && name2 !== "tickBorderDash" && name2 !== "dash" - }); - defaults2.describe("scales", { - _fallback: "scale" - }); - defaults2.describe("scale.ticks", { - _scriptable: (name2) => name2 !== "backdropPadding" && name2 !== "callback", - _indexable: (name2) => name2 !== "backdropPadding" - }); -} -var overrides = /* @__PURE__ */ Object.create(null); -var descriptors = /* @__PURE__ */ Object.create(null); -function getScope$1(node, key) { - if (!key) { - return node; - } - const keys = key.split("."); - for (let i = 0, n = keys.length; i < n; ++i) { - const k = keys[i]; - node = node[k] || (node[k] = /* @__PURE__ */ Object.create(null)); - } - return node; -} -function set(root, scope, values) { - if (typeof scope === "string") { - return merge(getScope$1(root, scope), values); - } - return merge(getScope$1(root, ""), scope); -} -var Defaults = class { - constructor(_descriptors2, _appliers) { - this.animation = void 0; - this.backgroundColor = "rgba(0,0,0,0.1)"; - this.borderColor = "rgba(0,0,0,0.1)"; - this.color = "#666"; - this.datasets = {}; - this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio(); - this.elements = {}; - this.events = [ - "mousemove", - "mouseout", - "click", - "touchstart", - "touchmove" - ]; - this.font = { - family: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - size: 12, - style: "normal", - lineHeight: 1.2, - weight: null - }; - this.hover = {}; - this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor); - this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor); - this.hoverColor = (ctx, options) => getHoverColor(options.color); - this.indexAxis = "x"; - this.interaction = { - mode: "nearest", - intersect: true, - includeInvisible: false - }; - this.maintainAspectRatio = true; - this.onHover = null; - this.onClick = null; - this.parsing = true; - this.plugins = {}; - this.responsive = true; - this.scale = void 0; - this.scales = {}; - this.showLine = true; - this.drawActiveElementsOnTop = true; - this.describe(_descriptors2); - this.apply(_appliers); - } - set(scope, values) { - return set(this, scope, values); - } - get(scope) { - return getScope$1(this, scope); - } - describe(scope, values) { - return set(descriptors, scope, values); - } - override(scope, values) { - return set(overrides, scope, values); - } - route(scope, name2, targetScope, targetName) { - const scopeObject = getScope$1(this, scope); - const targetScopeObject = getScope$1(this, targetScope); - const privateName = "_" + name2; - Object.defineProperties(scopeObject, { - [privateName]: { - value: scopeObject[name2], - writable: true - }, - [name2]: { - enumerable: true, - get() { - const local = this[privateName]; - const target = targetScopeObject[targetName]; - if (isObject(local)) { - return Object.assign({}, target, local); - } - return valueOrDefault(local, target); - }, - set(value) { - this[privateName] = value; - } - } - }); - } - apply(appliers) { - appliers.forEach((apply) => apply(this)); - } -}; -var defaults = /* @__PURE__ */ new Defaults({ - _scriptable: (name2) => !name2.startsWith("on"), - _indexable: (name2) => name2 !== "events", - hover: { - _fallback: "interaction" - }, - interaction: { - _scriptable: false, - _indexable: false - } -}, [ - applyAnimationsDefaults, - applyLayoutsDefaults, - applyScaleDefaults -]); -function toFontString(font) { - if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) { - return null; - } - return (font.style ? font.style + " " : "") + (font.weight ? font.weight + " " : "") + font.size + "px " + font.family; -} -function _measureText(ctx, data, gc, longest, string) { - let textWidth = data[string]; - if (!textWidth) { - textWidth = data[string] = ctx.measureText(string).width; - gc.push(string); - } - if (textWidth > longest) { - longest = textWidth; - } - return longest; -} -function _longestText(ctx, font, arrayOfThings, cache) { - cache = cache || {}; - let data = cache.data = cache.data || {}; - let gc = cache.garbageCollect = cache.garbageCollect || []; - if (cache.font !== font) { - data = cache.data = {}; - gc = cache.garbageCollect = []; - cache.font = font; - } - ctx.save(); - ctx.font = font; - let longest = 0; - const ilen = arrayOfThings.length; - let i, j, jlen, thing, nestedThing; - for (i = 0; i < ilen; i++) { - thing = arrayOfThings[i]; - if (thing !== void 0 && thing !== null && isArray(thing) !== true) { - longest = _measureText(ctx, data, gc, longest, thing); - } else if (isArray(thing)) { - for (j = 0, jlen = thing.length; j < jlen; j++) { - nestedThing = thing[j]; - if (nestedThing !== void 0 && nestedThing !== null && !isArray(nestedThing)) { - longest = _measureText(ctx, data, gc, longest, nestedThing); - } - } - } - } - ctx.restore(); - const gcLen = gc.length / 2; - if (gcLen > arrayOfThings.length) { - for (i = 0; i < gcLen; i++) { - delete data[gc[i]]; - } - gc.splice(0, gcLen); - } - return longest; -} -function _alignPixel(chart, pixel, width) { - const devicePixelRatio = chart.currentDevicePixelRatio; - const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0; - return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; -} -function clearCanvas(canvas, ctx) { - ctx = ctx || canvas.getContext("2d"); - ctx.save(); - ctx.resetTransform(); - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.restore(); -} -function drawPoint(ctx, options, x, y) { - drawPointLegend(ctx, options, x, y, null); -} -function drawPointLegend(ctx, options, x, y, w) { - let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW; - const style = options.pointStyle; - const rotation = options.rotation; - const radius = options.radius; - let rad = (rotation || 0) * RAD_PER_DEG; - if (style && typeof style === "object") { - type = style.toString(); - if (type === "[object HTMLImageElement]" || type === "[object HTMLCanvasElement]") { - ctx.save(); - ctx.translate(x, y); - ctx.rotate(rad); - ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height); - ctx.restore(); - return; - } - } - if (isNaN(radius) || radius <= 0) { - return; - } - ctx.beginPath(); - switch (style) { - default: - if (w) { - ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU); - } else { - ctx.arc(x, y, radius, 0, TAU); - } - ctx.closePath(); - break; - case "triangle": - width = w ? w / 2 : radius; - ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); - rad += TWO_THIRDS_PI; - ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius); - ctx.closePath(); - break; - case "rectRounded": - cornerRadius = radius * 0.516; - size = radius - cornerRadius; - xOffset = Math.cos(rad + QUARTER_PI) * size; - xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); - yOffset = Math.sin(rad + QUARTER_PI) * size; - yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size); - ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); - ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad); - ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI); - ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); - ctx.closePath(); - break; - case "rect": - if (!rotation) { - size = Math.SQRT1_2 * radius; - width = w ? w / 2 : size; - ctx.rect(x - width, y - size, 2 * width, 2 * size); - break; - } - rad += QUARTER_PI; - case "rectRot": - xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); - ctx.moveTo(x - xOffsetW, y - yOffset); - ctx.lineTo(x + yOffsetW, y - xOffset); - ctx.lineTo(x + xOffsetW, y + yOffset); - ctx.lineTo(x - yOffsetW, y + xOffset); - ctx.closePath(); - break; - case "crossRot": - rad += QUARTER_PI; - case "cross": - xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); - ctx.moveTo(x - xOffsetW, y - yOffset); - ctx.lineTo(x + xOffsetW, y + yOffset); - ctx.moveTo(x + yOffsetW, y - xOffset); - ctx.lineTo(x - yOffsetW, y + xOffset); - break; - case "star": - xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); - ctx.moveTo(x - xOffsetW, y - yOffset); - ctx.lineTo(x + xOffsetW, y + yOffset); - ctx.moveTo(x + yOffsetW, y - xOffset); - ctx.lineTo(x - yOffsetW, y + xOffset); - rad += QUARTER_PI; - xOffsetW = Math.cos(rad) * (w ? w / 2 : radius); - xOffset = Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - yOffsetW = Math.sin(rad) * (w ? w / 2 : radius); - ctx.moveTo(x - xOffsetW, y - yOffset); - ctx.lineTo(x + xOffsetW, y + yOffset); - ctx.moveTo(x + yOffsetW, y - xOffset); - ctx.lineTo(x - yOffsetW, y + xOffset); - break; - case "line": - xOffset = w ? w / 2 : Math.cos(rad) * radius; - yOffset = Math.sin(rad) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - break; - case "dash": - ctx.moveTo(x, y); - ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius); - break; - case false: - ctx.closePath(); - break; - } - ctx.fill(); - if (options.borderWidth > 0) { - ctx.stroke(); - } -} -function _isPointInArea(point, area, margin) { - margin = margin || 0.5; - return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin; -} -function clipArea(ctx, area) { - ctx.save(); - ctx.beginPath(); - ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); - ctx.clip(); -} -function unclipArea(ctx) { - ctx.restore(); -} -function renderText(ctx, text, x, y, font, opts = {}) { - const lines = isArray(text) ? text : [ - text - ]; - const stroke = opts.strokeWidth > 0 && opts.strokeColor !== ""; - let i, line; - ctx.save(); - ctx.font = font.string; - setRenderOpts(ctx, opts); - for (i = 0; i < lines.length; ++i) { - line = lines[i]; - if (opts.backdrop) { - drawBackdrop(ctx, opts.backdrop); - } - if (stroke) { - if (opts.strokeColor) { - ctx.strokeStyle = opts.strokeColor; - } - if (!isNullOrUndef(opts.strokeWidth)) { - ctx.lineWidth = opts.strokeWidth; - } - ctx.strokeText(line, x, y, opts.maxWidth); - } - ctx.fillText(line, x, y, opts.maxWidth); - decorateText(ctx, x, y, line, opts); - y += font.lineHeight; - } - ctx.restore(); -} -function setRenderOpts(ctx, opts) { - if (opts.translation) { - ctx.translate(opts.translation[0], opts.translation[1]); - } - if (!isNullOrUndef(opts.rotation)) { - ctx.rotate(opts.rotation); - } - if (opts.color) { - ctx.fillStyle = opts.color; - } - if (opts.textAlign) { - ctx.textAlign = opts.textAlign; - } - if (opts.textBaseline) { - ctx.textBaseline = opts.textBaseline; - } -} -function decorateText(ctx, x, y, line, opts) { - if (opts.strikethrough || opts.underline) { - const metrics = ctx.measureText(line); - const left = x - metrics.actualBoundingBoxLeft; - const right = x + metrics.actualBoundingBoxRight; - const top = y - metrics.actualBoundingBoxAscent; - const bottom = y + metrics.actualBoundingBoxDescent; - const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom; - ctx.strokeStyle = ctx.fillStyle; - ctx.beginPath(); - ctx.lineWidth = opts.decorationWidth || 2; - ctx.moveTo(left, yDecoration); - ctx.lineTo(right, yDecoration); - ctx.stroke(); - } -} -function drawBackdrop(ctx, opts) { - const oldColor = ctx.fillStyle; - ctx.fillStyle = opts.color; - ctx.fillRect(opts.left, opts.top, opts.width, opts.height); - ctx.fillStyle = oldColor; -} -function addRoundedRectPath(ctx, rect) { - const { x, y, w, h: h4, radius } = rect; - ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true); - ctx.lineTo(x, y + h4 - radius.bottomLeft); - ctx.arc(x + radius.bottomLeft, y + h4 - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true); - ctx.lineTo(x + w - radius.bottomRight, y + h4); - ctx.arc(x + w - radius.bottomRight, y + h4 - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true); - ctx.lineTo(x + w, y + radius.topRight); - ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true); - ctx.lineTo(x + radius.topLeft, y); -} -var LINE_HEIGHT = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/; -var FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/; -function toLineHeight(value, size) { - const matches = ("" + value).match(LINE_HEIGHT); - if (!matches || matches[1] === "normal") { - return size * 1.2; - } - value = +matches[2]; - switch (matches[3]) { - case "px": - return value; - case "%": - value /= 100; - break; - } - return size * value; -} -var numberOrZero = (v) => +v || 0; -function _readValueToProps(value, props) { - const ret = {}; - const objProps = isObject(props); - const keys = objProps ? Object.keys(props) : props; - const read = isObject(value) ? objProps ? (prop) => valueOrDefault(value[prop], value[props[prop]]) : (prop) => value[prop] : () => value; - for (const prop of keys) { - ret[prop] = numberOrZero(read(prop)); - } - return ret; -} -function toTRBL(value) { - return _readValueToProps(value, { - top: "y", - right: "x", - bottom: "y", - left: "x" - }); -} -function toTRBLCorners(value) { - return _readValueToProps(value, [ - "topLeft", - "topRight", - "bottomLeft", - "bottomRight" - ]); -} -function toPadding(value) { - const obj = toTRBL(value); - obj.width = obj.left + obj.right; - obj.height = obj.top + obj.bottom; - return obj; -} -function toFont(options, fallback) { - options = options || {}; - fallback = fallback || defaults.font; - let size = valueOrDefault(options.size, fallback.size); - if (typeof size === "string") { - size = parseInt(size, 10); - } - let style = valueOrDefault(options.style, fallback.style); - if (style && !("" + style).match(FONT_STYLE)) { - console.warn('Invalid font style specified: "' + style + '"'); - style = void 0; - } - const font = { - family: valueOrDefault(options.family, fallback.family), - lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size), - size, - style, - weight: valueOrDefault(options.weight, fallback.weight), - string: "" - }; - font.string = toFontString(font); - return font; -} -function resolve(inputs, context, index, info) { - let cacheable = true; - let i, ilen, value; - for (i = 0, ilen = inputs.length; i < ilen; ++i) { - value = inputs[i]; - if (value === void 0) { - continue; - } - if (context !== void 0 && typeof value === "function") { - value = value(context); - cacheable = false; - } - if (index !== void 0 && isArray(value)) { - value = value[index % value.length]; - cacheable = false; - } - if (value !== void 0) { - if (info && !cacheable) { - info.cacheable = false; - } - return value; - } - } -} -function _addGrace(minmax, grace, beginAtZero) { - const { min, max } = minmax; - const change = toDimension(grace, (max - min) / 2); - const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add; - return { - min: keepZero(min, -Math.abs(change)), - max: keepZero(max, change) - }; -} -function createContext(parentContext, context) { - return Object.assign(Object.create(parentContext), context); -} -function _createResolver(scopes, prefixes = [ - "" -], rootScopes = scopes, fallback, getTarget = () => scopes[0]) { - if (!defined(fallback)) { - fallback = _resolve("_fallback", scopes); - } - const cache = { - [Symbol.toStringTag]: "Object", - _cacheable: true, - _scopes: scopes, - _rootScopes: rootScopes, - _fallback: fallback, - _getTarget: getTarget, - override: (scope) => _createResolver([ - scope, - ...scopes - ], prefixes, rootScopes, fallback) - }; - return new Proxy(cache, { - deleteProperty(target, prop) { - delete target[prop]; - delete target._keys; - delete scopes[0][prop]; - return true; - }, - get(target, prop) { - return _cached(target, prop, () => _resolveWithPrefixes(prop, prefixes, scopes, target)); - }, - getOwnPropertyDescriptor(target, prop) { - return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop); - }, - getPrototypeOf() { - return Reflect.getPrototypeOf(scopes[0]); - }, - has(target, prop) { - return getKeysFromAllScopes(target).includes(prop); - }, - ownKeys(target) { - return getKeysFromAllScopes(target); - }, - set(target, prop, value) { - const storage = target._storage || (target._storage = getTarget()); - target[prop] = storage[prop] = value; - delete target._keys; - return true; - } - }); -} -function _attachContext(proxy, context, subProxy, descriptorDefaults) { - const cache = { - _cacheable: false, - _proxy: proxy, - _context: context, - _subProxy: subProxy, - _stack: /* @__PURE__ */ new Set(), - _descriptors: _descriptors(proxy, descriptorDefaults), - setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults), - override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults) - }; - return new Proxy(cache, { - deleteProperty(target, prop) { - delete target[prop]; - delete proxy[prop]; - return true; - }, - get(target, prop, receiver) { - return _cached(target, prop, () => _resolveWithContext(target, prop, receiver)); - }, - getOwnPropertyDescriptor(target, prop) { - return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? { - enumerable: true, - configurable: true - } : void 0 : Reflect.getOwnPropertyDescriptor(proxy, prop); - }, - getPrototypeOf() { - return Reflect.getPrototypeOf(proxy); - }, - has(target, prop) { - return Reflect.has(proxy, prop); - }, - ownKeys() { - return Reflect.ownKeys(proxy); - }, - set(target, prop, value) { - proxy[prop] = value; - delete target[prop]; - return true; - } - }); -} -function _descriptors(proxy, defaults2 = { - scriptable: true, - indexable: true -}) { - const { _scriptable = defaults2.scriptable, _indexable = defaults2.indexable, _allKeys = defaults2.allKeys } = proxy; - return { - allKeys: _allKeys, - scriptable: _scriptable, - indexable: _indexable, - isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable, - isIndexable: isFunction(_indexable) ? _indexable : () => _indexable - }; -} -var readKey = (prefix, name2) => prefix ? prefix + _capitalize(name2) : name2; -var needsSubResolver = (prop, value) => isObject(value) && prop !== "adapters" && (Object.getPrototypeOf(value) === null || value.constructor === Object); -function _cached(target, prop, resolve2) { - if (Object.prototype.hasOwnProperty.call(target, prop)) { - return target[prop]; - } - const value = resolve2(); - target[prop] = value; - return value; -} -function _resolveWithContext(target, prop, receiver) { - const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target; - let value = _proxy[prop]; - if (isFunction(value) && descriptors2.isScriptable(prop)) { - value = _resolveScriptable(prop, value, target, receiver); - } - if (isArray(value) && value.length) { - value = _resolveArray(prop, value, target, descriptors2.isIndexable); - } - if (needsSubResolver(prop, value)) { - value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors2); - } - return value; -} -function _resolveScriptable(prop, value, target, receiver) { - const { _proxy, _context, _subProxy, _stack } = target; - if (_stack.has(prop)) { - throw new Error("Recursion detected: " + Array.from(_stack).join("->") + "->" + prop); - } - _stack.add(prop); - value = value(_context, _subProxy || receiver); - _stack.delete(prop); - if (needsSubResolver(prop, value)) { - value = createSubResolver(_proxy._scopes, _proxy, prop, value); - } - return value; -} -function _resolveArray(prop, value, target, isIndexable) { - const { _proxy, _context, _subProxy, _descriptors: descriptors2 } = target; - if (defined(_context.index) && isIndexable(prop)) { - value = value[_context.index % value.length]; - } else if (isObject(value[0])) { - const arr = value; - const scopes = _proxy._scopes.filter((s) => s !== arr); - value = []; - for (const item of arr) { - const resolver = createSubResolver(scopes, _proxy, prop, item); - value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors2)); - } - } - return value; -} -function resolveFallback(fallback, prop, value) { - return isFunction(fallback) ? fallback(prop, value) : fallback; -} -var getScope = (key, parent) => key === true ? parent : typeof key === "string" ? resolveObjectKey(parent, key) : void 0; -function addScopes(set2, parentScopes, key, parentFallback, value) { - for (const parent of parentScopes) { - const scope = getScope(key, parent); - if (scope) { - set2.add(scope); - const fallback = resolveFallback(scope._fallback, key, value); - if (defined(fallback) && fallback !== key && fallback !== parentFallback) { - return fallback; - } - } else if (scope === false && defined(parentFallback) && key !== parentFallback) { - return null; - } - } - return false; -} -function createSubResolver(parentScopes, resolver, prop, value) { - const rootScopes = resolver._rootScopes; - const fallback = resolveFallback(resolver._fallback, prop, value); - const allScopes = [ - ...parentScopes, - ...rootScopes - ]; - const set2 = /* @__PURE__ */ new Set(); - set2.add(value); - let key = addScopesFromKey(set2, allScopes, prop, fallback || prop, value); - if (key === null) { - return false; - } - if (defined(fallback) && fallback !== prop) { - key = addScopesFromKey(set2, allScopes, fallback, key, value); - if (key === null) { - return false; - } - } - return _createResolver(Array.from(set2), [ - "" - ], rootScopes, fallback, () => subGetTarget(resolver, prop, value)); -} -function addScopesFromKey(set2, allScopes, key, fallback, item) { - while (key) { - key = addScopes(set2, allScopes, key, fallback, item); - } - return key; -} -function subGetTarget(resolver, prop, value) { - const parent = resolver._getTarget(); - if (!(prop in parent)) { - parent[prop] = {}; - } - const target = parent[prop]; - if (isArray(target) && isObject(value)) { - return value; - } - return target || {}; -} -function _resolveWithPrefixes(prop, prefixes, scopes, proxy) { - let value; - for (const prefix of prefixes) { - value = _resolve(readKey(prefix, prop), scopes); - if (defined(value)) { - return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value; - } - } -} -function _resolve(key, scopes) { - for (const scope of scopes) { - if (!scope) { - continue; - } - const value = scope[key]; - if (defined(value)) { - return value; - } - } -} -function getKeysFromAllScopes(target) { - let keys = target._keys; - if (!keys) { - keys = target._keys = resolveKeysFromAllScopes(target._scopes); - } - return keys; -} -function resolveKeysFromAllScopes(scopes) { - const set2 = /* @__PURE__ */ new Set(); - for (const scope of scopes) { - for (const key of Object.keys(scope).filter((k) => !k.startsWith("_"))) { - set2.add(key); - } - } - return Array.from(set2); -} -var EPSILON = Number.EPSILON || 1e-14; -function _isDomSupported() { - return typeof window !== "undefined" && typeof document !== "undefined"; -} -function _getParentNode(domNode) { - let parent = domNode.parentNode; - if (parent && parent.toString() === "[object ShadowRoot]") { - parent = parent.host; - } - return parent; -} -function parseMaxStyle(styleValue, node, parentProperty) { - let valueInPixels; - if (typeof styleValue === "string") { - valueInPixels = parseInt(styleValue, 10); - if (styleValue.indexOf("%") !== -1) { - valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; - } - } else { - valueInPixels = styleValue; - } - return valueInPixels; -} -var getComputedStyle2 = (element) => element.ownerDocument.defaultView.getComputedStyle(element, null); -function getStyle(el, property) { - return getComputedStyle2(el).getPropertyValue(property); -} -var positions = [ - "top", - "right", - "bottom", - "left" -]; -function getPositionedStyle(styles, style, suffix) { - const result = {}; - suffix = suffix ? "-" + suffix : ""; - for (let i = 0; i < 4; i++) { - const pos = positions[i]; - result[pos] = parseFloat(styles[style + "-" + pos + suffix]) || 0; - } - result.width = result.left + result.right; - result.height = result.top + result.bottom; - return result; -} -var useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot); -function getCanvasPosition(e, canvas) { - const touches = e.touches; - const source = touches && touches.length ? touches[0] : e; - const { offsetX, offsetY } = source; - let box = false; - let x, y; - if (useOffsetPos(offsetX, offsetY, e.target)) { - x = offsetX; - y = offsetY; - } else { - const rect = canvas.getBoundingClientRect(); - x = source.clientX - rect.left; - y = source.clientY - rect.top; - box = true; - } - return { - x, - y, - box - }; -} -function getRelativePosition(event, chart) { - if ("native" in event) { - return event; - } - const { canvas, currentDevicePixelRatio } = chart; - const style = getComputedStyle2(canvas); - const borderBox = style.boxSizing === "border-box"; - const paddings = getPositionedStyle(style, "padding"); - const borders = getPositionedStyle(style, "border", "width"); - const { x, y, box } = getCanvasPosition(event, canvas); - const xOffset = paddings.left + (box && borders.left); - const yOffset = paddings.top + (box && borders.top); - let { width, height } = chart; - if (borderBox) { - width -= paddings.width + borders.width; - height -= paddings.height + borders.height; - } - return { - x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio), - y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio) - }; -} -function getContainerSize(canvas, width, height) { - let maxWidth, maxHeight; - if (width === void 0 || height === void 0) { - const container = _getParentNode(canvas); - if (!container) { - width = canvas.clientWidth; - height = canvas.clientHeight; - } else { - const rect = container.getBoundingClientRect(); - const containerStyle = getComputedStyle2(container); - const containerBorder = getPositionedStyle(containerStyle, "border", "width"); - const containerPadding = getPositionedStyle(containerStyle, "padding"); - width = rect.width - containerPadding.width - containerBorder.width; - height = rect.height - containerPadding.height - containerBorder.height; - maxWidth = parseMaxStyle(containerStyle.maxWidth, container, "clientWidth"); - maxHeight = parseMaxStyle(containerStyle.maxHeight, container, "clientHeight"); - } - } - return { - width, - height, - maxWidth: maxWidth || INFINITY, - maxHeight: maxHeight || INFINITY - }; -} -var round1 = (v) => Math.round(v * 10) / 10; -function getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) { - const style = getComputedStyle2(canvas); - const margins = getPositionedStyle(style, "margin"); - const maxWidth = parseMaxStyle(style.maxWidth, canvas, "clientWidth") || INFINITY; - const maxHeight = parseMaxStyle(style.maxHeight, canvas, "clientHeight") || INFINITY; - const containerSize = getContainerSize(canvas, bbWidth, bbHeight); - let { width, height } = containerSize; - if (style.boxSizing === "content-box") { - const borders = getPositionedStyle(style, "border", "width"); - const paddings = getPositionedStyle(style, "padding"); - width -= paddings.width + borders.width; - height -= paddings.height + borders.height; - } - width = Math.max(0, width - margins.width); - height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height); - width = round1(Math.min(width, maxWidth, containerSize.maxWidth)); - height = round1(Math.min(height, maxHeight, containerSize.maxHeight)); - if (width && !height) { - height = round1(width / 2); - } - const maintainHeight = bbWidth !== void 0 || bbHeight !== void 0; - if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) { - height = containerSize.height; - width = round1(Math.floor(height * aspectRatio)); - } - return { - width, - height - }; -} -function retinaScale(chart, forceRatio, forceStyle) { - const pixelRatio = forceRatio || 1; - const deviceHeight = Math.floor(chart.height * pixelRatio); - const deviceWidth = Math.floor(chart.width * pixelRatio); - chart.height = Math.floor(chart.height); - chart.width = Math.floor(chart.width); - const canvas = chart.canvas; - if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) { - canvas.style.height = `${chart.height}px`; - canvas.style.width = `${chart.width}px`; - } - if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) { - chart.currentDevicePixelRatio = pixelRatio; - canvas.height = deviceHeight; - canvas.width = deviceWidth; - chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0); - return true; - } - return false; -} -var supportsEventListenerOptions = function() { - let passiveSupported = false; - try { - const options = { - get passive() { - passiveSupported = true; - return false; - } - }; - window.addEventListener("test", null, options); - window.removeEventListener("test", null, options); - } catch (e) { - } - return passiveSupported; -}(); -function readUsedSize(element, property) { - const value = getStyle(element, property); - const matches = value && value.match(/^(\d+)(\.\d+)?px$/); - return matches ? +matches[1] : void 0; -} -var getRightToLeftAdapter = function(rectX, width) { - return { - x(x) { - return rectX + rectX + width - x; - }, - setWidth(w) { - width = w; - }, - textAlign(align) { - if (align === "center") { - return align; - } - return align === "right" ? "left" : "right"; - }, - xPlus(x, value) { - return x - value; - }, - leftForLtr(x, itemWidth) { - return x - itemWidth; - } - }; -}; -var getLeftToRightAdapter = function() { - return { - x(x) { - return x; - }, - setWidth(w) { - }, - textAlign(align) { - return align; - }, - xPlus(x, value) { - return x + value; - }, - leftForLtr(x, _itemWidth) { - return x; - } - }; -}; -function getRtlAdapter(rtl, rectX, width) { - return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter(); -} -function overrideTextDirection(ctx, direction) { - let style, original; - if (direction === "ltr" || direction === "rtl") { - style = ctx.canvas.style; - original = [ - style.getPropertyValue("direction"), - style.getPropertyPriority("direction") - ]; - style.setProperty("direction", direction, "important"); - ctx.prevTextDirection = original; - } -} -function restoreTextDirection(ctx, original) { - if (original !== void 0) { - delete ctx.prevTextDirection; - ctx.canvas.style.setProperty("direction", original[0], original[1]); - } -} - -// node_modules/chart.js/dist/chart.js -var Animator = class { - constructor() { - this._request = null; - this._charts = /* @__PURE__ */ new Map(); - this._running = false; - this._lastDate = void 0; - } - _notify(chart, anims, date, type) { - const callbacks = anims.listeners[type]; - const numSteps = anims.duration; - callbacks.forEach((fn) => fn({ - chart, - initial: anims.initial, - numSteps, - currentStep: Math.min(date - anims.start, numSteps) - })); - } - _refresh() { - if (this._request) { - return; - } - this._running = true; - this._request = requestAnimFrame.call(window, () => { - this._update(); - this._request = null; - if (this._running) { - this._refresh(); - } - }); - } - _update(date = Date.now()) { - let remaining = 0; - this._charts.forEach((anims, chart) => { - if (!anims.running || !anims.items.length) { - return; - } - const items = anims.items; - let i = items.length - 1; - let draw = false; - let item; - for (; i >= 0; --i) { - item = items[i]; - if (item._active) { - if (item._total > anims.duration) { - anims.duration = item._total; - } - item.tick(date); - draw = true; - } else { - items[i] = items[items.length - 1]; - items.pop(); - } - } - if (draw) { - chart.draw(); - this._notify(chart, anims, date, "progress"); - } - if (!items.length) { - anims.running = false; - this._notify(chart, anims, date, "complete"); - anims.initial = false; - } - remaining += items.length; - }); - this._lastDate = date; - if (remaining === 0) { - this._running = false; - } - } - _getAnims(chart) { - const charts = this._charts; - let anims = charts.get(chart); - if (!anims) { - anims = { - running: false, - initial: true, - items: [], - listeners: { - complete: [], - progress: [] - } - }; - charts.set(chart, anims); - } - return anims; - } - listen(chart, event, cb) { - this._getAnims(chart).listeners[event].push(cb); - } - add(chart, items) { - if (!items || !items.length) { - return; - } - this._getAnims(chart).items.push(...items); - } - has(chart) { - return this._getAnims(chart).items.length > 0; - } - start(chart) { - const anims = this._charts.get(chart); - if (!anims) { - return; - } - anims.running = true; - anims.start = Date.now(); - anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0); - this._refresh(); - } - running(chart) { - if (!this._running) { - return false; - } - const anims = this._charts.get(chart); - if (!anims || !anims.running || !anims.items.length) { - return false; - } - return true; - } - stop(chart) { - const anims = this._charts.get(chart); - if (!anims || !anims.items.length) { - return; - } - const items = anims.items; - let i = items.length - 1; - for (; i >= 0; --i) { - items[i].cancel(); - } - anims.items = []; - this._notify(chart, anims, Date.now(), "complete"); - } - remove(chart) { - return this._charts.delete(chart); - } -}; -var animator = /* @__PURE__ */ new Animator(); -var transparent = "transparent"; -var interpolators = { - boolean(from2, to2, factor) { - return factor > 0.5 ? to2 : from2; - }, - color(from2, to2, factor) { - const c0 = color(from2 || transparent); - const c1 = c0.valid && color(to2 || transparent); - return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to2; - }, - number(from2, to2, factor) { - return from2 + (to2 - from2) * factor; - } -}; -var Animation = class { - constructor(cfg, target, prop, to2) { - const currentValue = target[prop]; - to2 = resolve([ - cfg.to, - to2, - currentValue, - cfg.from - ]); - const from2 = resolve([ - cfg.from, - currentValue, - to2 - ]); - this._active = true; - this._fn = cfg.fn || interpolators[cfg.type || typeof from2]; - this._easing = effects[cfg.easing] || effects.linear; - this._start = Math.floor(Date.now() + (cfg.delay || 0)); - this._duration = this._total = Math.floor(cfg.duration); - this._loop = !!cfg.loop; - this._target = target; - this._prop = prop; - this._from = from2; - this._to = to2; - this._promises = void 0; - } - active() { - return this._active; - } - update(cfg, to2, date) { - if (this._active) { - this._notify(false); - const currentValue = this._target[this._prop]; - const elapsed = date - this._start; - const remain = this._duration - elapsed; - this._start = date; - this._duration = Math.floor(Math.max(remain, cfg.duration)); - this._total += elapsed; - this._loop = !!cfg.loop; - this._to = resolve([ - cfg.to, - to2, - currentValue, - cfg.from - ]); - this._from = resolve([ - cfg.from, - currentValue, - to2 - ]); - } - } - cancel() { - if (this._active) { - this.tick(Date.now()); - this._active = false; - this._notify(false); - } - } - tick(date) { - const elapsed = date - this._start; - const duration = this._duration; - const prop = this._prop; - const from2 = this._from; - const loop = this._loop; - const to2 = this._to; - let factor; - this._active = from2 !== to2 && (loop || elapsed < duration); - if (!this._active) { - this._target[prop] = to2; - this._notify(true); - return; - } - if (elapsed < 0) { - this._target[prop] = from2; - return; - } - factor = elapsed / duration % 2; - factor = loop && factor > 1 ? 2 - factor : factor; - factor = this._easing(Math.min(1, Math.max(0, factor))); - this._target[prop] = this._fn(from2, to2, factor); - } - wait() { - const promises = this._promises || (this._promises = []); - return new Promise((res, rej) => { - promises.push({ - res, - rej - }); - }); - } - _notify(resolved) { - const method = resolved ? "res" : "rej"; - const promises = this._promises || []; - for (let i = 0; i < promises.length; i++) { - promises[i][method](); - } - } -}; -var Animations = class { - constructor(chart, config) { - this._chart = chart; - this._properties = /* @__PURE__ */ new Map(); - this.configure(config); - } - configure(config) { - if (!isObject(config)) { - return; - } - const animationOptions = Object.keys(defaults.animation); - const animatedProps = this._properties; - Object.getOwnPropertyNames(config).forEach((key) => { - const cfg = config[key]; - if (!isObject(cfg)) { - return; - } - const resolved = {}; - for (const option of animationOptions) { - resolved[option] = cfg[option]; - } - (isArray(cfg.properties) && cfg.properties || [ - key - ]).forEach((prop) => { - if (prop === key || !animatedProps.has(prop)) { - animatedProps.set(prop, resolved); - } - }); - }); - } - _animateOptions(target, values) { - const newOptions = values.options; - const options = resolveTargetOptions(target, newOptions); - if (!options) { - return []; - } - const animations = this._createAnimations(options, newOptions); - if (newOptions.$shared) { - awaitAll(target.options.$animations, newOptions).then(() => { - target.options = newOptions; - }, () => { - }); - } - return animations; - } - _createAnimations(target, values) { - const animatedProps = this._properties; - const animations = []; - const running = target.$animations || (target.$animations = {}); - const props = Object.keys(values); - const date = Date.now(); - let i; - for (i = props.length - 1; i >= 0; --i) { - const prop = props[i]; - if (prop.charAt(0) === "$") { - continue; - } - if (prop === "options") { - animations.push(...this._animateOptions(target, values)); - continue; - } - const value = values[prop]; - let animation = running[prop]; - const cfg = animatedProps.get(prop); - if (animation) { - if (cfg && animation.active()) { - animation.update(cfg, value, date); - continue; - } else { - animation.cancel(); - } - } - if (!cfg || !cfg.duration) { - target[prop] = value; - continue; - } - running[prop] = animation = new Animation(cfg, target, prop, value); - animations.push(animation); - } - return animations; - } - update(target, values) { - if (this._properties.size === 0) { - Object.assign(target, values); - return; - } - const animations = this._createAnimations(target, values); - if (animations.length) { - animator.add(this._chart, animations); - return true; - } - } -}; -function awaitAll(animations, properties) { - const running = []; - const keys = Object.keys(properties); - for (let i = 0; i < keys.length; i++) { - const anim = animations[keys[i]]; - if (anim && anim.active()) { - running.push(anim.wait()); - } - } - return Promise.all(running); -} -function resolveTargetOptions(target, newOptions) { - if (!newOptions) { - return; - } - let options = target.options; - if (!options) { - target.options = newOptions; - return; - } - if (options.$shared) { - target.options = options = Object.assign({}, options, { - $shared: false, - $animations: {} - }); - } - return options; -} -function scaleClip(scale, allowedOverflow) { - const opts = scale && scale.options || {}; - const reverse = opts.reverse; - const min = opts.min === void 0 ? allowedOverflow : 0; - const max = opts.max === void 0 ? allowedOverflow : 0; - return { - start: reverse ? max : min, - end: reverse ? min : max - }; -} -function defaultClip(xScale, yScale, allowedOverflow) { - if (allowedOverflow === false) { - return false; - } - const x = scaleClip(xScale, allowedOverflow); - const y = scaleClip(yScale, allowedOverflow); - return { - top: y.end, - right: x.end, - bottom: y.start, - left: x.start - }; -} -function toClip(value) { - let t2, r, b, l; - if (isObject(value)) { - t2 = value.top; - r = value.right; - b = value.bottom; - l = value.left; - } else { - t2 = r = b = l = value; - } - return { - top: t2, - right: r, - bottom: b, - left: l, - disabled: value === false - }; -} -function getSortedDatasetIndices(chart, filterVisible) { - const keys = []; - const metasets = chart._getSortedDatasetMetas(filterVisible); - let i, ilen; - for (i = 0, ilen = metasets.length; i < ilen; ++i) { - keys.push(metasets[i].index); - } - return keys; -} -function applyStack(stack, value, dsIndex, options = {}) { - const keys = stack.keys; - const singleMode = options.mode === "single"; - let i, ilen, datasetIndex, otherValue; - if (value === null) { - return; - } - for (i = 0, ilen = keys.length; i < ilen; ++i) { - datasetIndex = +keys[i]; - if (datasetIndex === dsIndex) { - if (options.all) { - continue; - } - break; - } - otherValue = stack.values[datasetIndex]; - if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) { - value += otherValue; - } - } - return value; -} -function convertObjectDataToArray(data) { - const keys = Object.keys(data); - const adata = new Array(keys.length); - let i, ilen, key; - for (i = 0, ilen = keys.length; i < ilen; ++i) { - key = keys[i]; - adata[i] = { - x: key, - y: data[key] - }; - } - return adata; -} -function isStacked(scale, meta) { - const stacked = scale && scale.options.stacked; - return stacked || stacked === void 0 && meta.stack !== void 0; -} -function getStackKey(indexScale, valueScale, meta) { - return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`; -} -function getUserBounds(scale) { - const { min, max, minDefined, maxDefined } = scale.getUserBounds(); - return { - min: minDefined ? min : Number.NEGATIVE_INFINITY, - max: maxDefined ? max : Number.POSITIVE_INFINITY - }; -} -function getOrCreateStack(stacks, stackKey, indexValue) { - const subStack = stacks[stackKey] || (stacks[stackKey] = {}); - return subStack[indexValue] || (subStack[indexValue] = {}); -} -function getLastIndexInStack(stack, vScale, positive, type) { - for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) { - const value = stack[meta.index]; - if (positive && value > 0 || !positive && value < 0) { - return meta.index; - } - } - return null; -} -function updateStacks(controller, parsed) { - const { chart, _cachedMeta: meta } = controller; - const stacks = chart._stacks || (chart._stacks = {}); - const { iScale, vScale, index: datasetIndex } = meta; - const iAxis = iScale.axis; - const vAxis = vScale.axis; - const key = getStackKey(iScale, vScale, meta); - const ilen = parsed.length; - let stack; - for (let i = 0; i < ilen; ++i) { - const item = parsed[i]; - const { [iAxis]: index, [vAxis]: value } = item; - const itemStacks = item._stacks || (item._stacks = {}); - stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index); - stack[datasetIndex] = value; - stack._top = getLastIndexInStack(stack, vScale, true, meta.type); - stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type); - const visualValues = stack._visualValues || (stack._visualValues = {}); - visualValues[datasetIndex] = value; - } -} -function getFirstScaleId(chart, axis) { - const scales = chart.scales; - return Object.keys(scales).filter((key) => scales[key].axis === axis).shift(); -} -function createDatasetContext(parent, index) { - return createContext(parent, { - active: false, - dataset: void 0, - datasetIndex: index, - index, - mode: "default", - type: "dataset" - }); -} -function createDataContext(parent, index, element) { - return createContext(parent, { - active: false, - dataIndex: index, - parsed: void 0, - raw: void 0, - element, - index, - mode: "default", - type: "data" - }); -} -function clearStacks(meta, items) { - const datasetIndex = meta.controller.index; - const axis = meta.vScale && meta.vScale.axis; - if (!axis) { - return; - } - items = items || meta._parsed; - for (const parsed of items) { - const stacks = parsed._stacks; - if (!stacks || stacks[axis] === void 0 || stacks[axis][datasetIndex] === void 0) { - return; - } - delete stacks[axis][datasetIndex]; - if (stacks[axis]._visualValues !== void 0 && stacks[axis]._visualValues[datasetIndex] !== void 0) { - delete stacks[axis]._visualValues[datasetIndex]; - } - } -} -var isDirectUpdateMode = (mode) => mode === "reset" || mode === "none"; -var cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached); -var createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked && { - keys: getSortedDatasetIndices(chart, true), - values: null -}; -var DatasetController = class { - constructor(chart, datasetIndex) { - this.chart = chart; - this._ctx = chart.ctx; - this.index = datasetIndex; - this._cachedDataOpts = {}; - this._cachedMeta = this.getMeta(); - this._type = this._cachedMeta.type; - this.options = void 0; - this._parsing = false; - this._data = void 0; - this._objectData = void 0; - this._sharedOptions = void 0; - this._drawStart = void 0; - this._drawCount = void 0; - this.enableOptionSharing = false; - this.supportsDecimation = false; - this.$context = void 0; - this._syncList = []; - this.datasetElementType = new.target.datasetElementType; - this.dataElementType = new.target.dataElementType; - this.initialize(); - } - initialize() { - const meta = this._cachedMeta; - this.configure(); - this.linkScales(); - meta._stacked = isStacked(meta.vScale, meta); - this.addElements(); - if (this.options.fill && !this.chart.isPluginEnabled("filler")) { - console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options"); - } - } - updateIndex(datasetIndex) { - if (this.index !== datasetIndex) { - clearStacks(this._cachedMeta); - } - this.index = datasetIndex; - } - linkScales() { - const chart = this.chart; - const meta = this._cachedMeta; - const dataset = this.getDataset(); - const chooseId = (axis, x, y, r) => axis === "x" ? x : axis === "r" ? r : y; - const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, "x")); - const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, "y")); - const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, "r")); - const indexAxis = meta.indexAxis; - const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid); - const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid); - meta.xScale = this.getScaleForId(xid); - meta.yScale = this.getScaleForId(yid); - meta.rScale = this.getScaleForId(rid); - meta.iScale = this.getScaleForId(iid); - meta.vScale = this.getScaleForId(vid); - } - getDataset() { - return this.chart.data.datasets[this.index]; - } - getMeta() { - return this.chart.getDatasetMeta(this.index); - } - getScaleForId(scaleID) { - return this.chart.scales[scaleID]; - } - _getOtherScale(scale) { - const meta = this._cachedMeta; - return scale === meta.iScale ? meta.vScale : meta.iScale; - } - reset() { - this._update("reset"); - } - _destroy() { - const meta = this._cachedMeta; - if (this._data) { - unlistenArrayEvents(this._data, this); - } - if (meta._stacked) { - clearStacks(meta); - } - } - _dataCheck() { - const dataset = this.getDataset(); - const data = dataset.data || (dataset.data = []); - const _data = this._data; - if (isObject(data)) { - this._data = convertObjectDataToArray(data); - } else if (_data !== data) { - if (_data) { - unlistenArrayEvents(_data, this); - const meta = this._cachedMeta; - clearStacks(meta); - meta._parsed = []; - } - if (data && Object.isExtensible(data)) { - listenArrayEvents(data, this); - } - this._syncList = []; - this._data = data; - } - } - addElements() { - const meta = this._cachedMeta; - this._dataCheck(); - if (this.datasetElementType) { - meta.dataset = new this.datasetElementType(); - } - } - buildOrUpdateElements(resetNewElements) { - const meta = this._cachedMeta; - const dataset = this.getDataset(); - let stackChanged = false; - this._dataCheck(); - const oldStacked = meta._stacked; - meta._stacked = isStacked(meta.vScale, meta); - if (meta.stack !== dataset.stack) { - stackChanged = true; - clearStacks(meta); - meta.stack = dataset.stack; - } - this._resyncElements(resetNewElements); - if (stackChanged || oldStacked !== meta._stacked) { - updateStacks(this, meta._parsed); - } - } - configure() { - const config = this.chart.config; - const scopeKeys = config.datasetScopeKeys(this._type); - const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true); - this.options = config.createResolver(scopes, this.getContext()); - this._parsing = this.options.parsing; - this._cachedDataOpts = {}; - } - parse(start, count) { - const { _cachedMeta: meta, _data: data } = this; - const { iScale, _stacked } = meta; - const iAxis = iScale.axis; - let sorted = start === 0 && count === data.length ? true : meta._sorted; - let prev = start > 0 && meta._parsed[start - 1]; - let i, cur, parsed; - if (this._parsing === false) { - meta._parsed = data; - meta._sorted = true; - parsed = data; - } else { - if (isArray(data[start])) { - parsed = this.parseArrayData(meta, data, start, count); - } else if (isObject(data[start])) { - parsed = this.parseObjectData(meta, data, start, count); - } else { - parsed = this.parsePrimitiveData(meta, data, start, count); - } - const isNotInOrderComparedToPrev = () => cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis]; - for (i = 0; i < count; ++i) { - meta._parsed[i + start] = cur = parsed[i]; - if (sorted) { - if (isNotInOrderComparedToPrev()) { - sorted = false; - } - prev = cur; - } - } - meta._sorted = sorted; - } - if (_stacked) { - updateStacks(this, parsed); - } - } - parsePrimitiveData(meta, data, start, count) { - const { iScale, vScale } = meta; - const iAxis = iScale.axis; - const vAxis = vScale.axis; - const labels = iScale.getLabels(); - const singleScale = iScale === vScale; - const parsed = new Array(count); - let i, ilen, index; - for (i = 0, ilen = count; i < ilen; ++i) { - index = i + start; - parsed[i] = { - [iAxis]: singleScale || iScale.parse(labels[index], index), - [vAxis]: vScale.parse(data[index], index) - }; - } - return parsed; - } - parseArrayData(meta, data, start, count) { - const { xScale, yScale } = meta; - const parsed = new Array(count); - let i, ilen, index, item; - for (i = 0, ilen = count; i < ilen; ++i) { - index = i + start; - item = data[index]; - parsed[i] = { - x: xScale.parse(item[0], index), - y: yScale.parse(item[1], index) - }; - } - return parsed; - } - parseObjectData(meta, data, start, count) { - const { xScale, yScale } = meta; - const { xAxisKey = "x", yAxisKey = "y" } = this._parsing; - const parsed = new Array(count); - let i, ilen, index, item; - for (i = 0, ilen = count; i < ilen; ++i) { - index = i + start; - item = data[index]; - parsed[i] = { - x: xScale.parse(resolveObjectKey(item, xAxisKey), index), - y: yScale.parse(resolveObjectKey(item, yAxisKey), index) - }; - } - return parsed; - } - getParsed(index) { - return this._cachedMeta._parsed[index]; - } - getDataElement(index) { - return this._cachedMeta.data[index]; - } - applyStack(scale, parsed, mode) { - const chart = this.chart; - const meta = this._cachedMeta; - const value = parsed[scale.axis]; - const stack = { - keys: getSortedDatasetIndices(chart, true), - values: parsed._stacks[scale.axis]._visualValues - }; - return applyStack(stack, value, meta.index, { - mode - }); - } - updateRangeFromParsed(range, scale, parsed, stack) { - const parsedValue = parsed[scale.axis]; - let value = parsedValue === null ? NaN : parsedValue; - const values = stack && parsed._stacks[scale.axis]; - if (stack && values) { - stack.values = values; - value = applyStack(stack, parsedValue, this._cachedMeta.index); - } - range.min = Math.min(range.min, value); - range.max = Math.max(range.max, value); - } - getMinMax(scale, canStack) { - const meta = this._cachedMeta; - const _parsed = meta._parsed; - const sorted = meta._sorted && scale === meta.iScale; - const ilen = _parsed.length; - const otherScale = this._getOtherScale(scale); - const stack = createStack(canStack, meta, this.chart); - const range = { - min: Number.POSITIVE_INFINITY, - max: Number.NEGATIVE_INFINITY - }; - const { min: otherMin, max: otherMax } = getUserBounds(otherScale); - let i, parsed; - function _skip() { - parsed = _parsed[i]; - const otherValue = parsed[otherScale.axis]; - return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue; - } - for (i = 0; i < ilen; ++i) { - if (_skip()) { - continue; - } - this.updateRangeFromParsed(range, scale, parsed, stack); - if (sorted) { - break; - } - } - if (sorted) { - for (i = ilen - 1; i >= 0; --i) { - if (_skip()) { - continue; - } - this.updateRangeFromParsed(range, scale, parsed, stack); - break; - } - } - return range; - } - getAllParsedValues(scale) { - const parsed = this._cachedMeta._parsed; - const values = []; - let i, ilen, value; - for (i = 0, ilen = parsed.length; i < ilen; ++i) { - value = parsed[i][scale.axis]; - if (isNumberFinite(value)) { - values.push(value); - } - } - return values; - } - getMaxOverflow() { - return false; - } - getLabelAndValue(index) { - const meta = this._cachedMeta; - const iScale = meta.iScale; - const vScale = meta.vScale; - const parsed = this.getParsed(index); - return { - label: iScale ? "" + iScale.getLabelForValue(parsed[iScale.axis]) : "", - value: vScale ? "" + vScale.getLabelForValue(parsed[vScale.axis]) : "" - }; - } - _update(mode) { - const meta = this._cachedMeta; - this.update(mode || "default"); - meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow()))); - } - update(mode) { - } - draw() { - const ctx = this._ctx; - const chart = this.chart; - const meta = this._cachedMeta; - const elements = meta.data || []; - const area = chart.chartArea; - const active = []; - const start = this._drawStart || 0; - const count = this._drawCount || elements.length - start; - const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop; - let i; - if (meta.dataset) { - meta.dataset.draw(ctx, area, start, count); - } - for (i = start; i < start + count; ++i) { - const element = elements[i]; - if (element.hidden) { - continue; - } - if (element.active && drawActiveElementsOnTop) { - active.push(element); - } else { - element.draw(ctx, area); - } - } - for (i = 0; i < active.length; ++i) { - active[i].draw(ctx, area); - } - } - getStyle(index, active) { - const mode = active ? "active" : "default"; - return index === void 0 && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode); - } - getContext(index, active, mode) { - const dataset = this.getDataset(); - let context; - if (index >= 0 && index < this._cachedMeta.data.length) { - const element = this._cachedMeta.data[index]; - context = element.$context || (element.$context = createDataContext(this.getContext(), index, element)); - context.parsed = this.getParsed(index); - context.raw = dataset.data[index]; - context.index = context.dataIndex = index; - } else { - context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index)); - context.dataset = dataset; - context.index = context.datasetIndex = this.index; - } - context.active = !!active; - context.mode = mode; - return context; - } - resolveDatasetElementOptions(mode) { - return this._resolveElementOptions(this.datasetElementType.id, mode); - } - resolveDataElementOptions(index, mode) { - return this._resolveElementOptions(this.dataElementType.id, mode, index); - } - _resolveElementOptions(elementType, mode = "default", index) { - const active = mode === "active"; - const cache = this._cachedDataOpts; - const cacheKey = elementType + "-" + mode; - const cached = cache[cacheKey]; - const sharing = this.enableOptionSharing && defined(index); - if (cached) { - return cloneIfNotShared(cached, sharing); - } - const config = this.chart.config; - const scopeKeys = config.datasetElementScopeKeys(this._type, elementType); - const prefixes = active ? [ - `${elementType}Hover`, - "hover", - elementType, - "" - ] : [ - elementType, - "" - ]; - const scopes = config.getOptionScopes(this.getDataset(), scopeKeys); - const names2 = Object.keys(defaults.elements[elementType]); - const context = () => this.getContext(index, active, mode); - const values = config.resolveNamedOptions(scopes, names2, context, prefixes); - if (values.$shared) { - values.$shared = sharing; - cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing)); - } - return values; - } - _resolveAnimations(index, transition, active) { - const chart = this.chart; - const cache = this._cachedDataOpts; - const cacheKey = `animation-${transition}`; - const cached = cache[cacheKey]; - if (cached) { - return cached; - } - let options; - if (chart.options.animation !== false) { - const config = this.chart.config; - const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition); - const scopes = config.getOptionScopes(this.getDataset(), scopeKeys); - options = config.createResolver(scopes, this.getContext(index, active, transition)); - } - const animations = new Animations(chart, options && options.animations); - if (options && options._cacheable) { - cache[cacheKey] = Object.freeze(animations); - } - return animations; - } - getSharedOptions(options) { - if (!options.$shared) { - return; - } - return this._sharedOptions || (this._sharedOptions = Object.assign({}, options)); - } - includeOptions(mode, sharedOptions) { - return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled; - } - _getSharedOptions(start, mode) { - const firstOpts = this.resolveDataElementOptions(start, mode); - const previouslySharedOptions = this._sharedOptions; - const sharedOptions = this.getSharedOptions(firstOpts); - const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions; - this.updateSharedOptions(sharedOptions, mode, firstOpts); - return { - sharedOptions, - includeOptions - }; - } - updateElement(element, index, properties, mode) { - if (isDirectUpdateMode(mode)) { - Object.assign(element, properties); - } else { - this._resolveAnimations(index, mode).update(element, properties); - } - } - updateSharedOptions(sharedOptions, mode, newOptions) { - if (sharedOptions && !isDirectUpdateMode(mode)) { - this._resolveAnimations(void 0, mode).update(sharedOptions, newOptions); - } - } - _setStyle(element, index, mode, active) { - element.active = active; - const options = this.getStyle(index, active); - this._resolveAnimations(index, mode, active).update(element, { - options: !active && this.getSharedOptions(options) || options - }); - } - removeHoverStyle(element, datasetIndex, index) { - this._setStyle(element, index, "active", false); - } - setHoverStyle(element, datasetIndex, index) { - this._setStyle(element, index, "active", true); - } - _removeDatasetHoverStyle() { - const element = this._cachedMeta.dataset; - if (element) { - this._setStyle(element, void 0, "active", false); - } - } - _setDatasetHoverStyle() { - const element = this._cachedMeta.dataset; - if (element) { - this._setStyle(element, void 0, "active", true); - } - } - _resyncElements(resetNewElements) { - const data = this._data; - const elements = this._cachedMeta.data; - for (const [method, arg1, arg2] of this._syncList) { - this[method](arg1, arg2); - } - this._syncList = []; - const numMeta = elements.length; - const numData = data.length; - const count = Math.min(numData, numMeta); - if (count) { - this.parse(0, count); - } - if (numData > numMeta) { - this._insertElements(numMeta, numData - numMeta, resetNewElements); - } else if (numData < numMeta) { - this._removeElements(numData, numMeta - numData); - } - } - _insertElements(start, count, resetNewElements = true) { - const meta = this._cachedMeta; - const data = meta.data; - const end = start + count; - let i; - const move = (arr) => { - arr.length += count; - for (i = arr.length - 1; i >= end; i--) { - arr[i] = arr[i - count]; - } - }; - move(data); - for (i = start; i < end; ++i) { - data[i] = new this.dataElementType(); - } - if (this._parsing) { - move(meta._parsed); - } - this.parse(start, count); - if (resetNewElements) { - this.updateElements(data, start, count, "reset"); - } - } - updateElements(element, start, count, mode) { - } - _removeElements(start, count) { - const meta = this._cachedMeta; - if (this._parsing) { - const removed = meta._parsed.splice(start, count); - if (meta._stacked) { - clearStacks(meta, removed); - } - } - meta.data.splice(start, count); - } - _sync(args) { - if (this._parsing) { - this._syncList.push(args); - } else { - const [method, arg1, arg2] = args; - this[method](arg1, arg2); - } - this.chart._dataChanges.push([ - this.index, - ...args - ]); - } - _onDataPush() { - const count = arguments.length; - this._sync([ - "_insertElements", - this.getDataset().data.length - count, - count - ]); - } - _onDataPop() { - this._sync([ - "_removeElements", - this._cachedMeta.data.length - 1, - 1 - ]); - } - _onDataShift() { - this._sync([ - "_removeElements", - 0, - 1 - ]); - } - _onDataSplice(start, count) { - if (count) { - this._sync([ - "_removeElements", - start, - count - ]); - } - const newCount = arguments.length - 2; - if (newCount) { - this._sync([ - "_insertElements", - start, - newCount - ]); - } - } - _onDataUnshift() { - this._sync([ - "_insertElements", - 0, - arguments.length - ]); - } -}; -__publicField(DatasetController, "defaults", {}); -__publicField(DatasetController, "datasetElementType", null); -__publicField(DatasetController, "dataElementType", null); -function getAllScaleValues(scale, type) { - if (!scale._cache.$bar) { - const visibleMetas = scale.getMatchingVisibleMetas(type); - let values = []; - for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) { - values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale)); - } - scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b)); - } - return scale._cache.$bar; -} -function computeMinSampleSize(meta) { - const scale = meta.iScale; - const values = getAllScaleValues(scale, meta.type); - let min = scale._length; - let i, ilen, curr, prev; - const updateMinAndPrev = () => { - if (curr === 32767 || curr === -32768) { - return; - } - if (defined(prev)) { - min = Math.min(min, Math.abs(curr - prev) || min); - } - prev = curr; - }; - for (i = 0, ilen = values.length; i < ilen; ++i) { - curr = scale.getPixelForValue(values[i]); - updateMinAndPrev(); - } - prev = void 0; - for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) { - curr = scale.getPixelForTick(i); - updateMinAndPrev(); - } - return min; -} -function computeFitCategoryTraits(index, ruler, options, stackCount) { - const thickness = options.barThickness; - let size, ratio; - if (isNullOrUndef(thickness)) { - size = ruler.min * options.categoryPercentage; - ratio = options.barPercentage; - } else { - size = thickness * stackCount; - ratio = 1; - } - return { - chunk: size / stackCount, - ratio, - start: ruler.pixels[index] - size / 2 - }; -} -function computeFlexCategoryTraits(index, ruler, options, stackCount) { - const pixels = ruler.pixels; - const curr = pixels[index]; - let prev = index > 0 ? pixels[index - 1] : null; - let next = index < pixels.length - 1 ? pixels[index + 1] : null; - const percent = options.categoryPercentage; - if (prev === null) { - prev = curr - (next === null ? ruler.end - ruler.start : next - curr); - } - if (next === null) { - next = curr + curr - prev; - } - const start = curr - (curr - Math.min(prev, next)) / 2 * percent; - const size = Math.abs(next - prev) / 2 * percent; - return { - chunk: size / stackCount, - ratio: options.barPercentage, - start - }; -} -function parseFloatBar(entry, item, vScale, i) { - const startValue = vScale.parse(entry[0], i); - const endValue = vScale.parse(entry[1], i); - const min = Math.min(startValue, endValue); - const max = Math.max(startValue, endValue); - let barStart = min; - let barEnd = max; - if (Math.abs(min) > Math.abs(max)) { - barStart = max; - barEnd = min; - } - item[vScale.axis] = barEnd; - item._custom = { - barStart, - barEnd, - start: startValue, - end: endValue, - min, - max - }; -} -function parseValue(entry, item, vScale, i) { - if (isArray(entry)) { - parseFloatBar(entry, item, vScale, i); - } else { - item[vScale.axis] = vScale.parse(entry, i); - } - return item; -} -function parseArrayOrPrimitive(meta, data, start, count) { - const iScale = meta.iScale; - const vScale = meta.vScale; - const labels = iScale.getLabels(); - const singleScale = iScale === vScale; - const parsed = []; - let i, ilen, item, entry; - for (i = start, ilen = start + count; i < ilen; ++i) { - entry = data[i]; - item = {}; - item[iScale.axis] = singleScale || iScale.parse(labels[i], i); - parsed.push(parseValue(entry, item, vScale, i)); - } - return parsed; -} -function isFloatBar(custom) { - return custom && custom.barStart !== void 0 && custom.barEnd !== void 0; -} -function barSign(size, vScale, actualBase) { - if (size !== 0) { - return sign(size); - } - return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1); -} -function borderProps(properties) { - let reverse, start, end, top, bottom; - if (properties.horizontal) { - reverse = properties.base > properties.x; - start = "left"; - end = "right"; - } else { - reverse = properties.base < properties.y; - start = "bottom"; - end = "top"; - } - if (reverse) { - top = "end"; - bottom = "start"; - } else { - top = "start"; - bottom = "end"; - } - return { - start, - end, - reverse, - top, - bottom - }; -} -function setBorderSkipped(properties, options, stack, index) { - let edge = options.borderSkipped; - const res = {}; - if (!edge) { - properties.borderSkipped = res; - return; - } - if (edge === true) { - properties.borderSkipped = { - top: true, - right: true, - bottom: true, - left: true - }; - return; - } - const { start, end, reverse, top, bottom } = borderProps(properties); - if (edge === "middle" && stack) { - properties.enableBorderRadius = true; - if ((stack._top || 0) === index) { - edge = top; - } else if ((stack._bottom || 0) === index) { - edge = bottom; - } else { - res[parseEdge(bottom, start, end, reverse)] = true; - edge = top; - } - } - res[parseEdge(edge, start, end, reverse)] = true; - properties.borderSkipped = res; -} -function parseEdge(edge, a, b, reverse) { - if (reverse) { - edge = swap(edge, a, b); - edge = startEnd(edge, b, a); - } else { - edge = startEnd(edge, a, b); - } - return edge; -} -function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; -} -function startEnd(v, start, end) { - return v === "start" ? start : v === "end" ? end : v; -} -function setInflateAmount(properties, { inflateAmount }, ratio) { - properties.inflateAmount = inflateAmount === "auto" ? ratio === 1 ? 0.33 : 0 : inflateAmount; -} -var BarController = class extends DatasetController { - parsePrimitiveData(meta, data, start, count) { - return parseArrayOrPrimitive(meta, data, start, count); - } - parseArrayData(meta, data, start, count) { - return parseArrayOrPrimitive(meta, data, start, count); - } - parseObjectData(meta, data, start, count) { - const { iScale, vScale } = meta; - const { xAxisKey = "x", yAxisKey = "y" } = this._parsing; - const iAxisKey = iScale.axis === "x" ? xAxisKey : yAxisKey; - const vAxisKey = vScale.axis === "x" ? xAxisKey : yAxisKey; - const parsed = []; - let i, ilen, item, obj; - for (i = start, ilen = start + count; i < ilen; ++i) { - obj = data[i]; - item = {}; - item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i); - parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i)); - } - return parsed; - } - updateRangeFromParsed(range, scale, parsed, stack) { - super.updateRangeFromParsed(range, scale, parsed, stack); - const custom = parsed._custom; - if (custom && scale === this._cachedMeta.vScale) { - range.min = Math.min(range.min, custom.min); - range.max = Math.max(range.max, custom.max); - } - } - getMaxOverflow() { - return 0; - } - getLabelAndValue(index) { - const meta = this._cachedMeta; - const { iScale, vScale } = meta; - const parsed = this.getParsed(index); - const custom = parsed._custom; - const value = isFloatBar(custom) ? "[" + custom.start + ", " + custom.end + "]" : "" + vScale.getLabelForValue(parsed[vScale.axis]); - return { - label: "" + iScale.getLabelForValue(parsed[iScale.axis]), - value - }; - } - initialize() { - this.enableOptionSharing = true; - super.initialize(); - const meta = this._cachedMeta; - meta.stack = this.getDataset().stack; - } - update(mode) { - const meta = this._cachedMeta; - this.updateElements(meta.data, 0, meta.data.length, mode); - } - updateElements(bars, start, count, mode) { - const reset2 = mode === "reset"; - const { index, _cachedMeta: { vScale } } = this; - const base = vScale.getBasePixel(); - const horizontal = vScale.isHorizontal(); - const ruler = this._getRuler(); - const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode); - for (let i = start; i < start + count; i++) { - const parsed = this.getParsed(i); - const vpixels = reset2 || isNullOrUndef(parsed[vScale.axis]) ? { - base, - head: base - } : this._calculateBarValuePixels(i); - const ipixels = this._calculateBarIndexPixels(i, ruler); - const stack = (parsed._stacks || {})[vScale.axis]; - const properties = { - horizontal, - base: vpixels.base, - enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom, - x: horizontal ? vpixels.head : ipixels.center, - y: horizontal ? ipixels.center : vpixels.head, - height: horizontal ? ipixels.size : Math.abs(vpixels.size), - width: horizontal ? Math.abs(vpixels.size) : ipixels.size - }; - if (includeOptions) { - properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? "active" : mode); - } - const options = properties.options || bars[i].options; - setBorderSkipped(properties, options, stack, index); - setInflateAmount(properties, options, ruler.ratio); - this.updateElement(bars[i], i, properties, mode); - } - } - _getStacks(last, dataIndex) { - const { iScale } = this._cachedMeta; - const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta) => meta.controller.options.grouped); - const stacked = iScale.options.stacked; - const stacks = []; - const skipNull = (meta) => { - const parsed = meta.controller.getParsed(dataIndex); - const val = parsed && parsed[meta.vScale.axis]; - if (isNullOrUndef(val) || isNaN(val)) { - return true; - } - }; - for (const meta of metasets) { - if (dataIndex !== void 0 && skipNull(meta)) { - continue; - } - if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === void 0 && meta.stack === void 0) { - stacks.push(meta.stack); - } - if (meta.index === last) { - break; - } - } - if (!stacks.length) { - stacks.push(void 0); - } - return stacks; - } - _getStackCount(index) { - return this._getStacks(void 0, index).length; - } - _getStackIndex(datasetIndex, name2, dataIndex) { - const stacks = this._getStacks(datasetIndex, dataIndex); - const index = name2 !== void 0 ? stacks.indexOf(name2) : -1; - return index === -1 ? stacks.length - 1 : index; - } - _getRuler() { - const opts = this.options; - const meta = this._cachedMeta; - const iScale = meta.iScale; - const pixels = []; - let i, ilen; - for (i = 0, ilen = meta.data.length; i < ilen; ++i) { - pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i)); - } - const barThickness = opts.barThickness; - const min = barThickness || computeMinSampleSize(meta); - return { - min, - pixels, - start: iScale._startPixel, - end: iScale._endPixel, - stackCount: this._getStackCount(), - scale: iScale, - grouped: opts.grouped, - ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage - }; - } - _calculateBarValuePixels(index) { - const { _cachedMeta: { vScale, _stacked, index: datasetIndex }, options: { base: baseValue, minBarLength } } = this; - const actualBase = baseValue || 0; - const parsed = this.getParsed(index); - const custom = parsed._custom; - const floating = isFloatBar(custom); - let value = parsed[vScale.axis]; - let start = 0; - let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value; - let head, size; - if (length !== value) { - start = length - value; - length = value; - } - if (floating) { - value = custom.barStart; - length = custom.barEnd - custom.barStart; - if (value !== 0 && sign(value) !== sign(custom.barEnd)) { - start = 0; - } - start += value; - } - const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start; - let base = vScale.getPixelForValue(startValue); - if (this.chart.getDataVisibility(index)) { - head = vScale.getPixelForValue(start + length); - } else { - head = base; - } - size = head - base; - if (Math.abs(size) < minBarLength) { - size = barSign(size, vScale, actualBase) * minBarLength; - if (value === actualBase) { - base -= size / 2; - } - const startPixel = vScale.getPixelForDecimal(0); - const endPixel = vScale.getPixelForDecimal(1); - const min = Math.min(startPixel, endPixel); - const max = Math.max(startPixel, endPixel); - base = Math.max(Math.min(base, max), min); - head = base + size; - if (_stacked && !floating) { - parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base); - } - } - if (base === vScale.getPixelForValue(actualBase)) { - const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2; - base += halfGrid; - size -= halfGrid; - } - return { - size, - base, - head, - center: head + size / 2 - }; - } - _calculateBarIndexPixels(index, ruler) { - const scale = ruler.scale; - const options = this.options; - const skipNull = options.skipNull; - const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity); - let center, size; - if (ruler.grouped) { - const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount; - const range = options.barThickness === "flex" ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount); - const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : void 0); - center = range.start + range.chunk * stackIndex + range.chunk / 2; - size = Math.min(maxBarThickness, range.chunk * range.ratio); - } else { - center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index); - size = Math.min(maxBarThickness, ruler.min * ruler.ratio); - } - return { - base: center - size / 2, - head: center + size / 2, - center, - size - }; - } - draw() { - const meta = this._cachedMeta; - const vScale = meta.vScale; - const rects = meta.data; - const ilen = rects.length; - let i = 0; - for (; i < ilen; ++i) { - if (this.getParsed(i)[vScale.axis] !== null) { - rects[i].draw(this._ctx); - } - } - } -}; -__publicField(BarController, "id", "bar"); -__publicField(BarController, "defaults", { - datasetElementType: false, - dataElementType: "bar", - categoryPercentage: 0.8, - barPercentage: 0.9, - grouped: true, - animations: { - numbers: { - type: "number", - properties: [ - "x", - "y", - "base", - "width", - "height" - ] - } - } -}); -__publicField(BarController, "overrides", { - scales: { - _index_: { - type: "category", - offset: true, - grid: { - offset: true - } - }, - _value_: { - type: "linear", - beginAtZero: true - } - } -}); -function getRatioAndOffset(rotation, circumference, cutout) { - let ratioX = 1; - let ratioY = 1; - let offsetX = 0; - let offsetY = 0; - if (circumference < TAU) { - const startAngle = rotation; - const endAngle = startAngle + circumference; - const startX = Math.cos(startAngle); - const startY = Math.sin(startAngle); - const endX = Math.cos(endAngle); - const endY = Math.sin(endAngle); - const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout); - const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout); - const maxX = calcMax(0, startX, endX); - const maxY = calcMax(HALF_PI, startY, endY); - const minX = calcMin(PI, startX, endX); - const minY = calcMin(PI + HALF_PI, startY, endY); - ratioX = (maxX - minX) / 2; - ratioY = (maxY - minY) / 2; - offsetX = -(maxX + minX) / 2; - offsetY = -(maxY + minY) / 2; - } - return { - ratioX, - ratioY, - offsetX, - offsetY - }; -} -var DoughnutController = class extends DatasetController { - constructor(chart, datasetIndex) { - super(chart, datasetIndex); - this.enableOptionSharing = true; - this.innerRadius = void 0; - this.outerRadius = void 0; - this.offsetX = void 0; - this.offsetY = void 0; - } - linkScales() { - } - parse(start, count) { - const data = this.getDataset().data; - const meta = this._cachedMeta; - if (this._parsing === false) { - meta._parsed = data; - } else { - let getter = (i2) => +data[i2]; - if (isObject(data[start])) { - const { key = "value" } = this._parsing; - getter = (i2) => +resolveObjectKey(data[i2], key); - } - let i, ilen; - for (i = start, ilen = start + count; i < ilen; ++i) { - meta._parsed[i] = getter(i); - } - } - } - _getRotation() { - return toRadians(this.options.rotation - 90); - } - _getCircumference() { - return toRadians(this.options.circumference); - } - _getRotationExtents() { - let min = TAU; - let max = -TAU; - for (let i = 0; i < this.chart.data.datasets.length; ++i) { - if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) { - const controller = this.chart.getDatasetMeta(i).controller; - const rotation = controller._getRotation(); - const circumference = controller._getCircumference(); - min = Math.min(min, rotation); - max = Math.max(max, rotation + circumference); - } - } - return { - rotation: min, - circumference: max - min - }; - } - update(mode) { - const chart = this.chart; - const { chartArea } = chart; - const meta = this._cachedMeta; - const arcs = meta.data; - const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing; - const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0); - const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1); - const chartWeight = this._getRingWeight(this.index); - const { circumference, rotation } = this._getRotationExtents(); - const { ratioX, ratioY, offsetX, offsetY } = getRatioAndOffset(rotation, circumference, cutout); - const maxWidth = (chartArea.width - spacing) / ratioX; - const maxHeight = (chartArea.height - spacing) / ratioY; - const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0); - const outerRadius = toDimension(this.options.radius, maxRadius); - const innerRadius = Math.max(outerRadius * cutout, 0); - const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal(); - this.offsetX = offsetX * outerRadius; - this.offsetY = offsetY * outerRadius; - meta.total = this.calculateTotal(); - this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index); - this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0); - this.updateElements(arcs, 0, arcs.length, mode); - } - _circumference(i, reset2) { - const opts = this.options; - const meta = this._cachedMeta; - const circumference = this._getCircumference(); - if (reset2 && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) { - return 0; - } - return this.calculateCircumference(meta._parsed[i] * circumference / TAU); - } - updateElements(arcs, start, count, mode) { - const reset2 = mode === "reset"; - const chart = this.chart; - const chartArea = chart.chartArea; - const opts = chart.options; - const animationOpts = opts.animation; - const centerX = (chartArea.left + chartArea.right) / 2; - const centerY = (chartArea.top + chartArea.bottom) / 2; - const animateScale = reset2 && animationOpts.animateScale; - const innerRadius = animateScale ? 0 : this.innerRadius; - const outerRadius = animateScale ? 0 : this.outerRadius; - const { sharedOptions, includeOptions } = this._getSharedOptions(start, mode); - let startAngle = this._getRotation(); - let i; - for (i = 0; i < start; ++i) { - startAngle += this._circumference(i, reset2); - } - for (i = start; i < start + count; ++i) { - const circumference = this._circumference(i, reset2); - const arc = arcs[i]; - const properties = { - x: centerX + this.offsetX, - y: centerY + this.offsetY, - startAngle, - endAngle: startAngle + circumference, - circumference, - outerRadius, - innerRadius - }; - if (includeOptions) { - properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? "active" : mode); - } - startAngle += circumference; - this.updateElement(arc, i, properties, mode); - } - } - calculateTotal() { - const meta = this._cachedMeta; - const metaData = meta.data; - let total = 0; - let i; - for (i = 0; i < metaData.length; i++) { - const value = meta._parsed[i]; - if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) { - total += Math.abs(value); - } - } - return total; - } - calculateCircumference(value) { - const total = this._cachedMeta.total; - if (total > 0 && !isNaN(value)) { - return TAU * (Math.abs(value) / total); - } - return 0; - } - getLabelAndValue(index) { - const meta = this._cachedMeta; - const chart = this.chart; - const labels = chart.data.labels || []; - const value = formatNumber(meta._parsed[index], chart.options.locale); - return { - label: labels[index] || "", - value - }; - } - getMaxBorderWidth(arcs) { - let max = 0; - const chart = this.chart; - let i, ilen, meta, controller, options; - if (!arcs) { - for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { - if (chart.isDatasetVisible(i)) { - meta = chart.getDatasetMeta(i); - arcs = meta.data; - controller = meta.controller; - break; - } - } - } - if (!arcs) { - return 0; - } - for (i = 0, ilen = arcs.length; i < ilen; ++i) { - options = controller.resolveDataElementOptions(i); - if (options.borderAlign !== "inner") { - max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0); - } - } - return max; - } - getMaxOffset(arcs) { - let max = 0; - for (let i = 0, ilen = arcs.length; i < ilen; ++i) { - const options = this.resolveDataElementOptions(i); - max = Math.max(max, options.offset || 0, options.hoverOffset || 0); - } - return max; - } - _getRingWeightOffset(datasetIndex) { - let ringWeightOffset = 0; - for (let i = 0; i < datasetIndex; ++i) { - if (this.chart.isDatasetVisible(i)) { - ringWeightOffset += this._getRingWeight(i); - } - } - return ringWeightOffset; - } - _getRingWeight(datasetIndex) { - return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0); - } - _getVisibleDatasetWeightTotal() { - return this._getRingWeightOffset(this.chart.data.datasets.length) || 1; - } -}; -__publicField(DoughnutController, "id", "doughnut"); -__publicField(DoughnutController, "defaults", { - datasetElementType: false, - dataElementType: "arc", - animation: { - animateRotate: true, - animateScale: false - }, - animations: { - numbers: { - type: "number", - properties: [ - "circumference", - "endAngle", - "innerRadius", - "outerRadius", - "startAngle", - "x", - "y", - "offset", - "borderWidth", - "spacing" - ] - } - }, - cutout: "50%", - rotation: 0, - circumference: 360, - radius: "100%", - spacing: 0, - indexAxis: "r" -}); -__publicField(DoughnutController, "descriptors", { - _scriptable: (name2) => name2 !== "spacing", - _indexable: (name2) => name2 !== "spacing" -}); -__publicField(DoughnutController, "overrides", { - aspectRatio: 1, - plugins: { - legend: { - labels: { - generateLabels(chart) { - const data = chart.data; - if (data.labels.length && data.datasets.length) { - const { labels: { pointStyle, color: color2 } } = chart.legend.options; - return data.labels.map((label, i) => { - const meta = chart.getDatasetMeta(0); - const style = meta.controller.getStyle(i); - return { - text: label, - fillStyle: style.backgroundColor, - strokeStyle: style.borderColor, - fontColor: color2, - lineWidth: style.borderWidth, - pointStyle, - hidden: !chart.getDataVisibility(i), - index: i - }; - }); - } - return []; - } - }, - onClick(e, legendItem, legend) { - legend.chart.toggleDataVisibility(legendItem.index); - legend.chart.update(); - } - } - } -}); -var PieController = class extends DoughnutController { -}; -__publicField(PieController, "id", "pie"); -__publicField(PieController, "defaults", { - cutout: 0, - rotation: 0, - circumference: 360, - radius: "100%" -}); -function abstract() { - throw new Error("This method is not implemented: Check that a complete date adapter is provided."); -} -var DateAdapterBase = class { - /** - * Override default date adapter methods. - * Accepts type parameter to define options type. - * @example - * Chart._adapters._date.override<{myAdapterOption: string}>({ - * init() { - * console.log(this.options.myAdapterOption); - * } - * }) - */ - static override(members) { - Object.assign(DateAdapterBase.prototype, members); - } - constructor(options) { - this.options = options || {}; - } - // eslint-disable-next-line @typescript-eslint/no-empty-function - init() { - } - formats() { - return abstract(); - } - parse() { - return abstract(); - } - format() { - return abstract(); - } - add() { - return abstract(); - } - diff() { - return abstract(); - } - startOf() { - return abstract(); - } - endOf() { - return abstract(); - } -}; -var adapters = { - _date: DateAdapterBase -}; -function binarySearch(metaset, axis, value, intersect) { - const { controller, data, _sorted } = metaset; - const iScale = controller._cachedMeta.iScale; - if (iScale && axis === iScale.axis && axis !== "r" && _sorted && data.length) { - const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey; - if (!intersect) { - return lookupMethod(data, axis, value); - } else if (controller._sharedOptions) { - const el = data[0]; - const range = typeof el.getRange === "function" && el.getRange(axis); - if (range) { - const start = lookupMethod(data, axis, value - range); - const end = lookupMethod(data, axis, value + range); - return { - lo: start.lo, - hi: end.hi - }; - } - } - } - return { - lo: 0, - hi: data.length - 1 - }; -} -function evaluateInteractionItems(chart, axis, position, handler, intersect) { - const metasets = chart.getSortedVisibleDatasetMetas(); - const value = position[axis]; - for (let i = 0, ilen = metasets.length; i < ilen; ++i) { - const { index, data } = metasets[i]; - const { lo, hi } = binarySearch(metasets[i], axis, value, intersect); - for (let j = lo; j <= hi; ++j) { - const element = data[j]; - if (!element.skip) { - handler(element, index, j); - } - } - } -} -function getDistanceMetricForAxis(axis) { - const useX = axis.indexOf("x") !== -1; - const useY = axis.indexOf("y") !== -1; - return function(pt1, pt2) { - const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; - const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; - return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); - }; -} -function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) { - const items = []; - if (!includeInvisible && !chart.isPointInArea(position)) { - return items; - } - const evaluationFunc = function(element, datasetIndex, index) { - if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) { - return; - } - if (element.inRange(position.x, position.y, useFinalPosition)) { - items.push({ - element, - datasetIndex, - index - }); - } - }; - evaluateInteractionItems(chart, axis, position, evaluationFunc, true); - return items; -} -function getNearestRadialItems(chart, position, axis, useFinalPosition) { - let items = []; - function evaluationFunc(element, datasetIndex, index) { - const { startAngle, endAngle } = element.getProps([ - "startAngle", - "endAngle" - ], useFinalPosition); - const { angle } = getAngleFromPoint(element, { - x: position.x, - y: position.y - }); - if (_angleBetween(angle, startAngle, endAngle)) { - items.push({ - element, - datasetIndex, - index - }); - } - } - evaluateInteractionItems(chart, axis, position, evaluationFunc); - return items; -} -function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { - let items = []; - const distanceMetric = getDistanceMetricForAxis(axis); - let minDistance = Number.POSITIVE_INFINITY; - function evaluationFunc(element, datasetIndex, index) { - const inRange2 = element.inRange(position.x, position.y, useFinalPosition); - if (intersect && !inRange2) { - return; - } - const center = element.getCenterPoint(useFinalPosition); - const pointInArea = !!includeInvisible || chart.isPointInArea(center); - if (!pointInArea && !inRange2) { - return; - } - const distance = distanceMetric(position, center); - if (distance < minDistance) { - items = [ - { - element, - datasetIndex, - index - } - ]; - minDistance = distance; - } else if (distance === minDistance) { - items.push({ - element, - datasetIndex, - index - }); - } - } - evaluateInteractionItems(chart, axis, position, evaluationFunc); - return items; -} -function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) { - if (!includeInvisible && !chart.isPointInArea(position)) { - return []; - } - return axis === "r" && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible); -} -function getAxisItems(chart, position, axis, intersect, useFinalPosition) { - const items = []; - const rangeMethod = axis === "x" ? "inXRange" : "inYRange"; - let intersectsItem = false; - evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => { - if (element[rangeMethod](position[axis], useFinalPosition)) { - items.push({ - element, - datasetIndex, - index - }); - intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition); - } - }); - if (intersect && !intersectsItem) { - return []; - } - return items; -} -var Interaction = { - evaluateInteractionItems, - modes: { - index(chart, e, options, useFinalPosition) { - const position = getRelativePosition(e, chart); - const axis = options.axis || "x"; - const includeInvisible = options.includeInvisible || false; - const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); - const elements = []; - if (!items.length) { - return []; - } - chart.getSortedVisibleDatasetMetas().forEach((meta) => { - const index = items[0].index; - const element = meta.data[index]; - if (element && !element.skip) { - elements.push({ - element, - datasetIndex: meta.index, - index - }); - } - }); - return elements; - }, - dataset(chart, e, options, useFinalPosition) { - const position = getRelativePosition(e, chart); - const axis = options.axis || "xy"; - const includeInvisible = options.includeInvisible || false; - let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible); - if (items.length > 0) { - const datasetIndex = items[0].datasetIndex; - const data = chart.getDatasetMeta(datasetIndex).data; - items = []; - for (let i = 0; i < data.length; ++i) { - items.push({ - element: data[i], - datasetIndex, - index: i - }); - } - } - return items; - }, - point(chart, e, options, useFinalPosition) { - const position = getRelativePosition(e, chart); - const axis = options.axis || "xy"; - const includeInvisible = options.includeInvisible || false; - return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible); - }, - nearest(chart, e, options, useFinalPosition) { - const position = getRelativePosition(e, chart); - const axis = options.axis || "xy"; - const includeInvisible = options.includeInvisible || false; - return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible); - }, - x(chart, e, options, useFinalPosition) { - const position = getRelativePosition(e, chart); - return getAxisItems(chart, position, "x", options.intersect, useFinalPosition); - }, - y(chart, e, options, useFinalPosition) { - const position = getRelativePosition(e, chart); - return getAxisItems(chart, position, "y", options.intersect, useFinalPosition); - } - } -}; -var STATIC_POSITIONS = [ - "left", - "top", - "right", - "bottom" -]; -function filterByPosition(array, position) { - return array.filter((v) => v.pos === position); -} -function filterDynamicPositionByAxis(array, axis) { - return array.filter((v) => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis); -} -function sortByWeight(array, reverse) { - return array.sort((a, b) => { - const v0 = reverse ? b : a; - const v1 = reverse ? a : b; - return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight; - }); -} -function wrapBoxes(boxes) { - const layoutBoxes = []; - let i, ilen, box, pos, stack, stackWeight; - for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) { - box = boxes[i]; - ({ position: pos, options: { stack, stackWeight = 1 } } = box); - layoutBoxes.push({ - index: i, - box, - pos, - horizontal: box.isHorizontal(), - weight: box.weight, - stack: stack && pos + stack, - stackWeight - }); - } - return layoutBoxes; -} -function buildStacks(layouts2) { - const stacks = {}; - for (const wrap of layouts2) { - const { stack, pos, stackWeight } = wrap; - if (!stack || !STATIC_POSITIONS.includes(pos)) { - continue; - } - const _stack = stacks[stack] || (stacks[stack] = { - count: 0, - placed: 0, - weight: 0, - size: 0 - }); - _stack.count++; - _stack.weight += stackWeight; - } - return stacks; -} -function setLayoutDims(layouts2, params) { - const stacks = buildStacks(layouts2); - const { vBoxMaxWidth, hBoxMaxHeight } = params; - let i, ilen, layout; - for (i = 0, ilen = layouts2.length; i < ilen; ++i) { - layout = layouts2[i]; - const { fullSize } = layout.box; - const stack = stacks[layout.stack]; - const factor = stack && layout.stackWeight / stack.weight; - if (layout.horizontal) { - layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth; - layout.height = hBoxMaxHeight; - } else { - layout.width = vBoxMaxWidth; - layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight; - } - } - return stacks; -} -function buildLayoutBoxes(boxes) { - const layoutBoxes = wrapBoxes(boxes); - const fullSize = sortByWeight(layoutBoxes.filter((wrap) => wrap.box.fullSize), true); - const left = sortByWeight(filterByPosition(layoutBoxes, "left"), true); - const right = sortByWeight(filterByPosition(layoutBoxes, "right")); - const top = sortByWeight(filterByPosition(layoutBoxes, "top"), true); - const bottom = sortByWeight(filterByPosition(layoutBoxes, "bottom")); - const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, "x"); - const centerVertical = filterDynamicPositionByAxis(layoutBoxes, "y"); - return { - fullSize, - leftAndTop: left.concat(top), - rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal), - chartArea: filterByPosition(layoutBoxes, "chartArea"), - vertical: left.concat(right).concat(centerVertical), - horizontal: top.concat(bottom).concat(centerHorizontal) - }; -} -function getCombinedMax(maxPadding, chartArea, a, b) { - return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]); -} -function updateMaxPadding(maxPadding, boxPadding) { - maxPadding.top = Math.max(maxPadding.top, boxPadding.top); - maxPadding.left = Math.max(maxPadding.left, boxPadding.left); - maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom); - maxPadding.right = Math.max(maxPadding.right, boxPadding.right); -} -function updateDims(chartArea, params, layout, stacks) { - const { pos, box } = layout; - const maxPadding = chartArea.maxPadding; - if (!isObject(pos)) { - if (layout.size) { - chartArea[pos] -= layout.size; - } - const stack = stacks[layout.stack] || { - size: 0, - count: 1 - }; - stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width); - layout.size = stack.size / stack.count; - chartArea[pos] += layout.size; - } - if (box.getPadding) { - updateMaxPadding(maxPadding, box.getPadding()); - } - const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, "left", "right")); - const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, "top", "bottom")); - const widthChanged = newWidth !== chartArea.w; - const heightChanged = newHeight !== chartArea.h; - chartArea.w = newWidth; - chartArea.h = newHeight; - return layout.horizontal ? { - same: widthChanged, - other: heightChanged - } : { - same: heightChanged, - other: widthChanged - }; -} -function handleMaxPadding(chartArea) { - const maxPadding = chartArea.maxPadding; - function updatePos(pos) { - const change = Math.max(maxPadding[pos] - chartArea[pos], 0); - chartArea[pos] += change; - return change; - } - chartArea.y += updatePos("top"); - chartArea.x += updatePos("left"); - updatePos("right"); - updatePos("bottom"); -} -function getMargins(horizontal, chartArea) { - const maxPadding = chartArea.maxPadding; - function marginForPositions(positions2) { - const margin = { - left: 0, - top: 0, - right: 0, - bottom: 0 - }; - positions2.forEach((pos) => { - margin[pos] = Math.max(chartArea[pos], maxPadding[pos]); - }); - return margin; - } - return horizontal ? marginForPositions([ - "left", - "right" - ]) : marginForPositions([ - "top", - "bottom" - ]); -} -function fitBoxes(boxes, chartArea, params, stacks) { - const refitBoxes = []; - let i, ilen, layout, box, refit, changed; - for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) { - layout = boxes[i]; - box = layout.box; - box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea)); - const { same, other } = updateDims(chartArea, params, layout, stacks); - refit |= same && refitBoxes.length; - changed = changed || other; - if (!box.fullSize) { - refitBoxes.push(layout); - } - } - return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed; -} -function setBoxDims(box, left, top, width, height) { - box.top = top; - box.left = left; - box.right = left + width; - box.bottom = top + height; - box.width = width; - box.height = height; -} -function placeBoxes(boxes, chartArea, params, stacks) { - const userPadding = params.padding; - let { x, y } = chartArea; - for (const layout of boxes) { - const box = layout.box; - const stack = stacks[layout.stack] || { - count: 1, - placed: 0, - weight: 1 - }; - const weight = layout.stackWeight / stack.weight || 1; - if (layout.horizontal) { - const width = chartArea.w * weight; - const height = stack.size || box.height; - if (defined(stack.start)) { - y = stack.start; - } - if (box.fullSize) { - setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height); - } else { - setBoxDims(box, chartArea.left + stack.placed, y, width, height); - } - stack.start = y; - stack.placed += width; - y = box.bottom; - } else { - const height1 = chartArea.h * weight; - const width1 = stack.size || box.width; - if (defined(stack.start)) { - x = stack.start; - } - if (box.fullSize) { - setBoxDims(box, x, userPadding.top, width1, params.outerHeight - userPadding.bottom - userPadding.top); - } else { - setBoxDims(box, x, chartArea.top + stack.placed, width1, height1); - } - stack.start = x; - stack.placed += height1; - x = box.right; - } - } - chartArea.x = x; - chartArea.y = y; -} -var layouts = { - addBox(chart, item) { - if (!chart.boxes) { - chart.boxes = []; - } - item.fullSize = item.fullSize || false; - item.position = item.position || "top"; - item.weight = item.weight || 0; - item._layers = item._layers || function() { - return [ - { - z: 0, - draw(chartArea) { - item.draw(chartArea); - } - } - ]; - }; - chart.boxes.push(item); - }, - removeBox(chart, layoutItem) { - const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; - if (index !== -1) { - chart.boxes.splice(index, 1); - } - }, - configure(chart, item, options) { - item.fullSize = options.fullSize; - item.position = options.position; - item.weight = options.weight; - }, - update(chart, width, height, minPadding) { - if (!chart) { - return; - } - const padding = toPadding(chart.options.layout.padding); - const availableWidth = Math.max(width - padding.width, 0); - const availableHeight = Math.max(height - padding.height, 0); - const boxes = buildLayoutBoxes(chart.boxes); - const verticalBoxes = boxes.vertical; - const horizontalBoxes = boxes.horizontal; - each(chart.boxes, (box) => { - if (typeof box.beforeLayout === "function") { - box.beforeLayout(); - } - }); - const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) => wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1; - const params = Object.freeze({ - outerWidth: width, - outerHeight: height, - padding, - availableWidth, - availableHeight, - vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount, - hBoxMaxHeight: availableHeight / 2 - }); - const maxPadding = Object.assign({}, padding); - updateMaxPadding(maxPadding, toPadding(minPadding)); - const chartArea = Object.assign({ - maxPadding, - w: availableWidth, - h: availableHeight, - x: padding.left, - y: padding.top - }, padding); - const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params); - fitBoxes(boxes.fullSize, chartArea, params, stacks); - fitBoxes(verticalBoxes, chartArea, params, stacks); - if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) { - fitBoxes(verticalBoxes, chartArea, params, stacks); - } - handleMaxPadding(chartArea); - placeBoxes(boxes.leftAndTop, chartArea, params, stacks); - chartArea.x += chartArea.w; - chartArea.y += chartArea.h; - placeBoxes(boxes.rightAndBottom, chartArea, params, stacks); - chart.chartArea = { - left: chartArea.left, - top: chartArea.top, - right: chartArea.left + chartArea.w, - bottom: chartArea.top + chartArea.h, - height: chartArea.h, - width: chartArea.w - }; - each(boxes.chartArea, (layout) => { - const box = layout.box; - Object.assign(box, chart.chartArea); - box.update(chartArea.w, chartArea.h, { - left: 0, - top: 0, - right: 0, - bottom: 0 - }); - }); - } -}; -var BasePlatform = class { - acquireContext(canvas, aspectRatio) { - } - releaseContext(context) { - return false; - } - addEventListener(chart, type, listener) { - } - removeEventListener(chart, type, listener) { - } - getDevicePixelRatio() { - return 1; - } - getMaximumSize(element, width, height, aspectRatio) { - width = Math.max(0, width || element.width); - height = height || element.height; - return { - width, - height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height) - }; - } - isAttached(canvas) { - return true; - } - updateConfig(config) { - } -}; -var BasicPlatform = class extends BasePlatform { - acquireContext(item) { - return item && item.getContext && item.getContext("2d") || null; - } - updateConfig(config) { - config.options.animation = false; - } -}; -var EXPANDO_KEY = "$chartjs"; -var EVENT_TYPES = { - touchstart: "mousedown", - touchmove: "mousemove", - touchend: "mouseup", - pointerenter: "mouseenter", - pointerdown: "mousedown", - pointermove: "mousemove", - pointerup: "mouseup", - pointerleave: "mouseout", - pointerout: "mouseout" -}; -var isNullOrEmpty = (value) => value === null || value === ""; -function initCanvas(canvas, aspectRatio) { - const style = canvas.style; - const renderHeight = canvas.getAttribute("height"); - const renderWidth = canvas.getAttribute("width"); - canvas[EXPANDO_KEY] = { - initial: { - height: renderHeight, - width: renderWidth, - style: { - display: style.display, - height: style.height, - width: style.width - } - } - }; - style.display = style.display || "block"; - style.boxSizing = style.boxSizing || "border-box"; - if (isNullOrEmpty(renderWidth)) { - const displayWidth = readUsedSize(canvas, "width"); - if (displayWidth !== void 0) { - canvas.width = displayWidth; - } - } - if (isNullOrEmpty(renderHeight)) { - if (canvas.style.height === "") { - canvas.height = canvas.width / (aspectRatio || 2); - } else { - const displayHeight = readUsedSize(canvas, "height"); - if (displayHeight !== void 0) { - canvas.height = displayHeight; - } - } - } - return canvas; -} -var eventListenerOptions = supportsEventListenerOptions ? { - passive: true -} : false; -function addListener(node, type, listener) { - node.addEventListener(type, listener, eventListenerOptions); -} -function removeListener(chart, type, listener) { - chart.canvas.removeEventListener(type, listener, eventListenerOptions); -} -function fromNativeEvent(event, chart) { - const type = EVENT_TYPES[event.type] || event.type; - const { x, y } = getRelativePosition(event, chart); - return { - type, - chart, - native: event, - x: x !== void 0 ? x : null, - y: y !== void 0 ? y : null - }; -} -function nodeListContains(nodeList, canvas) { - for (const node of nodeList) { - if (node === canvas || node.contains(canvas)) { - return true; - } - } -} -function createAttachObserver(chart, type, listener) { - const canvas = chart.canvas; - const observer = new MutationObserver((entries) => { - let trigger = false; - for (const entry of entries) { - trigger = trigger || nodeListContains(entry.addedNodes, canvas); - trigger = trigger && !nodeListContains(entry.removedNodes, canvas); - } - if (trigger) { - listener(); - } - }); - observer.observe(document, { - childList: true, - subtree: true - }); - return observer; -} -function createDetachObserver(chart, type, listener) { - const canvas = chart.canvas; - const observer = new MutationObserver((entries) => { - let trigger = false; - for (const entry of entries) { - trigger = trigger || nodeListContains(entry.removedNodes, canvas); - trigger = trigger && !nodeListContains(entry.addedNodes, canvas); - } - if (trigger) { - listener(); - } - }); - observer.observe(document, { - childList: true, - subtree: true - }); - return observer; -} -var drpListeningCharts = /* @__PURE__ */ new Map(); -var oldDevicePixelRatio = 0; -function onWindowResize() { - const dpr = window.devicePixelRatio; - if (dpr === oldDevicePixelRatio) { - return; - } - oldDevicePixelRatio = dpr; - drpListeningCharts.forEach((resize, chart) => { - if (chart.currentDevicePixelRatio !== dpr) { - resize(); - } - }); -} -function listenDevicePixelRatioChanges(chart, resize) { - if (!drpListeningCharts.size) { - window.addEventListener("resize", onWindowResize); - } - drpListeningCharts.set(chart, resize); -} -function unlistenDevicePixelRatioChanges(chart) { - drpListeningCharts.delete(chart); - if (!drpListeningCharts.size) { - window.removeEventListener("resize", onWindowResize); - } -} -function createResizeObserver(chart, type, listener) { - const canvas = chart.canvas; - const container = canvas && _getParentNode(canvas); - if (!container) { - return; - } - const resize = throttled((width, height) => { - const w = container.clientWidth; - listener(width, height); - if (w < container.clientWidth) { - listener(); - } - }, window); - const observer = new ResizeObserver((entries) => { - const entry = entries[0]; - const width = entry.contentRect.width; - const height = entry.contentRect.height; - if (width === 0 && height === 0) { - return; - } - resize(width, height); - }); - observer.observe(container); - listenDevicePixelRatioChanges(chart, resize); - return observer; -} -function releaseObserver(chart, type, observer) { - if (observer) { - observer.disconnect(); - } - if (type === "resize") { - unlistenDevicePixelRatioChanges(chart); - } -} -function createProxyAndListen(chart, type, listener) { - const canvas = chart.canvas; - const proxy = throttled((event) => { - if (chart.ctx !== null) { - listener(fromNativeEvent(event, chart)); - } - }, chart); - addListener(canvas, type, proxy); - return proxy; -} -var DomPlatform = class extends BasePlatform { - acquireContext(canvas, aspectRatio) { - const context = canvas && canvas.getContext && canvas.getContext("2d"); - if (context && context.canvas === canvas) { - initCanvas(canvas, aspectRatio); - return context; - } - return null; - } - releaseContext(context) { - const canvas = context.canvas; - if (!canvas[EXPANDO_KEY]) { - return false; - } - const initial = canvas[EXPANDO_KEY].initial; - [ - "height", - "width" - ].forEach((prop) => { - const value = initial[prop]; - if (isNullOrUndef(value)) { - canvas.removeAttribute(prop); - } else { - canvas.setAttribute(prop, value); - } - }); - const style = initial.style || {}; - Object.keys(style).forEach((key) => { - canvas.style[key] = style[key]; - }); - canvas.width = canvas.width; - delete canvas[EXPANDO_KEY]; - return true; - } - addEventListener(chart, type, listener) { - this.removeEventListener(chart, type); - const proxies = chart.$proxies || (chart.$proxies = {}); - const handlers = { - attach: createAttachObserver, - detach: createDetachObserver, - resize: createResizeObserver - }; - const handler = handlers[type] || createProxyAndListen; - proxies[type] = handler(chart, type, listener); - } - removeEventListener(chart, type) { - const proxies = chart.$proxies || (chart.$proxies = {}); - const proxy = proxies[type]; - if (!proxy) { - return; - } - const handlers = { - attach: releaseObserver, - detach: releaseObserver, - resize: releaseObserver - }; - const handler = handlers[type] || removeListener; - handler(chart, type, proxy); - proxies[type] = void 0; - } - getDevicePixelRatio() { - return window.devicePixelRatio; - } - getMaximumSize(canvas, width, height, aspectRatio) { - return getMaximumSize(canvas, width, height, aspectRatio); - } - isAttached(canvas) { - const container = _getParentNode(canvas); - return !!(container && container.isConnected); - } -}; -function _detectPlatform(canvas) { - if (!_isDomSupported() || typeof OffscreenCanvas !== "undefined" && canvas instanceof OffscreenCanvas) { - return BasicPlatform; - } - return DomPlatform; -} -var Element = class { - constructor() { - __publicField(this, "active", false); - } - tooltipPosition(useFinalPosition) { - const { x, y } = this.getProps([ - "x", - "y" - ], useFinalPosition); - return { - x, - y - }; - } - hasValue() { - return isNumber(this.x) && isNumber(this.y); - } - getProps(props, final) { - const anims = this.$animations; - if (!final || !anims) { - return this; - } - const ret = {}; - props.forEach((prop) => { - ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop]; - }); - return ret; - } -}; -__publicField(Element, "defaults", {}); -__publicField(Element, "defaultRoutes"); -function autoSkip(scale, ticks) { - const tickOpts = scale.options.ticks; - const determinedMaxTicks = determineMaxTicks(scale); - const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks); - const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : []; - const numMajorIndices = majorIndices.length; - const first = majorIndices[0]; - const last = majorIndices[numMajorIndices - 1]; - const newTicks = []; - if (numMajorIndices > ticksLimit) { - skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit); - return newTicks; - } - const spacing = calculateSpacing(majorIndices, ticks, ticksLimit); - if (numMajorIndices > 0) { - let i, ilen; - const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null; - skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first); - for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) { - skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]); - } - skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing); - return newTicks; - } - skip(ticks, newTicks, spacing); - return newTicks; -} -function determineMaxTicks(scale) { - const offset = scale.options.offset; - const tickLength = scale._tickSize(); - const maxScale = scale._length / tickLength + (offset ? 0 : 1); - const maxChart = scale._maxLength / tickLength; - return Math.floor(Math.min(maxScale, maxChart)); -} -function calculateSpacing(majorIndices, ticks, ticksLimit) { - const evenMajorSpacing = getEvenSpacing(majorIndices); - const spacing = ticks.length / ticksLimit; - if (!evenMajorSpacing) { - return Math.max(spacing, 1); - } - const factors = _factorize(evenMajorSpacing); - for (let i = 0, ilen = factors.length - 1; i < ilen; i++) { - const factor = factors[i]; - if (factor > spacing) { - return factor; - } - } - return Math.max(spacing, 1); -} -function getMajorIndices(ticks) { - const result = []; - let i, ilen; - for (i = 0, ilen = ticks.length; i < ilen; i++) { - if (ticks[i].major) { - result.push(i); - } - } - return result; -} -function skipMajors(ticks, newTicks, majorIndices, spacing) { - let count = 0; - let next = majorIndices[0]; - let i; - spacing = Math.ceil(spacing); - for (i = 0; i < ticks.length; i++) { - if (i === next) { - newTicks.push(ticks[i]); - count++; - next = majorIndices[count * spacing]; - } - } -} -function skip(ticks, newTicks, spacing, majorStart, majorEnd) { - const start = valueOrDefault(majorStart, 0); - const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length); - let count = 0; - let length, i, next; - spacing = Math.ceil(spacing); - if (majorEnd) { - length = majorEnd - majorStart; - spacing = length / Math.floor(length / spacing); - } - next = start; - while (next < 0) { - count++; - next = Math.round(start + count * spacing); - } - for (i = Math.max(start, 0); i < end; i++) { - if (i === next) { - newTicks.push(ticks[i]); - count++; - next = Math.round(start + count * spacing); - } - } -} -function getEvenSpacing(arr) { - const len = arr.length; - let i, diff; - if (len < 2) { - return false; - } - for (diff = arr[0], i = 1; i < len; ++i) { - if (arr[i] - arr[i - 1] !== diff) { - return false; - } - } - return diff; -} -var reverseAlign = (align) => align === "left" ? "right" : align === "right" ? "left" : align; -var offsetFromEdge = (scale, edge, offset) => edge === "top" || edge === "left" ? scale[edge] + offset : scale[edge] - offset; -var getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength); -function sample(arr, numItems) { - const result = []; - const increment = arr.length / numItems; - const len = arr.length; - let i = 0; - for (; i < len; i += increment) { - result.push(arr[Math.floor(i)]); - } - return result; -} -function getPixelForGridLine(scale, index, offsetGridLines) { - const length = scale.ticks.length; - const validIndex2 = Math.min(index, length - 1); - const start = scale._startPixel; - const end = scale._endPixel; - const epsilon = 1e-6; - let lineValue = scale.getPixelForTick(validIndex2); - let offset; - if (offsetGridLines) { - if (length === 1) { - offset = Math.max(lineValue - start, end - lineValue); - } else if (index === 0) { - offset = (scale.getPixelForTick(1) - lineValue) / 2; - } else { - offset = (lineValue - scale.getPixelForTick(validIndex2 - 1)) / 2; - } - lineValue += validIndex2 < index ? offset : -offset; - if (lineValue < start - epsilon || lineValue > end + epsilon) { - return; - } - } - return lineValue; -} -function garbageCollect(caches, length) { - each(caches, (cache) => { - const gc = cache.gc; - const gcLen = gc.length / 2; - let i; - if (gcLen > length) { - for (i = 0; i < gcLen; ++i) { - delete cache.data[gc[i]]; - } - gc.splice(0, gcLen); - } - }); -} -function getTickMarkLength(options) { - return options.drawTicks ? options.tickLength : 0; -} -function getTitleHeight(options, fallback) { - if (!options.display) { - return 0; - } - const font = toFont(options.font, fallback); - const padding = toPadding(options.padding); - const lines = isArray(options.text) ? options.text.length : 1; - return lines * font.lineHeight + padding.height; -} -function createScaleContext(parent, scale) { - return createContext(parent, { - scale, - type: "scale" - }); -} -function createTickContext(parent, index, tick) { - return createContext(parent, { - tick, - index, - type: "tick" - }); -} -function titleAlign(align, position, reverse) { - let ret = _toLeftRightCenter(align); - if (reverse && position !== "right" || !reverse && position === "right") { - ret = reverseAlign(ret); - } - return ret; -} -function titleArgs(scale, offset, position, align) { - const { top, left, bottom, right, chart } = scale; - const { chartArea, scales } = chart; - let rotation = 0; - let maxWidth, titleX, titleY; - const height = bottom - top; - const width = right - left; - if (scale.isHorizontal()) { - titleX = _alignStartEnd(align, left, right); - if (isObject(position)) { - const positionAxisID = Object.keys(position)[0]; - const value = position[positionAxisID]; - titleY = scales[positionAxisID].getPixelForValue(value) + height - offset; - } else if (position === "center") { - titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset; - } else { - titleY = offsetFromEdge(scale, position, offset); - } - maxWidth = right - left; - } else { - if (isObject(position)) { - const positionAxisID1 = Object.keys(position)[0]; - const value1 = position[positionAxisID1]; - titleX = scales[positionAxisID1].getPixelForValue(value1) - width + offset; - } else if (position === "center") { - titleX = (chartArea.left + chartArea.right) / 2 - width + offset; - } else { - titleX = offsetFromEdge(scale, position, offset); - } - titleY = _alignStartEnd(align, bottom, top); - rotation = position === "left" ? -HALF_PI : HALF_PI; - } - return { - titleX, - titleY, - maxWidth, - rotation - }; -} -var Scale = class extends Element { - constructor(cfg) { - super(); - this.id = cfg.id; - this.type = cfg.type; - this.options = void 0; - this.ctx = cfg.ctx; - this.chart = cfg.chart; - this.top = void 0; - this.bottom = void 0; - this.left = void 0; - this.right = void 0; - this.width = void 0; - this.height = void 0; - this._margins = { - left: 0, - right: 0, - top: 0, - bottom: 0 - }; - this.maxWidth = void 0; - this.maxHeight = void 0; - this.paddingTop = void 0; - this.paddingBottom = void 0; - this.paddingLeft = void 0; - this.paddingRight = void 0; - this.axis = void 0; - this.labelRotation = void 0; - this.min = void 0; - this.max = void 0; - this._range = void 0; - this.ticks = []; - this._gridLineItems = null; - this._labelItems = null; - this._labelSizes = null; - this._length = 0; - this._maxLength = 0; - this._longestTextCache = {}; - this._startPixel = void 0; - this._endPixel = void 0; - this._reversePixels = false; - this._userMax = void 0; - this._userMin = void 0; - this._suggestedMax = void 0; - this._suggestedMin = void 0; - this._ticksLength = 0; - this._borderValue = 0; - this._cache = {}; - this._dataLimitsCached = false; - this.$context = void 0; - } - init(options) { - this.options = options.setContext(this.getContext()); - this.axis = options.axis; - this._userMin = this.parse(options.min); - this._userMax = this.parse(options.max); - this._suggestedMin = this.parse(options.suggestedMin); - this._suggestedMax = this.parse(options.suggestedMax); - } - parse(raw, index) { - return raw; - } - getUserBounds() { - let { _userMin, _userMax, _suggestedMin, _suggestedMax } = this; - _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY); - _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY); - _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY); - _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY); - return { - min: finiteOrDefault(_userMin, _suggestedMin), - max: finiteOrDefault(_userMax, _suggestedMax), - minDefined: isNumberFinite(_userMin), - maxDefined: isNumberFinite(_userMax) - }; - } - getMinMax(canStack) { - let { min, max, minDefined, maxDefined } = this.getUserBounds(); - let range; - if (minDefined && maxDefined) { - return { - min, - max - }; - } - const metas = this.getMatchingVisibleMetas(); - for (let i = 0, ilen = metas.length; i < ilen; ++i) { - range = metas[i].controller.getMinMax(this, canStack); - if (!minDefined) { - min = Math.min(min, range.min); - } - if (!maxDefined) { - max = Math.max(max, range.max); - } - } - min = maxDefined && min > max ? max : min; - max = minDefined && min > max ? min : max; - return { - min: finiteOrDefault(min, finiteOrDefault(max, min)), - max: finiteOrDefault(max, finiteOrDefault(min, max)) - }; - } - getPadding() { - return { - left: this.paddingLeft || 0, - top: this.paddingTop || 0, - right: this.paddingRight || 0, - bottom: this.paddingBottom || 0 - }; - } - getTicks() { - return this.ticks; - } - getLabels() { - const data = this.chart.data; - return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || []; - } - getLabelItems(chartArea = this.chart.chartArea) { - const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea)); - return items; - } - beforeLayout() { - this._cache = {}; - this._dataLimitsCached = false; - } - beforeUpdate() { - callback(this.options.beforeUpdate, [ - this - ]); - } - update(maxWidth, maxHeight, margins) { - const { beginAtZero, grace, ticks: tickOpts } = this.options; - const sampleSize = tickOpts.sampleSize; - this.beforeUpdate(); - this.maxWidth = maxWidth; - this.maxHeight = maxHeight; - this._margins = margins = Object.assign({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, margins); - this.ticks = null; - this._labelSizes = null; - this._gridLineItems = null; - this._labelItems = null; - this.beforeSetDimensions(); - this.setDimensions(); - this.afterSetDimensions(); - this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom; - if (!this._dataLimitsCached) { - this.beforeDataLimits(); - this.determineDataLimits(); - this.afterDataLimits(); - this._range = _addGrace(this, grace, beginAtZero); - this._dataLimitsCached = true; - } - this.beforeBuildTicks(); - this.ticks = this.buildTicks() || []; - this.afterBuildTicks(); - const samplingEnabled = sampleSize < this.ticks.length; - this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks); - this.configure(); - this.beforeCalculateLabelRotation(); - this.calculateLabelRotation(); - this.afterCalculateLabelRotation(); - if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === "auto")) { - this.ticks = autoSkip(this, this.ticks); - this._labelSizes = null; - this.afterAutoSkip(); - } - if (samplingEnabled) { - this._convertTicksToLabels(this.ticks); - } - this.beforeFit(); - this.fit(); - this.afterFit(); - this.afterUpdate(); - } - configure() { - let reversePixels = this.options.reverse; - let startPixel, endPixel; - if (this.isHorizontal()) { - startPixel = this.left; - endPixel = this.right; - } else { - startPixel = this.top; - endPixel = this.bottom; - reversePixels = !reversePixels; - } - this._startPixel = startPixel; - this._endPixel = endPixel; - this._reversePixels = reversePixels; - this._length = endPixel - startPixel; - this._alignToPixels = this.options.alignToPixels; - } - afterUpdate() { - callback(this.options.afterUpdate, [ - this - ]); - } - beforeSetDimensions() { - callback(this.options.beforeSetDimensions, [ - this - ]); - } - setDimensions() { - if (this.isHorizontal()) { - this.width = this.maxWidth; - this.left = 0; - this.right = this.width; - } else { - this.height = this.maxHeight; - this.top = 0; - this.bottom = this.height; - } - this.paddingLeft = 0; - this.paddingTop = 0; - this.paddingRight = 0; - this.paddingBottom = 0; - } - afterSetDimensions() { - callback(this.options.afterSetDimensions, [ - this - ]); - } - _callHooks(name2) { - this.chart.notifyPlugins(name2, this.getContext()); - callback(this.options[name2], [ - this - ]); - } - beforeDataLimits() { - this._callHooks("beforeDataLimits"); - } - determineDataLimits() { - } - afterDataLimits() { - this._callHooks("afterDataLimits"); - } - beforeBuildTicks() { - this._callHooks("beforeBuildTicks"); - } - buildTicks() { - return []; - } - afterBuildTicks() { - this._callHooks("afterBuildTicks"); - } - beforeTickToLabelConversion() { - callback(this.options.beforeTickToLabelConversion, [ - this - ]); - } - generateTickLabels(ticks) { - const tickOpts = this.options.ticks; - let i, ilen, tick; - for (i = 0, ilen = ticks.length; i < ilen; i++) { - tick = ticks[i]; - tick.label = callback(tickOpts.callback, [ - tick.value, - i, - ticks - ], this); - } - } - afterTickToLabelConversion() { - callback(this.options.afterTickToLabelConversion, [ - this - ]); - } - beforeCalculateLabelRotation() { - callback(this.options.beforeCalculateLabelRotation, [ - this - ]); - } - calculateLabelRotation() { - const options = this.options; - const tickOpts = options.ticks; - const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit); - const minRotation = tickOpts.minRotation || 0; - const maxRotation = tickOpts.maxRotation; - let labelRotation = minRotation; - let tickWidth, maxHeight, maxLabelDiagonal; - if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) { - this.labelRotation = minRotation; - return; - } - const labelSizes = this._getLabelSizes(); - const maxLabelWidth = labelSizes.widest.width; - const maxLabelHeight = labelSizes.highest.height; - const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth); - tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1); - if (maxLabelWidth + 6 > tickWidth) { - tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1)); - maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font); - maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight); - labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1)))); - labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation)); - } - this.labelRotation = labelRotation; - } - afterCalculateLabelRotation() { - callback(this.options.afterCalculateLabelRotation, [ - this - ]); - } - afterAutoSkip() { - } - beforeFit() { - callback(this.options.beforeFit, [ - this - ]); - } - fit() { - const minSize = { - width: 0, - height: 0 - }; - const { chart, options: { ticks: tickOpts, title: titleOpts, grid: gridOpts } } = this; - const display = this._isVisible(); - const isHorizontal = this.isHorizontal(); - if (display) { - const titleHeight = getTitleHeight(titleOpts, chart.options.font); - if (isHorizontal) { - minSize.width = this.maxWidth; - minSize.height = getTickMarkLength(gridOpts) + titleHeight; - } else { - minSize.height = this.maxHeight; - minSize.width = getTickMarkLength(gridOpts) + titleHeight; - } - if (tickOpts.display && this.ticks.length) { - const { first, last, widest, highest } = this._getLabelSizes(); - const tickPadding = tickOpts.padding * 2; - const angleRadians = toRadians(this.labelRotation); - const cos = Math.cos(angleRadians); - const sin = Math.sin(angleRadians); - if (isHorizontal) { - const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height; - minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding); - } else { - const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height; - minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding); - } - this._calculatePadding(first, last, sin, cos); - } - } - this._handleMargins(); - if (isHorizontal) { - this.width = this._length = chart.width - this._margins.left - this._margins.right; - this.height = minSize.height; - } else { - this.width = minSize.width; - this.height = this._length = chart.height - this._margins.top - this._margins.bottom; - } - } - _calculatePadding(first, last, sin, cos) { - const { ticks: { align, padding }, position } = this.options; - const isRotated = this.labelRotation !== 0; - const labelsBelowTicks = position !== "top" && this.axis === "x"; - if (this.isHorizontal()) { - const offsetLeft = this.getPixelForTick(0) - this.left; - const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1); - let paddingLeft = 0; - let paddingRight = 0; - if (isRotated) { - if (labelsBelowTicks) { - paddingLeft = cos * first.width; - paddingRight = sin * last.height; - } else { - paddingLeft = sin * first.height; - paddingRight = cos * last.width; - } - } else if (align === "start") { - paddingRight = last.width; - } else if (align === "end") { - paddingLeft = first.width; - } else if (align !== "inner") { - paddingLeft = first.width / 2; - paddingRight = last.width / 2; - } - this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0); - this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0); - } else { - let paddingTop = last.height / 2; - let paddingBottom = first.height / 2; - if (align === "start") { - paddingTop = 0; - paddingBottom = first.height; - } else if (align === "end") { - paddingTop = last.height; - paddingBottom = 0; - } - this.paddingTop = paddingTop + padding; - this.paddingBottom = paddingBottom + padding; - } - } - _handleMargins() { - if (this._margins) { - this._margins.left = Math.max(this.paddingLeft, this._margins.left); - this._margins.top = Math.max(this.paddingTop, this._margins.top); - this._margins.right = Math.max(this.paddingRight, this._margins.right); - this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom); - } - } - afterFit() { - callback(this.options.afterFit, [ - this - ]); - } - isHorizontal() { - const { axis, position } = this.options; - return position === "top" || position === "bottom" || axis === "x"; - } - isFullSize() { - return this.options.fullSize; - } - _convertTicksToLabels(ticks) { - this.beforeTickToLabelConversion(); - this.generateTickLabels(ticks); - let i, ilen; - for (i = 0, ilen = ticks.length; i < ilen; i++) { - if (isNullOrUndef(ticks[i].label)) { - ticks.splice(i, 1); - ilen--; - i--; - } - } - this.afterTickToLabelConversion(); - } - _getLabelSizes() { - let labelSizes = this._labelSizes; - if (!labelSizes) { - const sampleSize = this.options.ticks.sampleSize; - let ticks = this.ticks; - if (sampleSize < ticks.length) { - ticks = sample(ticks, sampleSize); - } - this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit); - } - return labelSizes; - } - _computeLabelSizes(ticks, length, maxTicksLimit) { - const { ctx, _longestTextCache: caches } = this; - const widths = []; - const heights = []; - const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit)); - let widestLabelSize = 0; - let highestLabelSize = 0; - let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel; - for (i = 0; i < length; i += increment) { - label = ticks[i].label; - tickFont = this._resolveTickFontOptions(i); - ctx.font = fontString = tickFont.string; - cache = caches[fontString] = caches[fontString] || { - data: {}, - gc: [] - }; - lineHeight = tickFont.lineHeight; - width = height = 0; - if (!isNullOrUndef(label) && !isArray(label)) { - width = _measureText(ctx, cache.data, cache.gc, width, label); - height = lineHeight; - } else if (isArray(label)) { - for (j = 0, jlen = label.length; j < jlen; ++j) { - nestedLabel = label[j]; - if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) { - width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel); - height += lineHeight; - } - } - } - widths.push(width); - heights.push(height); - widestLabelSize = Math.max(width, widestLabelSize); - highestLabelSize = Math.max(height, highestLabelSize); - } - garbageCollect(caches, length); - const widest = widths.indexOf(widestLabelSize); - const highest = heights.indexOf(highestLabelSize); - const valueAt = (idx) => ({ - width: widths[idx] || 0, - height: heights[idx] || 0 - }); - return { - first: valueAt(0), - last: valueAt(length - 1), - widest: valueAt(widest), - highest: valueAt(highest), - widths, - heights - }; - } - getLabelForValue(value) { - return value; - } - getPixelForValue(value, index) { - return NaN; - } - getValueForPixel(pixel) { - } - getPixelForTick(index) { - const ticks = this.ticks; - if (index < 0 || index > ticks.length - 1) { - return null; - } - return this.getPixelForValue(ticks[index].value); - } - getPixelForDecimal(decimal) { - if (this._reversePixels) { - decimal = 1 - decimal; - } - const pixel = this._startPixel + decimal * this._length; - return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel); - } - getDecimalForPixel(pixel) { - const decimal = (pixel - this._startPixel) / this._length; - return this._reversePixels ? 1 - decimal : decimal; - } - getBasePixel() { - return this.getPixelForValue(this.getBaseValue()); - } - getBaseValue() { - const { min, max } = this; - return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0; - } - getContext(index) { - const ticks = this.ticks || []; - if (index >= 0 && index < ticks.length) { - const tick = ticks[index]; - return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick)); - } - return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this)); - } - _tickSize() { - const optionTicks = this.options.ticks; - const rot = toRadians(this.labelRotation); - const cos = Math.abs(Math.cos(rot)); - const sin = Math.abs(Math.sin(rot)); - const labelSizes = this._getLabelSizes(); - const padding = optionTicks.autoSkipPadding || 0; - const w = labelSizes ? labelSizes.widest.width + padding : 0; - const h4 = labelSizes ? labelSizes.highest.height + padding : 0; - return this.isHorizontal() ? h4 * cos > w * sin ? w / cos : h4 / sin : h4 * sin < w * cos ? h4 / cos : w / sin; - } - _isVisible() { - const display = this.options.display; - if (display !== "auto") { - return !!display; - } - return this.getMatchingVisibleMetas().length > 0; - } - _computeGridLineItems(chartArea) { - const axis = this.axis; - const chart = this.chart; - const options = this.options; - const { grid, position, border } = options; - const offset = grid.offset; - const isHorizontal = this.isHorizontal(); - const ticks = this.ticks; - const ticksLength = ticks.length + (offset ? 1 : 0); - const tl = getTickMarkLength(grid); - const items = []; - const borderOpts = border.setContext(this.getContext()); - const axisWidth = borderOpts.display ? borderOpts.width : 0; - const axisHalfWidth = axisWidth / 2; - const alignBorderValue = function(pixel) { - return _alignPixel(chart, pixel, axisWidth); - }; - let borderValue, i, lineValue, alignedLineValue; - let tx1, ty1, tx2, ty2, x1, y1, x2, y2; - if (position === "top") { - borderValue = alignBorderValue(this.bottom); - ty1 = this.bottom - tl; - ty2 = borderValue - axisHalfWidth; - y1 = alignBorderValue(chartArea.top) + axisHalfWidth; - y2 = chartArea.bottom; - } else if (position === "bottom") { - borderValue = alignBorderValue(this.top); - y1 = chartArea.top; - y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth; - ty1 = borderValue + axisHalfWidth; - ty2 = this.top + tl; - } else if (position === "left") { - borderValue = alignBorderValue(this.right); - tx1 = this.right - tl; - tx2 = borderValue - axisHalfWidth; - x1 = alignBorderValue(chartArea.left) + axisHalfWidth; - x2 = chartArea.right; - } else if (position === "right") { - borderValue = alignBorderValue(this.left); - x1 = chartArea.left; - x2 = alignBorderValue(chartArea.right) - axisHalfWidth; - tx1 = borderValue + axisHalfWidth; - tx2 = this.left + tl; - } else if (axis === "x") { - if (position === "center") { - borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5); - } else if (isObject(position)) { - const positionAxisID = Object.keys(position)[0]; - const value = position[positionAxisID]; - borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value)); - } - y1 = chartArea.top; - y2 = chartArea.bottom; - ty1 = borderValue + axisHalfWidth; - ty2 = ty1 + tl; - } else if (axis === "y") { - if (position === "center") { - borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2); - } else if (isObject(position)) { - const positionAxisID1 = Object.keys(position)[0]; - const value1 = position[positionAxisID1]; - borderValue = alignBorderValue(this.chart.scales[positionAxisID1].getPixelForValue(value1)); - } - tx1 = borderValue - axisHalfWidth; - tx2 = tx1 - tl; - x1 = chartArea.left; - x2 = chartArea.right; - } - const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength); - const step = Math.max(1, Math.ceil(ticksLength / limit)); - for (i = 0; i < ticksLength; i += step) { - const context = this.getContext(i); - const optsAtIndex = grid.setContext(context); - const optsAtIndexBorder = border.setContext(context); - const lineWidth = optsAtIndex.lineWidth; - const lineColor = optsAtIndex.color; - const borderDash = optsAtIndexBorder.dash || []; - const borderDashOffset = optsAtIndexBorder.dashOffset; - const tickWidth = optsAtIndex.tickWidth; - const tickColor = optsAtIndex.tickColor; - const tickBorderDash = optsAtIndex.tickBorderDash || []; - const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset; - lineValue = getPixelForGridLine(this, i, offset); - if (lineValue === void 0) { - continue; - } - alignedLineValue = _alignPixel(chart, lineValue, lineWidth); - if (isHorizontal) { - tx1 = tx2 = x1 = x2 = alignedLineValue; - } else { - ty1 = ty2 = y1 = y2 = alignedLineValue; - } - items.push({ - tx1, - ty1, - tx2, - ty2, - x1, - y1, - x2, - y2, - width: lineWidth, - color: lineColor, - borderDash, - borderDashOffset, - tickWidth, - tickColor, - tickBorderDash, - tickBorderDashOffset - }); - } - this._ticksLength = ticksLength; - this._borderValue = borderValue; - return items; - } - _computeLabelItems(chartArea) { - const axis = this.axis; - const options = this.options; - const { position, ticks: optionTicks } = options; - const isHorizontal = this.isHorizontal(); - const ticks = this.ticks; - const { align, crossAlign, padding, mirror } = optionTicks; - const tl = getTickMarkLength(options.grid); - const tickAndPadding = tl + padding; - const hTickAndPadding = mirror ? -padding : tickAndPadding; - const rotation = -toRadians(this.labelRotation); - const items = []; - let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset; - let textBaseline = "middle"; - if (position === "top") { - y = this.bottom - hTickAndPadding; - textAlign = this._getXAxisLabelAlignment(); - } else if (position === "bottom") { - y = this.top + hTickAndPadding; - textAlign = this._getXAxisLabelAlignment(); - } else if (position === "left") { - const ret = this._getYAxisLabelAlignment(tl); - textAlign = ret.textAlign; - x = ret.x; - } else if (position === "right") { - const ret1 = this._getYAxisLabelAlignment(tl); - textAlign = ret1.textAlign; - x = ret1.x; - } else if (axis === "x") { - if (position === "center") { - y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding; - } else if (isObject(position)) { - const positionAxisID = Object.keys(position)[0]; - const value = position[positionAxisID]; - y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding; - } - textAlign = this._getXAxisLabelAlignment(); - } else if (axis === "y") { - if (position === "center") { - x = (chartArea.left + chartArea.right) / 2 - tickAndPadding; - } else if (isObject(position)) { - const positionAxisID1 = Object.keys(position)[0]; - const value1 = position[positionAxisID1]; - x = this.chart.scales[positionAxisID1].getPixelForValue(value1); - } - textAlign = this._getYAxisLabelAlignment(tl).textAlign; - } - if (axis === "y") { - if (align === "start") { - textBaseline = "top"; - } else if (align === "end") { - textBaseline = "bottom"; - } - } - const labelSizes = this._getLabelSizes(); - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - tick = ticks[i]; - label = tick.label; - const optsAtIndex = optionTicks.setContext(this.getContext(i)); - pixel = this.getPixelForTick(i) + optionTicks.labelOffset; - font = this._resolveTickFontOptions(i); - lineHeight = font.lineHeight; - lineCount = isArray(label) ? label.length : 1; - const halfCount = lineCount / 2; - const color2 = optsAtIndex.color; - const strokeColor = optsAtIndex.textStrokeColor; - const strokeWidth = optsAtIndex.textStrokeWidth; - let tickTextAlign = textAlign; - if (isHorizontal) { - x = pixel; - if (textAlign === "inner") { - if (i === ilen - 1) { - tickTextAlign = !this.options.reverse ? "right" : "left"; - } else if (i === 0) { - tickTextAlign = !this.options.reverse ? "left" : "right"; - } else { - tickTextAlign = "center"; - } - } - if (position === "top") { - if (crossAlign === "near" || rotation !== 0) { - textOffset = -lineCount * lineHeight + lineHeight / 2; - } else if (crossAlign === "center") { - textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight; - } else { - textOffset = -labelSizes.highest.height + lineHeight / 2; - } - } else { - if (crossAlign === "near" || rotation !== 0) { - textOffset = lineHeight / 2; - } else if (crossAlign === "center") { - textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight; - } else { - textOffset = labelSizes.highest.height - lineCount * lineHeight; - } - } - if (mirror) { - textOffset *= -1; - } - if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) { - x += lineHeight / 2 * Math.sin(rotation); - } - } else { - y = pixel; - textOffset = (1 - lineCount) * lineHeight / 2; - } - let backdrop; - if (optsAtIndex.showLabelBackdrop) { - const labelPadding = toPadding(optsAtIndex.backdropPadding); - const height = labelSizes.heights[i]; - const width = labelSizes.widths[i]; - let top = textOffset - labelPadding.top; - let left = 0 - labelPadding.left; - switch (textBaseline) { - case "middle": - top -= height / 2; - break; - case "bottom": - top -= height; - break; - } - switch (textAlign) { - case "center": - left -= width / 2; - break; - case "right": - left -= width; - break; - } - backdrop = { - left, - top, - width: width + labelPadding.width, - height: height + labelPadding.height, - color: optsAtIndex.backdropColor - }; - } - items.push({ - label, - font, - textOffset, - options: { - rotation, - color: color2, - strokeColor, - strokeWidth, - textAlign: tickTextAlign, - textBaseline, - translation: [ - x, - y - ], - backdrop - } - }); - } - return items; - } - _getXAxisLabelAlignment() { - const { position, ticks } = this.options; - const rotation = -toRadians(this.labelRotation); - if (rotation) { - return position === "top" ? "left" : "right"; - } - let align = "center"; - if (ticks.align === "start") { - align = "left"; - } else if (ticks.align === "end") { - align = "right"; - } else if (ticks.align === "inner") { - align = "inner"; - } - return align; - } - _getYAxisLabelAlignment(tl) { - const { position, ticks: { crossAlign, mirror, padding } } = this.options; - const labelSizes = this._getLabelSizes(); - const tickAndPadding = tl + padding; - const widest = labelSizes.widest.width; - let textAlign; - let x; - if (position === "left") { - if (mirror) { - x = this.right + padding; - if (crossAlign === "near") { - textAlign = "left"; - } else if (crossAlign === "center") { - textAlign = "center"; - x += widest / 2; - } else { - textAlign = "right"; - x += widest; - } - } else { - x = this.right - tickAndPadding; - if (crossAlign === "near") { - textAlign = "right"; - } else if (crossAlign === "center") { - textAlign = "center"; - x -= widest / 2; - } else { - textAlign = "left"; - x = this.left; - } - } - } else if (position === "right") { - if (mirror) { - x = this.left + padding; - if (crossAlign === "near") { - textAlign = "right"; - } else if (crossAlign === "center") { - textAlign = "center"; - x -= widest / 2; - } else { - textAlign = "left"; - x -= widest; - } - } else { - x = this.left + tickAndPadding; - if (crossAlign === "near") { - textAlign = "left"; - } else if (crossAlign === "center") { - textAlign = "center"; - x += widest / 2; - } else { - textAlign = "right"; - x = this.right; - } - } - } else { - textAlign = "right"; - } - return { - textAlign, - x - }; - } - _computeLabelArea() { - if (this.options.ticks.mirror) { - return; - } - const chart = this.chart; - const position = this.options.position; - if (position === "left" || position === "right") { - return { - top: 0, - left: this.left, - bottom: chart.height, - right: this.right - }; - } - if (position === "top" || position === "bottom") { - return { - top: this.top, - left: 0, - bottom: this.bottom, - right: chart.width - }; - } - } - drawBackground() { - const { ctx, options: { backgroundColor }, left, top, width, height } = this; - if (backgroundColor) { - ctx.save(); - ctx.fillStyle = backgroundColor; - ctx.fillRect(left, top, width, height); - ctx.restore(); - } - } - getLineWidthForValue(value) { - const grid = this.options.grid; - if (!this._isVisible() || !grid.display) { - return 0; - } - const ticks = this.ticks; - const index = ticks.findIndex((t2) => t2.value === value); - if (index >= 0) { - const opts = grid.setContext(this.getContext(index)); - return opts.lineWidth; - } - return 0; - } - drawGrid(chartArea) { - const grid = this.options.grid; - const ctx = this.ctx; - const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea)); - let i, ilen; - const drawLine = (p1, p2, style) => { - if (!style.width || !style.color) { - return; - } - ctx.save(); - ctx.lineWidth = style.width; - ctx.strokeStyle = style.color; - ctx.setLineDash(style.borderDash || []); - ctx.lineDashOffset = style.borderDashOffset; - ctx.beginPath(); - ctx.moveTo(p1.x, p1.y); - ctx.lineTo(p2.x, p2.y); - ctx.stroke(); - ctx.restore(); - }; - if (grid.display) { - for (i = 0, ilen = items.length; i < ilen; ++i) { - const item = items[i]; - if (grid.drawOnChartArea) { - drawLine({ - x: item.x1, - y: item.y1 - }, { - x: item.x2, - y: item.y2 - }, item); - } - if (grid.drawTicks) { - drawLine({ - x: item.tx1, - y: item.ty1 - }, { - x: item.tx2, - y: item.ty2 - }, { - color: item.tickColor, - width: item.tickWidth, - borderDash: item.tickBorderDash, - borderDashOffset: item.tickBorderDashOffset - }); - } - } - } - } - drawBorder() { - const { chart, ctx, options: { border, grid } } = this; - const borderOpts = border.setContext(this.getContext()); - const axisWidth = border.display ? borderOpts.width : 0; - if (!axisWidth) { - return; - } - const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth; - const borderValue = this._borderValue; - let x1, x2, y1, y2; - if (this.isHorizontal()) { - x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2; - x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2; - y1 = y2 = borderValue; - } else { - y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2; - y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2; - x1 = x2 = borderValue; - } - ctx.save(); - ctx.lineWidth = borderOpts.width; - ctx.strokeStyle = borderOpts.color; - ctx.beginPath(); - ctx.moveTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.stroke(); - ctx.restore(); - } - drawLabels(chartArea) { - const optionTicks = this.options.ticks; - if (!optionTicks.display) { - return; - } - const ctx = this.ctx; - const area = this._computeLabelArea(); - if (area) { - clipArea(ctx, area); - } - const items = this.getLabelItems(chartArea); - for (const item of items) { - const renderTextOptions = item.options; - const tickFont = item.font; - const label = item.label; - const y = item.textOffset; - renderText(ctx, label, 0, y, tickFont, renderTextOptions); - } - if (area) { - unclipArea(ctx); - } - } - drawTitle() { - const { ctx, options: { position, title, reverse } } = this; - if (!title.display) { - return; - } - const font = toFont(title.font); - const padding = toPadding(title.padding); - const align = title.align; - let offset = font.lineHeight / 2; - if (position === "bottom" || position === "center" || isObject(position)) { - offset += padding.bottom; - if (isArray(title.text)) { - offset += font.lineHeight * (title.text.length - 1); - } - } else { - offset += padding.top; - } - const { titleX, titleY, maxWidth, rotation } = titleArgs(this, offset, position, align); - renderText(ctx, title.text, 0, 0, font, { - color: title.color, - maxWidth, - rotation, - textAlign: titleAlign(align, position, reverse), - textBaseline: "middle", - translation: [ - titleX, - titleY - ] - }); - } - draw(chartArea) { - if (!this._isVisible()) { - return; - } - this.drawBackground(); - this.drawGrid(chartArea); - this.drawBorder(); - this.drawTitle(); - this.drawLabels(chartArea); - } - _layers() { - const opts = this.options; - const tz = opts.ticks && opts.ticks.z || 0; - const gz = valueOrDefault(opts.grid && opts.grid.z, -1); - const bz = valueOrDefault(opts.border && opts.border.z, 0); - if (!this._isVisible() || this.draw !== Scale.prototype.draw) { - return [ - { - z: tz, - draw: (chartArea) => { - this.draw(chartArea); - } - } - ]; - } - return [ - { - z: gz, - draw: (chartArea) => { - this.drawBackground(); - this.drawGrid(chartArea); - this.drawTitle(); - } - }, - { - z: bz, - draw: () => { - this.drawBorder(); - } - }, - { - z: tz, - draw: (chartArea) => { - this.drawLabels(chartArea); - } - } - ]; - } - getMatchingVisibleMetas(type) { - const metas = this.chart.getSortedVisibleDatasetMetas(); - const axisID = this.axis + "AxisID"; - const result = []; - let i, ilen; - for (i = 0, ilen = metas.length; i < ilen; ++i) { - const meta = metas[i]; - if (meta[axisID] === this.id && (!type || meta.type === type)) { - result.push(meta); - } - } - return result; - } - _resolveTickFontOptions(index) { - const opts = this.options.ticks.setContext(this.getContext(index)); - return toFont(opts.font); - } - _maxDigits() { - const fontSize = this._resolveTickFontOptions(0).lineHeight; - return (this.isHorizontal() ? this.width : this.height) / fontSize; - } -}; -var TypedRegistry = class { - constructor(type, scope, override) { - this.type = type; - this.scope = scope; - this.override = override; - this.items = /* @__PURE__ */ Object.create(null); - } - isForType(type) { - return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype); - } - register(item) { - const proto = Object.getPrototypeOf(item); - let parentScope; - if (isIChartComponent(proto)) { - parentScope = this.register(proto); - } - const items = this.items; - const id = item.id; - const scope = this.scope + "." + id; - if (!id) { - throw new Error("class does not have id: " + item); - } - if (id in items) { - return scope; - } - items[id] = item; - registerDefaults(item, scope, parentScope); - if (this.override) { - defaults.override(item.id, item.overrides); - } - return scope; - } - get(id) { - return this.items[id]; - } - unregister(item) { - const items = this.items; - const id = item.id; - const scope = this.scope; - if (id in items) { - delete items[id]; - } - if (scope && id in defaults[scope]) { - delete defaults[scope][id]; - if (this.override) { - delete overrides[id]; - } - } - } -}; -function registerDefaults(item, scope, parentScope) { - const itemDefaults = merge(/* @__PURE__ */ Object.create(null), [ - parentScope ? defaults.get(parentScope) : {}, - defaults.get(scope), - item.defaults - ]); - defaults.set(scope, itemDefaults); - if (item.defaultRoutes) { - routeDefaults(scope, item.defaultRoutes); - } - if (item.descriptors) { - defaults.describe(scope, item.descriptors); - } -} -function routeDefaults(scope, routes) { - Object.keys(routes).forEach((property) => { - const propertyParts = property.split("."); - const sourceName = propertyParts.pop(); - const sourceScope = [ - scope - ].concat(propertyParts).join("."); - const parts = routes[property].split("."); - const targetName = parts.pop(); - const targetScope = parts.join("."); - defaults.route(sourceScope, sourceName, targetScope, targetName); - }); -} -function isIChartComponent(proto) { - return "id" in proto && "defaults" in proto; -} -var Registry = class { - constructor() { - this.controllers = new TypedRegistry(DatasetController, "datasets", true); - this.elements = new TypedRegistry(Element, "elements"); - this.plugins = new TypedRegistry(Object, "plugins"); - this.scales = new TypedRegistry(Scale, "scales"); - this._typedRegistries = [ - this.controllers, - this.scales, - this.elements - ]; - } - add(...args) { - this._each("register", args); - } - remove(...args) { - this._each("unregister", args); - } - addControllers(...args) { - this._each("register", args, this.controllers); - } - addElements(...args) { - this._each("register", args, this.elements); - } - addPlugins(...args) { - this._each("register", args, this.plugins); - } - addScales(...args) { - this._each("register", args, this.scales); - } - getController(id) { - return this._get(id, this.controllers, "controller"); - } - getElement(id) { - return this._get(id, this.elements, "element"); - } - getPlugin(id) { - return this._get(id, this.plugins, "plugin"); - } - getScale(id) { - return this._get(id, this.scales, "scale"); - } - removeControllers(...args) { - this._each("unregister", args, this.controllers); - } - removeElements(...args) { - this._each("unregister", args, this.elements); - } - removePlugins(...args) { - this._each("unregister", args, this.plugins); - } - removeScales(...args) { - this._each("unregister", args, this.scales); - } - _each(method, args, typedRegistry) { - [ - ...args - ].forEach((arg) => { - const reg = typedRegistry || this._getRegistryForType(arg); - if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) { - this._exec(method, reg, arg); - } else { - each(arg, (item) => { - const itemReg = typedRegistry || this._getRegistryForType(item); - this._exec(method, itemReg, item); - }); - } - }); - } - _exec(method, registry2, component) { - const camelMethod = _capitalize(method); - callback(component["before" + camelMethod], [], component); - registry2[method](component); - callback(component["after" + camelMethod], [], component); - } - _getRegistryForType(type) { - for (let i = 0; i < this._typedRegistries.length; i++) { - const reg = this._typedRegistries[i]; - if (reg.isForType(type)) { - return reg; - } - } - return this.plugins; - } - _get(id, typedRegistry, type) { - const item = typedRegistry.get(id); - if (item === void 0) { - throw new Error('"' + id + '" is not a registered ' + type + "."); - } - return item; - } -}; -var registry = /* @__PURE__ */ new Registry(); -var PluginService = class { - constructor() { - this._init = []; - } - notify(chart, hook, args, filter) { - if (hook === "beforeInit") { - this._init = this._createDescriptors(chart, true); - this._notify(this._init, chart, "install"); - } - const descriptors2 = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart); - const result = this._notify(descriptors2, chart, hook, args); - if (hook === "afterDestroy") { - this._notify(descriptors2, chart, "stop"); - this._notify(this._init, chart, "uninstall"); - } - return result; - } - _notify(descriptors2, chart, hook, args) { - args = args || {}; - for (const descriptor of descriptors2) { - const plugin = descriptor.plugin; - const method = plugin[hook]; - const params = [ - chart, - args, - descriptor.options - ]; - if (callback(method, params, plugin) === false && args.cancelable) { - return false; - } - } - return true; - } - invalidate() { - if (!isNullOrUndef(this._cache)) { - this._oldCache = this._cache; - this._cache = void 0; - } - } - _descriptors(chart) { - if (this._cache) { - return this._cache; - } - const descriptors2 = this._cache = this._createDescriptors(chart); - this._notifyStateChanges(chart); - return descriptors2; - } - _createDescriptors(chart, all) { - const config = chart && chart.config; - const options = valueOrDefault(config.options && config.options.plugins, {}); - const plugins = allPlugins(config); - return options === false && !all ? [] : createDescriptors(chart, plugins, options, all); - } - _notifyStateChanges(chart) { - const previousDescriptors = this._oldCache || []; - const descriptors2 = this._cache; - const diff = (a, b) => a.filter((x) => !b.some((y) => x.plugin.id === y.plugin.id)); - this._notify(diff(previousDescriptors, descriptors2), chart, "stop"); - this._notify(diff(descriptors2, previousDescriptors), chart, "start"); - } -}; -function allPlugins(config) { - const localIds = {}; - const plugins = []; - const keys = Object.keys(registry.plugins.items); - for (let i = 0; i < keys.length; i++) { - plugins.push(registry.getPlugin(keys[i])); - } - const local = config.plugins || []; - for (let i1 = 0; i1 < local.length; i1++) { - const plugin = local[i1]; - if (plugins.indexOf(plugin) === -1) { - plugins.push(plugin); - localIds[plugin.id] = true; - } - } - return { - plugins, - localIds - }; -} -function getOpts(options, all) { - if (!all && options === false) { - return null; - } - if (options === true) { - return {}; - } - return options; -} -function createDescriptors(chart, { plugins, localIds }, options, all) { - const result = []; - const context = chart.getContext(); - for (const plugin of plugins) { - const id = plugin.id; - const opts = getOpts(options[id], all); - if (opts === null) { - continue; - } - result.push({ - plugin, - options: pluginOpts(chart.config, { - plugin, - local: localIds[id] - }, opts, context) - }); - } - return result; -} -function pluginOpts(config, { plugin, local }, opts, context) { - const keys = config.pluginScopeKeys(plugin); - const scopes = config.getOptionScopes(opts, keys); - if (local && plugin.defaults) { - scopes.push(plugin.defaults); - } - return config.createResolver(scopes, context, [ - "" - ], { - scriptable: false, - indexable: false, - allKeys: true - }); -} -function getIndexAxis(type, options) { - const datasetDefaults = defaults.datasets[type] || {}; - const datasetOptions = (options.datasets || {})[type] || {}; - return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || "x"; -} -function getAxisFromDefaultScaleID(id, indexAxis) { - let axis = id; - if (id === "_index_") { - axis = indexAxis; - } else if (id === "_value_") { - axis = indexAxis === "x" ? "y" : "x"; - } - return axis; -} -function getDefaultScaleIDFromAxis(axis, indexAxis) { - return axis === indexAxis ? "_index_" : "_value_"; -} -function axisFromPosition(position) { - if (position === "top" || position === "bottom") { - return "x"; - } - if (position === "left" || position === "right") { - return "y"; - } -} -function determineAxis(id, scaleOptions) { - if (id === "x" || id === "y" || id === "r") { - return id; - } - id = scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.length > 1 && determineAxis(id[0].toLowerCase(), scaleOptions); - if (id) { - return id; - } - throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`); -} -function mergeScaleConfig(config, options) { - const chartDefaults = overrides[config.type] || { - scales: {} - }; - const configScales = options.scales || {}; - const chartIndexAxis = getIndexAxis(config.type, options); - const scales = /* @__PURE__ */ Object.create(null); - Object.keys(configScales).forEach((id) => { - const scaleConf = configScales[id]; - if (!isObject(scaleConf)) { - return console.error(`Invalid scale configuration for scale: ${id}`); - } - if (scaleConf._proxy) { - return console.warn(`Ignoring resolver passed as options for scale: ${id}`); - } - const axis = determineAxis(id, scaleConf); - const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis); - const defaultScaleOptions = chartDefaults.scales || {}; - scales[id] = mergeIf(/* @__PURE__ */ Object.create(null), [ - { - axis - }, - scaleConf, - defaultScaleOptions[axis], - defaultScaleOptions[defaultId] - ]); - }); - config.data.datasets.forEach((dataset) => { - const type = dataset.type || config.type; - const indexAxis = dataset.indexAxis || getIndexAxis(type, options); - const datasetDefaults = overrides[type] || {}; - const defaultScaleOptions = datasetDefaults.scales || {}; - Object.keys(defaultScaleOptions).forEach((defaultID) => { - const axis = getAxisFromDefaultScaleID(defaultID, indexAxis); - const id = dataset[axis + "AxisID"] || axis; - scales[id] = scales[id] || /* @__PURE__ */ Object.create(null); - mergeIf(scales[id], [ - { - axis - }, - configScales[id], - defaultScaleOptions[defaultID] - ]); - }); - }); - Object.keys(scales).forEach((key) => { - const scale = scales[key]; - mergeIf(scale, [ - defaults.scales[scale.type], - defaults.scale - ]); - }); - return scales; -} -function initOptions(config) { - const options = config.options || (config.options = {}); - options.plugins = valueOrDefault(options.plugins, {}); - options.scales = mergeScaleConfig(config, options); -} -function initData(data) { - data = data || {}; - data.datasets = data.datasets || []; - data.labels = data.labels || []; - return data; -} -function initConfig(config) { - config = config || {}; - config.data = initData(config.data); - initOptions(config); - return config; -} -var keyCache = /* @__PURE__ */ new Map(); -var keysCached = /* @__PURE__ */ new Set(); -function cachedKeys(cacheKey, generate) { - let keys = keyCache.get(cacheKey); - if (!keys) { - keys = generate(); - keyCache.set(cacheKey, keys); - keysCached.add(keys); - } - return keys; -} -var addIfFound = (set2, obj, key) => { - const opts = resolveObjectKey(obj, key); - if (opts !== void 0) { - set2.add(opts); - } -}; -var Config = class { - constructor(config) { - this._config = initConfig(config); - this._scopeCache = /* @__PURE__ */ new Map(); - this._resolverCache = /* @__PURE__ */ new Map(); - } - get platform() { - return this._config.platform; - } - get type() { - return this._config.type; - } - set type(type) { - this._config.type = type; - } - get data() { - return this._config.data; - } - set data(data) { - this._config.data = initData(data); - } - get options() { - return this._config.options; - } - set options(options) { - this._config.options = options; - } - get plugins() { - return this._config.plugins; - } - update() { - const config = this._config; - this.clearCache(); - initOptions(config); - } - clearCache() { - this._scopeCache.clear(); - this._resolverCache.clear(); - } - datasetScopeKeys(datasetType) { - return cachedKeys(datasetType, () => [ - [ - `datasets.${datasetType}`, - "" - ] - ]); - } - datasetAnimationScopeKeys(datasetType, transition) { - return cachedKeys(`${datasetType}.transition.${transition}`, () => [ - [ - `datasets.${datasetType}.transitions.${transition}`, - `transitions.${transition}` - ], - [ - `datasets.${datasetType}`, - "" - ] - ]); - } - datasetElementScopeKeys(datasetType, elementType) { - return cachedKeys(`${datasetType}-${elementType}`, () => [ - [ - `datasets.${datasetType}.elements.${elementType}`, - `datasets.${datasetType}`, - `elements.${elementType}`, - "" - ] - ]); - } - pluginScopeKeys(plugin) { - const id = plugin.id; - const type = this.type; - return cachedKeys(`${type}-plugin-${id}`, () => [ - [ - `plugins.${id}`, - ...plugin.additionalOptionScopes || [] - ] - ]); - } - _cachedScopes(mainScope, resetCache) { - const _scopeCache = this._scopeCache; - let cache = _scopeCache.get(mainScope); - if (!cache || resetCache) { - cache = /* @__PURE__ */ new Map(); - _scopeCache.set(mainScope, cache); - } - return cache; - } - getOptionScopes(mainScope, keyLists, resetCache) { - const { options, type } = this; - const cache = this._cachedScopes(mainScope, resetCache); - const cached = cache.get(keyLists); - if (cached) { - return cached; - } - const scopes = /* @__PURE__ */ new Set(); - keyLists.forEach((keys) => { - if (mainScope) { - scopes.add(mainScope); - keys.forEach((key) => addIfFound(scopes, mainScope, key)); - } - keys.forEach((key) => addIfFound(scopes, options, key)); - keys.forEach((key) => addIfFound(scopes, overrides[type] || {}, key)); - keys.forEach((key) => addIfFound(scopes, defaults, key)); - keys.forEach((key) => addIfFound(scopes, descriptors, key)); - }); - const array = Array.from(scopes); - if (array.length === 0) { - array.push(/* @__PURE__ */ Object.create(null)); - } - if (keysCached.has(keyLists)) { - cache.set(keyLists, array); - } - return array; - } - chartOptionScopes() { - const { options, type } = this; - return [ - options, - overrides[type] || {}, - defaults.datasets[type] || {}, - { - type - }, - defaults, - descriptors - ]; - } - resolveNamedOptions(scopes, names2, context, prefixes = [ - "" - ]) { - const result = { - $shared: true - }; - const { resolver, subPrefixes } = getResolver(this._resolverCache, scopes, prefixes); - let options = resolver; - if (needContext(resolver, names2)) { - result.$shared = false; - context = isFunction(context) ? context() : context; - const subResolver = this.createResolver(scopes, context, subPrefixes); - options = _attachContext(resolver, context, subResolver); - } - for (const prop of names2) { - result[prop] = options[prop]; - } - return result; - } - createResolver(scopes, context, prefixes = [ - "" - ], descriptorDefaults) { - const { resolver } = getResolver(this._resolverCache, scopes, prefixes); - return isObject(context) ? _attachContext(resolver, context, void 0, descriptorDefaults) : resolver; - } -}; -function getResolver(resolverCache, scopes, prefixes) { - let cache = resolverCache.get(scopes); - if (!cache) { - cache = /* @__PURE__ */ new Map(); - resolverCache.set(scopes, cache); - } - const cacheKey = prefixes.join(); - let cached = cache.get(cacheKey); - if (!cached) { - const resolver = _createResolver(scopes, prefixes); - cached = { - resolver, - subPrefixes: prefixes.filter((p) => !p.toLowerCase().includes("hover")) - }; - cache.set(cacheKey, cached); - } - return cached; -} -var hasFunction = (value) => isObject(value) && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false); -function needContext(proxy, names2) { - const { isScriptable, isIndexable } = _descriptors(proxy); - for (const prop of names2) { - const scriptable = isScriptable(prop); - const indexable = isIndexable(prop); - const value = (indexable || scriptable) && proxy[prop]; - if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) { - return true; - } - } - return false; -} -var version = "4.2.1"; -var KNOWN_POSITIONS = [ - "top", - "bottom", - "left", - "right", - "chartArea" -]; -function positionIsHorizontal(position, axis) { - return position === "top" || position === "bottom" || KNOWN_POSITIONS.indexOf(position) === -1 && axis === "x"; -} -function compare2Level(l1, l2) { - return function(a, b) { - return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1]; - }; -} -function onAnimationsComplete(context) { - const chart = context.chart; - const animationOptions = chart.options.animation; - chart.notifyPlugins("afterRender"); - callback(animationOptions && animationOptions.onComplete, [ - context - ], chart); -} -function onAnimationProgress(context) { - const chart = context.chart; - const animationOptions = chart.options.animation; - callback(animationOptions && animationOptions.onProgress, [ - context - ], chart); -} -function getCanvas(item) { - if (_isDomSupported() && typeof item === "string") { - item = document.getElementById(item); - } else if (item && item.length) { - item = item[0]; - } - if (item && item.canvas) { - item = item.canvas; - } - return item; -} -var instances = {}; -var getChart = (key) => { - const canvas = getCanvas(key); - return Object.values(instances).filter((c) => c.canvas === canvas).pop(); -}; -function moveNumericKeys(obj, start, move) { - const keys = Object.keys(obj); - for (const key of keys) { - const intKey = +key; - if (intKey >= start) { - const value = obj[key]; - delete obj[key]; - if (move > 0 || intKey > start) { - obj[intKey + move] = value; - } - } - } -} -function determineLastEvent(e, lastEvent, inChartArea, isClick) { - if (!inChartArea || e.type === "mouseout") { - return null; - } - if (isClick) { - return lastEvent; - } - return e; -} -function getDatasetArea(meta) { - const { xScale, yScale } = meta; - if (xScale && yScale) { - return { - left: xScale.left, - right: xScale.right, - top: yScale.top, - bottom: yScale.bottom - }; - } -} -var Chart = class { - static register(...items) { - registry.add(...items); - invalidatePlugins(); - } - static unregister(...items) { - registry.remove(...items); - invalidatePlugins(); - } - constructor(item, userConfig) { - const config = this.config = new Config(userConfig); - const initialCanvas = getCanvas(item); - const existingChart = getChart(initialCanvas); - if (existingChart) { - throw new Error("Canvas is already in use. Chart with ID '" + existingChart.id + "' must be destroyed before the canvas with ID '" + existingChart.canvas.id + "' can be reused."); - } - const options = config.createResolver(config.chartOptionScopes(), this.getContext()); - this.platform = new (config.platform || _detectPlatform(initialCanvas))(); - this.platform.updateConfig(config); - const context = this.platform.acquireContext(initialCanvas, options.aspectRatio); - const canvas = context && context.canvas; - const height = canvas && canvas.height; - const width = canvas && canvas.width; - this.id = uid(); - this.ctx = context; - this.canvas = canvas; - this.width = width; - this.height = height; - this._options = options; - this._aspectRatio = this.aspectRatio; - this._layers = []; - this._metasets = []; - this._stacks = void 0; - this.boxes = []; - this.currentDevicePixelRatio = void 0; - this.chartArea = void 0; - this._active = []; - this._lastEvent = void 0; - this._listeners = {}; - this._responsiveListeners = void 0; - this._sortedMetasets = []; - this.scales = {}; - this._plugins = new PluginService(); - this.$proxies = {}; - this._hiddenIndices = {}; - this.attached = false; - this._animationsDisabled = void 0; - this.$context = void 0; - this._doResize = debounce((mode) => this.update(mode), options.resizeDelay || 0); - this._dataChanges = []; - instances[this.id] = this; - if (!context || !canvas) { - console.error("Failed to create chart: can't acquire context from the given item"); - return; - } - animator.listen(this, "complete", onAnimationsComplete); - animator.listen(this, "progress", onAnimationProgress); - this._initialize(); - if (this.attached) { - this.update(); - } - } - get aspectRatio() { - const { options: { aspectRatio, maintainAspectRatio }, width, height, _aspectRatio } = this; - if (!isNullOrUndef(aspectRatio)) { - return aspectRatio; - } - if (maintainAspectRatio && _aspectRatio) { - return _aspectRatio; - } - return height ? width / height : null; - } - get data() { - return this.config.data; - } - set data(data) { - this.config.data = data; - } - get options() { - return this._options; - } - set options(options) { - this.config.options = options; - } - get registry() { - return registry; - } - _initialize() { - this.notifyPlugins("beforeInit"); - if (this.options.responsive) { - this.resize(); - } else { - retinaScale(this, this.options.devicePixelRatio); - } - this.bindEvents(); - this.notifyPlugins("afterInit"); - return this; - } - clear() { - clearCanvas(this.canvas, this.ctx); - return this; - } - stop() { - animator.stop(this); - return this; - } - resize(width, height) { - if (!animator.running(this)) { - this._resize(width, height); - } else { - this._resizeBeforeDraw = { - width, - height - }; - } - } - _resize(width, height) { - const options = this.options; - const canvas = this.canvas; - const aspectRatio = options.maintainAspectRatio && this.aspectRatio; - const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio); - const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio(); - const mode = this.width ? "resize" : "attach"; - this.width = newSize.width; - this.height = newSize.height; - this._aspectRatio = this.aspectRatio; - if (!retinaScale(this, newRatio, true)) { - return; - } - this.notifyPlugins("resize", { - size: newSize - }); - callback(options.onResize, [ - this, - newSize - ], this); - if (this.attached) { - if (this._doResize(mode)) { - this.render(); - } - } - } - ensureScalesHaveIDs() { - const options = this.options; - const scalesOptions = options.scales || {}; - each(scalesOptions, (axisOptions, axisID) => { - axisOptions.id = axisID; - }); - } - buildOrUpdateScales() { - const options = this.options; - const scaleOpts = options.scales; - const scales = this.scales; - const updated = Object.keys(scales).reduce((obj, id) => { - obj[id] = false; - return obj; - }, {}); - let items = []; - if (scaleOpts) { - items = items.concat(Object.keys(scaleOpts).map((id) => { - const scaleOptions = scaleOpts[id]; - const axis = determineAxis(id, scaleOptions); - const isRadial = axis === "r"; - const isHorizontal = axis === "x"; - return { - options: scaleOptions, - dposition: isRadial ? "chartArea" : isHorizontal ? "bottom" : "left", - dtype: isRadial ? "radialLinear" : isHorizontal ? "category" : "linear" - }; - })); - } - each(items, (item) => { - const scaleOptions = item.options; - const id = scaleOptions.id; - const axis = determineAxis(id, scaleOptions); - const scaleType = valueOrDefault(scaleOptions.type, item.dtype); - if (scaleOptions.position === void 0 || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) { - scaleOptions.position = item.dposition; - } - updated[id] = true; - let scale = null; - if (id in scales && scales[id].type === scaleType) { - scale = scales[id]; - } else { - const scaleClass = registry.getScale(scaleType); - scale = new scaleClass({ - id, - type: scaleType, - ctx: this.ctx, - chart: this - }); - scales[scale.id] = scale; - } - scale.init(scaleOptions, options); - }); - each(updated, (hasUpdated, id) => { - if (!hasUpdated) { - delete scales[id]; - } - }); - each(scales, (scale) => { - layouts.configure(this, scale, scale.options); - layouts.addBox(this, scale); - }); - } - _updateMetasets() { - const metasets = this._metasets; - const numData = this.data.datasets.length; - const numMeta = metasets.length; - metasets.sort((a, b) => a.index - b.index); - if (numMeta > numData) { - for (let i = numData; i < numMeta; ++i) { - this._destroyDatasetMeta(i); - } - metasets.splice(numData, numMeta - numData); - } - this._sortedMetasets = metasets.slice(0).sort(compare2Level("order", "index")); - } - _removeUnreferencedMetasets() { - const { _metasets: metasets, data: { datasets } } = this; - if (metasets.length > datasets.length) { - delete this._stacks; - } - metasets.forEach((meta, index) => { - if (datasets.filter((x) => x === meta._dataset).length === 0) { - this._destroyDatasetMeta(index); - } - }); - } - buildOrUpdateControllers() { - const newControllers = []; - const datasets = this.data.datasets; - let i, ilen; - this._removeUnreferencedMetasets(); - for (i = 0, ilen = datasets.length; i < ilen; i++) { - const dataset = datasets[i]; - let meta = this.getDatasetMeta(i); - const type = dataset.type || this.config.type; - if (meta.type && meta.type !== type) { - this._destroyDatasetMeta(i); - meta = this.getDatasetMeta(i); - } - meta.type = type; - meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options); - meta.order = dataset.order || 0; - meta.index = i; - meta.label = "" + dataset.label; - meta.visible = this.isDatasetVisible(i); - if (meta.controller) { - meta.controller.updateIndex(i); - meta.controller.linkScales(); - } else { - const ControllerClass = registry.getController(type); - const { datasetElementType, dataElementType } = defaults.datasets[type]; - Object.assign(ControllerClass, { - dataElementType: registry.getElement(dataElementType), - datasetElementType: datasetElementType && registry.getElement(datasetElementType) - }); - meta.controller = new ControllerClass(this, i); - newControllers.push(meta.controller); - } - } - this._updateMetasets(); - return newControllers; - } - _resetElements() { - each(this.data.datasets, (dataset, datasetIndex) => { - this.getDatasetMeta(datasetIndex).controller.reset(); - }, this); - } - reset() { - this._resetElements(); - this.notifyPlugins("reset"); - } - update(mode) { - const config = this.config; - config.update(); - const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext()); - const animsDisabled = this._animationsDisabled = !options.animation; - this._updateScales(); - this._checkEventBindings(); - this._updateHiddenIndices(); - this._plugins.invalidate(); - if (this.notifyPlugins("beforeUpdate", { - mode, - cancelable: true - }) === false) { - return; - } - const newControllers = this.buildOrUpdateControllers(); - this.notifyPlugins("beforeElementsUpdate"); - let minPadding = 0; - for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) { - const { controller } = this.getDatasetMeta(i); - const reset2 = !animsDisabled && newControllers.indexOf(controller) === -1; - controller.buildOrUpdateElements(reset2); - minPadding = Math.max(+controller.getMaxOverflow(), minPadding); - } - minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0; - this._updateLayout(minPadding); - if (!animsDisabled) { - each(newControllers, (controller) => { - controller.reset(); - }); - } - this._updateDatasets(mode); - this.notifyPlugins("afterUpdate", { - mode - }); - this._layers.sort(compare2Level("z", "_idx")); - const { _active, _lastEvent } = this; - if (_lastEvent) { - this._eventHandler(_lastEvent, true); - } else if (_active.length) { - this._updateHoverStyles(_active, _active, true); - } - this.render(); - } - _updateScales() { - each(this.scales, (scale) => { - layouts.removeBox(this, scale); - }); - this.ensureScalesHaveIDs(); - this.buildOrUpdateScales(); - } - _checkEventBindings() { - const options = this.options; - const existingEvents = new Set(Object.keys(this._listeners)); - const newEvents = new Set(options.events); - if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) { - this.unbindEvents(); - this.bindEvents(); - } - } - _updateHiddenIndices() { - const { _hiddenIndices } = this; - const changes = this._getUniformDataChanges() || []; - for (const { method, start, count } of changes) { - const move = method === "_removeElements" ? -count : count; - moveNumericKeys(_hiddenIndices, start, move); - } - } - _getUniformDataChanges() { - const _dataChanges = this._dataChanges; - if (!_dataChanges || !_dataChanges.length) { - return; - } - this._dataChanges = []; - const datasetCount = this.data.datasets.length; - const makeSet = (idx) => new Set(_dataChanges.filter((c) => c[0] === idx).map((c, i) => i + "," + c.splice(1).join(","))); - const changeSet = makeSet(0); - for (let i = 1; i < datasetCount; i++) { - if (!setsEqual(changeSet, makeSet(i))) { - return; - } - } - return Array.from(changeSet).map((c) => c.split(",")).map((a) => ({ - method: a[1], - start: +a[2], - count: +a[3] - })); - } - _updateLayout(minPadding) { - if (this.notifyPlugins("beforeLayout", { - cancelable: true - }) === false) { - return; - } - layouts.update(this, this.width, this.height, minPadding); - const area = this.chartArea; - const noArea = area.width <= 0 || area.height <= 0; - this._layers = []; - each(this.boxes, (box) => { - if (noArea && box.position === "chartArea") { - return; - } - if (box.configure) { - box.configure(); - } - this._layers.push(...box._layers()); - }, this); - this._layers.forEach((item, index) => { - item._idx = index; - }); - this.notifyPlugins("afterLayout"); - } - _updateDatasets(mode) { - if (this.notifyPlugins("beforeDatasetsUpdate", { - mode, - cancelable: true - }) === false) { - return; - } - for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { - this.getDatasetMeta(i).controller.configure(); - } - for (let i1 = 0, ilen1 = this.data.datasets.length; i1 < ilen1; ++i1) { - this._updateDataset(i1, isFunction(mode) ? mode({ - datasetIndex: i1 - }) : mode); - } - this.notifyPlugins("afterDatasetsUpdate", { - mode - }); - } - _updateDataset(index, mode) { - const meta = this.getDatasetMeta(index); - const args = { - meta, - index, - mode, - cancelable: true - }; - if (this.notifyPlugins("beforeDatasetUpdate", args) === false) { - return; - } - meta.controller._update(mode); - args.cancelable = false; - this.notifyPlugins("afterDatasetUpdate", args); - } - render() { - if (this.notifyPlugins("beforeRender", { - cancelable: true - }) === false) { - return; - } - if (animator.has(this)) { - if (this.attached && !animator.running(this)) { - animator.start(this); - } - } else { - this.draw(); - onAnimationsComplete({ - chart: this - }); - } - } - draw() { - let i; - if (this._resizeBeforeDraw) { - const { width, height } = this._resizeBeforeDraw; - this._resize(width, height); - this._resizeBeforeDraw = null; - } - this.clear(); - if (this.width <= 0 || this.height <= 0) { - return; - } - if (this.notifyPlugins("beforeDraw", { - cancelable: true - }) === false) { - return; - } - const layers = this._layers; - for (i = 0; i < layers.length && layers[i].z <= 0; ++i) { - layers[i].draw(this.chartArea); - } - this._drawDatasets(); - for (; i < layers.length; ++i) { - layers[i].draw(this.chartArea); - } - this.notifyPlugins("afterDraw"); - } - _getSortedDatasetMetas(filterVisible) { - const metasets = this._sortedMetasets; - const result = []; - let i, ilen; - for (i = 0, ilen = metasets.length; i < ilen; ++i) { - const meta = metasets[i]; - if (!filterVisible || meta.visible) { - result.push(meta); - } - } - return result; - } - getSortedVisibleDatasetMetas() { - return this._getSortedDatasetMetas(true); - } - _drawDatasets() { - if (this.notifyPlugins("beforeDatasetsDraw", { - cancelable: true - }) === false) { - return; - } - const metasets = this.getSortedVisibleDatasetMetas(); - for (let i = metasets.length - 1; i >= 0; --i) { - this._drawDataset(metasets[i]); - } - this.notifyPlugins("afterDatasetsDraw"); - } - _drawDataset(meta) { - const ctx = this.ctx; - const clip = meta._clip; - const useClip = !clip.disabled; - const area = getDatasetArea(meta) || this.chartArea; - const args = { - meta, - index: meta.index, - cancelable: true - }; - if (this.notifyPlugins("beforeDatasetDraw", args) === false) { - return; - } - if (useClip) { - clipArea(ctx, { - left: clip.left === false ? 0 : area.left - clip.left, - right: clip.right === false ? this.width : area.right + clip.right, - top: clip.top === false ? 0 : area.top - clip.top, - bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom - }); - } - meta.controller.draw(); - if (useClip) { - unclipArea(ctx); - } - args.cancelable = false; - this.notifyPlugins("afterDatasetDraw", args); - } - isPointInArea(point) { - return _isPointInArea(point, this.chartArea, this._minPadding); - } - getElementsAtEventForMode(e, mode, options, useFinalPosition) { - const method = Interaction.modes[mode]; - if (typeof method === "function") { - return method(this, e, options, useFinalPosition); - } - return []; - } - getDatasetMeta(datasetIndex) { - const dataset = this.data.datasets[datasetIndex]; - const metasets = this._metasets; - let meta = metasets.filter((x) => x && x._dataset === dataset).pop(); - if (!meta) { - meta = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, - xAxisID: null, - yAxisID: null, - order: dataset && dataset.order || 0, - index: datasetIndex, - _dataset: dataset, - _parsed: [], - _sorted: false - }; - metasets.push(meta); - } - return meta; - } - getContext() { - return this.$context || (this.$context = createContext(null, { - chart: this, - type: "chart" - })); - } - getVisibleDatasetCount() { - return this.getSortedVisibleDatasetMetas().length; - } - isDatasetVisible(datasetIndex) { - const dataset = this.data.datasets[datasetIndex]; - if (!dataset) { - return false; - } - const meta = this.getDatasetMeta(datasetIndex); - return typeof meta.hidden === "boolean" ? !meta.hidden : !dataset.hidden; - } - setDatasetVisibility(datasetIndex, visible) { - const meta = this.getDatasetMeta(datasetIndex); - meta.hidden = !visible; - } - toggleDataVisibility(index) { - this._hiddenIndices[index] = !this._hiddenIndices[index]; - } - getDataVisibility(index) { - return !this._hiddenIndices[index]; - } - _updateVisibility(datasetIndex, dataIndex, visible) { - const mode = visible ? "show" : "hide"; - const meta = this.getDatasetMeta(datasetIndex); - const anims = meta.controller._resolveAnimations(void 0, mode); - if (defined(dataIndex)) { - meta.data[dataIndex].hidden = !visible; - this.update(); - } else { - this.setDatasetVisibility(datasetIndex, visible); - anims.update(meta, { - visible - }); - this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : void 0); - } - } - hide(datasetIndex, dataIndex) { - this._updateVisibility(datasetIndex, dataIndex, false); - } - show(datasetIndex, dataIndex) { - this._updateVisibility(datasetIndex, dataIndex, true); - } - _destroyDatasetMeta(datasetIndex) { - const meta = this._metasets[datasetIndex]; - if (meta && meta.controller) { - meta.controller._destroy(); - } - delete this._metasets[datasetIndex]; - } - _stop() { - let i, ilen; - this.stop(); - animator.remove(this); - for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { - this._destroyDatasetMeta(i); - } - } - destroy() { - this.notifyPlugins("beforeDestroy"); - const { canvas, ctx } = this; - this._stop(); - this.config.clearCache(); - if (canvas) { - this.unbindEvents(); - clearCanvas(canvas, ctx); - this.platform.releaseContext(ctx); - this.canvas = null; - this.ctx = null; - } - delete instances[this.id]; - this.notifyPlugins("afterDestroy"); - } - toBase64Image(...args) { - return this.canvas.toDataURL(...args); - } - bindEvents() { - this.bindUserEvents(); - if (this.options.responsive) { - this.bindResponsiveEvents(); - } else { - this.attached = true; - } - } - bindUserEvents() { - const listeners = this._listeners; - const platform = this.platform; - const _add = (type, listener2) => { - platform.addEventListener(this, type, listener2); - listeners[type] = listener2; - }; - const listener = (e, x, y) => { - e.offsetX = x; - e.offsetY = y; - this._eventHandler(e); - }; - each(this.options.events, (type) => _add(type, listener)); - } - bindResponsiveEvents() { - if (!this._responsiveListeners) { - this._responsiveListeners = {}; - } - const listeners = this._responsiveListeners; - const platform = this.platform; - const _add = (type, listener2) => { - platform.addEventListener(this, type, listener2); - listeners[type] = listener2; - }; - const _remove = (type, listener2) => { - if (listeners[type]) { - platform.removeEventListener(this, type, listener2); - delete listeners[type]; - } - }; - const listener = (width, height) => { - if (this.canvas) { - this.resize(width, height); - } - }; - let detached; - const attached = () => { - _remove("attach", attached); - this.attached = true; - this.resize(); - _add("resize", listener); - _add("detach", detached); - }; - detached = () => { - this.attached = false; - _remove("resize", listener); - this._stop(); - this._resize(0, 0); - _add("attach", attached); - }; - if (platform.isAttached(this.canvas)) { - attached(); - } else { - detached(); - } - } - unbindEvents() { - each(this._listeners, (listener, type) => { - this.platform.removeEventListener(this, type, listener); - }); - this._listeners = {}; - each(this._responsiveListeners, (listener, type) => { - this.platform.removeEventListener(this, type, listener); - }); - this._responsiveListeners = void 0; - } - updateHoverStyle(items, mode, enabled) { - const prefix = enabled ? "set" : "remove"; - let meta, item, i, ilen; - if (mode === "dataset") { - meta = this.getDatasetMeta(items[0].datasetIndex); - meta.controller["_" + prefix + "DatasetHoverStyle"](); - } - for (i = 0, ilen = items.length; i < ilen; ++i) { - item = items[i]; - const controller = item && this.getDatasetMeta(item.datasetIndex).controller; - if (controller) { - controller[prefix + "HoverStyle"](item.element, item.datasetIndex, item.index); - } - } - } - getActiveElements() { - return this._active || []; - } - setActiveElements(activeElements) { - const lastActive = this._active || []; - const active = activeElements.map(({ datasetIndex, index }) => { - const meta = this.getDatasetMeta(datasetIndex); - if (!meta) { - throw new Error("No dataset found at index " + datasetIndex); - } - return { - datasetIndex, - element: meta.data[index], - index - }; - }); - const changed = !_elementsEqual(active, lastActive); - if (changed) { - this._active = active; - this._lastEvent = null; - this._updateHoverStyles(active, lastActive); - } - } - notifyPlugins(hook, args, filter) { - return this._plugins.notify(this, hook, args, filter); - } - isPluginEnabled(pluginId) { - return this._plugins._cache.filter((p) => p.plugin.id === pluginId).length === 1; - } - _updateHoverStyles(active, lastActive, replay) { - const hoverOptions = this.options.hover; - const diff = (a, b) => a.filter((x) => !b.some((y) => x.datasetIndex === y.datasetIndex && x.index === y.index)); - const deactivated = diff(lastActive, active); - const activated = replay ? active : diff(active, lastActive); - if (deactivated.length) { - this.updateHoverStyle(deactivated, hoverOptions.mode, false); - } - if (activated.length && hoverOptions.mode) { - this.updateHoverStyle(activated, hoverOptions.mode, true); - } - } - _eventHandler(e, replay) { - const args = { - event: e, - replay, - cancelable: true, - inChartArea: this.isPointInArea(e) - }; - const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type); - if (this.notifyPlugins("beforeEvent", args, eventFilter) === false) { - return; - } - const changed = this._handleEvent(e, replay, args.inChartArea); - args.cancelable = false; - this.notifyPlugins("afterEvent", args, eventFilter); - if (changed || args.changed) { - this.render(); - } - return this; - } - _handleEvent(e, replay, inChartArea) { - const { _active: lastActive = [], options } = this; - const useFinalPosition = replay; - const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition); - const isClick = _isClickEvent(e); - const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick); - if (inChartArea) { - this._lastEvent = null; - callback(options.onHover, [ - e, - active, - this - ], this); - if (isClick) { - callback(options.onClick, [ - e, - active, - this - ], this); - } - } - const changed = !_elementsEqual(active, lastActive); - if (changed || replay) { - this._active = active; - this._updateHoverStyles(active, lastActive, replay); - } - this._lastEvent = lastEvent; - return changed; - } - _getActiveElements(e, lastActive, inChartArea, useFinalPosition) { - if (e.type === "mouseout") { - return []; - } - if (!inChartArea) { - return lastActive; - } - const hoverOptions = this.options.hover; - return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition); - } -}; -__publicField(Chart, "defaults", defaults); -__publicField(Chart, "instances", instances); -__publicField(Chart, "overrides", overrides); -__publicField(Chart, "registry", registry); -__publicField(Chart, "version", version); -__publicField(Chart, "getChart", getChart); -function invalidatePlugins() { - return each(Chart.instances, (chart) => chart._plugins.invalidate()); -} -function clipArc(ctx, element, endAngle) { - const { startAngle, pixelMargin, x, y, outerRadius, innerRadius } = element; - let angleMargin = pixelMargin / outerRadius; - ctx.beginPath(); - ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin); - if (innerRadius > pixelMargin) { - angleMargin = pixelMargin / innerRadius; - ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true); - } else { - ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI); - } - ctx.closePath(); - ctx.clip(); -} -function toRadiusCorners(value) { - return _readValueToProps(value, [ - "outerStart", - "outerEnd", - "innerStart", - "innerEnd" - ]); -} -function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) { - const o = toRadiusCorners(arc.options.borderRadius); - const halfThickness = (outerRadius - innerRadius) / 2; - const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2); - const computeOuterLimit = (val) => { - const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2; - return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit)); - }; - return { - outerStart: computeOuterLimit(o.outerStart), - outerEnd: computeOuterLimit(o.outerEnd), - innerStart: _limitValue(o.innerStart, 0, innerLimit), - innerEnd: _limitValue(o.innerEnd, 0, innerLimit) - }; -} -function rThetaToXY(r, theta, x, y) { - return { - x: x + r * Math.cos(theta), - y: y + r * Math.sin(theta) - }; -} -function pathArc(ctx, element, offset, spacing, end, circular) { - const { x, y, startAngle: start, pixelMargin, innerRadius: innerR } = element; - const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0); - const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0; - let spacingOffset = 0; - const alpha2 = end - start; - if (spacing) { - const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0; - const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0; - const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2; - const adjustedAngle = avNogSpacingRadius !== 0 ? alpha2 * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha2; - spacingOffset = (alpha2 - adjustedAngle) / 2; - } - const beta = Math.max(1e-3, alpha2 * outerRadius - offset / PI) / outerRadius; - const angleOffset = (alpha2 - beta) / 2; - const startAngle = start + angleOffset + spacingOffset; - const endAngle = end - angleOffset - spacingOffset; - const { outerStart, outerEnd, innerStart, innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle); - const outerStartAdjustedRadius = outerRadius - outerStart; - const outerEndAdjustedRadius = outerRadius - outerEnd; - const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius; - const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius; - const innerStartAdjustedRadius = innerRadius + innerStart; - const innerEndAdjustedRadius = innerRadius + innerEnd; - const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius; - const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius; - ctx.beginPath(); - if (circular) { - const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2; - ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle); - ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle); - if (outerEnd > 0) { - const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y); - ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI); - } - const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y); - ctx.lineTo(p4.x, p4.y); - if (innerEnd > 0) { - const pCenter1 = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y); - ctx.arc(pCenter1.x, pCenter1.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI); - } - const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2; - ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true); - ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true); - if (innerStart > 0) { - const pCenter2 = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y); - ctx.arc(pCenter2.x, pCenter2.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI); - } - const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y); - ctx.lineTo(p8.x, p8.y); - if (outerStart > 0) { - const pCenter3 = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y); - ctx.arc(pCenter3.x, pCenter3.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle); - } - } else { - ctx.moveTo(x, y); - const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x; - const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y; - ctx.lineTo(outerStartX, outerStartY); - const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x; - const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y; - ctx.lineTo(outerEndX, outerEndY); - } - ctx.closePath(); -} -function drawArc(ctx, element, offset, spacing, circular) { - const { fullCircles, startAngle, circumference } = element; - let endAngle = element.endAngle; - if (fullCircles) { - pathArc(ctx, element, offset, spacing, endAngle, circular); - for (let i = 0; i < fullCircles; ++i) { - ctx.fill(); - } - if (!isNaN(circumference)) { - endAngle = startAngle + (circumference % TAU || TAU); - } - } - pathArc(ctx, element, offset, spacing, endAngle, circular); - ctx.fill(); - return endAngle; -} -function drawBorder(ctx, element, offset, spacing, circular) { - const { fullCircles, startAngle, circumference, options } = element; - const { borderWidth, borderJoinStyle } = options; - const inner = options.borderAlign === "inner"; - if (!borderWidth) { - return; - } - if (inner) { - ctx.lineWidth = borderWidth * 2; - ctx.lineJoin = borderJoinStyle || "round"; - } else { - ctx.lineWidth = borderWidth; - ctx.lineJoin = borderJoinStyle || "bevel"; - } - let endAngle = element.endAngle; - if (fullCircles) { - pathArc(ctx, element, offset, spacing, endAngle, circular); - for (let i = 0; i < fullCircles; ++i) { - ctx.stroke(); - } - if (!isNaN(circumference)) { - endAngle = startAngle + (circumference % TAU || TAU); - } - } - if (inner) { - clipArc(ctx, element, endAngle); - } - if (!fullCircles) { - pathArc(ctx, element, offset, spacing, endAngle, circular); - ctx.stroke(); - } -} -var ArcElement = class extends Element { - constructor(cfg) { - super(); - this.options = void 0; - this.circumference = void 0; - this.startAngle = void 0; - this.endAngle = void 0; - this.innerRadius = void 0; - this.outerRadius = void 0; - this.pixelMargin = 0; - this.fullCircles = 0; - if (cfg) { - Object.assign(this, cfg); - } - } - inRange(chartX, chartY, useFinalPosition) { - const point = this.getProps([ - "x", - "y" - ], useFinalPosition); - const { angle, distance } = getAngleFromPoint(point, { - x: chartX, - y: chartY - }); - const { startAngle, endAngle, innerRadius, outerRadius, circumference } = this.getProps([ - "startAngle", - "endAngle", - "innerRadius", - "outerRadius", - "circumference" - ], useFinalPosition); - const rAdjust = this.options.spacing / 2; - const _circumference = valueOrDefault(circumference, endAngle - startAngle); - const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle); - const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust); - return betweenAngles && withinRadius; - } - getCenterPoint(useFinalPosition) { - const { x, y, startAngle, endAngle, innerRadius, outerRadius } = this.getProps([ - "x", - "y", - "startAngle", - "endAngle", - "innerRadius", - "outerRadius" - ], useFinalPosition); - const { offset, spacing } = this.options; - const halfAngle = (startAngle + endAngle) / 2; - const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2; - return { - x: x + Math.cos(halfAngle) * halfRadius, - y: y + Math.sin(halfAngle) * halfRadius - }; - } - tooltipPosition(useFinalPosition) { - return this.getCenterPoint(useFinalPosition); - } - draw(ctx) { - const { options, circumference } = this; - const offset = (options.offset || 0) / 4; - const spacing = (options.spacing || 0) / 2; - const circular = options.circular; - this.pixelMargin = options.borderAlign === "inner" ? 0.33 : 0; - this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0; - if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) { - return; - } - ctx.save(); - const halfAngle = (this.startAngle + this.endAngle) / 2; - ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset); - const fix = 1 - Math.sin(Math.min(PI, circumference || 0)); - const radiusOffset = offset * fix; - ctx.fillStyle = options.backgroundColor; - ctx.strokeStyle = options.borderColor; - drawArc(ctx, this, radiusOffset, spacing, circular); - drawBorder(ctx, this, radiusOffset, spacing, circular); - ctx.restore(); - } -}; -__publicField(ArcElement, "id", "arc"); -__publicField(ArcElement, "defaults", { - borderAlign: "center", - borderColor: "#fff", - borderJoinStyle: void 0, - borderRadius: 0, - borderWidth: 2, - offset: 0, - spacing: 0, - angle: void 0, - circular: true -}); -__publicField(ArcElement, "defaultRoutes", { - backgroundColor: "backgroundColor" -}); -function getBarBounds(bar, useFinalPosition) { - const { x, y, base, width, height } = bar.getProps([ - "x", - "y", - "base", - "width", - "height" - ], useFinalPosition); - let left, right, top, bottom, half; - if (bar.horizontal) { - half = height / 2; - left = Math.min(x, base); - right = Math.max(x, base); - top = y - half; - bottom = y + half; - } else { - half = width / 2; - left = x - half; - right = x + half; - top = Math.min(y, base); - bottom = Math.max(y, base); - } - return { - left, - top, - right, - bottom - }; -} -function skipOrLimit(skip2, value, min, max) { - return skip2 ? 0 : _limitValue(value, min, max); -} -function parseBorderWidth(bar, maxW, maxH) { - const value = bar.options.borderWidth; - const skip2 = bar.borderSkipped; - const o = toTRBL(value); - return { - t: skipOrLimit(skip2.top, o.top, 0, maxH), - r: skipOrLimit(skip2.right, o.right, 0, maxW), - b: skipOrLimit(skip2.bottom, o.bottom, 0, maxH), - l: skipOrLimit(skip2.left, o.left, 0, maxW) - }; -} -function parseBorderRadius(bar, maxW, maxH) { - const { enableBorderRadius } = bar.getProps([ - "enableBorderRadius" - ]); - const value = bar.options.borderRadius; - const o = toTRBLCorners(value); - const maxR = Math.min(maxW, maxH); - const skip2 = bar.borderSkipped; - const enableBorder = enableBorderRadius || isObject(value); - return { - topLeft: skipOrLimit(!enableBorder || skip2.top || skip2.left, o.topLeft, 0, maxR), - topRight: skipOrLimit(!enableBorder || skip2.top || skip2.right, o.topRight, 0, maxR), - bottomLeft: skipOrLimit(!enableBorder || skip2.bottom || skip2.left, o.bottomLeft, 0, maxR), - bottomRight: skipOrLimit(!enableBorder || skip2.bottom || skip2.right, o.bottomRight, 0, maxR) - }; -} -function boundingRects(bar) { - const bounds = getBarBounds(bar); - const width = bounds.right - bounds.left; - const height = bounds.bottom - bounds.top; - const border = parseBorderWidth(bar, width / 2, height / 2); - const radius = parseBorderRadius(bar, width / 2, height / 2); - return { - outer: { - x: bounds.left, - y: bounds.top, - w: width, - h: height, - radius - }, - inner: { - x: bounds.left + border.l, - y: bounds.top + border.t, - w: width - border.l - border.r, - h: height - border.t - border.b, - radius: { - topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)), - topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)), - bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)), - bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)) - } - } - }; -} -function inRange(bar, x, y, useFinalPosition) { - const skipX = x === null; - const skipY = y === null; - const skipBoth = skipX && skipY; - const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition); - return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom)); -} -function hasRadius(radius) { - return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight; -} -function addNormalRectPath(ctx, rect) { - ctx.rect(rect.x, rect.y, rect.w, rect.h); -} -function inflateRect(rect, amount, refRect = {}) { - const x = rect.x !== refRect.x ? -amount : 0; - const y = rect.y !== refRect.y ? -amount : 0; - const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x; - const h4 = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y; - return { - x: rect.x + x, - y: rect.y + y, - w: rect.w + w, - h: rect.h + h4, - radius: rect.radius - }; -} -var BarElement = class extends Element { - constructor(cfg) { - super(); - this.options = void 0; - this.horizontal = void 0; - this.base = void 0; - this.width = void 0; - this.height = void 0; - this.inflateAmount = void 0; - if (cfg) { - Object.assign(this, cfg); - } - } - draw(ctx) { - const { inflateAmount, options: { borderColor, backgroundColor } } = this; - const { inner, outer } = boundingRects(this); - const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath; - ctx.save(); - if (outer.w !== inner.w || outer.h !== inner.h) { - ctx.beginPath(); - addRectPath(ctx, inflateRect(outer, inflateAmount, inner)); - ctx.clip(); - addRectPath(ctx, inflateRect(inner, -inflateAmount, outer)); - ctx.fillStyle = borderColor; - ctx.fill("evenodd"); - } - ctx.beginPath(); - addRectPath(ctx, inflateRect(inner, inflateAmount)); - ctx.fillStyle = backgroundColor; - ctx.fill(); - ctx.restore(); - } - inRange(mouseX, mouseY, useFinalPosition) { - return inRange(this, mouseX, mouseY, useFinalPosition); - } - inXRange(mouseX, useFinalPosition) { - return inRange(this, mouseX, null, useFinalPosition); - } - inYRange(mouseY, useFinalPosition) { - return inRange(this, null, mouseY, useFinalPosition); - } - getCenterPoint(useFinalPosition) { - const { x, y, base, horizontal } = this.getProps([ - "x", - "y", - "base", - "horizontal" - ], useFinalPosition); - return { - x: horizontal ? (x + base) / 2 : x, - y: horizontal ? y : (y + base) / 2 - }; - } - getRange(axis) { - return axis === "x" ? this.width / 2 : this.height / 2; - } -}; -__publicField(BarElement, "id", "bar"); -__publicField(BarElement, "defaults", { - borderSkipped: "start", - borderWidth: 0, - borderRadius: 0, - inflateAmount: "auto", - pointStyle: void 0 -}); -__publicField(BarElement, "defaultRoutes", { - backgroundColor: "backgroundColor", - borderColor: "borderColor" -}); -var getBoxSize = (labelOpts, fontSize) => { - let { boxHeight = fontSize, boxWidth = fontSize } = labelOpts; - if (labelOpts.usePointStyle) { - boxHeight = Math.min(boxHeight, fontSize); - boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize); - } - return { - boxWidth, - boxHeight, - itemHeight: Math.max(fontSize, boxHeight) - }; -}; -var itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index; -var Legend = class extends Element { - constructor(config) { - super(); - this._added = false; - this.legendHitBoxes = []; - this._hoveredItem = null; - this.doughnutMode = false; - this.chart = config.chart; - this.options = config.options; - this.ctx = config.ctx; - this.legendItems = void 0; - this.columnSizes = void 0; - this.lineWidths = void 0; - this.maxHeight = void 0; - this.maxWidth = void 0; - this.top = void 0; - this.bottom = void 0; - this.left = void 0; - this.right = void 0; - this.height = void 0; - this.width = void 0; - this._margins = void 0; - this.position = void 0; - this.weight = void 0; - this.fullSize = void 0; - } - update(maxWidth, maxHeight, margins) { - this.maxWidth = maxWidth; - this.maxHeight = maxHeight; - this._margins = margins; - this.setDimensions(); - this.buildLabels(); - this.fit(); - } - setDimensions() { - if (this.isHorizontal()) { - this.width = this.maxWidth; - this.left = this._margins.left; - this.right = this.width; - } else { - this.height = this.maxHeight; - this.top = this._margins.top; - this.bottom = this.height; - } - } - buildLabels() { - const labelOpts = this.options.labels || {}; - let legendItems = callback(labelOpts.generateLabels, [ - this.chart - ], this) || []; - if (labelOpts.filter) { - legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data)); - } - if (labelOpts.sort) { - legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data)); - } - if (this.options.reverse) { - legendItems.reverse(); - } - this.legendItems = legendItems; - } - fit() { - const { options, ctx } = this; - if (!options.display) { - this.width = this.height = 0; - return; - } - const labelOpts = options.labels; - const labelFont = toFont(labelOpts.font); - const fontSize = labelFont.size; - const titleHeight = this._computeTitleHeight(); - const { boxWidth, itemHeight } = getBoxSize(labelOpts, fontSize); - let width, height; - ctx.font = labelFont.string; - if (this.isHorizontal()) { - width = this.maxWidth; - height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10; - } else { - height = this.maxHeight; - width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10; - } - this.width = Math.min(width, options.maxWidth || this.maxWidth); - this.height = Math.min(height, options.maxHeight || this.maxHeight); - } - _fitRows(titleHeight, fontSize, boxWidth, itemHeight) { - const { ctx, maxWidth, options: { labels: { padding } } } = this; - const hitboxes = this.legendHitBoxes = []; - const lineWidths = this.lineWidths = [ - 0 - ]; - const lineHeight = itemHeight + padding; - let totalHeight = titleHeight; - ctx.textAlign = "left"; - ctx.textBaseline = "middle"; - let row = -1; - let top = -lineHeight; - this.legendItems.forEach((legendItem, i) => { - const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width; - if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) { - totalHeight += lineHeight; - lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0; - top += lineHeight; - row++; - } - hitboxes[i] = { - left: 0, - top, - row, - width: itemWidth, - height: itemHeight - }; - lineWidths[lineWidths.length - 1] += itemWidth + padding; - }); - return totalHeight; - } - _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) { - const { ctx, maxHeight, options: { labels: { padding } } } = this; - const hitboxes = this.legendHitBoxes = []; - const columnSizes = this.columnSizes = []; - const heightLimit = maxHeight - titleHeight; - let totalWidth = padding; - let currentColWidth = 0; - let currentColHeight = 0; - let left = 0; - let col = 0; - this.legendItems.forEach((legendItem, i) => { - const { itemWidth, itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight); - if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) { - totalWidth += currentColWidth + padding; - columnSizes.push({ - width: currentColWidth, - height: currentColHeight - }); - left += currentColWidth + padding; - col++; - currentColWidth = currentColHeight = 0; - } - hitboxes[i] = { - left, - top: currentColHeight, - col, - width: itemWidth, - height: itemHeight - }; - currentColWidth = Math.max(currentColWidth, itemWidth); - currentColHeight += itemHeight + padding; - }); - totalWidth += currentColWidth; - columnSizes.push({ - width: currentColWidth, - height: currentColHeight - }); - return totalWidth; - } - adjustHitBoxes() { - if (!this.options.display) { - return; - } - const titleHeight = this._computeTitleHeight(); - const { legendHitBoxes: hitboxes, options: { align, labels: { padding }, rtl } } = this; - const rtlHelper = getRtlAdapter(rtl, this.left, this.width); - if (this.isHorizontal()) { - let row = 0; - let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); - for (const hitbox of hitboxes) { - if (row !== hitbox.row) { - row = hitbox.row; - left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]); - } - hitbox.top += this.top + titleHeight + padding; - hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width); - left += hitbox.width + padding; - } - } else { - let col = 0; - let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); - for (const hitbox1 of hitboxes) { - if (hitbox1.col !== col) { - col = hitbox1.col; - top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height); - } - hitbox1.top = top; - hitbox1.left += this.left + padding; - hitbox1.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox1.left), hitbox1.width); - top += hitbox1.height + padding; - } - } - } - isHorizontal() { - return this.options.position === "top" || this.options.position === "bottom"; - } - draw() { - if (this.options.display) { - const ctx = this.ctx; - clipArea(ctx, this); - this._draw(); - unclipArea(ctx); - } - } - _draw() { - const { options: opts, columnSizes, lineWidths, ctx } = this; - const { align, labels: labelOpts } = opts; - const defaultColor = defaults.color; - const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); - const labelFont = toFont(labelOpts.font); - const { padding } = labelOpts; - const fontSize = labelFont.size; - const halfFontSize = fontSize / 2; - let cursor; - this.drawTitle(); - ctx.textAlign = rtlHelper.textAlign("left"); - ctx.textBaseline = "middle"; - ctx.lineWidth = 0.5; - ctx.font = labelFont.string; - const { boxWidth, boxHeight, itemHeight } = getBoxSize(labelOpts, fontSize); - const drawLegendBox = function(x, y, legendItem) { - if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) { - return; - } - ctx.save(); - const lineWidth = valueOrDefault(legendItem.lineWidth, 1); - ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor); - ctx.lineCap = valueOrDefault(legendItem.lineCap, "butt"); - ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0); - ctx.lineJoin = valueOrDefault(legendItem.lineJoin, "miter"); - ctx.lineWidth = lineWidth; - ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor); - ctx.setLineDash(valueOrDefault(legendItem.lineDash, [])); - if (labelOpts.usePointStyle) { - const drawOptions = { - radius: boxHeight * Math.SQRT2 / 2, - pointStyle: legendItem.pointStyle, - rotation: legendItem.rotation, - borderWidth: lineWidth - }; - const centerX = rtlHelper.xPlus(x, boxWidth / 2); - const centerY = y + halfFontSize; - drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth); - } else { - const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0); - const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth); - const borderRadius = toTRBLCorners(legendItem.borderRadius); - ctx.beginPath(); - if (Object.values(borderRadius).some((v) => v !== 0)) { - addRoundedRectPath(ctx, { - x: xBoxLeft, - y: yBoxTop, - w: boxWidth, - h: boxHeight, - radius: borderRadius - }); - } else { - ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight); - } - ctx.fill(); - if (lineWidth !== 0) { - ctx.stroke(); - } - } - ctx.restore(); - }; - const fillText = function(x, y, legendItem) { - renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, { - strikethrough: legendItem.hidden, - textAlign: rtlHelper.textAlign(legendItem.textAlign) - }); - }; - const isHorizontal = this.isHorizontal(); - const titleHeight = this._computeTitleHeight(); - if (isHorizontal) { - cursor = { - x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]), - y: this.top + padding + titleHeight, - line: 0 - }; - } else { - cursor = { - x: this.left + padding, - y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height), - line: 0 - }; - } - overrideTextDirection(this.ctx, opts.textDirection); - const lineHeight = itemHeight + padding; - this.legendItems.forEach((legendItem, i) => { - ctx.strokeStyle = legendItem.fontColor; - ctx.fillStyle = legendItem.fontColor; - const textWidth = ctx.measureText(legendItem.text).width; - const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign)); - const width = boxWidth + halfFontSize + textWidth; - let x = cursor.x; - let y = cursor.y; - rtlHelper.setWidth(this.width); - if (isHorizontal) { - if (i > 0 && x + width + padding > this.right) { - y = cursor.y += lineHeight; - cursor.line++; - x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]); - } - } else if (i > 0 && y + lineHeight > this.bottom) { - x = cursor.x = x + columnSizes[cursor.line].width + padding; - cursor.line++; - y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height); - } - const realX = rtlHelper.x(x); - drawLegendBox(realX, y, legendItem); - x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl); - fillText(rtlHelper.x(x), y, legendItem); - if (isHorizontal) { - cursor.x += width + padding; - } else if (typeof legendItem.text !== "string") { - const fontLineHeight = labelFont.lineHeight; - cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight); - } else { - cursor.y += lineHeight; - } - }); - restoreTextDirection(this.ctx, opts.textDirection); - } - drawTitle() { - const opts = this.options; - const titleOpts = opts.title; - const titleFont = toFont(titleOpts.font); - const titlePadding = toPadding(titleOpts.padding); - if (!titleOpts.display) { - return; - } - const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width); - const ctx = this.ctx; - const position = titleOpts.position; - const halfFontSize = titleFont.size / 2; - const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize; - let y; - let left = this.left; - let maxWidth = this.width; - if (this.isHorizontal()) { - maxWidth = Math.max(...this.lineWidths); - y = this.top + topPaddingPlusHalfFontSize; - left = _alignStartEnd(opts.align, left, this.right - maxWidth); - } else { - const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0); - y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight()); - } - const x = _alignStartEnd(position, left, left + maxWidth); - ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position)); - ctx.textBaseline = "middle"; - ctx.strokeStyle = titleOpts.color; - ctx.fillStyle = titleOpts.color; - ctx.font = titleFont.string; - renderText(ctx, titleOpts.text, x, y, titleFont); - } - _computeTitleHeight() { - const titleOpts = this.options.title; - const titleFont = toFont(titleOpts.font); - const titlePadding = toPadding(titleOpts.padding); - return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0; - } - _getLegendItemAt(x, y) { - let i, hitBox, lh; - if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) { - lh = this.legendHitBoxes; - for (i = 0; i < lh.length; ++i) { - hitBox = lh[i]; - if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) { - return this.legendItems[i]; - } - } - } - return null; - } - handleEvent(e) { - const opts = this.options; - if (!isListened(e.type, opts)) { - return; - } - const hoveredItem = this._getLegendItemAt(e.x, e.y); - if (e.type === "mousemove" || e.type === "mouseout") { - const previous = this._hoveredItem; - const sameItem = itemsEqual(previous, hoveredItem); - if (previous && !sameItem) { - callback(opts.onLeave, [ - e, - previous, - this - ], this); - } - this._hoveredItem = hoveredItem; - if (hoveredItem && !sameItem) { - callback(opts.onHover, [ - e, - hoveredItem, - this - ], this); - } - } else if (hoveredItem) { - callback(opts.onClick, [ - e, - hoveredItem, - this - ], this); - } - } -}; -function calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) { - const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx); - const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight); - return { - itemWidth, - itemHeight - }; -} -function calculateItemWidth(legendItem, boxWidth, labelFont, ctx) { - let legendItemText = legendItem.text; - if (legendItemText && typeof legendItemText !== "string") { - legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b); - } - return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width; -} -function calculateItemHeight(_itemHeight, legendItem, fontLineHeight) { - let itemHeight = _itemHeight; - if (typeof legendItem.text !== "string") { - itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight); - } - return itemHeight; -} -function calculateLegendItemHeight(legendItem, fontLineHeight) { - const labelHeight = legendItem.text ? legendItem.text.length + 0.5 : 0; - return fontLineHeight * labelHeight; -} -function isListened(type, opts) { - if ((type === "mousemove" || type === "mouseout") && (opts.onHover || opts.onLeave)) { - return true; - } - if (opts.onClick && (type === "click" || type === "mouseup")) { - return true; - } - return false; -} -var plugin_legend = { - id: "legend", - _element: Legend, - start(chart, _args, options) { - const legend = chart.legend = new Legend({ - ctx: chart.ctx, - options, - chart - }); - layouts.configure(chart, legend, options); - layouts.addBox(chart, legend); - }, - stop(chart) { - layouts.removeBox(chart, chart.legend); - delete chart.legend; - }, - beforeUpdate(chart, _args, options) { - const legend = chart.legend; - layouts.configure(chart, legend, options); - legend.options = options; - }, - afterUpdate(chart) { - const legend = chart.legend; - legend.buildLabels(); - legend.adjustHitBoxes(); - }, - afterEvent(chart, args) { - if (!args.replay) { - chart.legend.handleEvent(args.event); - } - }, - defaults: { - display: true, - position: "top", - align: "center", - fullSize: true, - reverse: false, - weight: 1e3, - onClick(e, legendItem, legend) { - const index = legendItem.datasetIndex; - const ci = legend.chart; - if (ci.isDatasetVisible(index)) { - ci.hide(index); - legendItem.hidden = true; - } else { - ci.show(index); - legendItem.hidden = false; - } - }, - onHover: null, - onLeave: null, - labels: { - color: (ctx) => ctx.chart.options.color, - boxWidth: 40, - padding: 10, - generateLabels(chart) { - const datasets = chart.data.datasets; - const { labels: { usePointStyle, pointStyle, textAlign, color: color2, useBorderRadius, borderRadius } } = chart.legend.options; - return chart._getSortedDatasetMetas().map((meta) => { - const style = meta.controller.getStyle(usePointStyle ? 0 : void 0); - const borderWidth = toPadding(style.borderWidth); - return { - text: datasets[meta.index].label, - fillStyle: style.backgroundColor, - fontColor: color2, - hidden: !meta.visible, - lineCap: style.borderCapStyle, - lineDash: style.borderDash, - lineDashOffset: style.borderDashOffset, - lineJoin: style.borderJoinStyle, - lineWidth: (borderWidth.width + borderWidth.height) / 4, - strokeStyle: style.borderColor, - pointStyle: pointStyle || style.pointStyle, - rotation: style.rotation, - textAlign: textAlign || style.textAlign, - borderRadius: useBorderRadius && (borderRadius || style.borderRadius), - datasetIndex: meta.index - }; - }, this); - } - }, - title: { - color: (ctx) => ctx.chart.options.color, - display: false, - position: "center", - text: "" - } - }, - descriptors: { - _scriptable: (name2) => !name2.startsWith("on"), - labels: { - _scriptable: (name2) => ![ - "generateLabels", - "filter", - "sort" - ].includes(name2) - } - } -}; -var Title = class extends Element { - constructor(config) { - super(); - this.chart = config.chart; - this.options = config.options; - this.ctx = config.ctx; - this._padding = void 0; - this.top = void 0; - this.bottom = void 0; - this.left = void 0; - this.right = void 0; - this.width = void 0; - this.height = void 0; - this.position = void 0; - this.weight = void 0; - this.fullSize = void 0; - } - update(maxWidth, maxHeight) { - const opts = this.options; - this.left = 0; - this.top = 0; - if (!opts.display) { - this.width = this.height = this.right = this.bottom = 0; - return; - } - this.width = this.right = maxWidth; - this.height = this.bottom = maxHeight; - const lineCount = isArray(opts.text) ? opts.text.length : 1; - this._padding = toPadding(opts.padding); - const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height; - if (this.isHorizontal()) { - this.height = textSize; - } else { - this.width = textSize; - } - } - isHorizontal() { - const pos = this.options.position; - return pos === "top" || pos === "bottom"; - } - _drawArgs(offset) { - const { top, left, bottom, right, options } = this; - const align = options.align; - let rotation = 0; - let maxWidth, titleX, titleY; - if (this.isHorizontal()) { - titleX = _alignStartEnd(align, left, right); - titleY = top + offset; - maxWidth = right - left; - } else { - if (options.position === "left") { - titleX = left + offset; - titleY = _alignStartEnd(align, bottom, top); - rotation = PI * -0.5; - } else { - titleX = right - offset; - titleY = _alignStartEnd(align, top, bottom); - rotation = PI * 0.5; - } - maxWidth = bottom - top; - } - return { - titleX, - titleY, - maxWidth, - rotation - }; - } - draw() { - const ctx = this.ctx; - const opts = this.options; - if (!opts.display) { - return; - } - const fontOpts = toFont(opts.font); - const lineHeight = fontOpts.lineHeight; - const offset = lineHeight / 2 + this._padding.top; - const { titleX, titleY, maxWidth, rotation } = this._drawArgs(offset); - renderText(ctx, opts.text, 0, 0, fontOpts, { - color: opts.color, - maxWidth, - rotation, - textAlign: _toLeftRightCenter(opts.align), - textBaseline: "middle", - translation: [ - titleX, - titleY - ] - }); - } -}; -function createTitle(chart, titleOpts) { - const title = new Title({ - ctx: chart.ctx, - options: titleOpts, - chart - }); - layouts.configure(chart, title, titleOpts); - layouts.addBox(chart, title); - chart.titleBlock = title; -} -var plugin_title = { - id: "title", - _element: Title, - start(chart, _args, options) { - createTitle(chart, options); - }, - stop(chart) { - const titleBlock = chart.titleBlock; - layouts.removeBox(chart, titleBlock); - delete chart.titleBlock; - }, - beforeUpdate(chart, _args, options) { - const title = chart.titleBlock; - layouts.configure(chart, title, options); - title.options = options; - }, - defaults: { - align: "center", - display: false, - font: { - weight: "bold" - }, - fullSize: true, - padding: 10, - position: "top", - text: "", - weight: 2e3 - }, - defaultRoutes: { - color: "color" - }, - descriptors: { - _scriptable: true, - _indexable: false - } -}; -var map2 = /* @__PURE__ */ new WeakMap(); -var plugin_subtitle = { - id: "subtitle", - start(chart, _args, options) { - const title = new Title({ - ctx: chart.ctx, - options, - chart - }); - layouts.configure(chart, title, options); - layouts.addBox(chart, title); - map2.set(chart, title); - }, - stop(chart) { - layouts.removeBox(chart, map2.get(chart)); - map2.delete(chart); - }, - beforeUpdate(chart, _args, options) { - const title = map2.get(chart); - layouts.configure(chart, title, options); - title.options = options; - }, - defaults: { - align: "center", - display: false, - font: { - weight: "normal" - }, - fullSize: true, - padding: 0, - position: "top", - text: "", - weight: 1500 - }, - defaultRoutes: { - color: "color" - }, - descriptors: { - _scriptable: true, - _indexable: false - } -}; -var positioners = { - average(items) { - if (!items.length) { - return false; - } - let i, len; - let x = 0; - let y = 0; - let count = 0; - for (i = 0, len = items.length; i < len; ++i) { - const el = items[i].element; - if (el && el.hasValue()) { - const pos = el.tooltipPosition(); - x += pos.x; - y += pos.y; - ++count; - } - } - return { - x: x / count, - y: y / count - }; - }, - nearest(items, eventPosition) { - if (!items.length) { - return false; - } - let x = eventPosition.x; - let y = eventPosition.y; - let minDistance = Number.POSITIVE_INFINITY; - let i, len, nearestElement; - for (i = 0, len = items.length; i < len; ++i) { - const el = items[i].element; - if (el && el.hasValue()) { - const center = el.getCenterPoint(); - const d = distanceBetweenPoints(eventPosition, center); - if (d < minDistance) { - minDistance = d; - nearestElement = el; - } - } - } - if (nearestElement) { - const tp = nearestElement.tooltipPosition(); - x = tp.x; - y = tp.y; - } - return { - x, - y - }; - } -}; -function pushOrConcat(base, toPush) { - if (toPush) { - if (isArray(toPush)) { - Array.prototype.push.apply(base, toPush); - } else { - base.push(toPush); - } - } - return base; -} -function splitNewlines(str) { - if ((typeof str === "string" || str instanceof String) && str.indexOf("\n") > -1) { - return str.split("\n"); - } - return str; -} -function createTooltipItem(chart, item) { - const { element, datasetIndex, index } = item; - const controller = chart.getDatasetMeta(datasetIndex).controller; - const { label, value } = controller.getLabelAndValue(index); - return { - chart, - label, - parsed: controller.getParsed(index), - raw: chart.data.datasets[datasetIndex].data[index], - formattedValue: value, - dataset: controller.getDataset(), - dataIndex: index, - datasetIndex, - element - }; -} -function getTooltipSize(tooltip, options) { - const ctx = tooltip.chart.ctx; - const { body, footer, title } = tooltip; - const { boxWidth, boxHeight } = options; - const bodyFont = toFont(options.bodyFont); - const titleFont = toFont(options.titleFont); - const footerFont = toFont(options.footerFont); - const titleLineCount = title.length; - const footerLineCount = footer.length; - const bodyLineItemCount = body.length; - const padding = toPadding(options.padding); - let height = padding.height; - let width = 0; - let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0); - combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length; - if (titleLineCount) { - height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom; - } - if (combinedBodyLength) { - const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight; - height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing; - } - if (footerLineCount) { - height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing; - } - let widthPadding = 0; - const maxLineWidth = function(line) { - width = Math.max(width, ctx.measureText(line).width + widthPadding); - }; - ctx.save(); - ctx.font = titleFont.string; - each(tooltip.title, maxLineWidth); - ctx.font = bodyFont.string; - each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth); - widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0; - each(body, (bodyItem) => { - each(bodyItem.before, maxLineWidth); - each(bodyItem.lines, maxLineWidth); - each(bodyItem.after, maxLineWidth); - }); - widthPadding = 0; - ctx.font = footerFont.string; - each(tooltip.footer, maxLineWidth); - ctx.restore(); - width += padding.width; - return { - width, - height - }; -} -function determineYAlign(chart, size) { - const { y, height } = size; - if (y < height / 2) { - return "top"; - } else if (y > chart.height - height / 2) { - return "bottom"; - } - return "center"; -} -function doesNotFitWithAlign(xAlign, chart, options, size) { - const { x, width } = size; - const caret = options.caretSize + options.caretPadding; - if (xAlign === "left" && x + width + caret > chart.width) { - return true; - } - if (xAlign === "right" && x - width - caret < 0) { - return true; - } -} -function determineXAlign(chart, options, size, yAlign) { - const { x, width } = size; - const { width: chartWidth, chartArea: { left, right } } = chart; - let xAlign = "center"; - if (yAlign === "center") { - xAlign = x <= (left + right) / 2 ? "left" : "right"; - } else if (x <= width / 2) { - xAlign = "left"; - } else if (x >= chartWidth - width / 2) { - xAlign = "right"; - } - if (doesNotFitWithAlign(xAlign, chart, options, size)) { - xAlign = "center"; - } - return xAlign; -} -function determineAlignment(chart, options, size) { - const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size); - return { - xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign), - yAlign - }; -} -function alignX(size, xAlign) { - let { x, width } = size; - if (xAlign === "right") { - x -= width; - } else if (xAlign === "center") { - x -= width / 2; - } - return x; -} -function alignY(size, yAlign, paddingAndSize) { - let { y, height } = size; - if (yAlign === "top") { - y += paddingAndSize; - } else if (yAlign === "bottom") { - y -= height + paddingAndSize; - } else { - y -= height / 2; - } - return y; -} -function getBackgroundPoint(options, size, alignment, chart) { - const { caretSize, caretPadding, cornerRadius } = options; - const { xAlign, yAlign } = alignment; - const paddingAndSize = caretSize + caretPadding; - const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius); - let x = alignX(size, xAlign); - const y = alignY(size, yAlign, paddingAndSize); - if (yAlign === "center") { - if (xAlign === "left") { - x += paddingAndSize; - } else if (xAlign === "right") { - x -= paddingAndSize; - } - } else if (xAlign === "left") { - x -= Math.max(topLeft, bottomLeft) + caretSize; - } else if (xAlign === "right") { - x += Math.max(topRight, bottomRight) + caretSize; - } - return { - x: _limitValue(x, 0, chart.width - size.width), - y: _limitValue(y, 0, chart.height - size.height) - }; -} -function getAlignedX(tooltip, align, options) { - const padding = toPadding(options.padding); - return align === "center" ? tooltip.x + tooltip.width / 2 : align === "right" ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left; -} -function getBeforeAfterBodyLines(callback2) { - return pushOrConcat([], splitNewlines(callback2)); -} -function createTooltipContext(parent, tooltip, tooltipItems) { - return createContext(parent, { - tooltip, - tooltipItems, - type: "tooltip" - }); -} -function overrideCallbacks(callbacks, context) { - const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks; - return override ? callbacks.override(override) : callbacks; -} -var defaultCallbacks = { - beforeTitle: noop, - title(tooltipItems) { - if (tooltipItems.length > 0) { - const item = tooltipItems[0]; - const labels = item.chart.data.labels; - const labelCount = labels ? labels.length : 0; - if (this && this.options && this.options.mode === "dataset") { - return item.dataset.label || ""; - } else if (item.label) { - return item.label; - } else if (labelCount > 0 && item.dataIndex < labelCount) { - return labels[item.dataIndex]; - } - } - return ""; - }, - afterTitle: noop, - beforeBody: noop, - beforeLabel: noop, - label(tooltipItem) { - if (this && this.options && this.options.mode === "dataset") { - return tooltipItem.label + ": " + tooltipItem.formattedValue || tooltipItem.formattedValue; - } - let label = tooltipItem.dataset.label || ""; - if (label) { - label += ": "; - } - const value = tooltipItem.formattedValue; - if (!isNullOrUndef(value)) { - label += value; - } - return label; - }, - labelColor(tooltipItem) { - const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); - const options = meta.controller.getStyle(tooltipItem.dataIndex); - return { - borderColor: options.borderColor, - backgroundColor: options.backgroundColor, - borderWidth: options.borderWidth, - borderDash: options.borderDash, - borderDashOffset: options.borderDashOffset, - borderRadius: 0 - }; - }, - labelTextColor() { - return this.options.bodyColor; - }, - labelPointStyle(tooltipItem) { - const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex); - const options = meta.controller.getStyle(tooltipItem.dataIndex); - return { - pointStyle: options.pointStyle, - rotation: options.rotation - }; - }, - afterLabel: noop, - afterBody: noop, - beforeFooter: noop, - footer: noop, - afterFooter: noop -}; -function invokeCallbackWithFallback(callbacks, name2, ctx, arg) { - const result = callbacks[name2].call(ctx, arg); - if (typeof result === "undefined") { - return defaultCallbacks[name2].call(ctx, arg); - } - return result; -} -var Tooltip = class extends Element { - constructor(config) { - super(); - this.opacity = 0; - this._active = []; - this._eventPosition = void 0; - this._size = void 0; - this._cachedAnimations = void 0; - this._tooltipItems = []; - this.$animations = void 0; - this.$context = void 0; - this.chart = config.chart; - this.options = config.options; - this.dataPoints = void 0; - this.title = void 0; - this.beforeBody = void 0; - this.body = void 0; - this.afterBody = void 0; - this.footer = void 0; - this.xAlign = void 0; - this.yAlign = void 0; - this.x = void 0; - this.y = void 0; - this.height = void 0; - this.width = void 0; - this.caretX = void 0; - this.caretY = void 0; - this.labelColors = void 0; - this.labelPointStyles = void 0; - this.labelTextColors = void 0; - } - initialize(options) { - this.options = options; - this._cachedAnimations = void 0; - this.$context = void 0; - } - _resolveAnimations() { - const cached = this._cachedAnimations; - if (cached) { - return cached; - } - const chart = this.chart; - const options = this.options.setContext(this.getContext()); - const opts = options.enabled && chart.options.animation && options.animations; - const animations = new Animations(this.chart, opts); - if (opts._cacheable) { - this._cachedAnimations = Object.freeze(animations); - } - return animations; - } - getContext() { - return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems)); - } - getTitle(context, options) { - const { callbacks } = options; - const beforeTitle = invokeCallbackWithFallback(callbacks, "beforeTitle", this, context); - const title = invokeCallbackWithFallback(callbacks, "title", this, context); - const afterTitle = invokeCallbackWithFallback(callbacks, "afterTitle", this, context); - let lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeTitle)); - lines = pushOrConcat(lines, splitNewlines(title)); - lines = pushOrConcat(lines, splitNewlines(afterTitle)); - return lines; - } - getBeforeBody(tooltipItems, options) { - return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "beforeBody", this, tooltipItems)); - } - getBody(tooltipItems, options) { - const { callbacks } = options; - const bodyItems = []; - each(tooltipItems, (context) => { - const bodyItem = { - before: [], - lines: [], - after: [] - }; - const scoped = overrideCallbacks(callbacks, context); - pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, "beforeLabel", this, context))); - pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, "label", this, context)); - pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, "afterLabel", this, context))); - bodyItems.push(bodyItem); - }); - return bodyItems; - } - getAfterBody(tooltipItems, options) { - return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, "afterBody", this, tooltipItems)); - } - getFooter(tooltipItems, options) { - const { callbacks } = options; - const beforeFooter = invokeCallbackWithFallback(callbacks, "beforeFooter", this, tooltipItems); - const footer = invokeCallbackWithFallback(callbacks, "footer", this, tooltipItems); - const afterFooter = invokeCallbackWithFallback(callbacks, "afterFooter", this, tooltipItems); - let lines = []; - lines = pushOrConcat(lines, splitNewlines(beforeFooter)); - lines = pushOrConcat(lines, splitNewlines(footer)); - lines = pushOrConcat(lines, splitNewlines(afterFooter)); - return lines; - } - _createItems(options) { - const active = this._active; - const data = this.chart.data; - const labelColors = []; - const labelPointStyles = []; - const labelTextColors = []; - let tooltipItems = []; - let i, len; - for (i = 0, len = active.length; i < len; ++i) { - tooltipItems.push(createTooltipItem(this.chart, active[i])); - } - if (options.filter) { - tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data)); - } - if (options.itemSort) { - tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data)); - } - each(tooltipItems, (context) => { - const scoped = overrideCallbacks(options.callbacks, context); - labelColors.push(invokeCallbackWithFallback(scoped, "labelColor", this, context)); - labelPointStyles.push(invokeCallbackWithFallback(scoped, "labelPointStyle", this, context)); - labelTextColors.push(invokeCallbackWithFallback(scoped, "labelTextColor", this, context)); - }); - this.labelColors = labelColors; - this.labelPointStyles = labelPointStyles; - this.labelTextColors = labelTextColors; - this.dataPoints = tooltipItems; - return tooltipItems; - } - update(changed, replay) { - const options = this.options.setContext(this.getContext()); - const active = this._active; - let properties; - let tooltipItems = []; - if (!active.length) { - if (this.opacity !== 0) { - properties = { - opacity: 0 - }; - } - } else { - const position = positioners[options.position].call(this, active, this._eventPosition); - tooltipItems = this._createItems(options); - this.title = this.getTitle(tooltipItems, options); - this.beforeBody = this.getBeforeBody(tooltipItems, options); - this.body = this.getBody(tooltipItems, options); - this.afterBody = this.getAfterBody(tooltipItems, options); - this.footer = this.getFooter(tooltipItems, options); - const size = this._size = getTooltipSize(this, options); - const positionAndSize = Object.assign({}, position, size); - const alignment = determineAlignment(this.chart, options, positionAndSize); - const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart); - this.xAlign = alignment.xAlign; - this.yAlign = alignment.yAlign; - properties = { - opacity: 1, - x: backgroundPoint.x, - y: backgroundPoint.y, - width: size.width, - height: size.height, - caretX: position.x, - caretY: position.y - }; - } - this._tooltipItems = tooltipItems; - this.$context = void 0; - if (properties) { - this._resolveAnimations().update(this, properties); - } - if (changed && options.external) { - options.external.call(this, { - chart: this.chart, - tooltip: this, - replay - }); - } - } - drawCaret(tooltipPoint, ctx, size, options) { - const caretPosition = this.getCaretPosition(tooltipPoint, size, options); - ctx.lineTo(caretPosition.x1, caretPosition.y1); - ctx.lineTo(caretPosition.x2, caretPosition.y2); - ctx.lineTo(caretPosition.x3, caretPosition.y3); - } - getCaretPosition(tooltipPoint, size, options) { - const { xAlign, yAlign } = this; - const { caretSize, cornerRadius } = options; - const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(cornerRadius); - const { x: ptX, y: ptY } = tooltipPoint; - const { width, height } = size; - let x1, x2, x3, y1, y2, y3; - if (yAlign === "center") { - y2 = ptY + height / 2; - if (xAlign === "left") { - x1 = ptX; - x2 = x1 - caretSize; - y1 = y2 + caretSize; - y3 = y2 - caretSize; - } else { - x1 = ptX + width; - x2 = x1 + caretSize; - y1 = y2 - caretSize; - y3 = y2 + caretSize; - } - x3 = x1; - } else { - if (xAlign === "left") { - x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize; - } else if (xAlign === "right") { - x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize; - } else { - x2 = this.caretX; - } - if (yAlign === "top") { - y1 = ptY; - y2 = y1 - caretSize; - x1 = x2 - caretSize; - x3 = x2 + caretSize; - } else { - y1 = ptY + height; - y2 = y1 + caretSize; - x1 = x2 + caretSize; - x3 = x2 - caretSize; - } - y3 = y1; - } - return { - x1, - x2, - x3, - y1, - y2, - y3 - }; - } - drawTitle(pt, ctx, options) { - const title = this.title; - const length = title.length; - let titleFont, titleSpacing, i; - if (length) { - const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); - pt.x = getAlignedX(this, options.titleAlign, options); - ctx.textAlign = rtlHelper.textAlign(options.titleAlign); - ctx.textBaseline = "middle"; - titleFont = toFont(options.titleFont); - titleSpacing = options.titleSpacing; - ctx.fillStyle = options.titleColor; - ctx.font = titleFont.string; - for (i = 0; i < length; ++i) { - ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2); - pt.y += titleFont.lineHeight + titleSpacing; - if (i + 1 === length) { - pt.y += options.titleMarginBottom - titleSpacing; - } - } - } - } - _drawColorBox(ctx, pt, i, rtlHelper, options) { - const labelColors = this.labelColors[i]; - const labelPointStyle = this.labelPointStyles[i]; - const { boxHeight, boxWidth, boxPadding } = options; - const bodyFont = toFont(options.bodyFont); - const colorX = getAlignedX(this, "left", options); - const rtlColorX = rtlHelper.x(colorX); - const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0; - const colorY = pt.y + yOffSet; - if (options.usePointStyle) { - const drawOptions = { - radius: Math.min(boxWidth, boxHeight) / 2, - pointStyle: labelPointStyle.pointStyle, - rotation: labelPointStyle.rotation, - borderWidth: 1 - }; - const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2; - const centerY = colorY + boxHeight / 2; - ctx.strokeStyle = options.multiKeyBackground; - ctx.fillStyle = options.multiKeyBackground; - drawPoint(ctx, drawOptions, centerX, centerY); - ctx.strokeStyle = labelColors.borderColor; - ctx.fillStyle = labelColors.backgroundColor; - drawPoint(ctx, drawOptions, centerX, centerY); - } else { - ctx.lineWidth = isObject(labelColors.borderWidth) ? Math.max(...Object.values(labelColors.borderWidth)) : labelColors.borderWidth || 1; - ctx.strokeStyle = labelColors.borderColor; - ctx.setLineDash(labelColors.borderDash || []); - ctx.lineDashOffset = labelColors.borderDashOffset || 0; - const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding); - const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2); - const borderRadius = toTRBLCorners(labelColors.borderRadius); - if (Object.values(borderRadius).some((v) => v !== 0)) { - ctx.beginPath(); - ctx.fillStyle = options.multiKeyBackground; - addRoundedRectPath(ctx, { - x: outerX, - y: colorY, - w: boxWidth, - h: boxHeight, - radius: borderRadius - }); - ctx.fill(); - ctx.stroke(); - ctx.fillStyle = labelColors.backgroundColor; - ctx.beginPath(); - addRoundedRectPath(ctx, { - x: innerX, - y: colorY + 1, - w: boxWidth - 2, - h: boxHeight - 2, - radius: borderRadius - }); - ctx.fill(); - } else { - ctx.fillStyle = options.multiKeyBackground; - ctx.fillRect(outerX, colorY, boxWidth, boxHeight); - ctx.strokeRect(outerX, colorY, boxWidth, boxHeight); - ctx.fillStyle = labelColors.backgroundColor; - ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2); - } - } - ctx.fillStyle = this.labelTextColors[i]; - } - drawBody(pt, ctx, options) { - const { body } = this; - const { bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding } = options; - const bodyFont = toFont(options.bodyFont); - let bodyLineHeight = bodyFont.lineHeight; - let xLinePadding = 0; - const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); - const fillLineOfText = function(line) { - ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2); - pt.y += bodyLineHeight + bodySpacing; - }; - const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign); - let bodyItem, textColor, lines, i, j, ilen, jlen; - ctx.textAlign = bodyAlign; - ctx.textBaseline = "middle"; - ctx.font = bodyFont.string; - pt.x = getAlignedX(this, bodyAlignForCalculation, options); - ctx.fillStyle = options.bodyColor; - each(this.beforeBody, fillLineOfText); - xLinePadding = displayColors && bodyAlignForCalculation !== "right" ? bodyAlign === "center" ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0; - for (i = 0, ilen = body.length; i < ilen; ++i) { - bodyItem = body[i]; - textColor = this.labelTextColors[i]; - ctx.fillStyle = textColor; - each(bodyItem.before, fillLineOfText); - lines = bodyItem.lines; - if (displayColors && lines.length) { - this._drawColorBox(ctx, pt, i, rtlHelper, options); - bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight); - } - for (j = 0, jlen = lines.length; j < jlen; ++j) { - fillLineOfText(lines[j]); - bodyLineHeight = bodyFont.lineHeight; - } - each(bodyItem.after, fillLineOfText); - } - xLinePadding = 0; - bodyLineHeight = bodyFont.lineHeight; - each(this.afterBody, fillLineOfText); - pt.y -= bodySpacing; - } - drawFooter(pt, ctx, options) { - const footer = this.footer; - const length = footer.length; - let footerFont, i; - if (length) { - const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width); - pt.x = getAlignedX(this, options.footerAlign, options); - pt.y += options.footerMarginTop; - ctx.textAlign = rtlHelper.textAlign(options.footerAlign); - ctx.textBaseline = "middle"; - footerFont = toFont(options.footerFont); - ctx.fillStyle = options.footerColor; - ctx.font = footerFont.string; - for (i = 0; i < length; ++i) { - ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2); - pt.y += footerFont.lineHeight + options.footerSpacing; - } - } - } - drawBackground(pt, ctx, tooltipSize, options) { - const { xAlign, yAlign } = this; - const { x, y } = pt; - const { width, height } = tooltipSize; - const { topLeft, topRight, bottomLeft, bottomRight } = toTRBLCorners(options.cornerRadius); - ctx.fillStyle = options.backgroundColor; - ctx.strokeStyle = options.borderColor; - ctx.lineWidth = options.borderWidth; - ctx.beginPath(); - ctx.moveTo(x + topLeft, y); - if (yAlign === "top") { - this.drawCaret(pt, ctx, tooltipSize, options); - } - ctx.lineTo(x + width - topRight, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + topRight); - if (yAlign === "center" && xAlign === "right") { - this.drawCaret(pt, ctx, tooltipSize, options); - } - ctx.lineTo(x + width, y + height - bottomRight); - ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height); - if (yAlign === "bottom") { - this.drawCaret(pt, ctx, tooltipSize, options); - } - ctx.lineTo(x + bottomLeft, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft); - if (yAlign === "center" && xAlign === "left") { - this.drawCaret(pt, ctx, tooltipSize, options); - } - ctx.lineTo(x, y + topLeft); - ctx.quadraticCurveTo(x, y, x + topLeft, y); - ctx.closePath(); - ctx.fill(); - if (options.borderWidth > 0) { - ctx.stroke(); - } - } - _updateAnimationTarget(options) { - const chart = this.chart; - const anims = this.$animations; - const animX = anims && anims.x; - const animY = anims && anims.y; - if (animX || animY) { - const position = positioners[options.position].call(this, this._active, this._eventPosition); - if (!position) { - return; - } - const size = this._size = getTooltipSize(this, options); - const positionAndSize = Object.assign({}, position, this._size); - const alignment = determineAlignment(chart, options, positionAndSize); - const point = getBackgroundPoint(options, positionAndSize, alignment, chart); - if (animX._to !== point.x || animY._to !== point.y) { - this.xAlign = alignment.xAlign; - this.yAlign = alignment.yAlign; - this.width = size.width; - this.height = size.height; - this.caretX = position.x; - this.caretY = position.y; - this._resolveAnimations().update(this, point); - } - } - } - _willRender() { - return !!this.opacity; - } - draw(ctx) { - const options = this.options.setContext(this.getContext()); - let opacity = this.opacity; - if (!opacity) { - return; - } - this._updateAnimationTarget(options); - const tooltipSize = { - width: this.width, - height: this.height - }; - const pt = { - x: this.x, - y: this.y - }; - opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity; - const padding = toPadding(options.padding); - const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length; - if (options.enabled && hasTooltipContent) { - ctx.save(); - ctx.globalAlpha = opacity; - this.drawBackground(pt, ctx, tooltipSize, options); - overrideTextDirection(ctx, options.textDirection); - pt.y += padding.top; - this.drawTitle(pt, ctx, options); - this.drawBody(pt, ctx, options); - this.drawFooter(pt, ctx, options); - restoreTextDirection(ctx, options.textDirection); - ctx.restore(); - } - } - getActiveElements() { - return this._active || []; - } - setActiveElements(activeElements, eventPosition) { - const lastActive = this._active; - const active = activeElements.map(({ datasetIndex, index }) => { - const meta = this.chart.getDatasetMeta(datasetIndex); - if (!meta) { - throw new Error("Cannot find a dataset at index " + datasetIndex); - } - return { - datasetIndex, - element: meta.data[index], - index - }; - }); - const changed = !_elementsEqual(lastActive, active); - const positionChanged = this._positionChanged(active, eventPosition); - if (changed || positionChanged) { - this._active = active; - this._eventPosition = eventPosition; - this._ignoreReplayEvents = true; - this.update(true); - } - } - handleEvent(e, replay, inChartArea = true) { - if (replay && this._ignoreReplayEvents) { - return false; - } - this._ignoreReplayEvents = false; - const options = this.options; - const lastActive = this._active || []; - const active = this._getActiveElements(e, lastActive, replay, inChartArea); - const positionChanged = this._positionChanged(active, e); - const changed = replay || !_elementsEqual(active, lastActive) || positionChanged; - if (changed) { - this._active = active; - if (options.enabled || options.external) { - this._eventPosition = { - x: e.x, - y: e.y - }; - this.update(true, replay); - } - } - return changed; - } - _getActiveElements(e, lastActive, replay, inChartArea) { - const options = this.options; - if (e.type === "mouseout") { - return []; - } - if (!inChartArea) { - return lastActive; - } - const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay); - if (options.reverse) { - active.reverse(); - } - return active; - } - _positionChanged(active, e) { - const { caretX, caretY, options } = this; - const position = positioners[options.position].call(this, active, e); - return position !== false && (caretX !== position.x || caretY !== position.y); - } -}; -__publicField(Tooltip, "positioners", positioners); -var plugin_tooltip = { - id: "tooltip", - _element: Tooltip, - positioners, - afterInit(chart, _args, options) { - if (options) { - chart.tooltip = new Tooltip({ - chart, - options - }); - } - }, - beforeUpdate(chart, _args, options) { - if (chart.tooltip) { - chart.tooltip.initialize(options); - } - }, - reset(chart, _args, options) { - if (chart.tooltip) { - chart.tooltip.initialize(options); - } - }, - afterDraw(chart) { - const tooltip = chart.tooltip; - if (tooltip && tooltip._willRender()) { - const args = { - tooltip - }; - if (chart.notifyPlugins("beforeTooltipDraw", { - ...args, - cancelable: true - }) === false) { - return; - } - tooltip.draw(chart.ctx); - chart.notifyPlugins("afterTooltipDraw", args); - } - }, - afterEvent(chart, args) { - if (chart.tooltip) { - const useFinalPosition = args.replay; - if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) { - args.changed = true; - } - } - }, - defaults: { - enabled: true, - external: null, - position: "average", - backgroundColor: "rgba(0,0,0,0.8)", - titleColor: "#fff", - titleFont: { - weight: "bold" - }, - titleSpacing: 2, - titleMarginBottom: 6, - titleAlign: "left", - bodyColor: "#fff", - bodySpacing: 2, - bodyFont: {}, - bodyAlign: "left", - footerColor: "#fff", - footerSpacing: 2, - footerMarginTop: 6, - footerFont: { - weight: "bold" - }, - footerAlign: "left", - padding: 6, - caretPadding: 2, - caretSize: 5, - cornerRadius: 6, - boxHeight: (ctx, opts) => opts.bodyFont.size, - boxWidth: (ctx, opts) => opts.bodyFont.size, - multiKeyBackground: "#fff", - displayColors: true, - boxPadding: 0, - borderColor: "rgba(0,0,0,0)", - borderWidth: 0, - animation: { - duration: 400, - easing: "easeOutQuart" - }, - animations: { - numbers: { - type: "number", - properties: [ - "x", - "y", - "width", - "height", - "caretX", - "caretY" - ] - }, - opacity: { - easing: "linear", - duration: 200 - } - }, - callbacks: defaultCallbacks - }, - defaultRoutes: { - bodyFont: "font", - footerFont: "font", - titleFont: "font" - }, - descriptors: { - _scriptable: (name2) => name2 !== "filter" && name2 !== "itemSort" && name2 !== "external", - _indexable: false, - callbacks: { - _scriptable: false, - _indexable: false - }, - animation: { - _fallback: false - }, - animations: { - _fallback: "animation" - } - }, - additionalOptionScopes: [ - "interaction" - ] -}; -var addIfString = (labels, raw, index, addedLabels) => { - if (typeof raw === "string") { - index = labels.push(raw) - 1; - addedLabels.unshift({ - index, - label: raw - }); - } else if (isNaN(raw)) { - index = null; - } - return index; -}; -function findOrAddLabel(labels, raw, index, addedLabels) { - const first = labels.indexOf(raw); - if (first === -1) { - return addIfString(labels, raw, index, addedLabels); - } - const last = labels.lastIndexOf(raw); - return first !== last ? index : first; -} -var validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max); -function _getLabelForValue(value) { - const labels = this.getLabels(); - if (value >= 0 && value < labels.length) { - return labels[value]; - } - return value; -} -var CategoryScale = class extends Scale { - constructor(cfg) { - super(cfg); - this._startValue = void 0; - this._valueRange = 0; - this._addedLabels = []; - } - init(scaleOptions) { - const added = this._addedLabels; - if (added.length) { - const labels = this.getLabels(); - for (const { index, label } of added) { - if (labels[index] === label) { - labels.splice(index, 1); - } - } - this._addedLabels = []; - } - super.init(scaleOptions); - } - parse(raw, index) { - if (isNullOrUndef(raw)) { - return null; - } - const labels = this.getLabels(); - index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels); - return validIndex(index, labels.length - 1); - } - determineDataLimits() { - const { minDefined, maxDefined } = this.getUserBounds(); - let { min, max } = this.getMinMax(true); - if (this.options.bounds === "ticks") { - if (!minDefined) { - min = 0; - } - if (!maxDefined) { - max = this.getLabels().length - 1; - } - } - this.min = min; - this.max = max; - } - buildTicks() { - const min = this.min; - const max = this.max; - const offset = this.options.offset; - const ticks = []; - let labels = this.getLabels(); - labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1); - this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1); - this._startValue = this.min - (offset ? 0.5 : 0); - for (let value = min; value <= max; value++) { - ticks.push({ - value - }); - } - return ticks; - } - getLabelForValue(value) { - return _getLabelForValue.call(this, value); - } - configure() { - super.configure(); - if (!this.isHorizontal()) { - this._reversePixels = !this._reversePixels; - } - } - getPixelForValue(value) { - if (typeof value !== "number") { - value = this.parse(value); - } - return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); - } - getPixelForTick(index) { - const ticks = this.ticks; - if (index < 0 || index > ticks.length - 1) { - return null; - } - return this.getPixelForValue(ticks[index].value); - } - getValueForPixel(pixel) { - return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange); - } - getBasePixel() { - return this.bottom; - } -}; -__publicField(CategoryScale, "id", "category"); -__publicField(CategoryScale, "defaults", { - ticks: { - callback: _getLabelForValue - } -}); -function generateTicks$1(generationOptions, dataRange) { - const ticks = []; - const MIN_SPACING = 1e-14; - const { bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds } = generationOptions; - const unit = step || 1; - const maxSpaces = maxTicks - 1; - const { min: rmin, max: rmax } = dataRange; - const minDefined = !isNullOrUndef(min); - const maxDefined = !isNullOrUndef(max); - const countDefined = !isNullOrUndef(count); - const minSpacing = (rmax - rmin) / (maxDigits + 1); - let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit; - let factor, niceMin, niceMax, numSpaces; - if (spacing < MIN_SPACING && !minDefined && !maxDefined) { - return [ - { - value: rmin - }, - { - value: rmax - } - ]; - } - numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); - if (numSpaces > maxSpaces) { - spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit; - } - if (!isNullOrUndef(precision)) { - factor = Math.pow(10, precision); - spacing = Math.ceil(spacing * factor) / factor; - } - if (bounds === "ticks") { - niceMin = Math.floor(rmin / spacing) * spacing; - niceMax = Math.ceil(rmax / spacing) * spacing; - } else { - niceMin = rmin; - niceMax = rmax; - } - if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1e3)) { - numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks)); - spacing = (max - min) / numSpaces; - niceMin = min; - niceMax = max; - } else if (countDefined) { - niceMin = minDefined ? min : niceMin; - niceMax = maxDefined ? max : niceMax; - numSpaces = count - 1; - spacing = (niceMax - niceMin) / numSpaces; - } else { - numSpaces = (niceMax - niceMin) / spacing; - if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1e3)) { - numSpaces = Math.round(numSpaces); - } else { - numSpaces = Math.ceil(numSpaces); - } - } - const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin)); - factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision); - niceMin = Math.round(niceMin * factor) / factor; - niceMax = Math.round(niceMax * factor) / factor; - let j = 0; - if (minDefined) { - if (includeBounds && niceMin !== min) { - ticks.push({ - value: min - }); - if (niceMin < min) { - j++; - } - if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) { - j++; - } - } else if (niceMin < min) { - j++; - } - } - for (; j < numSpaces; ++j) { - ticks.push({ - value: Math.round((niceMin + j * spacing) * factor) / factor - }); - } - if (maxDefined && includeBounds && niceMax !== max) { - if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) { - ticks[ticks.length - 1].value = max; - } else { - ticks.push({ - value: max - }); - } - } else if (!maxDefined || niceMax === max) { - ticks.push({ - value: niceMax - }); - } - return ticks; -} -function relativeLabelSize(value, minSpacing, { horizontal, minRotation }) { - const rad = toRadians(minRotation); - const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 1e-3; - const length = 0.75 * minSpacing * ("" + value).length; - return Math.min(minSpacing / ratio, length); -} -var LinearScaleBase = class extends Scale { - constructor(cfg) { - super(cfg); - this.start = void 0; - this.end = void 0; - this._startValue = void 0; - this._endValue = void 0; - this._valueRange = 0; - } - parse(raw, index) { - if (isNullOrUndef(raw)) { - return null; - } - if ((typeof raw === "number" || raw instanceof Number) && !isFinite(+raw)) { - return null; - } - return +raw; - } - handleTickRangeOptions() { - const { beginAtZero } = this.options; - const { minDefined, maxDefined } = this.getUserBounds(); - let { min, max } = this; - const setMin = (v) => min = minDefined ? min : v; - const setMax = (v) => max = maxDefined ? max : v; - if (beginAtZero) { - const minSign = sign(min); - const maxSign = sign(max); - if (minSign < 0 && maxSign < 0) { - setMax(0); - } else if (minSign > 0 && maxSign > 0) { - setMin(0); - } - } - if (min === max) { - let offset = max === 0 ? 1 : Math.abs(max * 0.05); - setMax(max + offset); - if (!beginAtZero) { - setMin(min - offset); - } - } - this.min = min; - this.max = max; - } - getTickLimit() { - const tickOpts = this.options.ticks; - let { maxTicksLimit, stepSize } = tickOpts; - let maxTicks; - if (stepSize) { - maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1; - if (maxTicks > 1e3) { - console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`); - maxTicks = 1e3; - } - } else { - maxTicks = this.computeTickLimit(); - maxTicksLimit = maxTicksLimit || 11; - } - if (maxTicksLimit) { - maxTicks = Math.min(maxTicksLimit, maxTicks); - } - return maxTicks; - } - computeTickLimit() { - return Number.POSITIVE_INFINITY; - } - buildTicks() { - const opts = this.options; - const tickOpts = opts.ticks; - let maxTicks = this.getTickLimit(); - maxTicks = Math.max(2, maxTicks); - const numericGeneratorOptions = { - maxTicks, - bounds: opts.bounds, - min: opts.min, - max: opts.max, - precision: tickOpts.precision, - step: tickOpts.stepSize, - count: tickOpts.count, - maxDigits: this._maxDigits(), - horizontal: this.isHorizontal(), - minRotation: tickOpts.minRotation || 0, - includeBounds: tickOpts.includeBounds !== false - }; - const dataRange = this._range || this; - const ticks = generateTicks$1(numericGeneratorOptions, dataRange); - if (opts.bounds === "ticks") { - _setMinAndMaxByKey(ticks, this, "value"); - } - if (opts.reverse) { - ticks.reverse(); - this.start = this.max; - this.end = this.min; - } else { - this.start = this.min; - this.end = this.max; - } - return ticks; - } - configure() { - const ticks = this.ticks; - let start = this.min; - let end = this.max; - super.configure(); - if (this.options.offset && ticks.length) { - const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2; - start -= offset; - end += offset; - } - this._startValue = start; - this._endValue = end; - this._valueRange = end - start; - } - getLabelForValue(value) { - return formatNumber(value, this.chart.options.locale, this.options.ticks.format); - } -}; -var LinearScale = class extends LinearScaleBase { - determineDataLimits() { - const { min, max } = this.getMinMax(true); - this.min = isNumberFinite(min) ? min : 0; - this.max = isNumberFinite(max) ? max : 1; - this.handleTickRangeOptions(); - } - computeTickLimit() { - const horizontal = this.isHorizontal(); - const length = horizontal ? this.width : this.height; - const minRotation = toRadians(this.options.ticks.minRotation); - const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 1e-3; - const tickFont = this._resolveTickFontOptions(0); - return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio)); - } - getPixelForValue(value) { - return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange); - } - getValueForPixel(pixel) { - return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange; - } -}; -__publicField(LinearScale, "id", "linear"); -__publicField(LinearScale, "defaults", { - ticks: { - callback: Ticks.formatters.numeric - } -}); -var log10Floor = (v) => Math.floor(log10(v)); -var changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m); -function isMajor(tickVal) { - const remain = tickVal / Math.pow(10, log10Floor(tickVal)); - return remain === 1; -} -function steps(min, max, rangeExp) { - const rangeStep = Math.pow(10, rangeExp); - const start = Math.floor(min / rangeStep); - const end = Math.ceil(max / rangeStep); - return end - start; -} -function startExp(min, max) { - const range = max - min; - let rangeExp = log10Floor(range); - while (steps(min, max, rangeExp) > 10) { - rangeExp++; - } - while (steps(min, max, rangeExp) < 10) { - rangeExp--; - } - return Math.min(rangeExp, log10Floor(min)); -} -function generateTicks(generationOptions, { min, max }) { - min = finiteOrDefault(generationOptions.min, min); - const ticks = []; - const minExp = log10Floor(min); - let exp = startExp(min, max); - let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; - const stepSize = Math.pow(10, exp); - const base = minExp > exp ? Math.pow(10, minExp) : 0; - const start = Math.round((min - base) * precision) / precision; - const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10; - let significand = Math.floor((start - offset) / Math.pow(10, exp)); - let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision); - while (value < max) { - ticks.push({ - value, - major: isMajor(value), - significand - }); - if (significand >= 10) { - significand = significand < 15 ? 15 : 20; - } else { - significand++; - } - if (significand >= 20) { - exp++; - significand = 2; - precision = exp >= 0 ? 1 : precision; - } - value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision; - } - const lastTick = finiteOrDefault(generationOptions.max, value); - ticks.push({ - value: lastTick, - major: isMajor(lastTick), - significand - }); - return ticks; -} -var LogarithmicScale = class extends Scale { - constructor(cfg) { - super(cfg); - this.start = void 0; - this.end = void 0; - this._startValue = void 0; - this._valueRange = 0; - } - parse(raw, index) { - const value = LinearScaleBase.prototype.parse.apply(this, [ - raw, - index - ]); - if (value === 0) { - this._zero = true; - return void 0; - } - return isNumberFinite(value) && value > 0 ? value : null; - } - determineDataLimits() { - const { min, max } = this.getMinMax(true); - this.min = isNumberFinite(min) ? Math.max(0, min) : null; - this.max = isNumberFinite(max) ? Math.max(0, max) : null; - if (this.options.beginAtZero) { - this._zero = true; - } - if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) { - this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0); - } - this.handleTickRangeOptions(); - } - handleTickRangeOptions() { - const { minDefined, maxDefined } = this.getUserBounds(); - let min = this.min; - let max = this.max; - const setMin = (v) => min = minDefined ? min : v; - const setMax = (v) => max = maxDefined ? max : v; - if (min === max) { - if (min <= 0) { - setMin(1); - setMax(10); - } else { - setMin(changeExponent(min, -1)); - setMax(changeExponent(max, 1)); - } - } - if (min <= 0) { - setMin(changeExponent(max, -1)); - } - if (max <= 0) { - setMax(changeExponent(min, 1)); - } - this.min = min; - this.max = max; - } - buildTicks() { - const opts = this.options; - const generationOptions = { - min: this._userMin, - max: this._userMax - }; - const ticks = generateTicks(generationOptions, this); - if (opts.bounds === "ticks") { - _setMinAndMaxByKey(ticks, this, "value"); - } - if (opts.reverse) { - ticks.reverse(); - this.start = this.max; - this.end = this.min; - } else { - this.start = this.min; - this.end = this.max; - } - return ticks; - } - getLabelForValue(value) { - return value === void 0 ? "0" : formatNumber(value, this.chart.options.locale, this.options.ticks.format); - } - configure() { - const start = this.min; - super.configure(); - this._startValue = log10(start); - this._valueRange = log10(this.max) - log10(start); - } - getPixelForValue(value) { - if (value === void 0 || value === 0) { - value = this.min; - } - if (value === null || isNaN(value)) { - return NaN; - } - return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange); - } - getValueForPixel(pixel) { - const decimal = this.getDecimalForPixel(pixel); - return Math.pow(10, this._startValue + decimal * this._valueRange); - } -}; -__publicField(LogarithmicScale, "id", "logarithmic"); -__publicField(LogarithmicScale, "defaults", { - ticks: { - callback: Ticks.formatters.logarithmic, - major: { - enabled: true - } - } -}); -function getTickBackdropHeight(opts) { - const tickOpts = opts.ticks; - if (tickOpts.display && opts.display) { - const padding = toPadding(tickOpts.backdropPadding); - return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height; - } - return 0; -} -function measureLabelSize(ctx, font, label) { - label = isArray(label) ? label : [ - label - ]; - return { - w: _longestText(ctx, font.string, label), - h: label.length * font.lineHeight - }; -} -function determineLimits(angle, pos, size, min, max) { - if (angle === min || angle === max) { - return { - start: pos - size / 2, - end: pos + size / 2 - }; - } else if (angle < min || angle > max) { - return { - start: pos - size, - end: pos - }; - } - return { - start: pos, - end: pos + size - }; -} -function fitWithPointLabels(scale) { - const orig = { - l: scale.left + scale._padding.left, - r: scale.right - scale._padding.right, - t: scale.top + scale._padding.top, - b: scale.bottom - scale._padding.bottom - }; - const limits = Object.assign({}, orig); - const labelSizes = []; - const padding = []; - const valueCount = scale._pointLabels.length; - const pointLabelOpts = scale.options.pointLabels; - const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0; - for (let i = 0; i < valueCount; i++) { - const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i)); - padding[i] = opts.padding; - const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle); - const plFont = toFont(opts.font); - const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]); - labelSizes[i] = textSize; - const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle); - const angle = Math.round(toDegrees(angleRadians)); - const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); - const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); - updateLimits(limits, orig, angleRadians, hLimits, vLimits); - } - scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b); - scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding); -} -function updateLimits(limits, orig, angle, hLimits, vLimits) { - const sin = Math.abs(Math.sin(angle)); - const cos = Math.abs(Math.cos(angle)); - let x = 0; - let y = 0; - if (hLimits.start < orig.l) { - x = (orig.l - hLimits.start) / sin; - limits.l = Math.min(limits.l, orig.l - x); - } else if (hLimits.end > orig.r) { - x = (hLimits.end - orig.r) / sin; - limits.r = Math.max(limits.r, orig.r + x); - } - if (vLimits.start < orig.t) { - y = (orig.t - vLimits.start) / cos; - limits.t = Math.min(limits.t, orig.t - y); - } else if (vLimits.end > orig.b) { - y = (vLimits.end - orig.b) / cos; - limits.b = Math.max(limits.b, orig.b + y); - } -} -function buildPointLabelItems(scale, labelSizes, padding) { - const items = []; - const valueCount = scale._pointLabels.length; - const opts = scale.options; - const extra = getTickBackdropHeight(opts) / 2; - const outerDistance = scale.drawingArea; - const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0; - for (let i = 0; i < valueCount; i++) { - const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle); - const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI))); - const size = labelSizes[i]; - const y = yForAngle(pointLabelPosition.y, size.h, angle); - const textAlign = getTextAlignForAngle(angle); - const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign); - items.push({ - x: pointLabelPosition.x, - y, - textAlign, - left, - top: y, - right: left + size.w, - bottom: y + size.h - }); - } - return items; -} -function getTextAlignForAngle(angle) { - if (angle === 0 || angle === 180) { - return "center"; - } else if (angle < 180) { - return "left"; - } - return "right"; -} -function leftForTextAlign(x, w, align) { - if (align === "right") { - x -= w; - } else if (align === "center") { - x -= w / 2; - } - return x; -} -function yForAngle(y, h4, angle) { - if (angle === 90 || angle === 270) { - y -= h4 / 2; - } else if (angle > 270 || angle < 90) { - y -= h4; - } - return y; -} -function drawPointLabels(scale, labelCount) { - const { ctx, options: { pointLabels } } = scale; - for (let i = labelCount - 1; i >= 0; i--) { - const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i)); - const plFont = toFont(optsAtIndex.font); - const { x, y, textAlign, left, top, right, bottom } = scale._pointLabelItems[i]; - const { backdropColor } = optsAtIndex; - if (!isNullOrUndef(backdropColor)) { - const borderRadius = toTRBLCorners(optsAtIndex.borderRadius); - const padding = toPadding(optsAtIndex.backdropPadding); - ctx.fillStyle = backdropColor; - const backdropLeft = left - padding.left; - const backdropTop = top - padding.top; - const backdropWidth = right - left + padding.width; - const backdropHeight = bottom - top + padding.height; - if (Object.values(borderRadius).some((v) => v !== 0)) { - ctx.beginPath(); - addRoundedRectPath(ctx, { - x: backdropLeft, - y: backdropTop, - w: backdropWidth, - h: backdropHeight, - radius: borderRadius - }); - ctx.fill(); - } else { - ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight); - } - } - renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, { - color: optsAtIndex.color, - textAlign, - textBaseline: "middle" - }); - } -} -function pathRadiusLine(scale, radius, circular, labelCount) { - const { ctx } = scale; - if (circular) { - ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU); - } else { - let pointPosition = scale.getPointPosition(0, radius); - ctx.moveTo(pointPosition.x, pointPosition.y); - for (let i = 1; i < labelCount; i++) { - pointPosition = scale.getPointPosition(i, radius); - ctx.lineTo(pointPosition.x, pointPosition.y); - } - } -} -function drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) { - const ctx = scale.ctx; - const circular = gridLineOpts.circular; - const { color: color2, lineWidth } = gridLineOpts; - if (!circular && !labelCount || !color2 || !lineWidth || radius < 0) { - return; - } - ctx.save(); - ctx.strokeStyle = color2; - ctx.lineWidth = lineWidth; - ctx.setLineDash(borderOpts.dash); - ctx.lineDashOffset = borderOpts.dashOffset; - ctx.beginPath(); - pathRadiusLine(scale, radius, circular, labelCount); - ctx.closePath(); - ctx.stroke(); - ctx.restore(); -} -function createPointLabelContext(parent, index, label) { - return createContext(parent, { - label, - index, - type: "pointLabel" - }); -} -var RadialLinearScale = class extends LinearScaleBase { - constructor(cfg) { - super(cfg); - this.xCenter = void 0; - this.yCenter = void 0; - this.drawingArea = void 0; - this._pointLabels = []; - this._pointLabelItems = []; - } - setDimensions() { - const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2); - const w = this.width = this.maxWidth - padding.width; - const h4 = this.height = this.maxHeight - padding.height; - this.xCenter = Math.floor(this.left + w / 2 + padding.left); - this.yCenter = Math.floor(this.top + h4 / 2 + padding.top); - this.drawingArea = Math.floor(Math.min(w, h4) / 2); - } - determineDataLimits() { - const { min, max } = this.getMinMax(false); - this.min = isNumberFinite(min) && !isNaN(min) ? min : 0; - this.max = isNumberFinite(max) && !isNaN(max) ? max : 0; - this.handleTickRangeOptions(); - } - computeTickLimit() { - return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); - } - generateTickLabels(ticks) { - LinearScaleBase.prototype.generateTickLabels.call(this, ticks); - this._pointLabels = this.getLabels().map((value, index) => { - const label = callback(this.options.pointLabels.callback, [ - value, - index - ], this); - return label || label === 0 ? label : ""; - }).filter((v, i) => this.chart.getDataVisibility(i)); - } - fit() { - const opts = this.options; - if (opts.display && opts.pointLabels.display) { - fitWithPointLabels(this); - } else { - this.setCenterPoint(0, 0, 0, 0); - } - } - setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) { - this.xCenter += Math.floor((leftMovement - rightMovement) / 2); - this.yCenter += Math.floor((topMovement - bottomMovement) / 2); - this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement)); - } - getIndexAngle(index) { - const angleMultiplier = TAU / (this._pointLabels.length || 1); - const startAngle = this.options.startAngle || 0; - return _normalizeAngle(index * angleMultiplier + toRadians(startAngle)); - } - getDistanceFromCenterForValue(value) { - if (isNullOrUndef(value)) { - return NaN; - } - const scalingFactor = this.drawingArea / (this.max - this.min); - if (this.options.reverse) { - return (this.max - value) * scalingFactor; - } - return (value - this.min) * scalingFactor; - } - getValueForDistanceFromCenter(distance) { - if (isNullOrUndef(distance)) { - return NaN; - } - const scaledDistance = distance / (this.drawingArea / (this.max - this.min)); - return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance; - } - getPointLabelContext(index) { - const pointLabels = this._pointLabels || []; - if (index >= 0 && index < pointLabels.length) { - const pointLabel = pointLabels[index]; - return createPointLabelContext(this.getContext(), index, pointLabel); - } - } - getPointPosition(index, distanceFromCenter, additionalAngle = 0) { - const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle; - return { - x: Math.cos(angle) * distanceFromCenter + this.xCenter, - y: Math.sin(angle) * distanceFromCenter + this.yCenter, - angle - }; - } - getPointPositionForValue(index, value) { - return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); - } - getBasePosition(index) { - return this.getPointPositionForValue(index || 0, this.getBaseValue()); - } - getPointLabelPosition(index) { - const { left, top, right, bottom } = this._pointLabelItems[index]; - return { - left, - top, - right, - bottom - }; - } - drawBackground() { - const { backgroundColor, grid: { circular } } = this.options; - if (backgroundColor) { - const ctx = this.ctx; - ctx.save(); - ctx.beginPath(); - pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length); - ctx.closePath(); - ctx.fillStyle = backgroundColor; - ctx.fill(); - ctx.restore(); - } - } - drawGrid() { - const ctx = this.ctx; - const opts = this.options; - const { angleLines, grid, border } = opts; - const labelCount = this._pointLabels.length; - let i, offset, position; - if (opts.pointLabels.display) { - drawPointLabels(this, labelCount); - } - if (grid.display) { - this.ticks.forEach((tick, index) => { - if (index !== 0) { - offset = this.getDistanceFromCenterForValue(tick.value); - const context = this.getContext(index); - const optsAtIndex = grid.setContext(context); - const optsAtIndexBorder = border.setContext(context); - drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder); - } - }); - } - if (angleLines.display) { - ctx.save(); - for (i = labelCount - 1; i >= 0; i--) { - const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i)); - const { color: color2, lineWidth } = optsAtIndex; - if (!lineWidth || !color2) { - continue; - } - ctx.lineWidth = lineWidth; - ctx.strokeStyle = color2; - ctx.setLineDash(optsAtIndex.borderDash); - ctx.lineDashOffset = optsAtIndex.borderDashOffset; - offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max); - position = this.getPointPosition(i, offset); - ctx.beginPath(); - ctx.moveTo(this.xCenter, this.yCenter); - ctx.lineTo(position.x, position.y); - ctx.stroke(); - } - ctx.restore(); - } - } - drawBorder() { - } - drawLabels() { - const ctx = this.ctx; - const opts = this.options; - const tickOpts = opts.ticks; - if (!tickOpts.display) { - return; - } - const startAngle = this.getIndexAngle(0); - let offset, width; - ctx.save(); - ctx.translate(this.xCenter, this.yCenter); - ctx.rotate(startAngle); - ctx.textAlign = "center"; - ctx.textBaseline = "middle"; - this.ticks.forEach((tick, index) => { - if (index === 0 && !opts.reverse) { - return; - } - const optsAtIndex = tickOpts.setContext(this.getContext(index)); - const tickFont = toFont(optsAtIndex.font); - offset = this.getDistanceFromCenterForValue(this.ticks[index].value); - if (optsAtIndex.showLabelBackdrop) { - ctx.font = tickFont.string; - width = ctx.measureText(tick.label).width; - ctx.fillStyle = optsAtIndex.backdropColor; - const padding = toPadding(optsAtIndex.backdropPadding); - ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height); - } - renderText(ctx, tick.label, 0, -offset, tickFont, { - color: optsAtIndex.color - }); - }); - ctx.restore(); - } - drawTitle() { - } -}; -__publicField(RadialLinearScale, "id", "radialLinear"); -__publicField(RadialLinearScale, "defaults", { - display: true, - animate: true, - position: "chartArea", - angleLines: { - display: true, - lineWidth: 1, - borderDash: [], - borderDashOffset: 0 - }, - grid: { - circular: false - }, - startAngle: 0, - ticks: { - showLabelBackdrop: true, - callback: Ticks.formatters.numeric - }, - pointLabels: { - backdropColor: void 0, - backdropPadding: 2, - display: true, - font: { - size: 10 - }, - callback(label) { - return label; - }, - padding: 5, - centerPointLabels: false - } -}); -__publicField(RadialLinearScale, "defaultRoutes", { - "angleLines.color": "borderColor", - "pointLabels.color": "color", - "ticks.color": "color" -}); -__publicField(RadialLinearScale, "descriptors", { - angleLines: { - _fallback: "grid" - } -}); -var INTERVALS = { - millisecond: { - common: true, - size: 1, - steps: 1e3 - }, - second: { - common: true, - size: 1e3, - steps: 60 - }, - minute: { - common: true, - size: 6e4, - steps: 60 - }, - hour: { - common: true, - size: 36e5, - steps: 24 - }, - day: { - common: true, - size: 864e5, - steps: 30 - }, - week: { - common: false, - size: 6048e5, - steps: 4 - }, - month: { - common: true, - size: 2628e6, - steps: 12 - }, - quarter: { - common: false, - size: 7884e6, - steps: 4 - }, - year: { - common: true, - size: 3154e7 - } -}; -var UNITS = /* @__PURE__ */ Object.keys(INTERVALS); -function sorter(a, b) { - return a - b; -} -function parse(scale, input) { - if (isNullOrUndef(input)) { - return null; - } - const adapter = scale._adapter; - const { parser, round: round2, isoWeekday } = scale._parseOpts; - let value = input; - if (typeof parser === "function") { - value = parser(value); - } - if (!isNumberFinite(value)) { - value = typeof parser === "string" ? adapter.parse(value, parser) : adapter.parse(value); - } - if (value === null) { - return null; - } - if (round2) { - value = round2 === "week" && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, "isoWeek", isoWeekday) : adapter.startOf(value, round2); - } - return +value; -} -function determineUnitForAutoTicks(minUnit, min, max, capacity) { - const ilen = UNITS.length; - for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { - const interval = INTERVALS[UNITS[i]]; - const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER; - if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { - return UNITS[i]; - } - } - return UNITS[ilen - 1]; -} -function determineUnitForFormatting(scale, numTicks, minUnit, min, max) { - for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) { - const unit = UNITS[i]; - if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) { - return unit; - } - } - return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; -} -function determineMajorUnit(unit) { - for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { - if (INTERVALS[UNITS[i]].common) { - return UNITS[i]; - } - } -} -function addTick(ticks, time, timestamps) { - if (!timestamps) { - ticks[time] = true; - } else if (timestamps.length) { - const { lo, hi } = _lookup(timestamps, time); - const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi]; - ticks[timestamp] = true; - } -} -function setMajorTicks(scale, ticks, map3, majorUnit) { - const adapter = scale._adapter; - const first = +adapter.startOf(ticks[0].value, majorUnit); - const last = ticks[ticks.length - 1].value; - let major, index; - for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) { - index = map3[major]; - if (index >= 0) { - ticks[index].major = true; - } - } - return ticks; -} -function ticksFromTimestamps(scale, values, majorUnit) { - const ticks = []; - const map3 = {}; - const ilen = values.length; - let i, value; - for (i = 0; i < ilen; ++i) { - value = values[i]; - map3[value] = i; - ticks.push({ - value, - major: false - }); - } - return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map3, majorUnit); -} -var TimeScale = class extends Scale { - constructor(props) { - super(props); - this._cache = { - data: [], - labels: [], - all: [] - }; - this._unit = "day"; - this._majorUnit = void 0; - this._offsets = {}; - this._normalized = false; - this._parseOpts = void 0; - } - init(scaleOpts, opts = {}) { - const time = scaleOpts.time || (scaleOpts.time = {}); - const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date); - adapter.init(opts); - mergeIf(time.displayFormats, adapter.formats()); - this._parseOpts = { - parser: time.parser, - round: time.round, - isoWeekday: time.isoWeekday - }; - super.init(scaleOpts); - this._normalized = opts.normalized; - } - parse(raw, index) { - if (raw === void 0) { - return null; - } - return parse(this, raw); - } - beforeLayout() { - super.beforeLayout(); - this._cache = { - data: [], - labels: [], - all: [] - }; - } - determineDataLimits() { - const options = this.options; - const adapter = this._adapter; - const unit = options.time.unit || "day"; - let { min, max, minDefined, maxDefined } = this.getUserBounds(); - function _applyBounds(bounds) { - if (!minDefined && !isNaN(bounds.min)) { - min = Math.min(min, bounds.min); - } - if (!maxDefined && !isNaN(bounds.max)) { - max = Math.max(max, bounds.max); - } - } - if (!minDefined || !maxDefined) { - _applyBounds(this._getLabelBounds()); - if (options.bounds !== "ticks" || options.ticks.source !== "labels") { - _applyBounds(this.getMinMax(false)); - } - } - min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit); - max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1; - this.min = Math.min(min, max - 1); - this.max = Math.max(min + 1, max); - } - _getLabelBounds() { - const arr = this.getLabelTimestamps(); - let min = Number.POSITIVE_INFINITY; - let max = Number.NEGATIVE_INFINITY; - if (arr.length) { - min = arr[0]; - max = arr[arr.length - 1]; - } - return { - min, - max - }; - } - buildTicks() { - const options = this.options; - const timeOpts = options.time; - const tickOpts = options.ticks; - const timestamps = tickOpts.source === "labels" ? this.getLabelTimestamps() : this._generate(); - if (options.bounds === "ticks" && timestamps.length) { - this.min = this._userMin || timestamps[0]; - this.max = this._userMax || timestamps[timestamps.length - 1]; - } - const min = this.min; - const max = this.max; - const ticks = _filterBetween(timestamps, min, max); - this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max)); - this._majorUnit = !tickOpts.major.enabled || this._unit === "year" ? void 0 : determineMajorUnit(this._unit); - this.initOffsets(timestamps); - if (options.reverse) { - ticks.reverse(); - } - return ticksFromTimestamps(this, ticks, this._majorUnit); - } - afterAutoSkip() { - if (this.options.offsetAfterAutoskip) { - this.initOffsets(this.ticks.map((tick) => +tick.value)); - } - } - initOffsets(timestamps = []) { - let start = 0; - let end = 0; - let first, last; - if (this.options.offset && timestamps.length) { - first = this.getDecimalForValue(timestamps[0]); - if (timestamps.length === 1) { - start = 1 - first; - } else { - start = (this.getDecimalForValue(timestamps[1]) - first) / 2; - } - last = this.getDecimalForValue(timestamps[timestamps.length - 1]); - if (timestamps.length === 1) { - end = last; - } else { - end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2; - } - } - const limit = timestamps.length < 3 ? 0.5 : 0.25; - start = _limitValue(start, 0, limit); - end = _limitValue(end, 0, limit); - this._offsets = { - start, - end, - factor: 1 / (start + 1 + end) - }; - } - _generate() { - const adapter = this._adapter; - const min = this.min; - const max = this.max; - const options = this.options; - const timeOpts = options.time; - const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min)); - const stepSize = valueOrDefault(options.ticks.stepSize, 1); - const weekday = minor === "week" ? timeOpts.isoWeekday : false; - const hasWeekday = isNumber(weekday) || weekday === true; - const ticks = {}; - let first = min; - let time, count; - if (hasWeekday) { - first = +adapter.startOf(first, "isoWeek", weekday); - } - first = +adapter.startOf(first, hasWeekday ? "day" : minor); - if (adapter.diff(max, min, minor) > 1e5 * stepSize) { - throw new Error(min + " and " + max + " are too far apart with stepSize of " + stepSize + " " + minor); - } - const timestamps = options.ticks.source === "data" && this.getDataTimestamps(); - for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) { - addTick(ticks, time, timestamps); - } - if (time === max || options.bounds === "ticks" || count === 1) { - addTick(ticks, time, timestamps); - } - return Object.keys(ticks).sort((a, b) => a - b).map((x) => +x); - } - getLabelForValue(value) { - const adapter = this._adapter; - const timeOpts = this.options.time; - if (timeOpts.tooltipFormat) { - return adapter.format(value, timeOpts.tooltipFormat); - } - return adapter.format(value, timeOpts.displayFormats.datetime); - } - format(value, format) { - const options = this.options; - const formats = options.time.displayFormats; - const unit = this._unit; - const fmt = format || formats[unit]; - return this._adapter.format(value, fmt); - } - _tickFormatFunction(time, index, ticks, format) { - const options = this.options; - const formatter = options.ticks.callback; - if (formatter) { - return callback(formatter, [ - time, - index, - ticks - ], this); - } - const formats = options.time.displayFormats; - const unit = this._unit; - const majorUnit = this._majorUnit; - const minorFormat = unit && formats[unit]; - const majorFormat = majorUnit && formats[majorUnit]; - const tick = ticks[index]; - const major = majorUnit && majorFormat && tick && tick.major; - return this._adapter.format(time, format || (major ? majorFormat : minorFormat)); - } - generateTickLabels(ticks) { - let i, ilen, tick; - for (i = 0, ilen = ticks.length; i < ilen; ++i) { - tick = ticks[i]; - tick.label = this._tickFormatFunction(tick.value, i, ticks); - } - } - getDecimalForValue(value) { - return value === null ? NaN : (value - this.min) / (this.max - this.min); - } - getPixelForValue(value) { - const offsets = this._offsets; - const pos = this.getDecimalForValue(value); - return this.getPixelForDecimal((offsets.start + pos) * offsets.factor); - } - getValueForPixel(pixel) { - const offsets = this._offsets; - const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; - return this.min + pos * (this.max - this.min); - } - _getLabelSize(label) { - const ticksOpts = this.options.ticks; - const tickLabelWidth = this.ctx.measureText(label).width; - const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation); - const cosRotation = Math.cos(angle); - const sinRotation = Math.sin(angle); - const tickFontSize = this._resolveTickFontOptions(0).size; - return { - w: tickLabelWidth * cosRotation + tickFontSize * sinRotation, - h: tickLabelWidth * sinRotation + tickFontSize * cosRotation - }; - } - _getLabelCapacity(exampleTime) { - const timeOpts = this.options.time; - const displayFormats = timeOpts.displayFormats; - const format = displayFormats[timeOpts.unit] || displayFormats.millisecond; - const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [ - exampleTime - ], this._majorUnit), format); - const size = this._getLabelSize(exampleLabel); - const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1; - return capacity > 0 ? capacity : 1; - } - getDataTimestamps() { - let timestamps = this._cache.data || []; - let i, ilen; - if (timestamps.length) { - return timestamps; - } - const metas = this.getMatchingVisibleMetas(); - if (this._normalized && metas.length) { - return this._cache.data = metas[0].controller.getAllParsedValues(this); - } - for (i = 0, ilen = metas.length; i < ilen; ++i) { - timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this)); - } - return this._cache.data = this.normalize(timestamps); - } - getLabelTimestamps() { - const timestamps = this._cache.labels || []; - let i, ilen; - if (timestamps.length) { - return timestamps; - } - const labels = this.getLabels(); - for (i = 0, ilen = labels.length; i < ilen; ++i) { - timestamps.push(parse(this, labels[i])); - } - return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps); - } - normalize(values) { - return _arrayUnique(values.sort(sorter)); - } -}; -__publicField(TimeScale, "id", "time"); -__publicField(TimeScale, "defaults", { - bounds: "data", - adapters: {}, - time: { - parser: false, - unit: false, - round: false, - isoWeekday: false, - minUnit: "millisecond", - displayFormats: {} - }, - ticks: { - source: "auto", - callback: false, - major: { - enabled: false - } - } -}); -function interpolate3(table, val, reverse) { - let lo = 0; - let hi = table.length - 1; - let prevSource, nextSource, prevTarget, nextTarget; - if (reverse) { - if (val >= table[lo].pos && val <= table[hi].pos) { - ({ lo, hi } = _lookupByKey(table, "pos", val)); - } - ({ pos: prevSource, time: prevTarget } = table[lo]); - ({ pos: nextSource, time: nextTarget } = table[hi]); - } else { - if (val >= table[lo].time && val <= table[hi].time) { - ({ lo, hi } = _lookupByKey(table, "time", val)); - } - ({ time: prevSource, pos: prevTarget } = table[lo]); - ({ time: nextSource, pos: nextTarget } = table[hi]); - } - const span = nextSource - prevSource; - return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget; -} -var TimeSeriesScale = class extends TimeScale { - constructor(props) { - super(props); - this._table = []; - this._minPos = void 0; - this._tableRange = void 0; - } - initOffsets() { - const timestamps = this._getTimestampsForTable(); - const table = this._table = this.buildLookupTable(timestamps); - this._minPos = interpolate3(table, this.min); - this._tableRange = interpolate3(table, this.max) - this._minPos; - super.initOffsets(timestamps); - } - buildLookupTable(timestamps) { - const { min, max } = this; - const items = []; - const table = []; - let i, ilen, prev, curr, next; - for (i = 0, ilen = timestamps.length; i < ilen; ++i) { - curr = timestamps[i]; - if (curr >= min && curr <= max) { - items.push(curr); - } - } - if (items.length < 2) { - return [ - { - time: min, - pos: 0 - }, - { - time: max, - pos: 1 - } - ]; - } - for (i = 0, ilen = items.length; i < ilen; ++i) { - next = items[i + 1]; - prev = items[i - 1]; - curr = items[i]; - if (Math.round((next + prev) / 2) !== curr) { - table.push({ - time: curr, - pos: i / (ilen - 1) - }); - } - } - return table; - } - _getTimestampsForTable() { - let timestamps = this._cache.all || []; - if (timestamps.length) { - return timestamps; - } - const data = this.getDataTimestamps(); - const label = this.getLabelTimestamps(); - if (data.length && label.length) { - timestamps = this.normalize(data.concat(label)); - } else { - timestamps = data.length ? data : label; - } - timestamps = this._cache.all = timestamps; - return timestamps; - } - getDecimalForValue(value) { - return (interpolate3(this._table, value) - this._minPos) / this._tableRange; - } - getValueForPixel(pixel) { - const offsets = this._offsets; - const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end; - return interpolate3(this._table, decimal * this._tableRange + this._minPos, true); - } -}; -__publicField(TimeSeriesScale, "id", "timeseries"); -__publicField(TimeSeriesScale, "defaults", TimeScale.defaults); - -// src/stats-modal.tsx -Chart.register( - BarElement, - BarController, - plugin_legend, - plugin_title, - plugin_tooltip, - plugin_subtitle, - CategoryScale, - LinearScale, - PieController, - ArcElement -); -var StatsModal = class extends import_obsidian4.Modal { - constructor(app2, plugin) { - super(app2); - this.plugin = plugin; - this.titleEl.setText(`${t("STATS_TITLE")} `); - this.titleEl.addClass("sr-centered"); - this.titleEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("select", { id: "sr-chart-period" }, /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "month", selected: true }, t("MONTH")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "quarter" }, t("QUARTER")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "year" }, t("YEAR")), /* @__PURE__ */ (0, import_vhtml2.default)("option", { value: "lifetime" }, t("LIFETIME"))); - this.modalEl.style.height = "100%"; - this.modalEl.style.width = "100%"; - if (import_obsidian4.Platform.isMobile) { - this.contentEl.style.display = "block"; - } - } - onOpen() { - const { contentEl } = this; - contentEl.style.textAlign = "center"; - let maxN = Math.max(...getKeysPreserveType(this.plugin.dueDatesFlashcards)); - for (let dueOffset = 0; dueOffset <= maxN; dueOffset++) { - if (!Object.prototype.hasOwnProperty.call(this.plugin.dueDatesFlashcards, dueOffset)) { - this.plugin.dueDatesFlashcards[dueOffset] = 0; - } - } - const dueDatesFlashcardsCopy = { 0: 0 }; - for (const [dueOffset, dueCount] of getTypedObjectEntries(this.plugin.dueDatesFlashcards)) { - if (dueOffset <= 0) { - dueDatesFlashcardsCopy[0] += dueCount; - } else { - dueDatesFlashcardsCopy[dueOffset] = dueCount; - } - } - const cardStats = this.plugin.cardStats; - const scheduledCount = cardStats.youngCount + cardStats.matureCount; - maxN = Math.max(maxN, 1); - contentEl.innerHTML += /* @__PURE__ */ (0, import_vhtml2.default)("div", null, /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "forecastChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "forecastChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "intervalsChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "intervalsChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "easesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "easesChartSummary" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("canvas", { id: "cardTypesChart" }), /* @__PURE__ */ (0, import_vhtml2.default)("br", null), /* @__PURE__ */ (0, import_vhtml2.default)("span", { id: "cardTypesChartSummary" })); - createStatsChart( - "bar", - "forecastChart", - t("FORECAST"), - t("FORECAST_DESC"), - Object.keys(dueDatesFlashcardsCopy), - Object.values(dueDatesFlashcardsCopy), - t("REVIEWS_PER_DAY", { avg: (scheduledCount / maxN).toFixed(1) }), - t("SCHEDULED"), - t("DAYS"), - t("NUMBER_OF_CARDS") - ); - maxN = Math.max(...getKeysPreserveType(cardStats.intervals)); - for (let interval = 0; interval <= maxN; interval++) { - if (!Object.prototype.hasOwnProperty.call(cardStats.intervals, interval)) { - cardStats.intervals[interval] = 0; - } - } - const average_interval = textInterval( - Math.round( - getTypedObjectEntries(cardStats.intervals).map(([interval, count]) => interval * count).reduce((a, b) => a + b, 0) / scheduledCount * 10 - ) / 10 || 0, - false - ), longest_interval = textInterval( - Math.max(...getKeysPreserveType(cardStats.intervals)) || 0, - false - ); - createStatsChart( - "bar", - "intervalsChart", - t("INTERVALS"), - t("INTERVALS_DESC"), - Object.keys(cardStats.intervals), - Object.values(cardStats.intervals), - t("INTERVALS_SUMMARY", { avg: average_interval, longest: longest_interval }), - t("COUNT"), - t("DAYS"), - t("NUMBER_OF_CARDS") - ); - const eases = getKeysPreserveType(cardStats.eases); - for (let ease = Math.min(...eases); ease <= Math.max(...eases); ease++) { - if (!Object.prototype.hasOwnProperty.call(cardStats.eases, ease)) { - cardStats.eases[ease] = 0; - } - } - const average_ease = Math.round( - getTypedObjectEntries(cardStats.eases).map(([ease, count]) => ease * count).reduce((a, b) => a + b, 0) / scheduledCount - ) || 0; - createStatsChart( - "bar", - "easesChart", - t("EASES"), - "", - Object.keys(cardStats.eases), - Object.values(cardStats.eases), - t("EASES_SUMMARY", { avgEase: average_ease }), - t("COUNT"), - t("EASES"), - t("NUMBER_OF_CARDS") - ); - const totalCardsCount = this.plugin.deckTree.totalFlashcards; - createStatsChart( - "pie", - "cardTypesChart", - t("CARD_TYPES"), - t("CARD_TYPES_DESC"), - [ - `${t("CARD_TYPE_NEW")} - ${Math.round( - cardStats.newCount / totalCardsCount * 100 - )}%`, - `${t("CARD_TYPE_YOUNG")} - ${Math.round( - cardStats.youngCount / totalCardsCount * 100 - )}%`, - `${t("CARD_TYPE_MATURE")} - ${Math.round( - cardStats.matureCount / totalCardsCount * 100 - )}%` - ], - [cardStats.newCount, cardStats.youngCount, cardStats.matureCount], - t("CARD_TYPES_SUMMARY", { totalCardsCount }) - ); - } - onClose() { - const { contentEl } = this; - contentEl.empty(); - } -}; -function createStatsChart(type, canvasId, title, subtitle, labels, data, summary, seriesTitle = "", xAxisTitle = "", yAxisTitle = "") { - const style = getComputedStyle(document.body); - const textColor = style.getPropertyValue("--text-normal"); - let scales = {}, backgroundColor = ["#2196f3"]; - if (type !== "pie") { - scales = { - x: { - title: { - display: true, - text: xAxisTitle, - color: textColor - } - }, - y: { - title: { - display: true, - text: yAxisTitle, - color: textColor - } - } - }; - } else { - backgroundColor = ["#2196f3", "#4caf50", "green"]; - } - const shouldFilter = canvasId === "forecastChart" || canvasId === "intervalsChart"; - const statsChart = new Chart(document.getElementById(canvasId), { - type, - data: { - labels: shouldFilter ? labels.slice(0, 31) : labels, - datasets: [ - { - label: seriesTitle, - backgroundColor, - data: shouldFilter ? data.slice(0, 31) : data - } - ] - }, - options: { - scales, - plugins: { - title: { - display: true, - text: title, - font: { - size: 22 - }, - color: textColor - }, - subtitle: { - display: true, - text: subtitle, - font: { - size: 16, - style: "italic" - }, - color: textColor - }, - legend: { - display: false - } - }, - aspectRatio: 2 - } - }); - if (shouldFilter) { - const chartPeriodEl = document.getElementById("sr-chart-period"); - chartPeriodEl.addEventListener("click", () => { - let filteredLabels, filteredData; - const chartPeriod = chartPeriodEl.value; - if (chartPeriod === "month") { - filteredLabels = labels.slice(0, 31); - filteredData = data.slice(0, 31); - } else if (chartPeriod === "quarter") { - filteredLabels = labels.slice(0, 91); - filteredData = data.slice(0, 91); - } else if (chartPeriod === "year") { - filteredLabels = labels.slice(0, 366); - filteredData = data.slice(0, 366); - } else { - filteredLabels = labels; - filteredData = data; - } - statsChart.data.labels = filteredLabels; - statsChart.data.datasets[0] = { - label: seriesTitle, - backgroundColor, - data: filteredData - }; - statsChart.update(); - }); - } - document.getElementById(`${canvasId}Summary`).innerText = summary; -} - -// src/sidebar.ts -var import_obsidian5 = require("obsidian"); -var REVIEW_QUEUE_VIEW_TYPE = "review-queue-list-view"; -var ReviewQueueListView = class extends import_obsidian5.ItemView { - constructor(leaf, plugin) { - super(leaf); - this.plugin = plugin; - this.registerEvent(this.app.workspace.on("file-open", () => this.redraw())); - this.registerEvent(this.app.vault.on("rename", () => this.redraw())); - } - getViewType() { - return REVIEW_QUEUE_VIEW_TYPE; - } - getDisplayText() { - return t("NOTES_REVIEW_QUEUE"); - } - getIcon() { - return "SpacedRepIcon"; - } - onHeaderMenu(menu) { - menu.addItem((item) => { - item.setTitle(t("CLOSE")).setIcon("cross").onClick(() => { - this.app.workspace.detachLeavesOfType(REVIEW_QUEUE_VIEW_TYPE); - }); - }); - } - redraw() { - const activeFile = this.app.workspace.getActiveFile(); - const rootEl = createDiv("nav-folder mod-root"); - const childrenEl = rootEl.createDiv("nav-folder-children"); - for (const deckKey in this.plugin.reviewDecks) { - const deck = this.plugin.reviewDecks[deckKey]; - const deckCollapsed = !deck.activeFolders.has(deck.deckName); - const deckFolderEl = this.createRightPaneFolder( - childrenEl, - deckKey, - deckCollapsed, - false, - deck - ).getElementsByClassName("nav-folder-children")[0]; - if (deck.newNotes.length > 0) { - const newNotesFolderEl = this.createRightPaneFolder( - deckFolderEl, - t("NEW"), - !deck.activeFolders.has(t("NEW")), - deckCollapsed, - deck - ); - for (const newFile of deck.newNotes) { - const fileIsOpen = activeFile && newFile.path === activeFile.path; - if (fileIsOpen) { - deck.activeFolders.add(deck.deckName); - deck.activeFolders.add(t("NEW")); - this.changeFolderIconToExpanded(newNotesFolderEl); - this.changeFolderIconToExpanded(deckFolderEl); - } - this.createRightPaneFile( - newNotesFolderEl, - newFile, - fileIsOpen, - !deck.activeFolders.has(t("NEW")), - deck, - this.plugin - ); - } - } - if (deck.scheduledNotes.length > 0) { - const now = Date.now(); - let currUnix = -1; - let schedFolderEl = null, folderTitle = ""; - const maxDaysToRender = this.plugin.data.settings.maxNDaysNotesReviewQueue; - for (const sNote of deck.scheduledNotes) { - if (sNote.dueUnix != currUnix) { - const nDays = Math.ceil((sNote.dueUnix - now) / (24 * 3600 * 1e3)); - if (nDays > maxDaysToRender) { - break; - } - if (nDays === -1) { - folderTitle = t("YESTERDAY"); - } else if (nDays === 0) { - folderTitle = t("TODAY"); - } else if (nDays === 1) { - folderTitle = t("TOMORROW"); - } else { - folderTitle = new Date(sNote.dueUnix).toDateString(); - } - schedFolderEl = this.createRightPaneFolder( - deckFolderEl, - folderTitle, - !deck.activeFolders.has(folderTitle), - deckCollapsed, - deck - ); - currUnix = sNote.dueUnix; - } - const fileIsOpen = activeFile && sNote.note.path === activeFile.path; - if (fileIsOpen) { - deck.activeFolders.add(deck.deckName); - deck.activeFolders.add(folderTitle); - this.changeFolderIconToExpanded(schedFolderEl); - this.changeFolderIconToExpanded(deckFolderEl); - } - this.createRightPaneFile( - schedFolderEl, - sNote.note, - fileIsOpen, - !deck.activeFolders.has(folderTitle), - deck, - this.plugin - ); - } - } - } - const contentEl = this.containerEl.children[1]; - contentEl.empty(); - contentEl.appendChild(rootEl); - } - createRightPaneFolder(parentEl, folderTitle, collapsed, hidden, deck) { - const folderEl = parentEl.createDiv("nav-folder"); - const folderTitleEl = folderEl.createDiv("nav-folder-title"); - const childrenEl = folderEl.createDiv("nav-folder-children"); - const collapseIconEl = folderTitleEl.createDiv( - "nav-folder-collapse-indicator collapse-icon" - ); - collapseIconEl.innerHTML = COLLAPSE_ICON; - if (collapsed) { - collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; - } - folderTitleEl.createDiv("nav-folder-title-content").setText(folderTitle); - if (hidden) { - folderEl.style.display = "none"; - } - folderTitleEl.onClickEvent(() => { - for (const child of childrenEl.childNodes) { - if (child.style.display === "block" || child.style.display === "") { - child.style.display = "none"; - collapseIconEl.childNodes[0].style.transform = "rotate(-90deg)"; - deck.activeFolders.delete(folderTitle); - } else { - child.style.display = "block"; - collapseIconEl.childNodes[0].style.transform = ""; - deck.activeFolders.add(folderTitle); - } - } - }); - return folderEl; - } - createRightPaneFile(folderEl, file, fileElActive, hidden, deck, plugin) { - const navFileEl = folderEl.getElementsByClassName("nav-folder-children")[0].createDiv("nav-file"); - if (hidden) { - navFileEl.style.display = "none"; - } - const navFileTitle = navFileEl.createDiv("nav-file-title"); - if (fileElActive) { - navFileTitle.addClass("is-active"); - } - navFileTitle.createDiv("nav-file-title-content").setText(file.basename); - navFileTitle.addEventListener( - "click", - async (event) => { - event.preventDefault(); - plugin.lastSelectedReviewDeck = deck.deckName; - await this.app.workspace.getLeaf().openFile(file); - return false; - }, - false - ); - navFileTitle.addEventListener( - "contextmenu", - (event) => { - event.preventDefault(); - const fileMenu = new import_obsidian5.Menu(); - this.app.workspace.trigger("file-menu", fileMenu, file, "my-context-menu", null); - fileMenu.showAtPosition({ - x: event.pageX, - y: event.pageY - }); - return false; - }, - false - ); - } - changeFolderIconToExpanded(folderEl) { - const collapseIconEl = folderEl.find("div.nav-folder-collapse-indicator"); - collapseIconEl.childNodes[0].style.transform = ""; - } -}; - -// src/review-deck.ts -var import_obsidian6 = require("obsidian"); -var ReviewDeck = class { - constructor(name2) { - this.newNotes = []; - this.scheduledNotes = []; - this.dueNotesCount = 0; - this.deckName = name2; - this.activeFolders = /* @__PURE__ */ new Set([this.deckName, t("TODAY")]); - } - sortNotes(pageranks) { - this.newNotes = this.newNotes.sort( - (a, b) => (pageranks[b.path] || 0) - (pageranks[a.path] || 0) - ); - this.scheduledNotes = this.scheduledNotes.sort((a, b) => { - const result = a.dueUnix - b.dueUnix; - if (result != 0) { - return result; - } - return (pageranks[b.note.path] || 0) - (pageranks[a.note.path] || 0); - }); - } -}; -var ReviewDeckSelectionModal = class extends import_obsidian6.FuzzySuggestModal { - constructor(app2, deckKeys) { - super(app2); - this.deckKeys = []; - this.deckKeys = deckKeys; - } - getItems() { - return this.deckKeys; - } - getItemText(item) { - return item; - } - onChooseItem(deckKey, _) { - this.close(); - this.submitCallback(deckKey); - } -}; - -// src/parser.ts -function parse2(text, singlelineCardSeparator, singlelineReversedCardSeparator, multilineCardSeparator, multilineReversedCardSeparator, convertHighlightsToClozes, convertBoldTextToClozes, convertCurlyBracketsToClozes) { - let cardText = ""; - const cards = []; - let cardType = null; - let lineNo = 0; - const lines = text.replaceAll("\r\n", "\n").split("\n"); - for (let i = 0; i < lines.length; i++) { - if (lines[i].length === 0) { - if (cardType) { - cards.push([cardType, cardText, lineNo]); - cardType = null; - } - cardText = ""; - continue; - } else if (lines[i].startsWith("")) - i++; - i++; - continue; - } - if (cardText.length > 0) { - cardText += "\n"; - } - cardText += lines[i]; - if (lines[i].includes(singlelineReversedCardSeparator) || lines[i].includes(singlelineCardSeparator)) { - cardType = lines[i].includes(singlelineReversedCardSeparator) ? 1 /* SingleLineReversed */ : 0 /* SingleLineBasic */; - cardText = lines[i]; - lineNo = i; - if (i + 1 < lines.length && lines[i + 1].startsWith(""; - const replacementRegex = new RegExp(escapeRegexString(cardText), "gm"); - fileText = fileText.replace(replacementRegex, () => newCardText); - fileChanged = true; - } - const context = settings.showContextInCards ? getCardContext(lineNo, headings, note.basename) : ""; - const siblings = []; - for (let i = 0; i < siblingMatches.length; i++) { - const front = siblingMatches[i][0].trim(), back = siblingMatches[i][1].trim(); - const cardObj = { - isDue: i < scheduling.length, - note, - lineNo, - front, - back, - cardText, - context, - cardType, - siblingIdx: i, - siblings, - editLater: false - }; - if (ignoreStats) { - this.cardStats.newCount++; - cardObj.isDue = true; - this.deckTree.insertFlashcard([...deckPath], cardObj); - } else if (i < scheduling.length) { - const dueUnix = window.moment(scheduling[i][1], ["YYYY-MM-DD", "DD-MM-YYYY"]).valueOf(); - const nDays = Math.ceil((dueUnix - now) / (24 * 3600 * 1e3)); - if (!Object.prototype.hasOwnProperty.call(this.dueDatesFlashcards, nDays)) { - this.dueDatesFlashcards[nDays] = 0; - } - this.dueDatesFlashcards[nDays]++; - const interval = parseInt(scheduling[i][2]), ease = parseInt(scheduling[i][3]); - if (!Object.prototype.hasOwnProperty.call(this.cardStats.intervals, interval)) { - this.cardStats.intervals[interval] = 0; - } - this.cardStats.intervals[interval]++; - if (!Object.prototype.hasOwnProperty.call(this.cardStats.eases, ease)) { - this.cardStats.eases[ease] = 0; - } - this.cardStats.eases[ease]++; - totalNoteEase += ease; - scheduledCount++; - if (interval >= 32) { - this.cardStats.matureCount++; - } else { - this.cardStats.youngCount++; - } - if (this.data.buryList.includes(cardTextHash)) { - this.deckTree.countFlashcard([...deckPath]); - continue; - } - if (dueUnix <= now) { - cardObj.interval = interval; - cardObj.ease = ease; - cardObj.delayBeforeReview = now - dueUnix; - this.deckTree.insertFlashcard([...deckPath], cardObj); - } else { - this.deckTree.countFlashcard([...deckPath]); - continue; - } - } else { - this.cardStats.newCount++; - if (this.data.buryList.includes(cyrb53(cardText))) { - this.deckTree.countFlashcard([...deckPath]); - continue; - } - this.deckTree.insertFlashcard([...deckPath], cardObj); - } - siblings.push(cardObj); - } - } - if (fileChanged) { - await this.app.vault.modify(note, fileText); - } - if (scheduledCount > 0) { - const flashcardsInNoteAvgEase = totalNoteEase / scheduledCount; - const flashcardContribution = Math.min( - 1, - Math.log(scheduledCount + 0.5) / Math.log(64) - ); - return flashcardsInNoteAvgEase * flashcardContribution + settings.baseEase * (1 - flashcardContribution); - } - return 0; - } - async loadPluginData() { - this.data = Object.assign({}, DEFAULT_DATA, await this.loadData()); - this.data.settings = Object.assign({}, DEFAULT_SETTINGS, this.data.settings); - } - async savePluginData() { - await this.saveData(this.data); - } - initView() { - this.registerView( - REVIEW_QUEUE_VIEW_TYPE, - (leaf) => this.reviewQueueView = new ReviewQueueListView(leaf, this) - ); - if (this.data.settings.enableNoteReviewPaneOnStartup && app.workspace.getLeavesOfType(REVIEW_QUEUE_VIEW_TYPE).length == 0) { - this.app.workspace.getRightLeaf(false).setViewState({ - type: REVIEW_QUEUE_VIEW_TYPE, - active: true - }); - } - } -}; -function getCardContext(cardLine, headings, note_title) { - const stack = []; - for (const heading of headings) { - if (heading.position.start.line > cardLine) { - break; - } - while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) { - stack.pop(); - } - stack.push(heading); - } - let context = `${note_title} > `; - for (const headingObj of stack) { - headingObj.heading = headingObj.heading.replace(/\[\^\d+\]/gm, "").trim(); - context += `${headingObj.heading} > `; - } - return context.slice(0, -3); -} -/*! Bundled license information: - -@kurkle/color/dist/color.esm.js: - (*! - * @kurkle/color v0.3.2 - * https://github.com/kurkle/color#readme - * (c) 2023 Jukka Kurkela - * Released under the MIT License - *) - -chart.js/dist/chunks/helpers.segment.js: - (*! - * Chart.js v4.2.1 - * https://www.chartjs.org - * (c) 2023 Chart.js Contributors - * Released under the MIT License - *) - -chart.js/dist/chart.js: - (*! - * Chart.js v4.2.1 - * https://www.chartjs.org - * (c) 2023 Chart.js Contributors - * Released under the MIT License - *) -*/ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3BhZ2VyYW5rLmpzL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdmh0bWwvc3JjL2VtcHR5LXRhZ3MuanMiLCAibm9kZV9tb2R1bGVzL3ZodG1sL3NyYy92aHRtbC5qcyIsICJzcmMvbWFpbi50cyIsICJzcmMvc2V0dGluZ3MudHMiLCAic3JjL2xhbmcvaGVscGVycy50cyIsICJzcmMvbGFuZy9sb2NhbGUvYWYudHMiLCAic3JjL2xhbmcvbG9jYWxlL2FyLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9jei50cyIsICJzcmMvbGFuZy9sb2NhbGUvYm4udHMiLCAic3JjL2xhbmcvbG9jYWxlL2RhLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9kZS50cyIsICJzcmMvbGFuZy9sb2NhbGUvZW4udHMiLCAic3JjL2xhbmcvbG9jYWxlL2VuLWdiLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9lcy50cyIsICJzcmMvbGFuZy9sb2NhbGUvZnIudHMiLCAic3JjL2xhbmcvbG9jYWxlL2hpLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9pZC50cyIsICJzcmMvbGFuZy9sb2NhbGUvaXQudHMiLCAic3JjL2xhbmcvbG9jYWxlL2phLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9rby50cyIsICJzcmMvbGFuZy9sb2NhbGUvbXIudHMiLCAic3JjL2xhbmcvbG9jYWxlL25sLnRzIiwgInNyYy9sYW5nL2xvY2FsZS9uby50cyIsICJzcmMvbGFuZy9sb2NhbGUvcGwudHMiLCAic3JjL2xhbmcvbG9jYWxlL3B0LnRzIiwgInNyYy9sYW5nL2xvY2FsZS9wdC1ici50cyIsICJzcmMvbGFuZy9sb2NhbGUvcm8udHMiLCAic3JjL2xhbmcvbG9jYWxlL3J1LnRzIiwgInNyYy9sYW5nL2xvY2FsZS90YS50cyIsICJzcmMvbGFuZy9sb2NhbGUvdGUudHMiLCAic3JjL2xhbmcvbG9jYWxlL3RoLnRzIiwgInNyYy9sYW5nL2xvY2FsZS90ci50cyIsICJzcmMvbGFuZy9sb2NhbGUvdWsudHMiLCAic3JjL2xhbmcvbG9jYWxlL3VyLnRzIiwgInNyYy9sYW5nL2xvY2FsZS92aS50cyIsICJzcmMvbGFuZy9sb2NhbGUvemgtY24udHMiLCAic3JjL2xhbmcvbG9jYWxlL3poLXR3LnRzIiwgInNyYy9mbGFzaGNhcmQtbW9kYWwudHN4IiwgInNyYy9zY2hlZHVsaW5nLnRzIiwgInNyYy9jb25zdGFudHMudHMiLCAic3JjL3V0aWxzLnRzIiwgInNyYy9zdGF0cy1tb2RhbC50c3giLCAibm9kZV9tb2R1bGVzL0BrdXJrbGUvY29sb3IvZGlzdC9jb2xvci5lc20uanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuY29yZS50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5tYXRoLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmNvbGxlY3Rpb24udHMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuZXh0cmFzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmVhc2luZy50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jb2xvci50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5hbmltYXRpb25zLmRlZmF1bHRzLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmxheW91dHMuZGVmYXVsdHMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuaW50bC50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS50aWNrcy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5zY2FsZS5kZWZhdWx0cy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5kZWZhdWx0cy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMub3B0aW9ucy50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2hlbHBlcnMvaGVscGVycy5jb25maWcuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuY3VydmUudHMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMuZG9tLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLmludGVycG9sYXRpb24udHMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9oZWxwZXJzL2hlbHBlcnMucnRsLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaGVscGVycy9oZWxwZXJzLnNlZ21lbnQuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0b3IuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuYW5pbWF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmFuaW1hdGlvbnMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb250cm9sbGVycy9jb250cm9sbGVyLmJhci5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIuYnViYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5kb3VnaG51dC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIubGluZS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvbnRyb2xsZXJzL2NvbnRyb2xsZXIucG9sYXJBcmVhLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5waWUuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb250cm9sbGVycy9jb250cm9sbGVyLnJhZGFyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29udHJvbGxlcnMvY29udHJvbGxlci5zY2F0dGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmFkYXB0ZXJzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmludGVyYWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLmxheW91dHMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9wbGF0Zm9ybS5iYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGxhdGZvcm0vcGxhdGZvcm0uYmFzaWMuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9wbGF0Zm9ybS5kb20uanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbGF0Zm9ybS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5lbGVtZW50LnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnNjYWxlLmF1dG9za2lwLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnNjYWxlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvY29yZS9jb3JlLnR5cGVkUmVnaXN0cnkuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUucmVnaXN0cnkuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUucGx1Z2lucy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2NvcmUvY29yZS5jb25maWcuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9jb3JlL2NvcmUuY29udHJvbGxlci5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQuYXJjLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvZWxlbWVudHMvZWxlbWVudC5saW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvZWxlbWVudHMvZWxlbWVudC5wb2ludC50cyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL2VsZW1lbnRzL2VsZW1lbnQuYmFyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uY29sb3JzLnRzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZGVjaW1hdGlvbi5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmZpbGxlci9maWxsZXIuc2VnbWVudC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLmZpbGxlci9maWxsZXIuaGVscGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci5vcHRpb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci50YXJnZXQuc3RhY2suanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvc2ltcGxlQXJjLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4uZmlsbGVyL2ZpbGxlci50YXJnZXQuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvZmlsbGVyLmRyYXdpbmcuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5maWxsZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi5sZWdlbmQuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9wbHVnaW5zL3BsdWdpbi50aXRsZS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3BsdWdpbnMvcGx1Z2luLnN1YnRpdGxlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvcGx1Z2lucy9wbHVnaW4udG9vbHRpcC5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5jYXRlZ29yeS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5saW5lYXJiYXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvc2NhbGVzL3NjYWxlLmxpbmVhci5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5sb2dhcml0aG1pYy5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS5yYWRpYWxMaW5lYXIuanMiLCAibm9kZV9tb2R1bGVzL2NoYXJ0LmpzL3NyYy9zY2FsZXMvc2NhbGUudGltZS5qcyIsICJub2RlX21vZHVsZXMvY2hhcnQuanMvc3JjL3NjYWxlcy9zY2FsZS50aW1lc2VyaWVzLmpzIiwgIm5vZGVfbW9kdWxlcy9jaGFydC5qcy9zcmMvaW5kZXgudHMiLCAic3JjL3NpZGViYXIudHMiLCAic3JjL3Jldmlldy1kZWNrLnRzIiwgInNyYy9wYXJzZXIudHMiLCAic3JjL2ljb25zL2FwcGljb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZm9yT3duKG9iamVjdCwgY2FsbGJhY2spIHtcbiAgICBpZiAoKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnKSAmJiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soa2V5LCBvYmplY3Rba2V5XSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0ge1xuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgZWRnZXM6IHt9LFxuICAgICAgICBub2Rlczoge31cbiAgICB9O1xuXG4gICAgc2VsZi5saW5rID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0LCB3ZWlnaHQpIHtcbiAgICAgICAgaWYgKChpc0Zpbml0ZSh3ZWlnaHQpICE9PSB0cnVlKSB8fCAod2VpZ2h0ID09PSBudWxsKSkge1xuICAgICAgICAgICAgd2VpZ2h0ID0gMTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgd2VpZ2h0ID0gcGFyc2VGbG9hdCh3ZWlnaHQpO1xuXG4gICAgICAgIGlmIChzZWxmLm5vZGVzLmhhc093blByb3BlcnR5KHNvdXJjZSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlbGYuY291bnQrKztcbiAgICAgICAgICAgIHNlbGYubm9kZXNbc291cmNlXSA9IHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgb3V0Ym91bmQ6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLm5vZGVzW3NvdXJjZV0ub3V0Ym91bmQgKz0gd2VpZ2h0O1xuXG4gICAgICAgIGlmIChzZWxmLm5vZGVzLmhhc093blByb3BlcnR5KHRhcmdldCkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHNlbGYuY291bnQrKztcbiAgICAgICAgICAgIHNlbGYubm9kZXNbdGFyZ2V0XSA9IHtcbiAgICAgICAgICAgICAgICB3ZWlnaHQ6IDAsXG4gICAgICAgICAgICAgICAgb3V0Ym91bmQ6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5lZGdlcy5oYXNPd25Qcm9wZXJ0eShzb3VyY2UpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBzZWxmLmVkZ2VzW3NvdXJjZV0gPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLmVkZ2VzW3NvdXJjZV0uaGFzT3duUHJvcGVydHkodGFyZ2V0KSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2VsZi5lZGdlc1tzb3VyY2VdW3RhcmdldF0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5lZGdlc1tzb3VyY2VdW3RhcmdldF0gKz0gd2VpZ2h0O1xuICAgIH07XG5cbiAgICBzZWxmLnJhbmsgPSBmdW5jdGlvbiAoYWxwaGEsIGVwc2lsb24sIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBkZWx0YSA9IDEsXG4gICAgICAgICAgICBpbnZlcnNlID0gMSAvIHNlbGYuY291bnQ7XG5cbiAgICAgICAgZm9yT3duKHNlbGYuZWRnZXMsIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLm5vZGVzW3NvdXJjZV0ub3V0Ym91bmQgPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yT3duKHNlbGYuZWRnZXNbc291cmNlXSwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmVkZ2VzW3NvdXJjZV1bdGFyZ2V0XSAvPSBzZWxmLm5vZGVzW3NvdXJjZV0ub3V0Ym91bmQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvck93bihzZWxmLm5vZGVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBzZWxmLm5vZGVzW2tleV0ud2VpZ2h0ID0gaW52ZXJzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2hpbGUgKGRlbHRhID4gZXBzaWxvbikge1xuICAgICAgICAgICAgdmFyIGxlYWsgPSAwLFxuICAgICAgICAgICAgICAgIG5vZGVzID0ge307XG5cbiAgICAgICAgICAgIGZvck93bihzZWxmLm5vZGVzLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG5vZGVzW2tleV0gPSB2YWx1ZS53ZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUub3V0Ym91bmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhayArPSB2YWx1ZS53ZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2VsZi5ub2Rlc1trZXldLndlaWdodCA9IDA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGVhayAqPSBhbHBoYTtcblxuICAgICAgICAgICAgZm9yT3duKHNlbGYubm9kZXMsIGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBmb3JPd24oc2VsZi5lZGdlc1tzb3VyY2VdLCBmdW5jdGlvbiAodGFyZ2V0LCB3ZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub2Rlc1t0YXJnZXRdLndlaWdodCArPSBhbHBoYSAqIG5vZGVzW3NvdXJjZV0gKiB3ZWlnaHQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZWxmLm5vZGVzW3NvdXJjZV0ud2VpZ2h0ICs9ICgxIC0gYWxwaGEpICogaW52ZXJzZSArIGxlYWsgKiBpbnZlcnNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRlbHRhID0gMDtcblxuICAgICAgICAgICAgZm9yT3duKHNlbGYubm9kZXMsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZGVsdGEgKz0gTWF0aC5hYnModmFsdWUud2VpZ2h0IC0gbm9kZXNba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvck93bihzZWxmLm5vZGVzLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soa2V5LCBzZWxmLm5vZGVzW2tleV0ud2VpZ2h0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNlbGYucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuY291bnQgPSAwO1xuICAgICAgICBzZWxmLmVkZ2VzID0ge307XG4gICAgICAgIHNlbGYubm9kZXMgPSB7fTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNlbGY7XG59KSgpO1xuIiwgImV4cG9ydCBkZWZhdWx0IFtcblx0J2FyZWEnLFxuXHQnYmFzZScsXG5cdCdicicsXG5cdCdjb2wnLFxuXHQnY29tbWFuZCcsXG5cdCdlbWJlZCcsXG5cdCdocicsXG5cdCdpbWcnLFxuXHQnaW5wdXQnLFxuXHQna2V5Z2VuJyxcblx0J2xpbmsnLFxuXHQnbWV0YScsXG5cdCdwYXJhbScsXG5cdCdzb3VyY2UnLFxuXHQndHJhY2snLFxuXHQnd2JyJ1xuXTsiLCAiaW1wb3J0IGVtcHR5VGFncyBmcm9tICcuL2VtcHR5LXRhZ3MnO1xuXG4vLyBlc2NhcGUgYW4gYXR0cmlidXRlXG5sZXQgZXNjID0gc3RyID0+IFN0cmluZyhzdHIpLnJlcGxhY2UoL1smPD5cIiddL2csIHM9PmAmJHttYXBbc119O2ApO1xubGV0IG1hcCA9IHsnJic6J2FtcCcsJzwnOidsdCcsJz4nOidndCcsJ1wiJzoncXVvdCcsXCInXCI6J2Fwb3MnfTtcbmxldCBzZXRJbm5lckhUTUxBdHRyID0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJztcbmxldCBET01BdHRyaWJ1dGVOYW1lcyA9IHtcblx0Y2xhc3NOYW1lOiAnY2xhc3MnLFxuXHRodG1sRm9yOiAnZm9yJ1xufTtcblxubGV0IHNhbml0aXplZCA9IHt9O1xuXG4vKiogSHlwZXJzY3JpcHQgcmV2aXZlciB0aGF0IGNvbnN0cnVjdHMgYSBzYW5pdGl6ZWQgSFRNTCBzdHJpbmcuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBoKG5hbWUsIGF0dHJzKSB7XG5cdGxldCBzdGFjaz1bXSwgcyA9ICcnO1xuXHRhdHRycyA9IGF0dHJzIHx8IHt9O1xuXHRmb3IgKGxldCBpPWFyZ3VtZW50cy5sZW5ndGg7IGktLSA+IDI7ICkge1xuXHRcdHN0YWNrLnB1c2goYXJndW1lbnRzW2ldKTtcblx0fVxuXG5cdC8vIFNvcnRvZiBjb21wb25lbnQgc3VwcG9ydCFcblx0aWYgKHR5cGVvZiBuYW1lPT09J2Z1bmN0aW9uJykge1xuXHRcdGF0dHJzLmNoaWxkcmVuID0gc3RhY2sucmV2ZXJzZSgpO1xuXHRcdHJldHVybiBuYW1lKGF0dHJzKTtcblx0XHQvLyByZXR1cm4gbmFtZShhdHRycywgc3RhY2sucmV2ZXJzZSgpKTtcblx0fVxuXG5cdGlmIChuYW1lKSB7XG5cdFx0cyArPSAnPCcgKyBuYW1lO1xuXHRcdGlmIChhdHRycykgZm9yIChsZXQgaSBpbiBhdHRycykge1xuXHRcdFx0aWYgKGF0dHJzW2ldIT09ZmFsc2UgJiYgYXR0cnNbaV0hPW51bGwgJiYgaSAhPT0gc2V0SW5uZXJIVE1MQXR0cikge1xuXHRcdFx0XHRzICs9IGAgJHtET01BdHRyaWJ1dGVOYW1lc1tpXSA/IERPTUF0dHJpYnV0ZU5hbWVzW2ldIDogZXNjKGkpfT1cIiR7ZXNjKGF0dHJzW2ldKX1cImA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHMgKz0gJz4nO1xuXHR9XG5cblx0aWYgKGVtcHR5VGFncy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuXHRcdGlmIChhdHRyc1tzZXRJbm5lckhUTUxBdHRyXSkge1xuXHRcdFx0cyArPSBhdHRyc1tzZXRJbm5lckhUTUxBdHRyXS5fX2h0bWw7XG5cdFx0fVxuXHRcdGVsc2Ugd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuXHRcdFx0bGV0IGNoaWxkID0gc3RhY2sucG9wKCk7XG5cdFx0XHRpZiAoY2hpbGQpIHtcblx0XHRcdFx0aWYgKGNoaWxkLnBvcCkge1xuXHRcdFx0XHRcdGZvciAobGV0IGk9Y2hpbGQubGVuZ3RoOyBpLS07ICkgc3RhY2sucHVzaChjaGlsZFtpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0cyArPSBzYW5pdGl6ZWRbY2hpbGRdPT09dHJ1ZSA/IGNoaWxkIDogZXNjKGNoaWxkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHMgKz0gbmFtZSA/IGA8LyR7bmFtZX0+YCA6ICcnO1xuXHR9XG5cblx0c2FuaXRpemVkW3NdID0gdHJ1ZTtcblx0cmV0dXJuIHM7XG59XG4iLCAiaW1wb3J0IHtcbiAgICBOb3RpY2UsXG4gICAgUGx1Z2luLFxuICAgIFRBYnN0cmFjdEZpbGUsXG4gICAgVEZpbGUsXG4gICAgSGVhZGluZ0NhY2hlLFxuICAgIGdldEFsbFRhZ3MsXG4gICAgRnJvbnRNYXR0ZXJDYWNoZSxcbn0gZnJvbSBcIm9ic2lkaWFuXCI7XG5pbXBvcnQgKiBhcyBncmFwaCBmcm9tIFwicGFnZXJhbmsuanNcIjtcblxuaW1wb3J0IHsgU1JTZXR0aW5nVGFiLCBTUlNldHRpbmdzLCBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSBcInNyYy9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgRmxhc2hjYXJkTW9kYWwsIERlY2sgfSBmcm9tIFwic3JjL2ZsYXNoY2FyZC1tb2RhbFwiO1xuaW1wb3J0IHsgU3RhdHNNb2RhbCwgU3RhdHMgfSBmcm9tIFwic3JjL3N0YXRzLW1vZGFsXCI7XG5pbXBvcnQgeyBSZXZpZXdRdWV1ZUxpc3RWaWV3LCBSRVZJRVdfUVVFVUVfVklFV19UWVBFIH0gZnJvbSBcInNyYy9zaWRlYmFyXCI7XG5pbXBvcnQgeyBDYXJkLCBDYXJkVHlwZSwgUmV2aWV3UmVzcG9uc2UsIHNjaGVkdWxlIH0gZnJvbSBcInNyYy9zY2hlZHVsaW5nXCI7XG5pbXBvcnQge1xuICAgIFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYLFxuICAgIFNDSEVEVUxJTkdfSU5GT19SRUdFWCxcbiAgICBMRUdBQ1lfU0NIRURVTElOR19FWFRSQUNUT1IsXG4gICAgTVVMVElfU0NIRURVTElOR19FWFRSQUNUT1IsXG59IGZyb20gXCJzcmMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBlc2NhcGVSZWdleFN0cmluZywgY3lyYjUzIH0gZnJvbSBcInNyYy91dGlsc1wiO1xuaW1wb3J0IHsgUmV2aWV3RGVjaywgUmV2aWV3RGVja1NlbGVjdGlvbk1vZGFsIH0gZnJvbSBcInNyYy9yZXZpZXctZGVja1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCJzcmMvbGFuZy9oZWxwZXJzXCI7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gXCJzcmMvcGFyc2VyXCI7XG5pbXBvcnQgeyBhcHBJY29uIH0gZnJvbSBcInNyYy9pY29ucy9hcHBpY29uXCI7XG5cbmludGVyZmFjZSBQbHVnaW5EYXRhIHtcbiAgICBzZXR0aW5nczogU1JTZXR0aW5ncztcbiAgICBidXJ5RGF0ZTogc3RyaW5nO1xuICAgIC8vIGhhc2hlcyBvZiBjYXJkIHRleHRzXG4gICAgLy8gc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB1c2VyIGRvZXNuJ3QgbW9kaWZ5IGNhcmQncyB0ZXh0XG4gICAgLy8gd2hpY2ggY292ZXJzIG1vc3Qgb2YgdGhlIGNhc2VzXG4gICAgYnVyeUxpc3Q6IHN0cmluZ1tdO1xuICAgIGhpc3RvcnlEZWNrOiBzdHJpbmcgfCBudWxsO1xufVxuXG5jb25zdCBERUZBVUxUX0RBVEE6IFBsdWdpbkRhdGEgPSB7XG4gICAgc2V0dGluZ3M6IERFRkFVTFRfU0VUVElOR1MsXG4gICAgYnVyeURhdGU6IFwiXCIsXG4gICAgYnVyeUxpc3Q6IFtdLFxuICAgIGhpc3RvcnlEZWNrOiBudWxsLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZE5vdGUge1xuICAgIG5vdGU6IFRGaWxlO1xuICAgIGR1ZVVuaXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rU3RhdCB7XG4gICAgc291cmNlUGF0aDogc3RyaW5nO1xuICAgIGxpbmtDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTUlBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gICAgcHJpdmF0ZSBzdGF0dXNCYXI6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgcmV2aWV3UXVldWVWaWV3OiBSZXZpZXdRdWV1ZUxpc3RWaWV3O1xuICAgIHB1YmxpYyBkYXRhOiBQbHVnaW5EYXRhO1xuICAgIHB1YmxpYyBzeW5jTG9jayA9IGZhbHNlO1xuXG4gICAgcHVibGljIHJldmlld0RlY2tzOiB7IFtkZWNrS2V5OiBzdHJpbmddOiBSZXZpZXdEZWNrIH0gPSB7fTtcbiAgICBwdWJsaWMgbGFzdFNlbGVjdGVkUmV2aWV3RGVjazogc3RyaW5nO1xuXG4gICAgcHVibGljIG5ld05vdGVzOiBURmlsZVtdID0gW107XG4gICAgcHVibGljIHNjaGVkdWxlZE5vdGVzOiBTY2hlZE5vdGVbXSA9IFtdO1xuICAgIHB1YmxpYyBlYXNlQnlQYXRoOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHJpdmF0ZSBpbmNvbWluZ0xpbmtzOiBSZWNvcmQ8c3RyaW5nLCBMaW5rU3RhdFtdPiA9IHt9O1xuICAgIHByaXZhdGUgcGFnZXJhbmtzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHJpdmF0ZSBkdWVOb3Rlc0NvdW50ID0gMDtcbiAgICBwdWJsaWMgZHVlRGF0ZXNOb3RlczogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9OyAvLyBSZWNvcmQ8IyBvZiBkYXlzIGluIGZ1dHVyZSwgZHVlIGNvdW50PlxuXG4gICAgcHVibGljIGRlY2tUcmVlOiBEZWNrID0gbmV3IERlY2soXCJyb290XCIsIG51bGwpO1xuICAgIHB1YmxpYyBkdWVEYXRlc0ZsYXNoY2FyZHM6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7fTsgLy8gUmVjb3JkPCMgb2YgZGF5cyBpbiBmdXR1cmUsIGR1ZSBjb3VudD5cbiAgICBwdWJsaWMgY2FyZFN0YXRzOiBTdGF0cztcblxuICAgIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGx1Z2luRGF0YSgpO1xuXG4gICAgICAgIGFwcEljb24oKTtcblxuICAgICAgICB0aGlzLnN0YXR1c0JhciA9IHRoaXMuYWRkU3RhdHVzQmFySXRlbSgpO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhci5jbGFzc0xpc3QuYWRkKFwibW9kLWNsaWNrYWJsZVwiKTtcbiAgICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0KFwiT1BFTl9OT1RFX0ZPUl9SRVZJRVdcIikpO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsLXBvc2l0aW9uXCIsIFwidG9wXCIpO1xuICAgICAgICB0aGlzLnN0YXR1c0Jhci5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN5bmNMb2NrKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZpZXdOZXh0Tm90ZU1vZGFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUmliYm9uSWNvbihcIlNwYWNlZFJlcEljb25cIiwgdChcIlJFVklFV19DQVJEU1wiKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN5bmNMb2NrKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgbmV3IEZsYXNoY2FyZE1vZGFsKHRoaXMuYXBwLCB0aGlzKS5vcGVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5kYXRhLnNldHRpbmdzLmRpc2FibGVGaWxlTWVudVJldmlld09wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudChcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub24oXCJmaWxlLW1lbnVcIiwgKG1lbnUsIGZpbGVpc2g6IFRBYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVpc2ggaW5zdGFuY2VvZiBURmlsZSAmJiBmaWxlaXNoLmV4dGVuc2lvbiA9PT0gXCJtZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRpdGxlKHQoXCJSRVZJRVdfRUFTWV9GSUxFX01FTlVcIikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwiU3BhY2VkUmVwSWNvblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXZpZXdSZXNwb25zZShmaWxlaXNoLCBSZXZpZXdSZXNwb25zZS5FYXN5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGRJdGVtKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUaXRsZSh0KFwiUkVWSUVXX0dPT0RfRklMRV9NRU5VXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcIlNwYWNlZFJlcEljb25cIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2UoZmlsZWlzaCwgUmV2aWV3UmVzcG9uc2UuR29vZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0VGl0bGUodChcIlJFVklFV19IQVJEX0ZJTEVfTUVOVVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJTcGFjZWRSZXBJY29uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJldmlld1Jlc3BvbnNlKGZpbGVpc2gsIFJldmlld1Jlc3BvbnNlLkhhcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFkZENvbW1hbmQoe1xuICAgICAgICAgICAgaWQ6IFwic3JzLW5vdGUtcmV2aWV3LW9wZW4tbm90ZVwiLFxuICAgICAgICAgICAgbmFtZTogdChcIk9QRU5fTk9URV9GT1JfUkVWSUVXXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3luY0xvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2aWV3TmV4dE5vdGVNb2RhbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtbm90ZS1yZXZpZXctZWFzeVwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19OT1RFX0VBU1lfQ01EXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2Uob3BlbkZpbGUsIFJldmlld1Jlc3BvbnNlLkVhc3kpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtbm90ZS1yZXZpZXctZ29vZFwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19OT1RFX0dPT0RfQ01EXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2Uob3BlbkZpbGUsIFJldmlld1Jlc3BvbnNlLkdvb2QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtbm90ZS1yZXZpZXctaGFyZFwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19OT1RFX0hBUkRfQ01EXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlUmV2aWV3UmVzcG9uc2Uob3BlbkZpbGUsIFJldmlld1Jlc3BvbnNlLkhhcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtcmV2aWV3LWZsYXNoY2FyZHNcIixcbiAgICAgICAgICAgIG5hbWU6IHQoXCJSRVZJRVdfQUxMX0NBUkRTXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3luY0xvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGbGFzaGNhcmRNb2RhbCh0aGlzLmFwcCwgdGhpcykub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtY3JhbS1mbGFzaGNhcmRzXCIsXG4gICAgICAgICAgICBuYW1lOiB0KFwiQ1JBTV9BTExfQ0FSRFNcIiksXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luYyh0cnVlKTtcbiAgICAgICAgICAgICAgICBuZXcgRmxhc2hjYXJkTW9kYWwodGhpcy5hcHAsIHRoaXMsIHRydWUpLm9wZW4oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtcmV2aWV3LWZsYXNoY2FyZHMtaW4tbm90ZVwiLFxuICAgICAgICAgICAgbmFtZTogdChcIlJFVklFV19DQVJEU19JTl9OT1RFXCIpLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAob3BlbkZpbGUgJiYgb3BlbkZpbGUuZXh0ZW5zaW9uID09PSBcIm1kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZSA9IG5ldyBEZWNrKFwicm9vdFwiLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVja1BhdGg6IHN0cmluZ1tdID0gdGhpcy5maW5kRGVja1BhdGgob3BlbkZpbGUpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbmRGbGFzaGNhcmRzSW5Ob3RlKG9wZW5GaWxlLCBkZWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGbGFzaGNhcmRNb2RhbCh0aGlzLmFwcCwgdGhpcykub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtY3JhbS1mbGFzaGNhcmRzLWluLW5vdGVcIixcbiAgICAgICAgICAgIG5hbWU6IHQoXCJDUkFNX0NBUkRTX0lOX05PVEVcIiksXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5GaWxlOiBURmlsZSB8IG51bGwgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgICAgICAgICAgICAgIGlmIChvcGVuRmlsZSAmJiBvcGVuRmlsZS5leHRlbnNpb24gPT09IFwibWRcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY2tUcmVlID0gbmV3IERlY2soXCJyb290XCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNrUGF0aDogc3RyaW5nW10gPSB0aGlzLmZpbmREZWNrUGF0aChvcGVuRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluZEZsYXNoY2FyZHNJbk5vdGUob3BlbkZpbGUsIGRlY2tQYXRoLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBGbGFzaGNhcmRNb2RhbCh0aGlzLmFwcCwgdGhpcywgdHJ1ZSkub3BlbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogXCJzcnMtdmlldy1zdGF0c1wiLFxuICAgICAgICAgICAgbmFtZTogdChcIlZJRVdfU1RBVFNcIiksXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zeW5jTG9jaykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXRzTW9kYWwodGhpcy5hcHAsIHRoaXMpLm9wZW4oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFkZFNldHRpbmdUYWIobmV3IFNSU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFZpZXcoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zeW5jTG9jaykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb251bmxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoUkVWSUVXX1FVRVVFX1ZJRVdfVFlQRSkuZm9yRWFjaCgobGVhZikgPT4gbGVhZi5kZXRhY2goKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc3luYyhpZ25vcmVTdGF0cyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNMb2NrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jTG9jayA9IHRydWU7XG5cbiAgICAgICAgLy8gcmVzZXQgbm90ZXMgc3R1ZmZcbiAgICAgICAgZ3JhcGgucmVzZXQoKTtcbiAgICAgICAgdGhpcy5lYXNlQnlQYXRoID0ge307XG4gICAgICAgIHRoaXMuaW5jb21pbmdMaW5rcyA9IHt9O1xuICAgICAgICB0aGlzLnBhZ2VyYW5rcyA9IHt9O1xuICAgICAgICB0aGlzLmR1ZU5vdGVzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmR1ZURhdGVzTm90ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXZpZXdEZWNrcyA9IHt9O1xuXG4gICAgICAgIC8vIHJlc2V0IGZsYXNoY2FyZHMgc3R1ZmZcbiAgICAgICAgdGhpcy5kZWNrVHJlZSA9IG5ldyBEZWNrKFwicm9vdFwiLCBudWxsKTtcbiAgICAgICAgdGhpcy5kdWVEYXRlc0ZsYXNoY2FyZHMgPSB7fTtcbiAgICAgICAgdGhpcy5jYXJkU3RhdHMgPSB7XG4gICAgICAgICAgICBlYXNlczoge30sXG4gICAgICAgICAgICBpbnRlcnZhbHM6IHt9LFxuICAgICAgICAgICAgbmV3Q291bnQ6IDAsXG4gICAgICAgICAgICB5b3VuZ0NvdW50OiAwLFxuICAgICAgICAgICAgbWF0dXJlQ291bnQ6IDAsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgbm93ID0gd2luZG93Lm1vbWVudChEYXRlLm5vdygpKTtcbiAgICAgICAgY29uc3QgdG9kYXlEYXRlOiBzdHJpbmcgPSBub3cuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcbiAgICAgICAgLy8gY2xlYXIgYnVyeSBsaXN0IGlmIHdlJ3ZlIGNoYW5nZWQgZGF0ZXNcbiAgICAgICAgaWYgKHRvZGF5RGF0ZSAhPT0gdGhpcy5kYXRhLmJ1cnlEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuYnVyeURhdGUgPSB0b2RheURhdGU7XG4gICAgICAgICAgICB0aGlzLmRhdGEuYnVyeUxpc3QgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vdGVzOiBURmlsZVtdID0gdGhpcy5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpO1xuICAgICAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3Mubm90ZUZvbGRlcnNUb0lnbm9yZS5zb21lKChmb2xkZXIpID0+XG4gICAgICAgICAgICAgICAgICAgIG5vdGUucGF0aC5zdGFydHNXaXRoKGZvbGRlcilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdMaW5rc1tub3RlLnBhdGhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nTGlua3Nbbm90ZS5wYXRoXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUucmVzb2x2ZWRMaW5rc1tub3RlLnBhdGhdIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIGluIGxpbmtzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdMaW5rc1t0YXJnZXRQYXRoXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nTGlua3NbdGFyZ2V0UGF0aF0gPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIG1hcmtkb3duIGZpbGVzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UGF0aC5zcGxpdChcIi5cIikucG9wKCkudG9Mb3dlckNhc2UoKSA9PT0gXCJtZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdMaW5rc1t0YXJnZXRQYXRoXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGg6IG5vdGUucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtDb3VudDogbGlua3NbdGFyZ2V0UGF0aF0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmxpbmsobm90ZS5wYXRoLCB0YXJnZXRQYXRoLCBsaW5rc1t0YXJnZXRQYXRoXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZWNrUGF0aDogc3RyaW5nW10gPSB0aGlzLmZpbmREZWNrUGF0aChub3RlKTtcbiAgICAgICAgICAgIGlmIChkZWNrUGF0aC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbGFzaGNhcmRzSW5Ob3RlQXZnRWFzZTogbnVtYmVyID0gYXdhaXQgdGhpcy5maW5kRmxhc2hjYXJkc0luTm90ZShcbiAgICAgICAgICAgICAgICAgICAgbm90ZSxcbiAgICAgICAgICAgICAgICAgICAgZGVja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVTdGF0c1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmxhc2hjYXJkc0luTm90ZUF2Z0Vhc2UgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdID0gZmxhc2hjYXJkc0luTm90ZUF2Z0Vhc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlQ2FjaGVkRGF0YSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKG5vdGUpIHx8IHt9O1xuXG4gICAgICAgICAgICBjb25zdCBmcm9udG1hdHRlcjogRnJvbnRNYXR0ZXJDYWNoZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgICAgICAgICAgICBmaWxlQ2FjaGVkRGF0YS5mcm9udG1hdHRlciB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRBbGxUYWdzKGZpbGVDYWNoZWREYXRhKSB8fCBbXTtcblxuICAgICAgICAgICAgbGV0IHNob3VsZElnbm9yZSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkTm90ZVRhZ3MgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0YWdUb1JldmlldyBvZiB0aGlzLmRhdGEuc2V0dGluZ3MudGFnc1RvUmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ3Muc29tZSgodGFnKSA9PiB0YWcgPT09IHRhZ1RvUmV2aWV3IHx8IHRhZy5zdGFydHNXaXRoKHRhZ1RvUmV2aWV3ICsgXCIvXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnJldmlld0RlY2tzLCB0YWdUb1JldmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV2aWV3RGVja3NbdGFnVG9SZXZpZXddID0gbmV3IFJldmlld0RlY2sodGFnVG9SZXZpZXcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWROb3RlVGFncy5wdXNoKHRhZ1RvUmV2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkSWdub3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRJZ25vcmUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZmlsZSBoYXMgbm8gc2NoZWR1bGluZyBpbmZvcm1hdGlvblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgXCJzci1kdWVcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb250bWF0dGVyLCBcInNyLWludGVydmFsXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgXCJzci1lYXNlXCIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGVkTm90ZVRhZyBvZiBtYXRjaGVkTm90ZVRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZpZXdEZWNrc1ttYXRjaGVkTm90ZVRhZ10ubmV3Tm90ZXMucHVzaChub3RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGR1ZVVuaXg6IG51bWJlciA9IHdpbmRvd1xuICAgICAgICAgICAgICAgIC5tb21lbnQoZnJvbnRtYXR0ZXJbXCJzci1kdWVcIl0sIFtcIllZWVktTU0tRERcIiwgXCJERC1NTS1ZWVlZXCIsIFwiZGRkIE1NTSBERCBZWVlZXCJdKVxuICAgICAgICAgICAgICAgIC52YWx1ZU9mKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hlZE5vdGVUYWcgb2YgbWF0Y2hlZE5vdGVUYWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZpZXdEZWNrc1ttYXRjaGVkTm90ZVRhZ10uc2NoZWR1bGVkTm90ZXMucHVzaCh7IG5vdGUsIGR1ZVVuaXggfSk7XG4gICAgICAgICAgICAgICAgaWYgKGR1ZVVuaXggPD0gbm93LnZhbHVlT2YoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmlld0RlY2tzW21hdGNoZWROb3RlVGFnXS5kdWVOb3Rlc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZWFzZUJ5UGF0aCwgbm90ZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdID1cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdICsgZnJvbnRtYXR0ZXJbXCJzci1lYXNlXCJdKSAvIDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWFzZUJ5UGF0aFtub3RlLnBhdGhdID0gZnJvbnRtYXR0ZXJbXCJzci1lYXNlXCJdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZHVlVW5peCA8PSBub3cudmFsdWVPZigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kdWVOb3Rlc0NvdW50Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5EYXlzOiBudW1iZXIgPSBNYXRoLmNlaWwoKGR1ZVVuaXggLSBub3cudmFsdWVPZigpKSAvICgyNCAqIDM2MDAgKiAxMDAwKSk7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmR1ZURhdGVzTm90ZXMsIG5EYXlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHVlRGF0ZXNOb3Rlc1tuRGF5c10gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kdWVEYXRlc05vdGVzW25EYXlzXSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JhcGgucmFuaygwLjg1LCAwLjAwMDAwMSwgKG5vZGU6IHN0cmluZywgcmFuazogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VyYW5rc1tub2RlXSA9IHJhbmsgKiAxMDAwMDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc29ydCB0aGUgZGVjayBuYW1lc1xuICAgICAgICB0aGlzLmRlY2tUcmVlLnNvcnRTdWJkZWNrc0xpc3QoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5zaG93RGVidWdNZXNzYWdlcykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFNSOiAke3QoXCJFQVNFU1wiKX1gLCB0aGlzLmVhc2VCeVBhdGgpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFNSOiAke3QoXCJERUNLU1wiKX1gLCB0aGlzLmRlY2tUcmVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGVja0tleSBpbiB0aGlzLnJldmlld0RlY2tzKSB7XG4gICAgICAgICAgICB0aGlzLnJldmlld0RlY2tzW2RlY2tLZXldLnNvcnROb3Rlcyh0aGlzLnBhZ2VyYW5rcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhLnNldHRpbmdzLnNob3dEZWJ1Z01lc3NhZ2VzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBcIlNSOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHQoXCJTWU5DX1RJTUVfVEFLRU5cIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdDogRGF0ZS5ub3coKSAtIG5vdy52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0dXNCYXIuc2V0VGV4dChcbiAgICAgICAgICAgIHQoXCJTVEFUVVNfQkFSXCIsIHtcbiAgICAgICAgICAgICAgICBkdWVOb3Rlc0NvdW50OiB0aGlzLmR1ZU5vdGVzQ291bnQsXG4gICAgICAgICAgICAgICAgZHVlRmxhc2hjYXJkc0NvdW50OiB0aGlzLmRlY2tUcmVlLmR1ZUZsYXNoY2FyZHNDb3VudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5lbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cCkgdGhpcy5yZXZpZXdRdWV1ZVZpZXcucmVkcmF3KCk7XG4gICAgICAgIHRoaXMuc3luY0xvY2sgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlUmV2aWV3UmVzcG9uc2Uobm90ZTogVEZpbGUsIHJlc3BvbnNlOiBSZXZpZXdSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBmaWxlQ2FjaGVkRGF0YSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKG5vdGUpIHx8IHt9O1xuICAgICAgICBjb25zdCBmcm9udG1hdHRlcjogRnJvbnRNYXR0ZXJDYWNoZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgICAgICAgIGZpbGVDYWNoZWREYXRhLmZyb250bWF0dGVyIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRBbGxUYWdzKGZpbGVDYWNoZWREYXRhKSB8fCBbXTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5ub3RlRm9sZGVyc1RvSWdub3JlLnNvbWUoKGZvbGRlcikgPT4gbm90ZS5wYXRoLnN0YXJ0c1dpdGgoZm9sZGVyKSkpIHtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIk5PVEVfSU5fSUdOT1JFRF9GT0xERVJcIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNob3VsZElnbm9yZSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MudGFnc1RvUmV2aWV3LnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICh0YWdUb1JldmlldykgPT4gdGFnID09PSB0YWdUb1JldmlldyB8fCB0YWcuc3RhcnRzV2l0aCh0YWdUb1JldmlldyArIFwiL1wiKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNob3VsZElnbm9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3VsZElnbm9yZSkge1xuICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiUExFQVNFX1RBR19OT1RFXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlVGV4dDogc3RyaW5nID0gYXdhaXQgdGhpcy5hcHAudmF1bHQucmVhZChub3RlKTtcbiAgICAgICAgbGV0IGVhc2U6IG51bWJlciwgaW50ZXJ2YWw6IG51bWJlciwgZGVsYXlCZWZvcmVSZXZpZXc6IG51bWJlcjtcbiAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBuZXcgbm90ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmcm9udG1hdHRlciwgXCJzci1kdWVcIikgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZnJvbnRtYXR0ZXIsIFwic3ItaW50ZXJ2YWxcIikgJiZcbiAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZnJvbnRtYXR0ZXIsIFwic3ItZWFzZVwiKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBsaW5rVG90YWwgPSAwLFxuICAgICAgICAgICAgICAgIGxpbmtQR1RvdGFsID0gMCxcbiAgICAgICAgICAgICAgICB0b3RhbExpbmtDb3VudCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RhdE9iaiBvZiB0aGlzLmluY29taW5nTGlua3Nbbm90ZS5wYXRoXSB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVhc2U6IG51bWJlciA9IHRoaXMuZWFzZUJ5UGF0aFtzdGF0T2JqLnNvdXJjZVBhdGhdO1xuICAgICAgICAgICAgICAgIGlmIChlYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtUb3RhbCArPSBzdGF0T2JqLmxpbmtDb3VudCAqIHRoaXMucGFnZXJhbmtzW3N0YXRPYmouc291cmNlUGF0aF0gKiBlYXNlO1xuICAgICAgICAgICAgICAgICAgICBsaW5rUEdUb3RhbCArPSB0aGlzLnBhZ2VyYW5rc1tzdGF0T2JqLnNvdXJjZVBhdGhdICogc3RhdE9iai5saW5rQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTGlua0NvdW50ICs9IHN0YXRPYmoubGlua0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3V0Z29pbmdMaW5rcyA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUucmVzb2x2ZWRMaW5rc1tub3RlLnBhdGhdIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5rZWRGaWxlUGF0aCBpbiBvdXRnb2luZ0xpbmtzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWFzZTogbnVtYmVyID0gdGhpcy5lYXNlQnlQYXRoW2xpbmtlZEZpbGVQYXRoXTtcbiAgICAgICAgICAgICAgICBpZiAoZWFzZSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5rVG90YWwgKz1cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGdvaW5nTGlua3NbbGlua2VkRmlsZVBhdGhdICogdGhpcy5wYWdlcmFua3NbbGlua2VkRmlsZVBhdGhdICogZWFzZTtcbiAgICAgICAgICAgICAgICAgICAgbGlua1BHVG90YWwgKz0gdGhpcy5wYWdlcmFua3NbbGlua2VkRmlsZVBhdGhdICogb3V0Z29pbmdMaW5rc1tsaW5rZWRGaWxlUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsTGlua0NvdW50ICs9IG91dGdvaW5nTGlua3NbbGlua2VkRmlsZVBhdGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua0NvbnRyaWJ1dGlvbjogbnVtYmVyID1cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MubWF4TGlua0ZhY3RvciAqXG4gICAgICAgICAgICAgICAgTWF0aC5taW4oMS4wLCBNYXRoLmxvZyh0b3RhbExpbmtDb3VudCArIDAuNSkgLyBNYXRoLmxvZyg2NCkpO1xuICAgICAgICAgICAgZWFzZSA9XG4gICAgICAgICAgICAgICAgKDEuMCAtIGxpbmtDb250cmlidXRpb24pICogdGhpcy5kYXRhLnNldHRpbmdzLmJhc2VFYXNlICtcbiAgICAgICAgICAgICAgICAodG90YWxMaW5rQ291bnQgPiAwXG4gICAgICAgICAgICAgICAgICAgID8gKGxpbmtDb250cmlidXRpb24gKiBsaW5rVG90YWwpIC8gbGlua1BHVG90YWxcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5rQ29udHJpYnV0aW9uICogdGhpcy5kYXRhLnNldHRpbmdzLmJhc2VFYXNlKTtcbiAgICAgICAgICAgIC8vIGFkZCBub3RlJ3MgYXZlcmFnZSBmbGFzaGNhcmQgZWFzZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5lYXNlQnlQYXRoLCBub3RlLnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgZWFzZSA9IChlYXNlICsgdGhpcy5lYXNlQnlQYXRoW25vdGUucGF0aF0pIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVhc2UgPSBNYXRoLnJvdW5kKGVhc2UpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSAxLjA7XG4gICAgICAgICAgICBkZWxheUJlZm9yZVJldmlldyA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IGZyb250bWF0dGVyW1wic3ItaW50ZXJ2YWxcIl07XG4gICAgICAgICAgICBlYXNlID0gZnJvbnRtYXR0ZXJbXCJzci1lYXNlXCJdO1xuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcgPVxuICAgICAgICAgICAgICAgIG5vdyAtXG4gICAgICAgICAgICAgICAgd2luZG93XG4gICAgICAgICAgICAgICAgICAgIC5tb21lbnQoZnJvbnRtYXR0ZXJbXCJzci1kdWVcIl0sIFtcIllZWVktTU0tRERcIiwgXCJERC1NTS1ZWVlZXCIsIFwiZGRkIE1NTSBERCBZWVlZXCJdKVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVPZigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZWRPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSBzY2hlZHVsZShcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICBlYXNlLFxuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcsXG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MsXG4gICAgICAgICAgICB0aGlzLmR1ZURhdGVzTm90ZXNcbiAgICAgICAgKTtcbiAgICAgICAgaW50ZXJ2YWwgPSBzY2hlZE9iai5pbnRlcnZhbDtcbiAgICAgICAgZWFzZSA9IHNjaGVkT2JqLmVhc2U7XG5cbiAgICAgICAgY29uc3QgZHVlID0gd2luZG93Lm1vbWVudChub3cgKyBpbnRlcnZhbCAqIDI0ICogMzYwMCAqIDEwMDApO1xuICAgICAgICBjb25zdCBkdWVTdHJpbmc6IHN0cmluZyA9IGR1ZS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHNjaGVkdWxpbmcgaW5mbyBleGlzdHNcbiAgICAgICAgaWYgKFNDSEVEVUxJTkdfSU5GT19SRUdFWC50ZXN0KGZpbGVUZXh0KSkge1xuICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGluZ0luZm8gPSBTQ0hFRFVMSU5HX0lORk9fUkVHRVguZXhlYyhmaWxlVGV4dCk7XG4gICAgICAgICAgICBmaWxlVGV4dCA9IGZpbGVUZXh0LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgU0NIRURVTElOR19JTkZPX1JFR0VYLFxuICAgICAgICAgICAgICAgIGAtLS1cXG4ke3NjaGVkdWxpbmdJbmZvWzFdfXNyLWR1ZTogJHtkdWVTdHJpbmd9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBzci1pbnRlcnZhbDogJHtpbnRlcnZhbH1cXG5zci1lYXNlOiAke2Vhc2V9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAke3NjaGVkdWxpbmdJbmZvWzVdfS0tLWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoWUFNTF9GUk9OVF9NQVRURVJfUkVHRVgudGVzdChmaWxlVGV4dCkpIHtcbiAgICAgICAgICAgIC8vIG5ldyBub3RlIHdpdGggZXhpc3RpbmcgWUFNTCBmcm9udCBtYXR0ZXJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nWWFtbCA9IFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYLmV4ZWMoZmlsZVRleHQpO1xuICAgICAgICAgICAgZmlsZVRleHQgPSBmaWxlVGV4dC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYLFxuICAgICAgICAgICAgICAgIGAtLS1cXG4ke2V4aXN0aW5nWWFtbFsxXX1zci1kdWU6ICR7ZHVlU3RyaW5nfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgc3ItaW50ZXJ2YWw6ICR7aW50ZXJ2YWx9XFxuc3ItZWFzZTogJHtlYXNlfVxcbi0tLWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaWxlVGV4dCA9XG4gICAgICAgICAgICAgICAgYC0tLVxcbnNyLWR1ZTogJHtkdWVTdHJpbmd9XFxuc3ItaW50ZXJ2YWw6ICR7aW50ZXJ2YWx9XFxuYCArXG4gICAgICAgICAgICAgICAgYHNyLWVhc2U6ICR7ZWFzZX1cXG4tLS1cXG5cXG4ke2ZpbGVUZXh0fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhLnNldHRpbmdzLmJ1cnlTaWJsaW5nQ2FyZHMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmluZEZsYXNoY2FyZHNJbk5vdGUobm90ZSwgW10sIHRydWUpOyAvLyBidXJ5IGFsbCBjYXJkcyBpbiBjdXJyZW50IG5vdGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5tb2RpZnkobm90ZSwgZmlsZVRleHQpO1xuXG4gICAgICAgIG5ldyBOb3RpY2UodChcIlJFU1BPTlNFX1JFQ0VJVkVEXCIpKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5zZXR0aW5ncy5hdXRvTmV4dE5vdGUpIHtcbiAgICAgICAgICAgIHRoaXMucmV2aWV3TmV4dE5vdGUodGhpcy5sYXN0U2VsZWN0ZWRSZXZpZXdEZWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJldmlld05leHROb3RlTW9kYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJldmlld0RlY2tOYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLnJldmlld0RlY2tzKTtcbiAgICAgICAgaWYgKHJldmlld0RlY2tOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmV2aWV3TmV4dE5vdGUocmV2aWV3RGVja05hbWVzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2tTZWxlY3Rpb25Nb2RhbCA9IG5ldyBSZXZpZXdEZWNrU2VsZWN0aW9uTW9kYWwodGhpcy5hcHAsIHJldmlld0RlY2tOYW1lcyk7XG4gICAgICAgICAgICBkZWNrU2VsZWN0aW9uTW9kYWwuc3VibWl0Q2FsbGJhY2sgPSAoZGVja0tleTogc3RyaW5nKSA9PiB0aGlzLnJldmlld05leHROb3RlKGRlY2tLZXkpO1xuICAgICAgICAgICAgZGVja1NlbGVjdGlvbk1vZGFsLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJldmlld05leHROb3RlKGRlY2tLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnJldmlld0RlY2tzLCBkZWNrS2V5KSkge1xuICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiTk9fREVDS19FWElTVFNcIiwgeyBkZWNrTmFtZTogZGVja0tleSB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZFJldmlld0RlY2sgPSBkZWNrS2V5O1xuICAgICAgICBjb25zdCBkZWNrID0gdGhpcy5yZXZpZXdEZWNrc1tkZWNrS2V5XTtcblxuICAgICAgICBpZiAoZGVjay5kdWVOb3Rlc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGVcbiAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRlY2suZHVlTm90ZXNDb3VudClcbiAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLm9wZW5GaWxlKGRlY2suc2NoZWR1bGVkTm90ZXNbaW5kZXhdLm5vdGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlY2submV3Tm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGVcbiAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGRlY2submV3Tm90ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCkub3BlbkZpbGUoZGVjay5uZXdOb3Rlc1tpbmRleF0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3IE5vdGljZSh0KFwiQUxMX0NBVUdIVF9VUFwiKSk7XG4gICAgfVxuXG4gICAgZmluZERlY2tQYXRoKG5vdGU6IFRGaWxlKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgZGVja1BhdGg6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLmRhdGEuc2V0dGluZ3MuY29udmVydEZvbGRlcnNUb0RlY2tzKSB7XG4gICAgICAgICAgICBkZWNrUGF0aCA9IG5vdGUucGF0aC5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICBkZWNrUGF0aC5wb3AoKTsgLy8gcmVtb3ZlIGZpbGVuYW1lXG4gICAgICAgICAgICBpZiAoZGVja1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVja1BhdGggPSBbXCIvXCJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZUNhY2hlZERhdGEgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShub3RlKSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRBbGxUYWdzKGZpbGVDYWNoZWREYXRhKSB8fCBbXTtcblxuICAgICAgICAgICAgb3V0ZXI6IGZvciAoY29uc3QgdGFnVG9SZXZpZXcgb2YgdGhpcy5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFRhZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT09IHRhZ1RvUmV2aWV3IHx8IHRhZy5zdGFydHNXaXRoKHRhZ1RvUmV2aWV3ICsgXCIvXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrUGF0aCA9IHRhZy5zdWJzdHJpbmcoMSkuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVja1BhdGg7XG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEZsYXNoY2FyZHNJbk5vdGUoXG4gICAgICAgIG5vdGU6IFRGaWxlLFxuICAgICAgICBkZWNrUGF0aDogc3RyaW5nW10sXG4gICAgICAgIGJ1cnlPbmx5ID0gZmFsc2UsXG4gICAgICAgIGlnbm9yZVN0YXRzID0gZmFsc2VcbiAgICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBsZXQgZmlsZVRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQobm90ZSk7XG4gICAgICAgIGNvbnN0IGZpbGVDYWNoZWREYXRhID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUobm90ZSkgfHwge307XG4gICAgICAgIGNvbnN0IGhlYWRpbmdzOiBIZWFkaW5nQ2FjaGVbXSA9IGZpbGVDYWNoZWREYXRhLmhlYWRpbmdzIHx8IFtdO1xuICAgICAgICBsZXQgZmlsZUNoYW5nZWQgPSBmYWxzZSxcbiAgICAgICAgICAgIHRvdGFsTm90ZUVhc2UgPSAwLFxuICAgICAgICAgICAgc2NoZWR1bGVkQ291bnQgPSAwO1xuICAgICAgICBjb25zdCBzZXR0aW5nczogU1JTZXR0aW5ncyA9IHRoaXMuZGF0YS5zZXR0aW5ncztcbiAgICAgICAgY29uc3Qgbm90ZURlY2tQYXRoID0gZGVja1BhdGg7XG5cbiAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBwYXJzZWRDYXJkczogW0NhcmRUeXBlLCBzdHJpbmcsIG51bWJlcl1bXSA9IHBhcnNlKFxuICAgICAgICAgICAgZmlsZVRleHQsXG4gICAgICAgICAgICBzZXR0aW5ncy5zaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcixcbiAgICAgICAgICAgIHNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IsXG4gICAgICAgICAgICBzZXR0aW5ncy5tdWx0aWxpbmVDYXJkU2VwYXJhdG9yLFxuICAgICAgICAgICAgc2V0dGluZ3MubXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yLFxuICAgICAgICAgICAgc2V0dGluZ3MuY29udmVydEhpZ2hsaWdodHNUb0Nsb3plcyxcbiAgICAgICAgICAgIHNldHRpbmdzLmNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzLFxuICAgICAgICAgICAgc2V0dGluZ3MuY29udmVydEN1cmx5QnJhY2tldHNUb0Nsb3plc1xuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZENhcmQgb2YgcGFyc2VkQ2FyZHMpIHtcbiAgICAgICAgICAgIGRlY2tQYXRoID0gbm90ZURlY2tQYXRoO1xuICAgICAgICAgICAgY29uc3QgY2FyZFR5cGU6IENhcmRUeXBlID0gcGFyc2VkQ2FyZFswXSxcbiAgICAgICAgICAgICAgICBsaW5lTm86IG51bWJlciA9IHBhcnNlZENhcmRbMl07XG4gICAgICAgICAgICBsZXQgY2FyZFRleHQ6IHN0cmluZyA9IHBhcnNlZENhcmRbMV07XG5cbiAgICAgICAgICAgIGlmIChjYXJkVGV4dC5pbmNsdWRlcyhzZXR0aW5ncy5lZGl0TGF0ZXJUYWcpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghc2V0dGluZ3MuY29udmVydEZvbGRlcnNUb0RlY2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnSW5DYXJkUmVnRXggPSAvXiNbXlxccyNdKy9naTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYXJkRGVja1BhdGggPSBjYXJkVGV4dFxuICAgICAgICAgICAgICAgICAgICAubWF0Y2godGFnSW5DYXJkUmVnRXgpXG4gICAgICAgICAgICAgICAgICAgID8uc2xpY2UoLTEpWzBdXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiI1wiLCBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjYXJkRGVja1BhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVja1BhdGggPSBjYXJkRGVja1BhdGg7XG4gICAgICAgICAgICAgICAgICAgIGNhcmRUZXh0ID0gY2FyZFRleHQucmVwbGFjZUFsbCh0YWdJbkNhcmRSZWdFeCwgXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmRlY2tUcmVlLmNyZWF0ZURlY2soWy4uLmRlY2tQYXRoXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhcmRUZXh0SGFzaDogc3RyaW5nID0gY3lyYjUzKGNhcmRUZXh0KTtcblxuICAgICAgICAgICAgaWYgKGJ1cnlPbmx5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLmJ1cnlMaXN0LnB1c2goY2FyZFRleHRIYXNoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2libGluZ01hdGNoZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICAgICAgICAgICAgaWYgKGNhcmRUeXBlID09PSBDYXJkVHlwZS5DbG96ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzOiBSZWdFeHBNYXRjaEFycmF5W10gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuY29udmVydEhpZ2hsaWdodHNUb0Nsb3plcykge1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKC4uLmNhcmRUZXh0Lm1hdGNoQWxsKC89PSguKj8pPT0vZ20pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goLi4uY2FyZFRleHQubWF0Y2hBbGwoL1xcKlxcKiguKj8pXFwqXFwqL2dtKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jb252ZXJ0Q3VybHlCcmFja2V0c1RvQ2xvemVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goLi4uY2FyZFRleHQubWF0Y2hBbGwoL3t7KC4qPyl9fS9nbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaWJsaW5ncy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmluZGV4ID4gYi5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udCA9IHNpYmxpbmdzLnJlZHVjZSgoYWNjLCBzaWJsaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0SFRNTCA9IGA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNsb3plLWlucHV0XCIgc2l6ZT1cIiR7c2libGluZ1sxXS5sZW5ndGh9XCIgLz5gO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYWNjLnJlcGxhY2Uoc2libGluZ1swXSwgaW5wdXRIVE1MKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhY2MgKyBzaWJsaW5nLmlucHV0LnJlcGxhY2Uoc2libGluZ1swXSwgaW5wdXRIVE1MKTtcbiAgICAgICAgICAgICAgICB9LCBcIlwiKTtcblxuICAgICAgICAgICAgICAgIC8vIGJhY2sgaXMgYmVpbmcgY3JlYXRlZCBpbiBmbGFzaGNhcmQtbW9kYWwudHN4IHdpdGggZ2V0Q2xvemVCYWNrVmlldygpXG4gICAgICAgICAgICAgICAgc2libGluZ01hdGNoZXMucHVzaChbZnJvbnQsIFwiXCJdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICAgIGlmIChjYXJkVHlwZSA9PT0gQ2FyZFR5cGUuU2luZ2xlTGluZUJhc2ljKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGNhcmRUZXh0LmluZGV4T2Yoc2V0dGluZ3Muc2luZ2xlTGluZUNhcmRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRUZXh0LnN1YnN0cmluZygwLCBpZHgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRleHQuc3Vic3RyaW5nKGlkeCArIHNldHRpbmdzLnNpbmdsZUxpbmVDYXJkU2VwYXJhdG9yLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZFR5cGUgPT09IENhcmRUeXBlLlNpbmdsZUxpbmVSZXZlcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZHggPSBjYXJkVGV4dC5pbmRleE9mKHNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWRlMTogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKDAsIGlkeCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlMjogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArIHNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtzaWRlMSwgc2lkZTJdKTtcbiAgICAgICAgICAgICAgICAgICAgc2libGluZ01hdGNoZXMucHVzaChbc2lkZTIsIHNpZGUxXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXJkVHlwZSA9PT0gQ2FyZFR5cGUuTXVsdGlMaW5lQmFzaWMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWR4ID0gY2FyZFRleHQuaW5kZXhPZihcIlxcblwiICsgc2V0dGluZ3MubXVsdGlsaW5lQ2FyZFNlcGFyYXRvciArIFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRUZXh0LnN1YnN0cmluZygwLCBpZHgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZFRleHQuc3Vic3RyaW5nKGlkeCArIDIgKyBzZXR0aW5ncy5tdWx0aWxpbmVDYXJkU2VwYXJhdG9yLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyZFR5cGUgPT09IENhcmRUeXBlLk11bHRpTGluZVJldmVyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGNhcmRUZXh0LmluZGV4T2YoXCJcXG5cIiArIHNldHRpbmdzLm11bHRpbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvciArIFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWRlMTogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKDAsIGlkeCksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlMjogc3RyaW5nID0gY2FyZFRleHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCArIDIgKyBzZXR0aW5ncy5tdWx0aWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzaWJsaW5nTWF0Y2hlcy5wdXNoKFtzaWRlMSwgc2lkZTJdKTtcbiAgICAgICAgICAgICAgICAgICAgc2libGluZ01hdGNoZXMucHVzaChbc2lkZTIsIHNpZGUxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2NoZWR1bGluZzogUmVnRXhwTWF0Y2hBcnJheVtdID0gWy4uLmNhcmRUZXh0Lm1hdGNoQWxsKE1VTFRJX1NDSEVEVUxJTkdfRVhUUkFDVE9SKV07XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGluZy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgc2NoZWR1bGluZyA9IFsuLi5jYXJkVGV4dC5tYXRjaEFsbChMRUdBQ1lfU0NIRURVTElOR19FWFRSQUNUT1IpXTtcblxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBzb21lIGV4dHJhIHNjaGVkdWxpbmcgZGF0ZXMgdG8gZGVsZXRlXG4gICAgICAgICAgICBpZiAoc2NoZWR1bGluZy5sZW5ndGggPiBzaWJsaW5nTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZHhTY2hlZDogbnVtYmVyID0gY2FyZFRleHQubGFzdEluZGV4T2YoXCI8IS0tU1I6XCIpICsgNztcbiAgICAgICAgICAgICAgICBsZXQgbmV3Q2FyZFRleHQ6IHN0cmluZyA9IGNhcmRUZXh0LnN1YnN0cmluZygwLCBpZHhTY2hlZCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWJsaW5nTWF0Y2hlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2FyZFRleHQgKz0gYCEke3NjaGVkdWxpbmdbaV1bMV19LCR7c2NoZWR1bGluZ1tpXVsyXX0sJHtzY2hlZHVsaW5nW2ldWzNdfWA7XG4gICAgICAgICAgICAgICAgbmV3Q2FyZFRleHQgKz0gXCItLT5cIjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50UmVnZXggPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ2V4U3RyaW5nKGNhcmRUZXh0KSwgXCJnbVwiKTtcbiAgICAgICAgICAgICAgICBmaWxlVGV4dCA9IGZpbGVUZXh0LnJlcGxhY2UocmVwbGFjZW1lbnRSZWdleCwgKCkgPT4gbmV3Q2FyZFRleHQpO1xuICAgICAgICAgICAgICAgIGZpbGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc2V0dGluZ3Muc2hvd0NvbnRleHRJbkNhcmRzXG4gICAgICAgICAgICAgICAgPyBnZXRDYXJkQ29udGV4dChsaW5lTm8sIGhlYWRpbmdzLCBub3RlLmJhc2VuYW1lKVxuICAgICAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzOiBDYXJkW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2libGluZ01hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9udDogc3RyaW5nID0gc2libGluZ01hdGNoZXNbaV1bMF0udHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICBiYWNrOiBzdHJpbmcgPSBzaWJsaW5nTWF0Y2hlc1tpXVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYXJkT2JqOiBDYXJkID0ge1xuICAgICAgICAgICAgICAgICAgICBpc0R1ZTogaSA8IHNjaGVkdWxpbmcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBub3RlLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTm8sXG4gICAgICAgICAgICAgICAgICAgIGZyb250LFxuICAgICAgICAgICAgICAgICAgICBiYWNrLFxuICAgICAgICAgICAgICAgICAgICBjYXJkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2FyZFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdJZHg6IGksXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLFxuICAgICAgICAgICAgICAgICAgICBlZGl0TGF0ZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyBjYXJkIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgIGlmIChpZ25vcmVTdGF0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdGF0cy5uZXdDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBjYXJkT2JqLmlzRHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZS5pbnNlcnRGbGFzaGNhcmQoWy4uLmRlY2tQYXRoXSwgY2FyZE9iaik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpIDwgc2NoZWR1bGluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVlVW5peDogbnVtYmVyID0gd2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAubW9tZW50KHNjaGVkdWxpbmdbaV1bMV0sIFtcIllZWVktTU0tRERcIiwgXCJERC1NTS1ZWVlZXCJdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbkRheXM6IG51bWJlciA9IE1hdGguY2VpbCgoZHVlVW5peCAtIG5vdykgLyAoMjQgKiAzNjAwICogMTAwMCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmR1ZURhdGVzRmxhc2hjYXJkcywgbkRheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1ZURhdGVzRmxhc2hjYXJkc1tuRGF5c10gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHVlRGF0ZXNGbGFzaGNhcmRzW25EYXlzXSsrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVydmFsOiBudW1iZXIgPSBwYXJzZUludChzY2hlZHVsaW5nW2ldWzJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVhc2U6IG51bWJlciA9IHBhcnNlSW50KHNjaGVkdWxpbmdbaV1bM10pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNhcmRTdGF0cy5pbnRlcnZhbHMsIGludGVydmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMuaW50ZXJ2YWxzW2ludGVydmFsXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMuaW50ZXJ2YWxzW2ludGVydmFsXSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNhcmRTdGF0cy5lYXNlcywgZWFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FyZFN0YXRzLmVhc2VzW2Vhc2VdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdGF0cy5lYXNlc1tlYXNlXSsrO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbE5vdGVFYXNlICs9IGVhc2U7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZENvdW50Kys7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsID49IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdGF0cy5tYXR1cmVDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMueW91bmdDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5idXJ5TGlzdC5pbmNsdWRlcyhjYXJkVGV4dEhhc2gpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY2tUcmVlLmNvdW50Rmxhc2hjYXJkKFsuLi5kZWNrUGF0aF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZHVlVW5peCA8PSBub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRPYmouaW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRPYmouZWFzZSA9IGVhc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXJkT2JqLmRlbGF5QmVmb3JlUmV2aWV3ID0gbm93IC0gZHVlVW5peDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVja1RyZWUuaW5zZXJ0Rmxhc2hjYXJkKFsuLi5kZWNrUGF0aF0sIGNhcmRPYmopO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZS5jb3VudEZsYXNoY2FyZChbLi4uZGVja1BhdGhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkU3RhdHMubmV3Q291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5idXJ5TGlzdC5pbmNsdWRlcyhjeXJiNTMoY2FyZFRleHQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNrVHJlZS5jb3VudEZsYXNoY2FyZChbLi4uZGVja1BhdGhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVja1RyZWUuaW5zZXJ0Rmxhc2hjYXJkKFsuLi5kZWNrUGF0aF0sIGNhcmRPYmopO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goY2FyZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0Lm1vZGlmeShub3RlLCBmaWxlVGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2NoZWR1bGVkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFzaGNhcmRzSW5Ob3RlQXZnRWFzZTogbnVtYmVyID0gdG90YWxOb3RlRWFzZSAvIHNjaGVkdWxlZENvdW50O1xuICAgICAgICAgICAgY29uc3QgZmxhc2hjYXJkQ29udHJpYnV0aW9uOiBudW1iZXIgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAxLjAsXG4gICAgICAgICAgICAgICAgTWF0aC5sb2coc2NoZWR1bGVkQ291bnQgKyAwLjUpIC8gTWF0aC5sb2coNjQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBmbGFzaGNhcmRzSW5Ob3RlQXZnRWFzZSAqIGZsYXNoY2FyZENvbnRyaWJ1dGlvbiArXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuYmFzZUVhc2UgKiAoMS4wIC0gZmxhc2hjYXJkQ29udHJpYnV0aW9uKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRQbHVnaW5EYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0RBVEEsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIHRoaXMuZGF0YS5zZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVBsdWdpbkRhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlclZpZXcoXG4gICAgICAgICAgICBSRVZJRVdfUVVFVUVfVklFV19UWVBFLFxuICAgICAgICAgICAgKGxlYWYpID0+ICh0aGlzLnJldmlld1F1ZXVlVmlldyA9IG5ldyBSZXZpZXdRdWV1ZUxpc3RWaWV3KGxlYWYsIHRoaXMpKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5lbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cCAmJlxuICAgICAgICAgICAgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoUkVWSUVXX1FVRVVFX1ZJRVdfVFlQRSkubGVuZ3RoID09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFJFVklFV19RVUVVRV9WSUVXX1RZUEUsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldENhcmRDb250ZXh0KGNhcmRMaW5lOiBudW1iZXIsIGhlYWRpbmdzOiBIZWFkaW5nQ2FjaGVbXSwgbm90ZV90aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFjazogSGVhZGluZ0NhY2hlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGhlYWRpbmcgb2YgaGVhZGluZ3MpIHtcbiAgICAgICAgaWYgKGhlYWRpbmcucG9zaXRpb24uc3RhcnQubGluZSA+IGNhcmRMaW5lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdLmxldmVsID49IGhlYWRpbmcubGV2ZWwpIHtcbiAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhY2sucHVzaChoZWFkaW5nKTtcbiAgICB9XG5cbiAgICBsZXQgY29udGV4dCA9IGAke25vdGVfdGl0bGV9ID4gYDtcbiAgICBmb3IgKGNvbnN0IGhlYWRpbmdPYmogb2Ygc3RhY2spIHtcbiAgICAgICAgaGVhZGluZ09iai5oZWFkaW5nID0gaGVhZGluZ09iai5oZWFkaW5nLnJlcGxhY2UoL1xcW1xcXlxcZCtcXF0vZ20sIFwiXCIpLnRyaW0oKTtcbiAgICAgICAgY29udGV4dCArPSBgJHtoZWFkaW5nT2JqLmhlYWRpbmd9ID4gYDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQuc2xpY2UoMCwgLTMpO1xufVxuIiwgImltcG9ydCB7IE5vdGljZSwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgQXBwLCBQbGF0Zm9ybSB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHR5cGUgU1JQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcInNyYy9sYW5nL2hlbHBlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTUlNldHRpbmdzIHtcbiAgICAvLyBmbGFzaGNhcmRzXG4gICAgZmxhc2hjYXJkRWFzeVRleHQ6IHN0cmluZztcbiAgICBmbGFzaGNhcmRHb29kVGV4dDogc3RyaW5nO1xuICAgIGZsYXNoY2FyZEhhcmRUZXh0OiBzdHJpbmc7XG4gICAgZmxhc2hjYXJkVGFnczogc3RyaW5nW107XG4gICAgY29udmVydEZvbGRlcnNUb0RlY2tzOiBib29sZWFuO1xuICAgIGNhcmRDb21tZW50T25TYW1lTGluZTogYm9vbGVhbjtcbiAgICBidXJ5U2libGluZ0NhcmRzOiBib29sZWFuO1xuICAgIHNob3dDb250ZXh0SW5DYXJkczogYm9vbGVhbjtcbiAgICBmbGFzaGNhcmRIZWlnaHRQZXJjZW50YWdlOiBudW1iZXI7XG4gICAgZmxhc2hjYXJkV2lkdGhQZXJjZW50YWdlOiBudW1iZXI7XG4gICAgcmFuZG9taXplQ2FyZE9yZGVyOiBib29sZWFuO1xuICAgIGNvbnZlcnRIaWdobGlnaHRzVG9DbG96ZXM6IGJvb2xlYW47XG4gICAgY29udmVydEJvbGRUZXh0VG9DbG96ZXM6IGJvb2xlYW47XG4gICAgY29udmVydEN1cmx5QnJhY2tldHNUb0Nsb3plczogYm9vbGVhbjtcbiAgICBzaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcjogc3RyaW5nO1xuICAgIHNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3I6IHN0cmluZztcbiAgICBtdWx0aWxpbmVDYXJkU2VwYXJhdG9yOiBzdHJpbmc7XG4gICAgbXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yOiBzdHJpbmc7XG4gICAgZWRpdExhdGVyVGFnOiBzdHJpbmc7XG4gICAgLy8gbm90ZXNcbiAgICBlbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cDogYm9vbGVhbjtcbiAgICB0YWdzVG9SZXZpZXc6IHN0cmluZ1tdO1xuICAgIG5vdGVGb2xkZXJzVG9JZ25vcmU6IHN0cmluZ1tdO1xuICAgIG9wZW5SYW5kb21Ob3RlOiBib29sZWFuO1xuICAgIGF1dG9OZXh0Tm90ZTogYm9vbGVhbjtcbiAgICBkaXNhYmxlRmlsZU1lbnVSZXZpZXdPcHRpb25zOiBib29sZWFuO1xuICAgIG1heE5EYXlzTm90ZXNSZXZpZXdRdWV1ZTogbnVtYmVyO1xuICAgIC8vIFVJIHByZWZlcmVuY2VzXG4gICAgaW5pdGlhbGx5RXhwYW5kQWxsU3ViZGVja3NJblRyZWU6IGJvb2xlYW47XG4gICAgLy8gYWxnb3JpdGhtXG4gICAgYmFzZUVhc2U6IG51bWJlcjtcbiAgICBsYXBzZXNJbnRlcnZhbENoYW5nZTogbnVtYmVyO1xuICAgIGVhc3lCb251czogbnVtYmVyO1xuICAgIG1heGltdW1JbnRlcnZhbDogbnVtYmVyO1xuICAgIG1heExpbmtGYWN0b3I6IG51bWJlcjtcbiAgICAvLyBsb2dnaW5nXG4gICAgc2hvd0RlYnVnTWVzc2FnZXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFVFRJTkdTOiBTUlNldHRpbmdzID0ge1xuICAgIC8vIGZsYXNoY2FyZHNcbiAgICBmbGFzaGNhcmRFYXN5VGV4dDogdChcIkVBU1lcIiksXG4gICAgZmxhc2hjYXJkR29vZFRleHQ6IHQoXCJHT09EXCIpLFxuICAgIGZsYXNoY2FyZEhhcmRUZXh0OiB0KFwiSEFSRFwiKSxcbiAgICBmbGFzaGNhcmRUYWdzOiBbXCIjZmxhc2hjYXJkc1wiXSxcbiAgICBjb252ZXJ0Rm9sZGVyc1RvRGVja3M6IGZhbHNlLFxuICAgIGNhcmRDb21tZW50T25TYW1lTGluZTogZmFsc2UsXG4gICAgYnVyeVNpYmxpbmdDYXJkczogZmFsc2UsXG4gICAgc2hvd0NvbnRleHRJbkNhcmRzOiB0cnVlLFxuICAgIGZsYXNoY2FyZEhlaWdodFBlcmNlbnRhZ2U6IFBsYXRmb3JtLmlzTW9iaWxlID8gMTAwIDogODAsXG4gICAgZmxhc2hjYXJkV2lkdGhQZXJjZW50YWdlOiBQbGF0Zm9ybS5pc01vYmlsZSA/IDEwMCA6IDQwLFxuICAgIHJhbmRvbWl6ZUNhcmRPcmRlcjogdHJ1ZSxcbiAgICBjb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzOiB0cnVlLFxuICAgIGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzOiBmYWxzZSxcbiAgICBjb252ZXJ0Q3VybHlCcmFja2V0c1RvQ2xvemVzOiBmYWxzZSxcbiAgICBzaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcjogXCI6OlwiLFxuICAgIHNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3I6IFwiOjo6XCIsXG4gICAgbXVsdGlsaW5lQ2FyZFNlcGFyYXRvcjogXCI/XCIsXG4gICAgbXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yOiBcIj8/XCIsXG4gICAgZWRpdExhdGVyVGFnOiBcIiNlZGl0LWxhdGVyXCIsXG4gICAgLy8gbm90ZXNcbiAgICBlbmFibGVOb3RlUmV2aWV3UGFuZU9uU3RhcnR1cDogdHJ1ZSxcbiAgICB0YWdzVG9SZXZpZXc6IFtcIiNyZXZpZXdcIl0sXG4gICAgbm90ZUZvbGRlcnNUb0lnbm9yZTogW10sXG4gICAgb3BlblJhbmRvbU5vdGU6IGZhbHNlLFxuICAgIGF1dG9OZXh0Tm90ZTogZmFsc2UsXG4gICAgZGlzYWJsZUZpbGVNZW51UmV2aWV3T3B0aW9uczogZmFsc2UsXG4gICAgbWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlOiAzNjUsXG4gICAgLy8gVUkgc2V0dGluZ3NcbiAgICBpbml0aWFsbHlFeHBhbmRBbGxTdWJkZWNrc0luVHJlZTogZmFsc2UsXG4gICAgLy8gYWxnb3JpdGhtXG4gICAgYmFzZUVhc2U6IDI1MCxcbiAgICBsYXBzZXNJbnRlcnZhbENoYW5nZTogMC41LFxuICAgIGVhc3lCb251czogMS4zLFxuICAgIG1heGltdW1JbnRlcnZhbDogMzY1MjUsXG4gICAgbWF4TGlua0ZhY3RvcjogMS4wLFxuICAgIC8vIGxvZ2dpbmdcbiAgICBzaG93RGVidWdNZXNzYWdlczogZmFsc2UsXG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWdtZXllcnMvb2JzaWRpYW4ta2FuYmFuL2Jsb2IvbWFpbi9zcmMvU2V0dGluZ3MudHNcbmxldCBhcHBseURlYm91bmNlVGltZXIgPSAwO1xuZnVuY3Rpb24gYXBwbHlTZXR0aW5nc1VwZGF0ZShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChhcHBseURlYm91bmNlVGltZXIpO1xuICAgIGFwcGx5RGVib3VuY2VUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCA1MTIpO1xufVxuXG5leHBvcnQgY2xhc3MgU1JTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gICAgcHJpdmF0ZSBwbHVnaW46IFNSUGx1Z2luO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogU1JQbHVnaW4pIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVyID0gY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMVwiLCB7IHRleHQ6IGAke3QoXCJTRVRUSU5HU19IRUFERVJcIil9YCB9KTtcbiAgICAgICAgaGVhZGVyLmFkZENsYXNzKFwic3ItY2VudGVyZWRcIik7XG5cbiAgICAgICAgY29udGFpbmVyRWwuY3JlYXRlRGl2KCkuaW5uZXJIVE1MID0gdChcIkNIRUNLX1dJS0lcIiwge1xuICAgICAgICAgICAgd2lraV91cmw6IFwiaHR0cHM6Ly93d3cuc3RlcGhlbm13YW5naS5jb20vb2JzaWRpYW4tc3BhY2VkLXJlcGV0aXRpb24vXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkZPTERFUlNfVE9fSUdOT1JFXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkZPTERFUlNfVE9fSUdOT1JFX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5ub3RlRm9sZGVyc1RvSWdub3JlLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Mubm90ZUZvbGRlcnNUb0lnbm9yZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgvXFxuKy8pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHYpID0+IHYudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh2KSA9PiB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBgJHt0KFwiRkxBU0hDQVJEU1wiKX1gIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkZMQVNIQ0FSRF9UQUdTXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkZMQVNIQ0FSRF9UQUdTX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dEFyZWEoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRUYWdzLmpvaW4oXCIgXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFRhZ3MgPSB2YWx1ZS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkNPTlZFUlRfRk9MREVSU19UT19ERUNLU19ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0Rm9sZGVyc1RvRGVja3MpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuY29udmVydEZvbGRlcnNUb0RlY2tzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU1wiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jYXJkQ29tbWVudE9uU2FtZUxpbmUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuY2FyZENvbW1lbnRPblNhbWVMaW5lID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVlcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJ1cnlTaWJsaW5nQ2FyZHMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYnVyeVNpYmxpbmdDYXJkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiU0hPV19DQVJEX0NPTlRFWFRcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiU0hPV19DQVJEX0NPTlRFWFRfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Muc2hvd0NvbnRleHRJbkNhcmRzKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnNob3dDb250ZXh0SW5DYXJkcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQ0FSRF9NT0RBTF9IRUlHSFRfUEVSQ0VOVFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFNsaWRlcigoc2xpZGVyKSA9PlxuICAgICAgICAgICAgICAgIHNsaWRlclxuICAgICAgICAgICAgICAgICAgICAuc2V0TGltaXRzKDEwLCAxMDAsIDUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhlaWdodFBlcmNlbnRhZ2UpXG4gICAgICAgICAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkSGVpZ2h0UGVyY2VudGFnZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkSGVpZ2h0UGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRIZWlnaHRQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkNBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFNsaWRlcigoc2xpZGVyKSA9PlxuICAgICAgICAgICAgICAgIHNsaWRlclxuICAgICAgICAgICAgICAgICAgICAuc2V0TGltaXRzKDEwLCAxMDAsIDUpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFdpZHRoUGVyY2VudGFnZSlcbiAgICAgICAgICAgICAgICAgICAgLnNldER5bmFtaWNUb29sdGlwKClcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRXaWR0aFBlcmNlbnRhZ2UgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRUb29sdGlwKHQoXCJSRVNFVF9ERUZBVUxUXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZFdpZHRoUGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRXaWR0aFBlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldE5hbWUodChcIlJBTkRPTUlaRV9DQVJEX09SREVSXCIpKS5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnJhbmRvbWl6ZUNhcmRPcmRlcilcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MucmFuZG9taXplQ2FyZE9yZGVyID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0TmFtZSh0KFwiQ09OVkVSVF9ISUdITElHSFRTX1RPX0NMT1pFU1wiKSkuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbCkuc2V0TmFtZSh0KFwiQ09OVkVSVF9CT0xEX1RFWFRfVE9fQ0xPWkVTXCIpKS5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgIHRvZ2dsZVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzKVxuICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jb252ZXJ0Qm9sZFRleHRUb0Nsb3plcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVNcIikpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmNvbnZlcnRDdXJseUJyYWNrZXRzVG9DbG96ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuY29udmVydEN1cmx5QnJhY2tldHNUb0Nsb3plcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiSU5MSU5FX0NBUkRTX1NFUEFSQVRPUlwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaW5nbGVMaW5lQ2FyZFNlcGFyYXRvcilcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaW5nbGVMaW5lQ2FyZFNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Muc2luZ2xlTGluZUNhcmRTZXBhcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1Muc2luZ2xlTGluZUNhcmRTZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiSU5MSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUlwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaW5nbGVMaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRUb29sdGlwKHQoXCJSRVNFVF9ERUZBVUxUXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnNpbmdsZUxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1Muc2luZ2xlTGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkdcIikpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm11bHRpbGluZUNhcmRTZXBhcmF0b3IpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lQ2FyZFNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lQ2FyZFNlcGFyYXRvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5tdWx0aWxpbmVDYXJkU2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIk1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1JcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiRklYX1NFUEFSQVRPUlNfTUFOVUFMTFlfV0FSTklOR1wiKSlcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm11bHRpbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NFVFRJTkdTLm11bHRpbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJGTEFTSENBUkRfRUFTWV9MQUJFTFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGTEFTSENBUkRfRUFTWV9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEVhc3lUZXh0KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEVhc3lUZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRFYXN5VGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRFYXN5VGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJGTEFTSENBUkRfR09PRF9MQUJFTFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGTEFTSENBUkRfR09PRF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEdvb2RUZXh0KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEdvb2RUZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRHb29kVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRHb29kVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJGTEFTSENBUkRfSEFSRF9MQUJFTFwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJGTEFTSENBUkRfSEFSRF9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhhcmRUZXh0KS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXBwbHlTZXR0aW5nc1VwZGF0ZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhhcmRUZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRIYXJkVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5mbGFzaGNhcmRIYXJkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogYCR7dChcIk5PVEVTXCIpfWAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldE5hbWUodChcIlJFVklFV19QQU5FX09OX1NUQVJUVVBcIikpLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PlxuICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZW5hYmxlTm90ZVJldmlld1BhbmVPblN0YXJ0dXApXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmVuYWJsZU5vdGVSZXZpZXdQYW5lT25TdGFydHVwID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJUQUdTX1RPX1JFVklFV1wiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJUQUdTX1RPX1JFVklFV19ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHRBcmVhKCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MudGFnc1RvUmV2aWV3LmpvaW4oXCIgXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLnRhZ3NUb1JldmlldyA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJPUEVOX1JBTkRPTV9OT1RFXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIk9QRU5fUkFORE9NX05PVEVfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGUpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Mub3BlblJhbmRvbU5vdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKS5zZXROYW1lKHQoXCJBVVRPX05FWFRfTk9URVwiKSkuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5hdXRvTmV4dE5vdGUpLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYXV0b05leHROb3RlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT5cbiAgICAgICAgICAgICAgICB0b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZGlzYWJsZUZpbGVNZW51UmV2aWV3T3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5kaXNhYmxlRmlsZU1lbnVSZXZpZXdPcHRpb25zID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJNQVhfTl9EQVlTX1JFVklFV19RVUVVRVwiKSlcbiAgICAgICAgICAgIC5hZGRUZXh0KCh0ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlOiBudW1iZXIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1WYWx1ZSA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIk1JTl9PTkVfREFZXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhORGF5c05vdGVzUmV2aWV3UXVldWUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlID0gbnVtVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiVkFMSURfTlVNQkVSX1dBUk5JTkdcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhORGF5c05vdGVzUmV2aWV3UXVldWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiaDNcIiwgeyB0ZXh0OiBgJHt0KFwiVUlfUFJFRkVSRU5DRVNcIil9YCB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICAgICAgdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmluaXRpYWxseUV4cGFuZEFsbFN1YmRlY2tzSW5UcmVlKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmluaXRpYWxseUV4cGFuZEFsbFN1YmRlY2tzSW5UcmVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogYCR7dChcIkFMR09SSVRITVwiKX1gIH0pO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVEaXYoKS5pbm5lckhUTUwgPSB0KFwiQ0hFQ0tfQUxHT1JJVEhNX1dJS0lcIiwge1xuICAgICAgICAgICAgYWxnb191cmw6IFwiaHR0cHM6Ly93d3cuc3RlcGhlbm13YW5naS5jb20vb2JzaWRpYW4tc3BhY2VkLXJlcGV0aXRpb24vYWxnb3JpdGhtcy9cIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiQkFTRV9FQVNFXCIpKVxuICAgICAgICAgICAgLnNldERlc2ModChcIkJBU0VfRUFTRV9ERVNDXCIpKVxuICAgICAgICAgICAgLmFkZFRleHQoKHRleHQpID0+XG4gICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlLnRvU3RyaW5nKCkpLm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlOiBudW1iZXIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW1WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVmFsdWUgPCAxMzApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiQkFTRV9FQVNFX01JTl9XQVJOSU5HXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5iYXNlRWFzZSA9IG51bVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpY2UodChcIlZBTElEX05VTUJFUl9XQVJOSU5HXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYmFzZUVhc2UgPSBERUZBVUxUX1NFVFRJTkdTLmJhc2VFYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUodChcIkxBUFNFX0lOVEVSVkFMX0NIQU5HRVwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJMQVBTRV9JTlRFUlZBTF9DSEFOR0VfREVTQ1wiKSlcbiAgICAgICAgICAgIC5hZGRTbGlkZXIoKHNsaWRlcikgPT5cbiAgICAgICAgICAgICAgICBzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgLnNldExpbWl0cygxLCA5OSwgMSlcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubGFwc2VzSW50ZXJ2YWxDaGFuZ2UgKiAxMDApXG4gICAgICAgICAgICAgICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5sYXBzZXNJbnRlcnZhbENoYW5nZSA9IHZhbHVlIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubGFwc2VzSW50ZXJ2YWxDaGFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU0VUVElOR1MubGFwc2VzSW50ZXJ2YWxDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiRUFTWV9CT05VU1wiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJFQVNZX0JPTlVTX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSgodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5lYXN5Qm9udXMgKiAxMDApLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U2V0dGluZ3NVcGRhdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlOiBudW1iZXIgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUpIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1WYWx1ZSA8IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiRUFTWV9CT05VU19NSU5fV0FSTklOR1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmVhc3lCb251cyAqIDEwMCkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZWFzeUJvbnVzID0gbnVtVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiVkFMSURfTlVNQkVSX1dBUk5JTkdcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFkZEV4dHJhQnV0dG9uKChidXR0b24pID0+IHtcbiAgICAgICAgICAgICAgICBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnNldEljb24oXCJyZXNldFwiKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VG9vbHRpcCh0KFwiUkVTRVRfREVGQVVMVFwiKSlcbiAgICAgICAgICAgICAgICAgICAgLm9uQ2xpY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5lYXN5Qm9udXMgPSBERUZBVUxUX1NFVFRJTkdTLmVhc3lCb251cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKHQoXCJNQVhfSU5URVJWQUxcIikpXG4gICAgICAgICAgICAuc2V0RGVzYyh0KFwiTUFYX0lOVEVSVkFMX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkVGV4dCgodGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm1heGltdW1JbnRlcnZhbC50b1N0cmluZygpKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNldHRpbmdzVXBkYXRlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBudW1WYWx1ZTogbnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVmFsdWUgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKHQoXCJNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkdcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm1heGltdW1JbnRlcnZhbC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhpbXVtSW50ZXJ2YWwgPSBudW1WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm90aWNlKHQoXCJWQUxJRF9OVU1CRVJfV0FSTklOR1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWRkRXh0cmFCdXR0b24oKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAuc2V0SWNvbihcInJlc2V0XCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZXRUb29sdGlwKHQoXCJSRVNFVF9ERUZBVUxUXCIpKVxuICAgICAgICAgICAgICAgICAgICAub25DbGljayhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLm1heGltdW1JbnRlcnZhbCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TRVRUSU5HUy5tYXhpbXVtSW50ZXJ2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlUGx1Z2luRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSh0KFwiTUFYX0xJTktfQ09OVFJJQlwiKSlcbiAgICAgICAgICAgIC5zZXREZXNjKHQoXCJNQVhfTElOS19DT05UUklCX0RFU0NcIikpXG4gICAgICAgICAgICAuYWRkU2xpZGVyKChzbGlkZXIpID0+XG4gICAgICAgICAgICAgICAgc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIC5zZXRMaW1pdHMoMCwgMTAwLCAxKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5tYXhMaW5rRmFjdG9yICogMTAwKVxuICAgICAgICAgICAgICAgICAgICAuc2V0RHluYW1pY1Rvb2x0aXAoKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TGlua0ZhY3RvciA9IHZhbHVlIC8gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5hZGRFeHRyYUJ1dHRvbigoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICAgICAgLnNldFRvb2x0aXAodChcIlJFU0VUX0RFRkFVTFRcIikpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TGlua0ZhY3RvciA9IERFRkFVTFRfU0VUVElOR1MubWF4TGlua0ZhY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbChcImgzXCIsIHsgdGV4dDogYCR7dChcIkxPR0dJTkdcIil9YCB9KTtcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpLnNldE5hbWUodChcIkRJU1BMQVlfREVCVUdfSU5GT1wiKSkuYWRkVG9nZ2xlKCh0b2dnbGUpID0+XG4gICAgICAgICAgICB0b2dnbGUuc2V0VmFsdWUodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaG93RGVidWdNZXNzYWdlcykub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaG93RGVidWdNZXNzYWdlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICIvLyBodHRwczovL2dpdGh1Yi5jb20vbWdtZXllcnMvb2JzaWRpYW4ta2FuYmFuL2Jsb2IvOTMwMTRjMjUxMjUwN2ZkZTllYWZkMjQxZThkNDM2OGE4ZGZkZjg1My9zcmMvbGFuZy9oZWxwZXJzLnRzXG5cbmltcG9ydCB7IG1vbWVudCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IGFmIGZyb20gXCIuL2xvY2FsZS9hZlwiO1xuaW1wb3J0IGFyIGZyb20gXCIuL2xvY2FsZS9hclwiO1xuaW1wb3J0IGN6IGZyb20gXCIuL2xvY2FsZS9jelwiO1xuaW1wb3J0IGJuIGZyb20gXCIuL2xvY2FsZS9iblwiO1xuaW1wb3J0IGRhIGZyb20gXCIuL2xvY2FsZS9kYVwiO1xuaW1wb3J0IGRlIGZyb20gXCIuL2xvY2FsZS9kZVwiO1xuaW1wb3J0IGVuIGZyb20gXCIuL2xvY2FsZS9lblwiO1xuaW1wb3J0IGVuR0IgZnJvbSBcIi4vbG9jYWxlL2VuLWdiXCI7XG5pbXBvcnQgZXMgZnJvbSBcIi4vbG9jYWxlL2VzXCI7XG5pbXBvcnQgZnIgZnJvbSBcIi4vbG9jYWxlL2ZyXCI7XG5pbXBvcnQgaGkgZnJvbSBcIi4vbG9jYWxlL2hpXCI7XG5pbXBvcnQgaWQgZnJvbSBcIi4vbG9jYWxlL2lkXCI7XG5pbXBvcnQgaXQgZnJvbSBcIi4vbG9jYWxlL2l0XCI7XG5pbXBvcnQgamEgZnJvbSBcIi4vbG9jYWxlL2phXCI7XG5pbXBvcnQga28gZnJvbSBcIi4vbG9jYWxlL2tvXCI7XG5pbXBvcnQgbXIgZnJvbSBcIi4vbG9jYWxlL21yXCI7XG5pbXBvcnQgbmwgZnJvbSBcIi4vbG9jYWxlL25sXCI7XG5pbXBvcnQgbm8gZnJvbSBcIi4vbG9jYWxlL25vXCI7XG5pbXBvcnQgcGwgZnJvbSBcIi4vbG9jYWxlL3BsXCI7XG5pbXBvcnQgcHQgZnJvbSBcIi4vbG9jYWxlL3B0XCI7XG5pbXBvcnQgcHRCUiBmcm9tIFwiLi9sb2NhbGUvcHQtYnJcIjtcbmltcG9ydCBybyBmcm9tIFwiLi9sb2NhbGUvcm9cIjtcbmltcG9ydCBydSBmcm9tIFwiLi9sb2NhbGUvcnVcIjtcbmltcG9ydCB0YSBmcm9tIFwiLi9sb2NhbGUvdGFcIjtcbmltcG9ydCB0ZSBmcm9tIFwiLi9sb2NhbGUvdGVcIjtcbmltcG9ydCB0aCBmcm9tIFwiLi9sb2NhbGUvdGhcIjtcbmltcG9ydCB0ciBmcm9tIFwiLi9sb2NhbGUvdHJcIjtcbmltcG9ydCB1ayBmcm9tIFwiLi9sb2NhbGUvdWtcIjtcbmltcG9ydCB1ciBmcm9tIFwiLi9sb2NhbGUvdXJcIjtcbmltcG9ydCB2aSBmcm9tIFwiLi9sb2NhbGUvdmlcIjtcbmltcG9ydCB6aENOIGZyb20gXCIuL2xvY2FsZS96aC1jblwiO1xuaW1wb3J0IHpoVFcgZnJvbSBcIi4vbG9jYWxlL3poLXR3XCI7XG5cbmV4cG9ydCBjb25zdCBsb2NhbGVNYXA6IHsgW2s6IHN0cmluZ106IFBhcnRpYWw8dHlwZW9mIGVuPiB9ID0ge1xuICAgIGFmLFxuICAgIGFyLFxuICAgIGJuLFxuICAgIGNzOiBjeixcbiAgICBkYSxcbiAgICBkZSxcbiAgICBlbixcbiAgICBcImVuLWdiXCI6IGVuR0IsXG4gICAgZXMsXG4gICAgZnIsXG4gICAgaGksXG4gICAgaWQsXG4gICAgaXQsXG4gICAgamEsXG4gICAga28sXG4gICAgbXIsXG4gICAgbmwsXG4gICAgbm46IG5vLFxuICAgIHBsLFxuICAgIHB0LFxuICAgIFwicHQtYnJcIjogcHRCUixcbiAgICBybyxcbiAgICBydSxcbiAgICB0YSxcbiAgICB0ZSxcbiAgICB0aCxcbiAgICB0cixcbiAgICB1ayxcbiAgICB1cixcbiAgICB2aSxcbiAgICBcInpoLWNuXCI6IHpoQ04sXG4gICAgXCJ6aC10d1wiOiB6aFRXLFxufTtcblxuY29uc3QgbG9jYWxlID0gbG9jYWxlTWFwW21vbWVudC5sb2NhbGUoKV07XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTAxNTg0MC9cbmZ1bmN0aW9uIGludGVycG9sYXRlKHN0cjogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhwYXJhbXMpO1xuICAgIGNvbnN0IHZhbHM6IHVua25vd25bXSA9IE9iamVjdC52YWx1ZXMocGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLm5hbWVzLCBgcmV0dXJuIFxcYCR7c3RyfVxcYDtgKSguLi52YWxzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHQoc3RyOiBrZXlvZiB0eXBlb2YgZW4sIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBTUlMgZXJyb3I6IExvY2FsZSAke21vbWVudC5sb2NhbGUoKX0gbm90IGZvdW5kLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IChsb2NhbGUgJiYgbG9jYWxlW3N0cl0pIHx8IGVuW3N0cl07XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShyZXN1bHQsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICIvLyBBZnJpa2FhbnNcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRBXHUwNjI5XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjRGXHUwNjMyXHUwNjQ1XHUwNjRFXHUwNjI3XHUwNjJBXCIsXG4gICAgRFVFX0NBUkRTOiBcIlx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2NDVcdTA2NEZcdTA2MzNcdTA2MkFcdTA2MkRcdTA2NDJcdTA2MjlcIixcbiAgICBORVdfQ0FSRFM6IFwiXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyQ1x1MDYyRlx1MDY0QVx1MDYyRlx1MDYyOVwiLFxuICAgIFRPVEFMX0NBUkRTOiBcIlx1MDYyNVx1MDYyQ1x1MDY0NVx1MDYyN1x1MDY0NFx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkFcIixcbiAgICBCQUNLOiBcIlx1MDYzMVx1MDYyQ1x1MDY0OFx1MDYzOVwiLFxuICAgIFNLSVA6IFwiU2tpcFwiLFxuICAgIEVESVRfQ0FSRDogXCJcdTA2MkFcdTA2MzlcdTA2MkZcdTA2NEFcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5XCIsXG4gICAgUkVTRVRfQ0FSRF9QUk9HUkVTUzogXCJcdTA2MjVcdTA2MzlcdTA2MjdcdTA2MkZcdTA2MjkgXHUwNjJBXHUwNjM5XHUwNjRBXHUwNjRBXHUwNjQ2IFx1MDYyQVx1MDY0Mlx1MDYyRlx1MDY1MVx1MDY0Rlx1MDY0NVx1MDY1MiBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjlcIixcbiAgICBIQVJEOiBcIlx1MDYzNVx1MDYzOVx1MDYyOFwiLFxuICAgIEdPT0Q6IFwiXHUwNjJDXHUwNjRBXHUwNjJGXCIsXG4gICAgRUFTWTogXCJcdTA2MzNcdTA2NDdcdTA2NDRcIixcbiAgICBTSE9XX0FOU1dFUjogXCJcdTA2MjNcdTA2MzhcdTA2NDdcdTA2NTBcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjJDXHUwNjI3XHUwNjI4XHUwNjI5XCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCIuXHUwNjJBXHUwNjQ1XHUwNjUxXHUwNjRFXHUwNjJBIFx1MDYyNVx1MDYzOVx1MDYyN1x1MDYyRlx1MDYyOSBcdTA2MkFcdTA2MzlcdTA2NEFcdTA2NEFcdTA2NDYgXHUwNjJBXHUwNjQyXHUwNjJGXHUwNjUxXHUwNjRGXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOVwiLFxuICAgIFNBVkU6IFwiXHUwNjJEXHUwNjQxXHUwNjM4XCIsXG4gICAgQ0FOQ0VMOiBcIlx1MDYyNVx1MDY0NFx1MDYzQVx1MDYyN1x1MDYyMVwiLFxuICAgIE5PX0lOUFVUOiBcIi5cdTA2NDRcdTA2NDUgXHUwNjRBXHUwNjJBXHUwNjUwXHUwNjQ1IFx1MDYyQVx1MDY0Mlx1MDYyRlx1MDY0QVx1MDY0NSBcdTA2MjNcdTA2NEEgXHUwNjQ1XHUwNjRGXHUwNjJGXHUwNjJFXHUwNjQ0XHUwNjI3XHUwNjJBXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCI6XHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjQ3XHUwNjQ4XHUwNjQ0XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyRFx1MDYyN1x1MDY0NFx1MDY0QVx1MDYyOVwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIjpcdTA2MjdcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBIFx1MDYyN1x1MDY0NFx1MDYyRFx1MDYyN1x1MDY0NFx1MDY0QVwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiJHtub3RlUGF0aH0gOlx1MDYyQVx1MDY0NSBcdTA2MjVcdTA2NDZcdTA2MzRcdTA2MjdcdTA2MjRcdTA2NDdcdTA2MjcgXHUwNjQ1XHUwNjQ2XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiXHUwNjI3XHUwNjQxXHUwNjJBXHUwNjJEIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSBcdTA2NDRcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjlcIixcbiAgICBSRVZJRVdfQ0FSRFM6IFwiXHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVwiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2Mjk6IFx1MDYzM1x1MDY0N1x1MDY0NFwiLFxuICAgIFJFVklFV19HT09EX0ZJTEVfTUVOVTogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2Mjk6IFx1MDYyQ1x1MDY0QVx1MDYyRlwiLFxuICAgIFJFVklFV19IQVJEX0ZJTEVfTUVOVTogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2Mjk6IFx1MDYzNVx1MDYzOVx1MDYyOFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjQzXHUwNjQwIFx1MDYzM1x1MDY0N1x1MDY0NFx1MDYyOVwiLFxuICAgIFJFVklFV19OT1RFX0dPT0RfQ01EOiBcIlx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjQzXHUwNjQwIFx1MDYyQ1x1MDY0QVx1MDYyRlx1MDYyOVwiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIlx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjQzXHUwNjQwIFx1MDYzNVx1MDYzOVx1MDYyOFx1MDYyOVwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlx1MDYyRFx1MDYyRlx1MDYyRiBcdTA2MzFcdTA2NEZcdTA2MzJcdTA2NDVcdTA2NEVcdTA2MjkgXHUwNjQ0XHUwNjQ0XHUwNjJEXHUwNjM0XHUwNjMxXCIsXG4gICAgUkVWSUVXX0FMTF9DQVJEUzogXCJcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDY0NVx1MDY0NiBcdTA2MkNcdTA2NDVcdTA2NEFcdTA2MzkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBXCIsXG4gICAgUkVWSUVXX0NBUkRTX0lOX05PVEU6IFwiXHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSAgXHUwNjQ1XHUwNjQ2IFx1MDY0N1x1MDYzMFx1MDY0NyBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjlcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiXHUwNjIzXHUwNjJEXHUwNjM0XHUwNjMxIFx1MDYyQ1x1MDY0NVx1MDY0QVx1MDYzOSBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEgXHUwNjQ3XHUwNjMwXHUwNjQ3IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHUwNjM5XHUwNjMxXHUwNjM2IFx1MDYyN1x1MDY0NFx1MDYyNVx1MDYyRFx1MDYzNVx1MDYyN1x1MDYyNlx1MDY0QVx1MDYyN1x1MDYyQVwiLFxuICAgIFNUQVRVU19CQVI6IFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyQVx1MDYyRFx1MDY0Mlx1MDYyOSAke2R1ZUZsYXNoY2FyZHNDb3VudH0sXHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBICR7ZHVlTm90ZXNDb3VudH06XHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5XCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIiR7dH1tcyBcdTA2MjdcdTA2MzNcdTA2MkFcdTA2M0FcdTA2MzFcdTA2MjdcdTA2NDIgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjMyXHUwNjI3XHUwNjQ1XHUwNjQ2XHUwNjI5XCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCIuXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI5IFx1MDY0QVx1MDYyQVx1MDY0NSBcdTA2MkRcdTA2NDFcdTA2MzhcdTA2NDdcdTA2MjcgXHUwNjM2XHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYyQ1x1MDY0NFx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MzBcdTA2NEEgXHUwNjJBXHUwNjQ1IFx1MDYyQVx1MDYyQ1x1MDYyN1x1MDY0N1x1MDY0NFx1MDY0NyAoXHUwNjJBXHUwNjJEXHUwNjQyXHUwNjQyIFx1MDY0NVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MjVcdTA2MzlcdTA2MkZcdTA2MjdcdTA2MkZcdTA2MjdcdTA2MkEpXCIsXG4gICAgUExFQVNFX1RBR19OT1RFOiBcIi5cdTA2NEFcdTA2MzFcdTA2MkNcdTA2NDkgXHUwNjQ4XHUwNjM2XHUwNjM5IFx1MDY0OFx1MDYzM1x1MDY0NSBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI5IFx1MDYyOFx1MDYzNFx1MDY0M1x1MDY0NCBcdTA2NDVcdTA2NDZcdTA2MjdcdTA2MzNcdTA2MjggXHUwNjQ0XHUwNjQ0XHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5IChcdTA2NDFcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjI1XHUwNjM5XHUwNjJGXHUwNjI3XHUwNjJGXHUwNjI3XHUwNjJBKVwiLFxuICAgIFJFU1BPTlNFX1JFQ0VJVkVEOiBcIi5cdTA2MjdcdTA2MzNcdTA2MkFcdTA2NEZcdTA2NDRcdTA2NDVcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjI3XHUwNjMzXHUwNjJBXHUwNjJDXHUwNjI3XHUwNjI4XHUwNjI5XCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiJHtkZWNrTmFtZX0gXHUwNjQ0XHUwNjI3IFx1MDY0QVx1MDY0OFx1MDYyQ1x1MDYyRiBcdTA2MzFcdTA2NEZcdTA2MzJcdTA2NDVcdTA2NEVcdTA2MjlcIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlx1RDgzRFx1REUwNiBcdTA2NDRcdTA2NDJcdTA2MkYgXHUwNjJBXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYyOFx1MDYzNiBcdTA2MzlcdTA2NDRcdTA2NEFcdTA2NDNcdTA2NDUgXHUwNjJDXHUwNjQ1XHUwNjRBXHUwNjM5XHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYyMlx1MDY0NlwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCJcdTA2NEFcdTA2NDhcdTA2NDUvXHUwNjIzXHUwNjRBXHUwNjI3XHUwNjQ1ICR7aW50ZXJ2YWx9XCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiXHUwNjM0XHUwNjQ3XHUwNjMxL1x1MDYyM1x1MDYzNFx1MDY0N1x1MDYzMSAke2ludGVydmFsfVwiLFxuICAgIFlFQVJTX1NUUl9JVkw6IFwiXHUwNjMzXHUwNjQ2XHUwNjI5L1x1MDYzM1x1MDY0Nlx1MDY0OFx1MDYyN1x1MDYyQSAke2ludGVydmFsfVwiLFxuICAgIERBWVNfU1RSX0lWTF9NT0JJTEU6IFwiXHUwNjRBJHtpbnRlcnZhbH1cIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiXHUwNjM0JHtpbnRlcnZhbH1cIixcbiAgICBZRUFSU19TVFJfSVZMX01PQklMRTogXCJcdTA2MzMke2ludGVydmFsfVwiLFxuXG4gICAgLy8gc2V0dGluZ3MudHNcbiAgICBTRVRUSU5HU19IRUFERVI6IFwiU3BhY2VkIFJlcGV0aXRpb24gUGx1Z2luIC0gU2V0dGluZ3NcIixcbiAgICBDSEVDS19XSUtJOiAnLjxhIGhyZWY9XCIke3dpa2lfdXJsfVwiPndpa2k8L2E+IFx1MDY0NFx1MDY0NVx1MDYzMlx1MDY0QVx1MDYyRiBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM5XHUwNjQ0XHUwNjQ4XHUwNjQ1XHUwNjI3XHUwNjJBIFx1MDYwQyBcdTA2MkFcdTA2MkRcdTA2NDJcdTA2NDIgXHUwNjQ1XHUwNjQ2JyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdTA2NDVcdTA2MkNcdTA2NDRcdTA2MkZcdTA2MjdcdTA2MkEgXHUwNjQ0XHUwNjJBXHUwNjJDXHUwNjI3XHUwNjQ3XHUwNjQ0XHUwNjQ3XHUwNjI3XCIsXG4gICAgRk9MREVSU19UT19JR05PUkVfREVTQzpcbiAgICAgICAgXCJUZW1wbGF0ZXMgTWV0YS9TY3JpcHRzIDogXHUwNjIzXHUwNjJGXHUwNjJFXHUwNjQ0IFx1MDY0NVx1MDYzM1x1MDYyN1x1MDYzMVx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkNcdTA2NDRcdTA2MkYgXHUwNjQ1XHUwNjQxXHUwNjM1XHUwNjQ4XHUwNjQ0XHUwNjI5IFx1MDYyOFx1MDY0OFx1MDYyN1x1MDYzM1x1MDYzN1x1MDYyOSBcdTA2MzNcdTA2MzdcdTA2NDhcdTA2MzEgXHUwNjJDXHUwNjJGXHUwNjRBXHUwNjJGXHUwNjI5LFx1MDY0NVx1MDYyQlx1MDYyN1x1MDY0NFwiLFxuICAgIEZMQVNIQ0FSRFM6IFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBXCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiXHUwNjQ2XHUwNjM1IFx1MDYyN1x1MDY0NFx1MDYzMlx1MDYzMSBcdTA2MzNcdTA2NDdcdTA2NDRcIixcbiAgICBGTEFTSENBUkRfR09PRF9MQUJFTDogXCJcdTA2NDZcdTA2MzUgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjMxIFx1MDYyQ1x1MDY0QVx1MDYyRlwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIlx1MDY0Nlx1MDYzNSBcdTA2MjdcdTA2NDRcdTA2MzJcdTA2MzEgXHUwNjM1XHUwNjM5XHUwNjI4XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogJ1wiXHUwNjJBXHUwNjJFXHUwNjM1XHUwNjRBXHUwNjM1IFx1MDYyN1x1MDY0NFx1MDYyQVx1MDYzM1x1MDY0NVx1MDY0QVx1MDYyOSBcdTA2NDRcdTA2NDRcdTA2MzJcdTA2MzEgXCJcdTA2MzNcdTA2NDdcdTA2NDQnLFxuICAgIEZMQVNIQ0FSRF9HT09EX0RFU0M6ICdcIlx1MDYyQVx1MDYyRVx1MDYzNVx1MDY0QVx1MDYzNSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MzNcdTA2NDVcdTA2NEFcdTA2MjkgXHUwNjQ0XHUwNjQ0XHUwNjMyXHUwNjMxIFwiXHUwNjJDXHUwNjRBXHUwNjJGJyxcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiAnXCJcdTA2MkFcdTA2MkVcdTA2MzVcdTA2NEFcdTA2MzUgXHUwNjI3XHUwNjQ0XHUwNjJBXHUwNjMzXHUwNjQ1XHUwNjRBXHUwNjI5IFx1MDY0NFx1MDY0NFx1MDYzMlx1MDYzMSBcIlx1MDYzNVx1MDYzOVx1MDYyOCcsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiXHUwNjQ4XHUwNjRGXHUwNjMzXHUwNjQ4XHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6IFwiIzJcdTA2MjNcdTA2MkZcdTA2MkVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjQ4XHUwNjRGXHUwNjMzXHUwNjQ4XHUwNjQ1IFx1MDY0NVx1MDY0MVx1MDYzNVx1MDY0OFx1MDY0NFx1MDYyOSBcdTA2MjhcdTA2NDVcdTA2MzNcdTA2MjdcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjIzXHUwNjQ4IFx1MDYyM1x1MDYzM1x1MDYzN1x1MDYzMSBcdTA2MkNcdTA2MkZcdTA2NEFcdTA2MkZcdTA2MjkgXHUwNjBDIFx1MDYyM1x1MDY0QSBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEjIFx1MDYzMVx1MDYzMlx1MDY0NVx1MDYyOTMjIFx1MDYzMVx1MDYzMlx1MDY0NVx1MDYyOVwiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJcdTA2MkFcdTA2MkRcdTA2NDhcdTA2NEFcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJDXHUwNjQ0XHUwNjJGXHUwNjI3XHUwNjJBIFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2NDVcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjIzXHUwNjM1XHUwNjQ0XHUwNjRBXHUwNjI5IFx1MDY0OCBcdTA2NDVcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjM5XHUwNjRBXHUwNjI5XHUwNjFGXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiLlx1MDY0N1x1MDYzMFx1MDYyNyBcdTA2NDdcdTA2NDggXHUwNjI4XHUwNjJGXHUwNjRBXHUwNjQ0IFx1MDY0NFx1MDYyRVx1MDY0QVx1MDYyN1x1MDYzMSBcdTA2NDhcdTA2MzNcdTA2NDhcdTA2NDUgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5IFx1MDYyM1x1MDYzOVx1MDY0NFx1MDYyN1x1MDY0N1wiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTOiBcIlx1MDYyRFx1MDY0MVx1MDYzOCBcdTA2MkFcdTA2MzlcdTA2NDRcdTA2NEFcdTA2NDIgXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjJGXHUwNjQ4XHUwNjQ0XHUwNjI5IFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDZcdTA2NDFcdTA2MzMgXHUwNjI3XHUwNjQ0XHUwNjMzXHUwNjM3XHUwNjMxIFx1MDY0NVx1MDYyQlx1MDY0NCBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2MzdcdTA2MzEgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjJFXHUwNjRBXHUwNjMxIFx1MDY0NFx1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOSBcdTA2MUZcIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDOiBcIlx1MDY0NFx1MDYyNyBcdTA2MkFcdTA2NDNcdTA2MzNcdTA2MzEgXHUwNjJBXHUwNjQ2XHUwNjMzXHUwNjRBXHUwNjQyIFx1MDYyN1x1MDY0NFx1MDY0Mlx1MDYyN1x1MDYyNlx1MDY0NVx1MDYyOSBIVE1MIFx1MDYzM1x1MDY0QVx1MDYyNFx1MDYyRlx1MDY0QSBcdTA2MkFcdTA2MzRcdTA2M0FcdTA2NEFcdTA2NDQgXHUwNjQ3XHUwNjMwXHUwNjI3IFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2MkNcdTA2MzlcdTA2NDQgXHUwNjJBXHUwNjM5XHUwNjQ0XHUwNjRBXHUwNjQyXHUwNjI3XHUwNjJBXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZOiBcIlx1MDYyM1x1MDYyRVx1MDY0MVx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjM0XHUwNjQyXHUwNjRBXHUwNjQyXHUwNjI5IFx1MDYyRFx1MDYyQVx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2NEFcdTA2NDhcdTA2NDUgXHUwNjI3XHUwNjQ0XHUwNjJBXHUwNjI3XHUwNjQ0XHUwNjRBXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiY2xvemUgZGVsZXRpb25zIDogXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDYzNFx1MDY0Mlx1MDY0QVx1MDY0Mlx1MDYyOSBcdTA2NDdcdTA2NEEgXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyQVx1MDY0NSBcdTA2MjVcdTA2NDZcdTA2MzRcdTA2MjdcdTA2MjRcdTA2NDdcdTA2MjcgXHUwNjQ1XHUwNjQ2IFx1MDY0Nlx1MDY0MVx1MDYzMyBcdTA2NDZcdTA2MzUgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5IFx1MDY0M1x1MDY0MFwiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUOiBcIlx1MDYyNVx1MDYzOFx1MDY0N1x1MDYyN1x1MDYzMSBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NEFcdTA2MjdcdTA2NDIgXHUwNjQxXHUwNjRBIFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVx1MDYxRlwiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUX0RFU0M6IFwiaS5lLiBUaXRsZSA+IEhlYWRpbmcgMSA+IFN1YmhlYWRpbmcgPiAuLi4gPiBTdWJoZWFkaW5nXCIsXG4gICAgQ0FSRF9NT0RBTF9IRUlHSFRfUEVSQ0VOVDogXCJcdTA2NDZcdTA2MzNcdTA2MjhcdTA2MjkgXHUwNjI3XHUwNjMxXHUwNjJBXHUwNjQxXHUwNjI3XHUwNjM5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOVwiLFxuICAgIENBUkRfTU9EQUxfU0laRV9QRVJDRU5UX0RFU0M6XG4gICAgICAgIFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYzNlx1MDYyOFx1MDYzN1x1MDY0N1x1MDYyNyBcdTA2MzlcdTA2NDRcdTA2NDkgMTAwIFx1MDY2QSBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI3XHUwNjQ0XHUwNjQ3XHUwNjI3XHUwNjJBXHUwNjQxIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYyRFx1MDY0NVx1MDY0OFx1MDY0NCBcdTA2MjNcdTA2NDggXHUwNjI1XHUwNjMwXHUwNjI3IFx1MDY0M1x1MDYyN1x1MDY0NiBcdTA2NDRcdTA2MkZcdTA2NEFcdTA2NDMgXHUwNjM1XHUwNjQ4XHUwNjMxIFx1MDY0M1x1MDYyOFx1MDY0QVx1MDYzMVx1MDYyOSBcdTA2MkNcdTA2MkZcdTA2NEJcdTA2MjdcIixcbiAgICBSRVNFVF9ERUZBVUxUOiBcIlx1MDYyNVx1MDYzOVx1MDYyN1x1MDYyRlx1MDYyOSBcdTA2MkFcdTA2MzlcdTA2NEFcdTA2NEFcdTA2NDYgXHUwNjI1XHUwNjQ0XHUwNjQ5IFx1MDYyN1x1MDY0NFx1MDYyN1x1MDY0MVx1MDYyQVx1MDYzMVx1MDYyN1x1MDYzNlx1MDY0QVwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJcdTA2NDZcdTA2MzNcdTA2MjhcdTA2MjkgXHUwNjM5XHUwNjMxXHUwNjM2IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOVwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlx1MDYyQVx1MDYzMVx1MDYyQVx1MDY0QVx1MDYyOCBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjkgXHUwNjM5XHUwNjM0XHUwNjQ4XHUwNjI3XHUwNjI2XHUwNjRBIFx1MDYyM1x1MDYyQlx1MDY0Nlx1MDYyN1x1MDYyMSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjlcdTA2MUZcIixcbiAgICBESVNBQkxFX0NMT1pFX0NBUkRTOiBcIlx1MDYxRmNsb3plIFx1MDYyQVx1MDYzOVx1MDYzN1x1MDY0QVx1MDY0NCBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkFcIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIkNvbnZlcnQgPT1oaWdodGxpZ2h0cz09IHRvIGNsb3plcz9cIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiQ29udmVydCAqKmJvbGRlZCB0ZXh0KiogdG8gY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcIkNvbnZlcnQge3tjdXJseSBicmFja2V0c319IHRvIGNsb3plcz9cIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2NDVcdTA2NDYgXHUwNjIzXHUwNjJDXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzZcdTA2NDVcdTA2NDZcdTA2MjlcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOlxuICAgICAgICBcIlx1MDYzNlx1MDYzOSBcdTA2NDFcdTA2NEEgXHUwNjJEXHUwNjMzXHUwNjI3XHUwNjI4XHUwNjQzIFx1MDYyM1x1MDY0Nlx1MDY0NyBcdTA2MjhcdTA2MzlcdTA2MkYgXHUwNjJBXHUwNjNBXHUwNjRBXHUwNjRBXHUwNjMxIFx1MDY0N1x1MDYzMFx1MDYyNyBcdTA2MEMgXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYzOVx1MDY0NFx1MDY0QVx1MDY0MyBcdTA2MkFcdTA2MzlcdTA2MkZcdTA2NEFcdTA2NDQgXHUwNjIzXHUwNjRBIFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2NDRcdTA2MkZcdTA2NEFcdTA2NDMgXHUwNjI4XHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjM5XHUwNjQ0IFx1MDY0QVx1MDYyRlx1MDY0OFx1MDY0QVx1MDY0Qlx1MDYyN1wiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHUwNjQxXHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDY0NVx1MDY0NiBcdTA2MjNcdTA2MkNcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDY0M1x1MDYzM1x1MDY0QVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzZcdTA2NDVcdTA2NDZcdTA2MjlcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2NDVcdTA2NDYgXHUwNjIzXHUwNjJDXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkFcdTA2MzlcdTA2MkZcdTA2MkZcdTA2MjlcIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2NDVcdTA2NDYgXHUwNjIzXHUwNjJDXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2NDNcdTA2MzNcdTA2NEFcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjJBXHUwNjM5XHUwNjJGXHUwNjJGXHUwNjI5XCIsXG4gICAgTk9URVM6IFwiXHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBXCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJcdTA2MkFcdTA2NDVcdTA2NDNcdTA2NEFcdTA2NDYgXHUwNjJDXHUwNjMyXHUwNjIxIFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjdcdTA2MkEgXHUwNjM5XHUwNjQ2XHUwNjJGIFx1MDYyOFx1MDYyRlx1MDYyMSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MzRcdTA2M0FcdTA2NEFcdTA2NDRcIixcbiAgICBUQUdTX1RPX1JFVklFVzogXCJcdTA2NDhcdTA2MzNcdTA2NDhcdTA2NDUgXHUwNjQ0XHUwNjQ0XHUwNjQ1XHUwNjMxXHUwNjI3XHUwNjJDXHUwNjM5XHUwNjI5XCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzogXCIjXHUwNjIzXHUwNjJGXHUwNjJFXHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDY0OFx1MDYzM1x1MDY0OFx1MDY0NSBcdTA2NDVcdTA2NDFcdTA2MzVcdTA2NDhcdTA2NDRcdTA2MjkgXHUwNjI4XHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQxXHUwNjI3XHUwNjJBIFx1MDYyM1x1MDY0OCBcdTA2MkVcdTA2MzdcdTA2NDhcdTA2MzcgXHUwNjJDXHUwNjJGXHUwNjRBXHUwNjJGXHUwNjI5IFx1MDYwQyBcdTA2MjNcdTA2NEEgOiBcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkjIFx1MDY0OFx1MDYzM1x1MDY0NTIjIFx1MDY0OFx1MDYzM1x1MDY0NTNcIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFOiBcIlx1MDYyN1x1MDY0MVx1MDYyQVx1MDYyRCBcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjkgXHUwNjM5XHUwNjM0XHUwNjQ4XHUwNjI3XHUwNjI2XHUwNjRBXHUwNjI5IFx1MDY0NFx1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOVwiLFxuICAgIE9QRU5fUkFORE9NX05PVEVfREVTQzogXCIoUGFnZXJhbmspIFx1MDYzOVx1MDY0Nlx1MDYyRiBcdTA2MkFcdTA2MzlcdTA2MzdcdTA2NEFcdTA2NDQgXHUwNjQ3XHUwNjMwXHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYyRVx1MDY0QVx1MDYyN1x1MDYzMSBcdTA2MENcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjdcdTA2MkEgXHUwNjMzXHUwNjRBXHUwNjJBXHUwNjQ1IFx1MDYyQVx1MDYzMVx1MDYyQVx1MDY0QVx1MDYyOFx1MDY0Rlx1MDY0N1x1MDYyNyBcdTA2MkRcdTA2MzNcdTA2MjggXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjQ3XHUwNjQ1XHUwNjRBXHUwNjI5XCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiXHUwNjI3XHUwNjQxXHUwNjJBXHUwNjJEIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MjdcdTA2NDRcdTA2NEFcdTA2MjkgXHUwNjJBXHUwNjQ0XHUwNjQyXHUwNjI3XHUwNjI2XHUwNjRBXHUwNjRCXHUwNjI3IFx1MDYyOFx1MDYzOVx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjlcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OUzpcbiAgICAgICAgXCJcdTA2MkFcdTA2MzlcdTA2MzdcdTA2NEFcdTA2NDQgXHUwNjJFXHUwNjRBXHUwNjI3XHUwNjMxXHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOSBcdTA2NDFcdTA2NEEgXHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDY0MVx1MDYyN1x1MDYyQSBcdTA2MEMgXHUwNjIzXHUwNjRBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOTpcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDdcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjM1XHUwNjM5XHUwNjI4IFx1MDYyN1x1MDY0NFx1MDYyQ1x1MDY0QVx1MDYyRlwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TX0RFU0M6XG4gICAgICAgIFwiXHUwNjM5XHUwNjQ2XHUwNjJGIFx1MDYyQVx1MDYzQVx1MDY0QVx1MDY0QVx1MDYzMSBcdTA2NDdcdTA2MzBcdTA2MjcgXHUwNjI3XHUwNjQ0XHUwNjJFXHUwNjRBXHUwNjI3XHUwNjMxIE9ic2lkaWFuIFx1MDYyM1x1MDYzOVx1MDYyRiBcdTA2MkFcdTA2MzRcdTA2M0FcdTA2NEFcdTA2NDQgLCBjb21tYW5kIGhvdGtleXMuIFx1MDYyOFx1MDYzOVx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MkFcdTA2MzlcdTA2MzdcdTA2NEFcdTA2NDQgXHUwNjBDIFx1MDY0QVx1MDY0NVx1MDY0M1x1MDY0Nlx1MDY0MyBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkgXHUwNjI4XHUwNjI3XHUwNjMzXHUwNjJBXHUwNjJFXHUwNjJGXHUwNjI3XHUwNjQ1XCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDYzNVx1MDY0OSBcdTA2NDRcdTA2MzlcdTA2MkZcdTA2MkYgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjRBXHUwNjI3XHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDYyQVx1MDY0QSBcdTA2NEFcdTA2MkNcdTA2MjggXHUwNjM5XHUwNjMxXHUwNjM2XHUwNjQ3XHUwNjI3IFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2NDRcdTA2NDhcdTA2MkRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjRBXHUwNjQ1XHUwNjQ2XHUwNjQ5XCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NEFcdTA2NDNcdTA2NDhcdTA2NDYgXHUwNjM5XHUwNjJGXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0QVx1MDYyN1x1MDY0NSAxIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDJcdTA2NDRcIixcbiAgICBWQUxJRF9OVU1CRVJfV0FSTklORzogXCJcdTA2NEFcdTA2MzFcdTA2MkNcdTA2NDkgXHUwNjJBXHUwNjQyXHUwNjJGXHUwNjRBXHUwNjQ1IFx1MDYzMVx1MDY0Mlx1MDY0NSBcdTA2MzVcdTA2MjdcdTA2NDRcdTA2MkRcIixcbiAgICBVSV9QUkVGRVJFTkNFUzogXCJcdTA2MkFcdTA2NDFcdTA2MzZcdTA2NEFcdTA2NDRcdTA2MjdcdTA2MkEgXHUwNjQ4XHUwNjI3XHUwNjJDXHUwNjQ3XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyQVx1MDYyRVx1MDYyRlx1MDY0NVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTpcbiAgICAgICAgXCJcdTA2NEFcdTA2MkNcdTA2MjggXHUwNjIzXHUwNjQ2IFx1MDY0QVx1MDY0M1x1MDY0OFx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MzYgXHUwNjI3XHUwNjQ0XHUwNjM0XHUwNjJDXHUwNjMxXHUwNjRBIFx1MDY0NFx1MDY0NFx1MDYzMVx1MDY0Rlx1MDYzMlx1MDY0NSBcdTA2NDVcdTA2NDhcdTA2MzNcdTA2MzkgXHUwNjI4XHUwNjJEXHUwNjRBXHUwNjJCIFx1MDYyQVx1MDYzN1x1MDY0N1x1MDYzMSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjM5XHUwNjRBXHUwNjI5IFx1MDY0M1x1MDY0NFx1MDY0N1x1MDYyN1wiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRV9ERVNDOlxuICAgICAgICBcIiBcdTA2MzlcdTA2MzdcdTA2NDQgXHUwNjQ3XHUwNjMwXHUwNjI3IFx1MDYyN1x1MDY0NFx1MDYyRVx1MDY0QVx1MDYyN1x1MDYzMSBcdTA2NDRcdTA2MzdcdTA2NEEgXHUwNjI3XHUwNjQ0XHUwNjMxXHUwNjRGXHUwNjMyXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYyQVx1MDYyRlx1MDYyN1x1MDYyRVx1MDY0NFx1MDYyOSBcdTA2NDFcdTA2NEEgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyOSAsIFx1MDY0NVx1MDY0MVx1MDY0QVx1MDYyRiBcdTA2MjVcdTA2MzBcdTA2MjcgXHUwNjQzXHUwNjI3XHUwNjQ2IFx1MDY0NFx1MDYyRlx1MDY0QVx1MDY0MyBcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkEgXHUwNjJBXHUwNjQ2XHUwNjJBXHUwNjQ1XHUwNjRBIFx1MDYyNVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MkZcdTA2NEFcdTA2MkYgXHUwNjQ1XHUwNjQ2IFx1MDYyN1x1MDY0NFx1MDYzMVx1MDY0Rlx1MDYzMlx1MDY0NSBcdTA2NDFcdTA2NEEgXHUwNjQ2XHUwNjQxXHUwNjMzIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDY0NFx1MDY0MVwiLFxuICAgIEFMR09SSVRITTogXCJcdTA2MkVcdTA2NDhcdTA2MjdcdTA2MzFcdTA2MzJcdTA2NDVcdTA2NEFcdTA2MjlcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTpcbiAgICAgICAgJzxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPmFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbjwvYT4gOlx1MDY0NFx1MDY0NVx1MDYzMlx1MDY0QVx1MDYyRiBcdTA2NDVcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjM5XHUwNjQ0XHUwNjQ4XHUwNjQ1XHUwNjI3XHUwNjJBIFx1MDYyQVx1MDYyRFx1MDY0Mlx1MDY0MiBcdTA2NDVcdTA2NDYnLFxuICAgIEJBU0VfRUFTRTogXCJcdTA2MzNcdTA2NDdcdTA2NDhcdTA2NDRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjQyXHUwNjI3XHUwNjM5XHUwNjJGXHUwNjI5XCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwiXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDYyRlx1MDY0Nlx1MDY0OSA9IDEzMCBcdTA2MEMgXHUwNjQ4XHUwNjRBXHUwNjQxXHUwNjM2XHUwNjQ0IFx1MDYyRFx1MDY0OFx1MDYyN1x1MDY0NFx1MDY0QSAyNTAuXCIsXG4gICAgQkFTRV9FQVNFX01JTl9XQVJOSU5HOiBcIlx1MDY0QVx1MDYyQ1x1MDYyOCBcdTA2MjNcdTA2NDYgXHUwNjJBXHUwNjQzXHUwNjQ4XHUwNjQ2IFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDJcdTA2MjdcdTA2MzlcdTA2MkZcdTA2MjkgMTMwIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDJcdTA2NDQuXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFOiBcIlx1MDYyN1x1MDY0NFx1MDY0MVx1MDYyN1x1MDYzNVx1MDY0NCBcdTA2MjdcdTA2NDRcdTA2MzJcdTA2NDVcdTA2NDZcdTA2NEEgXHUwNjRBXHUwNjJBXHUwNjNBXHUwNjRBXHUwNjMxIFx1MDYzOVx1MDY0Nlx1MDYyRiBcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjkgXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5L1x1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSBcdTA2MzVcdTA2MzlcdTA2MjhcdTA2MjlcIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0VfREVTQzogXCJuZXdJbnRlcnZhbCA9IG9sZEludGVydmFsICogaW50ZXJ2YWxDaGFuZ2UgLyAxMDAuXCIsXG4gICAgRUFTWV9CT05VUzogXCJcdTA2NDVcdTA2NDNcdTA2MjdcdTA2NDFcdTA2MjNcdTA2MjkgXHUwNjMzXHUwNjQ3XHUwNjQ0XHUwNjI5XCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIlx1MDYyQVx1MDYyQVx1MDY0QVx1MDYyRCBcdTA2NDRcdTA2NDMgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQzXHUwNjI3XHUwNjQxXHUwNjIzXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0NFx1MDYyOSBcdTA2MzZcdTA2MjhcdTA2MzcgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjQyIFx1MDY0MVx1MDY0QSBcdTA2MjdcdTA2NDRcdTA2NDFcdTA2NDhcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBXHUwNjI5IFx1MDYyOFx1MDY0QVx1MDY0NiBcdTA2MjdcdTA2NDRcdTA2MzFcdTA2MkYgXHUwNjI3XHUwNjQ0XHUwNjJDXHUwNjRBXHUwNjJGIFx1MDY0OFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0NCBcdTA2MzlcdTA2NDRcdTA2NDkgXHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI5L1x1MDY0NVx1MDY0NFx1MDYyN1x1MDYyRFx1MDYzOFx1MDYyOSAoXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDYyRlx1MDY0Nlx1MDY0OSA9IDEwMCBcdTA2NkEpLlwiLFxuICAgIEVBU1lfQk9OVVNfTUlOX1dBUk5JTkc6IFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2MkFcdTA2NDNcdTA2NDhcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjQ1XHUwNjQzXHUwNjI3XHUwNjQxXHUwNjIzXHUwNjI5IFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0NFx1MDYyOSAxMDAgXHUwNjM5XHUwNjQ0XHUwNjQ5IFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDY0NC5cIixcbiAgICBNQVhfSU5URVJWQUw6IFwiXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDYzNVx1MDY0OSBcdTA2NDRcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDRcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJcdTA2NEFcdTA2MkFcdTA2NEFcdTA2MkQgXHUwNjQ0XHUwNjQzIFx1MDY0OFx1MDYzNlx1MDYzOSBcdTA2MkRcdTA2MkYgXHUwNjIzXHUwNjM5XHUwNjQ0XHUwNjQ5ICBcdTA2NDRcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBIChcdTA2MjdcdTA2NDFcdTA2MkFcdTA2MzFcdTA2MjdcdTA2MzZcdTA2NEEgPSAxMDAgXHUwNjM5XHUwNjI3XHUwNjQ1KS5cIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiXHUwNjRBXHUwNjJDXHUwNjI4IFx1MDYyM1x1MDY0NiBcdTA2NEFcdTA2NDNcdTA2NDhcdTA2NDYgXHUwNjI3XHUwNjQ0XHUwNjJEXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyM1x1MDY0Mlx1MDYzNVx1MDY0OSBcdTA2NDRcdTA2NDRcdTA2NDFcdTA2MjdcdTA2MzVcdTA2NDQgXHUwNjI3XHUwNjQ0XHUwNjMyXHUwNjQ1XHUwNjQ2XHUwNjRBIFx1MDY0NFx1MDY0NVx1MDYyRlx1MDYyOSBcdTA2NEFcdTA2NDhcdTA2NDUgXHUwNjQ4XHUwNjI3XHUwNjJEXHUwNjJGIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2MjdcdTA2NDRcdTA2MjNcdTA2NDJcdTA2NDQuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJcdTA2MjNcdTA2NDJcdTA2MzVcdTA2NDkgXHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQ3XHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDYzMVx1MDYyQVx1MDYyOFx1MDYyN1x1MDYzN1wiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzogXCJcdTA2MjNcdTA2NDJcdTA2MzVcdTA2NDkgXHUwNjQ1XHUwNjMzXHUwNjI3XHUwNjQ3XHUwNjQ1XHUwNjI5IFx1MDY0NFx1MDY0NFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MkNcdTA2MkRcdTA2MjkgXHUwNjQ0XHUwNjQ0XHUwNjQ1XHUwNjQ0XHUwNjI3XHUwNjJEXHUwNjM4XHUwNjI3XHUwNjJBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyQVx1MDYyOFx1MDYzN1x1MDYyOSBcdTA2MjhcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDdcdTA2NDhcdTA2NDRcdTA2MjkgXHUwNjI3XHUwNjQ0XHUwNjIzXHUwNjQ4XHUwNjQ0XHUwNjRBXHUwNjI5LlwiLFxuICAgIExPR0dJTkc6IFwiXHUwNjJBXHUwNjMzXHUwNjJDXHUwNjRBXHUwNjQ0XCIsXG4gICAgRElTUExBWV9ERUJVR19JTkZPOiBcIlx1MDYzOVx1MDYzMVx1MDYzNiBcdTA2NDVcdTA2MzlcdTA2NDRcdTA2NDhcdTA2NDVcdTA2MjdcdTA2MkEgXHUwNjI3XHUwNjQ0XHUwNjJBXHUwNjM1XHUwNjJEXHUwNjRBXHUwNjJEIFx1MDYzOVx1MDY0NFx1MDY0OSBcdTA2NDhcdTA2MkRcdTA2MkZcdTA2MjkgXHUwNjJBXHUwNjJEXHUwNjQzXHUwNjQ1IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzN1x1MDY0OFx1MDYzMVx1MDYxRlwiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdTA2NDVcdTA2NDRcdTA2MjdcdTA2MkRcdTA2MzhcdTA2MjdcdTA2MkEgXHUwNjQyXHUwNjI3XHUwNjI2XHUwNjQ1XHUwNjI5IFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyOVwiLFxuICAgIENMT1NFOiBcIlx1MDYyM1x1MDYzQVx1MDY0NFx1MDY0MlwiLFxuICAgIE5FVzogXCJcdTA2MkNcdTA2MkZcdTA2NEFcdTA2MkZcIixcbiAgICBZRVNURVJEQVk6IFwiXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjI3XHUwNjMxXHUwNjJEXHUwNjI5XCIsXG4gICAgVE9EQVk6IFwiXHUwNjI3XHUwNjQ0XHUwNjRBXHUwNjQ4XHUwNjQ1XCIsXG4gICAgVE9NT1JST1c6IFwiXHUwNjI3XHUwNjQ0XHUwNjNBXHUwNjJGXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJcdTA2MjVcdTA2MkRcdTA2MzVcdTA2MjdcdTA2MjZcdTA2NEFcdTA2MjdcdTA2MkFcIixcbiAgICBNT05USDogXCJcdTA2MzRcdTA2NDdcdTA2MzFcIixcbiAgICBRVUFSVEVSOiBcIlx1MDYzMVx1MDYyOFx1MDYzOSBcdTA2MjdcdTA2NDRcdTA2MzNcdTA2NDZcdTA2MjlcIixcbiAgICBZRUFSOiBcIlx1MDYzM1x1MDY0Nlx1MDYyOVwiLFxuICAgIExJRkVUSU1FOiBcIlwiLFxuICAgIEZPUkVDQVNUOiBcIlwiLFxuICAgIEZPUkVDQVNUX0RFU0M6IFwiXHUwNjM5XHUwNjJGXHUwNjJGIFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzNcdTA2MkFcdTA2MkRcdTA2NDJcdTA2MjkgXHUwNjQxXHUwNjRBIFx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzM1x1MDYyQVx1MDY0Mlx1MDYyOFx1MDY0NFwiLFxuICAgIFNDSEVEVUxFRDogXCJcdTA2MjdcdTA2NDRcdTA2NDVcdTA2NDJcdTA2MzFcdTA2MzFcIixcbiAgICBEQVlTOiBcIlx1MDYyM1x1MDY0QVx1MDYyN1x1MDY0NVwiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJcdTA2MzlcdTA2MkZcdTA2MkYgXHUwNjI3XHUwNjQ0XHUwNjI4XHUwNjM3XHUwNjI3XHUwNjQyXHUwNjI3XHUwNjJBXCIsXG4gICAgUkVWSUVXU19QRVJfREFZOiBcIlx1MDYyN1x1MDY0NFx1MDY0NVx1MDYzMVx1MDYyN1x1MDYyQ1x1MDYzOVx1MDYyN1x1MDYyQS9cdTA2MjdcdTA2NDRcdTA2NEFcdTA2NDhcdTA2NDUgJHthdmd9IDpcdTA2NDVcdTA2MkFcdTA2NDhcdTA2MzNcdTA2MzdcIixcbiAgICBJTlRFUlZBTFM6IFwiXHUwNjQxXHUwNjQ4XHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDYzMlx1MDY0NVx1MDY0Nlx1MDY0QVx1MDYyOVwiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIlx1MDYyN1x1MDY0NFx1MDYyQVx1MDYyM1x1MDYyRVx1MDY0QVx1MDYzMSBcdTA2MkRcdTA2MkFcdTA2NDkgXHUwNjRBXHUwNjJBXHUwNjQ1IFx1MDYzOVx1MDYzMVx1MDYzNiBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MzFcdTA2MjdcdTA2MkNcdTA2MzlcdTA2MjdcdTA2MkEgXHUwNjQ1XHUwNjMxXHUwNjI5IFx1MDYyM1x1MDYyRVx1MDYzMVx1MDY0OVwiLFxuICAgIENPVU5UOiBcIlx1MDYzOVx1MDYyRlx1MDYyRlwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIiR7bG9uZ2VzdH0gOiBcdTA2MjNcdTA2MzdcdTA2NDhcdTA2NDQgXHUwNjQxXHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDYzMlx1MDY0NVx1MDY0Nlx1MDY0QSAsJHthdmd9IDpcdTA2NDVcdTA2MkFcdTA2NDhcdTA2MzNcdTA2MzcgXHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjI3XHUwNjM1XHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYzMlx1MDY0NVx1MDY0Nlx1MDY0QVwiLFxuICAgIEVBU0VTOiBcIlx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOVwiLFxuICAgIEVBU0VTX1NVTU1BUlk6IFwiJHthdmdFYXNlfSA6XHUwNjQ1XHUwNjJBXHUwNjQ4XHUwNjMzXHUwNjM3IFx1MDYyN1x1MDY0NFx1MDYzM1x1MDY0N1x1MDY0OFx1MDY0NFx1MDYyOVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHUwNjIzXHUwNjQ2XHUwNjQ4XHUwNjI3XHUwNjM5IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQVwiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdTA2NDhcdTA2NDdcdTA2MzBcdTA2MjcgXHUwNjRBXHUwNjM0XHUwNjQ1XHUwNjQ0IFx1MDYyN1x1MDY0NFx1MDYyOFx1MDYzN1x1MDYyN1x1MDY0Mlx1MDYyN1x1MDYyQSBcdTA2MjdcdTA2NDRcdTA2NDVcdTA2MkVcdTA2NDFcdTA2NEFcdTA2MjkgXHUwNjQzXHUwNjMwXHUwNjQ0XHUwNjQzIFx1MDYwQyBcdTA2MjVcdTA2NDYgXHUwNjQ4XHUwNjJDXHUwNjJGXHUwNjJBXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJcdTA2MkNcdTA2MkZcdTA2NEFcdTA2MkZcdTA2MjlcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiXHUwNjM1XHUwNjNBXHUwNjRBXHUwNjMxXHUwNjI5XCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJcdTA2NDZcdTA2MjdcdTA2MzZcdTA2MkNcdTA2MjlcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiICR7dG90YWxDYXJkc0NvdW50fSA6XHUwNjI1XHUwNjJDXHUwNjQ1XHUwNjI3XHUwNjQ0XHUwNjRBIFx1MDYzOVx1MDYyRlx1MDYyRiBcdTA2MjdcdTA2NDRcdTA2MjhcdTA2MzdcdTA2MjdcdTA2NDJcdTA2MjdcdTA2MkFcIixcbn07XG4iLCAiLy8gXHUwMTBEZVx1MDE2MXRpbmFcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGZsYXNoY2FyZC1tb2RhbC50c3hcbiAgICBERUNLUzogXCJCYWxcdTAwRURcdTAxMERreVwiLFxuICAgIERVRV9DQVJEUzogXCJLYXJ0aVx1MDEwRGt5IHBvIHRlcm1cdTAwRURudVwiLFxuICAgIE5FV19DQVJEUzogXCJOb3ZcdTAwRTkga2FydGlcdTAxMERreVwiLFxuICAgIFRPVEFMX0NBUkRTOiBcIkthcnRpXHUwMTBEZWsgY2Vsa2VtXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiVnludWxvdmF0IHBva3JvayBrYXJ0aVx1MDEwRGt5XCIsXG4gICAgSEFSRDogXCJUZVx1MDE3RWtcdTAwRTlcIixcbiAgICBHT09EOiBcIkRvYnJcdTAwRTlcIixcbiAgICBFQVNZOiBcIkplZG5vZHVjaFx1MDBFOVwiLFxuICAgIFNIT1dfQU5TV0VSOiBcIlVrXHUwMEUxemF0IG9kcG92XHUwMTFCXHUwMTBGXCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCJQb2tyb2sga2FydGlcdTAxMERreSBieWwgdnludWxvdlx1MDBFMW4uXCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIk90ZXZcdTAxNTlcdTAwRUR0IHBvem5cdTAwRTFta3UgayByZXZpemlcIixcbiAgICBSRVZJRVdfQ0FSRFM6IFwiUG96blx1MDBFMW1layBrIHJldml6aVwiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJSZXZpemU6IEplZG5vZHVjaFx1MDBFOVwiLFxuICAgIFJFVklFV19HT09EX0ZJTEVfTUVOVTogXCJSZXZpemU6IERvYnJcdTAwRTlcIixcbiAgICBSRVZJRVdfSEFSRF9GSUxFX01FTlU6IFwiUmV2aXplOiBUXHUwMTFCXHUwMTdFa1x1MDBFOVwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIk96bmFcdTAxMERpdCBwb3puXHUwMEUxbWt1IGpha28gamVkbm9kdWNob3VcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJPem5hXHUwMTBEaXQgcG96blx1MDBFMW1rdSBqYWtvIGRvYnJvdVwiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIk96bmFcdTAxMERpdCBwb3puXHUwMEUxbWt1IGpha28gdGVcdTAxN0Vrb3VcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlJldmlkb3ZhdCBrYXJ0aVx1MDEwRGt5IHZlIHZcdTAxNjFlY2ggcG96blx1MDBFMW1rXHUwMEUxY2hcIixcbiAgICBDUkFNX0FMTF9DQVJEUzogXCJTZWxlY3QgYSBkZWNrIHRvIGNyYW1cIixcbiAgICBSRVZJRVdfQ0FSRFNfSU5fTk9URTogXCJSZXZpZG92YXQga2FydGlcdTAxMERreSB2IHRcdTAwRTl0byBwb3puXHUwMEUxbWNlLlwiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJDcmFtIGthcnRpXHUwMTBEa3kgdiB0XHUwMEU5dG8gcG96blx1MDBFMW1jZS5cIixcbiAgICBWSUVXX1NUQVRTOiBcIlVrXHUwMEUxemF0IHN0YXRpc3Rpa3lcIixcbiAgICBTVEFUVVNfQkFSOiBcIlJldml6ZTogJHtkdWVOb3Rlc0NvdW50fSBwb3puXHUwMEUxbWVrLCAke2R1ZUZsYXNoY2FyZHNDb3VudH0ga2FydGlcdTAxMERlayBwbyB0ZXJtXHUwMEVEbnVcIixcbiAgICBTWU5DX1RJTUVfVEFLRU46IFwiU3luY2hyb25pemFjZSB0cnZhbGEgJHt0fW1zXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJQb3puXHUwMEUxbWthIGplIHVsb1x1MDE3RWVuYSB2IGlnbm9yb3Zhblx1MDBFOSBzbG9cdTAxN0VjZSAoemtvbnRyb2x1anRlIG5hc3RhdmVuXHUwMEVEKS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiUHJvc1x1MDBFRG0gb3puYVx1MDEwRG5lIHBvem5cdTAwRTFta3Ugb2Rwb3ZcdTAwRURkYWpcdTAwRURjXHUwMEVEbSB0YWdlbSBwcm8gcmV2aXppICh2IG5hc3RhdmVuXHUwMEVEKS5cIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJPZHBvdlx1MDExQlx1MDEwRiBwXHUwMTU5aWphdGEuXCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiTmVleGlzdHVqZSBcdTAxN0VcdTAwRTFkblx1MDBGRCBiYWxcdTAwRURcdTAxMERlayBwcm8gJHtkZWNrTmFtZX1cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlZcdTAxNjFlIHpyZXZpZG92XHUwMEUxbm9cIixcblxuICAgIC8vIHNjaGVkdWxpbmcudHNcbiAgICBEQVlTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gZGVuL2RuXHUwMEVEXCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gbVx1MDExQnNcdTAwRURjKFx1MDE2RilcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IHJvayhcdTAxNkYpXCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfWRcIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1tXCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1yXCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBQbHVnaW4gLSBOYXN0YXZlblx1MDBFRFwiLFxuICAgIENIRUNLX1dJS0k6ICdQcm8gdlx1MDBFRGNlIGluZm9ybWFjXHUwMEVEIGpkXHUwMTFCdGUgbmEgPGEgaHJlZj1cIiR7d2lraV91cmx9XCI+d2lraTwvYT4uJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJJZ25vcm92YW5cdTAwRTkgc2xvXHUwMTdFa3lcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICBcIlphZGVqdGUgY2VzdHkga2Ugc2xvXHUwMTdFa1x1MDBFMW0gb2RkXHUwMTFCbGVuXHUwMEU5IG9kXHUwMTU5XHUwMEUxZGtvdlx1MDBFMW5cdTAwRURtIG5hcFx1MDE1OVx1MDBFRGthZC4gXHUwMTYwYWJsb255IE1ldGEvU2NyaXB0c1wiLFxuICAgIEZMQVNIQ0FSRFM6IFwiS2FydGlcdTAxMERreVwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIkVhc3kgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfR09PRF9MQUJFTDogXCJHb29kIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0hBUkRfTEFCRUw6IFwiSGFyZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJFYXN5XCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfR09PRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiR29vZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0hBUkRfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkhhcmRcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIlRhZyBwcm8ga2FydGlcdTAxMERreVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiWmFkZXRlIHRhZ3kgb29kXHUwMTFCbGVuXHUwMEU5IG1lemVyb3UgbmVibyBvZFx1MDE1OVx1MDBFMWRrb3ZcdTAwRTFuXHUwMEVEbSBuYXBcdTAxNTlcdTAwRURrbGFkLiAja2FydGlcdTAxMERreSAjYmFsXHUwMEVEXHUwMTBEa2UyICNiYWxcdTAwRURcdTAxMERlazMuXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTOiBcIlBcdTAxNTlldlx1MDBFOXN0IHNsb1x1MDE3RWt5IG5hIGJhbFx1MDBFRFx1MDEwRGt5IGEgcG9kYmFsXHUwMEVEXHUwMTBEa3k/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiVG90byBqZSBhbHRlcm5hdGl2YSBrIHRhZ1x1MDE2Rm0ga2FydGlcdTAxMERlayB2aXogbmFzdGF2ZW5cdTAwRUQgdlx1MDBGRFx1MDE2MWUuXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6XG4gICAgICAgIFwiVWxvXHUwMTdFaXQgcGxcdTAwRTFub3ZhY1x1MDBFRCBrb21lbnRcdTAwRTFcdTAxNTkgbmEgc3Rlam5cdTAwRkQgXHUwMTU5XHUwMEUxZGVrIGpha28gcG9zbGVkblx1MDBFRCBwb2xvXHUwMTdFa2Ega2FydGlcdTAxMERreT9cIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDOlxuICAgICAgICBcIlphcG51dFx1MDBFRCB0XHUwMEU5dG8gdm9sYnkgenBcdTAxNkZzb2JcdTAwRUQsIFx1MDE3RWUgSFRNTCBrb21lbnRcdTAwRTFcdTAxNTllIG5lYnVkb3Ugcm96Ylx1MDBFRGpldCBmb3JtXHUwMEUxdG92XHUwMEUxblx1MDBFRCBsaXN0XHUwMTZGLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJPZGxvXHUwMTdFaXQgcFx1MDE1OVx1MDBFRGJ1em5cdTAwRTkga2FydGlcdTAxMERreSBuYSBkYWxcdTAxNjFcdTAwRUQgZGVuP1wiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOlxuICAgICAgICBcIlBcdTAxNTlcdTAwRURidXpuXHUwMEU5IGthcnRpXHUwMTBEa3kganNvdSBrYXJ0aVx1MDEwRGt5IGdlbmVyb3Zhblx1MDBFOSB6IHRleHR1IHN0ZWpuXHUwMEU5IHBvem5cdTAwRTFta3kgbmFwXHUwMTU5XHUwMEVEa2xhZCBjbG96ZSBzbWF6XHUwMEUxblx1MDBFRFwiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUOiBcIlVrXHUwMEUxemF0IGtvbnRleHQgdiBrYXJ0aVx1MDEwRGNlP1wiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUX0RFU0M6IFwibmFwXHUwMTU5XHUwMEVEa2xhZCBUaXR1bGVrID4gTmFkcGlzMSA+IFBvZG5hZHBpcyA+IC4uLiA+IFBvZG5hZHBpc1wiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiVlx1MDBGRFx1MDE2MWthIGthcnRpXHUwMTBEZWsgdiBwcm9jZW50ZWNoXCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzpcbiAgICAgICAgXCJNXHUwMTFCbG8gYnkgYlx1MDBGRHQgbmFzdGF2ZW5vIG5hIDEwMCUgbmEgbW9iaWx1IG5lYm8ga2R5XHUwMTdFIHBvdVx1MDE3RVx1MDBFRHZcdTAwRTF0ZSB2ZWxrXHUwMEU5IG9iclx1MDBFMXpreVwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiUmVzZXRvdmF0IHZcdTAwRkRjaG96XHUwMEVEIG5hc3RhdmVuXHUwMEVEXCIsXG4gICAgQ0FSRF9NT0RBTF9XSURUSF9QRVJDRU5UOiBcIlx1MDE2MFx1MDBFRFx1MDE1OWthIGthcnRpXHUwMTBEZWsgdiBwcm9jZW50ZWNoXCIsXG4gICAgUkFORE9NSVpFX0NBUkRfT1JERVI6IFwiTlx1MDBFMWhvZG5cdTAxMUIgem1cdTAxMUJuaXQgcG9cdTAxNTlhZFx1MDBFRCBrYXJ0aVx1MDEwRGVrIGJcdTAxMUJoZW0gcmV2aXplP1wiLFxuICAgIERJU0FCTEVfQ0xPWkVfQ0FSRFM6IFwiVnlwbm91dCBjbG96ZSBrYXJ0aVx1MDEwRGt5P1wiLFxuICAgIENPTlZFUlRfSElHSExJR0hUU19UT19DTE9aRVM6IFwiUFx1MDE1OWV2XHUwMEU5c3QgPT16dlx1MDBGRHJhem5cdTAxMUJuXHUwMEVEPT0gbmEgY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJQXHUwMTU5ZXZcdTAwRTlzdCAqKnR1XHUwMTBEblx1MDBGRCB0ZXh0KiogbmEgY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcIlBcdTAxNTlldlx1MDBFOXN0IHt7c2xvXHUwMTdFZW5cdTAwRTkgelx1MDBFMXZvcmt5fX0gbmEgY2xvemVzP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiT2RkXHUwMTFCbG92YVx1MDEwRCBwcm8gaW5saW5lIGthcnRpXHUwMTBEa3lcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOlxuICAgICAgICBcIlBvem9yLiBKYWttaWxlIHRvdG8gem1cdTAxMUJuXHUwMEVEdGUsIGJ1ZGV0ZSBtdXNldCBydVx1MDEwRG5cdTAxMUIgdXByYXZpdCB2XHUwMTYxZWNobnkgZXhpc3R1alx1MDBFRGNcdTAwRUQga2FydGlcdTAxMERreS5cIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIk9kZFx1MDExQmxvdmFcdTAxMEQgcHJvIG90b1x1MDEwRGVuXHUwMEU5IGlubGluZSBrYXJ0aVx1MDEwRGt5XCIsXG4gICAgTVVMVElMSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJPZGRcdTAxMUJsb3ZhXHUwMTBEIHBybyB2XHUwMEVEY2VcdTAxNTlcdTAwRTFka292XHUwMEU5IGthcnRpXHUwMTBEa3lcIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIk9kZFx1MDExQmxvdmFcdTAxMEQgcHJvIHZcdTAwRURjZVx1MDE1OVx1MDBFMWRrb3ZlIG90b1x1MDEwRGVuXHUwMEU5IGthcnRpXHUwMTBEa3lcIixcbiAgICBOT1RFUzogXCJQb3puXHUwMEUxbWt5XCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiVGFnIHBybyByZXZpemlcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOlxuICAgICAgICBcIlphZGVqdGUgdGFneSBvZGRcdTAxMUJsZW5cdTAwRTkgbWV6ZXJhbWkgbmVibyBvZFx1MDE1OVx1MDBFMWRrb3ZcdTAwRTFuXHUwMEVEbSBuYXBcdTAxNTlcdTAwRURrbGFkICNyZXZpZXcgI3RhZzIgI3RhZzMuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URTogXCJPdGV2XHUwMTU5XHUwMEVEdCBuXHUwMEUxaG9kbm91IHBvem5cdTAwRTFta3UgcHJvIHJldml6aVwiLFxuICAgIE9QRU5fUkFORE9NX05PVEVfREVTQzogXCJQb2t1ZCB0b3RvIHZ5cG5ldGUsIHBvem5cdTAwRTFta3kgYnVkb3UgXHUwMTU5YXplbnkgZGxlIGRcdTAxNkZsZVx1MDE3RWl0b3N0aSAoUGFnZVJhbmspLlwiLFxuICAgIEFVVE9fTkVYVF9OT1RFOiBcIk90ZXZcdTAxNTlcdTAwRUR0IGF1dG9tYXRpY2t5IGRhbFx1MDE2MVx1MDBFRCBwb3puXHUwMEUxbWt1IHBvIGRva29uXHUwMTBEZW5cdTAwRUQgcmV2aXplXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiVnlwbm91dCB2b2xieSByZXZpemUgdiBtZW51IHNvdWJvcnUgbmFwXHUwMTU5XHUwMEVEa2xhZCAnUmV2aXplOiBKZWRub2R1Y2hcdTAwRTknXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNfREVTQzpcbiAgICAgICAgXCJQbyB2eXBudXRcdTAwRUQgbVx1MDE2Rlx1MDE3RWV0ZSBwb3VcdTAxN0VcdTAwRUR2YXQga2xcdTAwRTF2ZXNvdlx1MDBFOSB6a3JhdGt5LiBSZXN0YXJ0dWp0ZSBPYnNpZGlhbiBwbyB6bVx1MDExQm5cdTAxMUIgbmFzdGF2ZW5cdTAwRUQuXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBwb1x1MDEwRGV0IGRuXHUwMEVEIHpvYnJhemVuXHUwMEZEY2ggdiBwcmF2XHUwMEU5bSBwYW5lbHVcIixcbiAgICBNSU5fT05FX0RBWTogXCJQb1x1MDEwRGV0IGRuXHUwMEVEIG11c1x1MDBFRCBiXHUwMEZEdCBtaW5pbVx1MDBFMWxuXHUwMTFCIDEuXCIsXG4gICAgVkFMSURfTlVNQkVSX1dBUk5JTkc6IFwiUHJvc1x1MDBFRG0gemFkZWp0ZSB2YWxpZG5cdTAwRUQgXHUwMTBEXHUwMEVEc2xvLlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlBcdTAxNTllZHZvbGJ5IHVcdTAxN0VpdmF0ZWxza1x1MDBFOWhvIHJvemhyYW5cdTAwRURcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6XG4gICAgICAgIFwiU3Ryb215IGJhbFx1MDBFRFx1MDEwRGt5IGJ5IG1cdTAxMUJseSBiXHUwMEZEdCB6cG9cdTAxMERcdTAwRTF0a3Ugem9icmF6ZW55IGpha28gcm96YmFsZW5cdTAwRTlcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJWeXBuXHUwMTFCdGUgdG90bywgY2hjZXRlLWxpIHNiYWxpdCB2bm9cdTAxNTllblx1MDBFOSBiYWxcdTAwRURcdTAxMERreSBuYSBzdGVqblx1MDBFOSBrYXJ0XHUwMTFCLiBUbyBqZSB1XHUwMTdFaXRlXHUwMTBEblx1MDBFOSwgcG9rdWQgbVx1MDBFMXRlIGthcnRpXHUwMTBEa3ksIGt0ZXJcdTAwRTkgcGF0XHUwMTU5XHUwMEVEIGsgbW5vaGEgYmFsXHUwMEVEXHUwMTBEa1x1MDE2Rm0gdmUgc3Rlam5cdTAwRTltIHNvdWJvcnUuXCIsXG4gICAgQUxHT1JJVEhNOiBcIkFsZ29yaXRtdXNcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTogJ1BybyB2XHUwMEVEY2UgaW5mb3JtYWNcdTAwRUQgamRcdTAxMUJ0ZSBuYSA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5wb3BpcyBhbGdvcml0bXU8L2E+LicsXG4gICAgQkFTRV9FQVNFOiBcIlpcdTAwRTFrbGFkblx1MDBFRCBzbG9cdTAxN0VpdG9zdFwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIm1pbmltdW0gPSAxMzAsIG5lamxcdTAwRTlwZSBwXHUwMTU5aWJsaVx1MDE3RW5cdTAxMUIgMjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJaXHUwMEUxa2xhZG5cdTAwRUQgc2xvXHUwMTdFaXRvc3QgbXVzXHUwMEVEIGJcdTAwRkR0IG1pbmltXHUwMEUxbG5cdTAxMUIgMTMwLlwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRTogXCJabVx1MDExQm5hIGludGVydmFsdSBwb2t1ZCBrYXJ0aVx1MDEwRGt1L3Bvem5cdTAwRTFta3Ugb3puYVx1MDEwRFx1MDBFRHRlIGpha28gc2xvXHUwMTdFaXRvdVwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIm5vdlx1MDBGRF9pbnRldmFsID0gc3Rhclx1MDBGRF9pbnRlcnZhbCAqIHptXHUwMTFCbmFfaW50ZXZhbHUgLyAxMDAuXCIsXG4gICAgRUFTWV9CT05VUzogXCJCb251cyBwcm8gamVkbm9kdWNoXHUwMEU5XCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIlRlbnRvIGJvbnVzIHVtb1x1MDE3RVx1MDE0OHVqZSBuYXN0YXZpdCByb3pkXHUwMEVEbCBpbnRlcnZhbHUgbWV6aSBqZWRub2R1Y2hcdTAwRkRtaSBhIGRvYnJcdTAwRkRtaSBrYXJ0aVx1MDEwRGthbWkvcG96blx1MDBFMW1rYW1pIChtaW5pbXVtID0gMTAwJSkuXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJCb251cyBwcm8gamVkbm9kdWNob3N0IG11c1x1MDBFRCBiXHUwMEZEdCBtaW5pbVx1MDBFMWxuXHUwMTFCIDEwMC5cIixcbiAgICBNQVhfSU5URVJWQUw6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBpbnRlcnZhbFwiLFxuICAgIE1BWF9JTlRFUlZBTF9ERVNDOiBcIlVtb1x1MDE3RVx1MDE0OHVqZSBuYXN0YXZpdCBob3JuXHUwMEVEIGxpbWl0IHBybyBpbnRlcnZhbCAoZGVmYXVsdG5cdTAxMUIgPSAxMDAgbGV0KS5cIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBpbnRlcnZhbCBtdXNcdTAwRUQgYlx1MDBGRHQgYWxlc3BvXHUwMTQ4IDEgZGVuLlwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUI6IFwiTWF4aW1cdTAwRTFsblx1MDBFRCBwXHUwMTU5XHUwMEVEc3BcdTAxMUJ2XHUwMTFCayBwcm9saW5rb3ZcdTAwRTFuXHUwMEVEXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIk1heGltXHUwMEUxbG5cdTAwRUQgcFx1MDE1OVx1MDBFRHNwXHUwMTFCdmVrIHZcdTAwRTFcdTAxN0Vlblx1MDBFOSBzbG9cdTAxN0VpdG9zdGkgcHJvbGlua292YW5cdTAwRkRjaCBwb3puXHUwMEUxbWVrIHBvdVx1MDE3RWl0XHUwMEZEIHBybyB1clx1MDEwRGVuXHUwMEVEIHBvXHUwMTBEXHUwMEUxdGVcdTAxMERuXHUwMEVEIHNsb1x1MDE3RWl0b3N0aS5cIixcbiAgICBMT0dHSU5HOiBcIlphem5hbWVuXHUwMEUxdlx1MDBFMW1cIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiWm9icmF6aXQgaW5mb3JtYWNlIHBybyBsYWRcdTAxMUJuXHUwMEVEIG5hIHZcdTAwRkR2b2pcdTAwRTFcdTAxNTlza1x1MDBFOSBrb256b2xpP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJGcm9udGEgcG96blx1MDBFMW1layBrIHJldml6aVwiLFxuICAgIENMT1NFOiBcIlV6YXZcdTAxNTllblx1MDBFOVwiLFxuICAgIE5FVzogXCJOb3ZcdTAwRTlcIixcbiAgICBZRVNURVJEQVk6IFwiVlx1MDEwRGVyYVwiLFxuICAgIFRPREFZOiBcIkRuZXNcIixcbiAgICBUT01PUlJPVzogXCJaXHUwMEVEdHJhXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJTdGF0aXN0aWt5XCIsXG4gICAgTU9OVEg6IFwiTVx1MDExQnNcdTAwRURjXCIsXG4gICAgUVVBUlRFUjogXCJcdTAxMEN0dnJ0bGV0XHUwMEVEXCIsXG4gICAgWUVBUjogXCJSb2tcIixcbiAgICBMSUZFVElNRTogXCJDZWxrb3ZcdTAxMUJcIixcbiAgICBGT1JFQ0FTVDogXCJQXHUwMTU5ZWRwb3ZcdTAxMUJcdTAxMEZcIixcbiAgICBGT1JFQ0FTVF9ERVNDOiBcIkNlbGtvdlx1MDBGRCBwb1x1MDEwRGV0IGthcnRpXHUwMTBEZWssIGt0ZXJcdTAwRkRtIHZ5cHJcdTAxNjFcdTAwRUQgdGVybVx1MDBFRG5cIixcbiAgICBTQ0hFRFVMRUQ6IFwiTmFwbFx1MDBFMW5vdlx1MDBFMW5vXCIsXG4gICAgREFZUzogXCJEblx1MDBFRFwiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJQb1x1MDEwRGV0IGthcnRpXHUwMTBEZWtcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiUHJcdTAxNkZtXHUwMTFCcjogJHthdmd9IHJldml6ZS9kZW5cIixcbiAgICBJTlRFUlZBTFM6IFwiSW50ZXJ2YWx5XCIsXG4gICAgSU5URVJWQUxTX0RFU0M6IFwiRG9iYSwgemEga3Rlcm91IGJ1ZGUgem5vdnUgem9icmF6ZW5vIGsgcmV2aXplXCIsXG4gICAgQ09VTlQ6IFwiUG9cdTAxMERldFwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIlByXHUwMTZGbVx1MDExQnJuXHUwMEZEIGludGVydmFsOiAke2F2Z30sIE5lamRlbFx1MDE2MVx1MDBFRCBpbnRlcnZhbDogJHtsb25nZXN0fVwiLFxuICAgIEVBU0VTOiBcIlNsb1x1MDE3RWl0b3N0XCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJQclx1MDE2Rm1cdTAxMUJyblx1MDBFMSBzbG9cdTAxN0VpdG9zdDogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiVHlweSBrYXJ0aVx1MDEwRGVrXCIsXG4gICAgQ0FSRF9UWVBFU19ERVNDOiBcIk9ic2FodWplIGkgb2Rsb1x1MDE3RWVuXHUwMEU5IGthcnRpXHUwMTBEa3kgKHBva3VkIGV4aXN0dWpcdTAwRUQpXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOb3ZcdTAwRTFcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiTWxhZFx1MDBFMVwiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiRG9zcFx1MDExQmxcdTAwRTFcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiS2FydGlcdTAxMERlayBjZWxrZW06ICR7dG90YWxDYXJkc0NvdW50fVwiLFxufTtcbiIsICIvLyBCZW5nYWxpXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIERhbnNrXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIERldXRzY2hcblxuLy8gT2JzaWRpYW4gc3BlY2lmaWMgbmFtZXMgKGZvbGRlciwgbm90ZSwgdGFnLCBldGMuKSBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBnZXJtYW4gdHJhbnNsYXRpb246XG4vLyBodHRwczovL2dpdGh1Yi5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi10cmFuc2xhdGlvbnMvYmxvYi9tYXN0ZXIvZGUuanNvblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZmxhc2hjYXJkLW1vZGFsLnRzeFxuICAgIERFQ0tTOiBcIlN0YXBlbFwiLFxuICAgIERVRV9DQVJEUzogXCJBbnN0ZWhlbmRlIEthcnRlblwiLFxuICAgIE5FV19DQVJEUzogXCJOZXVlIEthcnRlblwiLFxuICAgIFRPVEFMX0NBUkRTOiBcIkFsbGUgS2FydGVuXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiS2FydGVuZm9ydHNjaHJpdHQgenVyXHUwMEZDY2tzZXR6dGVuXCIsXG4gICAgSEFSRDogXCJTY2h3ZXJcIixcbiAgICBHT09EOiBcIkd1dFwiLFxuICAgIEVBU1k6IFwiRWluZmFjaFwiLFxuICAgIFNIT1dfQU5TV0VSOiBcIlplaWdlIEFudHdvcnRcIixcbiAgICBDQVJEX1BST0dSRVNTX1JFU0VUOiBcIkthcnRlbmZvcnRzY2hyaXR0IHd1cmRlIHp1clx1MDBGQ2NrZ2VzZXR6dC5cIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiTm90aXogenVyIFdpZWRlcmhvbHVuZyBcdTAwRjZmZm5lblwiLFxuICAgIFJFVklFV19DQVJEUzogXCJMZXJua2FydGVuIHdpZWRlcmhvbGVuXCIsXG4gICAgUkVWSUVXX0VBU1lfRklMRV9NRU5VOiBcIk5vdGl6IGFic2NobGllc3NlbiBhbHM6IEVpbmZhY2hcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiTm90aXogYWJzY2hsaWVzc2VuIGFsczogR3V0XCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIk5vdGl6IGFic2NobGllc3NlbiBhbHM6IFNjaHdlclwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIk5vdGl6IGFic2NobGllc3NlbiBhbHM6IEVpbmZhY2hcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJOb3RpeiBhYnNjaGxpZXNzZW4gYWxzOiBHdXRcIixcbiAgICBSRVZJRVdfTk9URV9IQVJEX0NNRDogXCJOb3RpeiBhYnNjaGxpZXNzZW4gYWxzOiBTY2h3ZXJcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIkFsbGUgTGVybmthcnRlbiB3aWVkZXJob2xlblwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIkxlcm5rYXJ0ZW4gaW4gZGllc2VyIE5vdGl6IHdpZWRlcmhvbGVuXCIsXG4gICAgQ1JBTV9DQVJEU19JTl9OT1RFOiBcIkxlcm5rYXJ0ZW4gaW4gZGllc2VyIE5vdGl6IHBhdWtlbi5cIixcbiAgICBWSUVXX1NUQVRTOiBcIlN0YXRpc3Rpa2VuIGFuemVpZ2VuXCIsXG4gICAgU1RBVFVTX0JBUjpcbiAgICAgICAgXCJXaWVkZXJob2x1bmc6ICR7ZHVlTm90ZXNDb3VudH0gTm90aXooZW4pLCAke2R1ZUZsYXNoY2FyZHNDb3VudH0gS2FydGUobikgYW5zdGVoZW5kXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlN5bmMgZGF1ZXJ0ZSAke3R9bXNcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOlxuICAgICAgICBcIk5vdGl6IGJlZmluZGV0IHNpY2ggaW4gZWluZW0gYXVzZ2VzY2hsb3NzZW5lbiBPcmRuZXIgKHNpZWhlIEVpbnN0ZWxsdW5nZW4pLlwiLFxuICAgIFBMRUFTRV9UQUdfTk9URTpcbiAgICAgICAgXCJCaXR0ZSBkaWUgTm90aXogZlx1MDBGQ3IgV2llZGVyaG9sdW5nZW4gZW50c3ByZWNoZW5kIHRhZ2dlbiAoc2llaGUgRWluc3RlbGx1bmdlbikuXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiQW50d29ydCBlcmhhbHRlbi5cIixcbiAgICBOT19ERUNLX0VYSVNUUzogXCJLZWluIFN0YXBlbCBmXHUwMEZDciAke2RlY2tOYW1lfSBnZWZ1bmRlbi5cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIll1aHUhIEFsbGVzIGdlc2NoYWZmdCEgOkQuXCIsXG5cbiAgICAvLyBzY2hlZHVsaW5nLnRzXG4gICAgREFZU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFRhZyhlKVwiLFxuICAgIE1PTlRIU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IE1vbmF0KGUpXCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfSBKYWhyKGUpXCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfWRcIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1tXCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH15XCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBQbHVnaW4gLSBFaW5zdGVsbHVuZ2VuXCIsXG4gICAgQ0hFQ0tfV0lLSTogJ1dlaXRlcmUgSW5mb3JtYXRpb25lbiBnaWJ0IGVzIGltIDxhIGhyZWY9XCIke3dpa2lfdXJsfVwiPldpa2k8L2E+IChlbmdsaXNoKS4nLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIkF1c2dlc2NobG9zc2VuZSBPcmRuZXJcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICBcIk1laHJlcmUgT3JkbmVyIG1pdCBaZWlsZW51bWJyXHUwMEZDY2hlbiBnZXRyZW5udCBhbmdlYmVuLiBCc3AuIE9yZG5lckFbWmVpbGVudW1icnVjaF1PcmRuZXJCL1VudGVyb3JkbmVyXCIsXG4gICAgRkxBU0hDQVJEUzogXCJMZXJua2FydGVuXCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiRWFzeSBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIkdvb2QgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfSEFSRF9MQUJFTDogXCJIYXJkIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkVhc3lcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9HT09EX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJHb29kXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiSGFyZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiTGVybmthcnRlbiBUYWdzXCIsXG4gICAgRkxBU0hDQVJEX1RBR1NfREVTQzpcbiAgICAgICAgXCJNZWhyZXJlIFRhZ3MgbWl0IExlZXJ6ZWljaGVuIG9kZXIgWmVpbGVudW1iclx1MDBGQ2NoZW4gZ2V0cmVubnQgYW5nZWJlbi4gQnNwLiAja2FydGUgI3N0YXBlbDIgI3N0YXBlbDMuXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTOiBcIk9yZG5lciBpbiBTdGFwZWwgdW5kIFN1YnN0YXBlbCB1bXdhbmRlbG4/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6ICdFaW5lIEFsdGVybmF0aXZlIHp1ciBvYmVyZW4gXCJMZXJua2FydGVuIFRhZ3NcIiBPcHRpb24uJyxcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzpcbiAgICAgICAgXCJEZW4gRm9ydHNjaHJpdHQgaW4gZGVyIGdsZWljaGVuIFplaWxlIHdpZSBkaWUgbGV0enRlIFplaWxlIGVpbmVyIExlcm5rYXJ0ZWkgc3BlaWNoZXJuP1wiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTX0RFU0M6XG4gICAgICAgIFwiV2VubiBha3RpdmllcnQsIHdpcmQgZGVyIEhUTUwgS29tbWVudGFyIGRpZSB1bWdlYmVuZGUgTGlzdGUgbmljaHQgYXVmYnJlY2hlbi5cIixcbiAgICBCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVk6IFwiVmVyd2FuZHRlIEthcnRlbiBhdWYgZGVuIG5cdTAwRTRjaHN0ZW4gVGFnIHZlcmxlZ2VuP1wiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOlxuICAgICAgICBcIlZlcndhbmR0ZSBLYXJ0ZW4gc2luZCBhdXMgZGVyIGdsZWljaGVuIEthcnRlIGdlbmVyaWVydCB3b3JkZW4gKHouQi4gTFx1MDBGQ2NrZW50ZXh0a2FydGVuIG9kZXIgYmVpZHNlaXRpZ2UgS2FydGVuKS5cIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJLb250ZXh0IGluIGRlbiBLYXJ0ZW4gYW56ZWlnZW4/XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJCc3AuIFRpdGVsID4gXHUwMERDYmVyc2NocmlmdCAxID4gU2VrdGlvbiA+IC4uLiA+IFVudGVyc2VrdGlvblwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiSFx1MDBGNmhlIGRlciBMZXJua2FydGVpIGluIFByb3plbnRcIixcbiAgICBDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDOlxuICAgICAgICBcIkF1ZiBrbGVpbmVuIEJpbGRzY2hpcm1lbiAoei5CLiBTbWFydHBob25lcykgb2RlciBiZWkgc2VociBncm9zc2VuIEJpbGRlcm4gc29sbHRlIGRpZXNlciBXZXJ0IGF1ZiAxMDAlIGdlc2V0enQgd2VyZGVuLlwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiU3RhbmRhcmRlaW5zdGVsbHVuZyB3aWVkZXJoZXJzdGVsbGVuXCIsXG4gICAgQ0FSRF9NT0RBTF9XSURUSF9QRVJDRU5UOiBcIkJyZWl0ZSBlaW5lciBMZXJua2FydGUgaW4gUHJvemVudFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIldcdTAwRTRocmVuZCBkZXIgV2llZGVyaG91bmcgZGllIFJlaWhlbmZvbGdlIHp1Zlx1MDBFNGxsaWcgbWlzY2hlbj9cIixcbiAgICBESVNBQkxFX0NMT1pFX0NBUkRTOiBcIkxcdTAwRkNja2VudGV4dGthcnRlbiAoY2xvemUgZGVsZXRpb25zKSBkZWFrdGl2aWVyZW4/XCIsXG4gICAgQ09OVkVSVF9ISUdITElHSFRTX1RPX0NMT1pFUzogXCI9PUhlcnZvcmdlaG9iZW5lbj09IFRleHQgaW4gTFx1MDBGQ2NrZW50ZXh0a2FydGVuIHVtd2FuZGVsbj9cIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiKipGZXR0Z2VkcnVja3RlbioqIFRleHQgaW4gTFx1MDBGQ2NrZW50ZXh0a2FydGVuIHVtd2FuZGVsbj9cIixcbiAgICBDT05WRVJUX0NVUkxZX0JSQUNLRVRTX1RPX0NMT1pFUzpcbiAgICAgICAgXCJ7e0dlc2Nod2VpZnRlIEtsYW1tZXJufX0gVGV4dCBpbiBMXHUwMEZDY2tlbnRleHRrYXJ0ZW4gdW13YW5kZWxuP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiVHJlbm56ZWljaGVuIGZcdTAwRkNyIGVpbnplaWxpZ2UgTGVybmthcnRlblwiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiV2VubiBkaWVzZSBFaW5zdGVsbHVuZyBnZVx1MDBFNG5kZXJ0IHdpcmQsIGRhbm4gbVx1MDBGQ3NzZW4gZGllIGVudHNwcmVjaGVuZGVuIExlcm5rYXJ0ZW4gbWFudWVsbCBhbmdlcGFzc3Qgd2VyZGVuLlwiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiVHJlbm56ZWljaGVuIGZcdTAwRkNyIGVpbnplaWxpZ2UgYmVpZHNlaXRpZ2UgTGVybmthcnRlblwiLFxuICAgIE1VTFRJTElORV9DQVJEU19TRVBBUkFUT1I6IFwiVHJlbm56ZWljaGVuIGZcdTAwRkNyIG1laHJ6ZWlsaWdlIExlcm5rYXJ0ZW5cIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlRyZW5uemVpY2hlbiBmXHUwMEZDciBtZWhyemVpbGlnZSBiZWlkc2VpdGlnZSBMZXJua2FydGVuXCIsXG4gICAgTk9URVM6IFwiTm90aXplblwiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiRW5hYmxlIG5vdGUgcmV2aWV3IHBhbmUgb24gc3RhcnR1cFwiLFxuICAgIFRBR1NfVE9fUkVWSUVXOiBcIlp1IHdpZWRlcmhvbGVuZGUgVGFnc1wiLFxuICAgIFRBR1NfVE9fUkVWSUVXX0RFU0M6XG4gICAgICAgIFwiTWVocmVyZSBUYWdzIGtcdTAwRjZubmVuIG1pdCBMZWVyemVpY2hlbiBvZGVyIFplaWxlbnVtYnJcdTAwRkNjaGVuIGdldHJlbm50IGFuZ2VnZWJlbiB3ZXJkZW4uIEJzcC4gI2thcnRlICN0YWcxICN0YWcyLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiWnVmXHUwMEU0bGxpZ2UgS2FydGVuIHdpZWRlcmhvbGVuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOlxuICAgICAgICBcIldlbm4gZGllcyBkZWFrdGl2aWVydCB3aXJkLCBkYW5uIHdlcmRlbiBkaWUgTm90aXplbiBuYWNoIFdpY2h0aWdrZWl0IHdpZWRlcmhvbHQgKFBhZ2VSYW5rKS5cIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJOYWNoIGVpbmVyIFdpZWRlcmhvbHVuZyBhdXRvbWF0aXNjaCBkaWUgblx1MDBFNGNoc3RlIEthcnRlIFx1MDBGNmZmbmVuXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiT3B0aW9uZW4genVyIFdpZWRlcmhvbHVuZyBpbSBNZW5cdTAwRkMgZWluZXIgRGF0ZWkgZGVha3RpdmllcmVuLiBCc3AuIFdpZWRlcmhvbGVuOiBFaW5mYWNoIEd1dCBTY2h3ZXJcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIk5hY2ggZGVtIERlYWt0aXZpZXJlbiBrXHUwMEY2bm5lbiBkaWUgVGFzdGVua1x1MDBGQ3J6ZWwgenVyIFdpZWRlcmhvbHVuZyB2ZXJ3ZW5kZXQgd2VyZGVuLiBPYnNpZGlhbiBtdXNzIG5hY2ggZWluZXIgXHUwMEM0bmRlcnVuZyBuZXUgZ2VsYWRlbiB3ZXJlbi5cIixcbiAgICBNQVhfTl9EQVlTX1JFVklFV19RVUVVRTpcbiAgICAgICAgXCJNYXhpbWFsZSBBbnphaGwgYW5zdGVoZW5kZXIgTm90aXplbiwgZGllIGltIHJlY2h0ZW4gRmVuc3RlcmJlcmVpY2ggYW5nZXplaWd0IHdlcmRlblwiLFxuICAgIE1JTl9PTkVfREFZOiBcIkFuemFobCBkZXIgVGFnZSBtdXNzIG1pbmRlc3RlbnMgMSBzZWluLlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIkJpdHRlIGVpbmUgZ1x1MDBGQ2x0aWdlIFphaGwgZWluZ2ViZW4uXCIsXG4gICAgVUlfUFJFRkVSRU5DRVM6IFwiRWluc3RlbGx1bmdlbiBkZXIgQmVudXR6ZXJvYmVyZmxcdTAwRTRjaGVcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6IFwiRGVja2JcdTAwRTR1bWUgc29sbHRlbiBhbmZcdTAwRTRuZ2xpY2ggZXJ3ZWl0ZXJ0IGFuZ2V6ZWlndCB3ZXJkZW5cIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJEZWFrdGl2aWVyZW4gU2llIGRpZXMsIHVtIHZlcnNjaGFjaHRlbHRlIERlY2tzIGluIGRlcnNlbGJlbiBLYXJ0ZSB6dSByZWR1emllcmVuLiBOXHUwMEZDdHpsaWNoLCB3ZW5uIFNpZSBLYXJ0ZW4gaGFiZW4sIGRpZSB6dSB2aWVsZW4gRGVja3MgaW4gZGVyc2VsYmVuIERhdGVpIGdlaFx1MDBGNnJlbi5cIixcbiAgICBBTEdPUklUSE06IFwiQWxnb3JpdGhtdXNcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTpcbiAgICAgICAgJ1dlaXRlcmZcdTAwRkNocmVuZGUgSW5mb3JtYXRpb25lbjogPGEgaHJlZj1cIiR7YWxnb191cmx9XCI+SW1wbGVtZW50aWVydW5nIGRlcyBBbGdvcml0aG11czwvYT4gKGVuZ2xpc2gpLicsXG4gICAgQkFTRV9FQVNFOiBcIkJhc2lzIGRlciBFaW5mYWNoaGVpdFwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIk1pbmltdW0gaXN0IDEzMC4gRW1wZm9obGVuIHdpcmQgY2EuIDI1MC5cIixcbiAgICBCQVNFX0VBU0VfTUlOX1dBUk5JTkc6IFwiQmFzaXMgZGVyIEVpbmZhY2hoZWl0IG11c3MgbWluZGVzdGVucyAxMzAgc2Vpbi5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6XG4gICAgICAgIFwiQW5wYXNzdW5nc2Zha3RvciBkZXMgSW50ZXJ2YWxscyB3ZW5uIGVpbmUgTm90aXogLyBLYXJ0ZSAnU2Nod2VyJyBhYmdlc2NobG9zc2VuIHdpcmRcIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0VfREVTQzogXCJuZXVlc0ludGVydmFsbCA9IGFsdGVzSW50ZXJ2YWxsICogYW5wYXNzdW5nc2Zha3RvciAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIkVpbmZhY2hoZWl0LUJvbnVzXCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIkRlciBFaW5mYWNoaGVpdC1Cb251cyBnaWJ0IGFuIHVtIHdlbGNoZW4gRmFrdG9yIChpbiBQcm96ZW50KSBkYXMgSW50ZXJ2YWxsIGxcdTAwRTRuZ2VyIHNlaW4gc29sbCwgd2VubiBlaW5lIE5vdGl6IC8gS2FydGUgJ0VpbmZhY2gnIHN0YXR0ICdHdXQnIGFiZ2VzY2hsb3NzZW4gd2lyZC4gTWluaW11bSBpc3QgMTAwJS5cIixcbiAgICBFQVNZX0JPTlVTX01JTl9XQVJOSU5HOiBcIkRlciBFaW5mYWNoaGVpdC1Cb251cyBtdXNzIG1pbmRlc3RlbnMgMTAwIHNlaW4uXCIsXG4gICAgTUFYX0lOVEVSVkFMOiBcIk1heGltYWxlcyBJbnRlcnZhbGxcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzpcbiAgICAgICAgXCJEYXMgbWF4aW1hbGUgSW50ZXJ2YWxsIChpbiBUYWdlbikgZlx1MDBGQ3IgV2llZGVyaG9sdW5nZW4uIFN0YW5kYXJkIHNpbmQgMTAwIEphaHJlLlwiLFxuICAgIE1BWF9JTlRFUlZBTF9NSU5fV0FSTklORzogXCJEYXMgbWF4aW1hbGUgSW50ZXJhbGwgbXVzcyBtaW5kZXN0ZW5zIGVpbiBUYWcgc2Vpbi5cIixcbiAgICBNQVhfTElOS19DT05UUklCOiBcIk1heGltYWxlciBFaW5mbHVzcyB2b24gTGlua3NcIixcbiAgICBNQVhfTElOS19DT05UUklCX0RFU0M6XG4gICAgICAgIFwiTWF4aW1hbGVyIEVpbmZsdXNzIGRlciBFaW5mYWNoaGVpdGVuIHZlcmxpbmt0ZXIgTm90aXplbiB6dXIgZ2V3aWNodGV0ZW4gaW5pdGlhbGVuIEVpbmZhY2hoZWl0IGVpbmVyIG5ldWVuIExlcm5rYXJ0ZS5cIixcbiAgICBMT0dHSU5HOiBcIkxvZ2dpbmdcIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiSW5mb3JtYXRpb25lbiB6dW0gRGVidWdnaW5nIGluIGRlciBFbnR3aWNrbGVya29uc29sZSBhbnplaWdlbj9cIixcblxuICAgIC8vIHNpZGViYXIudHNcbiAgICBOT1RFU19SRVZJRVdfUVVFVUU6IFwiQW5zdGVoZW5kZSBOb3RpemVuIHp1ciBXaWVkZXJob2x1bmdcIixcbiAgICBDTE9TRTogXCJTY2hsaWVzc2VuXCIsXG4gICAgTkVXOiBcIk5ldVwiLFxuICAgIFlFU1RFUkRBWTogXCJHZXN0ZXJuXCIsXG4gICAgVE9EQVk6IFwiSGV1dGVcIixcbiAgICBUT01PUlJPVzogXCJNb3JnZW5cIixcblxuICAgIC8vIHN0YXRzLW1vZGFsLnRzeFxuICAgIFNUQVRTX1RJVExFOiBcIlN0YXRpc3Rpa2VuXCIsXG4gICAgTU9OVEg6IFwiTW9udGhcIixcbiAgICBRVUFSVEVSOiBcIlF1YXJ0ZXJcIixcbiAgICBZRUFSOiBcIlllYXJcIixcbiAgICBMSUZFVElNRTogXCJMaWZldGltZVwiLFxuICAgIEZPUkVDQVNUOiBcIlByb2dub3NlXCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJBbnphaGwgZGVyIGtcdTAwRkNuZnRpZyBhbnN0ZWhlbmRlbiBLYXJ0ZW5cIixcbiAgICBTQ0hFRFVMRUQ6IFwiQW5zdGVoZW5kXCIsXG4gICAgREFZUzogXCJUYWdlXCIsXG4gICAgTlVNQkVSX09GX0NBUkRTOiBcIkFuemFobCBkZXIgS2FydGVuXCIsXG4gICAgUkVWSUVXU19QRVJfREFZOiBcIkR1cmNoc2Nobml0dDogJHthdmd9IFdpZWRlcmhvbHVuZ2VuL1RhZ1wiLFxuICAgIElOVEVSVkFMUzogXCJJbnRlcnZhbGxlXCIsXG4gICAgSU5URVJWQUxTX0RFU0M6IFwiSW50ZXJ2YWxsZSBiaXMgV2llZGVyaG9sdW5nZW4gYW5zdGVoZW5cIixcbiAgICBDT1VOVDogXCJBbnphaGxcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJEdXJjaHNjaG5pdHRsaWNoZXMgSW50ZXJ2YWxsOiAke2F2Z30sIExcdTAwRTRuZ3N0ZXMgSW50ZXJ2YWxsOiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWluZmFjaGhlaXRcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIkR1cmNoc2Nobml0dGxpY2hlIEVpbmZhY2hoZWl0OiAke2F2Z0Vhc2V9XCIsXG4gICAgQ0FSRF9UWVBFUzogXCJLYXRlZ29yaXNpZXJ1bmdcIixcbiAgICBDQVJEX1RZUEVTX0RFU0M6IFwiVmVybGVndGUgS2FydGVuIGVpbmdlc2NobG9zc2VuXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOZXVcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiSnVuZ1wiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiQXVzZ2VyZWlmdFwiLFxuICAgIENBUkRfVFlQRVNfU1VNTUFSWTogXCJJbnNnZXNhbXQgJHt0b3RhbENhcmRzQ291bnR9IEthcnRlblwiLFxufTtcbiIsICIvLyBFbmdsaXNoXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiRGVja3NcIixcbiAgICBEVUVfQ0FSRFM6IFwiRHVlIENhcmRzXCIsXG4gICAgTkVXX0NBUkRTOiBcIk5ldyBDYXJkc1wiLFxuICAgIFRPVEFMX0NBUkRTOiBcIlRvdGFsIENhcmRzXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiUmVzZXQgY2FyZCdzIHByb2dyZXNzXCIsXG4gICAgSEFSRDogXCJIYXJkXCIsXG4gICAgR09PRDogXCJHb29kXCIsXG4gICAgRUFTWTogXCJFYXN5XCIsXG4gICAgU0hPV19BTlNXRVI6IFwiU2hvdyBBbnN3ZXJcIixcbiAgICBDQVJEX1BST0dSRVNTX1JFU0VUOiBcIkNhcmQncyBwcm9ncmVzcyBoYXMgYmVlbiByZXNldC5cIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiT3BlbiBhIG5vdGUgZm9yIHJldmlld1wiLFxuICAgIFJFVklFV19DQVJEUzogXCJSZXZpZXcgZmxhc2hjYXJkc1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJSZXZpZXc6IEVhc3lcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiUmV2aWV3OiBHb29kXCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlJldmlldzogSGFyZFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlJldmlldyBub3RlIGFzIGVhc3lcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJSZXZpZXcgbm90ZSBhcyBnb29kXCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiUmV2aWV3IG5vdGUgYXMgaGFyZFwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19BTExfQ0FSRFM6IFwiUmV2aWV3IGZsYXNoY2FyZHMgZnJvbSBhbGwgbm90ZXNcIixcbiAgICBSRVZJRVdfQ0FSRFNfSU5fTk9URTogXCJSZXZpZXcgZmxhc2hjYXJkcyBpbiB0aGlzIG5vdGVcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiQ3JhbSBmbGFzaGNhcmRzIGluIHRoaXMgbm90ZVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiVmlldyBzdGF0aXN0aWNzXCIsXG4gICAgU1RBVFVTX0JBUjogXCJSZXZpZXc6ICR7ZHVlTm90ZXNDb3VudH0gbm90ZShzKSwgJHtkdWVGbGFzaGNhcmRzQ291bnR9IGNhcmQocykgZHVlXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlN5bmMgdG9vayAke3R9bXNcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIk5vdGUgaXMgc2F2ZWQgdW5kZXIgaWdub3JlZCBmb2xkZXIgKGNoZWNrIHNldHRpbmdzKS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiUGxlYXNlIHRhZyB0aGUgbm90ZSBhcHByb3ByaWF0ZWx5IGZvciByZXZpZXdpbmcgKGluIHNldHRpbmdzKS5cIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJSZXNwb25zZSByZWNlaXZlZC5cIixcbiAgICBOT19ERUNLX0VYSVNUUzogXCJObyBkZWNrIGV4aXN0cyBmb3IgJHtkZWNrTmFtZX1cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIllvdSdyZSBhbGwgY2F1Z2h0IHVwIG5vdyA6RC5cIixcblxuICAgIC8vIHNjaGVkdWxpbmcudHNcbiAgICBEQVlTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gZGF5KHMpXCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gbW9udGgocylcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IHllYXIocylcIixcbiAgICBEQVlTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9ZFwiLFxuICAgIE1PTlRIU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfW1cIixcbiAgICBZRUFSU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfXlcIixcblxuICAgIC8vIHNldHRpbmdzLnRzXG4gICAgU0VUVElOR1NfSEVBREVSOiBcIlNwYWNlZCBSZXBldGl0aW9uIFBsdWdpbiAtIFNldHRpbmdzXCIsXG4gICAgQ0hFQ0tfV0lLSTogJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjayB0aGUgPGEgaHJlZj1cIiR7d2lraV91cmx9XCI+d2lraTwvYT4uJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJGb2xkZXJzIHRvIGlnbm9yZVwiLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFX0RFU0M6IFwiRW50ZXIgZm9sZGVyIHBhdGhzIHNlcGFyYXRlZCBieSBuZXdsaW5lcyBpLmUuIFRlbXBsYXRlcyBNZXRhL1NjcmlwdHNcIixcbiAgICBGTEFTSENBUkRTOiBcIkZsYXNoY2FyZHNcIixcbiAgICBGTEFTSENBUkRfRUFTWV9MQUJFTDogXCJFYXN5IEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfTEFCRUw6IFwiR29vZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIkhhcmQgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfRUFTWV9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiRWFzeVwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkdvb2RcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJIYXJkXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfVEFHUzogXCJGbGFzaGNhcmQgdGFnc1wiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiRW50ZXIgdGFncyBzZXBhcmF0ZWQgYnkgc3BhY2VzIG9yIG5ld2xpbmVzIGkuZS4gI2ZsYXNoY2FyZHMgI2RlY2syICNkZWNrMy5cIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1M6IFwiQ29udmVydCBmb2xkZXJzIHRvIGRlY2tzIGFuZCBzdWJkZWNrcz9cIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1NfREVTQzogXCJUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBGbGFzaGNhcmQgdGFncyBvcHRpb24gYWJvdmUuXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6XG4gICAgICAgIFwiU2F2ZSBzY2hlZHVsaW5nIGNvbW1lbnQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZmxhc2hjYXJkJ3MgbGFzdCBsaW5lP1wiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTX0RFU0M6XG4gICAgICAgIFwiVHVybmluZyB0aGlzIG9uIHdpbGwgbWFrZSB0aGUgSFRNTCBjb21tZW50cyBub3QgYnJlYWsgbGlzdCBmb3JtYXR0aW5nLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJCdXJ5IHNpYmxpbmcgY2FyZHMgdW50aWwgdGhlIG5leHQgZGF5P1wiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOlxuICAgICAgICBcIlNpYmxpbmdzIGFyZSBjYXJkcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc2FtZSBjYXJkIHRleHQgaS5lLiBjbG96ZSBkZWxldGlvbnNcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJTaG93IGNvbnRleHQgaW4gY2FyZHM/XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJpLmUuIFRpdGxlID4gSGVhZGluZyAxID4gU3ViaGVhZGluZyA+IC4uLiA+IFN1YmhlYWRpbmdcIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIkZsYXNoY2FyZCBIZWlnaHQgUGVyY2VudGFnZVwiLFxuICAgIENBUkRfTU9EQUxfU0laRV9QRVJDRU5UX0RFU0M6XG4gICAgICAgIFwiU2hvdWxkIGJlIHNldCB0byAxMDAlIG9uIG1vYmlsZSBvciBpZiB5b3UgaGF2ZSB2ZXJ5IGxhcmdlIGltYWdlc1wiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiUmVzZXQgdG8gZGVmYXVsdFwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJGbGFzaGNhcmQgV2lkdGggUGVyY2VudGFnZVwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlJhbmRvbWl6ZSBjYXJkIG9yZGVyIGR1cmluZyByZXZpZXc/XCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJEaXNhYmxlIGNsb3plIGNhcmRzP1wiLFxuICAgIENPTlZFUlRfSElHSExJR0hUU19UT19DTE9aRVM6IFwiQ29udmVydCA9PWhpZ2h0bGlnaHRzPT0gdG8gY2xvemVzP1wiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJDb252ZXJ0ICoqYm9sZGVkIHRleHQqKiB0byBjbG96ZXM/XCIsXG4gICAgQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVM6IFwiQ29udmVydCB7e2N1cmx5IGJyYWNrZXRzfX0gdG8gY2xvemVzP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBpbmxpbmUgZmxhc2hjYXJkc1wiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiTm90ZSB0aGF0IGFmdGVyIGNoYW5naW5nIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgZWRpdCBhbnkgZmxhc2hjYXJkcyB5b3UgYWxyZWFkeSBoYXZlLlwiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBpbmxpbmUgcmV2ZXJzZWQgZmxhc2hjYXJkc1wiLFxuICAgIE1VTFRJTElORV9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBtdWx0aWxpbmUgZmxhc2hjYXJkc1wiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhdG9yIGZvciBtdWx0aWxpbmUgcmV2ZXJzZWQgZmxhc2hjYXJkc1wiLFxuICAgIE5PVEVTOiBcIk5vdGVzXCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiVGFncyB0byByZXZpZXdcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOiBcIkVudGVyIHRhZ3Mgc2VwYXJhdGVkIGJ5IHNwYWNlcyBvciBuZXdsaW5lcyBpLmUuICNyZXZpZXcgI3RhZzIgI3RhZzMuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URTogXCJPcGVuIGEgcmFuZG9tIG5vdGUgZm9yIHJldmlld1wiLFxuICAgIE9QRU5fUkFORE9NX05PVEVfREVTQzogXCJXaGVuIHlvdSB0dXJuIHRoaXMgb2ZmLCBub3RlcyBhcmUgb3JkZXJlZCBieSBpbXBvcnRhbmNlIChQYWdlUmFuaykuXCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiT3BlbiBuZXh0IG5vdGUgYXV0b21hdGljYWxseSBhZnRlciBhIHJldmlld1wiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TOlxuICAgICAgICBcIkRpc2FibGUgcmV2aWV3IG9wdGlvbnMgaW4gdGhlIGZpbGUgbWVudSBpLmUuIFJldmlldzogRWFzeSBHb29kIEhhcmRcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIkFmdGVyIGRpc2FibGluZywgeW91IGNhbiByZXZpZXcgdXNpbmcgdGhlIGNvbW1hbmQgaG90a2V5cy4gUmVsb2FkIE9ic2lkaWFuIGFmdGVyIGNoYW5naW5nIHRoaXMuXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiTWF4aW11bSBudW1iZXIgb2YgZGF5cyB0byBkaXNwbGF5IG9uIHJpZ2h0IHBhbmVsXCIsXG4gICAgTUlOX09ORV9EQVk6IFwiVGhlIG51bWJlciBvZiBkYXlzIG11c3QgYmUgYXQgbGVhc3QgMS5cIixcbiAgICBWQUxJRF9OVU1CRVJfV0FSTklORzogXCJQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIG51bWJlci5cIixcbiAgICBVSV9QUkVGRVJFTkNFUzogXCJVSSBQcmVmZXJlbmNlc1wiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTogXCJEZWNrIHRyZWVzIHNob3VsZCBiZSBpbml0aWFsbHkgZGlzcGxheWVkIGFzIGV4cGFuZGVkXCIsXG4gICAgSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFX0RFU0M6XG4gICAgICAgIFwiVHVybiB0aGlzIG9mZiB0byBjb2xsYXBzZSBuZXN0ZWQgZGVja3MgaW4gdGhlIHNhbWUgY2FyZC4gVXNlZnVsIGlmIHlvdSBoYXZlIGNhcmRzIHdoaWNoIGJlbG9uZyB0byBtYW55IGRlY2tzIGluIHRoZSBzYW1lIGZpbGUuXCIsXG4gICAgQUxHT1JJVEhNOiBcIkFsZ29yaXRobVwiLFxuICAgIENIRUNLX0FMR09SSVRITV9XSUtJOlxuICAgICAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNoZWNrIHRoZSA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5hbGdvcml0aG0gaW1wbGVtZW50YXRpb248L2E+LicsXG4gICAgQkFTRV9FQVNFOiBcIkJhc2UgZWFzZVwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIm1pbmltdW0gPSAxMzAsIHByZWZlcnJhYmx5IGFwcHJveGltYXRlbHkgMjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJUaGUgYmFzZSBlYXNlIG11c3QgYmUgYXQgbGVhc3QgMTMwLlwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRTogXCJJbnRlcnZhbCBjaGFuZ2Ugd2hlbiB5b3UgcmV2aWV3IGEgZmxhc2hjYXJkL25vdGUgYXMgaGFyZFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIm5ld0ludGVydmFsID0gb2xkSW50ZXJ2YWwgKiBpbnRlcnZhbENoYW5nZSAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIkVhc3kgQm9udXNcIixcbiAgICBFQVNZX0JPTlVTX0RFU0M6XG4gICAgICAgIFwiVGhlIGVhc3kgYm9udXMgYWxsb3dzIHlvdSB0byBzZXQgdGhlIGRpZmZlcmVuY2UgaW4gaW50ZXJ2YWxzIGJldHdlZW4gYW5zd2VyaW5nIEdvb2QgYW5kIEVhc3kgb24gYSBmbGFzaGNhcmQvbm90ZSAobWluaW11bSA9IDEwMCUpLlwiLFxuICAgIEVBU1lfQk9OVVNfTUlOX1dBUk5JTkc6IFwiVGhlIGVhc3kgYm9udXMgbXVzdCBiZSBhdCBsZWFzdCAxMDAuXCIsXG4gICAgTUFYX0lOVEVSVkFMOiBcIk1heGltdW0gSW50ZXJ2YWxcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJBbGxvd3MgeW91IHRvIHBsYWNlIGFuIHVwcGVyIGxpbWl0IG9uIHRoZSBpbnRlcnZhbCAoZGVmYXVsdCA9IDEwMCB5ZWFycykuXCIsXG4gICAgTUFYX0lOVEVSVkFMX01JTl9XQVJOSU5HOiBcIlRoZSBtYXhpbXVtIGludGVydmFsIG11c3QgYmUgYXQgbGVhc3QgMSBkYXkuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJNYXhpbXVtIGxpbmsgY29udHJpYnV0aW9uXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIk1heGltdW0gY29udHJpYnV0aW9uIG9mIHRoZSB3ZWlnaHRlZCBlYXNlIG9mIGxpbmtlZCBub3RlcyB0byB0aGUgaW5pdGlhbCBlYXNlLlwiLFxuICAgIExPR0dJTkc6IFwiTG9nZ2luZ1wiLFxuICAgIERJU1BMQVlfREVCVUdfSU5GTzogXCJEaXNwbGF5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBvbiB0aGUgZGV2ZWxvcGVyIGNvbnNvbGU/XCIsXG5cbiAgICAvLyBzaWRlYmFyLnRzXG4gICAgTk9URVNfUkVWSUVXX1FVRVVFOiBcIk5vdGVzIFJldmlldyBRdWV1ZVwiLFxuICAgIENMT1NFOiBcIkNsb3NlXCIsXG4gICAgTkVXOiBcIk5ld1wiLFxuICAgIFlFU1RFUkRBWTogXCJZZXN0ZXJkYXlcIixcbiAgICBUT0RBWTogXCJUb2RheVwiLFxuICAgIFRPTU9SUk9XOiBcIlRvbW9ycm93XCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJTdGF0aXN0aWNzXCIsXG4gICAgTU9OVEg6IFwiTW9udGhcIixcbiAgICBRVUFSVEVSOiBcIlF1YXJ0ZXJcIixcbiAgICBZRUFSOiBcIlllYXJcIixcbiAgICBMSUZFVElNRTogXCJMaWZldGltZVwiLFxuICAgIEZPUkVDQVNUOiBcIkZvcmVjYXN0XCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJUaGUgbnVtYmVyIG9mIGNhcmRzIGR1ZSBpbiB0aGUgZnV0dXJlXCIsXG4gICAgU0NIRURVTEVEOiBcIlNjaGVkdWxlZFwiLFxuICAgIERBWVM6IFwiRGF5c1wiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJOdW1iZXIgb2YgY2FyZHNcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiQXZlcmFnZTogJHthdmd9IHJldmlld3MvZGF5XCIsXG4gICAgSU5URVJWQUxTOiBcIkludGVydmFsc1wiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIkRlbGF5cyB1bnRpbCByZXZpZXdzIGFyZSBzaG93biBhZ2FpblwiLFxuICAgIENPVU5UOiBcIkNvdW50XCIsXG4gICAgSU5URVJWQUxTX1NVTU1BUlk6IFwiQXZlcmFnZSBpbnRlcnZhbDogJHthdmd9LCBMb25nZXN0IGludGVydmFsOiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWFzZXNcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIkF2ZXJhZ2UgZWFzZTogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiQ2FyZCBUeXBlc1wiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJUaGlzIGluY2x1ZGVzIGJ1cmllZCBjYXJkcyBhcyB3ZWxsLCBpZiBhbnlcIixcbiAgICBDQVJEX1RZUEVfTkVXOiBcIk5ld1wiLFxuICAgIENBUkRfVFlQRV9ZT1VORzogXCJZb3VuZ1wiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiTWF0dXJlXCIsXG4gICAgQ0FSRF9UWVBFU19TVU1NQVJZOiBcIlRvdGFsIGNhcmRzOiAke3RvdGFsQ2FyZHNDb3VudH1cIixcbn07XG4iLCAiLy8gQnJpdGlzaCBFbmdsaXNoXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIEVzcGFcdTAwRjFvbFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBmcmFuXHUwMEU3YWlzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFx1MDkzOVx1MDkzRlx1MDkyOFx1MDk0RFx1MDkyNlx1MDk0MFxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBCYWhhc2EgSW5kb25lc2lhXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIEl0YWxpYW5vXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFx1NjVFNVx1NjcyQ1x1OEE5RVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZmxhc2hjYXJkLW1vZGFsLnRzeFxuICAgIERFQ0tTOiBcIlx1MzBDN1x1MzBDM1x1MzBBRFwiLFxuICAgIERVRV9DQVJEUzogXCJcdTY3MUZcdTY1RTVcdTMwNkVcdTMwQUJcdTMwRkNcdTMwQzlcIixcbiAgICBORVdfQ0FSRFM6IFwiXHU2NUIwXHU4OThGXHUzMDZFXHUzMEFCXHUzMEZDXHUzMEM5XCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHU1NDA4XHU4QTA4XCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU5MDMyXHU2MzU3XHUzMDkyXHUzMEVBXHUzMEJCXHUzMEMzXHUzMEM4XCIsXG4gICAgSEFSRDogXCJIYXJkXCIsXG4gICAgR09PRDogXCJHb29kXCIsXG4gICAgRUFTWTogXCJFYXN5XCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHU4OUUzXHU3QjU0XHUzMDkyXHU4ODY4XHU3OTNBXCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCJcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNkVcdTkwMzJcdTYzNTdcdTMwNENcdTMwRUFcdTMwQkJcdTMwQzNcdTMwQzhcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkyXHU5NThCXHUzMDRGXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2RVx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkM6IEVhc3lcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDOiBHb29kXCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQzogSGFyZFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA5MkVhc3lcdTMwNjhcdTMwNTdcdTMwNjZcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTMwNTlcdTMwOEJcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJcdTMwQ0VcdTMwRkNcdTMwQzhcdTMwOTJHb29kXHUzMDY4XHUzMDU3XHUzMDY2XHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkySGFyZFx1MzA2OFx1MzA1N1x1MzA2Nlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA1OVx1MzA4QlwiLFxuICAgIFJFVklFV19BTExfQ0FSRFM6IFwiXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMENFXHUzMEZDXHUzMEM4XHUzMDRCXHUzMDg5XHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDkyXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgQ1JBTV9BTExfQ0FSRFM6IFwiU2VsZWN0IGEgZGVjayB0byBjcmFtXCIsXG4gICAgUkVWSUVXX0NBUkRTX0lOX05PVEU6IFwiXHUzMDUzXHUzMDZFXHUzMENFXHUzMEZDXHUzMEM4XHUzMDZFXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDkyXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgQ1JBTV9DQVJEU19JTl9OT1RFOiBcIlx1MzA1M1x1MzA2RVx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2RVx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA5Mlx1OEE3MFx1MzA4MVx1OEZCQ1x1MzA3Rlx1NUI2Nlx1N0ZEMlx1MzA1OVx1MzA4QlwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHU3RDcxXHU4QTA4XHUzMDkyXHU5NUIyXHU4OUE3XHUzMDU5XHUzMDhCXCIsXG4gICAgU1RBVFVTX0JBUjogXCJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkM6ICR7ZHVlTm90ZXNDb3VudH1cdTMwQ0VcdTMwRkNcdTMwQzgsICR7ZHVlRmxhc2hjYXJkc0NvdW50fVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA0Q1x1NjcxRlx1NjVFNVwiLFxuICAgIFNZTkNfVElNRV9UQUtFTjogXCJcdTU0MENcdTY3MUZcdTMwNkIke3R9bXNcdTMwNEJcdTMwNEJcdTMwOEFcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA0Q1x1NzEyMVx1ODk5Nlx1MzA1OVx1MzA4Qlx1MzBENVx1MzBBOVx1MzBFQlx1MzBDMFx1MzA2Qlx1NEZERFx1NUI1OFx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OShcdThBMkRcdTVCOUFcdTMwOTJcdTc4QkFcdThBOERcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpXHUzMDAyXCIsXG4gICAgUExFQVNFX1RBR19OT1RFOlxuICAgICAgICBcIlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA5Mlx1ODg0Q1x1MzA0Nlx1MzA2Qlx1MzA2Rlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2Qlx1NUJGRVx1MzA1N1x1MzA2Nlx1NkI2M1x1MzA1N1x1MzA0Rlx1MzBCRlx1MzBCMFx1NEVEOFx1MzA1MVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NChcdThBMkRcdTVCOUFcdTMwOTJcdTc4QkFcdThBOERcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpXHUzMDAyXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiXHU3QjU0XHUzMDQ4XHUzMDkyXHU1M0Q3XHUzMDUxXHU1M0Q2XHUzMDhBXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiJHtkZWNrTmFtZX1cdTMwNkJcdTMwNkZcdTMwQzdcdTMwQzNcdTMwQURcdTMwNENcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlx1NEVDQVx1NjVFNVx1MzA2RVx1OEFCMlx1OTg0Q1x1MzA5Mlx1MzA1OVx1MzA3OVx1MzA2Nlx1OTA1NFx1NjIxMFx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1RiA6RFwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCIke2ludGVydmFsfVx1NjVFNVx1NUY4Q1wiLFxuICAgIE1PTlRIU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9XHU2NzA4XHU1RjhDXCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfVx1NUU3NFx1NUY4Q1wiLFxuICAgIERBWVNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1kXCIsXG4gICAgTU9OVEhTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9bVwiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9eVwiLFxuXG4gICAgLy8gc2V0dGluZ3MudHNcbiAgICBTRVRUSU5HU19IRUFERVI6IFwiU3BhY2VkIFJlcGV0aXRpb24gUGx1Z2luIC0gXHU4QTJEXHU1QjlBXCIsXG4gICAgQ0hFQ0tfV0lLSTogJ1x1OEE3M1x1N0QzMFx1MzA2Qlx1MzA2NFx1MzA0NFx1MzA2Nlx1MzA2RjxhIGhyZWY9XCIke3dpa2lfdXJsfVwiPndpa2k8L2E+XHUzMDkyXHU3OEJBXHU4QThEXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdTcxMjFcdTg5OTZcdTMwNTlcdTMwOEJcdTMwRDVcdTMwQTlcdTMwRUJcdTMwQzBcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICAnXHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEMwXHUzMEQxXHUzMEI5XHUzMDkyXHU2NTM5XHU4ODRDXHUzMDY3XHU1MzNBXHU1MjA3XHUzMDYzXHUzMDY2XHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCJUZW1wbGF0ZXMgTWV0YS9TY3JpcHRzXCIgXHUzMDZFXHUzMDg4XHUzMDQ2XHUzMDZBXHUzMEI5XHUzMERBXHUzMEZDXHUzMEI5XHUzMDZCXHUzMDg4XHUzMDhCXHU1MzNBXHU1MjA3XHUzMDhBXHUzMDY3XHUzMDZFXHU2NkY4XHUzMDREXHU2NUI5XHUzMDZGXHU3MTIxXHU1MkI5XHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICBGTEFTSENBUkRTOiBcIlx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIkVhc3kgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfR09PRF9MQUJFTDogXCJHb29kIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0hBUkRfTEFCRUw6IFwiSGFyZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJFYXN5XCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfR09PRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiR29vZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0hBUkRfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkhhcmRcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIlx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2Qlx1NEY3Rlx1NzUyOFx1MzA1OVx1MzA4Qlx1MzBCRlx1MzBCMFwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgICdcdTMwQkZcdTMwQjBcdTMwOTJcdTMwQjlcdTMwREFcdTMwRkNcdTMwQjlcdTMwN0VcdTMwNUZcdTMwNkZcdTY1MzlcdTg4NENcdTMwNjdcdTUzM0FcdTUyMDdcdTMwNjNcdTMwNjZcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTRGOEI6IFwiI2ZsYXNoY2FyZHMgI2RlY2syICNkZWNrM1wiJyxcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1M6IFwiXHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEMwXHUzMDkyXHUzMEM3XHUzMEMzXHUzMEFEXHUzMDY4XHUzMEI1XHUzMEQ2XHUzMEM3XHUzMEMzXHUzMEFEXHUzMDY4XHUzMDU3XHUzMDY2XHU0RjdGXHU3NTI4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6XG4gICAgICAgIFwiXHUzMDUzXHUzMDhDXHUzMDZGXHU0RTBBXHU4QTE4XHUzMDZFXHUzMEJGXHUzMEIwXHUzMDkyXHU0RjdGXHU3NTI4XHUzMDU3XHUzMDVGXHUzMEM3XHUzMEMzXHUzMEFEXHU2OUNCXHU3QkM5XHUzMDZFXHU0RUUzXHU2NkZGXHUzMDY4XHUzMDZBXHUzMDhCXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXHUzMDY3XHUzMDU5XHUzMDAyXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6XG4gICAgICAgIFwiXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU2NzAwXHU3RDQyXHU4ODRDXHUzMDY4XHU1NDBDXHU0RTAwXHUzMDZFXHU4ODRDXHUzMDZCXHUzMEI5XHUzMEIxXHUzMEI4XHUzMEU1XHUzMEZDXHUzMEVBXHUzMEYzXHUzMEIwXHUzMEIzXHUzMEUxXHUzMEYzXHUzMEM4XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJcdTMwNTNcdTMwNkVcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjNcdTMwOTJcdTY3MDlcdTUyQjlcdTUzMTZcdTMwNTlcdTMwOEJcdTMwNjhcdTMwMDFIVE1MXHUzMEIzXHUzMEUxXHUzMEYzXHUzMEM4XHUzMDZCXHUzMDg4XHUzMDYzXHUzMDY2TWFya2Rvd25cdTMwNkVcdTMwRUFcdTMwQjlcdTMwQzhcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwQzNcdTMwQzhcdTMwNENcdTVEMjlcdTMwOENcdTMwNkFcdTMwNEZcdTMwNkFcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcIixcbiAgICBCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVk6IFwiXHU2QjIxXHUzMDZFXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDdFXHUzMDY3XHUzMEI3XHUzMEQ2XHUzMEVBXHUzMEYzXHUzMEIwXHUzMDkyXHU1RUY2XHU2NzFGXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiXHUzMEI3XHUzMEQ2XHUzMEVBXHUzMEYzXHUzMEIwXHUzMDZGXHU1NDBDXHU0RTAwXHUzMDZFXHUzMEFCXHUzMEZDXHUzMEM5XHUzMEM2XHUzMEFEXHUzMEI5XHUzMEM4XHUzMDRCXHUzMDg5XHU3NTFGXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDVGXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDAxXHUzMDY0XHUzMDdFXHUzMDhBXHU3QTc0XHU1N0NCXHUzMDgxXHU1NTRGXHU5ODRDXHUzMDZFXHU2RDNFXHU3NTFGXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDY3XHUzMDU5XHUzMDAyXCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFQ6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZCXHUzMEIzXHUzMEYzXHUzMEM2XHUzMEFEXHUzMEI5XHUzMEM4XHUzMDkyXHU4ODY4XHU3OTNBXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzpcbiAgICAgICAgXCJcdUZGNjJcdTMwQkZcdTMwQTRcdTMwQzhcdTMwRUIgPiBcdTg5OEJcdTUxRkFcdTMwNTcgMSA+IFx1NTI2Rlx1ODk4Qlx1NTFGQVx1MzA1NyA+IC4uLiA+IFx1NTI2Rlx1ODk4Qlx1NTFGQVx1MzA1N1x1RkY2M1x1MzA2RVx1ODg2OFx1NzkzQVx1MzA5Mlx1ODg0Q1x1MzA0Nlx1MzA0Qlx1MzA2OVx1MzA0Nlx1MzA0Qlx1MzA5Mlx1NkM3QVx1MzA4MVx1MzA3RVx1MzA1OVx1MzAwMlwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU3RTI2XHUzMEI1XHUzMEE0XHUzMEJBXHUzMDZFXHUzMEQxXHUzMEZDXHUzMEJCXHUzMEYzXHUzMEM2XHUzMEZDXHUzMEI4XCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzpcbiAgICAgICAgXCJcdTMwRTJcdTMwRDBcdTMwQTRcdTMwRUJcdTcyNDhcdTMwMDFcdTMwN0VcdTMwNUZcdTMwNkZcdTk3NUVcdTVFMzhcdTMwNkJcdTU5MjdcdTMwNERcdTMwNkFcdTMwQjVcdTMwQTRcdTMwQkFcdTMwNkVcdTc1M0JcdTUwQ0ZcdTMwNENcdTMwNDJcdTMwOEJcdTU4MzRcdTU0MDhcdTMwNkJcdTMwNkYxMDAlXHUzMDZCXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyXCIsXG4gICAgUkVTRVRfREVGQVVMVDogXCJcdTMwQzdcdTMwRDVcdTMwQTlcdTMwRUJcdTMwQzhcdTUwMjRcdTMwNkJcdTMwRUFcdTMwQkJcdTMwQzNcdTMwQzhcdTMwNTlcdTMwOEJcIixcbiAgICBDQVJEX01PREFMX1dJRFRIX1BFUkNFTlQ6IFwiXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU2QTJBXHUzMEI1XHUzMEE0XHUzMEJBXHUzMDZFXHUzMEQxXHUzMEZDXHUzMEJCXHUzMEYzXHUzMEM2XHUzMEZDXHUzMEI4XCIsXG4gICAgUkFORE9NSVpFX0NBUkRfT1JERVI6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHU0RTJEXHUzMDZFXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU5ODA2XHU3NTZBXHUzMDkyXHUzMEU5XHUzMEYzXHUzMEMwXHUzMEUwXHUzMDZCXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJcdTdBNzRcdTU3Q0JcdTMwODFcdTMwQUJcdTMwRkNcdTMwQzlcdTMwOTJcdTcxMjFcdTUyQjlcdTUzMTZcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUZcIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIj09XHUzMENGXHUzMEE0XHUzMEU5XHUzMEE0XHUzMEM4PT1cdTMwOTJcdTdBNzRcdTU3Q0JcdTMwODFcdTMwNjhcdTMwNTdcdTMwNjZcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUZcIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiKipcdTMwRENcdTMwRkNcdTMwRUJcdTMwQzlcdTRGNTMqKlx1MzA5Mlx1N0E3NFx1NTdDQlx1MzA4MVx1MzA2OFx1MzA1N1x1MzA2Nlx1NEY3Rlx1NzUyOFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRlwiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcInt7XHU0RTJEXHU2MkVDXHU1RjI3fX1cdTMwOTJcdTdBNzRcdTU3Q0JcdTMwODFcdTMwNjhcdTMwNTdcdTMwNjZcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUZcIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MzBBNFx1MzBGM1x1MzBFOVx1MzBBNFx1MzBGM1x1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2Qlx1NEY3Rlx1NzUyOFx1MzA1OVx1MzA4Qlx1MzBCQlx1MzBEMVx1MzBFQ1x1MzBGQ1x1MzBCRlx1MzBGQ1wiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiXHUzMDUzXHUzMDZFXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZCXHUzMDZGXHUzMDAxXHU0RjVDXHU2MjEwXHU2RTA4XHUzMDdGXHUzMDZFXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDkyXHU2MjRCXHU1MkQ1XHUzMDY3XHU3REU4XHU5NkM2XHUzMDU3XHU3NkY0XHUzMDU5XHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZCXHU2Q0U4XHU2MTBGXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgSU5MSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUjogXCJcdTMwQTRcdTMwRjNcdTMwRTlcdTMwQTRcdTMwRjNcdTMwNkVcdTg4NjhcdTg4Q0ZcdTUzQ0RcdThFRTJcdTMwRDVcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNkJcdTRGN0ZcdTc1MjhcdTMwNTlcdTMwOEJcdTMwQkJcdTMwRDFcdTMwRUNcdTMwRkNcdTMwQkZcdTMwRkNcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1ODkwN1x1NjU3MFx1ODg0Q1x1MzA2RVx1MzBENVx1MzBFOVx1MzBDM1x1MzBCN1x1MzBFNVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA2Qlx1NEY3Rlx1NzUyOFx1MzA1OVx1MzA4Qlx1MzBCQlx1MzBEMVx1MzBFQ1x1MzBGQ1x1MzBCRlx1MzBGQ1wiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHU4OTA3XHU2NTcwXHU4ODRDXHUzMDZFXHU4ODY4XHU4OENGXHU1M0NEXHU4RUUyXHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZCXHU0RjdGXHU3NTI4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMEQxXHUzMEVDXHUzMEZDXHUzMEJGXHUzMEZDXCIsXG4gICAgTk9URVM6IFwiXHUzMENFXHUzMEZDXHUzMEM4XCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDZCXHU0RjdGXHU3NTI4XHUzMDU5XHUzMDhCXHUzMEJGXHUzMEIwXCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzpcbiAgICAgICAgJ1x1MzBCRlx1MzBCMFx1MzA5Mlx1MzBCOVx1MzBEQVx1MzBGQ1x1MzBCOVx1MzA3RVx1MzA1Rlx1MzA2Rlx1NjUzOVx1ODg0Q1x1MzA2N1x1NTMzQVx1NTIwN1x1MzA2M1x1MzA2Nlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NEY4QjogXCIjcmV2aWV3ICN0YWcyICN0YWczXCInLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiXHUzMEU5XHUzMEYzXHUzMEMwXHUzMEUwXHUzMDZCXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkyXHU5NThCXHUzMDQ0XHUzMDY2XHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDU5XHUzMDhCXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOlxuICAgICAgICBcIlx1MzA1M1x1MzA2RVx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM1x1MzA0Q1x1NzEyMVx1NTJCOVx1NTMxNlx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NzJCNlx1NjE0Qlx1MzA2N1x1MzA2Rlx1MzAwMVx1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2Rlx1OTFDRFx1ODk4MVx1NUVBNihcdTMwREFcdTMwRkNcdTMwQjhcdTMwRTlcdTMwRjNcdTMwQUYpXHUzMDZCXHUzMDg4XHUzMDhCXHU5ODA2XHU3NTZBXHUzMDY3XHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHU1RjhDXHUzMDZCXHU2QjIxXHUzMDZFXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkyXHU4MUVBXHU1MkQ1XHU3Njg0XHUzMDZCXHU5NThCXHUzMDRGXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMEUxXHUzMENCXHUzMEU1XHUzMEZDXHUzMDY3XHUzMDZFXHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXHUzMDkyXHU3MTIxXHU1MkI5XHU1MzE2KFx1RkY2Mlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQzogRWFzeVx1RkY2M1x1N0I0OVx1MzA2RVx1OTgwNVx1NzZFRVx1MzA5Mlx1OTc1RVx1ODg2OFx1NzkzQVx1MzA2Qlx1MzA1OVx1MzA4QilcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIlx1NzEyMVx1NTJCOVx1NTMxNlx1MzA1N1x1MzA1Rlx1NUY4Q1x1MzAwMVx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzBEQlx1MzBDM1x1MzBDOFx1MzBBRFx1MzBGQ1x1MzA5Mlx1NEY3Rlx1MzA2M1x1MzA2Nlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA1OVx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA0Q1x1NTNFRlx1ODBGRFx1MzA2Qlx1MzA2QVx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMlx1MzA1M1x1MzA2RVx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM1x1MzA5Mlx1NTkwOVx1NjZGNFx1MzA1N1x1MzA1Rlx1NTgzNFx1NTQwOFx1MzA2Qlx1MzA2Rk9ic2lkaWFuXHUzMDkyXHUzMEVBXHUzMEVEXHUzMEZDXHUzMEM5XHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHU1M0YzXHUzMEQxXHUzMENEXHUzMEVCXHUzMDZCXHU4ODY4XHU3OTNBXHUzMDU5XHUzMDhCXHU2NzAwXHU1OTI3XHUzMDZFXHU2NUU1XHU2NTcwXCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHU2NUU1XHU2NTcwXHUzMDZCXHUzMDZGMVx1NEVFNVx1NEUwQVx1MzA2RVx1NjU3MFx1NUI1N1x1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1NjcwOVx1NTJCOVx1MzA2QVx1NjU3MFx1NUI1N1x1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlx1MzBFNlx1MzBGQ1x1MzBCNlx1MzBGQyBcdTMwQTRcdTMwRjNcdTMwQkZcdTMwRkNcdTMwRDVcdTMwQTdcdTMwQTRcdTMwQjlcdTMwNkVcdThBMkRcdTVCOUFcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6IFwiXHUzMEM3XHUzMEMzXHUzMEFEIFx1MzBDNFx1MzBFQVx1MzBGQ1x1MzA2Rlx1NjcwMFx1NTIxRFx1MzA2Rlx1NUM1NVx1OTU4Qlx1MzA1N1x1MzA2Nlx1ODg2OFx1NzkzQVx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRV9ERVNDOlxuICAgICAgICBcIlx1MzA1M1x1MzA4Q1x1MzA5Mlx1MzBBQVx1MzBENVx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzA2OFx1MzAwMVx1NTQwQ1x1MzA1OFx1MzBBQlx1MzBGQ1x1MzBDOVx1NTE4NVx1MzA2RVx1MzBDRFx1MzBCOVx1MzBDOFx1MzA1NVx1MzA4Q1x1MzA1Rlx1MzBDN1x1MzBDM1x1MzBBRFx1MzA0Q1x1NjI5OFx1MzA4QVx1MzA1Rlx1MzA1Rlx1MzA3RVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NTQwQ1x1MzA1OFx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2Qlx1NTkxQVx1MzA0Rlx1MzA2RVx1MzBDN1x1MzBDM1x1MzBBRFx1MzA2Qlx1NUM1RVx1MzA1OVx1MzA4Qlx1MzBBQlx1MzBGQ1x1MzBDOVx1MzA0Q1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1NEZCRlx1NTIyOVx1MzA2N1x1MzA1OVx1MzAwMlwiLFxuICAgIEFMR09SSVRITTogXCJcdTMwQTJcdTMwRUJcdTMwQjRcdTMwRUFcdTMwQkFcdTMwRTBcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTpcbiAgICAgICAgJ1x1OEE3M1x1N0QzMFx1MzA2Qlx1MzA2NFx1MzA0NFx1MzA2Nlx1MzA2RjxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPlx1MzBBMlx1MzBFQlx1MzBCNFx1MzBFQVx1MzBCQVx1MzBFMFx1MzA2RVx1NUI5Rlx1ODhDNTwvYT5cdTMwOTJcdTc4QkFcdThBOERcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDInLFxuICAgIEJBU0VfRUFTRTogXCJcdTMwRDlcdTMwRkNcdTMwQjlcdTMwNkVcdTY2MTNcdTMwNTdcdTMwNTVcIixcbiAgICBCQVNFX0VBU0VfREVTQzogXCJcdTY3MDBcdTVDMEZcdTUwMjRcdTMwNkYxMzBcdTMwNjdcdTMwNTlcdTMwNENcdTMwMDEgXHU5MDY5XHU2QjYzXHU1MDI0XHUzMDZGXHUzMDRBXHUzMDRBXHUzMDg4XHUzMDVEMjUwXHUzMDY3XHUzMDU5XHUzMDAyXCIsXG4gICAgQkFTRV9FQVNFX01JTl9XQVJOSU5HOiBcIlx1MzBEOVx1MzBGQ1x1MzBCOVx1MzA2RVx1NjYxM1x1MzA1N1x1MzA1NVx1MzA2Qlx1MzA2RjEzMFx1NEVFNVx1NEUwQVx1MzA2RVx1NjU3MFx1NUI1N1x1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRTogXCJcdTMwRDVcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTMwQUJcdTMwRkNcdTMwQzkvXHUzMENFXHUzMEZDXHUzMEM4XHUzMDkySGFyZFx1MzA2OFx1MzA1N1x1MzA2Nlx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA1N1x1MzA1Rlx1OTY5Qlx1MzA2RVx1OTU5M1x1OTY5NFx1NTkwOVx1NjZGNFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiAnXCJcdTY1QjBcdTMwNTdcdTMwNDRcdTk1OTNcdTk2OTQgPSBcdTRFRTVcdTUyNERcdTMwNkVcdTk1OTNcdTk2OTQgKiBcdTk1OTNcdTk2OTRcdTU5MDlcdTY2RjQgLyAxMDBcIiBcdTMwNjhcdTMwNTdcdTMwNjZcdThBMDhcdTdCOTdcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgIEVBU1lfQk9OVVM6IFwiRWFzeVx1MzBEQ1x1MzBGQ1x1MzBDQVx1MzBCOVwiLFxuICAgIEVBU1lfQk9OVVNfREVTQzpcbiAgICAgICAgXCJFYXN5XHUzMERDXHUzMEZDXHUzMENBXHUzMEI5XHUzMDZCXHUzMDg4XHUzMDYzXHUzMDY2XHUzMEQ1XHUzMEU5XHUzMEMzXHUzMEI3XHUzMEU1XHUzMEFCXHUzMEZDXHUzMEM5L1x1MzBDRVx1MzBGQ1x1MzBDOFx1MzA2Qlx1MzA0QVx1MzA1MVx1MzA4Qlx1OTU5M1x1OTY5NFx1MzA2RVx1NURFRVx1NTIwNlx1MzA5Mlx1OEEyRFx1NUI5QVx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1OShcdTY3MDBcdTVDMEZcdTUwMjQgPSAxMDAlKVx1MzAwMlwiLFxuICAgIEVBU1lfQk9OVVNfTUlOX1dBUk5JTkc6IFwiRWFzeVx1MzBEQ1x1MzBGQ1x1MzBDQVx1MzBCOVx1MzA2Qlx1MzA2RjEwMFx1NEVFNVx1NEUwQVx1MzA2RVx1NjU3MFx1NUI1N1x1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlwiLFxuICAgIE1BWF9JTlRFUlZBTDogXCJcdTk1OTNcdTk2OTRcdTMwNkVcdTY3MDBcdTU5MjdcdTUwMjRcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJcdTk1OTNcdTk2OTRcdTMwNkJcdTRFMEFcdTk2NTBcdTUwMjRcdTMwOTJcdThBMkRcdTVCOUFcdTMwNTlcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNENcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTkoXHUzMEM3XHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEM4XHU1MDI0ID0gMTAwXHU1RTc0KVx1MzAwMlwiLFxuICAgIE1BWF9JTlRFUlZBTF9NSU5fV0FSTklORzogXCJcdTk1OTNcdTk2OTRcdTMwNkVcdTY3MDBcdTU5MjdcdTUwMjRcdTMwNkJcdTMwNkYxXHU0RUU1XHU0RTBBXHUzMDZFXHU2NTcwXHU1QjU3XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJcdTMwRUFcdTMwRjNcdTMwQUZcdTMwQjNcdTMwRjNcdTMwQzhcdTMwRUFcdTMwRDNcdTMwRTVcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNkVcdTY3MDBcdTU5MjdcdTUwMjRcIixcbiAgICBNQVhfTElOS19DT05UUklCX0RFU0M6XG4gICAgICAgIFwiXHU2NzAwXHU1MjFEXHUzMDZFXHU2NjEzXHUzMDU3XHUzMDU1XHUzMDZCXHU1QkZFXHUzMDU3XHUzMDY2XHUzMDAxXHUzMEVBXHUzMEYzXHUzMEFGXHUzMDU1XHUzMDhDXHUzMDVGXHUzMENFXHUzMEZDXHUzMEM4XHUzMDZFXHU5MUNEXHUzMDdGXHU0RUQ4XHUzMDUxXHUzMDU1XHUzMDhDXHUzMDVGXHU2NjEzXHUzMDU3XHUzMDU1XHUzMDRDXHU1QkM0XHU0RTBFXHUzMDU5XHUzMDhCXHU2NzAwXHU1OTI3XHU1MDI0XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXCIsXG4gICAgTE9HR0lORzogXCJcdTMwRURcdTMwQjBcdTdCQTFcdTc0MDZcIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiXHUzMEM3XHUzMEQ5XHUzMEVEXHUzMEMzXHUzMEQxXHUzMEZDXHUzMEIzXHUzMEYzXHUzMEJEXHUzMEZDXHUzMEVCXHUzMDZCXHUzMDY2XHUzMEM3XHUzMEQwXHUzMEMzXHUzMEIwXHU2MEM1XHU1ODMxXHUzMDkyXHU4ODY4XHU3OTNBXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGXCIsXG5cbiAgICAvLyBzaWRlYmFyLnRzXG4gICAgTk9URVNfUkVWSUVXX1FVRVVFOiBcIlx1MzBDRVx1MzBGQ1x1MzBDOFx1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1MzA2RVx1MzBBRFx1MzBFNVx1MzBGQ1wiLFxuICAgIENMT1NFOiBcIlx1OTU4OVx1MzA1OFx1MzA4QlwiLFxuICAgIE5FVzogXCJcdTY1QjBcdTg5OEZcIixcbiAgICBZRVNURVJEQVk6IFwiXHU2NjI4XHU2NUU1XCIsXG4gICAgVE9EQVk6IFwiXHU0RUNBXHU2NUU1XCIsXG4gICAgVE9NT1JST1c6IFwiXHU2NjBFXHU2NUU1XCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJcdTdENzFcdThBMDhcIixcbiAgICBNT05USDogXCJNb250aFwiLFxuICAgIFFVQVJURVI6IFwiUXVhcnRlclwiLFxuICAgIFlFQVI6IFwiWWVhclwiLFxuICAgIExJRkVUSU1FOiBcIkxpZmV0aW1lXCIsXG4gICAgRk9SRUNBU1Q6IFwiXHU0RTg4XHU2RTJDXCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJcdTVGQTlcdTdGRDJcdTY3MUZcdTY1RTVcdTMwNENcdTY3NjVcdTMwOEJcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNkVcdTY3OUFcdTY1NzBcIixcbiAgICBTQ0hFRFVMRUQ6IFwiXHUzMEI5XHUzMEIxXHUzMEI4XHUzMEU1XHUzMEZDXHUzMEVBXHUzMEYzXHUzMEIwXHU2RTA4XHUzMDdGXCIsXG4gICAgREFZUzogXCJcdTY1RTVcIixcbiAgICBOVU1CRVJfT0ZfQ0FSRFM6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHU2NTcwXCIsXG4gICAgUkVWSUVXU19QRVJfREFZOiBcIlx1NUU3M1x1NTc0NzogJHthdmd9XHUzMEVDXHUzMEQzXHUzMEU1XHUzMEZDL1x1NjVFNVwiLFxuICAgIElOVEVSVkFMUzogXCJcdTk1OTNcdTk2OTRcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJcdTZCMjFcdTMwNkVcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTRFODhcdTVCOUFcdTY1RTVcIixcbiAgICBDT1VOVDogXCJcdTMwQUJcdTMwQTZcdTMwRjNcdTMwQzhcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJcdTk1OTNcdTk2OTRcdTMwNkVcdTVFNzNcdTU3NDdcdTUwMjQ6ICR7YXZnfSwgXHU2NzAwXHU5NTc3XHUzMDZFXHU5NTkzXHU5Njk0OiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiXHU2NjEzXHUzMDU3XHUzMDU1XCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJcdTY2MTNcdTMwNTdcdTMwNTVcdTMwNkVcdTVFNzNcdTU3NDdcdTUwMjQ6ICR7YXZnRWFzZX1cIixcbiAgICBDQVJEX1RZUEVTOiBcIlx1MzBBQlx1MzBGQ1x1MzBDOVx1MzBCRlx1MzBBNFx1MzBEN1wiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdTVFRjZcdTY3MUZcdTMwNkVcdTMwQUJcdTMwRkNcdTMwQzlcdTMwNENcdTMwNDJcdTMwOEJcdTU4MzRcdTU0MDhcdTMwNkJcdTMwNkZcdTMwNTNcdTMwOENcdTMwNkJcdTU0MkJcdTMwN0VcdTMwOENcdTMwN0VcdTMwNTlcIixcbiAgICBDQVJEX1RZUEVfTkVXOiBcIlx1NjVCMFx1ODk4RlwiLFxuICAgIENBUkRfVFlQRV9ZT1VORzogXCJcdTVGQTlcdTdGRDIoXHU1MjFEXHU2NzFGKVwiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiXHU1RkE5XHU3RkQyKFx1NUY4Q1x1NjcxRilcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiXHUzMEFCXHUzMEZDXHUzMEM5XHUzMDZFXHU1NDA4XHU4QTA4OiAke3RvdGFsQ2FyZHNDb3VudH1cdTY3OUFcIixcbn07XG4iLCAiLy8gXHVENTVDXHVBRDZEXHVDNUI0XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiXHVCMzcxXCIsXG4gICAgRFVFX0NBUkRTOiBcIlx1QjJFNFx1QzJEQyBcdUJDRkMgXHVDRTc0XHVCNERDXHVCNEU0XCIsXG4gICAgTkVXX0NBUkRTOiBcIlx1QzBDOFx1Qjg1Q1x1QzZCNCBcdUNFNzRcdUI0RENcdUI0RTRcIixcbiAgICBUT1RBTF9DQVJEUzogXCJcdUM4MDRcdUNDQjQgXHVDRTc0XHVCNERDXHVCNEU0XCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiXHVDRTc0XHVCNERDXHVDNzU4IFx1QzlDNFx1RDU4OVx1QzBDMVx1RDY2OVx1Qzc0NCBcdUNEMDhcdUFFMzBcdUQ2NTRcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgSEFSRDogXCJcdUM1QjRcdUI4MjRcdUM2QzAoSGFyZClcIixcbiAgICBHT09EOiBcIlx1Qzg4Qlx1Qzc0QyhHb29kKVwiLFxuICAgIEVBU1k6IFwiXHVDMjZDXHVDNkMwKEVhc3kpXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHVDODE1XHVCMkY1IFx1RDY1NVx1Qzc3OFx1RDU1OFx1QUUzMFwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiXHVDRTc0XHVCNERDXHVDNzU4IFx1QzlDNFx1RDU4OVx1QzBDMVx1RDY2OVx1Qzc3NCBcdUNEMDhcdUFFMzBcdUQ2NTRcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuXCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIlx1QjlBQ1x1QkRGMFx1RDU2MCBcdUIxNzhcdUQyQjggXHVDNUY0XHVBRTMwXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQyBcdUI5QUNcdUJERjBcIixcbiAgICBSRVZJRVdfRUFTWV9GSUxFX01FTlU6IFwiXHVCOUFDXHVCREYwOiBcdUMyNkNcdUM2QzAoRWFzeSlcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiXHVCOUFDXHVCREYwOiBcdUM4OEJcdUM3NEMoR29vZClcIixcbiAgICBSRVZJRVdfSEFSRF9GSUxFX01FTlU6IFwiXHVCOUFDXHVCREYwOiBcdUM1QjRcdUI4MjRcdUM2QzAoSGFyZClcIixcbiAgICBSRVZJRVdfTk9URV9FQVNZX0NNRDogXCJcdUIxNzhcdUQyQjhcdUI5N0MgXHVDMjZDXHVDNkMwKGVhc3kpXHVDNzNDXHVCODVDIFx1QjlBQ1x1QkRGMFx1RDU2OVx1QjJDOFx1QjJFNFwiLFxuICAgIFJFVklFV19OT1RFX0dPT0RfQ01EOiBcIlx1QjE3OFx1RDJCOFx1Qjk3QyBcdUM4OEJcdUM3NEMoZ29vZClcdUM3M0NcdUI4NUMgXHVCOUFDXHVCREYwXHVENTY5XHVCMkM4XHVCMkU0XCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiXHVCMTc4XHVEMkI4XHVCOTdDIFx1QzVCNFx1QjgyNFx1QzZDMChoYXJkKVx1QzczQ1x1Qjg1QyBcdUI5QUNcdUJERjBcdUQ1NjlcdUIyQzhcdUIyRTRcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlx1QkFBOFx1QjRFMCBcdUIxNzhcdUQyQjhcdUI0RTRcdUM3NTggXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXHVCNEU0XHVDNzQ0IFx1QjlBQ1x1QkRGMFx1RDU2OVx1QjJDOFx1QjJFNFwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1Qzc3NCBcdUIxNzhcdUQyQjhcdUM3NTggXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXHVCNEU0XHVDNzQ0IFx1QjlBQ1x1QkRGMFx1RDU2OVx1QjJDOFx1QjJFNFwiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJcdUM3NzQgXHVCMTc4XHVEMkI4XHVDNzU4IFx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQ1x1QjRFNFx1Qzc0NCBcdUJDQkNcdUI3N0RcdUNFNThcdUFFMzBcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgVklFV19TVEFUUzogXCJcdUQxQjVcdUFDQzQgXHVENjU1XHVDNzc4XCIsXG4gICAgU1RBVFVTX0JBUjogXCItLVx1QjlBQ1x1QkRGMDogJHtkdWVOb3Rlc0NvdW50fSBcdUIxNzhcdUQyQjgsICR7ZHVlRmxhc2hjYXJkc0NvdW50fSBcdUNFNzRcdUI0REMgXHVCMEE4XHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LlwiLFxuICAgIFNZTkNfVElNRV9UQUtFTjogXCJcdUIzRDlcdUFFMzBcdUQ2NTRcdUM1RDAgJHt0fVx1QkMwMFx1QjlBQ1x1Q0QwOCBcdUFDNzhcdUI4MzhcdUMyQjVcdUIyQzhcdUIyRTRcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIlx1QjE3OFx1RDJCOFx1QUMwMCBcdUJCMzRcdUMyRENcdUI0MUMgXHVEM0Y0XHVCMzU0IFx1QzU0NFx1Qjc5OFx1QzVEMCBcdUM4MDBcdUM3QTVcdUI0MThcdUM1QjQgXHVDNzg4XHVDMkI1XHVCMkM4XHVCMkU0LiAoXHVDMTI0XHVDODE1XHVDNzQ0IFx1RDY1NVx1Qzc3OFx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NClcIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiXHVCOUFDXHVCREYwXHVCOTdDIFx1RDU1OFx1QUUzMFx1QzcwNFx1RDU3NCBcdUIxNzhcdUQyQjhcdUM1RDAgXHVDODAxXHVDODA4XHVENzg4IFx1RDBEQ1x1QURGOFx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4gKFx1QzEyNFx1QzgxNVx1Qzc0NCBcdUQ2NTVcdUM3NzhcdUQ1NzRcdUM4RkNcdUMxMzhcdUM2OTQpXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiXHVDNjk0XHVDQ0FEXHVDNzc0IFx1QzY0NFx1QjhDQ1x1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNFwiLFxuICAgIE5PX0RFQ0tfRVhJU1RTOiBcIiR7ZGVja05hbWV9XHVDNzc0XHVCNzdDXHVCMjk0IFx1Qzc3NFx1Qjk4NFx1Qzc1OCBcdUIzNzFcdUM3NzQgXHVDODc0XHVDN0FDXHVENTU4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC5cIixcbiAgICBBTExfQ0FVR0hUX1VQOiBcIlx1QkFBOFx1QjQ1MCBcdUQ2NTVcdUM3NzhcdUQ1ODhcdUMyQjVcdUIyQzhcdUIyRTQuIDpEXCIsXG5cbiAgICAvLyBzY2hlZHVsaW5nLnRzXG4gICAgREFZU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1Qzc3QyBcdUQ2QzRcIixcbiAgICBNT05USFNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdUFDMUNcdUM2RDQgXHVENkM0XCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdUIxNDQgXHVENkM0XCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfWRcIixcbiAgICBNT05USFNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1tXCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH15XCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBQbHVnaW4gLSBcdUMxMjRcdUM4MTVcIixcbiAgICBDSEVDS19XSUtJOiAnXHVCMzU0IFx1QjlDRVx1Qzc0MCBcdUM4MTVcdUJDRjRcdUI5N0MgXHVDNkQwXHVENTU4XHVDMkRDXHVCQTc0LCA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPlx1Qjk3QyBcdUQ2NTVcdUM3NzhcdUQ1NzRcdUM4RkNcdUMxMzhcdUM2OTQuJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdUJCMzRcdUMyRENcdUQ1NjAgXHVEM0Y0XHVCMzU0XHVCNEU0XCIsXG4gICAgRk9MREVSU19UT19JR05PUkVfREVTQzpcbiAgICAgICAgXCJcdUQzRjRcdUIzNTQgXHVBQ0JEXHVCODVDXHVCOTdDIFx1QkU0OCBcdUM5MDRcdUI4NUMgXHVBRDZDXHVCRDg0XHVENTc0XHVDMTFDIFx1Qzc4NVx1QjgyNVx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4gJ1RlbXBsYXRlcyBNZXRhL1NjcmlwdHMnIFx1QzY0MCBcdUFDMTlcdUM3NzQgXHVDNzg1XHVCODI1XHVENTU4XHVCMjk0IFx1QUM4M1x1Qzc0MCBcdUM3MjBcdUQ2QThcdUQ1NThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LlwiLFxuICAgIEZMQVNIQ0FSRFM6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiRWFzeSBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIkdvb2QgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfSEFSRF9MQUJFTDogXCJIYXJkIEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkVhc3lcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9HT09EX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJHb29kXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiSGFyZFwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1RDBEQ1x1QURGOFwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiXHVEMERDXHVBREY4XHVCOTdDIFx1QUNGNVx1QkMzMSBcdUI2MTBcdUIyOTQgXHVCRTQ4IFx1QzkwNFx1Qjg1QyBcdUFENkNcdUJEODRcdUQ1NzRcdUMxMUMgXHVDNzg1XHVCODI1XHVENTc0XHVDOEZDXHVDMTM4XHVDNjk0LiBcdUM2MDgpICcjZmxhc2hjYXJkcyAjZGVjazIgI2RlY2szJ1wiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJcdUQzRjRcdUIzNTRcdUI5N0MgXHVCMzcxXHVBQ0ZDIFx1QzExQ1x1QkUwQ1x1QjM3MVx1QzczQ1x1Qjg1QyBcdUMwQUNcdUM2QTlcdUQ1NjBcdUFFNENcdUM2OTQ/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiXHVDNzc0IFx1QUUzMFx1QjJBNVx1Qzc0MCBcdUM3MDRcdUM3NTggXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1RDBEQ1x1QURGOCBcdUM2MzVcdUMxNThcdUM3NDQgXHVCMzAwXHVDQ0I0XHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIElOTElORV9TQ0hFRFVMSU5HX0NPTU1FTlRTOlxuICAgICAgICBcIlx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQ1x1Qzc1OCBcdUI5QzhcdUM5QzBcdUI5QzkgXHVDOTA0XHVBQ0ZDIFx1QjNEOVx1Qzc3Q1x1RDU1QyBcdUM5MDRcdUM1RDAgXHVDMkE0XHVDRjAwXHVDOTA0XHVCOUMxIFx1Q0Y1NFx1QkE1OFx1RDJCOFx1Qjk3QyBcdUM4MDBcdUM3QTVcdUQ1NThcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJcdUM3NzQgXHVDNjM1XHVDMTU4XHVDNzQ0IFx1QzBBQ1x1QzZBOVx1RDU1OFx1QkE3NCBIVE1MIFx1QzhGQ1x1QzExRFx1Qzc3NCBcdUJBQTlcdUI4NURcdUM3NTggXHVEM0VDXHVCOUU0XHVEMzA1XHVDNzQ0IFx1QkIzNFx1QjEwOFx1RDJCOFx1QjlBQ1x1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZOiBcIlNpYmxpbmcgXHVDRTc0XHVCNERDXHVCOTdDIFx1QjJFNFx1Qzc0Q1x1QjBBMFx1QUU0Q1x1QzlDMCBcdUJCM0JcdUM1QjRcdUI0NTBcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiU2libGluZyBcdUNFNzRcdUI0RENcdUIyOTQgXHVCM0Q5XHVDNzdDXHVENTVDIFx1Q0U3NFx1QjREQyBcdUQxNERcdUMyQTRcdUQyQjhcdUM1RDBcdUMxMUMgXHVDMEREXHVDMTMxXHVCNDFDIFx1Q0U3NFx1QjREQ1x1Qzc4NVx1QjJDOFx1QjJFNC4gaS5lLiBjbG96ZSBkZWxldGlvbnNcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJcdUNFNzRcdUI0RENcdUM3NTggXHVCQjM4XHVCOUU1KGNvbnRleHQpXHVDNzQ0IFx1RDQ1Q1x1QzJEQ1x1RDU1OFx1QzJEQ1x1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz9cIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVF9ERVNDOlxuICAgICAgICBcIlx1Q0U3NFx1QjREQ1x1QzVEMFx1QzExQyAnVGl0bGUgPiBIZWFkaW5nIDEgPiBTdWJoZWFkaW5nID4gLi4uID4gU3ViaGVhZGluZycgXHVDNzU4IFx1RDQ1Q1x1QzJEQ1x1Qjk3QyBcdUQ1NjBcdUM5QzAgXHVDMTI0XHVDODE1XHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1QjE5Mlx1Qzc3NCBcdUJFNDRcdUM3MjhcIixcbiAgICBDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDOlxuICAgICAgICBcIlx1QkFBOFx1QkMxNFx1Qzc3QyBcdUJDODRcdUM4MDQgXHVENjM5XHVDNzQwIFx1QjlFNFx1QzZCMCBcdUQwNzAgXHVDNzc0XHVCQkY4XHVDOUMwXHVBQzAwIFx1Qzc4OFx1QjI5NCBcdUFDQkRcdUM2QjAgMTAwJVx1Qjg1QyBcdUMxMjRcdUM4MTVcdUQ1NzRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiXHVBRTMwXHVCQ0Y4XHVBQzEyXHVDNzNDXHVCODVDIFx1Q0QwOFx1QUUzMFx1RDY1NFwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJcdUQ1MENcdUI3OThcdUMyRENcdUNFNzRcdUI0REMgXHVCMTA4XHVCRTQ0IFx1QkU0NFx1QzcyOFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlx1QjlBQ1x1QkRGMFx1QzkxMVx1Qzc3OCBcdUNFNzRcdUI0RENcdUM3NTggXHVDMjFDXHVDMTFDXHVCOTdDIFx1Qjc5Q1x1QjM2NFx1QzczQ1x1Qjg1QyBcdUI0NTBcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJcdUJFNDggXHVDRTc4IFx1Q0M0NFx1QzZCMFx1QUUzMCBcdUNFNzRcdUI0RENcdUI5N0MgXHVCRTQ0XHVENjVDXHVDMTMxXHVENjU0XHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuICAgIENPTlZFUlRfSElHSExJR0hUU19UT19DTE9aRVM6IFwiPT1oaWdodGxpZ2h0cz09IFx1Qjk3QyBcdUJFNDggXHVDRTc4IFx1Q0M0NFx1QzZCMFx1QUUzMFx1Qjg1QyBcdUM4MDRcdUQ2NThcdUQ1NThcdUMyRENcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/XCIsXG4gICAgQ09OVkVSVF9CT0xEX1RFWFRfVE9fQ0xPWkVTOiBcIioqYm9sZGVkIHRleHQqKiBcdUI5N0MgXHVCRTQ4IFx1Q0U3OCBcdUNDNDRcdUM2QjBcdUFFMzBcdUI4NUMgXHVDODA0XHVENjU4XHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuICAgIENPTlZFUlRfQ1VSTFlfQlJBQ0tFVFNfVE9fQ0xPWkVTOiBcInt7Y3VybHkgYnJhY2tldHN9fSBcdUI5N0MgXHVCRTQ4IFx1Q0U3OCBcdUNDNDRcdUM2QjBcdUFFMzBcdUI4NUMgXHVDODA0XHVENjU4XHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuICAgIElOTElORV9DQVJEU19TRVBBUkFUT1I6IFwiXHVDNzc4XHVCNzdDXHVDNzc4IFx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQyBcdUFENkNcdUJEODRcdUM3OTBcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOlxuICAgICAgICBcIlx1QzhGQ1x1Qzc1ODogXHVDNzc0IFx1QzYzNVx1QzE1OFx1Qzc0NCBcdUMyMThcdUM4MTVcdUQ1NUMgXHVENkM0XHVDNUQwXHVCMjk0IFx1Qzc3NFx1QkJGOCBcdUM3OTFcdUMxMzFcdUI0MUMgXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDXHVCOTdDIFx1QzIxOFx1QjNEOVx1QzczQ1x1Qjg1QyBcdUMyMThcdUM4MTVcdUQ1NzRcdUM1N0MgXHVENTY4XHVDNzQ0IFx1QzhGQ1x1Qzc1OFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC5cIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1Qzc3OFx1Qjc3Q1x1Qzc3OCBcdUJDMThcdUM4MDQgXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDIFx1QUQ2Q1x1QkQ4NFx1Qzc5MFwiLFxuICAgIE1VTFRJTElORV9DQVJEU19TRVBBUkFUT1I6IFwiXHVDNUVDXHVCN0VDIFx1QzkwNCBcdUQ1MENcdUI3OThcdUMyRENcdUNFNzRcdUI0REMgXHVBRDZDXHVCRDg0XHVDNzkwXCIsXG4gICAgTVVMVElMSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUjogXCJcdUM1RUNcdUI3RUMgXHVDOTA0IFx1QkMxOFx1QzgwNCBcdUQ1MENcdUI3OThcdUMyRENcdUNFNzRcdUI0REMgXHVBRDZDXHVCRDg0XHVDNzkwXCIsXG4gICAgTk9URVM6IFwiXHVCMTc4XHVEMkI4XCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHVCOUFDXHVCREYwXHVDNUQwIFx1QzBBQ1x1QzZBOVx1RDU2MCBcdUQwRENcdUFERjhcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOlxuICAgICAgICBcIlx1RDBEQ1x1QURGOFx1Qjk3QyBcdUFDRjVcdUJDMzEgXHVCNjEwXHVCMjk0IFx1QkU0OCBcdUM5MDRcdUI4NUMgXHVBRDZDXHVCRDg0XHVENTc0XHVDMTFDIFx1Qzc4NVx1QjgyNVx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4gXHVDNjA4KSAnI3JldmlldyAjdGFnMiAjdGFnMydcIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFOiBcIlx1QjlBQ1x1QkRGMFx1Qjk3QyBcdUM3MDRcdUQ1NzQgXHVCNzlDXHVCMzY0IFx1QjE3OFx1RDJCOFx1Qjk3QyBcdUM1RkRcdUIyQzhcdUIyRTQuXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOiBcIlx1Qzc3NCBcdUM2MzVcdUMxNThcdUM3NzQgXHVBRUJDXHVDODM4XHVDNzg4XHVDNzNDXHVCQTc0LCBcdUIxNzhcdUQyQjhcdUIyOTQgXHVDOTExXHVDNjk0XHVCM0M0KFx1RDM5OFx1Qzc3NFx1QzlDMCBcdUI3QURcdUQwNkMpXHVDNUQwIFx1QjUzMFx1Qjc3QyBcdUM4MTVcdUI4MkNcdUI0MjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgQVVUT19ORVhUX05PVEU6IFwiXHVCOUFDXHVCREYwIFx1RDZDNFx1QzVEMCBcdUIyRTRcdUM3NEMgXHVCMTc4XHVEMkI4XHVCOTdDIFx1Qzc5MFx1QjNEOVx1QzczQ1x1Qjg1QyBcdUM1RkRcdUIyQzhcdUIyRTQuXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiXHVEMzBDXHVDNzdDIFx1QkE1NFx1QjI3NFx1QzVEMFx1QzExQ1x1Qzc1OCBcdUI5QUNcdUJERjAgXHVDNjM1XHVDMTU4XHVDNzQ0IFx1QkU0NFx1RDY1Q1x1QzEzMVx1RDY1NCBcdUQ1NjlcdUIyQzhcdUIyRTQuIFx1QzYwOCkgXHVCOUFDXHVCREYwOiBFYXN5IEdvb2QgSGFyZFwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TX0RFU0M6XG4gICAgICAgIFwiXHVDNzc0IFx1QzYzNVx1QzE1OFx1Qzc0NCBcdUJFNDRcdUQ2NUNcdUMxMzFcdUQ2NTQgXHVENTVDIFx1RDZDNCwgXHVCQTg1XHVCODM5IFx1QjJFOFx1Q0Q5NVx1RDBBNFx1Qjk3QyBcdUM3NzRcdUM2QTlcdUQ1NzQgXHVCOUFDXHVCREYwXHVENTU4XHVDMkU0IFx1QzIxOCBcdUM3ODhcdUMyQjVcdUIyQzhcdUIyRTQuIFx1Qzc3NCBcdUM2MzVcdUMxNThcdUM3NDQgXHVCQ0MwXHVBQ0JEXHVENTVDIFx1RDZDNFx1QzVEMCBcdUM2MzVcdUMyRENcdUI1MTRcdUM1QjhcdUM3NDQgXHVDMEM4XHVCODVDXHVBQ0UwXHVDRTY4IFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC5cIixcbiAgICBNQVhfTl9EQVlTX1JFVklFV19RVUVVRTogXCJcdUM2MjRcdUI5NzhcdUNBQkQgXHVEMzI4XHVCMTEwXHVDNUQwIFx1RDQ1Q1x1QzJEQ1x1RDU2MCBcdUNENUNcdUIzMDAgXHVDNzdDXHVDMjE4XCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHVDODAxXHVDNUI0XHVCM0M0IDFcdUM3NzRcdUMwQzFcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1QzcyMFx1RDZBOFx1RDU1QyBcdUMyMkJcdUM3OTBcdUI5N0MgXHVDNzg1XHVCODI1XHVENTc0XHVDOEZDXHVDMTM4XHVDNjk0LlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlx1QzBBQ1x1QzZBOVx1Qzc5MCBcdUM3NzhcdUQxMzBcdUQzOThcdUM3NzRcdUMyQTQgXHVBRTMwXHVCQ0Y4IFx1QzEyNFx1QzgxNVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTogXCJcdUIzNzEgXHVEMkI4XHVCOUFDXHVCMjk0IFx1Q0M5OFx1Qzc0Q1x1QzVEMCBcdUQ2NTVcdUM3QTVcdUI0MUMgXHVBQzgzXHVDNzNDXHVCODVDIFx1RDQ1Q1x1QzJEQ1x1QjQxOFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFX0RFU0M6XG4gICAgICAgIFwiXHVBQzE5XHVDNzQwIFx1Q0U3NFx1QjREQ1x1QzVEMCBcdUM5MTFcdUNDQTlcdUI0MUMgXHVCMzcxXHVDNzQ0IFx1QzgxMVx1QzczQ1x1QjgyNFx1QkE3NCBcdUM3NzQgXHVDNjM1XHVDMTU4XHVDNzQ0IFx1QjA0NFx1QzJFRFx1QzJEQ1x1QzYyNC4gXHVBQzE5XHVDNzQwIFx1RDMwQ1x1Qzc3Q1x1QzVEMCBcdUM1RUNcdUI3RUMgXHVCMzcxXHVDNUQwIFx1QzE4RFx1RDU1QyBcdUNFNzRcdUI0RENcdUFDMDAgXHVDNzg4XHVCMjk0IFx1QUNCRFx1QzZCMCBcdUM3MjBcdUM2QTlcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgQUxHT1JJVEhNOiBcIlx1QzU0Q1x1QUNFMFx1QjlBQ1x1Qzk5OFwiLFxuICAgIENIRUNLX0FMR09SSVRITV9XSUtJOlxuICAgICAgICAnXHVCMzU0IFx1QjlDRVx1Qzc0MCBcdUM4MTVcdUJDRjRcdUI5N0MgXHVDNkQwXHVENTU4XHVDMkRDXHVCQTc0LCA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5hbGdvcml0aG0gaW1wbGVtZW50YXRpb248L2E+XHVDNzQ0IFx1RDY1NVx1Qzc3OFx1RDU3NFx1QzhGQ1x1QzEzOFx1QzY5NC4nLFxuICAgIEJBU0VfRUFTRTogXCJcdUFFMzBcdUJDRjggZWFzZVwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIlx1Q0Q1Q1x1QzE5Rlx1QUMxMiA9IDEzMCwgXHVDODAxXHVDODE1XHVDRTU4XHVCMjk0IFx1QjMwMFx1QjdCNSAyNTBcdUM3ODVcdUIyQzhcdUIyRTQuXCIsXG4gICAgQkFTRV9FQVNFX01JTl9XQVJOSU5HOiBcIlx1QUUzMFx1QkNGOCBlYXNlXHVCMjk0IFx1QzgwMVx1QzVCNFx1QjNDNCAxMzAgXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6IFwiXHVENTBDXHVCNzk4XHVDMkRDXHVDRTc0XHVCNERDL1x1QjE3OFx1RDJCOFx1Qjk3QyBcdUM1QjRcdUI4MjRcdUM2QzAoSGFyZClcdUM3M0NcdUI4NUMgXHVCOUFDXHVCREYwXHVENTg4XHVDNzQ0IFx1QjU0Q1x1Qzc1OCBcdUFDMDRcdUFDQTkgXHVCQ0MwXHVBQ0JEXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFX0RFU0M6IFwiXHVDMEM4XHVCODVDXHVDNkI0IFx1QUMwNFx1QUNBOSA9IFx1Qzc3NFx1QzgwNCBcdUFDMDRcdUFDQTkgKiBcdUFDMDRcdUFDQTlcdUJDQzBcdUFDQkQgXHVBQzEyIC8gMTAwLlwiLFxuICAgIEVBU1lfQk9OVVM6IFwiXHVDMjZDXHVDNkMwKEVhc3kpIFx1QkNGNFx1QjEwOFx1QzJBNFwiLFxuICAgIEVBU1lfQk9OVVNfREVTQzpcbiAgICAgICAgXCJcdUMyNkNcdUM2QzAoRWFzeSkgXHVCQ0Y0XHVCMTA4XHVDMkE0XHVCMjk0IFx1RDUwQ1x1Qjc5OFx1QzJEQ1x1Q0U3NFx1QjREQy9cdUIxNzhcdUQyQjhcdUM1RDBcdUMxMUMgXHVDODhCXHVDNzRDKEdvb2QpXHVBQ0ZDIFx1QzI2Q1x1QzZDMChFYXN5KSBcdUMwQUNcdUM3NzRcdUM3NTggXHVBQzA0XHVBQ0E5IFx1Q0MyOFx1Qzc3NFx1Qjk3QyBcdUMxMjRcdUM4MTVcdUQ1NjAgXHVDMjE4IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4gKFx1Q0Q1Q1x1QzE4QyA9IDEwMCUpXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJcdUMyNkNcdUM2QzAoRWFzeSkgXHVCQ0Y0XHVCMTA4XHVDMkE0XHVCMjk0IFx1QzgwMVx1QzVCNFx1QjNDNCAxMDBcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LlwiLFxuICAgIE1BWF9JTlRFUlZBTDogXCJcdUNENUNcdUIzMDAgXHVBQzA0XHVBQ0E5XCIsXG4gICAgTUFYX0lOVEVSVkFMX0RFU0M6IFwiXHVBQzA0XHVBQ0E5XHVDNzU4IFx1QzBDMVx1RDU1Q1x1QzEyMFx1Qzc0NCBcdUI0NTggXHVDMjE4IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4gKFx1QUUzMFx1QkNGOFx1QUMxMiA9IDEwMFx1QjE0NClcIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiXHVDRDVDXHVCMzAwIFx1QUMwNFx1QUNBOVx1Qzc0MCBcdUM4MDFcdUM1QjRcdUIzQzQgMVx1Qzc3Q1x1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJcdUNENUNcdUIzMDAgXHVDNUYwXHVBQ0IwIFx1QUUzMFx1QzVFQ1x1QjNDNFwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzpcbiAgICAgICAgXCJcdUI5QzFcdUQwNkNcdUI0MUMgXHVCMTc4XHVEMkI4XHVDNzU4IFx1Q0QwOFx1QUUzMCBlYXNlXHVDNUQwIFx1QjMwMFx1RDU1QyBcdUFDMDBcdUM5MTFcdUNFNThcdUFDMDAgXHVDODAxXHVDNkE5XHVCNDFDIGVhc2VcdUM3NTggXHVDRDVDXHVCMzAwIFx1QUUzMFx1QzVFQ1x1QjNDNFx1Qzc4NVx1QjJDOFx1QjJFNC5cIixcbiAgICBMT0dHSU5HOiBcIlx1Qjg1Q1x1QUU0NVwiLFxuICAgIERJU1BMQVlfREVCVUdfSU5GTzogXCJcdUI1MTRcdUJDODRcdUFFNDUgXHVDODE1XHVCQ0Y0XHVCOTdDIFx1QUMxQ1x1QkMxQ1x1Qzc5MCBcdUNGNThcdUMxOTRcdUM1RDAgXHVENDVDXHVDMkRDXHVENTU4XHVDMkRDXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdUI5QUNcdUJERjBcdUQ1NjAgXHVCMTc4XHVEMkI4IFx1QjMwMFx1QUUzMFx1QzVGNFwiLFxuICAgIENMT1NFOiBcIlx1QjJFQlx1QUUzMFwiLFxuICAgIE5FVzogXCJOZXdcIixcbiAgICBZRVNURVJEQVk6IFwiXHVDNUI0XHVDODFDXCIsXG4gICAgVE9EQVk6IFwiXHVDNjI0XHVCMjk4XCIsXG4gICAgVE9NT1JST1c6IFwiXHVCMEI0XHVDNzdDXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJcdUQxQjVcdUFDQzRcIixcbiAgICBNT05USDogXCJcdUM2RDRcIixcbiAgICBRVUFSVEVSOiBcIlx1QkQ4NFx1QUUzMFwiLFxuICAgIFlFQVI6IFwiXHVCMTQ0XCIsXG4gICAgTElGRVRJTUU6IFwiXHVEM0M5XHVDMEREXCIsXG4gICAgRk9SRUNBU1Q6IFwiXHVDNjA4XHVDRTIxXCIsXG4gICAgRk9SRUNBU1RfREVTQzogXCJcdUM3NzRcdUQ2QzRcdUM1RDAgXHVENTU5XHVDMkI1XHVENTYwIFx1Q0U3NFx1QjREQ1x1Qzc1OCBcdUMyMThcIixcbiAgICBTQ0hFRFVMRUQ6IFwiU2NoZWR1bGVkXCIsXG4gICAgREFZUzogXCJcdUM3N0NcIixcbiAgICBOVU1CRVJfT0ZfQ0FSRFM6IFwiXHVDRTc0XHVCNERDXHVDNzU4IFx1QzIxOFwiLFxuICAgIFJFVklFV1NfUEVSX0RBWTogXCJcdUQzQzlcdUFERTA6ICR7YXZnfSBcdUI5QUNcdUJERjAvXHVDNzdDXCIsXG4gICAgSU5URVJWQUxTOiBcIlx1QUMwNFx1QUNBOVwiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIlx1QjlBQ1x1QkRGMFx1Qjk3QyBcdUIyRTRcdUMyREMgXHVENTYwIFx1QjU0QyBcdUFFNENcdUM5QzBcdUM3NTggXHVBRTMwXHVBQzA0XCIsXG4gICAgQ09VTlQ6IFwiQ291bnRcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJcdUQzQzlcdUFERTAgXHVBQzA0XHVBQ0E5OiAke2F2Z30sIFx1QUMwMFx1QzdBNSBcdUFFMzQgXHVBQzA0XHVBQ0E5OiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWFzZXNcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIkF2ZXJhZ2UgZWFzZTogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHVDRTc0XHVCNERDIFx1RDBDMFx1Qzc4NVwiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdUM1RUNcdUFFMzBcdUM1RDBcdUIyOTQgXHVCQjNCXHVDNUI0XHVCNDU0IFx1Q0U3NFx1QjREQ1x1QjNDNCBcdUQzRUNcdUQ1NjhcdUI0MjlcdUIyQzhcdUIyRTQuXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOZXdcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiWW91bmdcIixcbiAgICBDQVJEX1RZUEVfTUFUVVJFOiBcIk1hdHVyZVwiLFxuICAgIENBUkRfVFlQRVNfU1VNTUFSWTogXCJcdUM4MDRcdUNDQjQgXHVDRTc0XHVCNERDIFx1QzIxODogJHt0b3RhbENhcmRzQ291bnR9XCIsXG59O1xuIiwgIi8vIE1hcmF0aGlcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gTmVkZXJsYW5kc1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBOb3Jza1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBqXHUwMTE5enlrIHBvbHNraVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBQb3J0dWd1XHUwMEVBc1xuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBQb3J0dWd1XHUwMEVBcyBkbyBCcmFzaWxcbi8vIEJyYXppbGlhbiBQb3J0dWd1ZXNlXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICAvLyBmbGFzaGNhcmQtbW9kYWwudHN4XG4gICAgREVDS1M6IFwiQmFyYWxob3NcIixcbiAgICBEVUVfQ0FSRFM6IFwiQ2FydGFzIHBhcmEgQ29sb2NhciBlbSBEaWFcIixcbiAgICBORVdfQ0FSRFM6IFwiTm92YXMgQ2FydGFzXCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiVG90YWwgZGUgQ2FydGFzXCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiUmVpbmljaWFyIG8gUHJvZ3Jlc3NvIGRhIENhcnRhXCIsXG4gICAgSEFSRDogXCJEaWZcdTAwRURjaWxcIixcbiAgICBHT09EOiBcIk9LXCIsXG4gICAgRUFTWTogXCJGXHUwMEUxY2lsXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiTW9zdHJhciBSZXNwb3N0YVwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiTyBQcm9ncmVzc28gZGEgQ2FydGEgZm9pIHJlaW5pY2lhZG9cIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiQWJyaXIgdW1hIG5vdGEgcGFyYSByZXZpc2FyXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlJldmlzYXIgZmxhc2hjYXJkc1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJSZXZpc1x1MDBFM286IEZcdTAwRTFjaWxcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiUmV2aXNcdTAwRTNvOiBPS1wiLFxuICAgIFJFVklFV19IQVJEX0ZJTEVfTUVOVTogXCJSZXZpc1x1MDBFM286IERpZlx1MDBFRGNpbFwiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlJldmlzYXIgbm90YSBjb21vIGZcdTAwRTFjaWxcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJSZXZpc2FyIG5vdGEgY29tbyBPS1wiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIlJldmlzYXIgbm90YSBjb21vIGRpZlx1MDBFRGNpbFwiLFxuICAgIFJFVklFV19BTExfQ0FSRFM6IFwiUmV2aXNhciBmbGFzaGNhcmRzIGRlIHRvZGFzIGFzIG5vdGFzXCIsXG4gICAgQ1JBTV9BTExfQ0FSRFM6IFwiU2VsZWN0IGEgZGVjayB0byBjcmFtXCIsXG4gICAgUkVWSUVXX0NBUkRTX0lOX05PVEU6IFwiUmV2aXNhciBmbGFzaGNhcmRzIG5lc3NhIG5vdGFcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiUmV2aXNhciB0b2RhcyBhcyBmbGFzaGNhcmRzIG5lc3NhIG5vdGFcIixcbiAgICBWSUVXX1NUQVRTOiBcIlZlciBlc3RhdFx1MDBFRHN0aWNhc1wiLFxuICAgIFNUQVRVU19CQVI6XG4gICAgICAgIFwiUmV2aXNcdTAwRTNvOiAke2R1ZU5vdGVzQ291bnR9IG5vdGEocyksICR7ZHVlRmxhc2hjYXJkc0NvdW50fSBDYXJ0YShzKSBwYXJhIGNvbG9jYXIgZW0gZGlhXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlNpY3Jvbml6YVx1MDBFN1x1MDBFM28gbGV2b3UgJHt0fW1zXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJOb3RhIFx1MDBFOSBzYWx2YSBuYSBwYXN0YSBpZ25vcmFkYSAoY2hlcXVlIGFzIGNvbmZpZ3VyYVx1MDBFN1x1MDBGNWVzKS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiUG9yIGZhdm9yIGV0aXF1ZXRlIGEgbm90YSBhcHJvcHJpYWRhbWVudGUgcGFyYSByZXZpc2FyIChuYXMgY29uZmlndXJhXHUwMEU3XHUwMEY1ZXMpLlwiLFxuICAgIFJFU1BPTlNFX1JFQ0VJVkVEOiBcIlJlc3Bvc3RhIHJlY2ViaWRhLlwiLFxuICAgIE5PX0RFQ0tfRVhJU1RTOiBcIk5lbmh1bSBiYXJhbGhvIGV4aXN0ZSBwYXJhICR7ZGVja05hbWV9XCIsXG4gICAgQUxMX0NBVUdIVF9VUDogXCJWb2NcdTAwRUEgY29sb2NvdSB0dWRvIGVtIHByYXpvIGFnb3JhIDpELlwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCIke2ludGVydmFsfSBkaWEocylcIixcbiAgICBNT05USFNfU1RSX0lWTDogXCIke2ludGVydmFsfSBtXHUwMEVBcyhlcylcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IGFubyhzKVwiLFxuICAgIERBWVNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1kXCIsXG4gICAgTU9OVEhTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9bVwiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9YVwiLFxuXG4gICAgLy8gc2V0dGluZ3MudHNcbiAgICBTRVRUSU5HU19IRUFERVI6IFwiUGxndWluIFNwYWNlZCBSZXBldGl0aW9uIC0gQ29uZmlndXJhXHUwMEU3XHUwMEUzb1wiLFxuICAgIENIRUNLX1dJS0k6ICdQYXJhIG1haXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzLCBjaGVja2UgbyA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPi4nLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIlBhc3RhcyBwYXJhIGlnbm9yYXJcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOlxuICAgICAgICBcIkVuc2lyYSBvIGNhbWluaG8gZGFzIHBhc3RhcyBzZXBhcmFkbyBwb3IgcXVlYnJhcyBkZSBsaW5oYSBleDogVGVtcGxhdGVzIE1ldGEvU2NyaXB0c1wiLFxuICAgIEZMQVNIQ0FSRFM6IFwiRmxhc2hjYXJkc1wiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIlRleHRvIGRvIEJvdFx1MDBFM28gZGUgRlx1MDBFMWNpbFwiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIlRleHRvIGRvIEJvdFx1MDBFM28gZGUgT0tcIixcbiAgICBGTEFTSENBUkRfSEFSRF9MQUJFTDogXCJUZXh0byBkbyBCb3RcdTAwRTNvIGRlIERpZlx1MDBFRGNpbFwiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6ICdDb3N0dW1pemUgbyByXHUwMEYzdHVsbyBwYXJhIG8gYm90XHUwMEUzbyBkZSBcIkZcdTAwRTFjaWxcIicsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogJ0Nvc3R1bWl6ZSBvIHJcdTAwRjN0dWxvIHBhcmEgbyBib3RcdTAwRTNvIGRlIFwiT0tcIicsXG4gICAgRkxBU0hDQVJEX0hBUkRfREVTQzogJ0N1c3RvbWl6ZSBvIHJcdTAwRjN0dWxvIHBhcmEgbyBib3RcdTAwRTNvIGRlIFwiRGlmXHUwMEVEY2lsXCInLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIkV0aXF1ZXRhcyBkb3MgRmxhc2hjYXJkc1wiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6XG4gICAgICAgIFwiRW5zaXJhIGV0aXF1ZXRhcyBzZXBhcmFkYXMgcG9yIGVzcGFcdTAwRTdvcyBvdSBxdWVicmFzIGRlIGxpbmhhIGV4OiAjZmxhc2hjYXJkcyAjYmFyYWxobzIgI2JhcmFsaG8zLlwiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJDb252ZXJ0ZXIgcGFzdGFzIHBhcmEgYmFyYWxob3MgZSBzdWItYmFyYWxob3M/XCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6XG4gICAgICAgIFwiSXNzbyBcdTAwRTkgdW1hIGFsdGVybmF0aXZhIHBhcmEgYSBvcFx1MDBFN1x1MDBFM28gZGUgZXRpcXVldGEgZG9zIEZsYXNoY2FyZHMgZW0gY2ltYS5cIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzpcbiAgICAgICAgXCJTYWx2YXIgY29tZW50XHUwMEUxcmlvcyBkZSBhZ2VuZGFtZW50byBuYSBtZXNtYSBsaW5oYSBxdWUgYSBcdTAwRkFsdGltYSBsaW5oYSBkbyBmbGFzaGNhcmQ/XCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJMaWdhciBpc3NvIHZhaSBmYXplciBjb20gcXVlIG9zIGNvbWVudFx1MDBFMXJpb3MgZW0gSFRNTCBuXHUwMEUzbyBxdWVicmVtIGEgZm9ybWF0YVx1MDBFN1x1MDBFM28gZGUgbGlzdGFzLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJFbnRlcnJhciBjYXJ0YXMgaXJtXHUwMEUzcyBhdFx1MDBFOSBvIHByXHUwMEYzeGltbyBkaWE/XCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiQ2FydGFzIGlybVx1MDBFM3Mgc1x1MDBFM28gZ2VyYWRhcyBwZWxvIHRleHRvIGRhIG1lc21hIGNhcnRhIGV4OiBvbWlzc1x1MDBFM28gZGUgcGFsYXZyYXNcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJNb3N0cmFyIGNvbnh0ZXh0byBuYXMgY2FydGFzP1wiLFxuICAgIFNIT1dfQ0FSRF9DT05URVhUX0RFU0M6IFwiZXg6IFRcdTAwRUR0dWxvID4gQ2FiZVx1MDBFN2FsaG8gMSA+IFN1YmNhYmVcdTAwRTdhbGhvID4gLi4uID4gU3ViY2FiZVx1MDBFN2FsaG9cIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIlBvcmNlbnRhZ2VtIGRhIEFsdHVyYSBkbyBGbGFzaGNhcmRcIixcbiAgICBDQVJEX01PREFMX1NJWkVfUEVSQ0VOVF9ERVNDOlxuICAgICAgICBcIkRldmVyaWEgZXN0YXIgY29uZmlndXJhZG8gZW0gMTAwJSBlbSBkaXNwb3NpdGl2b3MgbVx1MDBGM3ZlaXMgb3Ugc2Ugdm9jXHUwMEVBIHRlbSBpbWFnZW5zIG11aXRvIGdyYW5kZXNcIixcbiAgICBSRVNFVF9ERUZBVUxUOiBcIlJlaW5pY2lhciBwYXJhIGEgcHJcdTAwRTktZGVmaW5pXHUwMEU3XHUwMEUzb1wiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJQb3JjZW50YWdlbSBkZSBMYXJndXJhIGRvIEZsYXNoY2FyZFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIkFsZWF0b3JpemFyIGEgb3JkZW0gZGFzIGNhcnRhcyBkdXJhbnRlIGEgcmV2aXNcdTAwRTNvP1wiLFxuICAgIERJU0FCTEVfQ0xPWkVfQ0FSRFM6IFwiRGVzYWJpbGl0YXIgY2FydGFzIHF1ZSB1c2FtIG9taXNzXHUwMEUzbyBkZSBwYWxhdnJhcz9cIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIkNvbnZlcnRlciA9PW1hcmNhLXRleHRvPT0gZW0gb21pc3NcdTAwRjVlcz9cIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiQ29udmVydGVyICoqdGV4dG8gZW0gbmVncml0byoqIGVtIG9taXNzXHUwMEY1ZXM/XCIsXG4gICAgQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVM6IFwiQ29udmVydGVyIHt7Y2hhdmVzfX0gZW0gb21pc3NcdTAwRjVlcz9cIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlNlcGFyYWRvciBwYXJhIGZsYXNoY2FyZHMgaW5saW5lXCIsXG4gICAgRklYX1NFUEFSQVRPUlNfTUFOVUFMTFlfV0FSTklORzpcbiAgICAgICAgXCJOb3RlIHF1ZSBkZXBvaXMgZGUgbXVkYXIgaXNzbyB2b2NcdTAwRUEgdmFpIHRlciBxdWUgbWFudWFsbWVudGUgbXVkYXIgcXVhaXNxdWVyIGZsYXNoY2FyZHMgcXVlIHZvY1x1MDBFQSB0ZW5oYS5cIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlNlcGFyYWRvciBwYXJhIGZsYXNoY2FyZHMgaW5saW5lIHJldmVyc29zXCIsXG4gICAgTVVMVElMSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJTZXBhcmFkb3IgcGFyYSBmbGFzaGNhcmRzIGRlIG1cdTAwRkFsdGlwbGFzIGxpbmhhc1wiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiU2VwYXJhZG9yIHBhcmEgZmxhc2hjYXJkcyBkZSBtXHUwMEZBbHRpcGxhcyBsaW5oYXMgcmV2ZXJzb3NcIixcbiAgICBOT1RFUzogXCJOb3Rhc1wiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiRW5hYmxlIG5vdGUgcmV2aWV3IHBhbmUgb24gc3RhcnR1cFwiLFxuICAgIFRBR1NfVE9fUkVWSUVXOiBcIkV0aXF1ZXRhcyBwYXJhIHJldmlzYXJcIixcbiAgICBUQUdTX1RPX1JFVklFV19ERVNDOlxuICAgICAgICBcIkVuc2lyYSBldGlxdWV0YXMgc2VwYXJhZGFzIHBvciBlc3BhXHUwMEU3b3Mgb3UgcXVlYnJhIGRlIGxpbmhhcyBleDogI3JldmlzYXIgI2V0aXF1ZXRhMiAjZXRpcXVldGEzLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiQWJyaXIgdW1hIG5vdGEgYWxlYXRcdTAwRjNyaWEgcGFyYSByZXZpc2FyXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOlxuICAgICAgICBcIlF1YW5kbyB2b2NcdTAwRUEgZGVzYWJpbGl0YXIgaXNzbywgYXMgbm90YXMgdlx1MDBFM28gc2VyIG9yZGVuYWRhcyBwb3IgaW1wb3J0XHUwMEUybmNpYSAoUGFnZVJhbmspLlwiLFxuICAgIEFVVE9fTkVYVF9OT1RFOiBcIkFicmlyIGEgcHJcdTAwRjN4aW1hIG5vdGEgYXV0b21hdGljYW1lbnRlIGRlcG9pcyBkZSB1bWEgcmV2aXNcdTAwRTNvXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlM6XG4gICAgICAgIFwiRGVzYWJpbGl0YXIgb3BcdTAwRTdcdTAwRjVlcyBkZSByZXZpc1x1MDBFM28gbm8gbWVudSBkZSBhcnF1aXZvcyBleDogUmV2aXNcdTAwRTNvOiBGXHUwMEUxY2lsIE9LIERpZlx1MDBFRGNpbFwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TX0RFU0M6XG4gICAgICAgIFwiRGVwb2lzIGRlIGRlc2FiaWxpdGFyLCB2b2NcdTAwRUEgcG9kZSByZXZpc2FyIHVzYW5kbyBvcyBhdGFsaG9zIGRlIGNvbWFuZG8uIFJlaW5pY2llIE9ic2lkaWFuIGRlcG9pcyBkZSBtdWRhciBpc3NvLlwiLFxuICAgIE1BWF9OX0RBWVNfUkVWSUVXX1FVRVVFOiBcIk5cdTAwRkFtZXJvIG1cdTAwRTF4aW1vIGRlIGRpYXMgcGFyYSBleGliaXIgbm8gcGFpbmVsIGRpcmVpdG9cIixcbiAgICBNSU5fT05FX0RBWTogXCJPIG5cdTAwRkFtZXJvIGRlIGRpYXMgZGV2ZSBzZXIgcGVsbyBtZW5vcyAxLlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlBvciBmYXZvciBlbnNpcmEgdW0gblx1MDBGQW1lcm8gdlx1MDBFMWxpZG8uXCIsXG4gICAgVUlfUFJFRkVSRU5DRVM6IFwiUHJlZmVyXHUwMEVBbmNpYXMgZGUgVUlcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUU6XG4gICAgICAgIFwiXHUwMEMxcnZvcmVzIGRlIGJhcmFsaG9zIGRldmVtIGluaWNpYWxtZW50ZSBzZXJlbSBleGliaWRhcyBjb21vIGV4cGFuZGlkYXNcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJEZXNhYmlsaXRlIGlzc28gcGFyYSBjb2xhcHNhciBiYXJhbGhvcyBxdWUgZXN0XHUwMEUzbyB1bSBkZW50cm8gZG8gb3V0cm8gbmEgbWVzbWEgY2FydGEuIFx1MDBEQXRpbCBzZSB2b2NcdTAwRUEgdGVtIGNhcnRhcyBxdWUgcGVydGVuY2VtIGEgbXVpdG9zIGJhcmFsaG9zIGVtIHVtIG1lc21vIGFycXVpdm8uXCIsXG4gICAgQUxHT1JJVEhNOiBcIkFsZ29yXHUwMEVEdG1vXCIsXG4gICAgQ0hFQ0tfQUxHT1JJVEhNX1dJS0k6XG4gICAgICAgICdQYXJhIG1haXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzLCBjaGVxdWUgYSA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5pbXBsZW1lbnRhXHUwMEU3XHUwMEUzbyBkbyBhbGdvclx1MDBFRHRtbzwvYT4uJyxcbiAgICBCQVNFX0VBU0U6IFwiRmFjaWxpZGFkZSBiYXNlXCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwibVx1MDBFRG5pbW8gPSAxMzAsIHByZWZlcml2ZWxtZW50ZSBhcHJveGltYWRhbWVudGUgMjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJBIGZhY2lsaWRhZGUgYmFzZSBkZXZlIHNlciBwZWxvIG1lbm9zIDEzMC5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6XG4gICAgICAgIFwiTXVkYW5cdTAwRTdhIGRlIGludGVydmFsbyBxdWFuZG8gdm9jXHUwMEVBIHJldmlzYSB1bShhKSBmbGFzaGNhcmQvbm90YSBjb21vIGRpZlx1MDBFRGNpbFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIm5vdm9JbnRlcnZhbG8gPSB2ZWxob0ludGVydmFsbyAqIG11ZGFuY2FJbnRlcnZhbG8gLyAxMDAuXCIsXG4gICAgRUFTWV9CT05VUzogXCJCXHUwMEY0bnVzIGRlIEZcdTAwRTFjaWxcIixcbiAgICBFQVNZX0JPTlVTX0RFU0M6XG4gICAgICAgIFwiTyBiXHUwMEY0bnVzIGRlIGZcdTAwRTFjaWwgdGUgcGVybWl0ZSBtdWRhciBhIGRpZmVyXHUwMEVBbmNpYSBlbnRyZSBpbnRlcnZhbG9zIGRlIHJlc3BvbmRlciBPSyBlIEZcdTAwRTFjaWwgZW0gdW0oYSkgZmxhc2hjYXJkL25vdGEgKG1cdTAwRURuaW1vID0gMTAwJSkuXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJPIGJcdTAwRjRudXMgZGUgZlx1MDBFMWNpbCBkZXZlIHNlciBwZWxvIG1lbm9zIDEwMC5cIixcbiAgICBNQVhfSU5URVJWQUw6IFwiSW50ZXJ2YWxvIE1cdTAwRTF4aW1vXCIsXG4gICAgTUFYX0lOVEVSVkFMX0RFU0M6XG4gICAgICAgIFwiVGUgcGVybWl0ZSBjb2xvY2FyIHVtIGxpbWl0ZSBtXHUwMEUxeGltbyBubyBpbnRlcnZhbG8gKHByXHUwMEU5LWRlZmluaVx1MDBFN1x1MDBFM28gPSAxMDAgYW5vcykuXCIsXG4gICAgTUFYX0lOVEVSVkFMX01JTl9XQVJOSU5HOiBcIk8gaW50ZXJ2YWxvIG1cdTAwRTF4aW1vIGRldmUgc2VyIHBlbG8gbWVub3MgMSBkaWEuXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQjogXCJDb250cmlidWlcdTAwRTdcdTAwRTNvIE1cdTAwRTF4aW1hIGRlIExpbmtzXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIkNvbnRyaWJ1aVx1MDBFN1x1MDBFM28gbVx1MDBFMXhpbWEgZGEgZmFjaWxpZGFkZSBwb25kZXJhZGEgZGFzIG5vdGFzIGxpbmthZGFzIFx1MDBFMCBmYWNpbGlkYWRlIGluaWNpYWwuXCIsXG4gICAgTE9HR0lORzogXCJMb2dnaW5nXCIsXG4gICAgRElTUExBWV9ERUJVR19JTkZPOiBcIk1vc3RyYXIgaW5mb3JtYVx1MDBFN1x1MDBFM28gZGUgZGVidWdnaW5nIG5vIGNvbnNvbGUgZGUgZGVzZW52b2x2aW1lbnRvP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJGaWxhIGRlIE5vdGFzIHBhcmEgUmV2aXNhclwiLFxuICAgIENMT1NFOiBcIkZlY2hhclwiLFxuICAgIE5FVzogXCJOb3ZvXCIsXG4gICAgWUVTVEVSREFZOiBcIk9udGVtXCIsXG4gICAgVE9EQVk6IFwiSG9qZVwiLFxuICAgIFRPTU9SUk9XOiBcIkFtYW5oXHUwMEUzXCIsXG5cbiAgICAvLyBzdGF0cy1tb2RhbC50c3hcbiAgICBTVEFUU19USVRMRTogXCJFc3RhdFx1MDBFRHN0aWNhc1wiLFxuICAgIE1PTlRIOiBcIk1cdTAwRUFzXCIsXG4gICAgUVVBUlRFUjogXCJRdWFydG9cIixcbiAgICBZRUFSOiBcIkFub1wiLFxuICAgIExJRkVUSU1FOiBcIlRlbXBvIFRvdGFsXCIsXG4gICAgRk9SRUNBU1Q6IFwiUHJldmlzXHUwMEUzb1wiLFxuICAgIEZPUkVDQVNUX0RFU0M6IFwiTyBuXHUwMEZBbWVybyBkZSBjYXJ0YXMgYSBzZXJlbSBjb2xvY2FkYXMgZW0gZGlhIG5vIGZ1dHVyb1wiLFxuICAgIFNDSEVEVUxFRDogXCJBZ2VuZGFkb1wiLFxuICAgIERBWVM6IFwiRGlhc1wiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJOXHUwMEZBbWVybyBkZSBjYXJ0YXNcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiTVx1MDBFOWRpYTogJHthdmd9IHJldmlzXHUwMEY1ZXMvZGlhXCIsXG4gICAgSU5URVJWQUxTOiBcIkludGVydmFsb3NcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJBdHJhc29zIGF0XHUwMEU5IHF1ZSBhcyByZXZpc1x1MDBGNWVzIHNlamFtIGV4aWJpZGFzIGRlIG5vdm9cIixcbiAgICBDT1VOVDogXCJDb250YWdlbVwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIkludGVydmFsbyBlbSBtXHUwMEU5ZGlhOiAke2F2Z30sIE1haW9yIGludGVydmFsbzogJHtsb25nZXN0fVwiLFxuICAgIEVBU0VTOiBcIkZhY2lsaWRhZGVzXCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJGYWNpbGlkYWRlIGVtIG1cdTAwRTlkaWE6ICR7YXZnRWFzZX1cIixcbiAgICBDQVJEX1RZUEVTOiBcIlRpcG9zIGRlIENhcnRhc1wiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJJc3NvIHRhbWJcdTAwRTltIGluY2x1aSBjYXJ0YXMgZW50ZXJyYWRvcywgY2FzbyBleGlzdGFtXCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJOb3ZvXCIsXG4gICAgQ0FSRF9UWVBFX1lPVU5HOiBcIkpvdmVtXCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJBbWFkdXJlY2lkb1wiLFxuICAgIENBUkRfVFlQRVNfU1VNTUFSWTogXCJUb3RhbCBkZSBjYXJ0YXM6ICR7dG90YWxDYXJkc0NvdW50fVwiLFxufTtcbiIsICIvLyBSb21cdTAwRTJuXHUwMTAzXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzQVx1MDQzOFx1MDQzOVxuXG4vLyBAeXRhdGljaG5vIFx1MDQyMVx1MDQzMFx1MDQ0NFx1MDQ0MFx1MDQzRVx1MDQzRFx1MDQzRVx1MDQzMiBcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0Ncbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS95dGF0aWNobm9cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGZsYXNoY2FyZC1tb2RhbC50c3hcbiAgICBERUNLUzogXCJcdTA0MjNcdTA0NDBcdTA0M0VcdTA0MzJcdTA0M0RcdTA0MzhcIixcbiAgICBEVUVfQ0FSRFM6IFwiXHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDQ5XHUwNDM4XHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOFwiLFxuICAgIE5FV19DQVJEUzogXCJcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiXHUwNDEyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIEJBQ0s6IFwiQmFja1wiLFxuICAgIFNLSVA6IFwiU2tpcFwiLFxuICAgIEVESVRfQ0FSRDogXCJFZGl0IENhcmRcIixcbiAgICBSRVNFVF9DQVJEX1BST0dSRVNTOiBcIlx1MDQyMVx1MDQzMVx1MDQ0MFx1MDQzRVx1MDQ0MVx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0MzNcdTA0NDBcdTA0MzVcdTA0NDFcdTA0NDEgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgSEFSRDogXCJcdTA0MjFcdTA0M0JcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0VcIixcbiAgICBHT09EOiBcIlx1MDQxRFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQzRVwiLFxuICAgIEVBU1k6IFwiXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHUwNDFGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0MlwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiXHUwNDIxXHUwNDMxXHUwNDQwXHUwNDNFXHUwNDQxXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzM1x1MDQ0MFx1MDQzNVx1MDQ0MVx1MDQ0MSBcdTA0MzhcdTA0MzdcdTA0NDNcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIlx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0NDMgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgIFJFVklFV19DQVJEUzogXCJcdTA0MUZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4XCIsXG4gICAgUkVWSUVXX0VBU1lfRklMRV9NRU5VOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNTogXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFXCIsXG4gICAgUkVWSUVXX0dPT0RfRklMRV9NRU5VOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNTogXHUwNDFEXHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNTogXHUwNDIxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFXCIsXG4gICAgUkVWSUVXX05PVEVfRUFTWV9DTUQ6IFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDFCXHUwNDUxXHUwNDMzXHUwNDNBXHUwNDQzXHUwNDRFXCIsXG4gICAgUkVWSUVXX05PVEVfR09PRF9DTUQ6IFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDFEXHUwNDNFXHUwNDQwXHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDQzXHUwNDRFXCIsXG4gICAgUkVWSUVXX05PVEVfSEFSRF9DTUQ6IFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQ0MyBcdTA0M0FcdTA0MzBcdTA0M0EgXHUwNDIxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDQzXHUwNDRFXCIsXG4gICAgUkVWSUVXX0FMTF9DQVJEUzogXCJcdTA0MUZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0NEMgXHUwNDMyXHUwNDQxXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQxXHUwNDM1XHUwNDQ1IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzMFx1MDQ0NVwiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1MDQxRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzggXHUwNDMyIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzOSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzVcIixcbiAgICBDUkFNX0NBUkRTX0lOX05PVEU6IFwiXHUwNDE3XHUwNDQzXHUwNDMxXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCBcdTA0MzIgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDM5IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzNVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHUwNDFGXHUwNDNFXHUwNDQxXHUwNDNDXHUwNDNFXHUwNDQyXHUwNDQwXHUwNDM1XHUwNDQyXHUwNDRDIFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0Mlx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQVx1MDQ0M1wiLFxuICAgIFNUQVRVU19CQVI6XG4gICAgICAgIFwiXHUwNDFGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDRDOiAke2R1ZU5vdGVzQ291bnR9IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzQSgtXHUwNDNBXHUwNDM4KSwgJHtkdWVGbGFzaGNhcmRzQ291bnR9IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSgtXHUwNDNBXHUwNDM4KSBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NDFcdTA0NDJcdTA0M0VcdTA0MzhcdTA0NDJcIixcbiAgICBTWU5DX1RJTUVfVEFLRU46IFwiXHUwNDIxXHUwNDM4XHUwNDNEXHUwNDQ1XHUwNDQwXHUwNDNFXHUwNDNEXHUwNDM4XHUwNDM3XHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRGIFx1MDQzN1x1MDQzMFx1MDQzRFx1MDQ0Rlx1MDQzQlx1MDQzMCAke3R9XHUwNDNDXHUwNDQxXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJcdTA0MTdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzAgXHUwNDQxXHUwNDNFXHUwNDQ1XHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNEXHUwNDMwIFx1MDQzMiBcdTA0MzhcdTA0MzNcdTA0M0RcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDBcdTA0NDNcdTA0MzVcdTA0M0NcdTA0NDNcdTA0NEUgXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNBXHUwNDQzIChcdTA0NDFcdTA0M0MgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4KS5cIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiXHUwNDFGXHUwNDNFXHUwNDM2XHUwNDMwXHUwNDNCXHUwNDQzXHUwNDM5XHUwNDQxXHUwNDQyXHUwNDMwIFx1MDQzRlx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQ0Q1x1MDQ0Mlx1MDQzNSBcdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0NDMgXHUwNDNBXHUwNDMwXHUwNDNBIFx1MDQzRFx1MDQzMFx1MDQzNFx1MDQzRSBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIChcdTA0NDFcdTA0M0MgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDM4KS5cIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJcdTA0MUVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDQzXHUwNDQ3XHUwNDM1XHUwNDNELlwiLFxuICAgIE5PX0RFQ0tfRVhJU1RTOiBcIlx1MDQxRFx1MDQzNSBcdTA0NDFcdTA0NDNcdTA0NDlcdTA0MzVcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzVcdTA0NDIgXHUwNDQzXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDNEXHUwNDRGICR7ZGVja05hbWV9XCIsXG4gICAgQUxMX0NBVUdIVF9VUDogXCJcdTA0MTVcdTA0NDFcdTA0NDJcdTA0NEMhIFx1MDQyMlx1MDQ0QiBcdTA0NDFcdTA0M0ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzhcdTA0M0JcdTA0NDFcdTA0NEYhIDpELlwiLFxuXG4gICAgLy8gc2NoZWR1bGluZy50c1xuICAgIERBWVNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzlcIixcbiAgICBNT05USFNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdTA0M0NcdTA0MzVcdTA0NDFcdTA0NEZcdTA0NDZcdTA0M0VcdTA0MzJcIixcbiAgICBZRUFSU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1MDQzM1x1MDQzRVx1MDQzNFx1MDQzMChcdTA0M0JcdTA0MzVcdTA0NDIpXCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1MDQzNFwiLFxuICAgIE1PTlRIU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1MDQzQ1wiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHUwNDMzXCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJTcGFjZWQgUmVwZXRpdGlvbiBcdTA0MUZcdTA0M0JcdTA0MzBcdTA0MzNcdTA0MzhcdTA0M0QgLSBcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzhcIixcbiAgICBDSEVDS19XSUtJOiAnXHUwNDE0XHUwNDNCXHUwNDRGIFx1MDQzNFx1MDQzRVx1MDQzRiBcdTA0MzhcdTA0M0RcdTA0NDRcdTA0NEIsIFx1MDQ0MVx1MDQzQ1x1MDQzRVx1MDQ0Mlx1MDQ0MFx1MDQzOCA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPi4gXHUwNDIxXHUwNDNBXHUwNDNFXHUwNDQwXHUwNDNFIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQzNVx1MDQ0MiBcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzJcdTA0M0VcdTA0MzQgOjMnLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIlx1MDQxOFx1MDQzM1x1MDQzRFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0MFx1MDQ0M1x1MDQzNVx1MDQzQ1x1MDQ0Qlx1MDQzNSBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzhcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOiBcIlx1MDQxMlx1MDQzNVx1MDQzNFx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0M0ZcdTA0NDNcdTA0NDJcdTA0MzggXHUwNDNGXHUwNDMwXHUwNDNGXHUwNDNFXHUwNDNBIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBlbnRlcidcdTA0M0VcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBUZW1wbGF0ZXMgTWV0YS9TY3JpcHRzXCIsXG4gICAgRkxBU0hDQVJEUzogXCJcdTA0MUFcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzhcIixcbiAgICBGTEFTSENBUkRfRUFTWV9MQUJFTDogXCJFYXN5IEJ1dHRvbiBUZXh0XCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfTEFCRUw6IFwiR29vZCBCdXR0b24gVGV4dFwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIkhhcmQgQnV0dG9uIFRleHRcIixcbiAgICBGTEFTSENBUkRfRUFTWV9ERVNDOiAnQ3VzdG9taXplIHRoZSBsYWJlbCBmb3IgdGhlIFwiRWFzeVwiIEJ1dHRvbicsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogJ0N1c3RvbWl6ZSB0aGUgbGFiZWwgZm9yIHRoZSBcIkdvb2RcIiBCdXR0b24nLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0RFU0M6ICdDdXN0b21pemUgdGhlIGxhYmVsIGZvciB0aGUgXCJIYXJkXCIgQnV0dG9uJyxcbiAgICBGTEFTSENBUkRfVEFHUzogXCJcdTA0MjJcdTA0NERcdTA0MzNcdTA0MzggXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDM1XHUwNDNBXCIsXG4gICAgRkxBU0hDQVJEX1RBR1NfREVTQzpcbiAgICAgICAgXCJcdTA0MTJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDREXHUwNDMzXHUwNDM4IFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBlbnRlcidcdTA0M0VcdTA0M0MgXHUwNDM4XHUwNDNCXHUwNDM4IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzMVx1MDQzNVx1MDQzQlx1MDQzRVx1MDQzQyBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6ICNmbGFzaGNhcmRzICNkZWNrMiAjZGVjazMuXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTOiBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0M0ZcdTA0MzBcdTA0M0ZcdTA0M0FcdTA0MzggXHUwNDMyIFx1MDQ0M1x1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzRFx1MDQzOCBcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQzXHUwNDQwXHUwNDNFXHUwNDMyXHUwNDNEXHUwNDM4P1wiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLU19ERVNDOiBcIlx1MDQyRFx1MDQ0Mlx1MDQzRSBcdTA0MzBcdTA0M0JcdTA0NENcdTA0NDJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0MzBcdTA0NDJcdTA0MzhcdTA0MzJcdTA0MzAgXHUwNDQyXHUwNDREXHUwNDMzXHUwNDMwXHUwNDNDIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSwgXHUwNDNEXHUwNDMwXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDM5XHUwNDNBXHUwNDMwIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0NVx1MDQ0My5cIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzogXCJcdTA0MjFcdTA0M0VcdTA0NDVcdTA0NDBcdTA0MzBcdTA0M0RcdTA0NEZcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDM5IFx1MDQzRlx1MDQzQlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0M0RcdTA0MzAgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQ0MVx1MDQzQlx1MDQzNSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0E/XCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzpcbiAgICAgICAgXCJcdTA0MTJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0MVx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzMFx1MDQzNVx1MDQ0MiBcdTA0NDJcdTA0MzBcdTA0M0EsIFx1MDQ0N1x1MDQ0Mlx1MDQzRSBIVE1MIFx1MDQzQVx1MDQzRVx1MDQzQ1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOCBcdTA0M0RcdTA0MzUgXHUwNDMxXHUwNDQzXHUwNDM0XHUwNDQzXHUwNDQyIFx1MDQzQlx1MDQzRVx1MDQzQ1x1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0NDRcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0M0RcdTA0MzhcdTA0MzUgXHUwNDQxXHUwNDNGXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDMwLlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWTogXCJcdTA0MUZcdTA0NDBcdTA0NEZcdTA0NDJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQwXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCBcdTA0MzRcdTA0M0UgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0LiBcdTA0MzRcdTA0M0RcdTA0NEY/XCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6XG4gICAgICAgIFwiXHUwNDIwXHUwNDNFXHUwNDM0XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDM1XHUwNDNEXHUwNDNEXHUwNDRCXHUwNDM1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOCAtIFx1MDQ0Mlx1MDQzNSwgXHUwNDNBXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRCXHUwNDM1IFx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRVx1MDQzMlx1MDQzMFx1MDQzRFx1MDQ0QiBcdTA0MzhcdTA0MzcgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFIFx1MDQ0Mlx1MDQzNVx1MDQzQVx1MDQ0MVx1MDQ0Mlx1MDQzMCwgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzggXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOChbLi4uXSlcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJcdTA0MUZcdTA0M0VcdTA0M0FcdTA0MzBcdTA0MzdcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDNBXHUwNDNFXHUwNDNEXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyKFx1MDQ0M1x1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzNVx1MDQzRFx1MDQ0QykgXHUwNDMyIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzMFx1MDQ0NShcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rik/XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFRpdGxlID4gSGVhZGluZyAxID4gU3ViaGVhZGluZyA+IC4uLiA+IFN1YmhlYWRpbmdcIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIlx1MDQxMlx1MDQ0Qlx1MDQ0MVx1MDQzRVx1MDQ0Mlx1MDQzMCBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzggXHUwNDMyXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDQyXHUwNDMwXHUwNDQ1XCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzpcbiAgICAgICAgXCJcdTA0MTVcdTA0NDFcdTA0M0JcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDM3XHUwNDQzXHUwNDM1XHUwNDQyXHUwNDM1XHUwNDQxXHUwNDRDIFx1MDQzQ1x1MDQzRVx1MDQzMVx1MDQzOFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzQyBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0MzVcdTA0NDRcdTA0M0VcdTA0M0RcdTA0M0VcdTA0M0MsIFx1MDQzMlx1MDQ0Qlx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzMlx1MDQ0Q1x1MDQ0Mlx1MDQzNSAxMDAlIFx1MDQzOFx1MDQzQlx1MDQzOCBcdTA0NDMgXHUwNDMyXHUwNDMwXHUwNDQxIFx1MDQzMVx1MDQ0M1x1MDQzNFx1MDQ0M1x1MDQ0MiBcdTA0M0VcdTA0MzNcdTA0NDBcdTA0M0VcdTA0M0NcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgUkVTRVRfREVGQVVMVDogXCJcdTA0MURcdTA0MzBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0M0VcdTA0MzlcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDNFIFx1MDQ0M1x1MDQzQ1x1MDQzRVx1MDQzQlx1MDQ0N1x1MDQzMFx1MDQzRFx1MDQzOFx1MDQ0RVwiLFxuICAgIENBUkRfTU9EQUxfV0lEVEhfUEVSQ0VOVDogXCJcdTA0MjhcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzAgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4IFx1MDQzMiBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDZcdTA0MzVcdTA0M0RcdTA0NDJcdTA0MzBcdTA0NDVcIixcbiAgICBSQU5ET01JWkVfQ0FSRF9PUkRFUjogXCJcdTA0MjFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzlcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDM0XHUwNDNFXHUwNDNBIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0Rj9cIixcbiAgICBESVNBQkxFX0NMT1pFX0NBUkRTOiBcIlx1MDQxMlx1MDQ0Qlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0NEIgXHUwNDQxIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzQ1x1MDQzOChcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFsuLi5dKT9cIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIlx1MDQxQVx1MDQzRVx1MDQzRFx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQ0Mlx1MDQzOFx1MDQ0MFx1MDQzRVx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyA9PVx1MDQzMlx1MDQ0Qlx1MDQzNFx1MDQzNVx1MDQzQlx1MDQzNVx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDI9PSBcdTA0MzIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNGXHUwNDQzXHUwNDQxXHUwNDNBXHUwNDM4KFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MDogWy4uLl0pP1wiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgKipcdTA0MzZcdTA0MzhcdTA0NDBcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDQyXHUwNDM1XHUwNDNBXHUwNDQxXHUwNDQyKiogXHUwNDMyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzOChcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFsuLi5dKT9cIixcbiAgICBDT05WRVJUX0NVUkxZX0JSQUNLRVRTX1RPX0NMT1pFUzpcbiAgICAgICAgXCJcdTA0MUFcdTA0M0VcdTA0M0RcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMge3tcdTA0NDRcdTA0MzhcdTA0MzNcdTA0NDNcdTA0NDBcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDQxXHUwNDNBXHUwNDNFXHUwNDMxXHUwNDNBXHUwNDM4fX0gXHUwNDMyIFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQzQVx1MDQzOChcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDA6IFsuLi5dKT9cIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDMyXHUwNDNEXHUwNDQzXHUwNDQyXHUwNDQwXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6XG4gICAgICAgIFwiXHUwNDEyXHUwNDNEXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDM1ISBcdTA0M0ZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDM4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQ0RFx1MDQ0Mlx1MDQzRVx1MDQzM1x1MDQzRSBcdTA0MzJcdTA0MzBcdTA0M0MgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDM0XHUwNDUxXHUwNDQyXHUwNDQxXHUwNDRGIFx1MDQzMlx1MDQ0MFx1MDQ0M1x1MDQ0N1x1MDQzRFx1MDQ0M1x1MDQ0RSBcdTA0NDBcdTA0MzVcdTA0MzRcdTA0MzBcdTA0M0FcdTA0NDJcdTA0MzhcdTA0NDBcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQzXHUwNDM2XHUwNDM1IFx1MDQ0MVx1MDQ0M1x1MDQ0OVx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQ0RVx1MDQ0OVx1MDQzOFx1MDQzNSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzhcIixcbiAgICBJTkxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDQyXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzMlx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0MFx1MDQzOFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQ0N1x1MDQzRFx1MDQ0Qlx1MDQ0NSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0FcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1MDQyMFx1MDQzMFx1MDQzN1x1MDQzNFx1MDQzNVx1MDQzQlx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQzQlx1MDQ0QyBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHUwNDIwXHUwNDMwXHUwNDM3XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDJcdTA0M0RcdTA0NEJcdTA0NDUgXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDQ3XHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIE5PVEVTOiBcIlx1MDQxN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOFwiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiRW5hYmxlIG5vdGUgcmV2aWV3IHBhbmUgb24gc3RhcnR1cFwiLFxuICAgIFRBR1NfVE9fUkVWSUVXOiBcIlx1MDQyMlx1MDQ0RFx1MDQzM1x1MDQzOCBcdTA0MzRcdTA0M0JcdTA0NEYgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGXCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzpcbiAgICAgICAgXCJcdTA0MTJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDQyXHUwNDREXHUwNDMzXHUwNDM4LCBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzRcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDMxXHUwNDM1XHUwNDNCXHUwNDMwXHUwNDNDXHUwNDM4IFx1MDQzOFx1MDQzQlx1MDQzOCBlbnRlcmBcdTA0MzBcdTA0M0NcdTA0MzgsIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MDogI3JldmlldyAjdGFnMiAjdGFnMy5cIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFOiBcIlx1MDQxRVx1MDQ0Mlx1MDQzQVx1MDQ0MFx1MDQ0Qlx1MDQ0Mlx1MDQ0QyBcdTA0NDFcdTA0M0JcdTA0NDNcdTA0NDdcdTA0MzBcdTA0MzlcdTA0M0RcdTA0NDNcdTA0NEUgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNBXHUwNDQzIFx1MDQzNFx1MDQzQlx1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEZcIixcbiAgICBPUEVOX1JBTkRPTV9OT1RFX0RFU0M6IFwiXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQzMlx1MDQ0Qlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QywgXHUwNDQyXHUwNDNFIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDIgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDNFXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQzRSBcdTA0MzJcdTA0MzBcdTA0MzZcdTA0M0RcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzggKFBhZ2VSYW5rKS5cIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJcdTA0MUVcdTA0NDJcdTA0M0FcdTA0NDBcdTA0NEJcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEMgXHUwNDQxXHUwNDNCXHUwNDM1XHUwNDM0XHUwNDQzXHUwNDRFXHUwNDQ5XHUwNDQzXHUwNDRFIFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOCBcdTA0MzBcdTA0MzJcdTA0NDJcdTA0M0VcdTA0M0NcdTA0MzBcdTA0NDJcdTA0MzhcdTA0NDdcdTA0MzVcdTA0NDFcdTA0M0FcdTA0MzggXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgIERJU0FCTEVfRklMRV9NRU5VX1JFVklFV19PUFRJT05TOlxuICAgICAgICBcIlx1MDQxMlx1MDQ0Qlx1MDQzQVx1MDQzQlx1MDQ0RVx1MDQ0N1x1MDQzOFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0NEJcdTA0MzFcdTA0M0VcdTA0NDAgXHUwNDQxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDM4IFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0MzIgXHUwNDNDXHUwNDM1XHUwNDNEXHUwNDRFIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzMCwgXHUwNDNGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwOiBcdTA0MUZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzU6IFx1MDQxQlx1MDQzNVx1MDQzM1x1MDQzQVx1MDQzRSBcdTA0MURcdTA0M0VcdTA0NDBcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDIxXHUwNDNCXHUwNDNFXHUwNDM2XHUwNDNEXHUwNDNFXCIsXG4gICAgRElTQUJMRV9GSUxFX01FTlVfUkVWSUVXX09QVElPTlNfREVTQzpcbiAgICAgICAgXCJcdTA0MUZcdTA0M0VcdTA0NDFcdTA0M0JcdTA0MzUgXHUwNDMyXHUwNDRCXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzMlx1MDQ0QiBcdTA0NDFcdTA0M0NcdTA0M0VcdTA0MzZcdTA0MzVcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDRGXHUwNDQyXHUwNDRDIFx1MDQzRlx1MDQ0MFx1MDQzOCBcdTA0M0ZcdTA0M0VcdTA0M0NcdTA0M0VcdTA0NDlcdTA0MzggXHUwNDQ1XHUwNDNFXHUwNDQyXHUwNDNBXHUwNDM1XHUwNDM1XHUwNDMyLiBcdTA0MUZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzdcdTA0MzBcdTA0MzNcdTA0NDBcdTA0NDNcdTA0MzdcdTA0MzhcdTA0NDJcdTA0MzUgT2JzaWRpYW4gXHUwNDNGXHUwNDNFXHUwNDQxXHUwNDNCXHUwNDM1IFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RiBcdTA0NERcdTA0NDJcdTA0M0VcdTA0MzNcdTA0M0UuXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHUwNDFEXHUwNDMwXHUwNDM4XHUwNDMxXHUwNDNFXHUwNDNCXHUwNDRDXHUwNDQ4XHUwNDM1XHUwNDM1IFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzkgXHUwNDM0XHUwNDNCXHUwNDRGIFx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQzMVx1MDQ0MFx1MDQzMFx1MDQzNlx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0RcdTA0MzAgXHUwNDNGXHUwNDMwXHUwNDNEXHUwNDM1XHUwNDNCXHUwNDM4IFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMFwiLFxuICAgIE1JTl9PTkVfREFZOiBcIlx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzkgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSAxLlwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1MDQxRlx1MDQzRVx1MDQzNlx1MDQzMFx1MDQzQlx1MDQ0M1x1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMCBcdTA0MzJcdTA0MzJcdTA0MzVcdTA0MzRcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDNGXHUwNDNFXHUwNDM0XHUwNDQ1XHUwNDNFXHUwNDM0XHUwNDRGXHUwNDQ5XHUwNDM1XHUwNDM1IFx1MDQ0N1x1MDQzOFx1MDQ0MVx1MDQzQlx1MDQzRS5cIixcbiAgICBVSV9QUkVGRVJFTkNFUzogXCJcdTA0MUZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0NDFcdTA0M0FcdTA0MzhcdTA0MzkgXHUwNDM4XHUwNDNEXHUwNDQyXHUwNDM1XHUwNDQwXHUwNDQ0XHUwNDM1XHUwNDM5XHUwNDQxIFx1MDQxRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOFwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTpcbiAgICAgICAgXCJcdTA0MTRcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzJcdTA0NENcdTA0NEYgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM0IFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzRFx1MDQ0QiBcdTA0MzhcdTA0MzdcdTA0M0RcdTA0MzBcdTA0NDdcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDQyXHUwNDRDXHUwNDQxXHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQzQSBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzVcdTA0NDBcdTA0M0RcdTA0NDNcdTA0NDJcdTA0NEJcdTA0MzVcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJcdTA0MUVcdTA0NDJcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzhcdTA0NDJcdTA0MzUgXHUwNDREXHUwNDQyXHUwNDNFXHUwNDQyIFx1MDQzRlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQ0MCwgXHUwNDQ3XHUwNDQyXHUwNDNFXHUwNDMxXHUwNDRCIFx1MDQ0MVx1MDQzMlx1MDQzNVx1MDQ0MFx1MDQzRFx1MDQ0M1x1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0M0JcdTA0M0VcdTA0MzZcdTA0MzVcdTA0M0RcdTA0M0RcdTA0NEJcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM0XHUwNDRCIFx1MDQzRFx1MDQzMCBcdTA0M0VcdTA0MzRcdTA0M0RcdTA0M0VcdTA0MzkgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM1LiBcdTA0MUZcdTA0M0VcdTA0M0JcdTA0MzVcdTA0MzdcdTA0M0RcdTA0M0UsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDMgXHUwNDMyXHUwNDMwXHUwNDQxIFx1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQ0QyBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0NEIsIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQ0Qlx1MDQzNSBcdTA0M0ZcdTA0NDBcdTA0MzhcdTA0M0RcdTA0MzBcdTA0MzRcdTA0M0JcdTA0MzVcdTA0MzZcdTA0MzBcdTA0NDIgXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDMzXHUwNDM4XHUwNDNDIFx1MDQzQVx1MDQzRVx1MDQzQlx1MDQzRVx1MDQzNFx1MDQzMFx1MDQzQyBcdTA0MzIgXHUwNDNFXHUwNDM0XHUwNDNEXHUwNDNFXHUwNDNDIFx1MDQ0NFx1MDQzMFx1MDQzOVx1MDQzQlx1MDQzNS5cIixcbiAgICBBTEdPUklUSE06IFwiXHUwNDEwXHUwNDNCXHUwNDMzXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDQyXHUwNDNDXCIsXG4gICAgQ0hFQ0tfQUxHT1JJVEhNX1dJS0k6XG4gICAgICAgICdcdTA0MTdcdTA0MzAgXHUwNDM0XHUwNDNFXHUwNDNGXHUwNDNFXHUwNDNCXHUwNDNEXHUwNDM4XHUwNDQyXHUwNDM1XHUwNDNCXHUwNDRDXHUwNDNEXHUwNDNFXHUwNDM5IFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQzNVx1MDQzOSBcdTA0M0VcdTA0MzFcdTA0NDBcdTA0MzBcdTA0NDlcdTA0MzBcdTA0MzlcdTA0NDJcdTA0MzVcdTA0NDFcdTA0NEMgXHUwNDNBIDxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPlx1MDQ0MFx1MDQzNVx1MDQzMFx1MDQzQlx1MDQzOFx1MDQzN1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RiBcdTA0MzBcdTA0M0JcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0M0NcdTA0MzA8L2E+KFx1MDQ0MVx1MDQzQVx1MDQzRVx1MDQ0MFx1MDQzRSBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0MzVcdTA0NDIgXHUwNDNGXHUwNDM1XHUwNDQwXHUwNDM1XHUwNDMyXHUwNDNFXHUwNDM0KS4nLFxuICAgIEJBU0VfRUFTRTogXCJcdTA0MTFcdTA0MzBcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NEYgXHUwNDFCXHUwNDUxXHUwNDMzXHUwNDNBXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDXCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwiXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDM4XHUwNDNDXHUwNDQzXHUwNDNDID0gMTMwLCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0ZcdTA0M0VcdTA0NDdcdTA0NDJcdTA0MzhcdTA0NDJcdTA0MzVcdTA0M0JcdTA0NENcdTA0M0RcdTA0M0UgXHUwNDNFXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDNFIDI1MC5cIixcbiAgICBCQVNFX0VBU0VfTUlOX1dBUk5JTkc6IFwiXHUwNDFCXHUwNDUxXHUwNDMzXHUwNDNBXHUwNDNFXHUwNDQxXHUwNDQyXHUwNDRDIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzRFx1MDQzMCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDNDXHUwNDM4XHUwNDNEXHUwNDM4XHUwNDNDXHUwNDQzXHUwNDNDIDEzMC5cIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6XG4gICAgICAgIFwiXHUwNDE4XHUwNDM3XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1IFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzQVx1MDQzMCBcdTA0M0FcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzAgXHUwNDMyXHUwNDRCIFx1MDQzRVx1MDQ0Mlx1MDQzMlx1MDQzNVx1MDQ0N1x1MDQzMFx1MDQzNVx1MDQ0Mlx1MDQzNSBcdTA0MjFcdTA0M0JcdTA0M0VcdTA0MzZcdTA0M0RcdTA0M0UgXHUwNDMyXHUwNDNFIFx1MDQzMlx1MDQ0MFx1MDQzNVx1MDQzQ1x1MDQ0RiBcdTA0M0ZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0NEYgXHUwNDNBXHUwNDMwXHUwNDQwXHUwNDQyXHUwNDNFXHUwNDQ3XHUwNDNBXHUwNDM4L1x1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzQVx1MDQzOFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIlx1MDQzRFx1MDQzRVx1MDQzMlx1MDQ0Qlx1MDQzOVx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzRVx1MDQzQSA9IFx1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0Qlx1MDQzOVx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzRVx1MDQzQSAqIFx1MDQzOFx1MDQzN1x1MDQzQ1x1MDQzNVx1MDQzRFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNVx1MDQxRlx1MDQ0MFx1MDQzRVx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQ0M1x1MDQ0Mlx1MDQzQVx1MDQzMCAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIlx1MDQxQlx1MDQzNVx1MDQzM1x1MDQzQVx1MDQzRTogXHUwNDMxXHUwNDNFXHUwNDNEXHUwNDQzXHUwNDQxXCIsXG4gICAgRUFTWV9CT05VU19ERVNDOlxuICAgICAgICBcIlx1MDQxMVx1MDQzRVx1MDQzRFx1MDQ0M1x1MDQ0MSBcdTA0MzdcdTA0MzAgXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFIFx1MDQzRlx1MDQzRVx1MDQzN1x1MDQzMlx1MDQzRVx1MDQzQlx1MDQ0Rlx1MDQzNVx1MDQ0MiBcdTA0MzJcdTA0MzBcdTA0M0MgXHUwNDQzXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDM4XHUwNDQyXHUwNDRDIFx1MDQ0MFx1MDQzMFx1MDQzN1x1MDQzRFx1MDQzOFx1MDQ0Nlx1MDQ0MyBcdTA0MzIgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDQzXHUwNDQyXHUwNDNBXHUwNDMwXHUwNDQ1IFx1MDQzQ1x1MDQzNVx1MDQzNlx1MDQzNFx1MDQ0MyBcdTA0M0VcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDJcdTA0MzBcdTA0M0NcdTA0MzggXHUwNDI1XHUwNDNFXHUwNDQwXHUwNDNFXHUwNDQ4XHUwNDNFIFx1MDQzOCBcdTA0MUJcdTA0MzVcdTA0MzNcdTA0M0FcdTA0M0UgXHUwNDNEXHUwNDMwIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzNS9cdTA0MzdcdTA0MzBcdTA0M0NcdTA0MzVcdTA0NDJcdTA0M0FcdTA0MzUgKFx1MDQzQ1x1MDQzOFx1MDQzRC4gPSAxMDAlKS5cIixcbiAgICBFQVNZX0JPTlVTX01JTl9XQVJOSU5HOiBcIlx1MDQxMVx1MDQzRVx1MDQzRFx1MDQ0M1x1MDQ0MSBcdTA0MzdcdTA0MzAgXHUwNDFCXHUwNDM1XHUwNDMzXHUwNDNBXHUwNDNFIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSAxMDAuXCIsXG4gICAgTUFYX0lOVEVSVkFMOiBcIlx1MDQxQ1x1MDQzMFx1MDQzQVx1MDQ0MVx1MDQzOFx1MDQzQ1x1MDQzMFx1MDQzQlx1MDQ0Q1x1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0EoXHUwNDNFXHUwNDQyXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDM0XHUwNDRCXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDRGIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzQVx1MDQzOClcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzpcbiAgICAgICAgXCJcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzJcdTA0M0VcdTA0M0JcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDMyXHUwNDMwXHUwNDNDIFx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzMFx1MDQzMlx1MDQzQlx1MDQzOFx1MDQzMlx1MDQzMFx1MDQ0Mlx1MDQ0QyBcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDVcdTA0M0RcdTA0NEVcdTA0NEUgXHUwNDMzXHUwNDQwXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQ2XHUwNDQzIFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0EgKFx1MDQzRlx1MDQzRSBcdTA0NDNcdTA0M0NcdTA0M0VcdTA0M0JcdTA0NDdcdTA0MzBcdTA0M0RcdTA0MzhcdTA0NEUgPSAxMDAgeWVhcnMpLlwiLFxuICAgIE1BWF9JTlRFUlZBTF9NSU5fV0FSTklORzogXCJcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDNGXHUwNDQwXHUwNDNFXHUwNDNDXHUwNDM1XHUwNDM2XHUwNDQzXHUwNDQyXHUwNDNFXHUwNDNBIFx1MDQzNFx1MDQzRVx1MDQzQlx1MDQzNlx1MDQzNVx1MDQzRCBcdTA0MzFcdTA0NEJcdTA0NDJcdTA0NEMgXHUwNDNEXHUwNDM1IFx1MDQzQ1x1MDQzNVx1MDQzRFx1MDQ0Q1x1MDQ0OFx1MDQzNSAxLlwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUI6IFwiXHUwNDFDXHUwNDMwXHUwNDNBXHUwNDQxXHUwNDM4XHUwNDNDXHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDRCXHUwNDM5IFx1MDQzMlx1MDQzQVx1MDQzQlx1MDQzMFx1MDQzNCBcdTA0NDFcdTA0MzJcdTA0NEZcdTA0MzdcdTA0MzgoXHUwNDQxXHUwNDQxXHUwNDRCXHUwNDNCXHUwNDNBXHUwNDM4KVwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzpcbiAgICAgICAgXCJcdTA0MUNcdTA0MzBcdTA0M0FcdTA0NDFcdTA0MzhcdTA0M0NcdTA0MzBcdTA0M0JcdTA0NENcdTA0M0RcdTA0NEJcdTA0MzkgXHUwNDMyXHUwNDNBXHUwNDNCXHUwNDMwXHUwNDM0IFx1MDQzMlx1MDQzN1x1MDQzMlx1MDQzNVx1MDQ0OFx1MDQzNVx1MDQzRFx1MDQzRFx1MDQzRVx1MDQzOSBcdTA0MUJcdTA0NTFcdTA0MzNcdTA0M0FcdTA0M0VcdTA0NDFcdTA0NDJcdTA0MzggXHUwNDQxXHUwNDMyXHUwNDRGXHUwNDM3XHUwNDMwXHUwNDNEXHUwNDNEXHUwNDRCXHUwNDQ1IFx1MDQzN1x1MDQzMFx1MDQzQ1x1MDQzNVx1MDQ0Mlx1MDQzRVx1MDQzQSBcdTA0MzIgXHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDNCXHUwNDRDXHUwNDNEXHUwNDQzXHUwNDRFIFx1MDQxQlx1MDQ1MVx1MDQzM1x1MDQzQVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQ0Qy5cIixcbiAgICBMT0dHSU5HOiBcIlx1MDQxMlx1MDQzNVx1MDQzNFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQzNSBcdTA0M0JcdTA0M0VcdTA0MzNcdTA0MzBcIixcbiAgICBESVNQTEFZX0RFQlVHX0lORk86IFwiXHUwNDFFXHUwNDQyXHUwNDNFXHUwNDMxXHUwNDQwXHUwNDMwXHUwNDM2XHUwNDMwXHUwNDQyXHUwNDRDIFx1MDQzOFx1MDQzRFx1MDQ0NFx1MDQzRVx1MDQ0MFx1MDQzQ1x1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0RSBcdTA0M0VcdTA0NDJcdTA0M0JcdTA0MzBcdTA0MzRcdTA0M0FcdTA0MzggXHUwNDNEXHUwNDMwIFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQ0MVx1MDQzRVx1MDQzQlx1MDQ0QyBcdTA0NDBcdTA0MzBcdTA0MzdcdTA0NDBcdTA0MzBcdTA0MzFcdTA0M0VcdTA0NDJcdTA0NDdcdTA0MzhcdTA0M0FcdTA0MzAoZGV2ZWxvcGVyIGNvbnNvbGUpP1wiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdTA0MUVcdTA0NDdcdTA0MzVcdTA0NDBcdTA0MzVcdTA0MzRcdTA0NEMgXHUwNDM3XHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDNFXHUwNDNBIFx1MDQzRFx1MDQzMCBcdTA0M0ZcdTA0M0VcdTA0MzJcdTA0NDJcdTA0M0VcdTA0NDBcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzVcIixcbiAgICBDTE9TRTogXCJcdTA0MTdcdTA0MzBcdTA0M0FcdTA0NDBcdTA0NEJcdTA0NDJcdTA0NENcIixcbiAgICBORVc6IFwiXHUwNDFEXHUwNDNFXHUwNDMyXHUwNDRCXHUwNDM1XCIsXG4gICAgWUVTVEVSREFZOiBcIlx1MDQxMlx1MDQ0N1x1MDQzNVx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQzNVwiLFxuICAgIFRPREFZOiBcIlx1MDQyMVx1MDQzNVx1MDQzM1x1MDQzRVx1MDQzNFx1MDQzRFx1MDQ0Rlx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQzNVwiLFxuICAgIFRPTU9SUk9XOiBcIlx1MDQxN1x1MDQzMFx1MDQzMlx1MDQ0Mlx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzRFx1MDQzOFx1MDQzNVwiLFxuXG4gICAgLy8gc3RhdHMtbW9kYWwudHN4XG4gICAgU1RBVFNfVElUTEU6IFwiXHUwNDIxXHUwNDQyXHUwNDMwXHUwNDQyXHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNBXHUwNDMwXCIsXG4gICAgTU9OVEg6IFwiXHUwNDFDXHUwNDM1XHUwNDQxXHUwNDRGXHUwNDQ2XCIsXG4gICAgUVVBUlRFUjogXCJcdTA0MjdcdTA0MzVcdTA0NDJcdTA0MzJcdTA0MzVcdTA0NDBcdTA0NDJcdTA0NENcIixcbiAgICBZRUFSOiBcIlx1MDQxM1x1MDQzRVx1MDQzNFwiLFxuICAgIExJRkVUSU1FOiBcIlx1MDQxMlx1MDQ0MVx1MDQ1MSBcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M0NcdTA0NEZcIixcbiAgICBGT1JFQ0FTVDogXCJcdTA0MUZcdTA0NDBcdTA0M0VcdTA0MzNcdTA0M0RcdTA0M0VcdTA0MzdcIixcbiAgICBGT1JFQ0FTVF9ERVNDOiBcIlx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0EgXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDRGXHUwNDQ5XHUwNDM4XHUwNDQ1IFx1MDQzMiBcdTA0MzFcdTA0NDNcdTA0MzRcdTA0NDNcdTA0NDlcdTA0MzVcdTA0M0NcIixcbiAgICBTQ0hFRFVMRUQ6IFwiXHUwNDE3XHUwNDMwXHUwNDNGXHUwNDNCXHUwNDMwXHUwNDNEXHUwNDM4XHUwNDQwXHUwNDNFXHUwNDMyXHUwNDMwXHUwNDNEXHUwNDNFXCIsXG4gICAgREFZUzogXCJcdTA0MTRcdTA0M0RcdTA0MzVcdTA0MzlcIixcbiAgICBOVU1CRVJfT0ZfQ0FSRFM6IFwiXHUwNDFBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIFJFVklFV1NfUEVSX0RBWTogXCJcdTA0MjFcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFOiAke2F2Z30gXHUwNDNGXHUwNDNFXHUwNDMyXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM5L1x1MDQzNFx1MDQzNVx1MDQzRFx1MDQ0Q1wiLCAvLyEhIVxuICAgIElOVEVSVkFMUzogXCJcdTA0MThcdTA0M0RcdTA0NDJcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzBcdTA0M0JcdTA0NEJcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJcdTA0MUZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0FcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDM1XHUwNDNEXHUwNDM4IFx1MDQzNFx1MDQzRSBcdTA0NDFcdTA0M0JcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NEVcdTA0NDlcdTA0MzVcdTA0MzNcdTA0M0UgXHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwXHUwNDM3XHUwNDMwIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQSBcdTA0MzJcdTA0M0UgXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzMlx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzNVx1MDQzRFx1MDQzOFx1MDQ0RlwiLFxuICAgIENPVU5UOiBcIlx1MDQxQVx1MDQzRVx1MDQzQlx1MDQzOFx1MDQ0N1x1MDQzNVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRVwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIlx1MDQyMVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQzRFx1MDQzOFx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0E6ICR7YXZnfSwgXHUwNDIxXHUwNDMwXHUwNDNDXHUwNDRCXHUwNDM5IFx1MDQzNFx1MDQzQlx1MDQzOFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzOSBcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0M0NcdTA0MzVcdTA0MzZcdTA0NDNcdTA0NDJcdTA0M0VcdTA0M0E6ICR7bG9uZ2VzdH1cIixcbiAgICBFQVNFUzogXCJcdTA0MUJcdTA0NTFcdTA0MzNcdTA0M0FcdTA0M0VcdTA0NDFcdTA0NDJcdTA0NEMoXHUwNDNGXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDNDXHUwNDM1XHUwNDQyXHUwNDQwIFx1MDQzMiBcdTA0MzBcdTA0M0JcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0M0NcdTA0MzUsIFx1MDQzQVx1MDQzRVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQ0Qlx1MDQzOSBcdTA0MzJcdTA0M0JcdTA0MzhcdTA0NEZcdTA0MzVcdTA0NDIgXHUwNDNEXHUwNDMwIFx1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0Mlx1MDQzNVx1MDQ0MiBcdTA0MzggXHUwNDMyXHUwNDQwXHUwNDM1XHUwNDNDXHUwNDRGIFx1MDQzRlx1MDQzRVx1MDQzQVx1MDQzMFx1MDQzN1x1MDQzMCBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0EpIFxcbiAoXHUwNDNFXHUwNDQyIFx1MDQzMFx1MDQzRFx1MDQzM1x1MDQzQi4gZWFzZSwgXHUwNDQxXHUwNDNDIFx1MDQzRFx1MDQzMFx1MDQ0MVx1MDQ0Mlx1MDQ0MFx1MDQzRVx1MDQzOVx1MDQzQVx1MDQzOCBcdTA0MzBcdTA0M0JcdTA0MzNcdTA0M0VcdTA0NDBcdTA0MzhcdTA0NDJcdTA0M0NcdTA0MzApXCIsXG4gICAgRUFTRVNfU1VNTUFSWTogXCJcdTA0MjFcdTA0NDBcdTA0MzVcdTA0MzRcdTA0M0RcdTA0MzVcdTA0MzUgXHUwNDNBXHUwNDNFXHUwNDNCXHUwNDM4XHUwNDQ3XHUwNDM1XHUwNDQxXHUwNDQyXHUwNDMyXHUwNDNFIFx1MDQxQlx1MDQ1MVx1MDQzM1x1MDQzQVx1MDQzRVx1MDQ0MVx1MDQ0Mlx1MDQzODogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHUwNDIyXHUwNDM4XHUwNDNGXHUwNDRCIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQVwiLFxuICAgIENBUkRfVFlQRVNfREVTQzogXCJcdTA0MkRcdTA0NDJcdTA0M0UgXHUwNDMyXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDMwXHUwNDRGIFx1MDQ0MVx1MDQzRlx1MDQ0MFx1MDQ0Rlx1MDQ0Mlx1MDQzMFx1MDQzRFx1MDQzRFx1MDQ0Qlx1MDQzNSBcdTA0M0FcdTA0MzBcdTA0NDBcdTA0NDJcdTA0M0VcdTA0NDdcdTA0M0FcdTA0MzgsIFx1MDQzNVx1MDQ0MVx1MDQzQlx1MDQzOCBcdTA0NDdcdTA0NDJcdTA0M0U6XCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJcdTA0MURcdTA0M0VcdTA0MzJcdTA0NEJcdTA0NDVcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiXHUwNDFDXHUwNDNFXHUwNDNCXHUwNDNFXHUwNDM0XHUwNDRCXHUwNDQ1XCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJcdTA0MTJcdTA0MzdcdTA0NDBcdTA0M0VcdTA0NDFcdTA0M0JcdTA0NEJcdTA0NDVcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiXHUwNDEyXHUwNDQxXHUwNDM1XHUwNDMzXHUwNDNFIFx1MDQzQVx1MDQzMFx1MDQ0MFx1MDQ0Mlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQTogJHt0b3RhbENhcmRzQ291bnR9XCIsXG59O1xuIiwgIi8vIFRhbWlsXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFRlbHVndVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBUaGFpXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFRcdTAwRkNya1x1MDBFN2VcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gVWtyYWluaWFuXG5cbmV4cG9ydCBkZWZhdWx0IHt9O1xuIiwgIi8vIFVyZHVcblxuZXhwb3J0IGRlZmF1bHQge307XG4iLCAiLy8gVmlldG5hbWVzZVxuXG5leHBvcnQgZGVmYXVsdCB7fTtcbiIsICIvLyBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODdcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIGZsYXNoY2FyZC1tb2RhbC50c3hcbiAgICBERUNLUzogXCJcdTUzNjFcdTdFQzRcIixcbiAgICBEVUVfQ0FSRFM6IFwiXHU1MjMwXHU2NzFGXHU1MzYxXHU3MjQ3XCIsXG4gICAgTkVXX0NBUkRTOiBcIlx1NjVCMFx1NTM2MVx1NzI0N1wiLFxuICAgIFRPVEFMX0NBUkRTOiBcIlx1NTE2OFx1OTBFOFx1NTM2MVx1NzI0N1wiLFxuICAgIEJBQ0s6IFwiQmFja1wiLFxuICAgIFNLSVA6IFwiU2tpcFwiLFxuICAgIEVESVRfQ0FSRDogXCJFZGl0IENhcmRcIixcbiAgICBSRVNFVF9DQVJEX1BST0dSRVNTOiBcIlx1OTFDRFx1N0Y2RVx1NTM2MVx1NzI0N1wiLFxuICAgIEhBUkQ6IFwiXHU4RjgzXHU5NkJFXCIsXG4gICAgR09PRDogXCJcdThCQjBcdTVGOTdcIixcbiAgICBFQVNZOiBcIlx1N0I4MFx1NTM1NVwiLFxuICAgIFNIT1dfQU5TV0VSOiBcIlx1NjYzRVx1NzkzQVx1N0I1NFx1Njg0OFwiLFxuICAgIENBUkRfUFJPR1JFU1NfUkVTRVQ6IFwiXHU1MzYxXHU3MjQ3XHU1REYyXHU4OEFCXHU5MUNEXHU3RjZFXHUzMDAyXCIsXG4gICAgU0FWRTogXCJTYXZlXCIsXG4gICAgQ0FOQ0VMOiBcIkNhbmNlbFwiLFxuICAgIE5PX0lOUFVUOiBcIk5vIGlucHV0IHByb3ZpZGVkLlwiLFxuICAgIENVUlJFTlRfRUFTRV9IRUxQX1RFWFQ6IFwiQ3VycmVudCBFYXNlOiBcIixcbiAgICBDVVJSRU5UX0lOVEVSVkFMX0hFTFBfVEVYVDogXCJDdXJyZW50IEludGVydmFsOiBcIixcbiAgICBDQVJEX0dFTkVSQVRFRF9GUk9NOiBcIkdlbmVyYXRlZCBmcm9tOiAke25vdGVQYXRofVwiLFxuXG4gICAgLy8gbWFpbi50c1xuICAgIE9QRU5fTk9URV9GT1JfUkVWSUVXOiBcIlx1NjI1M1x1NUYwMFx1NEUwMFx1NEUyQVx1N0IxNFx1OEJCMFx1NUYwMFx1NTlDQlx1NTkwRFx1NEU2MFwiLFxuICAgIFJFVklFV19DQVJEUzogXCJcdTU5MERcdTRFNjBcdTUzNjFcdTcyNDdcIixcbiAgICBSRVZJRVdfRUFTWV9GSUxFX01FTlU6IFwiXHU1OTBEXHU0RTYwXHVGRjFBXHU3QjgwXHU1MzU1XCIsXG4gICAgUkVWSUVXX0dPT0RfRklMRV9NRU5VOiBcIlx1NTkwRFx1NEU2MFx1RkYxQVx1OEJCMFx1NUY5N1wiLFxuICAgIFJFVklFV19IQVJEX0ZJTEVfTUVOVTogXCJcdTU5MERcdTRFNjBcdUZGMUFcdThGODNcdTk2QkVcIixcbiAgICBSRVZJRVdfTk9URV9FQVNZX0NNRDogXCJcdTY4MDdcdThCQjBcdTRFM0FcdTIwMUNcdTdCODBcdTUzNTVcdTIwMURcIixcbiAgICBSRVZJRVdfTk9URV9HT09EX0NNRDogXCJcdTY4MDdcdThCQjBcdTRFM0FcdTIwMUNcdThCQjBcdTVGOTdcdTIwMURcIixcbiAgICBSRVZJRVdfTk9URV9IQVJEX0NNRDogXCJcdTY4MDdcdThCQjBcdTRFM0FcdTIwMUNcdThGODNcdTk2QkVcdTIwMURcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlx1NTkwRFx1NEU2MFx1NjI0MFx1NjcwOVx1N0IxNFx1OEJCMFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1NTkwRFx1NEU2MFx1NkI2NFx1N0IxNFx1OEJCMFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJcdTk2QzZcdTRFMkRcdTU5MERcdTRFNjBcdTZCNjRcdTdCMTRcdThCQjBcdTRFMkRcdTc2ODRcdTUzNjFcdTcyNDdcIixcbiAgICBWSUVXX1NUQVRTOiBcIlx1NjdFNVx1NzcwQlx1NjU3MFx1NjM2RVwiLFxuICAgIFNUQVRVU19CQVI6IFwiXHU1OTBEXHU0RTYwOiAke2R1ZU5vdGVzQ291bnR9IFx1N0IxNFx1OEJCMCwgJHtkdWVGbGFzaGNhcmRzQ291bnR9IFx1NTM2MVx1NzI0N1x1NURGMlx1NTIzMFx1NjcxRlwiLFxuICAgIFNZTkNfVElNRV9UQUtFTjogXCJcdTU0MENcdTZCNjVcdTY1RjZcdTk1RjQgJHt0fW1zXCIsXG4gICAgTk9URV9JTl9JR05PUkVEX0ZPTERFUjogXCJcdTdCMTRcdThCQjBcdTRGRERcdTVCNThcdTU3MjhcdTVERjJcdTg4QUJcdTVGRkRcdTc1NjVcdTc2ODRcdThERUZcdTVGODRcdTRFMkRcdUZGMDhcdTY4QzBcdTY3RTVcdThCQkVcdTdGNkVcdTkwMDlcdTk4NzlcdUZGMDlcdTMwMDJcIixcbiAgICBQTEVBU0VfVEFHX05PVEU6IFwiXHU4QkY3XHU1QzA2XHU5NzAwXHU4OTgxXHU1OTBEXHU0RTYwXHU3Njg0XHU3QjE0XHU4QkIwXHU0RTJEXHU1MkEwXHU1MTY1XHU2QjYzXHU3ODZFXHU3Njg0XHU2ODA3XHU3QjdFXHVGRjA4XHU2OEMwXHU2N0U1XHU4QkJFXHU3RjZFXHU5MDA5XHU5ODc5XHVGRjA5XHUzMDAyXCIsXG4gICAgUkVTUE9OU0VfUkVDRUlWRUQ6IFwiXHU1M0NEXHU5OTg4XHU1REYyXHU2NTM2XHU1MjMwXCIsXG4gICAgTk9fREVDS19FWElTVFM6IFwiXHU2Q0ExXHU2NzA5ICR7ZGVja05hbWV9IFx1NTM2MVx1N0VDNFwiLFxuICAgIEFMTF9DQVVHSFRfVVA6IFwiXHU5MEZEXHU1OTBEXHU0RTYwXHU1QjhDXHU1NTY2XHVGRjBDXHU0RjYwXHU3NzFGXHU2OEQyXHVGRjAxXCIsXG5cbiAgICAvLyBzY2hlZHVsaW5nLnRzXG4gICAgREFZU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1NTkyOVwiLFxuICAgIE1PTlRIU19TVFJfSVZMOiBcIiR7aW50ZXJ2YWx9IFx1NjcwOFwiLFxuICAgIFlFQVJTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gXHU1RTc0XCIsXG4gICAgREFZU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1NTkyOVwiLFxuICAgIE1PTlRIU19TVFJfSVZMX01PQklMRTogXCIke2ludGVydmFsfVx1NjcwOFwiLFxuICAgIFlFQVJTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHU1RTc0XCIsXG5cbiAgICAvLyBzZXR0aW5ncy50c1xuICAgIFNFVFRJTkdTX0hFQURFUjogXCJcdTk1RjRcdTk2OTRcdTkxQ0RcdTU5MERcdTYzRDJcdTRFRjYgLSBcdThCQkVcdTdGNkVcIixcbiAgICBDSEVDS19XSUtJOiAnXHU0RTg2XHU4OUUzXHU2NkY0XHU1OTFBLCBcdThCRjdcdTcwQjlcdTUxRkIgPGEgaHJlZj1cIiR7d2lraV91cmx9XCI+d2lraTwvYT4uJyxcbiAgICBGT0xERVJTX1RPX0lHTk9SRTogXCJcdTVGRkRcdTc1NjVcdTZCNjRcdTY1ODdcdTRFRjZcdTU5MzlcIixcbiAgICBGT0xERVJTX1RPX0lHTk9SRV9ERVNDOiBcIlx1OEY5M1x1NTE2NVx1NjU4N1x1NEVGNlx1NTkzOVx1OERFRlx1NUY4NFx1RkYwQ1x1NzUyOFx1NjVCMFx1NUVGQVx1ODg0Q1x1NTIwNlx1OTY5NFx1RkYwQ1x1NEY4Qlx1NTk4Mlx1RkYxQVRlbXBsYXRlcyBNZXRhL1NjcmlwdHNcIixcbiAgICBGTEFTSENBUkRTOiBcIlx1NTM2MVx1NzI0N1wiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0xBQkVMOiBcIlx1MjAxQ1x1N0I4MFx1NTM1NVx1MjAxRFx1NjMwOVx1OTRBRVx1NjU4N1x1NjcyQ1wiLFxuICAgIEZMQVNIQ0FSRF9HT09EX0xBQkVMOiBcIlx1MjAxQ1x1OEJCMFx1NUY5N1x1MjAxRFx1NjMwOVx1OTRBRVx1NjU4N1x1NjcyQ1wiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0xBQkVMOiBcIlx1MjAxQ1x1OEY4M1x1OTZCRVx1MjAxRFx1NjMwOVx1OTRBRVx1NjU4N1x1NjcyQ1wiLFxuICAgIEZMQVNIQ0FSRF9FQVNZX0RFU0M6IFwiXHU4MUVBXHU1QjlBXHU0RTQ5XHUyMDFDXHU3QjgwXHU1MzU1XHUyMDFEXHU2MzA5XHU5NEFFXHU3Njg0XHU2ODA3XHU3QjdFXCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfREVTQzogXCJcdTgxRUFcdTVCOUFcdTRFNDlcdTIwMUNcdThCQjBcdTVGOTdcdTIwMURcdTYzMDlcdTk0QUVcdTc2ODRcdTY4MDdcdTdCN0VcIixcbiAgICBGTEFTSENBUkRfSEFSRF9ERVNDOiBcIlx1ODFFQVx1NUI5QVx1NEU0OVx1MjAxQ1x1OEY4M1x1OTZCRVx1MjAxRFx1NjMwOVx1OTRBRVx1NzY4NFx1NjgwN1x1N0I3RVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTOiBcIlx1NTM2MVx1NzI0N1x1NjgwN1x1N0I3RVwiLFxuICAgIEZMQVNIQ0FSRF9UQUdTX0RFU0M6IFwiXHU4RjkzXHU1MTY1XHU2ODA3XHU3QjdFXHVGRjBDXHU3NTI4XHU3QTdBXHU2ODNDXHU2MjE2XHU2NUIwXHU1RUZBXHU4ODRDXHU1MjA2XHU5Njk0XHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBI2ZsYXNoY2FyZHMgI2RlY2syICNkZWNrMy5cIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1M6IFwiXHU2NjJGXHU1NDI2XHU1QzA2XHU2NTg3XHU0RUY2XHU1OTM5XHU1MTg1XHU1QkI5XHU4RjZDXHU2MzYyXHU0RTNBXHU1MzYxXHU3MjQ3XHU3RUM0XHU1NDhDXHU1QjUwXHU1MzYxXHU3MjQ3XHU3RUM0XHVGRjFGXCIsXG4gICAgQ09OVkVSVF9GT0xERVJTX1RPX0RFQ0tTX0RFU0M6IFwiXHU2QjY0XHU5MDA5XHU5ODc5XHU0RTNBXHU1MzYxXHU3MjQ3XHU2ODA3XHU3QjdFXHU5MDA5XHU5ODc5XHU3Njg0XHU2NkZGXHU0RUUzXHU5MDA5XHU5ODc5XHUzMDAyXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFM6IFwiXHU2NjJGXHU1NDI2XHU1QzA2XHU4QkExXHU1MjEyXHU5MUNEXHU1OTBEXHU2NUY2XHU5NUY0XHU0RkREXHU1QjU4XHU1NzI4XHU1MzYxXHU3MjQ3XHU2NzAwXHU1NDBFXHU0RTAwXHU4ODRDXHU3Njg0XHU1NDBDXHU0RTAwXHU4ODRDXHVGRjFGXCIsXG4gICAgSU5MSU5FX1NDSEVEVUxJTkdfQ09NTUVOVFNfREVTQzogXCJIVE1MXHU2Q0U4XHU5MUNBXHU0RTBEXHU1MThEXHU3ODM0XHU1NzRGXHU1MjE3XHU4ODY4XHU2ODNDXHU1RjBGXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZOiBcIlx1NUMwNlx1NTE3M1x1ODA1NFx1NTM2MVx1NzI0N1x1OTY5MFx1ODVDRlx1ODFGM1x1NEUwQlx1NEUwMFx1NTkyOVx1RkYxRlwiLFxuICAgIEJVUllfU0lCTElOR1NfVElMTF9ORVhUX0RBWV9ERVNDOiBcIlx1NTE3M1x1ODA1NFx1NTM2MVx1NzI0N1x1NjYyRlx1Njc2NVx1ODFFQVx1NTQwQ1x1NEUwMFx1NTM2MVx1NzI0N1x1NzY4NFx1NEUwRFx1NTQwQ1x1NUY2Mlx1NUYwRlx1RkYwQyBcdTRGOEJcdTU5ODJcdUZGMUFcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdTUzNjFcdTcyNDdcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVDogXCJcdTU3MjhcdTUzNjFcdTcyNDdcdTRFMkRcdTY2M0VcdTc5M0FcdTRFMEFcdTRFMEJcdTY1ODdcdUZGMUZcIixcbiAgICBTSE9XX0NBUkRfQ09OVEVYVF9ERVNDOiBcIlx1NEY4Qlx1NTk4Mlx1RkYxQVx1NjgwN1x1OTg5OCA+IFx1NTI2Rlx1NjgwN1x1OTg5OCA+IFx1NUMwRlx1NjgwN1x1OTg5OCA+IC4uLiA+IFx1NUMwRlx1NjgwN1x1OTg5OFwiLFxuICAgIENBUkRfTU9EQUxfSEVJR0hUX1BFUkNFTlQ6IFwiXHU1MzYxXHU3MjQ3XHU5QUQ4XHU1RUE2XHU3NjdFXHU1MjA2XHU2QkQ0XCIsXG4gICAgQ0FSRF9NT0RBTF9TSVpFX1BFUkNFTlRfREVTQzogXCJcdThCRjdcdTU3MjhcdTc5RkJcdTUyQThcdTdBRUZcdTRGN0ZcdTc1MjhcdTVFNzZcdTk3MDBcdTg5ODFcdTZENEZcdTg5QzhcdThGODNcdTU5MjdcdTU2RkVcdTcyNDdcdTY1RjZcdThCQkVcdTRFM0ExMDAlXCIsXG4gICAgUkVTRVRfREVGQVVMVDogXCJcdTkxQ0RcdTdGNkVcdTRFM0FcdTlFRDhcdThCQTRcIixcbiAgICBDQVJEX01PREFMX1dJRFRIX1BFUkNFTlQ6IFwiXHU1MzYxXHU3MjQ3XHU1QkJEXHU1RUE2XHU3NjdFXHU1MjA2XHU2QkQ0XCIsXG4gICAgUkFORE9NSVpFX0NBUkRfT1JERVI6IFwiXHU1OTBEXHU0RTYwXHU2NUY2XHU5NjhGXHU2NzNBXHU2NjNFXHU3OTNBXHU1MzYxXHU3MjQ3XHVGRjFGXCIsXG4gICAgRElTQUJMRV9DTE9aRV9DQVJEUzogXCJcdTRFMERcdThGREJcdTg4NENcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdUZGMUZcIixcbiAgICBDT05WRVJUX0hJR0hMSUdIVFNfVE9fQ0xPWkVTOiBcIlx1NUMwNiA9PVx1OUFEOFx1NEVBRT09IFx1OEY2Q1x1NjM2Mlx1NEUzQVx1NUI4Q1x1NUY2Mlx1NTg2Qlx1N0E3QVx1RkYxRlwiLFxuICAgIENPTlZFUlRfQk9MRF9URVhUX1RPX0NMT1pFUzogXCJcdTVDMDYgKipcdTdDOTdcdTRGNTMqKiBcdThGNkNcdTYzNjJcdTRFM0FcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdUZGMUZcIixcbiAgICBDT05WRVJUX0NVUkxZX0JSQUNLRVRTX1RPX0NMT1pFUzogXCJcdTVDMDYge3tcdTU5MjdcdTYyRUNcdTUzRjd9fSBcdThGNkNcdTYzNjJcdTRFM0FcdTVCOENcdTVGNjJcdTU4NkJcdTdBN0FcdUZGMUZcIixcbiAgICBJTkxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1NTM1NVx1ODg0Q1x1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1N0IyNlwiLFxuICAgIEZJWF9TRVBBUkFUT1JTX01BTlVBTExZX1dBUk5JTkc6IFwiXHU2Q0U4XHU2MTBGXHVGRjFBXHU2NkY0XHU2NTM5XHU2QjY0XHU5MDA5XHU5ODc5XHU1NDBFXHU0RjYwXHU1QzA2XHU5NzAwXHU4OTgxXHU4MUVBXHU4ODRDXHU2NkY0XHU2NTM5XHU1REYyXHU1QjU4XHU1NzI4XHU1MzYxXHU3MjQ3XHU3Njg0XHU1MjA2XHU5Njk0XHU3QjI2XHUzMDAyXCIsXG4gICAgSU5MSU5FX1JFVkVSU0VEX0NBUkRTX1NFUEFSQVRPUjogXCJcdTUzNTVcdTg4NENcdTdGRkJcdThGNkNcdTUzNjFcdTcyNDdcdTc2ODRcdTUyMDZcdTk2OTRcdTdCMjZcIixcbiAgICBNVUxUSUxJTkVfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1NTkxQVx1ODg0Q1x1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1N0IyNlwiLFxuICAgIE1VTFRJTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHU1OTFBXHU4ODRDXHU3RkZCXHU4RjZDXHU1MzYxXHU3MjQ3XHU3Njg0XHU1MjA2XHU5Njk0XHU3QjI2XCIsXG4gICAgTk9URVM6IFwiXHU3QjE0XHU4QkIwXCIsXG4gICAgUkVWSUVXX1BBTkVfT05fU1RBUlRVUDogXCJFbmFibGUgbm90ZSByZXZpZXcgcGFuZSBvbiBzdGFydHVwXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHU1OTBEXHU0RTYwXHU2ODA3XHU3QjdFXCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzogXCJcdThGOTNcdTUxNjVcdTY4MDdcdTdCN0VcdUZGMENcdTc1MjhcdTdBN0FcdTY4M0NcdTYyMTZcdTY1QjBcdTVFRkFcdTg4NENcdTUyMDZcdTk2OTRcdUZGMENcdTRGOEJcdTU5ODJcdUZGMUEjcmV2aWV3ICN0YWcyICN0YWczLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiXHU1OTBEXHU0RTYwXHU5NjhGXHU2NzNBXHU3QjE0XHU4QkIwXCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOiBcIlx1NTE3M1x1OTVFRFx1NkI2NFx1OTAwOVx1OTg3OVx1RkYwQ1x1N0IxNFx1OEJCMFx1NUMwNlx1NEVFNVx1OTFDRFx1ODk4MVx1NUVBNihQYWdlUmFuaylcdTYzOTJcdTVFOEZcdTMwMDJcIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJcdTU5MERcdTRFNjBcdTU0MEVcdTgxRUFcdTUyQThcdTYyNTNcdTVGMDBcdTRFMEJcdTRFMDBcdTRFMkFcdTdCMTRcdThCQjBcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OUzogXCJcdTUxNzNcdTk1RURcdTY1ODdcdTRFRjZcdTkwMDlcdTUzNTVcdTRFMkRcdTc2ODRcdTU5MERcdTRFNjBcdTkwMDlcdTk4NzkgXHU0RjhCXHU1OTgyXHVGRjFBXHU1OTBEXHU0RTYwXHVGRjFBXHU3QjgwXHU1MzU1IFx1OEJCMFx1NUY5NyBcdThGODNcdTk2QkVcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOlxuICAgICAgICBcIlx1NTE3M1x1OTVFRFx1NkI2NFx1OTAwOVx1OTg3OVx1NTQwRVx1NEY2MFx1NTNFRlx1NEVFNVx1NEY3Rlx1NzUyOFx1NUZFQlx1NjM3N1x1OTUyRVx1NUYwMFx1NTlDQlx1NTkwRFx1NEU2MFx1MzAwMlx1OTFDRFx1NjVCMFx1NTQyRlx1NTJBOE9ic2lkaWFuXHU0RjdGXHU2NzJDXHU5MDA5XHU5ODc5XHU3NTFGXHU2NTQ4XHUzMDAyXCIsXG4gICAgTUFYX05fREFZU19SRVZJRVdfUVVFVUU6IFwiXHU1M0YzXHU4RkI5XHU2ODBGXHU0RTJEXHU2NjNFXHU3OTNBXHU3Njg0XHU2NzAwXHU1OTI3XHU1OTI5XHU2NTcwXCIsXG4gICAgTUlOX09ORV9EQVk6IFwiXHU1OTI5XHU2NTcwXHU2NzAwXHU1QzBGXHU1MDNDXHU0RTNBMVwiLFxuICAgIFZBTElEX05VTUJFUl9XQVJOSU5HOiBcIlx1OEJGN1x1OEY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NjU3MFx1NUI1N1x1MzAwMlwiLFxuICAgIFVJX1BSRUZFUkVOQ0VTOiBcIlx1NzUyOFx1NjIzN1x1NzU0Q1x1OTc2Mlx1OTk5Nlx1OTAwOVx1OTg3OVwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRTogXCJcdTc1MzJcdTY3N0ZcdTY4MTFcdTY3MDBcdTUyMURcdTVFOTRcdTY2M0VcdTc5M0FcdTRFM0FcdTVDNTVcdTVGMDBcIixcbiAgICBJTklUSUFMTFlfRVhQQU5EX1NVQkRFQ0tTX0lOX1RSRUVfREVTQzpcbiAgICAgICAgXCJcdTUxNzNcdTk1RURcdTZCNjRcdTkwMDlcdTk4NzlcdTUzRUZcdTYyOThcdTUzRTBcdTU0MENcdTRFMDBcdTVGMjBcdTUzNjFcdTcyNDdcdTRFMkRcdTc2ODRcdTVENENcdTU5NTdcdTcyNENcdTdFQzRcdTMwMDJcdTU5ODJcdTY3OUNcdTYwQThcdTc2ODRcdTUzNjFcdTcyNDdcdTVDNUVcdTRFOEVcdTU0MENcdTRFMDBcdTY1ODdcdTRFRjZcdTRFMkRcdTc2ODRcdThCQjhcdTU5MUFcdTU5NTdcdTcyNENcdUZGMENcdTUyMTlcdTVGODhcdTY3MDlcdTc1MjhcdTMwMDJcIixcbiAgICBBTEdPUklUSE06IFwiXHU3Qjk3XHU2Q0Q1XCIsXG4gICAgQ0hFQ0tfQUxHT1JJVEhNX1dJS0k6ICdcdTRFODZcdTg5RTNcdTY2RjRcdTU5MUEsIFx1OEJGN1x1NzBCOVx1NTFGQiA8YSBocmVmPVwiJHthbGdvX3VybH1cIj5hbGdvcml0aG0gaW1wbGVtZW50YXRpb248L2E+LicsXG4gICAgQkFTRV9FQVNFOiBcIlx1NTdGQVx1Nzg0MFx1NjM4Q1x1NjNFMVx1N0EwQlx1NUVBNlwiLFxuICAgIEJBU0VfRUFTRV9ERVNDOiBcIlx1NjcwMFx1NUMwRlx1NTAzQzEzMFx1RkYwQ1x1NjNBOFx1ODM1MFx1NTAzQ1x1N0VBNjI1MC5cIixcbiAgICBCQVNFX0VBU0VfTUlOX1dBUk5JTkc6IFwiXHU1N0ZBXHU3ODQwXHU2MzhDXHU2M0UxXHU3QTBCXHU1RUE2XHU3Njg0XHU2NzAwXHU1QzBGXHU1MDNDXHU0RTNBMTMwXHUzMDAyXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFOiBcIlx1NUMwNlx1NTkwRFx1NEU2MFx1NjVGNlx1NjgwN1x1NkNFOFx1NEUzQVx1MjAxQ1x1OEY4M1x1OTZCRVx1MjAxRFx1NzY4NFx1NTM2MVx1NzI0N1x1NjIxNlx1N0IxNFx1OEJCMFx1NTkwRFx1NEU2MFx1OTVGNFx1OTY5NFx1N0YyOVx1NzdFRFwiLFxuICAgIExBUFNFX0lOVEVSVkFMX0NIQU5HRV9ERVNDOiBcIlx1NjVCMFx1NTkwRFx1NEU2MFx1OTVGNFx1OTY5NCA9IFx1NTM5Rlx1NTkwRFx1NEU2MFx1OTVGNFx1OTY5NCAqIFx1OTVGNFx1OTY5NFx1NjUzOVx1NTNEOFx1N0NGQlx1NjU3MCAvIDEwMC5cIixcbiAgICBFQVNZX0JPTlVTOiBcIlx1N0I4MFx1NTM1NVx1NTk1Nlx1NTJCMVwiLFxuICAgIEVBU1lfQk9OVVNfREVTQzogXCJcdTdCODBcdTUzNTVcdTU5NTZcdTUyQjFcdThCQkVcdTVCOUFcdTIwMUNcdThCQjBcdTVGOTdcdTIwMURcdTU0OENcdTIwMUNcdTdCODBcdTUzNTVcdTIwMURcdTUzNjFcdTcyNDdcdTYyMTZcdTdCMTRcdThCQjBcdTc2ODRcdTU5MERcdTRFNjBcdTk1RjRcdTk2OTRcdTVERUVcdThERERcdUZGMDhcdTY3MDBcdTVDMEZcdTUwM0MxMDAlXHVGRjA5XHUzMDAyXCIsXG4gICAgRUFTWV9CT05VU19NSU5fV0FSTklORzogXCJcdTdCODBcdTUzNTVcdTU5NTZcdTUyQjFcdTgxRjNcdTVDMTFcdTRFM0ExMDBcdTMwMDJcIixcbiAgICBNQVhfSU5URVJWQUw6IFwiXHU2NzAwXHU1OTI3XHU5NUY0XHU5Njk0XCIsXG4gICAgTUFYX0lOVEVSVkFMX0RFU0M6IFwiXHU4QkJFXHU1QjlBXHU1OTBEXHU0RTYwXHU3Njg0XHU2NzAwXHU1OTI3XHU5NUY0XHU5Njk0XHU2NUY2XHU5NUY0XHVGRjA4XHU5RUQ4XHU4QkE0XHU1MDNDMTAwXHU1RTc0XHVGRjA5XHUzMDAyXCIsXG4gICAgTUFYX0lOVEVSVkFMX01JTl9XQVJOSU5HOiBcIlx1NjcwMFx1NTkyN1x1OTVGNFx1OTY5NFx1ODFGM1x1NUMxMVx1NEUzQTFcdTU5MjlcIixcbiAgICBNQVhfTElOS19DT05UUklCOiBcIlx1NjcwMFx1NTkyN1x1OTRGRVx1NjNBNVx1NjUzNlx1NzZDQVwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUJfREVTQzogXCJcdTc1MzFcdTUzOUZcdTYzOENcdTYzRTFcdTdBMEJcdTVFQTZcdTk0RkVcdTYzQTVcdTc2ODRcdTdCMTRcdThCQjBcdTdFRDlcdTRFMEVcdTc2ODRcdTY3MDBcdTU5MjdcdTUyQTBcdTY3NDNcdTYzOENcdTYzRTFcdTVFQTZcdTY1MzZcdTc2Q0FcdTMwMDJcIixcbiAgICBMT0dHSU5HOiBcIlx1OEJCMFx1NUY1NVx1NEUyRFwiLFxuICAgIERJU1BMQVlfREVCVUdfSU5GTzogXCJcdTU3MjhcdTVGMDBcdTUzRDFcdTgwMDVcdTYzQTdcdTUyMzZcdTUzRjBcdTRFMkRcdTY2M0VcdTc5M0FcdThDMDNcdThCRDVcdTRGRTFcdTYwNkZcdUZGMUZcIixcblxuICAgIC8vIHNpZGViYXIudHNcbiAgICBOT1RFU19SRVZJRVdfUVVFVUU6IFwiXHU3QjE0XHU4QkIwXHU1OTBEXHU0RTYwXHU1RThGXHU1MjE3XCIsXG4gICAgQ0xPU0U6IFwiXHU0RTM0XHU4RkQxXCIsXG4gICAgTkVXOiBcIlx1NjVCMFwiLFxuICAgIFlFU1RFUkRBWTogXCJcdTY2MjhcdTU5MjlcIixcbiAgICBUT0RBWTogXCJcdTRFQ0FcdTU5MjlcIixcbiAgICBUT01PUlJPVzogXCJcdTY2MEVcdTU5MjlcIixcblxuICAgIC8vIHN0YXRzLW1vZGFsLnRzeFxuICAgIFNUQVRTX1RJVExFOiBcIlx1NjU3MFx1NjM2RVwiLFxuICAgIE1PTlRIOiBcIlx1NjcwOFwiLFxuICAgIFFVQVJURVI6IFwiXHU1QjYzXCIsXG4gICAgWUVBUjogXCJcdTVFNzRcIixcbiAgICBMSUZFVElNRTogXCJcdTUxNjhcdTkwRThcIixcbiAgICBGT1JFQ0FTVDogXCJcdTk4ODRcdTY3MUZcIixcbiAgICBGT1JFQ0FTVF9ERVNDOiBcIlx1NUMwNlx1ODk4MVx1NTIzMFx1NjcxRlx1NzY4NFx1NTM2MVx1NzI0N1x1NjU3MFx1OTFDRlwiLFxuICAgIFNDSEVEVUxFRDogXCJcdTVERjJcdTYzOTJcdTY3MUZcIixcbiAgICBEQVlTOiBcIlx1NTkyOVwiLFxuICAgIE5VTUJFUl9PRl9DQVJEUzogXCJcdTUzNjFcdTcyNDdcdTY1NzBcdTkxQ0ZcIixcbiAgICBSRVZJRVdTX1BFUl9EQVk6IFwiXHU1RTczXHU1NzQ3OiBcdTU5MERcdTRFNjAke2F2Z30gL1x1NTkyOVwiLFxuICAgIElOVEVSVkFMUzogXCJcdTk1RjRcdTk2OTRcIixcbiAgICBJTlRFUlZBTFNfREVTQzogXCJcdTUyMzBcdTRFMEJcdTRFMDBcdTZCMjFcdTU5MERcdTRFNjBcdTc2ODRcdTY1RjZcdTk1RjRcdTk1RjRcdTk2OTRcIixcbiAgICBDT1VOVDogXCJcdThCQTFcdTY1NzBcIixcbiAgICBJTlRFUlZBTFNfU1VNTUFSWTogXCJcdTVFNzNcdTU3NDdcdTk1RjRcdTk2OTRcdTY1RjZcdTk1RjQ6ICR7YXZnfSwgXHU2NzAwXHU5NTdGXHU5NUY0XHU5Njk0XHU2NUY2XHU5NUY0OiAke2xvbmdlc3R9XCIsXG4gICAgRUFTRVM6IFwiRWFzZXNcIixcbiAgICBFQVNFU19TVU1NQVJZOiBcIlx1NUU3M1x1NTc0N1x1NjM4Q1x1NjNFMVx1N0EwQlx1NUVBNjogJHthdmdFYXNlfVwiLFxuICAgIENBUkRfVFlQRVM6IFwiXHU1MzYxXHU3MjQ3XHU3QzdCXHU1NzhCXCIsXG4gICAgQ0FSRF9UWVBFU19ERVNDOiBcIlx1NTk4Mlx1NjcwOVx1RkYwQ1x1NUMwNlx1NjYzRVx1NzkzQVx1OTY5MFx1ODVDRlx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENBUkRfVFlQRV9ORVc6IFwiXHU2NUIwXCIsXG4gICAgQ0FSRF9UWVBFX1lPVU5HOiBcIlx1OEY4M1x1NjVCMFwiLFxuICAgIENBUkRfVFlQRV9NQVRVUkU6IFwiXHU3MTlGXHU2MDg5XCIsXG4gICAgQ0FSRF9UWVBFU19TVU1NQVJZOiBcIlx1NjAzQlx1NTM2MVx1NzI0N1x1NjU3MDogJHt0b3RhbENhcmRzQ291bnR9XCIsXG59O1xuIiwgIi8vIFx1N0U0MVx1OUFENFx1NEUyRFx1NjU4N1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZmxhc2hjYXJkLW1vZGFsLnRzeFxuICAgIERFQ0tTOiBcIlx1NzI0Q1x1N0Q0NFwiLFxuICAgIERVRV9DQVJEUzogXCJcdTUyMzBcdTY3MUZcdTUzNjFcdTcyNDdcIixcbiAgICBORVdfQ0FSRFM6IFwiXHU2NUIwXHU1MzYxXHU3MjQ3XCIsXG4gICAgVE9UQUxfQ0FSRFM6IFwiXHU1MTY4XHU5MEU4XHU1MzYxXHU3MjQ3XCIsXG4gICAgQkFDSzogXCJCYWNrXCIsXG4gICAgU0tJUDogXCJTa2lwXCIsXG4gICAgRURJVF9DQVJEOiBcIkVkaXQgQ2FyZFwiLFxuICAgIFJFU0VUX0NBUkRfUFJPR1JFU1M6IFwiXHU5MUNEXHU3RjZFXHU1MzYxXHU3MjQ3XCIsXG4gICAgSEFSRDogXCJcdThGMDNcdTk2RTNcIixcbiAgICBHT09EOiBcIlx1OEExOFx1NUY5N1wiLFxuICAgIEVBU1k6IFwiXHU3QzIxXHU1NUFFXCIsXG4gICAgU0hPV19BTlNXRVI6IFwiXHU5ODZGXHU3OTNBXHU3QjU0XHU2ODQ4XCIsXG4gICAgQ0FSRF9QUk9HUkVTU19SRVNFVDogXCJcdTUzNjFcdTcyNDdcdTVERjJcdTg4QUJcdTkxQ0RcdTdGNkVcdTMwMDJcIixcbiAgICBTQVZFOiBcIlNhdmVcIixcbiAgICBDQU5DRUw6IFwiQ2FuY2VsXCIsXG4gICAgTk9fSU5QVVQ6IFwiTm8gaW5wdXQgcHJvdmlkZWQuXCIsXG4gICAgQ1VSUkVOVF9FQVNFX0hFTFBfVEVYVDogXCJDdXJyZW50IEVhc2U6IFwiLFxuICAgIENVUlJFTlRfSU5URVJWQUxfSEVMUF9URVhUOiBcIkN1cnJlbnQgSW50ZXJ2YWw6IFwiLFxuICAgIENBUkRfR0VORVJBVEVEX0ZST006IFwiR2VuZXJhdGVkIGZyb206ICR7bm90ZVBhdGh9XCIsXG5cbiAgICAvLyBtYWluLnRzXG4gICAgT1BFTl9OT1RFX0ZPUl9SRVZJRVc6IFwiXHU2MjUzXHU5NThCXHU0RTAwXHU1MDBCXHU3QjQ2XHU4QTE4XHU5NThCXHU1OUNCXHU1RkE5XHU3RkQyXCIsXG4gICAgUkVWSUVXX0NBUkRTOiBcIlx1NUZBOVx1N0ZEMlx1NTM2MVx1NzI0N1wiLFxuICAgIFJFVklFV19FQVNZX0ZJTEVfTUVOVTogXCJcdTVGQTlcdTdGRDJcdUZGMUFcdTdDMjFcdTU1QUVcIixcbiAgICBSRVZJRVdfR09PRF9GSUxFX01FTlU6IFwiXHU1RkE5XHU3RkQyXHVGRjFBXHU4QTE4XHU1Rjk3XCIsXG4gICAgUkVWSUVXX0hBUkRfRklMRV9NRU5VOiBcIlx1NUZBOVx1N0ZEMlx1RkYxQVx1OEYwM1x1OTZFM1wiLFxuICAgIFJFVklFV19OT1RFX0VBU1lfQ01EOiBcIlx1NkExOVx1OEExOFx1NzBCQVx1MzAwQ1x1N0MyMVx1NTVBRVx1MzAwRFwiLFxuICAgIFJFVklFV19OT1RFX0dPT0RfQ01EOiBcIlx1NkExOVx1OEExOFx1NzBCQVx1MzAwQ1x1OEExOFx1NUY5N1x1MzAwRFwiLFxuICAgIFJFVklFV19OT1RFX0hBUkRfQ01EOiBcIlx1NkExOVx1OEExOFx1NzBCQVx1MzAwQ1x1OEYwM1x1OTZFM1x1MzAwRFwiLFxuICAgIFJFVklFV19DQVJEU19JTl9OT1RFOiBcIlx1NUZBOVx1N0ZEMlx1NkI2NFx1N0I0Nlx1OEExOFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQ0FSRFNfSU5fTk9URTogXCJcdTRFMERcdThBMDhcdTk2RTNcdTY2MTNcdTVFQTZcdTVGQTlcdTdGRDJcdTZCNjRcdTdCNDZcdThBMThcdTRFMkRcdTc2ODRcdTUzNjFcdTcyNDdcIixcbiAgICBSRVZJRVdfQUxMX0NBUkRTOiBcIlx1NUZBOVx1N0ZEMlx1NjI0MFx1NjcwOVx1N0I0Nlx1OEExOFx1NEUyRFx1NzY4NFx1NTM2MVx1NzI0N1wiLFxuICAgIENSQU1fQUxMX0NBUkRTOiBcIlNlbGVjdCBhIGRlY2sgdG8gY3JhbVwiLFxuICAgIFZJRVdfU1RBVFM6IFwiXHU2QUEyXHU4OTk2XHU2NTc4XHU2NERBXCIsXG4gICAgU1RBVFVTX0JBUjogXCJcdTVGQTlcdTdGRDI6ICR7ZHVlTm90ZXNDb3VudH0gXHU3QjQ2XHU4QTE4LCAke2R1ZUZsYXNoY2FyZHNDb3VudH0gXHU1MzYxXHU3MjQ3XHU1REYyXHU1MjMwXHU2NzFGXCIsXG4gICAgU1lOQ19USU1FX1RBS0VOOiBcIlx1NTQwQ1x1NkI2NVx1NjY0Mlx1OTU5MyAke3R9bXNcIixcbiAgICBOT1RFX0lOX0lHTk9SRURfRk9MREVSOiBcIlx1N0I0Nlx1OEExOFx1NTEzMlx1NUI1OFx1NTcyOFx1NURGMlx1ODhBQlx1NUZGRFx1NzU2NVx1NzY4NFx1OERFRlx1NUY5MVx1NEUyRFx1RkYwOFx1NkFBMlx1NjdFNVx1OEEyRFx1NUI5QVx1OTA3OFx1OTgwNVx1RkYwOVx1MzAwMlwiLFxuICAgIFBMRUFTRV9UQUdfTk9URTogXCJcdThBQ0JcdTVDMDdcdTk3MDBcdTg5ODFcdTVGQTlcdTdGRDJcdTc2ODRcdTdCNDZcdThBMThcdTRFMkRcdTUyQTBcdTUxNjVcdTZCNjNcdTc4QkFcdTc2ODRcdTZBMTlcdTdDNjRcdUZGMDhcdTZBQTJcdTY3RTVcdThBMkRcdTVCOUFcdTkwNzhcdTk4MDVcdUZGMDlcdTMwMDJcIixcbiAgICBSRVNQT05TRV9SRUNFSVZFRDogXCJcdTU2REVcdTk5NEJcdTVERjJcdTY1MzZcdTUyMzBcIixcbiAgICBOT19ERUNLX0VYSVNUUzogXCJcdTZDOTJcdTY3MDkgJHtkZWNrTmFtZX0gXHU3MjRDXHU3RDQ0XCIsXG4gICAgQUxMX0NBVUdIVF9VUDogXCJcdTkwRkRcdTVGQTlcdTdGRDJcdTVCOENcdTU1NjZcdUZGMENcdTRGNjBcdTc3MUZcdTY4RDJcdUZGMDFcIixcblxuICAgIC8vIHNjaGVkdWxpbmcudHNcbiAgICBEQVlTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gXHU1OTI5XCIsXG4gICAgTU9OVEhTX1NUUl9JVkw6IFwiJHtpbnRlcnZhbH0gXHU2NzA4XCIsXG4gICAgWUVBUlNfU1RSX0lWTDogXCIke2ludGVydmFsfSBcdTVFNzRcIixcbiAgICBEQVlTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHU1OTI5XCIsXG4gICAgTU9OVEhTX1NUUl9JVkxfTU9CSUxFOiBcIiR7aW50ZXJ2YWx9XHU2NzA4XCIsXG4gICAgWUVBUlNfU1RSX0lWTF9NT0JJTEU6IFwiJHtpbnRlcnZhbH1cdTVFNzRcIixcblxuICAgIC8vIHNldHRpbmdzLnRzXG4gICAgU0VUVElOR1NfSEVBREVSOiBcIlx1OTU5M1x1OTY5NFx1OTFDRFx1ODkwN1x1NTkxNlx1NjM5QiAtIFx1OEEyRFx1NUI5QVwiLFxuICAgIENIRUNLX1dJS0k6ICdcdTc3QURcdTg5RTNcdTY2RjRcdTU5MUEsIFx1OEFDQlx1OUVERVx1OTA3OCA8YSBocmVmPVwiJHt3aWtpX3VybH1cIj53aWtpPC9hPi4nLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFOiBcIlx1NUZGRFx1NzU2NVx1NkI2NFx1OENDN1x1NjU5OVx1NTkzRVwiLFxuICAgIEZPTERFUlNfVE9fSUdOT1JFX0RFU0M6IFwiXHU4RjM4XHU1MTY1XHU4Q0M3XHU2NTk5XHU1OTNFXHU4REVGXHU1RjkxXHVGRjA4XHU3NTI4XHU2M0RCXHU4ODRDXHU1QjU3XHU1MTQzXHU1MjA2XHU5Njk0XHVGRjA5XHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBVGVtcGxhdGVzIE1ldGEvU2NyaXB0c1wiLFxuICAgIEZMQVNIQ0FSRFM6IFwiXHU1MzYxXHU3MjQ3XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfTEFCRUw6IFwiXHU3QzIxXHU1NUFFXHU2MzA5XHU5MjE1XHU2NTg3XHU1QjU3XCIsXG4gICAgRkxBU0hDQVJEX0dPT0RfTEFCRUw6IFwiXHU4QTE4XHU1Rjk3XHU2MzA5XHU5MjE1XHU2NTg3XHU1QjU3XCIsXG4gICAgRkxBU0hDQVJEX0hBUkRfTEFCRUw6IFwiXHU4RjAzXHU5NkUzXHU2MzA5XHU5MjE1XHU2NTg3XHU1QjU3XCIsXG4gICAgRkxBU0hDQVJEX0VBU1lfREVTQzogXCJcdTgxRUFcdThBMDJcdTMwMENcdTdDMjFcdTU1QUVcdTMwMERcdTYzMDlcdTkyMTVcdTc2ODRcdTZBMTlcdTdDNjRcIixcbiAgICBGTEFTSENBUkRfR09PRF9ERVNDOiBcIlx1ODFFQVx1OEEwMlx1MzAwQ1x1OEExOFx1NUY5N1x1MzAwRFx1NjMwOVx1OTIxNVx1NzY4NFx1NkExOVx1N0M2NFwiLFxuICAgIEZMQVNIQ0FSRF9IQVJEX0RFU0M6IFwiXHU4MUVBXHU4QTAyXHUzMDBDXHU4RjAzXHU5NkUzXHUzMDBEXHU2MzA5XHU5MjE1XHU3Njg0XHU2QTE5XHU3QzY0XCIsXG4gICAgRkxBU0hDQVJEX1RBR1M6IFwiXHU1MzYxXHU3MjQ3XHU2QTE5XHU3QzY0XCIsXG4gICAgRkxBU0hDQVJEX1RBR1NfREVTQzogXCJcdThGMzhcdTUxNjVcdTZBMTlcdTdDNjRcdUZGMDhcdTc1MjhcdTdBN0FcdTc2N0RcdTYyMTZcdTYzREJcdTg4NENcdTVCNTdcdTUxNDNcdTUyMDZcdTk2OTRcdUZGMDlcdUZGMENcdTRGOEJcdTU5ODJcdUZGMUEjZmxhc2hjYXJkcyAjZGVjazIgI2RlY2szLlwiLFxuICAgIENPTlZFUlRfRk9MREVSU19UT19ERUNLUzogXCJcdTY2MkZcdTU0MjZcdTVDMDdcdThDQzdcdTY1OTlcdTU5M0VcdTUxNjdcdTVCQjlcdThGNDlcdTYzREJcdTcwQkFcdTcyNENcdTdENDRcdTU0OENcdTVCNTBcdTcyNENcdTdENDRcdUZGMUZcIixcbiAgICBDT05WRVJUX0ZPTERFUlNfVE9fREVDS1NfREVTQzogXCJcdTZCNjRcdTkwNzhcdTk4MDVcdTcwQkFcdTUzNjFcdTcyNDdcdTZBMTlcdTdDNjRcdTkwNzhcdTk4MDVcdTc2ODRcdTY2RkZcdTRFRTNcdTkwNzhcdTk4MDVcdTMwMDJcIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UUzogXCJcdTY2MkZcdTU0MjZcdTVDMDdcdThBMDhcdTUyODNcdTkxQ0RcdTg5MDdcdTY2NDJcdTk1OTNcdTUxMzJcdTVCNThcdTU3MjhcdTUzNjFcdTcyNDdcdTY3MDBcdTVGOENcdTRFMDBcdTg4NENcdTc2ODRcdTU0MENcdTRFMDBcdTg4NENcdUZGMUZcIixcbiAgICBJTkxJTkVfU0NIRURVTElOR19DT01NRU5UU19ERVNDOiBcIlx1NTJGRVx1OTA3OFx1NUY4Q0hUTUxcdThBM0JcdTg5RTNcdTRFMERcdTY3MDNcdTc4MzRcdTU4REVcdTUyMTdcdTg4NjhcdTY4M0NcdTVGMEZcdTU1NEZcdTk4NENcdTMwMDJcIixcbiAgICBCVVJZX1NJQkxJTkdTX1RJTExfTkVYVF9EQVk6IFwiXHU1QzA3XHU1M0NEXHU4RjQ5XHU1MzYxXHU3MjQ3XHU5NkIxXHU4NUNGXHU4MUYzXHU0RTBCXHU0RTAwXHU1OTI5XHVGRjFGXCIsXG4gICAgQlVSWV9TSUJMSU5HU19USUxMX05FWFRfREFZX0RFU0M6IFwiXHU1M0NEXHU4RjQ5XHU1MzYxXHU3MjQ3XHU3NTMxXHU1NDBDXHU0RTAwXHU1MzYxXHU3MjQ3XHU2NTg3XHU1QjU3XHU3NTIyXHU3NTFGXHVGRjBDXHU0RjhCXHU1OTgyXHVGRjFBXHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFQ6IFwiXHU1NzI4XHU1MzYxXHU3MjQ3XHU0RTJEXHU5ODZGXHU3OTNBXHU0RTBBXHU0RTBCXHU2NTg3XHVGRjFGXCIsXG4gICAgU0hPV19DQVJEX0NPTlRFWFRfREVTQzogXCJcdTRGOEJcdTU5ODJcdUZGMUFcdTZBMTlcdTk4NEMgPiBcdTUyNkZcdTZBMTlcdTk4NEMgPiBcdTVDMEZcdTZBMTlcdTk4NEMgPiAuLi4gPiBcdTVDMEZcdTZBMTlcdTk4NENcIixcbiAgICBDQVJEX01PREFMX0hFSUdIVF9QRVJDRU5UOiBcIlx1NTM2MVx1NzI0N1x1OUFEOFx1NUVBNlx1NzY3RVx1NTIwNlx1NkJENFwiLFxuICAgIENBUkRfTU9EQUxfU0laRV9QRVJDRU5UX0RFU0M6IFwiXHU1NzI4XHU3OUZCXHU1MkQ1XHU3QUVGXHU2MjE2XHU5NzAwXHU4OTgxXHU4RjAzXHU1OTI3XHU1NzE2XHU3MjQ3XHU2NjQyXHU2MUM5XHU4QTJEXHU1QjlBXHU3MEJBMTAwJVwiLFxuICAgIFJFU0VUX0RFRkFVTFQ6IFwiXHU5MUNEXHU3RjZFXHU3MEJBXHU5ODEwXHU4QTJEXHU1MDNDXCIsXG4gICAgQ0FSRF9NT0RBTF9XSURUSF9QRVJDRU5UOiBcIlx1NTM2MVx1NzI0N1x1NUJFQ1x1NUVBNlx1NzY3RVx1NTIwNlx1NkJENFwiLFxuICAgIFJBTkRPTUlaRV9DQVJEX09SREVSOiBcIlx1NUZBOVx1N0ZEMlx1NjY0Mlx1OTZBOFx1NkE1Rlx1OTg2Rlx1NzkzQVx1NTM2MVx1NzI0N1x1RkYxRlwiLFxuICAgIERJU0FCTEVfQ0xPWkVfQ0FSRFM6IFwiXHU1MDVDXHU3NTI4XHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XHU1MzYxXHU3MjQ3XHVGRjFGXCIsXG4gICAgQ09OVkVSVF9ISUdITElHSFRTX1RPX0NMT1pFUzogXCJcdTVDMDcgPT1cdTlBRDhcdTRFQUU9PSBcdThGNDlcdTYzREJcdTcwQkFcdTU4NkJcdTdBN0FcdTUxNEJcdTZGMEZcdTVCNTdcdUZGMUZcIixcbiAgICBDT05WRVJUX0JPTERfVEVYVF9UT19DTE9aRVM6IFwiXHU1QzA3ICoqXHU3Qzk3XHU5QUQ0KiogXHU4RjQ5XHU2M0RCXHU3MEJBXHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XHVGRjFGXCIsXG4gICAgQ09OVkVSVF9DVVJMWV9CUkFDS0VUU19UT19DTE9aRVM6IFwiXHU1QzA3IHt7XHU1OTI3XHU2MkVDXHU4NjVGfX0gXHU4RjQ5XHU2M0RCXHU3MEJBXHU1ODZCXHU3QTdBXHU1MTRCXHU2RjBGXHU1QjU3XHVGRjFGXCIsXG4gICAgSU5MSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJcdTU1QUVcdTg4NENcdTUzNjFcdTcyNDdcdTc2ODRcdTUyMDZcdTk2OTRcdTVCNTdcdTUxNDNcIixcbiAgICBGSVhfU0VQQVJBVE9SU19NQU5VQUxMWV9XQVJOSU5HOiBcIlx1NkNFOFx1NjEwRlx1RkYxQVx1NjZGNFx1NjUzOVx1NkI2NFx1OTA3OFx1OTgwNVx1NUY4Q1x1NEY2MFx1NUMwN1x1OTcwMFx1ODk4MVx1ODFFQVx1ODg0Q1x1NjZGNFx1NjUzOVx1NURGMlx1NUI1OFx1NTcyOFx1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1NUI1N1x1NTE0M1x1MzAwMlwiLFxuICAgIElOTElORV9SRVZFUlNFRF9DQVJEU19TRVBBUkFUT1I6IFwiXHU1NUFFXHU4ODRDXHU1M0NEXHU4RjQ5XHU1MzYxXHU3MjQ3XHU3Njg0XHU1MjA2XHU5Njk0XHU1QjU3XHU1MTQzXCIsXG4gICAgTVVMVElMSU5FX0NBUkRTX1NFUEFSQVRPUjogXCJcdTU5MUFcdTg4NENcdTUzNjFcdTcyNDdcdTc2ODRcdTUyMDZcdTk2OTRcdTVCNTdcdTUxNDNcIixcbiAgICBNVUxUSUxJTkVfUkVWRVJTRURfQ0FSRFNfU0VQQVJBVE9SOiBcIlx1NTkxQVx1ODg0Q1x1N0ZGQlx1OEY0OVx1NTM2MVx1NzI0N1x1NzY4NFx1NTIwNlx1OTY5NFx1NUI1N1x1NTE0M1wiLFxuICAgIE5PVEVTOiBcIlx1N0I0Nlx1OEExOFwiLFxuICAgIFJFVklFV19QQU5FX09OX1NUQVJUVVA6IFwiXHU1NTVGXHU1MkQ1XHU2NjQyXHU5NThCXHU1NTVGXHU3QjQ2XHU4QTE4XHU1RkE5XHU3RkQyXHU3QTk3XHU2ODNDXCIsXG4gICAgVEFHU19UT19SRVZJRVc6IFwiXHU1RkE5XHU3RkQyXHU2QTE5XHU3QzY0XCIsXG4gICAgVEFHU19UT19SRVZJRVdfREVTQzogXCJcdThGMzhcdTUxNjVcdTZBMTlcdTdDNjRcdUZGMENcdTc1MjhcdTdBN0FcdTY4M0NcdTYyMTZcdTYzREJcdTg4NENcdTVCNTdcdTUxNDNcdTUyMDZcdTk2OTRcdUZGMENcdTRGOEJcdTU5ODJcdUZGMUEjcmV2aWV3ICN0YWcyICN0YWczLlwiLFxuICAgIE9QRU5fUkFORE9NX05PVEU6IFwiXHU1RkE5XHU3RkQyXHU5NkE4XHU2QTVGXHU3QjQ2XHU4QTE4XCIsXG4gICAgT1BFTl9SQU5ET01fTk9URV9ERVNDOiBcIlx1OTVEQ1x1OTU4OVx1NkI2NFx1OTA3OFx1OTgwNVx1RkYwQ1x1N0I0Nlx1OEExOFx1NUMwN1x1NEVFNVx1OTFDRFx1ODk4MVx1NUVBNihQYWdlUmFuaylcdTYzOTJcdTVFOEZcdTMwMDJcIixcbiAgICBBVVRPX05FWFRfTk9URTogXCJcdTVGQTlcdTdGRDJcdTVGOENcdTgxRUFcdTUyRDVcdTYyNTNcdTk1OEJcdTRFMEJcdTRFMDBcdTUwMEJcdTdCNDZcdThBMThcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OUzogXCJcdTk1RENcdTk1ODlcdTZBOTRcdTY4NDhcdTkwNzhcdTU1QUVcdTRFMkRcdTc2ODRcdTVGQTlcdTdGRDJcdTkwNzhcdTk4MDUgXHU0RjhCXHU1OTgyXHVGRjFBXHU1RkE5XHU3RkQyXHVGRjFBXHU3QzIxXHU1NUFFIFx1OEExOFx1NUY5NyBcdThGMDNcdTk2RTNcIixcbiAgICBESVNBQkxFX0ZJTEVfTUVOVV9SRVZJRVdfT1BUSU9OU19ERVNDOiBcIlx1OTVEQ1x1OTU4OVx1NkE5NFx1Njg0OFx1OTA3OFx1NTVBRVx1NzY4NFx1NUZBOVx1N0ZEMlx1OTA3OFx1OTgwNVx1RkYwQ1x1NEY4Qlx1NTk4Mlx1RkYxQVx1NUZBOVx1N0ZEMjogXHU3QzIxXHU1NUFFIFx1OEExOFx1NUY5NyBcdThGMDNcdTk2RTNcdTMwMDJcIixcbiAgICBNQVhfTl9EQVlTX1JFVklFV19RVUVVRTogXCJcdTUzRjNcdTkwOEFcdTk3NjJcdTY3N0ZcdTk4NkZcdTc5M0FcdTc2ODRcdTY3MDBcdTU5MjdcdTU5MjlcdTY1NzhcIixcbiAgICBNSU5fT05FX0RBWTogXCJcdTU5MjlcdTY1NzhcdTY3MDBcdTVDMEZcdTUwM0NcdTcwQkExXCIsXG4gICAgVkFMSURfTlVNQkVSX1dBUk5JTkc6IFwiXHU4QUNCXHU4RjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU2NTc4XHU1QjU3XHUzMDAyXCIsXG4gICAgVUlfUFJFRkVSRU5DRVM6IFwiXHU3NTI4XHU2MjM2XHU0RUNCXHU5NzYyXHU5OTk2XHU5MDc4XHU5ODA1XCIsXG4gICAgSU5JVElBTExZX0VYUEFORF9TVUJERUNLU19JTl9UUkVFOiBcIlx1NzI0Q1x1N0Q0NFx1NkEzOVx1NjcwMFx1NTIxRFx1NjFDOVx1OTg2Rlx1NzkzQVx1NzBCQVx1NUM1NVx1OTU4QlwiLFxuICAgIElOSVRJQUxMWV9FWFBBTkRfU1VCREVDS1NfSU5fVFJFRV9ERVNDOlxuICAgICAgICBcIlx1OTVEQ1x1OTU4OVx1NkI2NFx1OTA3OFx1OTgwNVx1NTNFRlx1NjQ3QVx1NzU4QVx1NTQwQ1x1NEUwMFx1NUYzNVx1NTM2MVx1NzI0N1x1NEUyRFx1NzY4NFx1NURFMlx1NzJDMFx1NzI0Q1x1N0Q0NFx1MzAwMlx1NTk4Mlx1Njc5Q1x1NjBBOFx1NzY4NFx1NTM2MVx1NzI0N1x1NUM2Q1x1NjVCQ1x1NTQwQ1x1NEUwMFx1NkE5NFx1Njg0OFx1NEUyRFx1NzY4NFx1OEEzMVx1NTkxQVx1NTk1N1x1NzI0Q1x1RkYwQ1x1NTI0N1x1NUY4OFx1NjcwOVx1NzUyOFx1MzAwMlwiLFxuICAgIEFMR09SSVRITTogXCJcdTZGMTRcdTdCOTdcdTZDRDVcIixcbiAgICBDSEVDS19BTEdPUklUSE1fV0lLSTogJ1x1NzdBRFx1ODlFM1x1NjZGNFx1NTkxQSwgXHU4QUNCXHU5RURFXHU5MDc4IDxhIGhyZWY9XCIke2FsZ29fdXJsfVwiPmFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbjwvYT4uJyxcbiAgICBCQVNFX0VBU0U6IFwiXHU1N0ZBXHU3OTBFXHU2MzhDXHU2M0UxXHU3QTBCXHU1RUE2XCIsXG4gICAgQkFTRV9FQVNFX0RFU0M6IFwiXHU2NzAwXHU1QzBGXHU1MDNDMTMwXHVGRjBDXHU2M0E4XHU4NUE2XHU1MDNDXHU3RDA0MjUwLlwiLFxuICAgIEJBU0VfRUFTRV9NSU5fV0FSTklORzogXCJcdTU3RkFcdTc5MEVcdTYzOENcdTYzRTFcdTdBMEJcdTVFQTZcdTc2ODRcdTY3MDBcdTVDMEZcdTUwM0NcdTcwQkExMzBcdTMwMDJcIixcbiAgICBMQVBTRV9JTlRFUlZBTF9DSEFOR0U6IFwiXHU1QzA3XHU1RkE5XHU3RkQyXHU2NjQyXHU2QTE5XHU4QTNCXHU3MEJBXHUzMDBDXHU4RjAzXHU5NkUzXHUzMDBEXHU3Njg0XHU1MzYxXHU3MjQ3XHU2MjE2XHU3QjQ2XHU4QTE4XHU1RkE5XHU3RkQyXHU5NTkzXHU5Njk0XHU3RTJFXHU3N0VEXCIsXG4gICAgTEFQU0VfSU5URVJWQUxfQ0hBTkdFX0RFU0M6IFwiXHU2NUIwXHU1RkE5XHU3RkQyXHU5NTkzXHU5Njk0ID0gXHU1MzlGXHU1RkE5XHU3RkQyXHU5NTkzXHU5Njk0ICogXHU5NTkzXHU5Njk0XHU2NTM5XHU4QjhBXHU0RkMyXHU2NTc4IC8gMTAwLlwiLFxuICAgIEVBU1lfQk9OVVM6IFwiXHU3QzIxXHU1NUFFXHU3MzRFXHU1MkY1XCIsXG4gICAgRUFTWV9CT05VU19ERVNDOiBcIlx1N0MyMVx1NTVBRVx1NzM0RVx1NTJGNVx1OEEyRFx1NUI5QVx1MzAwQ1x1OEExOFx1NUY5N1x1MzAwRFx1NTQ4Q1x1MzAwQ1x1N0MyMVx1NTVBRVx1MzAwRFx1NTM2MVx1NzI0N1x1NjIxNlx1N0I0Nlx1OEExOFx1NzY4NFx1NUZBOVx1N0ZEMlx1OTU5M1x1OTY5NFx1NURFRVx1OERERFx1RkYwOFx1NjcwMFx1NUMwRlx1NTAzQzEwMCVcdUZGMDlcdTMwMDJcIixcbiAgICBFQVNZX0JPTlVTX01JTl9XQVJOSU5HOiBcIlx1N0MyMVx1NTVBRVx1NzM0RVx1NTJGNVx1ODFGM1x1NUMxMVx1NzBCQTEwMFx1MzAwMlwiLFxuICAgIE1BWF9JTlRFUlZBTDogXCJcdTY3MDBcdTU5MjdcdTk1OTNcdTk2OTRcIixcbiAgICBNQVhfSU5URVJWQUxfREVTQzogXCJcdThBMkRcdTVCOUFcdTVGQTlcdTdGRDJcdTc2ODRcdTY3MDBcdTU5MjdcdTk1OTNcdTk2OTRcdTY2NDJcdTk1OTNcdUZGMDhcdTk4MTBcdThBMkRcdTUwM0MxMDBcdTVFNzRcdUZGMDlcdTMwMDJcIixcbiAgICBNQVhfSU5URVJWQUxfTUlOX1dBUk5JTkc6IFwiXHU2NzAwXHU1OTI3XHU5NTkzXHU5Njk0XHU4MUYzXHU1QzExXHU3MEJBMVx1NTkyOVwiLFxuICAgIE1BWF9MSU5LX0NPTlRSSUI6IFwiXHU2NzAwXHU1OTI3XHU5M0M4XHU2M0E1XHU4Q0EyXHU3MzdCXCIsXG4gICAgTUFYX0xJTktfQ09OVFJJQl9ERVNDOlxuICAgICAgICBcIk1heGltdW0gY29udHJpYnV0aW9uIG9mIHRoZSB3ZWlnaHRlZCBlYXNlIG9mIGxpbmtlZCBub3RlcyB0byB0aGUgaW5pdGlhbCBlYXNlLlwiLFxuICAgIExPR0dJTkc6IFwiXHU4QTE4XHU5MzA0XHU0RTJEXCIsXG4gICAgRElTUExBWV9ERUJVR19JTkZPOiBcIlx1NTcyOFx1OTU4Qlx1NzY3Q1x1ODAwNVx1NjNBN1x1NTIzNlx1NTNGMFx1NEUyRFx1OTg2Rlx1NzkzQVx1OTY2NFx1OTMyRlx1OENDN1x1OEEwQVx1RkYxRlwiLFxuXG4gICAgLy8gc2lkZWJhci50c1xuICAgIE5PVEVTX1JFVklFV19RVUVVRTogXCJcdTdCNDZcdThBMThcdTVGQTlcdTdGRDJcdTVFOEZcdTUyMTdcIixcbiAgICBDTE9TRTogXCJcdTgxRThcdThGRDFcIixcbiAgICBORVc6IFwiXHU2NUIwXCIsXG4gICAgWUVTVEVSREFZOiBcIlx1NjYyOFx1NTkyOVwiLFxuICAgIFRPREFZOiBcIlx1NEVDQVx1NTkyOVwiLFxuICAgIFRPTU9SUk9XOiBcIlx1NjYwRVx1NTkyOVwiLFxuXG4gICAgLy8gc3RhdHMtbW9kYWwudHN4XG4gICAgU1RBVFNfVElUTEU6IFwiXHU3RDcxXHU4QTA4XCIsXG4gICAgTU9OVEg6IFwiXHU2NzA4XCIsXG4gICAgUVVBUlRFUjogXCJcdTVCNjNcIixcbiAgICBZRUFSOiBcIlx1NUU3NFwiLFxuICAgIExJRkVUSU1FOiBcIlx1NTE2OFx1OTBFOFwiLFxuICAgIEZPUkVDQVNUOiBcIlx1OTgxMFx1NkUyQ1wiLFxuICAgIEZPUkVDQVNUX0RFU0M6IFwiXHU1QzA3XHU4OTgxXHU1MjMwXHU2NzFGXHU3Njg0XHU1MzYxXHU3MjQ3XHU2NTc4XHU5MUNGXCIsXG4gICAgU0NIRURVTEVEOiBcIlx1NURGMlx1NjM5Mlx1N0EwQlwiLFxuICAgIERBWVM6IFwiXHU1OTI5XCIsXG4gICAgTlVNQkVSX09GX0NBUkRTOiBcIlx1NTM2MVx1NzI0N1x1NjU3OFx1OTFDRlwiLFxuICAgIFJFVklFV1NfUEVSX0RBWTogXCJcdTVFNzNcdTU3NDc6IFx1NUZBOVx1N0ZEMiR7YXZnfSAvXHU1OTI5XCIsXG4gICAgSU5URVJWQUxTOiBcIlx1OTU5M1x1OTY5NFwiLFxuICAgIElOVEVSVkFMU19ERVNDOiBcIlx1NTIzMFx1NEUwQlx1NEUwMFx1NkIyMVx1NUZBOVx1N0ZEMlx1NzY4NFx1NjY0Mlx1OTU5M1x1OTU5M1x1OTY5NFwiLFxuICAgIENPVU5UOiBcIlx1OEEwOFx1NjU3OFwiLFxuICAgIElOVEVSVkFMU19TVU1NQVJZOiBcIlx1NUU3M1x1NTc0N1x1OTU5M1x1OTY5NFx1NjY0Mlx1OTU5MzogJHthdmd9LCBcdTY3MDBcdTk1NzdcdTk1OTNcdTk2OTRcdTY2NDJcdTk1OTM6ICR7bG9uZ2VzdH1cIixcbiAgICBFQVNFUzogXCJFYXNlc1wiLFxuICAgIEVBU0VTX1NVTU1BUlk6IFwiXHU1RTczXHU1NzQ3XHU2MzhDXHU2M0UxXHU3QTBCXHU1RUE2OiAke2F2Z0Vhc2V9XCIsXG4gICAgQ0FSRF9UWVBFUzogXCJcdTUzNjFcdTcyNDdcdTU3OEJcdTUyMjVcIixcbiAgICBDQVJEX1RZUEVTX0RFU0M6IFwiXHU1OTgyXHU2NzA5XHVGRjBDXHU1QzA3XHU5ODZGXHU3OTNBXHU5NkIxXHU4NUNGXHU3Njg0XHU1MzYxXHU3MjQ3XCIsXG4gICAgQ0FSRF9UWVBFX05FVzogXCJcdTY1QjBcIixcbiAgICBDQVJEX1RZUEVfWU9VTkc6IFwiXHU4RjAzXHU2NUIwXCIsXG4gICAgQ0FSRF9UWVBFX01BVFVSRTogXCJcdTcxOUZcdTYwODlcIixcbiAgICBDQVJEX1RZUEVTX1NVTU1BUlk6IFwiXHU3RTNEXHU1MzYxXHU3MjQ3XHU2NTc4OiAke3RvdGFsQ2FyZHNDb3VudH1cIixcbn07XG4iLCAiaW1wb3J0IHtcbiAgICBCdXR0b25Db21wb25lbnQsXG4gICAgTW9kYWwsXG4gICAgQXBwLFxuICAgIE1hcmtkb3duUmVuZGVyZXIsXG4gICAgTm90aWNlLFxuICAgIFBsYXRmb3JtLFxuICAgIFRGaWxlLFxuICAgIFRleHRBcmVhQ29tcG9uZW50LFxuICAgIHNldEljb24sXG59IGZyb20gXCJvYnNpZGlhblwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IGggZnJvbSBcInZodG1sXCI7XG5cbmltcG9ydCB0eXBlIFNSUGx1Z2luIGZyb20gXCJzcmMvbWFpblwiO1xuaW1wb3J0IHsgQ2FyZCwgQ2FyZFR5cGUsIHNjaGVkdWxlLCB0ZXh0SW50ZXJ2YWwsIFJldmlld1Jlc3BvbnNlIH0gZnJvbSBcInNyYy9zY2hlZHVsaW5nXCI7XG5pbXBvcnQge1xuICAgIENPTExBUFNFX0lDT04sXG4gICAgTVVMVElfU0NIRURVTElOR19FWFRSQUNUT1IsXG4gICAgTEVHQUNZX1NDSEVEVUxJTkdfRVhUUkFDVE9SLFxuICAgIElNQUdFX0ZPUk1BVFMsXG4gICAgQVVESU9fRk9STUFUUyxcbiAgICBWSURFT19GT1JNQVRTLFxufSBmcm9tIFwic3JjL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZXNjYXBlUmVnZXhTdHJpbmcsIGN5cmI1MyB9IGZyb20gXCJzcmMvdXRpbHNcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwic3JjL2xhbmcvaGVscGVyc1wiO1xuXG5leHBvcnQgZW51bSBGbGFzaGNhcmRNb2RhbE1vZGUge1xuICAgIERlY2tzTGlzdCxcbiAgICBGcm9udCxcbiAgICBCYWNrLFxuICAgIENsb3NlZCxcbn1cblxuLy8gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vY2hob3VtYW5uL3F1aWNrYWRkL2Jsb2IvYmNlMGI0Y2RhYzQ0Yjg2Nzg1NGQ2MjMzNzk2ZTM0MDZkZmQxNjNjNi9zcmMvZ3VpL0dlbmVyaWNJbnB1dFByb21wdC9HZW5lcmljSW5wdXRQcm9tcHQudHMjTDVcbmV4cG9ydCBjbGFzcyBGbGFzaGNhcmRFZGl0TW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgcHVibGljIHBsdWdpbjogU1JQbHVnaW47XG4gICAgcHVibGljIGlucHV0OiBzdHJpbmc7XG4gICAgcHVibGljIHdhaXRGb3JDbG9zZTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgcHJpdmF0ZSByZXNvbHZlUHJvbWlzZTogKGlucHV0OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIHJlamVjdFByb21pc2U6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBkaWRTdWJtaXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGlucHV0Q29tcG9uZW50OiBUZXh0QXJlYUNvbXBvbmVudDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsVGV4dDogc3RyaW5nO1xuXG4gICAgcHVibGljIHN0YXRpYyBQcm9tcHQoYXBwOiBBcHAsIHBsdWdpbjogU1JQbHVnaW4sIHBsYWNlaG9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBuZXdQcm9tcHRNb2RhbCA9IG5ldyBGbGFzaGNhcmRFZGl0TW9kYWwoYXBwLCBwbHVnaW4sIHBsYWNlaG9sZGVyKTtcbiAgICAgICAgcmV0dXJuIG5ld1Byb21wdE1vZGFsLndhaXRGb3JDbG9zZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHAsIHBsdWdpbjogU1JQbHVnaW4sIGV4aXN0aW5nVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dCh0KFwiRURJVF9DQVJEXCIpKTtcbiAgICAgICAgdGhpcy50aXRsZUVsLmFkZENsYXNzKFwic3ItY2VudGVyZWRcIik7XG4gICAgICAgIHRoaXMubW9kYWxUZXh0ID0gZXhpc3RpbmdUZXh0O1xuXG4gICAgICAgIHRoaXMud2FpdEZvckNsb3NlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0UHJvbWlzZSA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3BsYXkoKSB7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMubW9kYWxFbC5hZGRDbGFzcyhcInNyLWZsYXNoY2FyZC1pbnB1dC1tb2RhbFwiKTtcblxuICAgICAgICBjb25zdCBtYWluQ29udGVudENvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLmNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgbWFpbkNvbnRlbnRDb250YWluZXIuYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtaW5wdXQtYXJlYVwiKTtcbiAgICAgICAgdGhpcy5pbnB1dENvbXBvbmVudCA9IHRoaXMuY3JlYXRlSW5wdXRGaWVsZChtYWluQ29udGVudENvbnRhaW5lciwgdGhpcy5tb2RhbFRleHQpO1xuICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbkJhcihtYWluQ29udGVudENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgIHRleHQ6IHN0cmluZyxcbiAgICAgICAgY2FsbGJhY2s6IChldnQ6IE1vdXNlRXZlbnQpID0+IHZvaWRcbiAgICApIHtcbiAgICAgICAgY29uc3QgYnRuID0gbmV3IEJ1dHRvbkNvbXBvbmVudChjb250YWluZXIpO1xuICAgICAgICBidG4uc2V0QnV0dG9uVGV4dCh0ZXh0KS5vbkNsaWNrKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIGJ0bjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUJ1dHRvbkJhcihtYWluQ29udGVudENvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYnV0dG9uQmFyQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCA9IG1haW5Db250ZW50Q29udGFpbmVyLmNyZWF0ZURpdigpO1xuICAgICAgICBidXR0b25CYXJDb250YWluZXIuYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtZWRpdC1idXR0b24tYmFyXCIpO1xuICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbihcbiAgICAgICAgICAgIGJ1dHRvbkJhckNvbnRhaW5lcixcbiAgICAgICAgICAgIHQoXCJTQVZFXCIpLFxuICAgICAgICAgICAgdGhpcy5zdWJtaXRDbGlja0NhbGxiYWNrXG4gICAgICAgICkuc2V0Q3RhKCkuYnV0dG9uRWwuc3R5bGUubWFyZ2luUmlnaHQgPSBcIjBcIjtcbiAgICAgICAgdGhpcy5jcmVhdGVCdXR0b24oYnV0dG9uQmFyQ29udGFpbmVyLCB0KFwiQ0FOQ0VMXCIpLCB0aGlzLmNhbmNlbENsaWNrQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVJbnB1dEZpZWxkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dENvbXBvbmVudCA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb250YWluZXIpO1xuXG4gICAgICAgIHRleHRDb21wb25lbnQuaW5wdXRFbC5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgICB0ZXh0Q29tcG9uZW50XG4gICAgICAgICAgICAuc2V0VmFsdWUodmFsdWUgPz8gXCJcIilcbiAgICAgICAgICAgIC5vbkNoYW5nZSgodmFsdWUpID0+ICh0aGlzLmlucHV0ID0gdmFsdWUpKVxuICAgICAgICAgICAgLmlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5zdWJtaXRFbnRlckNhbGxiYWNrKTtcblxuICAgICAgICByZXR1cm4gdGV4dENvbXBvbmVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1Ym1pdENsaWNrQ2FsbGJhY2sgPSAoXzogTW91c2VFdmVudCkgPT4gdGhpcy5zdWJtaXQoKTtcbiAgICBwcml2YXRlIGNhbmNlbENsaWNrQ2FsbGJhY2sgPSAoXzogTW91c2VFdmVudCkgPT4gdGhpcy5jYW5jZWwoKTtcblxuICAgIHByaXZhdGUgc3VibWl0RW50ZXJDYWxsYmFjayA9IChldnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSkgJiYgZXZ0LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuZGlkU3VibWl0ID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICAgIHN1cGVyLm9uT3BlbigpO1xuXG4gICAgICAgIHRoaXMuaW5wdXRDb21wb25lbnQuaW5wdXRFbC5mb2N1cygpO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIHN1cGVyLm9uQ2xvc2UoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlSW5wdXQoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVJbnB1dExpc3RlbmVyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlSW5wdXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5kaWRTdWJtaXQpIHRoaXMucmVqZWN0UHJvbWlzZSh0KFwiTk9fSU5QVVRcIikpO1xuICAgICAgICBlbHNlIHRoaXMucmVzb2x2ZVByb21pc2UodGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVJbnB1dExpc3RlbmVyKCkge1xuICAgICAgICB0aGlzLmlucHV0Q29tcG9uZW50LmlucHV0RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5zdWJtaXRFbnRlckNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGFzaGNhcmRNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBwdWJsaWMgcGx1Z2luOiBTUlBsdWdpbjtcbiAgICBwdWJsaWMgYW5zd2VyQnRuOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZmxhc2hjYXJkVmlldzogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIGhhcmRCdG46IEhUTUxFbGVtZW50O1xuICAgIHB1YmxpYyBnb29kQnRuOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZWFzeUJ0bjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIG5leHRCdG46IEhUTUxFbGVtZW50O1xuICAgIHB1YmxpYyByZXNwb25zZURpdjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIHJlc2V0QnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgZWRpdEJ1dHRvbjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIGNvbnRleHRWaWV3OiBIVE1MRWxlbWVudDtcbiAgICBwdWJsaWMgY3VycmVudENhcmQ6IENhcmQ7XG4gICAgcHVibGljIGN1cnJlbnRDYXJkSWR4OiBudW1iZXI7XG4gICAgcHVibGljIGN1cnJlbnREZWNrOiBEZWNrO1xuICAgIHB1YmxpYyBjaGVja0RlY2s6IERlY2s7XG4gICAgcHVibGljIG1vZGU6IEZsYXNoY2FyZE1vZGFsTW9kZTtcbiAgICBwdWJsaWMgaWdub3JlU3RhdHM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTUlBsdWdpbiwgaWdub3JlU3RhdHMgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuICAgICAgICB0aGlzLmlnbm9yZVN0YXRzID0gaWdub3JlU3RhdHM7XG5cbiAgICAgICAgdGhpcy50aXRsZUVsLnNldFRleHQodChcIkRFQ0tTXCIpKTtcbiAgICAgICAgdGhpcy50aXRsZUVsLmFkZENsYXNzKFwic3ItY2VudGVyZWRcIik7XG5cbiAgICAgICAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRFbC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kYWxFbC5zdHlsZS5oZWlnaHQgPSB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEhlaWdodFBlcmNlbnRhZ2UgKyBcIiVcIjtcbiAgICAgICAgdGhpcy5tb2RhbEVsLnN0eWxlLndpZHRoID0gdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRXaWR0aFBlcmNlbnRhZ2UgKyBcIiVcIjtcblxuICAgICAgICB0aGlzLmNvbnRlbnRFbC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgICAgICAgdGhpcy5jb250ZW50RWwuc3R5bGUuaGVpZ2h0ID0gXCI5MiVcIjtcbiAgICAgICAgdGhpcy5jb250ZW50RWwuYWRkQ2xhc3MoXCJzci1tb2RhbC1jb250ZW50XCIpO1xuXG4gICAgICAgIC8vIFRPRE86IHJlZmFjdG9yIGludG8gZXZlbnQgaGFuZGxlcj9cbiAgICAgICAgZG9jdW1lbnQuYm9keS5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gVE9ETzogUGxlYXNlIGZpeCB0aGlzLiBJdCdzIHVnbHkuXG4gICAgICAgICAgICAvLyBDaGVja3MgaWYgdGhlIGlucHV0IHRleHRib3ggaXMgaW4gZm9jdXMgYmVmb3JlIHByb2Nlc3Npbmcga2V5Ym9hcmQgc2hvcnRjdXRzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQubm9kZU5hbWUgIT0gXCJURVhUQVJFQVwiICYmXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ub2RlTmFtZSAhPT0gXCJJTlBVVFwiICYmXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlICE9PSBGbGFzaGNhcmRNb2RhbE1vZGUuRGVja3NMaXN0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdW1lID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSBGbGFzaGNhcmRNb2RhbE1vZGUuQ2xvc2VkICYmIGUuY29kZSA9PT0gXCJLZXlTXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwQ3VycmVudENhcmQoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZSA9PT0gRmxhc2hjYXJkTW9kYWxNb2RlLkZyb250ICYmXG4gICAgICAgICAgICAgICAgICAgIChlLmNvZGUgPT09IFwiU3BhY2VcIiB8fCBlLmNvZGUgPT09IFwiRW50ZXJcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QW5zd2VyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gRmxhc2hjYXJkTW9kYWxNb2RlLkJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gXCJOdW1wYWQxXCIgfHwgZS5jb2RlID09PSBcIkRpZ2l0MVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuSGFyZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09PSBcIk51bXBhZDJcIiB8fCBlLmNvZGUgPT09IFwiRGlnaXQyXCIgfHwgZS5jb2RlID09PSBcIlNwYWNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JldmlldyhSZXZpZXdSZXNwb25zZS5Hb29kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNvZGUgPT09IFwiTnVtcGFkM1wiIHx8IGUuY29kZSA9PT0gXCJEaWdpdDNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmV2aWV3KFJldmlld1Jlc3BvbnNlLkVhc3kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PT0gXCJOdW1wYWQwXCIgfHwgZS5jb2RlID09PSBcIkRpZ2l0MFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuUmVzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG9uT3BlbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZWNrc0xpc3QoKTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGUgPSBGbGFzaGNhcmRNb2RhbE1vZGUuQ2xvc2VkO1xuICAgIH1cblxuICAgIGRlY2tzTGlzdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWltRGVjayA9IHRoaXMucGx1Z2luLmRlY2tUcmVlLnN1YmRlY2tzLmZpbHRlcihcbiAgICAgICAgICAgIChkZWNrKSA9PiBkZWNrLmRlY2tOYW1lID09PSB0aGlzLnBsdWdpbi5kYXRhLmhpc3RvcnlEZWNrXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLnBsdWdpbi5kYXRhLmhpc3RvcnlEZWNrICYmIGFpbURlY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZGVjayA9IGFpbURlY2tbMF07XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrID0gZGVjaztcbiAgICAgICAgICAgIHRoaXMuY2hlY2tEZWNrID0gZGVjay5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLnNldHVwQ2FyZHNWaWV3KCk7XG4gICAgICAgICAgICBkZWNrLm5leHRDYXJkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RlID0gRmxhc2hjYXJkTW9kYWxNb2RlLkRlY2tzTGlzdDtcbiAgICAgICAgdGhpcy50aXRsZUVsLnNldFRleHQodChcIkRFQ0tTXCIpKTtcbiAgICAgICAgdGhpcy50aXRsZUVsLmlubmVySFRNTCArPSAoXG4gICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbjowcHg7bGluZS1oZWlnaHQ6MTJweDtcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IzRjYWY1MDtjb2xvcjojZmZmZmZmO1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJEVUVfQ0FSRFNcIil9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnLXBhbmUtdGFnLWNvdW50IHRyZWUtaXRlbS1mbGFpciBzci1kZWNrLWNvdW50c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wbHVnaW4uZGVja1RyZWUuZHVlRmxhc2hjYXJkc0NvdW50LnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojMjE5NmYzO1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJORVdfQ0FSRFNcIil9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnLXBhbmUtdGFnLWNvdW50IHRyZWUtaXRlbS1mbGFpciBzci1kZWNrLWNvdW50c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wbHVnaW4uZGVja1RyZWUubmV3Rmxhc2hjYXJkc0NvdW50LnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojZmY3MDQzO1wiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e3QoXCJUT1RBTF9DQVJEU1wiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWctcGFuZS10YWctY291bnQgdHJlZS1pdGVtLWZsYWlyIHNyLWRlY2stY291bnRzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnBsdWdpbi5kZWNrVHJlZS50b3RhbEZsYXNoY2FyZHMudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29udGVudEVsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMuY29udGVudEVsLnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItZmxhc2hjYXJkLXZpZXdcIik7XG5cbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMucGx1Z2luLmRlY2tUcmVlLnN1YmRlY2tzKSB7XG4gICAgICAgICAgICBkZWNrLnJlbmRlcih0aGlzLmNvbnRlbnRFbCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXR1cENhcmRzVmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZW50RWwuZW1wdHkoKTtcblxuICAgICAgICBjb25zdCBmbGFzaENhcmRNZW51ID0gdGhpcy5jb250ZW50RWwuY3JlYXRlRGl2KFwic3ItZmxhc2hjYXJkLW1lbnVcIik7XG5cbiAgICAgICAgY29uc3QgYmFja0J1dHRvbiA9IGZsYXNoQ2FyZE1lbnUuY3JlYXRlRWwoXCJidXR0b25cIik7XG4gICAgICAgIGJhY2tCdXR0b24uYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtbWVudS1pdGVtXCIpO1xuICAgICAgICBzZXRJY29uKGJhY2tCdXR0b24sIFwiYXJyb3ctbGVmdFwiKTtcbiAgICAgICAgYmFja0J1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQoXCJCQUNLXCIpKTtcbiAgICAgICAgYmFja0J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5oaXN0b3J5RGVjayA9IFwiXCI7XG4gICAgICAgICAgICB0aGlzLmRlY2tzTGlzdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVkaXRCdXR0b24gPSBmbGFzaENhcmRNZW51LmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmVkaXRCdXR0b24uYWRkQ2xhc3MoXCJzci1mbGFzaGNhcmQtbWVudS1pdGVtXCIpO1xuICAgICAgICBzZXRJY29uKHRoaXMuZWRpdEJ1dHRvbiwgXCJlZGl0XCIpO1xuICAgICAgICB0aGlzLmVkaXRCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0KFwiRURJVF9DQVJEXCIpKTtcbiAgICAgICAgdGhpcy5lZGl0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyByZW1vdmUgU1IgaW5mbyBmcm9tIGlucHV0IG1vZGFsIHByb21wdFxuICAgICAgICAgICAgY29uc3QgdGV4dFByb21wdEFyciA9IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgICAgICBsZXQgdGV4dFByb21wdCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAodGV4dFByb21wdEFyclt0ZXh0UHJvbXB0QXJyLmxlbmd0aCAtIDFdLnN0YXJ0c1dpdGgoXCI8IS0tU1I6XCIpKSB7XG4gICAgICAgICAgICAgICAgdGV4dFByb21wdCA9IHRleHRQcm9tcHRBcnIuc2xpY2UoMCwgLTEpLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHRQcm9tcHQgPSB0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlZGl0TW9kYWwgPSBGbGFzaGNhcmRFZGl0TW9kYWwuUHJvbXB0KHRoaXMuYXBwLCB0aGlzLnBsdWdpbiwgdGV4dFByb21wdCk7XG4gICAgICAgICAgICBlZGl0TW9kYWxcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAobW9kaWZpZWRDYXJkVGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGlmeUNhcmRUZXh0KHRleHRQcm9tcHQsIG1vZGlmaWVkQ2FyZFRleHQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IGNvbnNvbGUubG9nKHJlYXNvbikpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uID0gZmxhc2hDYXJkTWVudS5jcmVhdGVFbChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5yZXNldEJ1dHRvbi5hZGRDbGFzcyhcInNyLWZsYXNoY2FyZC1tZW51LWl0ZW1cIik7XG4gICAgICAgIHNldEljb24odGhpcy5yZXNldEJ1dHRvbiwgXCJyZWZyZXNoLWN3XCIpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdChcIlJFU0VUX0NBUkRfUFJPR1JFU1NcIikpO1xuICAgICAgICB0aGlzLnJlc2V0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuUmVzZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYXJkSW5mbyA9IGZsYXNoQ2FyZE1lbnUuY3JlYXRlRWwoXCJidXR0b25cIik7XG4gICAgICAgIGNhcmRJbmZvLmFkZENsYXNzKFwic3ItZmxhc2hjYXJkLW1lbnUtaXRlbVwiKTtcbiAgICAgICAgc2V0SWNvbihjYXJkSW5mbywgXCJpbmZvXCIpO1xuICAgICAgICBjYXJkSW5mby5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiVmlldyBDYXJkIEluZm9cIik7XG4gICAgICAgIGNhcmRJbmZvLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWFzZVN0ciA9XG4gICAgICAgICAgICAgICAgdChcIkNVUlJFTlRfRUFTRV9IRUxQX1RFWFRcIikgKyAodGhpcy5jdXJyZW50Q2FyZC5lYXNlID8/IHQoXCJORVdcIikpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEludGVydmFsU3RyID1cbiAgICAgICAgICAgICAgICB0KFwiQ1VSUkVOVF9JTlRFUlZBTF9IRUxQX1RFWFRcIikgKyB0ZXh0SW50ZXJ2YWwodGhpcy5jdXJyZW50Q2FyZC5pbnRlcnZhbCwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkRnJvbVN0ciA9IHQoXCJDQVJEX0dFTkVSQVRFRF9GUk9NXCIsIHtcbiAgICAgICAgICAgICAgICBub3RlUGF0aDogdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ldyBOb3RpY2UoY3VycmVudEVhc2VTdHIgKyBcIlxcblwiICsgY3VycmVudEludGVydmFsU3RyICsgXCJcXG5cIiArIGdlbmVyYXRlZEZyb21TdHIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBza2lwQnV0dG9uID0gZmxhc2hDYXJkTWVudS5jcmVhdGVFbChcImJ1dHRvblwiKTtcbiAgICAgICAgc2tpcEJ1dHRvbi5hZGRDbGFzcyhcInNyLWZsYXNoY2FyZC1tZW51LWl0ZW1cIik7XG4gICAgICAgIHNldEljb24oc2tpcEJ1dHRvbiwgXCJjaGV2cm9ucy1yaWdodFwiKTtcbiAgICAgICAgc2tpcEJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHQoXCJTS0lQXCIpKTtcbiAgICAgICAgc2tpcEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5za2lwQ3VycmVudENhcmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3Muc2hvd0NvbnRleHRJbkNhcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRWaWV3ID0gdGhpcy5jb250ZW50RWwuY3JlYXRlRGl2KCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRWaWV3LnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItY29udGV4dFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmxhc2hjYXJkVmlldyA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdihcImRpdlwiKTtcbiAgICAgICAgdGhpcy5mbGFzaGNhcmRWaWV3LnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItZmxhc2hjYXJkLXZpZXdcIik7XG5cbiAgICAgICAgdGhpcy5yZXNwb25zZURpdiA9IHRoaXMuY29udGVudEVsLmNyZWF0ZURpdihcInNyLWZsYXNoY2FyZC1yZXNwb25zZVwiKTtcblxuICAgICAgICB0aGlzLmhhcmRCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICB0aGlzLmhhcmRCdG4uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzci1oYXJkLWJ0blwiKTtcbiAgICAgICAgdGhpcy5oYXJkQnRuLnNldFRleHQodGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRIYXJkVGV4dCk7XG4gICAgICAgIHRoaXMuaGFyZEJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmV2aWV3KFJldmlld1Jlc3BvbnNlLkhhcmQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURpdi5hcHBlbmRDaGlsZCh0aGlzLmhhcmRCdG4pO1xuXG4gICAgICAgIHRoaXMuZ29vZEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHRoaXMuZ29vZEJ0bi5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInNyLWdvb2QtYnRuXCIpO1xuICAgICAgICB0aGlzLmdvb2RCdG4uc2V0VGV4dCh0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmZsYXNoY2FyZEdvb2RUZXh0KTtcbiAgICAgICAgdGhpcy5nb29kQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXZpZXcoUmV2aWV3UmVzcG9uc2UuR29vZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGl2LmFwcGVuZENoaWxkKHRoaXMuZ29vZEJ0bik7XG5cbiAgICAgICAgdGhpcy5lYXN5QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgdGhpcy5lYXN5QnRuLnNldEF0dHJpYnV0ZShcImlkXCIsIFwic3ItZWFzeS1idG5cIik7XG4gICAgICAgIHRoaXMuZWFzeUJ0bi5zZXRUZXh0KHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkRWFzeVRleHQpO1xuICAgICAgICB0aGlzLmVhc3lCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JldmlldyhSZXZpZXdSZXNwb25zZS5FYXN5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VEaXYuYXBwZW5kQ2hpbGQodGhpcy5lYXN5QnRuKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cbiAgICAgICAgdGhpcy5hbnN3ZXJCdG4gPSB0aGlzLmNvbnRlbnRFbC5jcmVhdGVEaXYoKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJCdG4uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzci1zaG93LWFuc3dlclwiKTtcbiAgICAgICAgdGhpcy5hbnN3ZXJCdG4uc2V0VGV4dCh0KFwiU0hPV19BTlNXRVJcIikpO1xuICAgICAgICB0aGlzLmFuc3dlckJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93QW5zd2VyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmlnbm9yZVN0YXRzKSB7XG4gICAgICAgICAgICB0aGlzLmdvb2RCdG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNlRGl2LmFkZENsYXNzKFwic3ItaWdub3Jlc3RhdHMtcmVzcG9uc2VcIik7XG4gICAgICAgICAgICB0aGlzLmVhc3lCdG4uYWRkQ2xhc3MoXCJzci1pZ25vcmVzdGF0cy1idG5cIik7XG4gICAgICAgICAgICB0aGlzLmhhcmRCdG4uYWRkQ2xhc3MoXCJzci1pZ25vcmVzdGF0cy1idG5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vZGlmeUNhcmRUZXh0KG9yaWdpbmFsVGV4dDogc3RyaW5nLCByZXBsYWNlbWVudFRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXJlcGxhY2VtZW50VGV4dCkgcmV0dXJuO1xuICAgICAgICBpZiAocmVwbGFjZW1lbnRUZXh0ID09IG9yaWdpbmFsVGV4dCkgcmV0dXJuO1xuICAgICAgICBsZXQgZmlsZVRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQodGhpcy5jdXJyZW50Q2FyZC5ub3RlKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0UmVnZXggPSBuZXcgUmVnRXhwKGVzY2FwZVJlZ2V4U3RyaW5nKG9yaWdpbmFsVGV4dCksIFwiZ21cIik7XG4gICAgICAgIGZpbGVUZXh0ID0gZmlsZVRleHQucmVwbGFjZShvcmlnaW5hbFRleHRSZWdleCwgcmVwbGFjZW1lbnRUZXh0KTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KHRoaXMuY3VycmVudENhcmQubm90ZSwgZmlsZVRleHQpO1xuICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgodGhpcy5jdXJyZW50Q2FyZElkeCwgdGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSk7XG4gICAgICAgIHRoaXMuYnVyeVNpYmxpbmdDYXJkcyhmYWxzZSk7XG4gICAgICAgIHRoaXMuY3VycmVudERlY2submV4dENhcmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDbG96ZUJhY2tWaWV3KGlucHV0czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzLCBjb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzLCBjb252ZXJ0Q3VybHlCcmFja2V0c1RvQ2xvemVzIH0gPVxuICAgICAgICAgICAgdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncztcblxuICAgICAgICBjb25zdCBjbG96ZU1hdGNoZXMgPSB0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0Lm1hdGNoKC89PVxcdys9PS9nKTtcbiAgICAgICAgY29uc3QgY2xvemVzID0gY2xvemVNYXRjaGVzLm1hcCgobWF0Y2gpID0+IG1hdGNoLnJlcGxhY2VBbGwoXCI9PVwiLCBcIlwiKSk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gY2xvemVzLnJlZHVjZSgoYWNjLCBhbnN3ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWNjLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgY2xvemVNYXRjaGVzW2luZGV4XSxcbiAgICAgICAgICAgICAgICBhbnN3ZXIgPT09IGlucHV0c1tpbmRleF1cbiAgICAgICAgICAgICAgICAgICAgPyBgPHNwYW4gc3R5bGU9XCJjb2xvcjogZ3JlZW5cIj4ke2lucHV0c1tpbmRleF19PC9zcGFuPmBcbiAgICAgICAgICAgICAgICAgICAgOiBgWzxzcGFuIHN0eWxlPVwiY29sb3I6IHJlZDsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XCI+JHtpbnB1dHNbaW5kZXhdfTwvc3Bhbj48c3BhbiBzdHlsZT1cImNvbG9yOiBncmVlblwiPiR7YW5zd2VyfTwvc3Bhbj5dYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSwgdGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dBbnN3ZXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsb3plSW5wdXRGaWVsZHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjbG96ZS1pbnB1dFwiKSk7XG4gICAgICAgIGNvbnN0IGNsb3plSW5wdXRzID0gY2xvemVJbnB1dEZpZWxkcy5tYXAoKGNsb3plSW5wdXQpID0+IGNsb3plSW5wdXQudmFsdWUpO1xuXG4gICAgICAgIHRoaXMubW9kZSA9IEZsYXNoY2FyZE1vZGFsTW9kZS5CYWNrO1xuXG4gICAgICAgIHRoaXMuYW5zd2VyQnRuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgdGhpcy5yZXNwb25zZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJncmlkXCI7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENhcmQuaXNEdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXJkLmNhcmRUeXBlICE9PSBDYXJkVHlwZS5DbG96ZSkge1xuICAgICAgICAgICAgY29uc3QgaHI6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImhyXCIpO1xuICAgICAgICAgICAgaHIuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzci1oci1jYXJkLWRpdmlkZVwiKTtcbiAgICAgICAgICAgIHRoaXMuZmxhc2hjYXJkVmlldy5hcHBlbmRDaGlsZChocik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmJhY2sgPSB0aGlzLmdldENsb3plQmFja1ZpZXcoY2xvemVJbnB1dHMpO1xuICAgICAgICAgICAgdGhpcy5mbGFzaGNhcmRWaWV3LmVtcHR5KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlck1hcmtkb3duV3JhcHBlcih0aGlzLmN1cnJlbnRDYXJkLmJhY2ssIHRoaXMuZmxhc2hjYXJkVmlldyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzUmV2aWV3KHJlc3BvbnNlOiBSZXZpZXdSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pZ25vcmVTdGF0cykge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09IFJldmlld1Jlc3BvbnNlLkVhc3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmRJZHgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuaXNEdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXh0Q2FyZCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbnRlcnZhbDogbnVtYmVyLCBlYXNlOiBudW1iZXIsIGR1ZTtcblxuICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgodGhpcy5jdXJyZW50Q2FyZElkeCwgdGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSk7XG4gICAgICAgIGlmIChyZXNwb25zZSAhPT0gUmV2aWV3UmVzcG9uc2UuUmVzZXQpIHtcbiAgICAgICAgICAgIGxldCBzY2hlZE9iajogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICAgICAgICAgIC8vIHNjaGVkdWxlZCBjYXJkXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSkge1xuICAgICAgICAgICAgICAgIHNjaGVkT2JqID0gc2NoZWR1bGUoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmVhc2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuZGVsYXlCZWZvcmVSZXZpZXcsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmR1ZURhdGVzRmxhc2hjYXJkc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsX2Vhc2U6IG51bWJlciA9IHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYmFzZUVhc2U7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbi5lYXNlQnlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2Vhc2UgPSBNYXRoLnJvdW5kKHRoaXMucGx1Z2luLmVhc2VCeVBhdGhbdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGhdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY2hlZE9iaiA9IHNjaGVkdWxlKFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgMS4wLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2Vhc2UsXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLmR1ZURhdGVzRmxhc2hjYXJkc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBzY2hlZE9iai5pbnRlcnZhbDtcbiAgICAgICAgICAgICAgICBlYXNlID0gc2NoZWRPYmouZWFzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzY2hlZE9iai5pbnRlcnZhbDtcbiAgICAgICAgICAgIGVhc2UgPSBzY2hlZE9iai5lYXNlO1xuICAgICAgICAgICAgZHVlID0gd2luZG93Lm1vbWVudChEYXRlLm5vdygpICsgaW50ZXJ2YWwgKiAyNCAqIDM2MDAgKiAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuaW50ZXJ2YWwgPSAxLjA7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmVhc2UgPSB0aGlzLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhcmQuaXNEdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmR1ZUZsYXNoY2FyZHMucHVzaCh0aGlzLmN1cnJlbnRDYXJkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXdGbGFzaGNhcmRzLnB1c2godGhpcy5jdXJyZW50Q2FyZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkdWUgPSB3aW5kb3cubW9tZW50KERhdGUubm93KCkpO1xuICAgICAgICAgICAgbmV3IE5vdGljZSh0KFwiQ0FSRF9QUk9HUkVTU19SRVNFVFwiKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLm5leHRDYXJkKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVlU3RyaW5nOiBzdHJpbmcgPSBkdWUuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKTtcblxuICAgICAgICBsZXQgZmlsZVRleHQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LnJlYWQodGhpcy5jdXJyZW50Q2FyZC5ub3RlKTtcbiAgICAgICAgY29uc3QgcmVwbGFjZW1lbnRSZWdleCA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnZXhTdHJpbmcodGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCksIFwiZ21cIik7XG5cbiAgICAgICAgbGV0IHNlcDogc3RyaW5nID0gdGhpcy5wbHVnaW4uZGF0YS5zZXR0aW5ncy5jYXJkQ29tbWVudE9uU2FtZUxpbmUgPyBcIiBcIiA6IFwiXFxuXCI7XG4gICAgICAgIC8vIE92ZXJyaWRlIHNlcGFyYXRvciBpZiBsYXN0IGJsb2NrIGlzIGEgY29kZWJsb2NrXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0LmVuZHNXaXRoKFwiYGBgXCIpICYmIHNlcCAhPT0gXCJcXG5cIikge1xuICAgICAgICAgICAgc2VwID0gXCJcXG5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHdlJ3JlIGFkZGluZyBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBmbGFzaGNhcmRcbiAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0Lmxhc3RJbmRleE9mKFwiPCEtLVNSOlwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQgPVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQgKyBzZXAgKyBgPCEtLVNSOiEke2R1ZVN0cmluZ30sJHtpbnRlcnZhbH0sJHtlYXNlfS0tPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGluZzogKFJlZ0V4cE1hdGNoQXJyYXkgfCBzdHJpbmdbXSlbXSA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0Lm1hdGNoQWxsKE1VTFRJX1NDSEVEVUxJTkdfRVhUUkFDVE9SKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsaW5nID0gWy4uLnRoaXMuY3VycmVudENhcmQuY2FyZFRleHQubWF0Y2hBbGwoTEVHQUNZX1NDSEVEVUxJTkdfRVhUUkFDVE9SKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJDYXJkU2NoZWQ6IHN0cmluZ1tdID0gW1wiMFwiLCBkdWVTdHJpbmcsIGludGVydmFsLnRvU3RyaW5nKCksIGVhc2UudG9TdHJpbmcoKV07XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2FyZC5pc0R1ZSkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxpbmdbdGhpcy5jdXJyZW50Q2FyZC5zaWJsaW5nSWR4XSA9IGN1cnJDYXJkU2NoZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcucHVzaChjdXJyQ2FyZFNjaGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCA9IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQucmVwbGFjZSgvPCEtLVNSOi4rLS0+L2dtLCBcIlwiKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQgKz0gXCI8IS0tU1I6XCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLmNhcmRUZXh0ICs9IGAhJHtzY2hlZHVsaW5nW2ldWzFdfSwke3NjaGVkdWxpbmdbaV1bMl19LCR7c2NoZWR1bGluZ1tpXVszXX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCArPSBcIi0tPlwiO1xuICAgICAgICB9XG5cbiAgICAgICAgZmlsZVRleHQgPSBmaWxlVGV4dC5yZXBsYWNlKHJlcGxhY2VtZW50UmVnZXgsICgpID0+IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpYmxpbmcgb2YgdGhpcy5jdXJyZW50Q2FyZC5zaWJsaW5ncykge1xuICAgICAgICAgICAgc2libGluZy5jYXJkVGV4dCA9IHRoaXMuY3VycmVudENhcmQuY2FyZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MuYnVyeVNpYmxpbmdDYXJkcykge1xuICAgICAgICAgICAgdGhpcy5idXJ5U2libGluZ0NhcmRzKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQubW9kaWZ5KHRoaXMuY3VycmVudENhcmQubm90ZSwgZmlsZVRleHQpO1xuICAgICAgICB0aGlzLmN1cnJlbnREZWNrLm5leHRDYXJkKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYnVyeVNpYmxpbmdDYXJkcyh0aWxsTmV4dERheTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGlsbE5leHREYXkpIHtcbiAgICAgICAgICAgIHRoaXMucGx1Z2luLmRhdGEuYnVyeUxpc3QucHVzaChjeXJiNTModGhpcy5jdXJyZW50Q2FyZC5jYXJkVGV4dCkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2libGluZyBvZiB0aGlzLmN1cnJlbnRDYXJkLnNpYmxpbmdzKSB7XG4gICAgICAgICAgICBjb25zdCBkdWVJZHggPSB0aGlzLmN1cnJlbnREZWNrLmR1ZUZsYXNoY2FyZHMuaW5kZXhPZihzaWJsaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0lkeCA9IHRoaXMuY3VycmVudERlY2submV3Rmxhc2hjYXJkcy5pbmRleE9mKHNpYmxpbmcpO1xuXG4gICAgICAgICAgICBpZiAoZHVlSWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERlY2suZGVsZXRlRmxhc2hjYXJkQXRJbmRleChcbiAgICAgICAgICAgICAgICAgICAgZHVlSWR4LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmR1ZUZsYXNoY2FyZHNbZHVlSWR4XS5pc0R1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld0lkeCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnREZWNrLmRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXdGbGFzaGNhcmRzW25ld0lkeF0uaXNEdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBza2lwQ3VycmVudENhcmQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudERlY2suZGVsZXRlRmxhc2hjYXJkQXRJbmRleCh0aGlzLmN1cnJlbnRDYXJkSWR4LCB0aGlzLmN1cnJlbnRDYXJkLmlzRHVlKTtcbiAgICAgICAgdGhpcy5idXJ5U2libGluZ0NhcmRzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jdXJyZW50RGVjay5uZXh0Q2FyZCh0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSByZW5kZXJNYXJrZG93biBmdW5jdGlvbiBpblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZ21leWVycy9vYnNpZGlhbi1rYW5iYW4vYmxvYi9tYWluL3NyYy9LYW5iYW5WaWV3LnRzeFxuICAgIGFzeW5jIHJlbmRlck1hcmtkb3duV3JhcHBlcihcbiAgICAgICAgbWFya2Rvd25TdHJpbmc6IHN0cmluZyxcbiAgICAgICAgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LFxuICAgICAgICByZWN1cnNpdmVEZXB0aCA9IDBcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHJlY3Vyc2l2ZURlcHRoID4gNCkgcmV0dXJuO1xuXG4gICAgICAgIE1hcmtkb3duUmVuZGVyZXIucmVuZGVyTWFya2Rvd24oXG4gICAgICAgICAgICBtYXJrZG93blN0cmluZyxcbiAgICAgICAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FyZC5ub3RlLnBhdGgsXG4gICAgICAgICAgICB0aGlzLnBsdWdpblxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnRhaW5lckVsLmZpbmRBbGwoXCIuaW50ZXJuYWwtZW1iZWRcIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLnBhcnNlTGluayhlbC5nZXRBdHRyaWJ1dGUoXCJzcmNcIikpO1xuXG4gICAgICAgICAgICAvLyBmaWxlIGRvZXMgbm90IGV4aXN0LCBkaXNwbGF5IGRlYWQgbGlua1xuICAgICAgICAgICAgaWYgKCFsaW5rLnRhcmdldCkge1xuICAgICAgICAgICAgICAgIGVsLmlubmVyVGV4dCA9IGxpbmsudGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluay50YXJnZXQgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgICAgIGlmIChsaW5rLnRhcmdldC5leHRlbnNpb24gIT09IFwibWRcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYmVkTWVkaWFGaWxlKGVsLCBsaW5rLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuaW5uZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJUcmFuc2NsdWRlKGVsLCBsaW5rLCByZWN1cnNpdmVEZXB0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTGluayhzcmM6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsaW5rQ29tcG9uZW50c1JlZ2V4ID1cbiAgICAgICAgICAgIC9eKD88ZmlsZT5bXiNeXSspPyg/OiMoPyFcXF4pKD88aGVhZGluZz4uKyl8I1xcXig/PGJsb2NrSWQ+LispfCMpPyQvO1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gdHlwZW9mIHNyYyA9PT0gXCJzdHJpbmdcIiAmJiBzcmMubWF0Y2gobGlua0NvbXBvbmVudHNSZWdleCk7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBtYXRjaGVkLmdyb3Vwcy5maWxlIHx8IHRoaXMuY3VycmVudENhcmQubm90ZS5wYXRoO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBsdWdpbi5hcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChcbiAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYXJkLm5vdGUucGF0aFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogbWF0Y2hlZFswXSxcbiAgICAgICAgICAgIGZpbGU6IG1hdGNoZWQuZ3JvdXBzLmZpbGUsXG4gICAgICAgICAgICBoZWFkaW5nOiBtYXRjaGVkLmdyb3Vwcy5oZWFkaW5nLFxuICAgICAgICAgICAgYmxvY2tJZDogbWF0Y2hlZC5ncm91cHMuYmxvY2tJZCxcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZW1iZWRNZWRpYUZpbGUoZWw6IEhUTUxFbGVtZW50LCB0YXJnZXQ6IFRGaWxlKSB7XG4gICAgICAgIGVsLmlubmVyVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChJTUFHRV9GT1JNQVRTLmluY2x1ZGVzKHRhcmdldC5leHRlbnNpb24pKSB7XG4gICAgICAgICAgICBlbC5jcmVhdGVFbChcbiAgICAgICAgICAgICAgICBcImltZ1wiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiB0aGlzLnBsdWdpbi5hcHAudmF1bHQuZ2V0UmVzb3VyY2VQYXRoKHRhcmdldCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoaW1nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoXCJ3aWR0aFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBlbC5nZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaW1nLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIFwiMTAwJVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkgaW1nLnNldEF0dHJpYnV0ZShcImFsdFwiLCBlbC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGV2KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zdHlsZS5taW5XaWR0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLm1pbldpZHRoID09PSBcIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiMTAwJVwiKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbC5hZGRDbGFzc2VzKFtcImltYWdlLWVtYmVkXCIsIFwiaXMtbG9hZGVkXCJdKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIEFVRElPX0ZPUk1BVFMuaW5jbHVkZXModGFyZ2V0LmV4dGVuc2lvbikgfHxcbiAgICAgICAgICAgIFZJREVPX0ZPUk1BVFMuaW5jbHVkZXModGFyZ2V0LmV4dGVuc2lvbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbC5jcmVhdGVFbChcbiAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRTLmluY2x1ZGVzKHRhcmdldC5leHRlbnNpb24pID8gXCJhdWRpb1wiIDogXCJ2aWRlb1wiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHM6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHRoaXMucGx1Z2luLmFwcC52YXVsdC5nZXRSZXNvdXJjZVBhdGgodGFyZ2V0KSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChhdWRpbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwuaGFzQXR0cmlidXRlKFwiYWx0XCIpKSBhdWRpby5zZXRBdHRyaWJ1dGUoXCJhbHRcIiwgZWwuZ2V0QXR0cmlidXRlKFwiYWx0XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZWwuYWRkQ2xhc3NlcyhbXCJtZWRpYS1lbWJlZFwiLCBcImlzLWxvYWRlZFwiXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbC5pbm5lclRleHQgPSB0YXJnZXQucGF0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVuZGVyVHJhbnNjbHVkZShcbiAgICAgICAgZWw6IEhUTUxFbGVtZW50LFxuICAgICAgICBsaW5rOiB7XG4gICAgICAgICAgICB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBmaWxlOiBzdHJpbmc7XG4gICAgICAgICAgICBoZWFkaW5nOiBzdHJpbmc7XG4gICAgICAgICAgICBibG9ja0lkOiBzdHJpbmc7XG4gICAgICAgICAgICB0YXJnZXQ6IFRGaWxlO1xuICAgICAgICB9LFxuICAgICAgICByZWN1cnNpdmVEZXB0aDogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShsaW5rLnRhcmdldC5wYXRoKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNhY2hlZFJlYWQobGluay50YXJnZXQpO1xuICAgICAgICBsZXQgYmxvY2tUZXh0O1xuICAgICAgICBpZiAobGluay5oZWFkaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjbGVhbiA9IChzOiBzdHJpbmcpID0+IHMucmVwbGFjZSgvW1xcV1xcc10vZywgXCJcIik7XG4gICAgICAgICAgICBjb25zdCBoZWFkaW5nSW5kZXggPSBjYWNoZS5oZWFkaW5ncz8uZmluZEluZGV4KFxuICAgICAgICAgICAgICAgIChoKSA9PiBjbGVhbihoLmhlYWRpbmcpID09PSBjbGVhbihsaW5rLmhlYWRpbmcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZyA9IGNhY2hlLmhlYWRpbmdzW2hlYWRpbmdJbmRleF07XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0QXQgPSBoZWFkaW5nLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IGVuZEF0ID1cbiAgICAgICAgICAgICAgICBjYWNoZS5oZWFkaW5ncy5zbGljZShoZWFkaW5nSW5kZXggKyAxKS5maW5kKChoKSA9PiBoLmxldmVsIDw9IGhlYWRpbmcubGV2ZWwpXG4gICAgICAgICAgICAgICAgICAgID8ucG9zaXRpb24/LnN0YXJ0Py5vZmZzZXQgfHwgdGV4dC5sZW5ndGg7XG5cbiAgICAgICAgICAgIGJsb2NrVGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0YXJ0QXQsIGVuZEF0KTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5rLmJsb2NrSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gY2FjaGUuYmxvY2tzW2xpbmsuYmxvY2tJZF07XG4gICAgICAgICAgICBjb25zdCBzdGFydEF0ID0gYmxvY2sucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICAgICAgICAgICAgY29uc3QgZW5kQXQgPSBibG9jay5wb3NpdGlvbi5lbmQub2Zmc2V0O1xuICAgICAgICAgICAgYmxvY2tUZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnRBdCwgZW5kQXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvY2tUZXh0ID0gdGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyTWFya2Rvd25XcmFwcGVyKGJsb2NrVGV4dCwgZWwsIHJlY3Vyc2l2ZURlcHRoICsgMSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVjayB7XG4gICAgcHVibGljIGRlY2tOYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIG5ld0ZsYXNoY2FyZHM6IENhcmRbXTtcbiAgICBwdWJsaWMgbmV3Rmxhc2hjYXJkc0NvdW50ID0gMDsgLy8gY291bnRzIHRob3NlIGluIHN1YmRlY2tzIHRvb1xuICAgIHB1YmxpYyBkdWVGbGFzaGNhcmRzOiBDYXJkW107XG4gICAgcHVibGljIGR1ZUZsYXNoY2FyZHNDb3VudCA9IDA7IC8vIGNvdW50cyB0aG9zZSBpbiBzdWJkZWNrcyB0b29cbiAgICBwdWJsaWMgdG90YWxGbGFzaGNhcmRzID0gMDsgLy8gY291bnRzIHRob3NlIGluIHN1YmRlY2tzIHRvb1xuICAgIHB1YmxpYyBzdWJkZWNrczogRGVja1tdO1xuICAgIHB1YmxpYyBwYXJlbnQ6IERlY2sgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoZGVja05hbWU6IHN0cmluZywgcGFyZW50OiBEZWNrIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmRlY2tOYW1lID0gZGVja05hbWU7XG4gICAgICAgIHRoaXMubmV3Rmxhc2hjYXJkcyA9IFtdO1xuICAgICAgICB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZHVlRmxhc2hjYXJkcyA9IFtdO1xuICAgICAgICB0aGlzLmR1ZUZsYXNoY2FyZHNDb3VudCA9IDA7XG4gICAgICAgIHRoaXMudG90YWxGbGFzaGNhcmRzID0gMDtcbiAgICAgICAgdGhpcy5zdWJkZWNrcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICBjcmVhdGVEZWNrKGRlY2tQYXRoOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAoZGVja1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNrTmFtZTogc3RyaW5nID0gZGVja1BhdGguc2hpZnQoKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMuc3ViZGVja3MpIHtcbiAgICAgICAgICAgIGlmIChkZWNrTmFtZSA9PT0gZGVjay5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIGRlY2suY3JlYXRlRGVjayhkZWNrUGF0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjazogRGVjayA9IG5ldyBEZWNrKGRlY2tOYW1lLCB0aGlzKTtcbiAgICAgICAgdGhpcy5zdWJkZWNrcy5wdXNoKGRlY2spO1xuICAgICAgICBkZWNrLmNyZWF0ZURlY2soZGVja1BhdGgpO1xuICAgIH1cblxuICAgIGluc2VydEZsYXNoY2FyZChkZWNrUGF0aDogc3RyaW5nW10sIGNhcmRPYmo6IENhcmQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNhcmRPYmouaXNEdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZHVlRmxhc2hjYXJkc0NvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG90YWxGbGFzaGNhcmRzKys7XG5cbiAgICAgICAgaWYgKGRlY2tQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGNhcmRPYmouaXNEdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmR1ZUZsYXNoY2FyZHMucHVzaChjYXJkT2JqKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdGbGFzaGNhcmRzLnB1c2goY2FyZE9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNrTmFtZTogc3RyaW5nID0gZGVja1BhdGguc2hpZnQoKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMuc3ViZGVja3MpIHtcbiAgICAgICAgICAgIGlmIChkZWNrTmFtZSA9PT0gZGVjay5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIGRlY2suaW5zZXJ0Rmxhc2hjYXJkKGRlY2tQYXRoLCBjYXJkT2JqKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb3VudCBmbGFzaGNhcmRzIHRoYXQgaGF2ZSBlaXRoZXIgYmVlbiBidXJpZWRcbiAgICAvLyBvciBhcmVuJ3QgZHVlIHlldFxuICAgIGNvdW50Rmxhc2hjYXJkKGRlY2tQYXRoOiBzdHJpbmdbXSwgbiA9IDEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3RhbEZsYXNoY2FyZHMgKz0gbjtcblxuICAgICAgICBjb25zdCBkZWNrTmFtZTogc3RyaW5nID0gZGVja1BhdGguc2hpZnQoKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIHRoaXMuc3ViZGVja3MpIHtcbiAgICAgICAgICAgIGlmIChkZWNrTmFtZSA9PT0gZGVjay5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIGRlY2suY291bnRGbGFzaGNhcmQoZGVja1BhdGgsIG4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlbGV0ZUZsYXNoY2FyZEF0SW5kZXgoaW5kZXg6IG51bWJlciwgY2FyZElzRHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChjYXJkSXNEdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZHVlRmxhc2hjYXJkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5kdWVGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmV3Rmxhc2hjYXJkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5uZXdGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZWNrOiBEZWNrID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIHdoaWxlIChkZWNrICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY2FyZElzRHVlKSB7XG4gICAgICAgICAgICAgICAgZGVjay5kdWVGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVjay5uZXdGbGFzaGNhcmRzQ291bnQtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlY2sgPSBkZWNrLnBhcmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRTdWJkZWNrc0xpc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3ViZGVja3Muc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKGEuZGVja05hbWUgPCBiLmRlY2tOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhLmRlY2tOYW1lID4gYi5kZWNrTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgZGVjayBvZiB0aGlzLnN1YmRlY2tzKSB7XG4gICAgICAgICAgICBkZWNrLnNvcnRTdWJkZWNrc0xpc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcihjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIG1vZGFsOiBGbGFzaGNhcmRNb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkZWNrVmlldzogSFRNTEVsZW1lbnQgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoXCJ0cmVlLWl0ZW1cIik7XG5cbiAgICAgICAgY29uc3QgZGVja1ZpZXdTZWxmOiBIVE1MRWxlbWVudCA9IGRlY2tWaWV3LmNyZWF0ZURpdihcbiAgICAgICAgICAgIFwidHJlZS1pdGVtLXNlbGYgdGFnLXBhbmUtdGFnIGlzLWNsaWNrYWJsZVwiXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlSW5pdGlhbGx5RXhwYW5kZWQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgbW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MuaW5pdGlhbGx5RXhwYW5kQWxsU3ViZGVja3NJblRyZWU7XG4gICAgICAgIGxldCBjb2xsYXBzZWQgPSBzaG91bGRCZUluaXRpYWxseUV4cGFuZGVkO1xuICAgICAgICBsZXQgY29sbGFwc2VJY29uRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnN1YmRlY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbGxhcHNlSWNvbkVsID0gZGVja1ZpZXdTZWxmLmNyZWF0ZURpdihcInRyZWUtaXRlbS1pY29uIGNvbGxhcHNlLWljb25cIik7XG4gICAgICAgICAgICBjb2xsYXBzZUljb25FbC5pbm5lckhUTUwgPSBDT0xMQVBTRV9JQ09OO1xuICAgICAgICAgICAgKGNvbGxhcHNlSWNvbkVsLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnRyYW5zZm9ybSA9XG4gICAgICAgICAgICAgICAgc2hvdWxkQmVJbml0aWFsbHlFeHBhbmRlZCA/IFwiXCIgOiBcInJvdGF0ZSgtOTBkZWcpXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNrVmlld0lubmVyOiBIVE1MRWxlbWVudCA9IGRlY2tWaWV3U2VsZi5jcmVhdGVEaXYoXCJ0cmVlLWl0ZW0taW5uZXJcIik7XG4gICAgICAgIGRlY2tWaWV3SW5uZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIG1vZGFsLnBsdWdpbi5kYXRhLmhpc3RvcnlEZWNrID0gdGhpcy5kZWNrTmFtZTtcbiAgICAgICAgICAgIG1vZGFsLmN1cnJlbnREZWNrID0gdGhpcztcbiAgICAgICAgICAgIG1vZGFsLmNoZWNrRGVjayA9IHRoaXMucGFyZW50O1xuICAgICAgICAgICAgbW9kYWwuc2V0dXBDYXJkc1ZpZXcoKTtcbiAgICAgICAgICAgIHRoaXMubmV4dENhcmQobW9kYWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGVja1ZpZXdJbm5lclRleHQ6IEhUTUxFbGVtZW50ID0gZGVja1ZpZXdJbm5lci5jcmVhdGVEaXYoXCJ0YWctcGFuZS10YWctdGV4dFwiKTtcbiAgICAgICAgZGVja1ZpZXdJbm5lclRleHQuaW5uZXJIVE1MICs9IDxzcGFuIGNsYXNzPVwidGFnLXBhbmUtdGFnLXNlbGZcIj57dGhpcy5kZWNrTmFtZX08L3NwYW4+O1xuICAgICAgICBjb25zdCBkZWNrVmlld091dGVyOiBIVE1MRWxlbWVudCA9IGRlY2tWaWV3U2VsZi5jcmVhdGVEaXYoXCJ0cmVlLWl0ZW0tZmxhaXItb3V0ZXJcIik7XG4gICAgICAgIGRlY2tWaWV3T3V0ZXIuaW5uZXJIVE1MICs9IChcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojNGNhZjUwO1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFnLXBhbmUtdGFnLWNvdW50IHRyZWUtaXRlbS1mbGFpciBzci1kZWNrLWNvdW50c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5kdWVGbGFzaGNhcmRzQ291bnQudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMyMTk2ZjM7XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWctcGFuZS10YWctY291bnQgdHJlZS1pdGVtLWZsYWlyIHNyLWRlY2stY291bnRzXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudC50b1N0cmluZygpfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6I2ZmNzA0MztcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhZy1wYW5lLXRhZy1jb3VudCB0cmVlLWl0ZW0tZmxhaXIgc3ItZGVjay1jb3VudHNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMudG90YWxGbGFzaGNhcmRzLnRvU3RyaW5nKCl9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlY2tWaWV3Q2hpbGRyZW46IEhUTUxFbGVtZW50ID0gZGVja1ZpZXcuY3JlYXRlRGl2KFwidHJlZS1pdGVtLWNoaWxkcmVuXCIpO1xuICAgICAgICBkZWNrVmlld0NoaWxkcmVuLnN0eWxlLmRpc3BsYXkgPSBzaG91bGRCZUluaXRpYWxseUV4cGFuZGVkID8gXCJibG9ja1wiIDogXCJub25lXCI7XG4gICAgICAgIGlmICh0aGlzLnN1YmRlY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbGxhcHNlSWNvbkVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAoY29sbGFwc2VJY29uRWwuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZGVja1ZpZXdDaGlsZHJlbi5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIChjb2xsYXBzZUljb25FbC5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5zdHlsZS50cmFuc2Zvcm0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyb3RhdGUoLTkwZGVnKVwiO1xuICAgICAgICAgICAgICAgICAgICBkZWNrVmlld0NoaWxkcmVuLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sbGFwc2VkID0gIWNvbGxhcHNlZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgZGVjayBvZiB0aGlzLnN1YmRlY2tzKSB7XG4gICAgICAgICAgICBkZWNrLnJlbmRlcihkZWNrVmlld0NoaWxkcmVuLCBtb2RhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Q2FyZChtb2RhbDogRmxhc2hjYXJkTW9kYWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmV3Rmxhc2hjYXJkcy5sZW5ndGggKyB0aGlzLmR1ZUZsYXNoY2FyZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kdWVGbGFzaGNhcmRzQ291bnQgKyB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlY2sgb2YgdGhpcy5zdWJkZWNrcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjay5kdWVGbGFzaGNhcmRzQ291bnQgKyBkZWNrLm5ld0ZsYXNoY2FyZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnREZWNrID0gZGVjaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2submV4dENhcmQobW9kYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQgPT0gbW9kYWwuY2hlY2tEZWNrKSB7XG4gICAgICAgICAgICAgICAgbW9kYWwucGx1Z2luLmRhdGEuaGlzdG9yeURlY2sgPSBcIlwiO1xuICAgICAgICAgICAgICAgIG1vZGFsLmRlY2tzTGlzdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5uZXh0Q2FyZChtb2RhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBtb2RhbC5yZXNwb25zZURpdi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIG1vZGFsLnJlc2V0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgbW9kYWwudGl0bGVFbC5zZXRUZXh0KFxuICAgICAgICAgICAgYCR7dGhpcy5kZWNrTmFtZX06ICR7dGhpcy5kdWVGbGFzaGNhcmRzQ291bnQgKyB0aGlzLm5ld0ZsYXNoY2FyZHNDb3VudH1gXG4gICAgICAgICk7XG5cbiAgICAgICAgbW9kYWwuYW5zd2VyQnRuLnN0eWxlLmRpc3BsYXkgPSBcImluaXRpYWxcIjtcbiAgICAgICAgbW9kYWwuZmxhc2hjYXJkVmlldy5lbXB0eSgpO1xuICAgICAgICBtb2RhbC5tb2RlID0gRmxhc2hjYXJkTW9kYWxNb2RlLkZyb250O1xuXG4gICAgICAgIGxldCBpbnRlcnZhbCA9IDEuMCxcbiAgICAgICAgICAgIGVhc2U6IG51bWJlciA9IG1vZGFsLnBsdWdpbi5kYXRhLnNldHRpbmdzLmJhc2VFYXNlLFxuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcgPSAwO1xuICAgICAgICBpZiAodGhpcy5kdWVGbGFzaGNhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChtb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5yYW5kb21pemVDYXJkT3JkZXIpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZElkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMuZHVlRmxhc2hjYXJkcy5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZElkeCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZCA9IHRoaXMuZHVlRmxhc2hjYXJkc1ttb2RhbC5jdXJyZW50Q2FyZElkeF07XG4gICAgICAgICAgICBtb2RhbC5yZW5kZXJNYXJrZG93bldyYXBwZXIobW9kYWwuY3VycmVudENhcmQuZnJvbnQsIG1vZGFsLmZsYXNoY2FyZFZpZXcpO1xuXG4gICAgICAgICAgICBpbnRlcnZhbCA9IG1vZGFsLmN1cnJlbnRDYXJkLmludGVydmFsO1xuICAgICAgICAgICAgZWFzZSA9IG1vZGFsLmN1cnJlbnRDYXJkLmVhc2U7XG4gICAgICAgICAgICBkZWxheUJlZm9yZVJldmlldyA9IG1vZGFsLmN1cnJlbnRDYXJkLmRlbGF5QmVmb3JlUmV2aWV3O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmV3Rmxhc2hjYXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAobW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MucmFuZG9taXplQ2FyZE9yZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlja2VkQ2FyZElkeCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubmV3Rmxhc2hjYXJkcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnRDYXJkSWR4ID0gcGlja2VkQ2FyZElkeDtcblxuICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIGZpcnN0IHVuc2NoZWR1bGVkIHNpYmxpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBwaWNrZWRDYXJkOiBDYXJkID0gdGhpcy5uZXdGbGFzaGNhcmRzW3BpY2tlZENhcmRJZHhdO1xuICAgICAgICAgICAgICAgIGxldCBpZHggPSBwaWNrZWRDYXJkSWR4O1xuICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPj0gMCAmJiBwaWNrZWRDYXJkLnNpYmxpbmdzLmluY2x1ZGVzKHRoaXMubmV3Rmxhc2hjYXJkc1tpZHhdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmV3Rmxhc2hjYXJkc1tpZHhdLmlzRHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5jdXJyZW50Q2FyZElkeCA9IGlkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZHgtLTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnRDYXJkSWR4ID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kYWwuY3VycmVudENhcmQgPSB0aGlzLm5ld0ZsYXNoY2FyZHNbbW9kYWwuY3VycmVudENhcmRJZHhdO1xuICAgICAgICAgICAgbW9kYWwucmVuZGVyTWFya2Rvd25XcmFwcGVyKG1vZGFsLmN1cnJlbnRDYXJkLmZyb250LCBtb2RhbC5mbGFzaGNhcmRWaWV3KTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucGx1Z2luLmVhc2VCeVBhdGgsXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmN1cnJlbnRDYXJkLm5vdGUucGF0aFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGVhc2UgPSBtb2RhbC5wbHVnaW4uZWFzZUJ5UGF0aFttb2RhbC5jdXJyZW50Q2FyZC5ub3RlLnBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFyZEludGVydmFsOiBudW1iZXIgPSBzY2hlZHVsZShcbiAgICAgICAgICAgIFJldmlld1Jlc3BvbnNlLkhhcmQsXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIGVhc2UsXG4gICAgICAgICAgICBkZWxheUJlZm9yZVJldmlldyxcbiAgICAgICAgICAgIG1vZGFsLnBsdWdpbi5kYXRhLnNldHRpbmdzXG4gICAgICAgICkuaW50ZXJ2YWw7XG4gICAgICAgIGNvbnN0IGdvb2RJbnRlcnZhbDogbnVtYmVyID0gc2NoZWR1bGUoXG4gICAgICAgICAgICBSZXZpZXdSZXNwb25zZS5Hb29kLFxuICAgICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgICBlYXNlLFxuICAgICAgICAgICAgZGVsYXlCZWZvcmVSZXZpZXcsXG4gICAgICAgICAgICBtb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5nc1xuICAgICAgICApLmludGVydmFsO1xuICAgICAgICBjb25zdCBlYXN5SW50ZXJ2YWw6IG51bWJlciA9IHNjaGVkdWxlKFxuICAgICAgICAgICAgUmV2aWV3UmVzcG9uc2UuRWFzeSxcbiAgICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgICAgZWFzZSxcbiAgICAgICAgICAgIGRlbGF5QmVmb3JlUmV2aWV3LFxuICAgICAgICAgICAgbW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3NcbiAgICAgICAgKS5pbnRlcnZhbDtcblxuICAgICAgICBpZiAobW9kYWwuaWdub3JlU3RhdHMpIHtcbiAgICAgICAgICAgIC8vIFNhbWUgZm9yIG1vYmlsZS9kZXNrdG9wXG4gICAgICAgICAgICBtb2RhbC5oYXJkQnRuLnNldFRleHQoYCR7bW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkSGFyZFRleHR9YCk7XG4gICAgICAgICAgICBtb2RhbC5lYXN5QnRuLnNldFRleHQoYCR7bW9kYWwucGx1Z2luLmRhdGEuc2V0dGluZ3MuZmxhc2hjYXJkRWFzeVRleHR9YCk7XG4gICAgICAgIH0gZWxzZSBpZiAoUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIG1vZGFsLmhhcmRCdG4uc2V0VGV4dCh0ZXh0SW50ZXJ2YWwoaGFyZEludGVydmFsLCB0cnVlKSk7XG4gICAgICAgICAgICBtb2RhbC5nb29kQnRuLnNldFRleHQodGV4dEludGVydmFsKGdvb2RJbnRlcnZhbCwgdHJ1ZSkpO1xuICAgICAgICAgICAgbW9kYWwuZWFzeUJ0bi5zZXRUZXh0KHRleHRJbnRlcnZhbChlYXN5SW50ZXJ2YWwsIHRydWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGFsLmhhcmRCdG4uc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgJHttb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRIYXJkVGV4dH0gLSAke3RleHRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgaGFyZEludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vZGFsLmdvb2RCdG4uc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgJHttb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRHb29kVGV4dH0gLSAke3RleHRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgZ29vZEludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vZGFsLmVhc3lCdG4uc2V0VGV4dChcbiAgICAgICAgICAgICAgICBgJHttb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5mbGFzaGNhcmRFYXN5VGV4dH0gLSAke3RleHRJbnRlcnZhbChcbiAgICAgICAgICAgICAgICAgICAgZWFzeUludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb2RhbC5wbHVnaW4uZGF0YS5zZXR0aW5ncy5zaG93Q29udGV4dEluQ2FyZHMpXG4gICAgICAgICAgICBtb2RhbC5jb250ZXh0Vmlldy5zZXRUZXh0KG1vZGFsLmN1cnJlbnRDYXJkLmNvbnRleHQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBURmlsZSB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5pbXBvcnQgeyBTUlNldHRpbmdzIH0gZnJvbSBcInNyYy9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCJzcmMvbGFuZy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBlbnVtIFJldmlld1Jlc3BvbnNlIHtcbiAgICBFYXN5LFxuICAgIEdvb2QsXG4gICAgSGFyZCxcbiAgICBSZXNldCxcbn1cblxuLy8gRmxhc2hjYXJkc1xuXG5leHBvcnQgaW50ZXJmYWNlIENhcmQge1xuICAgIGVkaXRMYXRlcjogYm9vbGVhbjtcbiAgICAvLyBzY2hlZHVsaW5nXG4gICAgaXNEdWU6IGJvb2xlYW47XG4gICAgaW50ZXJ2YWw/OiBudW1iZXI7XG4gICAgZWFzZT86IG51bWJlcjtcbiAgICBkZWxheUJlZm9yZVJldmlldz86IG51bWJlcjtcbiAgICAvLyBub3RlXG4gICAgbm90ZTogVEZpbGU7XG4gICAgbGluZU5vOiBudW1iZXI7XG4gICAgLy8gdmlzdWFsc1xuICAgIGZyb250OiBzdHJpbmc7XG4gICAgYmFjazogc3RyaW5nO1xuICAgIGNhcmRUZXh0OiBzdHJpbmc7XG4gICAgY29udGV4dDogc3RyaW5nO1xuICAgIC8vIHR5cGVzXG4gICAgY2FyZFR5cGU6IENhcmRUeXBlO1xuICAgIC8vIGluZm9ybWF0aW9uIGZvciBzaWJsaW5nIGNhcmRzXG4gICAgc2libGluZ0lkeDogbnVtYmVyO1xuICAgIHNpYmxpbmdzOiBDYXJkW107XG59XG5cbmV4cG9ydCBlbnVtIENhcmRUeXBlIHtcbiAgICBTaW5nbGVMaW5lQmFzaWMsXG4gICAgU2luZ2xlTGluZVJldmVyc2VkLFxuICAgIE11bHRpTGluZUJhc2ljLFxuICAgIE11bHRpTGluZVJldmVyc2VkLFxuICAgIENsb3plLFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGUoXG4gICAgcmVzcG9uc2U6IFJldmlld1Jlc3BvbnNlLFxuICAgIGludGVydmFsOiBudW1iZXIsXG4gICAgZWFzZTogbnVtYmVyLFxuICAgIGRlbGF5QmVmb3JlUmV2aWV3OiBudW1iZXIsXG4gICAgc2V0dGluZ3NPYmo6IFNSU2V0dGluZ3MsXG4gICAgZHVlRGF0ZXM/OiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+XG4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcbiAgICBkZWxheUJlZm9yZVJldmlldyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoZGVsYXlCZWZvcmVSZXZpZXcgLyAoMjQgKiAzNjAwICogMTAwMCkpKTtcblxuICAgIGlmIChyZXNwb25zZSA9PT0gUmV2aWV3UmVzcG9uc2UuRWFzeSkge1xuICAgICAgICBlYXNlICs9IDIwO1xuICAgICAgICBpbnRlcnZhbCA9ICgoaW50ZXJ2YWwgKyBkZWxheUJlZm9yZVJldmlldykgKiBlYXNlKSAvIDEwMDtcbiAgICAgICAgaW50ZXJ2YWwgKj0gc2V0dGluZ3NPYmouZWFzeUJvbnVzO1xuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UgPT09IFJldmlld1Jlc3BvbnNlLkdvb2QpIHtcbiAgICAgICAgaW50ZXJ2YWwgPSAoKGludGVydmFsICsgZGVsYXlCZWZvcmVSZXZpZXcgLyAyKSAqIGVhc2UpIC8gMTAwO1xuICAgIH0gZWxzZSBpZiAocmVzcG9uc2UgPT09IFJldmlld1Jlc3BvbnNlLkhhcmQpIHtcbiAgICAgICAgZWFzZSA9IE1hdGgubWF4KDEzMCwgZWFzZSAtIDIwKTtcbiAgICAgICAgaW50ZXJ2YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAoaW50ZXJ2YWwgKyBkZWxheUJlZm9yZVJldmlldyAvIDQpICogc2V0dGluZ3NPYmoubGFwc2VzSW50ZXJ2YWxDaGFuZ2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZXBsYWNlcyByYW5kb20gZnV6eiB3aXRoIGxvYWQgYmFsYW5jaW5nIG92ZXIgdGhlIGZ1enogaW50ZXJ2YWxcbiAgICBpZiAoZHVlRGF0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnRlcnZhbCA9IE1hdGgucm91bmQoaW50ZXJ2YWwpO1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkdWVEYXRlcywgaW50ZXJ2YWwpKSB7XG4gICAgICAgICAgICBkdWVEYXRlc1tpbnRlcnZhbF0gPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlzYWJsZSBmdXp6aW5nIGZvciBzbWFsbCBpbnRlcnZhbHNcbiAgICAgICAgICAgIGlmIChpbnRlcnZhbCA+IDQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnV6eiA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGludGVydmFsIDwgNykgZnV6eiA9IDE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaW50ZXJ2YWwgPCAzMCkgZnV6eiA9IE1hdGgubWF4KDIsIE1hdGguZmxvb3IoaW50ZXJ2YWwgKiAwLjE1KSk7XG4gICAgICAgICAgICAgICAgZWxzZSBmdXp6ID0gTWF0aC5tYXgoNCwgTWF0aC5mbG9vcihpbnRlcnZhbCAqIDAuMDUpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgICAgICAgICAgICAgICBvdXRlcjogZm9yIChsZXQgaSA9IDE7IGkgPD0gZnV6ejsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXZsIG9mIFtvcmlnaW5hbEludGVydmFsIC0gaSwgb3JpZ2luYWxJbnRlcnZhbCArIGldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkdWVEYXRlcywgaXZsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZURhdGVzW2l2bF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsID0gaXZsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1ZURhdGVzW2l2bF0gPCBkdWVEYXRlc1tpbnRlcnZhbF0pIGludGVydmFsID0gaXZsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZHVlRGF0ZXNbaW50ZXJ2YWxdKys7XG4gICAgfVxuXG4gICAgaW50ZXJ2YWwgPSBNYXRoLm1pbihpbnRlcnZhbCwgc2V0dGluZ3NPYmoubWF4aW11bUludGVydmFsKTtcblxuICAgIHJldHVybiB7IGludGVydmFsOiBNYXRoLnJvdW5kKGludGVydmFsICogMTApIC8gMTAsIGVhc2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRleHRJbnRlcnZhbChpbnRlcnZhbDogbnVtYmVyLCBpc01vYmlsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKGludGVydmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHQoXCJORVdcIik7XG4gICAgfVxuXG4gICAgY29uc3QgbTogbnVtYmVyID0gTWF0aC5yb3VuZChpbnRlcnZhbCAvIDMuMDQzNzUpIC8gMTAsXG4gICAgICAgIHk6IG51bWJlciA9IE1hdGgucm91bmQoaW50ZXJ2YWwgLyAzNi41MjUpIC8gMTA7XG5cbiAgICBpZiAoaXNNb2JpbGUpIHtcbiAgICAgICAgaWYgKG0gPCAxLjApIHJldHVybiB0KFwiREFZU19TVFJfSVZMX01PQklMRVwiLCB7IGludGVydmFsIH0pO1xuICAgICAgICBlbHNlIGlmICh5IDwgMS4wKSByZXR1cm4gdChcIk1PTlRIU19TVFJfSVZMX01PQklMRVwiLCB7IGludGVydmFsOiBtIH0pO1xuICAgICAgICBlbHNlIHJldHVybiB0KFwiWUVBUlNfU1RSX0lWTF9NT0JJTEVcIiwgeyBpbnRlcnZhbDogeSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobSA8IDEuMCkgcmV0dXJuIHQoXCJEQVlTX1NUUl9JVkxcIiwgeyBpbnRlcnZhbCB9KTtcbiAgICAgICAgZWxzZSBpZiAoeSA8IDEuMCkgcmV0dXJuIHQoXCJNT05USFNfU1RSX0lWTFwiLCB7IGludGVydmFsOiBtIH0pO1xuICAgICAgICBlbHNlIHJldHVybiB0KFwiWUVBUlNfU1RSX0lWTFwiLCB7IGludGVydmFsOiB5IH0pO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgU0NIRURVTElOR19JTkZPX1JFR0VYID1cbiAgICAvXi0tLVxcbigoPzouKlxcbikqKXNyLWR1ZTogKC4rKVxcbnNyLWludGVydmFsOiAoXFxkKylcXG5zci1lYXNlOiAoXFxkKylcXG4oKD86LipcXG4pPyktLS0vO1xuZXhwb3J0IGNvbnN0IFlBTUxfRlJPTlRfTUFUVEVSX1JFR0VYID0gL14tLS1cXG4oKD86LipcXG4pKj8pLS0tLztcblxuZXhwb3J0IGNvbnN0IE1VTFRJX1NDSEVEVUxJTkdfRVhUUkFDVE9SID0gLyEoW1xcZC1dKyksKFxcZCspLChcXGQrKS9nbTtcbmV4cG9ydCBjb25zdCBMRUdBQ1lfU0NIRURVTElOR19FWFRSQUNUT1IgPSAvPCEtLVNSOihbXFxkLV0rKSwoXFxkKyksKFxcZCspLS0+L2dtO1xuXG5leHBvcnQgY29uc3QgSU1BR0VfRk9STUFUUyA9IFtcbiAgICBcImpwZ1wiLFxuICAgIFwianBlZ1wiLFxuICAgIFwiZ2lmXCIsXG4gICAgXCJwbmdcIixcbiAgICBcInN2Z1wiLFxuICAgIFwid2VicFwiLFxuICAgIFwiYXBuZ1wiLFxuICAgIFwiYXZpZlwiLFxuICAgIFwiamZpZlwiLFxuICAgIFwicGpwZWdcIixcbiAgICBcInBqcFwiLFxuICAgIFwiYm1wXCIsXG5dO1xuZXhwb3J0IGNvbnN0IEFVRElPX0ZPUk1BVFMgPSBbXCJtcDNcIiwgXCJ3ZWJtXCIsIFwibTRhXCIsIFwid2F2XCIsIFwib2dnXCJdO1xuZXhwb3J0IGNvbnN0IFZJREVPX0ZPUk1BVFMgPSBbXCJtcDRcIiwgXCJta3ZcIiwgXCJhdmlcIiwgXCJtb3ZcIl07XG5cbmV4cG9ydCBjb25zdCBDT0xMQVBTRV9JQ09OID1cbiAgICAnPHN2ZyB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCI4XCIgY2xhc3M9XCJyaWdodC10cmlhbmdsZVwiPjxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTk0LjksMjAuOGMtMS40LTIuNS00LjEtNC4xLTcuMS00LjFIMTIuMmMtMywwLTUuNywxLjYtNy4xLDQuMWMtMS4zLDIuNC0xLjIsNS4yLDAuMiw3LjZMNDMuMSw4OGMxLjUsMi4zLDQsMy43LDYuOSwzLjcgczUuNC0xLjQsNi45LTMuN2wzNy44LTU5LjZDOTYuMSwyNiw5Ni4yLDIzLjIsOTQuOSwyMC44TDk0LjksMjAuOHpcIj48L3BhdGg+PC9zdmc+JztcbiIsICJ0eXBlIEhleCA9IG51bWJlcjtcblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY5MDE5ODc0XG50eXBlIE9iamVjdFR5cGUgPSBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+O1xudHlwZSBQaWNrQnlWYWx1ZTxPQkpfVCwgVkFMVUVfVD4gPSAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTUxNTMwMDBcbiAgICBQaWNrPE9CSl9ULCB7IFtLIGluIGtleW9mIE9CSl9UXTogT0JKX1RbS10gZXh0ZW5kcyBWQUxVRV9UID8gSyA6IG5ldmVyIH1ba2V5b2YgT0JKX1RdPjtcbnR5cGUgT2JqZWN0RW50cmllczxPQkpfVD4gPSAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjAxNDIwOTVcbiAgICB7IFtLIGluIGtleW9mIE9CSl9UXTogW2tleW9mIFBpY2tCeVZhbHVlPE9CSl9ULCBPQkpfVFtLXT4sIE9CSl9UW0tdXSB9W2tleW9mIE9CSl9UXVtdO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVkT2JqZWN0RW50cmllczxPQkpfVCBleHRlbmRzIE9iamVjdFR5cGU+KG9iajogT0JKX1QpOiBPYmplY3RFbnRyaWVzPE9CSl9UPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikgYXMgT2JqZWN0RW50cmllczxPQkpfVD47XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUga2V5cyBvZiBhbiBvYmplY3Qgd2l0aCB0eXBlIGAoa2V5b2YgVClbXWBcbiAqIGluc3RlYWQgb2YgYHN0cmluZ1tdYFxuICogUGxlYXNlIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTk0NTkwMDAgZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSBvYmogLSBBbiBvYmplY3RcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHRoZSBrZXlzIG9mIGBvYmpgIHdpdGggdHlwZSBgKGtleW9mIFQpW11gXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRLZXlzUHJlc2VydmVUeXBlID0gT2JqZWN0LmtleXMgYXMgPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgb2JqOiBUXG4pID0+IEFycmF5PGtleW9mIFQ+O1xuXG4vKipcbiAqIEVzY2FwZXMgdGhlIGlucHV0IHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSByZWdleFxuICogd2hpbGUgbWFraW5nIHN1cmUgdGhhdCBzeW1ib2xzIGxpa2UgYD9gIGFuZCBgKmAgYXJlbid0IGludGVycHJldGVkXG4gKiBhcyByZWdleCBzcGVjaWFscy5cbiAqIFBsZWFzZSBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzY5Njk0ODYgZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIGJlIGVzY2FwZWRcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZ1xuICovXG5leHBvcnQgY29uc3QgZXNjYXBlUmVnZXhTdHJpbmcgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgdGV4dC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3lyYjUzIGhhc2ggKGhleCBzdHJpbmcpIG9mIHRoZSBpbnB1dCBzdHJpbmdcbiAqIFBsZWFzZSBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzUyMTcxNDgwIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBiZSBoYXNoZWRcbiAqIEBwYXJhbSBzZWVkIC0gVGhlIHNlZWQgZm9yIHRoZSBjeXJiNTMgZnVuY3Rpb25cbiAqIEByZXR1cm5zIFRoZSBjeXJiNTMgaGFzaCAoaGV4IHN0cmluZykgb2YgYHN0cmAgc2VlZGVkIHVzaW5nIGBzZWVkYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3lyYjUzKHN0cjogc3RyaW5nLCBzZWVkID0gMCk6IHN0cmluZyB7XG4gICAgbGV0IGgxOiBIZXggPSAweGRlYWRiZWVmIF4gc2VlZCxcbiAgICAgICAgaDI6IEhleCA9IDB4NDFjNmNlNTcgXiBzZWVkO1xuICAgIGZvciAobGV0IGkgPSAwLCBjaDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjaCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBoMSA9IE1hdGguaW11bChoMSBeIGNoLCAyNjU0NDM1NzYxKTtcbiAgICAgICAgaDIgPSBNYXRoLmltdWwoaDIgXiBjaCwgMTU5NzMzNDY3Nyk7XG4gICAgfVxuICAgIGgxID0gTWF0aC5pbXVsKGgxIF4gKGgxID4+PiAxNiksIDIyNDY4MjI1MDcpIF4gTWF0aC5pbXVsKGgyIF4gKGgyID4+PiAxMyksIDMyNjY0ODk5MDkpO1xuICAgIGgyID0gTWF0aC5pbXVsKGgyIF4gKGgyID4+PiAxNiksIDIyNDY4MjI1MDcpIF4gTWF0aC5pbXVsKGgxIF4gKGgxID4+PiAxMyksIDMyNjY0ODk5MDkpO1xuICAgIHJldHVybiAoNDI5NDk2NzI5NiAqICgyMDk3MTUxICYgaDIpICsgKGgxID4+PiAwKSkudG9TdHJpbmcoMTYpO1xufVxuIiwgImltcG9ydCB7IE1vZGFsLCBBcHAsIFBsYXRmb3JtIH0gZnJvbSBcIm9ic2lkaWFuXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5pbXBvcnQgaCBmcm9tIFwidmh0bWxcIjtcbmltcG9ydCB7XG4gICAgQ2hhcnQsXG4gICAgQmFyRWxlbWVudCxcbiAgICBCYXJDb250cm9sbGVyLFxuICAgIExlZ2VuZCxcbiAgICBUaXRsZSxcbiAgICBUb29sdGlwLFxuICAgIFN1YlRpdGxlLFxuICAgIENoYXJ0VHlwZVJlZ2lzdHJ5LFxuICAgIENhdGVnb3J5U2NhbGUsXG4gICAgTGluZWFyU2NhbGUsXG4gICAgUGllQ29udHJvbGxlcixcbiAgICBBcmNFbGVtZW50LFxufSBmcm9tIFwiY2hhcnQuanNcIjtcblxuaW1wb3J0IHR5cGUgU1JQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyBnZXRLZXlzUHJlc2VydmVUeXBlLCBnZXRUeXBlZE9iamVjdEVudHJpZXMgfSBmcm9tIFwic3JjL3V0aWxzXCI7XG5pbXBvcnQgeyB0ZXh0SW50ZXJ2YWwgfSBmcm9tIFwic3JjL3NjaGVkdWxpbmdcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwic3JjL2xhbmcvaGVscGVyc1wiO1xuXG5DaGFydC5yZWdpc3RlcihcbiAgICBCYXJFbGVtZW50LFxuICAgIEJhckNvbnRyb2xsZXIsXG4gICAgTGVnZW5kLFxuICAgIFRpdGxlLFxuICAgIFRvb2x0aXAsXG4gICAgU3ViVGl0bGUsXG4gICAgQ2F0ZWdvcnlTY2FsZSxcbiAgICBMaW5lYXJTY2FsZSxcbiAgICBQaWVDb250cm9sbGVyLFxuICAgIEFyY0VsZW1lbnRcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHMge1xuICAgIGVhc2VzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+O1xuICAgIGludGVydmFsczogUmVjb3JkPG51bWJlciwgbnVtYmVyPjtcbiAgICBuZXdDb3VudDogbnVtYmVyO1xuICAgIHlvdW5nQ291bnQ6IG51bWJlcjtcbiAgICBtYXR1cmVDb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhdHNNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBwcml2YXRlIHBsdWdpbjogU1JQbHVnaW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTUlBsdWdpbikge1xuICAgICAgICBzdXBlcihhcHApO1xuXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xuXG4gICAgICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KGAke3QoXCJTVEFUU19USVRMRVwiKX0gYCk7XG4gICAgICAgIHRoaXMudGl0bGVFbC5hZGRDbGFzcyhcInNyLWNlbnRlcmVkXCIpO1xuICAgICAgICB0aGlzLnRpdGxlRWwuaW5uZXJIVE1MICs9IChcbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzci1jaGFydC1wZXJpb2RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhcIiBzZWxlY3RlZD5cbiAgICAgICAgICAgICAgICAgICAge3QoXCJNT05USFwiKX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicXVhcnRlclwiPnt0KFwiUVVBUlRFUlwiKX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwieWVhclwiPnt0KFwiWUVBUlwiKX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibGlmZXRpbWVcIj57dChcIkxJRkVUSU1FXCIpfTwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5tb2RhbEVsLnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xuICAgICAgICB0aGlzLm1vZGFsRWwuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcblxuICAgICAgICBpZiAoUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk9wZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgY29udGVudEVsIH0gPSB0aGlzO1xuICAgICAgICBjb250ZW50RWwuc3R5bGUudGV4dEFsaWduID0gXCJjZW50ZXJcIjtcblxuICAgICAgICAvLyBBZGQgZm9yZWNhc3RcbiAgICAgICAgbGV0IG1heE46IG51bWJlciA9IE1hdGgubWF4KC4uLmdldEtleXNQcmVzZXJ2ZVR5cGUodGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzKSk7XG4gICAgICAgIGZvciAobGV0IGR1ZU9mZnNldCA9IDA7IGR1ZU9mZnNldCA8PSBtYXhOOyBkdWVPZmZzZXQrKykge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzLCBkdWVPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzW2R1ZU9mZnNldF0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVlRGF0ZXNGbGFzaGNhcmRzQ29weTogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHsgMDogMCB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtkdWVPZmZzZXQsIGR1ZUNvdW50XSBvZiBnZXRUeXBlZE9iamVjdEVudHJpZXModGhpcy5wbHVnaW4uZHVlRGF0ZXNGbGFzaGNhcmRzKSkge1xuICAgICAgICAgICAgaWYgKGR1ZU9mZnNldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgZHVlRGF0ZXNGbGFzaGNhcmRzQ29weVswXSArPSBkdWVDb3VudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVlRGF0ZXNGbGFzaGNhcmRzQ29weVtkdWVPZmZzZXRdID0gZHVlQ291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJkU3RhdHM6IFN0YXRzID0gdGhpcy5wbHVnaW4uY2FyZFN0YXRzO1xuICAgICAgICBjb25zdCBzY2hlZHVsZWRDb3VudDogbnVtYmVyID0gY2FyZFN0YXRzLnlvdW5nQ291bnQgKyBjYXJkU3RhdHMubWF0dXJlQ291bnQ7XG4gICAgICAgIG1heE4gPSBNYXRoLm1heChtYXhOLCAxKTtcblxuICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MICs9IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGNhbnZhcyBpZD1cImZvcmVjYXN0Q2hhcnRcIj48L2NhbnZhcz5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImZvcmVjYXN0Q2hhcnRTdW1tYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJpbnRlcnZhbHNDaGFydFwiPjwvY2FudmFzPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwiaW50ZXJ2YWxzQ2hhcnRTdW1tYXJ5XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJlYXNlc0NoYXJ0XCI+PC9jYW52YXM+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJlYXNlc0NoYXJ0U3VtbWFyeVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPVwiY2FyZFR5cGVzQ2hhcnRcIj48L2NhbnZhcz5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cImNhcmRUeXBlc0NoYXJ0U3VtbWFyeVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuXG4gICAgICAgIGNyZWF0ZVN0YXRzQ2hhcnQoXG4gICAgICAgICAgICBcImJhclwiLFxuICAgICAgICAgICAgXCJmb3JlY2FzdENoYXJ0XCIsXG4gICAgICAgICAgICB0KFwiRk9SRUNBU1RcIiksXG4gICAgICAgICAgICB0KFwiRk9SRUNBU1RfREVTQ1wiKSxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGR1ZURhdGVzRmxhc2hjYXJkc0NvcHkpLFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhkdWVEYXRlc0ZsYXNoY2FyZHNDb3B5KSxcbiAgICAgICAgICAgIHQoXCJSRVZJRVdTX1BFUl9EQVlcIiwgeyBhdmc6IChzY2hlZHVsZWRDb3VudCAvIG1heE4pLnRvRml4ZWQoMSkgfSksXG4gICAgICAgICAgICB0KFwiU0NIRURVTEVEXCIpLFxuICAgICAgICAgICAgdChcIkRBWVNcIiksXG4gICAgICAgICAgICB0KFwiTlVNQkVSX09GX0NBUkRTXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgbWF4TiA9IE1hdGgubWF4KC4uLmdldEtleXNQcmVzZXJ2ZVR5cGUoY2FyZFN0YXRzLmludGVydmFscykpO1xuICAgICAgICBmb3IgKGxldCBpbnRlcnZhbCA9IDA7IGludGVydmFsIDw9IG1heE47IGludGVydmFsKyspIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNhcmRTdGF0cy5pbnRlcnZhbHMsIGludGVydmFsKSkge1xuICAgICAgICAgICAgICAgIGNhcmRTdGF0cy5pbnRlcnZhbHNbaW50ZXJ2YWxdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBpbnRlcnZhbHNcbiAgICAgICAgY29uc3QgYXZlcmFnZV9pbnRlcnZhbDogc3RyaW5nID0gdGV4dEludGVydmFsKFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgIChnZXRUeXBlZE9iamVjdEVudHJpZXMoY2FyZFN0YXRzLmludGVydmFscylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtpbnRlcnZhbCwgY291bnRdKSA9PiBpbnRlcnZhbCAqIGNvdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC9cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZENvdW50KSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICkgLyAxMCB8fCAwLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbG9uZ2VzdF9pbnRlcnZhbDogc3RyaW5nID0gdGV4dEludGVydmFsKFxuICAgICAgICAgICAgICAgIE1hdGgubWF4KC4uLmdldEtleXNQcmVzZXJ2ZVR5cGUoY2FyZFN0YXRzLmludGVydmFscykpIHx8IDAsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY3JlYXRlU3RhdHNDaGFydChcbiAgICAgICAgICAgIFwiYmFyXCIsXG4gICAgICAgICAgICBcImludGVydmFsc0NoYXJ0XCIsXG4gICAgICAgICAgICB0KFwiSU5URVJWQUxTXCIpLFxuICAgICAgICAgICAgdChcIklOVEVSVkFMU19ERVNDXCIpLFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoY2FyZFN0YXRzLmludGVydmFscyksXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGNhcmRTdGF0cy5pbnRlcnZhbHMpLFxuICAgICAgICAgICAgdChcIklOVEVSVkFMU19TVU1NQVJZXCIsIHsgYXZnOiBhdmVyYWdlX2ludGVydmFsLCBsb25nZXN0OiBsb25nZXN0X2ludGVydmFsIH0pLFxuICAgICAgICAgICAgdChcIkNPVU5UXCIpLFxuICAgICAgICAgICAgdChcIkRBWVNcIiksXG4gICAgICAgICAgICB0KFwiTlVNQkVSX09GX0NBUkRTXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWRkIGVhc2VzXG4gICAgICAgIGNvbnN0IGVhc2VzOiBudW1iZXJbXSA9IGdldEtleXNQcmVzZXJ2ZVR5cGUoY2FyZFN0YXRzLmVhc2VzKTtcbiAgICAgICAgZm9yIChsZXQgZWFzZSA9IE1hdGgubWluKC4uLmVhc2VzKTsgZWFzZSA8PSBNYXRoLm1heCguLi5lYXNlcyk7IGVhc2UrKykge1xuICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2FyZFN0YXRzLmVhc2VzLCBlYXNlKSkge1xuICAgICAgICAgICAgICAgIGNhcmRTdGF0cy5lYXNlc1tlYXNlXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZlcmFnZV9lYXNlOiBudW1iZXIgPVxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICBnZXRUeXBlZE9iamVjdEVudHJpZXMoY2FyZFN0YXRzLmVhc2VzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbZWFzZSwgY291bnRdKSA9PiBlYXNlICogY291bnQpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHNjaGVkdWxlZENvdW50XG4gICAgICAgICAgICApIHx8IDA7XG5cbiAgICAgICAgY3JlYXRlU3RhdHNDaGFydChcbiAgICAgICAgICAgIFwiYmFyXCIsXG4gICAgICAgICAgICBcImVhc2VzQ2hhcnRcIixcbiAgICAgICAgICAgIHQoXCJFQVNFU1wiKSxcbiAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjYXJkU3RhdHMuZWFzZXMpLFxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhjYXJkU3RhdHMuZWFzZXMpLFxuICAgICAgICAgICAgdChcIkVBU0VTX1NVTU1BUllcIiwgeyBhdmdFYXNlOiBhdmVyYWdlX2Vhc2UgfSksXG4gICAgICAgICAgICB0KFwiQ09VTlRcIiksXG4gICAgICAgICAgICB0KFwiRUFTRVNcIiksXG4gICAgICAgICAgICB0KFwiTlVNQkVSX09GX0NBUkRTXCIpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQWRkIGNhcmQgdHlwZXNcbiAgICAgICAgY29uc3QgdG90YWxDYXJkc0NvdW50OiBudW1iZXIgPSB0aGlzLnBsdWdpbi5kZWNrVHJlZS50b3RhbEZsYXNoY2FyZHM7XG4gICAgICAgIGNyZWF0ZVN0YXRzQ2hhcnQoXG4gICAgICAgICAgICBcInBpZVwiLFxuICAgICAgICAgICAgXCJjYXJkVHlwZXNDaGFydFwiLFxuICAgICAgICAgICAgdChcIkNBUkRfVFlQRVNcIiksXG4gICAgICAgICAgICB0KFwiQ0FSRF9UWVBFU19ERVNDXCIpLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGAke3QoXCJDQVJEX1RZUEVfTkVXXCIpfSAtICR7TWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgKGNhcmRTdGF0cy5uZXdDb3VudCAvIHRvdGFsQ2FyZHNDb3VudCkgKiAxMDBcbiAgICAgICAgICAgICAgICApfSVgLFxuICAgICAgICAgICAgICAgIGAke3QoXCJDQVJEX1RZUEVfWU9VTkdcIil9IC0gJHtNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICAgICAoY2FyZFN0YXRzLnlvdW5nQ291bnQgLyB0b3RhbENhcmRzQ291bnQpICogMTAwXG4gICAgICAgICAgICAgICAgKX0lYCxcbiAgICAgICAgICAgICAgICBgJHt0KFwiQ0FSRF9UWVBFX01BVFVSRVwiKX0gLSAke01hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgIChjYXJkU3RhdHMubWF0dXJlQ291bnQgLyB0b3RhbENhcmRzQ291bnQpICogMTAwXG4gICAgICAgICAgICAgICAgKX0lYCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbY2FyZFN0YXRzLm5ld0NvdW50LCBjYXJkU3RhdHMueW91bmdDb3VudCwgY2FyZFN0YXRzLm1hdHVyZUNvdW50XSxcbiAgICAgICAgICAgIHQoXCJDQVJEX1RZUEVTX1NVTU1BUllcIiwgeyB0b3RhbENhcmRzQ291bnQgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcbiAgICAgICAgY29udGVudEVsLmVtcHR5KCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTdGF0c0NoYXJ0KFxuICAgIHR5cGU6IGtleW9mIENoYXJ0VHlwZVJlZ2lzdHJ5LFxuICAgIGNhbnZhc0lkOiBzdHJpbmcsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBzdWJ0aXRsZTogc3RyaW5nLFxuICAgIGxhYmVsczogc3RyaW5nW10sXG4gICAgZGF0YTogbnVtYmVyW10sXG4gICAgc3VtbWFyeTogc3RyaW5nLFxuICAgIHNlcmllc1RpdGxlID0gXCJcIixcbiAgICB4QXhpc1RpdGxlID0gXCJcIixcbiAgICB5QXhpc1RpdGxlID0gXCJcIlxuKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpO1xuICAgIGNvbnN0IHRleHRDb2xvciA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCItLXRleHQtbm9ybWFsXCIpO1xuXG4gICAgbGV0IHNjYWxlcyA9IHt9LFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBbXCIjMjE5NmYzXCJdO1xuICAgIGlmICh0eXBlICE9PSBcInBpZVwiKSB7XG4gICAgICAgIHNjYWxlcyA9IHtcbiAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB4QXhpc1RpdGxlLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHlBeGlzVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yID0gW1wiIzIxOTZmM1wiLCBcIiM0Y2FmNTBcIiwgXCJncmVlblwiXTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRGaWx0ZXIgPSBjYW52YXNJZCA9PT0gXCJmb3JlY2FzdENoYXJ0XCIgfHwgY2FudmFzSWQgPT09IFwiaW50ZXJ2YWxzQ2hhcnRcIjtcblxuICAgIGNvbnN0IHN0YXRzQ2hhcnQgPSBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzSWQpIGFzIEhUTUxDYW52YXNFbGVtZW50LCB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGxhYmVsczogc2hvdWxkRmlsdGVyID8gbGFiZWxzLnNsaWNlKDAsIDMxKSA6IGxhYmVscyxcbiAgICAgICAgICAgIGRhdGFzZXRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogc2VyaWVzVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2hvdWxkRmlsdGVyID8gZGF0YS5zbGljZSgwLCAzMSkgOiBkYXRhLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBzY2FsZXMsXG4gICAgICAgICAgICBwbHVnaW5zOiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDIyLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGV4dENvbG9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VidGl0bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogc3VidGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IFwiaXRhbGljXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiB0ZXh0Q29sb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsZWdlbmQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3BlY3RSYXRpbzogMixcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChzaG91bGRGaWx0ZXIpIHtcbiAgICAgICAgY29uc3QgY2hhcnRQZXJpb2RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3ItY2hhcnQtcGVyaW9kXCIpIGFzIEhUTUxTZWxlY3RFbGVtZW50O1xuICAgICAgICBjaGFydFBlcmlvZEVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRMYWJlbHMsIGZpbHRlcmVkRGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJ0UGVyaW9kID0gY2hhcnRQZXJpb2RFbC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChjaGFydFBlcmlvZCA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRMYWJlbHMgPSBsYWJlbHMuc2xpY2UoMCwgMzEpO1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGRhdGEuc2xpY2UoMCwgMzEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFydFBlcmlvZCA9PT0gXCJxdWFydGVyXCIpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZExhYmVscyA9IGxhYmVscy5zbGljZSgwLCA5MSk7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZGF0YS5zbGljZSgwLCA5MSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJ0UGVyaW9kID09PSBcInllYXJcIikge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkTGFiZWxzID0gbGFiZWxzLnNsaWNlKDAsIDM2Nik7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZGF0YS5zbGljZSgwLCAzNjYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZExhYmVscyA9IGxhYmVscztcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0c0NoYXJ0LmRhdGEubGFiZWxzID0gZmlsdGVyZWRMYWJlbHM7XG4gICAgICAgICAgICBzdGF0c0NoYXJ0LmRhdGEuZGF0YXNldHNbMF0gPSB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHNlcmllc1RpdGxlLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgICAgICBkYXRhOiBmaWx0ZXJlZERhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc3RhdHNDaGFydC51cGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7Y2FudmFzSWR9U3VtbWFyeWApLmlubmVyVGV4dCA9IHN1bW1hcnk7XG59XG4iLCAiLyohXG4gKiBAa3Vya2xlL2NvbG9yIHYwLjMuMlxuICogaHR0cHM6Ly9naXRodWIuY29tL2t1cmtsZS9jb2xvciNyZWFkbWVcbiAqIChjKSAyMDIzIEp1a2thIEt1cmtlbGFcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICovXG5mdW5jdGlvbiByb3VuZCh2KSB7XG4gIHJldHVybiB2ICsgMC41IHwgMDtcbn1cbmNvbnN0IGxpbSA9ICh2LCBsLCBoKSA9PiBNYXRoLm1heChNYXRoLm1pbih2LCBoKSwgbCk7XG5mdW5jdGlvbiBwMmIodikge1xuICByZXR1cm4gbGltKHJvdW5kKHYgKiAyLjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpLCAwLCAxMDApO1xufVxuZnVuY3Rpb24gbjJiKHYpIHtcbiAgcmV0dXJuIGxpbShyb3VuZCh2ICogMjU1KSwgMCwgMjU1KTtcbn1cbmZ1bmN0aW9uIGIybih2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAvIDIuNTUpIC8gMTAwLCAwLCAxKTtcbn1cbmZ1bmN0aW9uIG4ycCh2KSB7XG4gIHJldHVybiBsaW0ocm91bmQodiAqIDEwMCksIDAsIDEwMCk7XG59XG5cbmNvbnN0IG1hcCQxID0gezA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksIEE6IDEwLCBCOiAxMSwgQzogMTIsIEQ6IDEzLCBFOiAxNCwgRjogMTUsIGE6IDEwLCBiOiAxMSwgYzogMTIsIGQ6IDEzLCBlOiAxNCwgZjogMTV9O1xuY29uc3QgaGV4ID0gWy4uLicwMTIzNDU2Nzg5QUJDREVGJ107XG5jb25zdCBoMSA9IGIgPT4gaGV4W2IgJiAweEZdO1xuY29uc3QgaDIgPSBiID0+IGhleFsoYiAmIDB4RjApID4+IDRdICsgaGV4W2IgJiAweEZdO1xuY29uc3QgZXEgPSBiID0+ICgoYiAmIDB4RjApID4+IDQpID09PSAoYiAmIDB4Rik7XG5jb25zdCBpc1Nob3J0ID0gdiA9PiBlcSh2LnIpICYmIGVxKHYuZykgJiYgZXEodi5iKSAmJiBlcSh2LmEpO1xuZnVuY3Rpb24gaGV4UGFyc2Uoc3RyKSB7XG4gIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICB2YXIgcmV0O1xuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAobGVuID09PSA0IHx8IGxlbiA9PT0gNSkge1xuICAgICAgcmV0ID0ge1xuICAgICAgICByOiAyNTUgJiBtYXAkMVtzdHJbMV1dICogMTcsXG4gICAgICAgIGc6IDI1NSAmIG1hcCQxW3N0clsyXV0gKiAxNyxcbiAgICAgICAgYjogMjU1ICYgbWFwJDFbc3RyWzNdXSAqIDE3LFxuICAgICAgICBhOiBsZW4gPT09IDUgPyBtYXAkMVtzdHJbNF1dICogMTcgOiAyNTVcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChsZW4gPT09IDcgfHwgbGVuID09PSA5KSB7XG4gICAgICByZXQgPSB7XG4gICAgICAgIHI6IG1hcCQxW3N0clsxXV0gPDwgNCB8IG1hcCQxW3N0clsyXV0sXG4gICAgICAgIGc6IG1hcCQxW3N0clszXV0gPDwgNCB8IG1hcCQxW3N0cls0XV0sXG4gICAgICAgIGI6IG1hcCQxW3N0cls1XV0gPDwgNCB8IG1hcCQxW3N0cls2XV0sXG4gICAgICAgIGE6IGxlbiA9PT0gOSA/IChtYXAkMVtzdHJbN11dIDw8IDQgfCBtYXAkMVtzdHJbOF1dKSA6IDI1NVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmNvbnN0IGFscGhhID0gKGEsIGYpID0+IGEgPCAyNTUgPyBmKGEpIDogJyc7XG5mdW5jdGlvbiBoZXhTdHJpbmcodikge1xuICB2YXIgZiA9IGlzU2hvcnQodikgPyBoMSA6IGgyO1xuICByZXR1cm4gdlxuICAgID8gJyMnICsgZih2LnIpICsgZih2LmcpICsgZih2LmIpICsgYWxwaGEodi5hLCBmKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBIVUVfUkUgPSAvXihoc2xhP3xod2J8aHN2KVxcKFxccyooWy0rLmVcXGRdKykoPzpkZWcpP1tcXHMsXSsoWy0rLmVcXGRdKyklW1xccyxdKyhbLSsuZVxcZF0rKSUoPzpbXFxzLF0rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gaHNsMnJnYm4oaCwgcywgbCkge1xuICBjb25zdCBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcbiAgY29uc3QgZiA9IChuLCBrID0gKG4gKyBoIC8gMzApICUgMTIpID0+IGwgLSBhICogTWF0aC5tYXgoTWF0aC5taW4oayAtIDMsIDkgLSBrLCAxKSwgLTEpO1xuICByZXR1cm4gW2YoMCksIGYoOCksIGYoNCldO1xufVxuZnVuY3Rpb24gaHN2MnJnYm4oaCwgcywgdikge1xuICBjb25zdCBmID0gKG4sIGsgPSAobiArIGggLyA2MCkgJSA2KSA9PiB2IC0gdiAqIHMgKiBNYXRoLm1heChNYXRoLm1pbihrLCA0IC0gaywgMSksIDApO1xuICByZXR1cm4gW2YoNSksIGYoMyksIGYoMSldO1xufVxuZnVuY3Rpb24gaHdiMnJnYm4oaCwgdywgYikge1xuICBjb25zdCByZ2IgPSBoc2wycmdibihoLCAxLCAwLjUpO1xuICBsZXQgaTtcbiAgaWYgKHcgKyBiID4gMSkge1xuICAgIGkgPSAxIC8gKHcgKyBiKTtcbiAgICB3ICo9IGk7XG4gICAgYiAqPSBpO1xuICB9XG4gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICByZ2JbaV0gKj0gMSAtIHcgLSBiO1xuICAgIHJnYltpXSArPSB3O1xuICB9XG4gIHJldHVybiByZ2I7XG59XG5mdW5jdGlvbiBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpIHtcbiAgaWYgKHIgPT09IG1heCkge1xuICAgIHJldHVybiAoKGcgLSBiKSAvIGQpICsgKGcgPCBiID8gNiA6IDApO1xuICB9XG4gIGlmIChnID09PSBtYXgpIHtcbiAgICByZXR1cm4gKGIgLSByKSAvIGQgKyAyO1xuICB9XG4gIHJldHVybiAociAtIGcpIC8gZCArIDQ7XG59XG5mdW5jdGlvbiByZ2IyaHNsKHYpIHtcbiAgY29uc3QgcmFuZ2UgPSAyNTU7XG4gIGNvbnN0IHIgPSB2LnIgLyByYW5nZTtcbiAgY29uc3QgZyA9IHYuZyAvIHJhbmdlO1xuICBjb25zdCBiID0gdi5iIC8gcmFuZ2U7XG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgY29uc3QgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgbGV0IGgsIHMsIGQ7XG4gIGlmIChtYXggIT09IG1pbikge1xuICAgIGQgPSBtYXggLSBtaW47XG4gICAgcyA9IGwgPiAwLjUgPyBkIC8gKDIgLSBtYXggLSBtaW4pIDogZCAvIChtYXggKyBtaW4pO1xuICAgIGggPSBodWVWYWx1ZShyLCBnLCBiLCBkLCBtYXgpO1xuICAgIGggPSBoICogNjAgKyAwLjU7XG4gIH1cbiAgcmV0dXJuIFtoIHwgMCwgcyB8fCAwLCBsXTtcbn1cbmZ1bmN0aW9uIGNhbGxuKGYsIGEsIGIsIGMpIHtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KGEpXG4gICAgICA/IGYoYVswXSwgYVsxXSwgYVsyXSlcbiAgICAgIDogZihhLCBiLCBjKVxuICApLm1hcChuMmIpO1xufVxuZnVuY3Rpb24gaHNsMnJnYihoLCBzLCBsKSB7XG4gIHJldHVybiBjYWxsbihoc2wycmdibiwgaCwgcywgbCk7XG59XG5mdW5jdGlvbiBod2IycmdiKGgsIHcsIGIpIHtcbiAgcmV0dXJuIGNhbGxuKGh3YjJyZ2JuLCBoLCB3LCBiKTtcbn1cbmZ1bmN0aW9uIGhzdjJyZ2IoaCwgcywgdikge1xuICByZXR1cm4gY2FsbG4oaHN2MnJnYm4sIGgsIHMsIHYpO1xufVxuZnVuY3Rpb24gaHVlKGgpIHtcbiAgcmV0dXJuIChoICUgMzYwICsgMzYwKSAlIDM2MDtcbn1cbmZ1bmN0aW9uIGh1ZVBhcnNlKHN0cikge1xuICBjb25zdCBtID0gSFVFX1JFLmV4ZWMoc3RyKTtcbiAgbGV0IGEgPSAyNTU7XG4gIGxldCB2O1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1bNV0gIT09IHYpIHtcbiAgICBhID0gbVs2XSA/IHAyYigrbVs1XSkgOiBuMmIoK21bNV0pO1xuICB9XG4gIGNvbnN0IGggPSBodWUoK21bMl0pO1xuICBjb25zdCBwMSA9ICttWzNdIC8gMTAwO1xuICBjb25zdCBwMiA9ICttWzRdIC8gMTAwO1xuICBpZiAobVsxXSA9PT0gJ2h3YicpIHtcbiAgICB2ID0gaHdiMnJnYihoLCBwMSwgcDIpO1xuICB9IGVsc2UgaWYgKG1bMV0gPT09ICdoc3YnKSB7XG4gICAgdiA9IGhzdjJyZ2IoaCwgcDEsIHAyKTtcbiAgfSBlbHNlIHtcbiAgICB2ID0gaHNsMnJnYihoLCBwMSwgcDIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcjogdlswXSxcbiAgICBnOiB2WzFdLFxuICAgIGI6IHZbMl0sXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcm90YXRlKHYsIGRlZykge1xuICB2YXIgaCA9IHJnYjJoc2wodik7XG4gIGhbMF0gPSBodWUoaFswXSArIGRlZyk7XG4gIGggPSBoc2wycmdiKGgpO1xuICB2LnIgPSBoWzBdO1xuICB2LmcgPSBoWzFdO1xuICB2LmIgPSBoWzJdO1xufVxuZnVuY3Rpb24gaHNsU3RyaW5nKHYpIHtcbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGEgPSByZ2IyaHNsKHYpO1xuICBjb25zdCBoID0gYVswXTtcbiAgY29uc3QgcyA9IG4ycChhWzFdKTtcbiAgY29uc3QgbCA9IG4ycChhWzJdKTtcbiAgcmV0dXJuIHYuYSA8IDI1NVxuICAgID8gYGhzbGEoJHtofSwgJHtzfSUsICR7bH0lLCAke2Iybih2LmEpfSlgXG4gICAgOiBgaHNsKCR7aH0sICR7c30lLCAke2x9JSlgO1xufVxuXG5jb25zdCBtYXAgPSB7XG4gIHg6ICdkYXJrJyxcbiAgWjogJ2xpZ2h0JyxcbiAgWTogJ3JlJyxcbiAgWDogJ2JsdScsXG4gIFc6ICdncicsXG4gIFY6ICdtZWRpdW0nLFxuICBVOiAnc2xhdGUnLFxuICBBOiAnZWUnLFxuICBUOiAnb2wnLFxuICBTOiAnb3InLFxuICBCOiAncmEnLFxuICBDOiAnbGF0ZWcnLFxuICBEOiAnaWdodHMnLFxuICBSOiAnaW4nLFxuICBROiAndHVycXVvaXMnLFxuICBFOiAnaGknLFxuICBQOiAncm8nLFxuICBPOiAnYWwnLFxuICBOOiAnbGUnLFxuICBNOiAnZGUnLFxuICBMOiAneWVsbG8nLFxuICBGOiAnZW4nLFxuICBLOiAnY2gnLFxuICBHOiAnYXJrcycsXG4gIEg6ICdlYScsXG4gIEk6ICdpZ2h0ZycsXG4gIEo6ICd3aCdcbn07XG5jb25zdCBuYW1lcyQxID0ge1xuICBPaWNlWGU6ICdmMGY4ZmYnLFxuICBhbnRpcXVld0V0ZTogJ2ZhZWJkNycsXG4gIGFxdWE6ICdmZmZmJyxcbiAgYXF1YW1hclJlOiAnN2ZmZmQ0JyxcbiAgYXp1WTogJ2YwZmZmZicsXG4gIGJlaWdlOiAnZjVmNWRjJyxcbiAgYmlzcXVlOiAnZmZlNGM0JyxcbiAgYmxhY2s6ICcwJyxcbiAgYmxhbktlZE9tb25kOiAnZmZlYmNkJyxcbiAgWGU6ICdmZicsXG4gIFhldmlUZXQ6ICc4YTJiZTInLFxuICBiUHduOiAnYTUyYTJhJyxcbiAgYnVybHl3b29kOiAnZGViODg3JyxcbiAgY2FNdFhlOiAnNWY5ZWEwJyxcbiAgS2FydFl1c2U6ICc3ZmZmMDAnLFxuICBLb2NUYXRlOiAnZDI2OTFlJyxcbiAgY1NPOiAnZmY3ZjUwJyxcbiAgY1NuZmxvd2VyWGU6ICc2NDk1ZWQnLFxuICBjU25zaWxrOiAnZmZmOGRjJyxcbiAgY3JpbXNvbjogJ2RjMTQzYycsXG4gIGN5YW46ICdmZmZmJyxcbiAgeFhlOiAnOGInLFxuICB4Y3lhbjogJzhiOGInLFxuICB4Z1RNblBkOiAnYjg4NjBiJyxcbiAgeFdheTogJ2E5YTlhOScsXG4gIHhnWUY6ICc2NDAwJyxcbiAgeGdZeTogJ2E5YTlhOScsXG4gIHhraGFraTogJ2JkYjc2YicsXG4gIHhtYWdGdGE6ICc4YjAwOGInLFxuICB4VGl2ZWdZRjogJzU1NmIyZicsXG4gIHhTYW5nZTogJ2ZmOGMwMCcsXG4gIHhTY0VkOiAnOTkzMmNjJyxcbiAgeFlkOiAnOGIwMDAwJyxcbiAgeHNPbW9uOiAnZTk5NjdhJyxcbiAgeHNIZ1lGOiAnOGZiYzhmJyxcbiAgeFVYZTogJzQ4M2Q4YicsXG4gIHhVV2F5OiAnMmY0ZjRmJyxcbiAgeFVnWXk6ICcyZjRmNGYnLFxuICB4UWU6ICdjZWQxJyxcbiAgeHZpVGV0OiAnOTQwMGQzJyxcbiAgZEFwcFJrOiAnZmYxNDkzJyxcbiAgZEFwc2t5WGU6ICdiZmZmJyxcbiAgZGltV2F5OiAnNjk2OTY5JyxcbiAgZGltZ1l5OiAnNjk2OTY5JyxcbiAgZG9kZ2VyWGU6ICcxZTkwZmYnLFxuICBmaVlicmljazogJ2IyMjIyMicsXG4gIGZsU093RXRlOiAnZmZmYWYwJyxcbiAgZm9Zc3RXQW46ICcyMjhiMjInLFxuICBmdUtzaWE6ICdmZjAwZmYnLFxuICBnYVJzYlNvOiAnZGNkY2RjJyxcbiAgZ2hvc3R3RXRlOiAnZjhmOGZmJyxcbiAgZ1RkOiAnZmZkNzAwJyxcbiAgZ1RNblBkOiAnZGFhNTIwJyxcbiAgV2F5OiAnODA4MDgwJyxcbiAgZ1lGOiAnODAwMCcsXG4gIGdZRkx3OiAnYWRmZjJmJyxcbiAgZ1l5OiAnODA4MDgwJyxcbiAgaG9uZXlNdzogJ2YwZmZmMCcsXG4gIGhvdHBSazogJ2ZmNjliNCcsXG4gIFJkaWFuWWQ6ICdjZDVjNWMnLFxuICBSZGlnbzogJzRiMDA4MicsXG4gIGl2U3k6ICdmZmZmZjAnLFxuICBraGFraTogJ2YwZTY4YycsXG4gIGxhdkZNcjogJ2U2ZTZmYScsXG4gIGxhdkZNclhzaDogJ2ZmZjBmNScsXG4gIGxhd25nWUY6ICc3Y2ZjMDAnLFxuICBObW9uY0VmZm9uOiAnZmZmYWNkJyxcbiAgWlhlOiAnYWRkOGU2JyxcbiAgWmNTTzogJ2YwODA4MCcsXG4gIFpjeWFuOiAnZTBmZmZmJyxcbiAgWmdUTW5QZEx3OiAnZmFmYWQyJyxcbiAgWldheTogJ2QzZDNkMycsXG4gIFpnWUY6ICc5MGVlOTAnLFxuICBaZ1l5OiAnZDNkM2QzJyxcbiAgWnBSazogJ2ZmYjZjMScsXG4gIFpzT21vbjogJ2ZmYTA3YScsXG4gIFpzSGdZRjogJzIwYjJhYScsXG4gIFpza3lYZTogJzg3Y2VmYScsXG4gIFpVV2F5OiAnNzc4ODk5JyxcbiAgWlVnWXk6ICc3Nzg4OTknLFxuICBac3RBbFhlOiAnYjBjNGRlJyxcbiAgWkx3OiAnZmZmZmUwJyxcbiAgbGltZTogJ2ZmMDAnLFxuICBsaW1lZ1lGOiAnMzJjZDMyJyxcbiAgbFJGOiAnZmFmMGU2JyxcbiAgbWFnRnRhOiAnZmYwMGZmJyxcbiAgbWFQb246ICc4MDAwMDAnLFxuICBWYXF1YW1hclJlOiAnNjZjZGFhJyxcbiAgVlhlOiAnY2QnLFxuICBWU2NFZDogJ2JhNTVkMycsXG4gIFZwdXJwTjogJzkzNzBkYicsXG4gIFZzSGdZRjogJzNjYjM3MScsXG4gIFZVWGU6ICc3YjY4ZWUnLFxuICBWc3ByUmdnWUY6ICdmYTlhJyxcbiAgVlFlOiAnNDhkMWNjJyxcbiAgVnZpVGV0WWQ6ICdjNzE1ODUnLFxuICBtaWRuaWdodFhlOiAnMTkxOTcwJyxcbiAgbVJ0Y1lhbTogJ2Y1ZmZmYScsXG4gIG1pc3R5UHNlOiAnZmZlNGUxJyxcbiAgbW9jY2FzUjogJ2ZmZTRiNScsXG4gIG5hdmFqb3dFdGU6ICdmZmRlYWQnLFxuICBuYXZ5OiAnODAnLFxuICBUZGxhY2U6ICdmZGY1ZTYnLFxuICBUaXZlOiAnODA4MDAwJyxcbiAgVGl2ZWRCYjogJzZiOGUyMycsXG4gIFNhbmdlOiAnZmZhNTAwJyxcbiAgU2FuZ2VZZDogJ2ZmNDUwMCcsXG4gIFNjRWQ6ICdkYTcwZDYnLFxuICBwT2VnVE1uUGQ6ICdlZWU4YWEnLFxuICBwT2VnWUY6ICc5OGZiOTgnLFxuICBwT2VRZTogJ2FmZWVlZScsXG4gIHBPZXZpVGV0WWQ6ICdkYjcwOTMnLFxuICBwYXBheWF3RXA6ICdmZmVmZDUnLFxuICBwSEtwdWZmOiAnZmZkYWI5JyxcbiAgcGVydTogJ2NkODUzZicsXG4gIHBSazogJ2ZmYzBjYicsXG4gIHBsdW06ICdkZGEwZGQnLFxuICBwb3dNclhlOiAnYjBlMGU2JyxcbiAgcHVycE46ICc4MDAwODAnLFxuICBZYmVjY2FwdXJwTjogJzY2MzM5OScsXG4gIFlkOiAnZmYwMDAwJyxcbiAgUHN5YnJvd246ICdiYzhmOGYnLFxuICBQeU9YZTogJzQxNjllMScsXG4gIHNhZGROYlB3bjogJzhiNDUxMycsXG4gIHNPbW9uOiAnZmE4MDcyJyxcbiAgc2FuZHliUHduOiAnZjRhNDYwJyxcbiAgc0hnWUY6ICcyZThiNTcnLFxuICBzSHNoZWxsOiAnZmZmNWVlJyxcbiAgc2lGbmE6ICdhMDUyMmQnLFxuICBzaWx2ZXI6ICdjMGMwYzAnLFxuICBza3lYZTogJzg3Y2VlYicsXG4gIFVYZTogJzZhNWFjZCcsXG4gIFVXYXk6ICc3MDgwOTAnLFxuICBVZ1l5OiAnNzA4MDkwJyxcbiAgc25vdzogJ2ZmZmFmYScsXG4gIHNwclJnZ1lGOiAnZmY3ZicsXG4gIHN0QWxYZTogJzQ2ODJiNCcsXG4gIHRhbjogJ2QyYjQ4YycsXG4gIHRlTzogJzgwODAnLFxuICB0RXN0TjogJ2Q4YmZkOCcsXG4gIHRvbWF0bzogJ2ZmNjM0NycsXG4gIFFlOiAnNDBlMGQwJyxcbiAgdmlUZXQ6ICdlZTgyZWUnLFxuICBKSHQ6ICdmNWRlYjMnLFxuICB3RXRlOiAnZmZmZmZmJyxcbiAgd0V0ZXNtb2tlOiAnZjVmNWY1JyxcbiAgTHc6ICdmZmZmMDAnLFxuICBMd2dZRjogJzlhY2QzMidcbn07XG5mdW5jdGlvbiB1bnBhY2soKSB7XG4gIGNvbnN0IHVucGFja2VkID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhuYW1lcyQxKTtcbiAgY29uc3QgdGtleXMgPSBPYmplY3Qua2V5cyhtYXApO1xuICBsZXQgaSwgaiwgaywgb2ssIG5rO1xuICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIG9rID0gbmsgPSBrZXlzW2ldO1xuICAgIGZvciAoaiA9IDA7IGogPCB0a2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgayA9IHRrZXlzW2pdO1xuICAgICAgbmsgPSBuay5yZXBsYWNlKGssIG1hcFtrXSk7XG4gICAgfVxuICAgIGsgPSBwYXJzZUludChuYW1lcyQxW29rXSwgMTYpO1xuICAgIHVucGFja2VkW25rXSA9IFtrID4+IDE2ICYgMHhGRiwgayA+PiA4ICYgMHhGRiwgayAmIDB4RkZdO1xuICB9XG4gIHJldHVybiB1bnBhY2tlZDtcbn1cblxubGV0IG5hbWVzO1xuZnVuY3Rpb24gbmFtZVBhcnNlKHN0cikge1xuICBpZiAoIW5hbWVzKSB7XG4gICAgbmFtZXMgPSB1bnBhY2soKTtcbiAgICBuYW1lcy50cmFuc3BhcmVudCA9IFswLCAwLCAwLCAwXTtcbiAgfVxuICBjb25zdCBhID0gbmFtZXNbc3RyLnRvTG93ZXJDYXNlKCldO1xuICByZXR1cm4gYSAmJiB7XG4gICAgcjogYVswXSxcbiAgICBnOiBhWzFdLFxuICAgIGI6IGFbMl0sXG4gICAgYTogYS5sZW5ndGggPT09IDQgPyBhWzNdIDogMjU1XG4gIH07XG59XG5cbmNvbnN0IFJHQl9SRSA9IC9ecmdiYT9cXChcXHMqKFstKy5cXGRdKykoJSk/W1xccyxdKyhbLSsuZVxcZF0rKSglKT9bXFxzLF0rKFstKy5lXFxkXSspKCUpPyg/OltcXHMsL10rKFstKy5lXFxkXSspKCUpPyk/XFxzKlxcKSQvO1xuZnVuY3Rpb24gcmdiUGFyc2Uoc3RyKSB7XG4gIGNvbnN0IG0gPSBSR0JfUkUuZXhlYyhzdHIpO1xuICBsZXQgYSA9IDI1NTtcbiAgbGV0IHIsIGcsIGI7XG4gIGlmICghbSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobVs3XSAhPT0gcikge1xuICAgIGNvbnN0IHYgPSArbVs3XTtcbiAgICBhID0gbVs4XSA/IHAyYih2KSA6IGxpbSh2ICogMjU1LCAwLCAyNTUpO1xuICB9XG4gIHIgPSArbVsxXTtcbiAgZyA9ICttWzNdO1xuICBiID0gK21bNV07XG4gIHIgPSAyNTUgJiAobVsyXSA/IHAyYihyKSA6IGxpbShyLCAwLCAyNTUpKTtcbiAgZyA9IDI1NSAmIChtWzRdID8gcDJiKGcpIDogbGltKGcsIDAsIDI1NSkpO1xuICBiID0gMjU1ICYgKG1bNl0gPyBwMmIoYikgOiBsaW0oYiwgMCwgMjU1KSk7XG4gIHJldHVybiB7XG4gICAgcjogcixcbiAgICBnOiBnLFxuICAgIGI6IGIsXG4gICAgYTogYVxuICB9O1xufVxuZnVuY3Rpb24gcmdiU3RyaW5nKHYpIHtcbiAgcmV0dXJuIHYgJiYgKFxuICAgIHYuYSA8IDI1NVxuICAgICAgPyBgcmdiYSgke3Yucn0sICR7di5nfSwgJHt2LmJ9LCAke2Iybih2LmEpfSlgXG4gICAgICA6IGByZ2IoJHt2LnJ9LCAke3YuZ30sICR7di5ifSlgXG4gICk7XG59XG5cbmNvbnN0IHRvID0gdiA9PiB2IDw9IDAuMDAzMTMwOCA/IHYgKiAxMi45MiA6IE1hdGgucG93KHYsIDEuMCAvIDIuNCkgKiAxLjA1NSAtIDAuMDU1O1xuY29uc3QgZnJvbSA9IHYgPT4gdiA8PSAwLjA0MDQ1ID8gdiAvIDEyLjkyIDogTWF0aC5wb3coKHYgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbmZ1bmN0aW9uIGludGVycG9sYXRlKHJnYjEsIHJnYjIsIHQpIHtcbiAgY29uc3QgciA9IGZyb20oYjJuKHJnYjEucikpO1xuICBjb25zdCBnID0gZnJvbShiMm4ocmdiMS5nKSk7XG4gIGNvbnN0IGIgPSBmcm9tKGIybihyZ2IxLmIpKTtcbiAgcmV0dXJuIHtcbiAgICByOiBuMmIodG8ociArIHQgKiAoZnJvbShiMm4ocmdiMi5yKSkgLSByKSkpLFxuICAgIGc6IG4yYih0byhnICsgdCAqIChmcm9tKGIybihyZ2IyLmcpKSAtIGcpKSksXG4gICAgYjogbjJiKHRvKGIgKyB0ICogKGZyb20oYjJuKHJnYjIuYikpIC0gYikpKSxcbiAgICBhOiByZ2IxLmEgKyB0ICogKHJnYjIuYSAtIHJnYjEuYSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW9kSFNMKHYsIGksIHJhdGlvKSB7XG4gIGlmICh2KSB7XG4gICAgbGV0IHRtcCA9IHJnYjJoc2wodik7XG4gICAgdG1wW2ldID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG1wW2ldICsgdG1wW2ldICogcmF0aW8sIGkgPT09IDAgPyAzNjAgOiAxKSk7XG4gICAgdG1wID0gaHNsMnJnYih0bXApO1xuICAgIHYuciA9IHRtcFswXTtcbiAgICB2LmcgPSB0bXBbMV07XG4gICAgdi5iID0gdG1wWzJdO1xuICB9XG59XG5mdW5jdGlvbiBjbG9uZSh2LCBwcm90bykge1xuICByZXR1cm4gdiA/IE9iamVjdC5hc3NpZ24ocHJvdG8gfHwge30sIHYpIDogdjtcbn1cbmZ1bmN0aW9uIGZyb21PYmplY3QoaW5wdXQpIHtcbiAgdmFyIHYgPSB7cjogMCwgZzogMCwgYjogMCwgYTogMjU1fTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA+PSAzKSB7XG4gICAgICB2ID0ge3I6IGlucHV0WzBdLCBnOiBpbnB1dFsxXSwgYjogaW5wdXRbMl0sIGE6IDI1NX07XG4gICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMykge1xuICAgICAgICB2LmEgPSBuMmIoaW5wdXRbM10pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2ID0gY2xvbmUoaW5wdXQsIHtyOiAwLCBnOiAwLCBiOiAwLCBhOiAxfSk7XG4gICAgdi5hID0gbjJiKHYuYSk7XG4gIH1cbiAgcmV0dXJuIHY7XG59XG5mdW5jdGlvbiBmdW5jdGlvblBhcnNlKHN0cikge1xuICBpZiAoc3RyLmNoYXJBdCgwKSA9PT0gJ3InKSB7XG4gICAgcmV0dXJuIHJnYlBhcnNlKHN0cik7XG4gIH1cbiAgcmV0dXJuIGh1ZVBhcnNlKHN0cik7XG59XG5jbGFzcyBDb2xvciB7XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29sb3IpIHtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBpbnB1dDtcbiAgICBsZXQgdjtcbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHYgPSBmcm9tT2JqZWN0KGlucHV0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2ID0gaGV4UGFyc2UoaW5wdXQpIHx8IG5hbWVQYXJzZShpbnB1dCkgfHwgZnVuY3Rpb25QYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHRoaXMuX3JnYiA9IHY7XG4gICAgdGhpcy5fdmFsaWQgPSAhIXY7XG4gIH1cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZDtcbiAgfVxuICBnZXQgcmdiKCkge1xuICAgIHZhciB2ID0gY2xvbmUodGhpcy5fcmdiKTtcbiAgICBpZiAodikge1xuICAgICAgdi5hID0gYjJuKHYuYSk7XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG4gIHNldCByZ2Iob2JqKSB7XG4gICAgdGhpcy5fcmdiID0gZnJvbU9iamVjdChvYmopO1xuICB9XG4gIHJnYlN0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWQgPyByZ2JTdHJpbmcodGhpcy5fcmdiKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBoZXhTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkID8gaGV4U3RyaW5nKHRoaXMuX3JnYikgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaHNsU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl92YWxpZCA/IGhzbFN0cmluZyh0aGlzLl9yZ2IpIDogdW5kZWZpbmVkO1xuICB9XG4gIG1peChjb2xvciwgd2VpZ2h0KSB7XG4gICAgaWYgKGNvbG9yKSB7XG4gICAgICBjb25zdCBjMSA9IHRoaXMucmdiO1xuICAgICAgY29uc3QgYzIgPSBjb2xvci5yZ2I7XG4gICAgICBsZXQgdzI7XG4gICAgICBjb25zdCBwID0gd2VpZ2h0ID09PSB3MiA/IDAuNSA6IHdlaWdodDtcbiAgICAgIGNvbnN0IHcgPSAyICogcCAtIDE7XG4gICAgICBjb25zdCBhID0gYzEuYSAtIGMyLmE7XG4gICAgICBjb25zdCB3MSA9ICgodyAqIGEgPT09IC0xID8gdyA6ICh3ICsgYSkgLyAoMSArIHcgKiBhKSkgKyAxKSAvIDIuMDtcbiAgICAgIHcyID0gMSAtIHcxO1xuICAgICAgYzEuciA9IDB4RkYgJiB3MSAqIGMxLnIgKyB3MiAqIGMyLnIgKyAwLjU7XG4gICAgICBjMS5nID0gMHhGRiAmIHcxICogYzEuZyArIHcyICogYzIuZyArIDAuNTtcbiAgICAgIGMxLmIgPSAweEZGICYgdzEgKiBjMS5iICsgdzIgKiBjMi5iICsgMC41O1xuICAgICAgYzEuYSA9IHAgKiBjMS5hICsgKDEgLSBwKSAqIGMyLmE7XG4gICAgICB0aGlzLnJnYiA9IGMxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBpbnRlcnBvbGF0ZShjb2xvciwgdCkge1xuICAgIGlmIChjb2xvcikge1xuICAgICAgdGhpcy5fcmdiID0gaW50ZXJwb2xhdGUodGhpcy5fcmdiLCBjb2xvci5fcmdiLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBDb2xvcih0aGlzLnJnYik7XG4gIH1cbiAgYWxwaGEoYSkge1xuICAgIHRoaXMuX3JnYi5hID0gbjJiKGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGNsZWFyZXIocmF0aW8pIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgcmdiLmEgKj0gMSAtIHJhdGlvO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyZXlzY2FsZSgpIHtcbiAgICBjb25zdCByZ2IgPSB0aGlzLl9yZ2I7XG4gICAgY29uc3QgdmFsID0gcm91bmQocmdiLnIgKiAwLjMgKyByZ2IuZyAqIDAuNTkgKyByZ2IuYiAqIDAuMTEpO1xuICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IHZhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBvcGFxdWVyKHJhdGlvKSB7XG4gICAgY29uc3QgcmdiID0gdGhpcy5fcmdiO1xuICAgIHJnYi5hICo9IDEgKyByYXRpbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBuZWdhdGUoKSB7XG4gICAgY29uc3QgdiA9IHRoaXMuX3JnYjtcbiAgICB2LnIgPSAyNTUgLSB2LnI7XG4gICAgdi5nID0gMjU1IC0gdi5nO1xuICAgIHYuYiA9IDI1NSAtIHYuYjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBsaWdodGVuKHJhdGlvKSB7XG4gICAgbW9kSFNMKHRoaXMuX3JnYiwgMiwgcmF0aW8pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGRhcmtlbihyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDIsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgc2F0dXJhdGUocmF0aW8pIHtcbiAgICBtb2RIU0wodGhpcy5fcmdiLCAxLCByYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZGVzYXR1cmF0ZShyYXRpbykge1xuICAgIG1vZEhTTCh0aGlzLl9yZ2IsIDEsIC1yYXRpbyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgcm90YXRlKGRlZykge1xuICAgIHJvdGF0ZSh0aGlzLl9yZ2IsIGRlZyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhfZXNtKGlucHV0KSB7XG4gIHJldHVybiBuZXcgQ29sb3IoaW5wdXQpO1xufVxuXG5leHBvcnQgeyBDb2xvciwgYjJuLCBiMnAsIGluZGV4X2VzbSBhcyBkZWZhdWx0LCBoZXhQYXJzZSwgaGV4U3RyaW5nLCBoc2wycmdiLCBoc2xTdHJpbmcsIGhzdjJyZ2IsIGh1ZVBhcnNlLCBod2IycmdiLCBsaW0sIG4yYiwgbjJwLCBuYW1lUGFyc2UsIHAyYiwgcmdiMmhzbCwgcmdiUGFyc2UsIHJnYlN0cmluZywgcm90YXRlLCByb3VuZCB9O1xuIiwgIi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzXG4gKi9cblxuaW1wb3J0IHR5cGUge0FueU9iamVjdH0gZnJvbSAnLi4vdHlwZXMvYmFzaWMuanMnO1xuaW1wb3J0IHR5cGUge0FjdGl2ZURhdGFQb2ludCwgQ2hhcnRFdmVudH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG4vKipcbiAqIEFuIGVtcHR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCBmb3Igb3B0aW9uYWwgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub29wKCkge1xuICAvKiBub29wICovXG59XG5cbi8qKlxuICogUmV0dXJucyBhIHVuaXF1ZSBpZCwgc2VxdWVudGlhbGx5IGdlbmVyYXRlZCBmcm9tIGEgZ2xvYmFsIHZhcmlhYmxlLlxuICovXG5leHBvcnQgY29uc3QgdWlkID0gKCgpID0+IHtcbiAgbGV0IGlkID0gMDtcbiAgcmV0dXJuICgpID0+IGlkKys7XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIG5laXRoZXIgbnVsbCBub3IgdW5kZWZpbmVkLCBlbHNlIHJldHVybnMgZmFsc2UuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEBzaW5jZSAyLjcuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JVbmRlZih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSAoaW5jbHVkaW5nIHR5cGVkIGFycmF5cyksIGVsc2UgcmV0dXJucyBmYWxzZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5PFQgPSB1bmtub3duPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh0eXBlLnNsaWNlKDAsIDcpID09PSAnW29iamVjdCcgJiYgdHlwZS5zbGljZSgtNikgPT09ICdBcnJheV0nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCAoZXhjbHVkaW5nIG51bGwpLCBlbHNlIHJldHVybnMgZmFsc2UuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEBzaW5jZSAyLjcuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBbnlPYmplY3Qge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLCBlbHNlIHJldHVybnMgZmFsc2VcbiAqIEBwYXJhbSB2YWx1ZSAgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXJGaW5pdGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpICYmIGlzRmluaXRlKCt2YWx1ZSk7XG59XG5leHBvcnQge1xuICBpc051bWJlckZpbml0ZSBhcyBpc0Zpbml0ZSxcbn07XG5cbi8qKlxuICogUmV0dXJucyBgdmFsdWVgIGlmIGZpbml0ZSwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBkZWZpbmVkLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYHZhbHVlYCBpcyBub3QgZmluaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluaXRlT3JEZWZhdWx0KHZhbHVlOiB1bmtub3duLCBkZWZhdWx0VmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gaXNOdW1iZXJGaW5pdGUodmFsdWUpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7XG59XG5cbi8qKlxuICogUmV0dXJucyBgdmFsdWVgIGlmIGRlZmluZWQsIGVsc2UgcmV0dXJucyBgZGVmYXVsdFZhbHVlYC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgZGVmaW5lZC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVPckRlZmF1bHQ8VD4odmFsdWU6IFQgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogVCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xufVxuXG5leHBvcnQgY29uc3QgdG9QZXJjZW50YWdlID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGRpbWVuc2lvbjogbnVtYmVyKSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCclJykgP1xuICAgIHBhcnNlRmxvYXQodmFsdWUpIC8gMTAwXG4gICAgOiArdmFsdWUgLyBkaW1lbnNpb247XG5cbmV4cG9ydCBjb25zdCB0b0RpbWVuc2lvbiA9ICh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBkaW1lbnNpb246IG51bWJlcikgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnJScpID9cbiAgICBwYXJzZUZsb2F0KHZhbHVlKSAvIDEwMCAqIGRpbWVuc2lvblxuICAgIDogK3ZhbHVlO1xuXG4vKipcbiAqIENhbGxzIGBmbmAgd2l0aCB0aGUgZ2l2ZW4gYGFyZ3NgIGluIHRoZSBzY29wZSBkZWZpbmVkIGJ5IGB0aGlzQXJnYCBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIHJldHVybmVkIGJ5IGBmbmAuIElmIGBmbmAgaXMgbm90IGEgZnVuY3Rpb24sIHRoaXMgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgd2l0aCB3aGljaCBgZm5gIHNob3VsZCBiZSBjYWxsZWQuXG4gKiBAcGFyYW0gW3RoaXNBcmddIC0gVGhlIHZhbHVlIG9mIGB0aGlzYCBwcm92aWRlZCBmb3IgdGhlIGNhbGwgdG8gYGZuYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxiYWNrPFQgZXh0ZW5kcyAodGhpczogVEEsIC4uLnJlc3RBcmdzOiB1bmtub3duW10pID0+IFIsIFRBLCBSPihcbiAgZm46IFQgfCB1bmRlZmluZWQsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgdGhpc0FyZz86IFRBXG4pOiBSIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZuICYmIHR5cGVvZiBmbi5jYWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogTm90ZShTQikgZm9yIHBlcmZvcm1hbmNlIHNha2UsIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBsb29wYWJsZSB0eXBlXG4gKiBpcyB1bmtub3duIG9yIGluIG5vbmUgaW50ZW5zaXZlIGNvZGUgKG5vdCBjYWxsZWQgb2Z0ZW4gYW5kIHNtYWxsIGxvb3BhYmxlKS4gRWxzZVxuICogaXQncyBwcmVmZXJhYmxlIHRvIHVzZSBhIHJlZ3VsYXIgZm9yKCkgbG9vcCBhbmQgc2F2ZSBleHRyYSBmdW5jdGlvbiBjYWxscy5cbiAqIEBwYXJhbSBsb29wYWJsZSAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgaXRlcmF0ZWQuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpdGVtLlxuICogQHBhcmFtIFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXG4gKiBAcGFyYW0gW3JldmVyc2VdIC0gSWYgdHJ1ZSwgaXRlcmF0ZXMgYmFja3dhcmQgb24gdGhlIGxvb3BhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWFjaDxULCBUQT4oXG4gIGxvb3BhYmxlOiBSZWNvcmQ8c3RyaW5nLCBUPixcbiAgZm46ICh0aGlzOiBUQSwgdjogVCwgaTogc3RyaW5nKSA9PiB2b2lkLFxuICB0aGlzQXJnPzogVEEsXG4gIHJldmVyc2U/OiBib29sZWFuXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGVhY2g8VCwgVEE+KFxuICBsb29wYWJsZTogVFtdLFxuICBmbjogKHRoaXM6IFRBLCB2OiBULCBpOiBudW1iZXIpID0+IHZvaWQsXG4gIHRoaXNBcmc/OiBUQSxcbiAgcmV2ZXJzZT86IGJvb2xlYW5cbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gZWFjaDxULCBUQT4oXG4gIGxvb3BhYmxlOiBUW10gfCBSZWNvcmQ8c3RyaW5nLCBUPixcbiAgZm46ICh0aGlzOiBUQSwgdjogVCwgaTogYW55KSA9PiB2b2lkLFxuICB0aGlzQXJnPzogVEEsXG4gIHJldmVyc2U/OiBib29sZWFuXG4pIHtcbiAgbGV0IGk6IG51bWJlciwgbGVuOiBudW1iZXIsIGtleXM6IHN0cmluZ1tdO1xuICBpZiAoaXNBcnJheShsb29wYWJsZSkpIHtcbiAgICBsZW4gPSBsb29wYWJsZS5sZW5ndGg7XG4gICAgaWYgKHJldmVyc2UpIHtcbiAgICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGZuLmNhbGwodGhpc0FyZywgbG9vcGFibGVbaV0sIGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgZm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxvb3BhYmxlKSkge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyhsb29wYWJsZSk7XG4gICAgbGVuID0ga2V5cy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2tleXNbaV1dLCBrZXlzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGBhMGAgYW5kIGBhMWAgYXJyYXlzIGhhdmUgdGhlIHNhbWUgY29udGVudCwgZWxzZSByZXR1cm5zIGZhbHNlLlxuICogQHBhcmFtIGEwIC0gVGhlIGFycmF5IHRvIGNvbXBhcmVcbiAqIEBwYXJhbSBhMSAtIFRoZSBhcnJheSB0byBjb21wYXJlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2VsZW1lbnRzRXF1YWwoYTA6IEFjdGl2ZURhdGFQb2ludFtdLCBhMTogQWN0aXZlRGF0YVBvaW50W10pIHtcbiAgbGV0IGk6IG51bWJlciwgaWxlbjogbnVtYmVyLCB2MDogQWN0aXZlRGF0YVBvaW50LCB2MTogQWN0aXZlRGF0YVBvaW50O1xuXG4gIGlmICghYTAgfHwgIWExIHx8IGEwLmxlbmd0aCAhPT0gYTEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChpID0gMCwgaWxlbiA9IGEwLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgIHYwID0gYTBbaV07XG4gICAgdjEgPSBhMVtpXTtcblxuICAgIGlmICh2MC5kYXRhc2V0SW5kZXggIT09IHYxLmRhdGFzZXRJbmRleCB8fCB2MC5pbmRleCAhPT0gdjEuaW5kZXgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgIHdpdGhvdXQga2VlcGluZyByZWZlcmVuY2VzIG9uIG9iamVjdHMgYW5kIGFycmF5cy5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZTxUPihzb3VyY2U6IFQpOiBUIHtcbiAgaWYgKGlzQXJyYXkoc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2UubWFwKGNsb25lKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gICAgY29uc3Qga2xlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrID0gMDtcblxuICAgIGZvciAoOyBrIDwga2xlbjsgKytrKSB7XG4gICAgICB0YXJnZXRba2V5c1trXV0gPSBjbG9uZShzb3VyY2Vba2V5c1trXV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICByZXR1cm4gc291cmNlO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleTogc3RyaW5nKSB7XG4gIHJldHVybiBbJ19fcHJvdG9fXycsICdwcm90b3R5cGUnLCAnY29uc3RydWN0b3InXS5pbmRleE9mKGtleSkgPT09IC0xO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IG1lcmdlciB3aGVuIENoYXJ0LmhlbHBlcnMubWVyZ2UgaXMgY2FsbGVkIHdpdGhvdXQgbWVyZ2VyIG9wdGlvbi5cbiAqIE5vdGUoU0IpOiBhbHNvIHVzZWQgYnkgbWVyZ2VDb25maWcgYW5kIG1lcmdlU2NhbGVDb25maWcgYXMgZmFsbGJhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX21lcmdlcihrZXk6IHN0cmluZywgdGFyZ2V0OiBBbnlPYmplY3QsIHNvdXJjZTogQW55T2JqZWN0LCBvcHRpb25zOiBBbnlPYmplY3QpIHtcbiAgaWYgKCFpc1ZhbGlkS2V5KGtleSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0dmFsID0gdGFyZ2V0W2tleV07XG4gIGNvbnN0IHN2YWwgPSBzb3VyY2Vba2V5XTtcblxuICBpZiAoaXNPYmplY3QodHZhbCkgJiYgaXNPYmplY3Qoc3ZhbCkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgbWVyZ2UodHZhbCwgc3ZhbCwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0W2tleV0gPSBjbG9uZShzdmFsKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlT3B0aW9ucyB7XG4gIG1lcmdlcj86IChrZXk6IHN0cmluZywgdGFyZ2V0OiBBbnlPYmplY3QsIHNvdXJjZTogQW55T2JqZWN0LCBvcHRpb25zPzogQW55T2JqZWN0KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG4gKiBJTVBPUlRBTlQ6IGB0YXJnZXRgIGlzIG5vdCBjbG9uZWQgYW5kIHdpbGwgYmUgdXBkYXRlZCB3aXRoIGBzb3VyY2VgIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgaW4gd2hpY2ggYWxsIHNvdXJjZXMgYXJlIG1lcmdlZCBpbnRvLlxuICogQHBhcmFtIHNvdXJjZSAtIE9iamVjdChzKSB0byBtZXJnZSBpbnRvIGB0YXJnZXRgLlxuICogQHBhcmFtIFtvcHRpb25zXSAtIE1lcmdpbmcgb3B0aW9uczpcbiAqIEBwYXJhbSBbb3B0aW9ucy5tZXJnZXJdIC0gVGhlIG1lcmdlIG1ldGhvZCAoa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcbiAqIEByZXR1cm5zIFRoZSBgdGFyZ2V0YCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUPih0YXJnZXQ6IFQsIHNvdXJjZTogW10sIG9wdGlvbnM/OiBNZXJnZU9wdGlvbnMpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPFQsIFMxPih0YXJnZXQ6IFQsIHNvdXJjZTogUzEsIG9wdGlvbnM/OiBNZXJnZU9wdGlvbnMpOiBUICYgUzE7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8VCwgUzE+KHRhcmdldDogVCwgc291cmNlOiBbUzFdLCBvcHRpb25zPzogTWVyZ2VPcHRpb25zKTogVCAmIFMxO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPFQsIFMxLCBTMj4odGFyZ2V0OiBULCBzb3VyY2U6IFtTMSwgUzJdLCBvcHRpb25zPzogTWVyZ2VPcHRpb25zKTogVCAmIFMxICYgUzI7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8VCwgUzEsIFMyLCBTMz4odGFyZ2V0OiBULCBzb3VyY2U6IFtTMSwgUzIsIFMzXSwgb3B0aW9ucz86IE1lcmdlT3B0aW9ucyk6IFQgJiBTMSAmIFMyICYgUzM7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2U8VCwgUzEsIFMyLCBTMywgUzQ+KFxuICB0YXJnZXQ6IFQsXG4gIHNvdXJjZTogW1MxLCBTMiwgUzMsIFM0XSxcbiAgb3B0aW9ucz86IE1lcmdlT3B0aW9uc1xuKTogVCAmIFMxICYgUzIgJiBTMyAmIFM0O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlPFQ+KHRhcmdldDogVCwgc291cmNlOiBBbnlPYmplY3RbXSwgb3B0aW9ucz86IE1lcmdlT3B0aW9ucyk6IEFueU9iamVjdDtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTxUPih0YXJnZXQ6IFQsIHNvdXJjZTogQW55T2JqZWN0W10sIG9wdGlvbnM/OiBNZXJnZU9wdGlvbnMpOiBBbnlPYmplY3Qge1xuICBjb25zdCBzb3VyY2VzID0gaXNBcnJheShzb3VyY2UpID8gc291cmNlIDogW3NvdXJjZV07XG4gIGNvbnN0IGlsZW4gPSBzb3VyY2VzLmxlbmd0aDtcblxuICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0IGFzIEFueU9iamVjdDtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBtZXJnZXIgPSBvcHRpb25zLm1lcmdlciB8fCBfbWVyZ2VyO1xuICBsZXQgY3VycmVudDogQW55T2JqZWN0O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY3VycmVudCA9IHNvdXJjZXNbaV07XG4gICAgaWYgKCFpc09iamVjdChjdXJyZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGN1cnJlbnQpO1xuICAgIGZvciAobGV0IGsgPSAwLCBrbGVuID0ga2V5cy5sZW5ndGg7IGsgPCBrbGVuOyArK2spIHtcbiAgICAgIG1lcmdlcihrZXlzW2tdLCB0YXJnZXQsIGN1cnJlbnQsIG9wdGlvbnMgYXMgQW55T2JqZWN0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCAqb25seSogaWYgbm90IGRlZmluZWQgaW4gdGFyZ2V0LlxuICogSU1QT1JUQU5UOiBgdGFyZ2V0YCBpcyBub3QgY2xvbmVkIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCBgc291cmNlYCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IGluIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSBtZXJnZWQgaW50by5cbiAqIEBwYXJhbSBzb3VyY2UgLSBPYmplY3QocykgdG8gbWVyZ2UgaW50byBgdGFyZ2V0YC5cbiAqIEByZXR1cm5zIFRoZSBgdGFyZ2V0YCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUlmPFQ+KHRhcmdldDogVCwgc291cmNlOiBbXSk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJZjxULCBTMT4odGFyZ2V0OiBULCBzb3VyY2U6IFMxKTogVCAmIFMxO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VCwgUzE+KHRhcmdldDogVCwgc291cmNlOiBbUzFdKTogVCAmIFMxO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VCwgUzEsIFMyPih0YXJnZXQ6IFQsIHNvdXJjZTogW1MxLCBTMl0pOiBUICYgUzEgJiBTMjtcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUlmPFQsIFMxLCBTMiwgUzM+KHRhcmdldDogVCwgc291cmNlOiBbUzEsIFMyLCBTM10pOiBUICYgUzEgJiBTMiAmIFMzO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VCwgUzEsIFMyLCBTMywgUzQ+KHRhcmdldDogVCwgc291cmNlOiBbUzEsIFMyLCBTMywgUzRdKTogVCAmIFMxICYgUzIgJiBTMyAmIFM0O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VD4odGFyZ2V0OiBULCBzb3VyY2U6IEFueU9iamVjdFtdKTogQW55T2JqZWN0O1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSWY8VD4odGFyZ2V0OiBULCBzb3VyY2U6IEFueU9iamVjdFtdKTogQW55T2JqZWN0IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZVxuICByZXR1cm4gbWVyZ2U8VD4odGFyZ2V0LCBzb3VyY2UsIHttZXJnZXI6IF9tZXJnZXJJZn0pO1xufVxuXG4vKipcbiAqIE1lcmdlcyBzb3VyY2Vba2V5XSBpbiB0YXJnZXRba2V5XSBvbmx5IGlmIHRhcmdldFtrZXldIGlzIHVuZGVmaW5lZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbWVyZ2VySWYoa2V5OiBzdHJpbmcsIHRhcmdldDogQW55T2JqZWN0LCBzb3VyY2U6IEFueU9iamVjdCkge1xuICBpZiAoIWlzVmFsaWRLZXkoa2V5KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHR2YWwgPSB0YXJnZXRba2V5XTtcbiAgY29uc3Qgc3ZhbCA9IHNvdXJjZVtrZXldO1xuXG4gIGlmIChpc09iamVjdCh0dmFsKSAmJiBpc09iamVjdChzdmFsKSkge1xuICAgIG1lcmdlSWYodHZhbCwgc3ZhbCk7XG4gIH0gZWxzZSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHtcbiAgICB0YXJnZXRba2V5XSA9IGNsb25lKHN2YWwpO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZXByZWNhdGVkKHNjb3BlOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwcmV2aW91czogc3RyaW5nLCBjdXJyZW50OiBzdHJpbmcpIHtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zb2xlLndhcm4oc2NvcGUgKyAnOiBcIicgKyBwcmV2aW91cyArXG4gICAgICAnXCIgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBcIicgKyBjdXJyZW50ICsgJ1wiIGluc3RlYWQnKTtcbiAgfVxufVxuXG4vLyByZXNvbHZlT2JqZWN0S2V5IHJlc29sdmVyIGNhY2hlXG5jb25zdCBrZXlSZXNvbHZlcnMgPSB7XG4gIC8vIENoYXJ0LmhlbHBlcnMuY29yZSByZXNvbHZlT2JqZWN0S2V5IHNob3VsZCByZXNvbHZlIGVtcHR5IGtleSB0byByb290IG9iamVjdFxuICAnJzogdiA9PiB2LFxuICAvLyBkZWZhdWx0IHJlc29sdmVyc1xuICB4OiBvID0+IG8ueCxcbiAgeTogbyA9PiBvLnlcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zcGxpdEtleShrZXk6IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdCgnLicpO1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgdG1wID0gJyc7XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIHRtcCArPSBwYXJ0O1xuICAgIGlmICh0bXAuZW5kc1dpdGgoJ1xcXFwnKSkge1xuICAgICAgdG1wID0gdG1wLnNsaWNlKDAsIC0xKSArICcuJztcbiAgICB9IGVsc2Uge1xuICAgICAga2V5cy5wdXNoKHRtcCk7XG4gICAgICB0bXAgPSAnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9nZXRLZXlSZXNvbHZlcihrZXk6IHN0cmluZykge1xuICBjb25zdCBrZXlzID0gX3NwbGl0S2V5KGtleSk7XG4gIHJldHVybiBvYmogPT4ge1xuICAgIGZvciAoY29uc3QgayBvZiBrZXlzKSB7XG4gICAgICBpZiAoayA9PT0gJycpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6XG4gICAgICAgIC8vIENoYXJ0LmhlbHBlcnMuY29yZSByZXNvbHZlT2JqZWN0S2V5IHNob3VsZCBicmVhayBhdCBlbXB0eSBrZXlcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBvYmogPSBvYmogJiYgb2JqW2tdO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9iamVjdEtleShvYmo6IEFueU9iamVjdCwga2V5OiBzdHJpbmcpOiBBbnlPYmplY3Qge1xuICBjb25zdCByZXNvbHZlciA9IGtleVJlc29sdmVyc1trZXldIHx8IChrZXlSZXNvbHZlcnNba2V5XSA9IF9nZXRLZXlSZXNvbHZlcihrZXkpKTtcbiAgcmV0dXJuIHJlc29sdmVyKG9iaik7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jYXBpdGFsaXplKHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG59XG5cblxuZXhwb3J0IGNvbnN0IGRlZmluZWQgPSAodmFsdWU6IHVua25vd24pID0+IHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG5cbmV4cG9ydCBjb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPT4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzExMjg4NTUvY29tcGFyaW5nLWVjbWE2LXNldHMtZm9yLWVxdWFsaXR5IzMxMTI5Mzg0XG5leHBvcnQgY29uc3Qgc2V0c0VxdWFsID0gPFQ+KGE6IFNldDxUPiwgYjogU2V0PFQ+KSA9PiB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBhKSB7XG4gICAgaWYgKCFiLmhhcyhpdGVtKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZSAtIFRoZSBldmVudFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9pc0NsaWNrRXZlbnQoZTogQ2hhcnRFdmVudCkge1xuICByZXR1cm4gZS50eXBlID09PSAnbW91c2V1cCcgfHwgZS50eXBlID09PSAnY2xpY2snIHx8IGUudHlwZSA9PT0gJ2NvbnRleHRtZW51Jztcbn1cbiIsICJpbXBvcnQgdHlwZSB7UG9pbnR9IGZyb20gJy4uL3R5cGVzL2dlb21ldHJpYy5qcyc7XG5pbXBvcnQge2lzRmluaXRlIGFzIGlzRmluaXRlTnVtYmVyfSBmcm9tICcuL2hlbHBlcnMuY29yZS5qcyc7XG5cbi8qKlxuICogQGFsaWFzIENoYXJ0LmhlbHBlcnMubWF0aFxuICogQG5hbWVzcGFjZVxuICovXG5cbmV4cG9ydCBjb25zdCBQSSA9IE1hdGguUEk7XG5leHBvcnQgY29uc3QgVEFVID0gMiAqIFBJO1xuZXhwb3J0IGNvbnN0IFBJVEFVID0gVEFVICsgUEk7XG5leHBvcnQgY29uc3QgSU5GSU5JVFkgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5leHBvcnQgY29uc3QgUkFEX1BFUl9ERUcgPSBQSSAvIDE4MDtcbmV4cG9ydCBjb25zdCBIQUxGX1BJID0gUEkgLyAyO1xuZXhwb3J0IGNvbnN0IFFVQVJURVJfUEkgPSBQSSAvIDQ7XG5leHBvcnQgY29uc3QgVFdPX1RISVJEU19QSSA9IFBJICogMiAvIDM7XG5cbmV4cG9ydCBjb25zdCBsb2cxMCA9IE1hdGgubG9nMTA7XG5leHBvcnQgY29uc3Qgc2lnbiA9IE1hdGguc2lnbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFsbW9zdEVxdWFscyh4OiBudW1iZXIsIHk6IG51bWJlciwgZXBzaWxvbjogbnVtYmVyKSB7XG4gIHJldHVybiBNYXRoLmFicyh4IC0geSkgPCBlcHNpbG9uO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBuaWNlIG51bWJlciBhbGdvcml0aG0gdXNlZCBpbiBkZXRlcm1pbmluZyB3aGVyZSBheGlzIGxhYmVscyB3aWxsIGdvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuaWNlTnVtKHJhbmdlOiBudW1iZXIpIHtcbiAgY29uc3Qgcm91bmRlZFJhbmdlID0gTWF0aC5yb3VuZChyYW5nZSk7XG4gIHJhbmdlID0gYWxtb3N0RXF1YWxzKHJhbmdlLCByb3VuZGVkUmFuZ2UsIHJhbmdlIC8gMTAwMCkgPyByb3VuZGVkUmFuZ2UgOiByYW5nZTtcbiAgY29uc3QgbmljZVJhbmdlID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IobG9nMTAocmFuZ2UpKSk7XG4gIGNvbnN0IGZyYWN0aW9uID0gcmFuZ2UgLyBuaWNlUmFuZ2U7XG4gIGNvbnN0IG5pY2VGcmFjdGlvbiA9IGZyYWN0aW9uIDw9IDEgPyAxIDogZnJhY3Rpb24gPD0gMiA/IDIgOiBmcmFjdGlvbiA8PSA1ID8gNSA6IDEwO1xuICByZXR1cm4gbmljZUZyYWN0aW9uICogbmljZVJhbmdlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmFjdG9ycyBzb3J0ZWQgZnJvbSAxIHRvIHNxcnQodmFsdWUpXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2ZhY3Rvcml6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc3FydCA9IE1hdGguc3FydCh2YWx1ZSk7XG4gIGxldCBpOiBudW1iZXI7XG5cbiAgZm9yIChpID0gMTsgaSA8IHNxcnQ7IGkrKykge1xuICAgIGlmICh2YWx1ZSAlIGkgPT09IDApIHtcbiAgICAgIHJlc3VsdC5wdXNoKGkpO1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUgLyBpKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNxcnQgPT09IChzcXJ0IHwgMCkpIHsgLy8gaWYgdmFsdWUgaXMgYSBzcXVhcmUgbnVtYmVyXG4gICAgcmVzdWx0LnB1c2goc3FydCk7XG4gIH1cblxuICByZXN1bHQuc29ydCgoYSwgYikgPT4gYSAtIGIpLnBvcCgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIobjogdW5rbm93bik6IG4gaXMgbnVtYmVyIHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4gYXMgc3RyaW5nKSkgJiYgaXNGaW5pdGUobiBhcyBudW1iZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxtb3N0V2hvbGUoeDogbnVtYmVyLCBlcHNpbG9uOiBudW1iZXIpIHtcbiAgY29uc3Qgcm91bmRlZCA9IE1hdGgucm91bmQoeCk7XG4gIHJldHVybiAoKHJvdW5kZWQgLSBlcHNpbG9uKSA8PSB4KSAmJiAoKHJvdW5kZWQgKyBlcHNpbG9uKSA+PSB4KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX3NldE1pbkFuZE1heEJ5S2V5KFxuICBhcnJheTogUmVjb3JkPHN0cmluZywgbnVtYmVyPltdLFxuICB0YXJnZXQ6IHsgbWluOiBudW1iZXIsIG1heDogbnVtYmVyIH0sXG4gIHByb3BlcnR5OiBzdHJpbmdcbikge1xuICBsZXQgaTogbnVtYmVyLCBpbGVuOiBudW1iZXIsIHZhbHVlOiBudW1iZXI7XG5cbiAgZm9yIChpID0gMCwgaWxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgIHZhbHVlID0gYXJyYXlbaV1bcHJvcGVydHldO1xuICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICB0YXJnZXQubWluID0gTWF0aC5taW4odGFyZ2V0Lm1pbiwgdmFsdWUpO1xuICAgICAgdGFyZ2V0Lm1heCA9IE1hdGgubWF4KHRhcmdldC5tYXgsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUmFkaWFucyhkZWdyZWVzOiBudW1iZXIpIHtcbiAgcmV0dXJuIGRlZ3JlZXMgKiAoUEkgLyAxODApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EZWdyZWVzKHJhZGlhbnM6IG51bWJlcikge1xuICByZXR1cm4gcmFkaWFucyAqICgxODAgLyBQSSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gKiBpLmUuIHRoZSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBOdW1iZXIuXG4gKiBAcGFyYW0geCAtIEEgbnVtYmVyLlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZGVjaW1hbFBsYWNlcyh4OiBudW1iZXIpIHtcbiAgaWYgKCFpc0Zpbml0ZU51bWJlcih4KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZSA9IDE7XG4gIGxldCBwID0gMDtcbiAgd2hpbGUgKE1hdGgucm91bmQoeCAqIGUpIC8gZSAhPT0geCkge1xuICAgIGUgKj0gMTA7XG4gICAgcCsrO1xuICB9XG4gIHJldHVybiBwO1xufVxuXG4vLyBHZXRzIHRoZSBhbmdsZSBmcm9tIHZlcnRpY2FsIHVwcmlnaHQgdG8gdGhlIHBvaW50IGFib3V0IGEgY2VudHJlLlxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlRnJvbVBvaW50KFxuICBjZW50cmVQb2ludDogUG9pbnQsXG4gIGFuZ2xlUG9pbnQ6IFBvaW50XG4pIHtcbiAgY29uc3QgZGlzdGFuY2VGcm9tWENlbnRlciA9IGFuZ2xlUG9pbnQueCAtIGNlbnRyZVBvaW50Lng7XG4gIGNvbnN0IGRpc3RhbmNlRnJvbVlDZW50ZXIgPSBhbmdsZVBvaW50LnkgLSBjZW50cmVQb2ludC55O1xuICBjb25zdCByYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIgPSBNYXRoLnNxcnQoZGlzdGFuY2VGcm9tWENlbnRlciAqIGRpc3RhbmNlRnJvbVhDZW50ZXIgKyBkaXN0YW5jZUZyb21ZQ2VudGVyICogZGlzdGFuY2VGcm9tWUNlbnRlcik7XG5cbiAgbGV0IGFuZ2xlID0gTWF0aC5hdGFuMihkaXN0YW5jZUZyb21ZQ2VudGVyLCBkaXN0YW5jZUZyb21YQ2VudGVyKTtcblxuICBpZiAoYW5nbGUgPCAoLTAuNSAqIFBJKSkge1xuICAgIGFuZ2xlICs9IFRBVTsgLy8gbWFrZSBzdXJlIHRoZSByZXR1cm5lZCBhbmdsZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgKC1QSS8yLCAzUEkvMl1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYW5nbGUsXG4gICAgZGlzdGFuY2U6IHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlclxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKHB0MTogUG9pbnQsIHB0MjogUG9pbnQpIHtcbiAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhwdDIueCAtIHB0MS54LCAyKSArIE1hdGgucG93KHB0Mi55IC0gcHQxLnksIDIpKTtcbn1cblxuLyoqXG4gKiBTaG9ydGVzdCBkaXN0YW5jZSBiZXR3ZWVuIGFuZ2xlcywgaW4gZWl0aGVyIGRpcmVjdGlvbi5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYW5nbGVEaWZmKGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gIHJldHVybiAoYSAtIGIgKyBQSVRBVSkgJSBUQVUgLSBQSTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYW5nbGUgdG8gYmUgYmV0d2VlbiAwIGFuZCAyKlBJXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX25vcm1hbGl6ZUFuZ2xlKGE6IG51bWJlcikge1xuICByZXR1cm4gKGEgJSBUQVUgKyBUQVUpICUgVEFVO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYW5nbGVCZXR3ZWVuKGFuZ2xlOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBzYW1lQW5nbGVJc0Z1bGxDaXJjbGU/OiBib29sZWFuKSB7XG4gIGNvbnN0IGEgPSBfbm9ybWFsaXplQW5nbGUoYW5nbGUpO1xuICBjb25zdCBzID0gX25vcm1hbGl6ZUFuZ2xlKHN0YXJ0KTtcbiAgY29uc3QgZSA9IF9ub3JtYWxpemVBbmdsZShlbmQpO1xuICBjb25zdCBhbmdsZVRvU3RhcnQgPSBfbm9ybWFsaXplQW5nbGUocyAtIGEpO1xuICBjb25zdCBhbmdsZVRvRW5kID0gX25vcm1hbGl6ZUFuZ2xlKGUgLSBhKTtcbiAgY29uc3Qgc3RhcnRUb0FuZ2xlID0gX25vcm1hbGl6ZUFuZ2xlKGEgLSBzKTtcbiAgY29uc3QgZW5kVG9BbmdsZSA9IF9ub3JtYWxpemVBbmdsZShhIC0gZSk7XG4gIHJldHVybiBhID09PSBzIHx8IGEgPT09IGUgfHwgKHNhbWVBbmdsZUlzRnVsbENpcmNsZSAmJiBzID09PSBlKVxuICAgIHx8IChhbmdsZVRvU3RhcnQgPiBhbmdsZVRvRW5kICYmIHN0YXJ0VG9BbmdsZSA8IGVuZFRvQW5nbGUpO1xufVxuXG4vKipcbiAqIExpbWl0IGB2YWx1ZWAgYmV0d2VlbiBgbWluYCBhbmQgYG1heGBcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIG1pblxuICogQHBhcmFtIG1heFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9saW1pdFZhbHVlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2ludDE2UmFuZ2UodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gX2xpbWl0VmFsdWUodmFsdWUsIC0zMjc2OCwgMzI3NjcpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHN0YXJ0XG4gKiBAcGFyYW0gZW5kXG4gKiBAcGFyYW0gW2Vwc2lsb25dXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2lzQmV0d2Vlbih2YWx1ZTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZXBzaWxvbiA9IDFlLTYpIHtcbiAgcmV0dXJuIHZhbHVlID49IE1hdGgubWluKHN0YXJ0LCBlbmQpIC0gZXBzaWxvbiAmJiB2YWx1ZSA8PSBNYXRoLm1heChzdGFydCwgZW5kKSArIGVwc2lsb247XG59XG4iLCAiaW1wb3J0IHtfY2FwaXRhbGl6ZX0gZnJvbSAnLi9oZWxwZXJzLmNvcmUuanMnO1xuXG4vKipcbiAqIEJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIHZhbHVlIC0gdmFsdWUgdG8gZmluZFxuICogQHBhcmFtIGNtcFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9sb29rdXAoXG4gIHRhYmxlOiBudW1iZXJbXSxcbiAgdmFsdWU6IG51bWJlcixcbiAgY21wPzogKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW5cbik6IHtsbzogbnVtYmVyLCBoaTogbnVtYmVyfTtcbmV4cG9ydCBmdW5jdGlvbiBfbG9va3VwPFQ+KFxuICB0YWJsZTogVFtdLFxuICB2YWx1ZTogbnVtYmVyLFxuICBjbXA6ICh2YWx1ZTogbnVtYmVyKSA9PiBib29sZWFuXG4pOiB7bG86IG51bWJlciwgaGk6IG51bWJlcn07XG5leHBvcnQgZnVuY3Rpb24gX2xvb2t1cChcbiAgdGFibGU6IHVua25vd25bXSxcbiAgdmFsdWU6IG51bWJlcixcbiAgY21wPzogKHZhbHVlOiBudW1iZXIpID0+IGJvb2xlYW5cbikge1xuICBjbXAgPSBjbXAgfHwgKChpbmRleCkgPT4gdGFibGVbaW5kZXhdIDwgdmFsdWUpO1xuICBsZXQgaGkgPSB0YWJsZS5sZW5ndGggLSAxO1xuICBsZXQgbG8gPSAwO1xuICBsZXQgbWlkOiBudW1iZXI7XG5cbiAgd2hpbGUgKGhpIC0gbG8gPiAxKSB7XG4gICAgbWlkID0gKGxvICsgaGkpID4+IDE7XG4gICAgaWYgKGNtcChtaWQpKSB7XG4gICAgICBsbyA9IG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGkgPSBtaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtsbywgaGl9O1xufVxuXG4vKipcbiAqIEJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIGtleSAtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB2YWx1ZSBpbiBlYWNoIGVudHJ5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byBmaW5kXG4gKiBAcGFyYW0gbGFzdCAtIGxvb2t1cCBsYXN0IGluZGV4XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2xvb2t1cEJ5S2V5ID0gKFxuICB0YWJsZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPltdLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IG51bWJlcixcbiAgbGFzdD86IGJvb2xlYW5cbikgPT5cbiAgX2xvb2t1cCh0YWJsZSwgdmFsdWUsIGxhc3RcbiAgICA/IGluZGV4ID0+IHtcbiAgICAgIGNvbnN0IHRpID0gdGFibGVbaW5kZXhdW2tleV07XG4gICAgICByZXR1cm4gdGkgPCB2YWx1ZSB8fCB0aSA9PT0gdmFsdWUgJiYgdGFibGVbaW5kZXggKyAxXVtrZXldID09PSB2YWx1ZTtcbiAgICB9XG4gICAgOiBpbmRleCA9PiB0YWJsZVtpbmRleF1ba2V5XSA8IHZhbHVlKTtcblxuLyoqXG4gKiBSZXZlcnNlIGJpbmFyeSBzZWFyY2hcbiAqIEBwYXJhbSB0YWJsZSAtIHRoZSB0YWJsZSBzZWFyY2guIG11c3QgYmUgc29ydGVkIVxuICogQHBhcmFtIGtleSAtIHByb3BlcnR5IG5hbWUgZm9yIHRoZSB2YWx1ZSBpbiBlYWNoIGVudHJ5XG4gKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSB0byBmaW5kXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX3Jsb29rdXBCeUtleSA9IChcbiAgdGFibGU6IFJlY29yZDxzdHJpbmcsIG51bWJlcj5bXSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBudW1iZXJcbikgPT5cbiAgX2xvb2t1cCh0YWJsZSwgdmFsdWUsIGluZGV4ID0+IHRhYmxlW2luZGV4XVtrZXldID49IHZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm4gc3Vic2V0IG9mIGB2YWx1ZXNgIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIGluY2x1c2l2ZS5cbiAqIFZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBzb3J0ZWQgb3JkZXIuXG4gKiBAcGFyYW0gdmFsdWVzIC0gc29ydGVkIGFycmF5IG9mIHZhbHVlc1xuICogQHBhcmFtIG1pbiAtIG1pbiB2YWx1ZVxuICogQHBhcmFtIG1heCAtIG1heCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2ZpbHRlckJldHdlZW4odmFsdWVzOiBudW1iZXJbXSwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBlbmQgPSB2YWx1ZXMubGVuZ3RoO1xuXG4gIHdoaWxlIChzdGFydCA8IGVuZCAmJiB2YWx1ZXNbc3RhcnRdIDwgbWluKSB7XG4gICAgc3RhcnQrKztcbiAgfVxuICB3aGlsZSAoZW5kID4gc3RhcnQgJiYgdmFsdWVzW2VuZCAtIDFdID4gbWF4KSB7XG4gICAgZW5kLS07XG4gIH1cblxuICByZXR1cm4gc3RhcnQgPiAwIHx8IGVuZCA8IHZhbHVlcy5sZW5ndGhcbiAgICA/IHZhbHVlcy5zbGljZShzdGFydCwgZW5kKVxuICAgIDogdmFsdWVzO1xufVxuXG5jb25zdCBhcnJheUV2ZW50cyA9IFsncHVzaCcsICdwb3AnLCAnc2hpZnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBBcnJheUxpc3RlbmVyPFQ+IHtcbiAgX29uRGF0YVB1c2g/KC4uLml0ZW06IFRbXSk6IHZvaWQ7XG4gIF9vbkRhdGFQb3A/KCk6IHZvaWQ7XG4gIF9vbkRhdGFTaGlmdD8oKTogdm9pZDtcbiAgX29uRGF0YVNwbGljZT8oaW5kZXg6IG51bWJlciwgZGVsZXRlQ291bnQ6IG51bWJlciwgLi4uaXRlbXM6IFRbXSk6IHZvaWQ7XG4gIF9vbkRhdGFVbnNoaWZ0PyguLi5pdGVtOiBUW10pOiB2b2lkO1xufVxuXG4vKipcbiAqIEhvb2tzIHRoZSBhcnJheSBtZXRob2RzIHRoYXQgYWRkIG9yIHJlbW92ZSB2YWx1ZXMgKCdwdXNoJywgcG9wJywgJ3NoaWZ0JywgJ3NwbGljZScsXG4gKiAndW5zaGlmdCcpIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVyIEFGVEVSIHRoZSBhcnJheSBoYXMgYmVlbiBhbHRlcmVkLiBMaXN0ZW5lcnMgYXJlXG4gKiBjYWxsZWQgb24gdGhlICdfb25EYXRhKicgY2FsbGJhY2tzIChlLmcuIF9vbkRhdGFQdXNoLCBldGMuKSB3aXRoIHNhbWUgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuQXJyYXlFdmVudHM8VD4oYXJyYXk6IFRbXSwgbGlzdGVuZXI6IEFycmF5TGlzdGVuZXI8VD4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbkFycmF5RXZlbnRzKGFycmF5LCBsaXN0ZW5lcikge1xuICBpZiAoYXJyYXkuX2NoYXJ0anMpIHtcbiAgICBhcnJheS5fY2hhcnRqcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFycmF5LCAnX2NoYXJ0anMnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiB7XG4gICAgICBsaXN0ZW5lcnM6IFtsaXN0ZW5lcl1cbiAgICB9XG4gIH0pO1xuXG4gIGFycmF5RXZlbnRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IG1ldGhvZCA9ICdfb25EYXRhJyArIF9jYXBpdGFsaXplKGtleSk7XG4gICAgY29uc3QgYmFzZSA9IGFycmF5W2tleV07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJyYXksIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZSguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGJhc2UuYXBwbHkodGhpcywgYXJncyk7XG5cbiAgICAgICAgYXJyYXkuX2NoYXJ0anMubGlzdGVuZXJzLmZvckVhY2goKG9iamVjdCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9iamVjdFttZXRob2RdKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBnaXZlbiBhcnJheSBldmVudCBsaXN0ZW5lciBhbmQgY2xlYW51cCBleHRyYSBhdHRhY2hlZCBwcm9wZXJ0aWVzIChzdWNoIGFzXG4gKiB0aGUgX2NoYXJ0anMgc3R1YiBhbmQgb3ZlcnJpZGRlbiBtZXRob2RzKSBpZiBhcnJheSBkb2Vzbid0IGhhdmUgYW55IG1vcmUgbGlzdGVuZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5saXN0ZW5BcnJheUV2ZW50czxUPihhcnJheTogVFtdLCBsaXN0ZW5lcjogQXJyYXlMaXN0ZW5lcjxUPik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gdW5saXN0ZW5BcnJheUV2ZW50cyhhcnJheSwgbGlzdGVuZXIpIHtcbiAgY29uc3Qgc3R1YiA9IGFycmF5Ll9jaGFydGpzO1xuICBpZiAoIXN0dWIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBsaXN0ZW5lcnMgPSBzdHViLmxpc3RlbmVycztcbiAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFycmF5RXZlbnRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGRlbGV0ZSBhcnJheVtrZXldO1xuICB9KTtcblxuICBkZWxldGUgYXJyYXkuX2NoYXJ0anM7XG59XG5cbi8qKlxuICogQHBhcmFtIGl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYXJyYXlVbmlxdWU8VD4oaXRlbXM6IFRbXSkge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0PFQ+KCk7XG4gIGxldCBpOiBudW1iZXIsIGlsZW46IG51bWJlcjtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgc2V0LmFkZChpdGVtc1tpXSk7XG4gIH1cblxuICBpZiAoc2V0LnNpemUgPT09IGlsZW4pIHtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShzZXQpO1xufVxuIiwgImltcG9ydCB0eXBlIHtDaGFydE1ldGEsIFBvaW50RWxlbWVudH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG5pbXBvcnQge19saW1pdFZhbHVlfSBmcm9tICcuL2hlbHBlcnMubWF0aC5qcyc7XG5pbXBvcnQge19sb29rdXBCeUtleX0gZnJvbSAnLi9oZWxwZXJzLmNvbGxlY3Rpb24uanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9udFN0cmluZyhwaXhlbFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnRGYW1pbHk6IHN0cmluZykge1xuICByZXR1cm4gZm9udFN0eWxlICsgJyAnICsgcGl4ZWxTaXplICsgJ3B4ICcgKyBmb250RmFtaWx5O1xufVxuXG4vKipcbiogUmVxdWVzdCBhbmltYXRpb24gcG9seWZpbGxcbiovXG5leHBvcnQgY29uc3QgcmVxdWVzdEFuaW1GcmFtZSA9IChmdW5jdGlvbigpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xufSgpKTtcblxuLyoqXG4gKiBUaHJvdHRsZXMgY2FsbGluZyBgZm5gIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuICogTGF0ZXN0IGFyZ3VtZW50cyBhcmUgdXNlZCBvbiB0aGUgYWN0dWFsIGNhbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlZDxUQXJncyBleHRlbmRzIEFycmF5PGFueT4+KFxuICBmbjogKC4uLmFyZ3M6IFRBcmdzKSA9PiB2b2lkLFxuICB0aGlzQXJnOiBhbnksXG4pIHtcbiAgbGV0IGFyZ3NUb1VzZSA9IFtdIGFzIFRBcmdzO1xuICBsZXQgdGlja2luZyA9IGZhbHNlO1xuXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBUQXJncykge1xuICAgIC8vIFNhdmUgdGhlIGFyZ3MgZm9yIHVzZSBsYXRlclxuICAgIGFyZ3NUb1VzZSA9IGFyZ3M7XG4gICAgaWYgKCF0aWNraW5nKSB7XG4gICAgICB0aWNraW5nID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csICgpID0+IHtcbiAgICAgICAgdGlja2luZyA9IGZhbHNlO1xuICAgICAgICBmbi5hcHBseSh0aGlzQXJnLCBhcmdzVG9Vc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIERlYm91bmNlcyBjYWxsaW5nIGBmbmAgZm9yIGBkZWxheWAgbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFRBcmdzIGV4dGVuZHMgQXJyYXk8YW55Pj4oZm46ICguLi5hcmdzOiBUQXJncykgPT4gdm9pZCwgZGVsYXk6IG51bWJlcikge1xuICBsZXQgdGltZW91dDtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IFRBcmdzKSB7XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmbiwgZGVsYXksIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGF5O1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzICdzdGFydCcgdG8gJ2xlZnQnLCAnZW5kJyB0byAncmlnaHQnIGFuZCBvdGhlcnMgdG8gJ2NlbnRlcidcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfdG9MZWZ0UmlnaHRDZW50ZXIgPSAoYWxpZ246ICdzdGFydCcgfCAnZW5kJyB8ICdjZW50ZXInKSA9PiBhbGlnbiA9PT0gJ3N0YXJ0JyA/ICdsZWZ0JyA6IGFsaWduID09PSAnZW5kJyA/ICdyaWdodCcgOiAnY2VudGVyJztcblxuLyoqXG4gKiBSZXR1cm5zIGBzdGFydGAsIGBlbmRgIG9yIGAoc3RhcnQgKyBlbmQpIC8gMmAgZGVwZW5kaW5nIG9uIGBhbGlnbmAuIERlZmF1bHRzIHRvIGBjZW50ZXJgXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2FsaWduU3RhcnRFbmQgPSAoYWxpZ246ICdzdGFydCcgfCAnZW5kJyB8ICdjZW50ZXInLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gYWxpZ24gPT09ICdzdGFydCcgPyBzdGFydCA6IGFsaWduID09PSAnZW5kJyA/IGVuZCA6IChzdGFydCArIGVuZCkgLyAyO1xuXG4vKipcbiAqIFJldHVybnMgYGxlZnRgLCBgcmlnaHRgIG9yIGAobGVmdCArIHJpZ2h0KSAvIDJgIGRlcGVuZGluZyBvbiBgYWxpZ25gLiBEZWZhdWx0cyB0byBgbGVmdGBcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfdGV4dFggPSAoYWxpZ246ICdsZWZ0JyB8ICdyaWdodCcgfCAnY2VudGVyJywgbGVmdDogbnVtYmVyLCByaWdodDogbnVtYmVyLCBydGw6IGJvb2xlYW4pID0+IHtcbiAgY29uc3QgY2hlY2sgPSBydGwgPyAnbGVmdCcgOiAncmlnaHQnO1xuICByZXR1cm4gYWxpZ24gPT09IGNoZWNrID8gcmlnaHQgOiBhbGlnbiA9PT0gJ2NlbnRlcicgPyAobGVmdCArIHJpZ2h0KSAvIDIgOiBsZWZ0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gc3RhcnQgYW5kIGNvdW50IG9mIHZpc2libGUgcG9pbnRzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9nZXRTdGFydEFuZENvdW50T2ZWaXNpYmxlUG9pbnRzKG1ldGE6IENoYXJ0TWV0YTwnbGluZScgfCAnc2NhdHRlcic+LCBwb2ludHM6IFBvaW50RWxlbWVudFtdLCBhbmltYXRpb25zRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgY29uc3QgcG9pbnRDb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGNvdW50ID0gcG9pbnRDb3VudDtcblxuICBpZiAobWV0YS5fc29ydGVkKSB7XG4gICAgY29uc3Qge2lTY2FsZSwgX3BhcnNlZH0gPSBtZXRhO1xuICAgIGNvbnN0IGF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gaVNjYWxlLmdldFVzZXJCb3VuZHMoKTtcblxuICAgIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgICBzdGFydCA9IF9saW1pdFZhbHVlKE1hdGgubWluKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE5lZWQgdG8gdHlwZSBfcGFyc2VkXG4gICAgICAgIF9sb29rdXBCeUtleShfcGFyc2VkLCBpU2NhbGUuYXhpcywgbWluKS5sbyxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIGZpeCB0eXBlcyBvbiBfbG9va3VwQnlLZXlcbiAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkID8gcG9pbnRDb3VudCA6IF9sb29rdXBCeUtleShwb2ludHMsIGF4aXMsIGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKG1pbikpLmxvKSxcbiAgICAgIDAsIHBvaW50Q291bnQgLSAxKTtcbiAgICB9XG4gICAgaWYgKG1heERlZmluZWQpIHtcbiAgICAgIGNvdW50ID0gX2xpbWl0VmFsdWUoTWF0aC5tYXgoXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTmVlZCB0byB0eXBlIF9wYXJzZWRcbiAgICAgICAgX2xvb2t1cEJ5S2V5KF9wYXJzZWQsIGlTY2FsZS5heGlzLCBtYXgsIHRydWUpLmhpICsgMSxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOZWVkIHRvIGZpeCB0eXBlcyBvbiBfbG9va3VwQnlLZXlcbiAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkID8gMCA6IF9sb29rdXBCeUtleShwb2ludHMsIGF4aXMsIGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKG1heCksIHRydWUpLmhpICsgMSksXG4gICAgICBzdGFydCwgcG9pbnRDb3VudCkgLSBzdGFydDtcbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgPSBwb2ludENvdW50IC0gc3RhcnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtzdGFydCwgY291bnR9O1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgc2NhbGUgcmFuZ2VzIGhhdmUgY2hhbmdlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhIC0gZGF0YXNldCBtZXRhLlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX3NjYWxlUmFuZ2VzQ2hhbmdlZChtZXRhKSB7XG4gIGNvbnN0IHt4U2NhbGUsIHlTY2FsZSwgX3NjYWxlUmFuZ2VzfSA9IG1ldGE7XG4gIGNvbnN0IG5ld1JhbmdlcyA9IHtcbiAgICB4bWluOiB4U2NhbGUubWluLFxuICAgIHhtYXg6IHhTY2FsZS5tYXgsXG4gICAgeW1pbjogeVNjYWxlLm1pbixcbiAgICB5bWF4OiB5U2NhbGUubWF4XG4gIH07XG4gIGlmICghX3NjYWxlUmFuZ2VzKSB7XG4gICAgbWV0YS5fc2NhbGVSYW5nZXMgPSBuZXdSYW5nZXM7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgY2hhbmdlZCA9IF9zY2FsZVJhbmdlcy54bWluICE9PSB4U2NhbGUubWluXG5cdFx0fHwgX3NjYWxlUmFuZ2VzLnhtYXggIT09IHhTY2FsZS5tYXhcblx0XHR8fCBfc2NhbGVSYW5nZXMueW1pbiAhPT0geVNjYWxlLm1pblxuXHRcdHx8IF9zY2FsZVJhbmdlcy55bWF4ICE9PSB5U2NhbGUubWF4O1xuXG4gIE9iamVjdC5hc3NpZ24oX3NjYWxlUmFuZ2VzLCBuZXdSYW5nZXMpO1xuICByZXR1cm4gY2hhbmdlZDtcbn1cbiIsICJpbXBvcnQge1BJLCBUQVUsIEhBTEZfUEl9IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcblxuY29uc3QgYXRFZGdlID0gKHQ6IG51bWJlcikgPT4gdCA9PT0gMCB8fCB0ID09PSAxO1xuY29uc3QgZWxhc3RpY0luID0gKHQ6IG51bWJlciwgczogbnVtYmVyLCBwOiBudW1iZXIpID0+IC0oTWF0aC5wb3coMiwgMTAgKiAodCAtPSAxKSkgKiBNYXRoLnNpbigodCAtIHMpICogVEFVIC8gcCkpO1xuY29uc3QgZWxhc3RpY091dCA9ICh0OiBudW1iZXIsIHM6IG51bWJlciwgcDogbnVtYmVyKSA9PiBNYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKCh0IC0gcykgKiBUQVUgLyBwKSArIDE7XG5cbi8qKlxuICogRWFzaW5nIGZ1bmN0aW9ucyBhZGFwdGVkIGZyb20gUm9iZXJ0IFBlbm5lcidzIGVhc2luZyBlcXVhdGlvbnMuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuZWFzaW5nLmVmZmVjdHNcbiAqIEBzZWUgaHR0cDovL3d3dy5yb2JlcnRwZW5uZXIuY29tL2Vhc2luZy9cbiAqL1xuY29uc3QgZWZmZWN0cyA9IHtcbiAgbGluZWFyOiAodDogbnVtYmVyKSA9PiB0LFxuXG4gIGVhc2VJblF1YWQ6ICh0OiBudW1iZXIpID0+IHQgKiB0LFxuXG4gIGVhc2VPdXRRdWFkOiAodDogbnVtYmVyKSA9PiAtdCAqICh0IC0gMiksXG5cbiAgZWFzZUluT3V0UXVhZDogKHQ6IG51bWJlcikgPT4gKCh0IC89IDAuNSkgPCAxKVxuICAgID8gMC41ICogdCAqIHRcbiAgICA6IC0wLjUgKiAoKC0tdCkgKiAodCAtIDIpIC0gMSksXG5cbiAgZWFzZUluQ3ViaWM6ICh0OiBudW1iZXIpID0+IHQgKiB0ICogdCxcblxuICBlYXNlT3V0Q3ViaWM6ICh0OiBudW1iZXIpID0+ICh0IC09IDEpICogdCAqIHQgKyAxLFxuXG4gIGVhc2VJbk91dEN1YmljOiAodDogbnVtYmVyKSA9PiAoKHQgLz0gMC41KSA8IDEpXG4gICAgPyAwLjUgKiB0ICogdCAqIHRcbiAgICA6IDAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICsgMiksXG5cbiAgZWFzZUluUXVhcnQ6ICh0OiBudW1iZXIpID0+IHQgKiB0ICogdCAqIHQsXG5cbiAgZWFzZU91dFF1YXJ0OiAodDogbnVtYmVyKSA9PiAtKCh0IC09IDEpICogdCAqIHQgKiB0IC0gMSksXG5cbiAgZWFzZUluT3V0UXVhcnQ6ICh0OiBudW1iZXIpID0+ICgodCAvPSAwLjUpIDwgMSlcbiAgICA/IDAuNSAqIHQgKiB0ICogdCAqIHRcbiAgICA6IC0wLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgLSAyKSxcblxuICBlYXNlSW5RdWludDogKHQ6IG51bWJlcikgPT4gdCAqIHQgKiB0ICogdCAqIHQsXG5cbiAgZWFzZU91dFF1aW50OiAodDogbnVtYmVyKSA9PiAodCAtPSAxKSAqIHQgKiB0ICogdCAqIHQgKyAxLFxuXG4gIGVhc2VJbk91dFF1aW50OiAodDogbnVtYmVyKSA9PiAoKHQgLz0gMC41KSA8IDEpXG4gICAgPyAwLjUgKiB0ICogdCAqIHQgKiB0ICogdFxuICAgIDogMC41ICogKCh0IC09IDIpICogdCAqIHQgKiB0ICogdCArIDIpLFxuXG4gIGVhc2VJblNpbmU6ICh0OiBudW1iZXIpID0+IC1NYXRoLmNvcyh0ICogSEFMRl9QSSkgKyAxLFxuXG4gIGVhc2VPdXRTaW5lOiAodDogbnVtYmVyKSA9PiBNYXRoLnNpbih0ICogSEFMRl9QSSksXG5cbiAgZWFzZUluT3V0U2luZTogKHQ6IG51bWJlcikgPT4gLTAuNSAqIChNYXRoLmNvcyhQSSAqIHQpIC0gMSksXG5cbiAgZWFzZUluRXhwbzogKHQ6IG51bWJlcikgPT4gKHQgPT09IDApID8gMCA6IE1hdGgucG93KDIsIDEwICogKHQgLSAxKSksXG5cbiAgZWFzZU91dEV4cG86ICh0OiBudW1iZXIpID0+ICh0ID09PSAxKSA/IDEgOiAtTWF0aC5wb3coMiwgLTEwICogdCkgKyAxLFxuXG4gIGVhc2VJbk91dEV4cG86ICh0OiBudW1iZXIpID0+IGF0RWRnZSh0KSA/IHQgOiB0IDwgMC41XG4gICAgPyAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh0ICogMiAtIDEpKVxuICAgIDogMC41ICogKC1NYXRoLnBvdygyLCAtMTAgKiAodCAqIDIgLSAxKSkgKyAyKSxcblxuICBlYXNlSW5DaXJjOiAodDogbnVtYmVyKSA9PiAodCA+PSAxKSA/IHQgOiAtKE1hdGguc3FydCgxIC0gdCAqIHQpIC0gMSksXG5cbiAgZWFzZU91dENpcmM6ICh0OiBudW1iZXIpID0+IE1hdGguc3FydCgxIC0gKHQgLT0gMSkgKiB0KSxcblxuICBlYXNlSW5PdXRDaXJjOiAodDogbnVtYmVyKSA9PiAoKHQgLz0gMC41KSA8IDEpXG4gICAgPyAtMC41ICogKE1hdGguc3FydCgxIC0gdCAqIHQpIC0gMSlcbiAgICA6IDAuNSAqIChNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSxcblxuICBlYXNlSW5FbGFzdGljOiAodDogbnVtYmVyKSA9PiBhdEVkZ2UodCkgPyB0IDogZWxhc3RpY0luKHQsIDAuMDc1LCAwLjMpLFxuXG4gIGVhc2VPdXRFbGFzdGljOiAodDogbnVtYmVyKSA9PiBhdEVkZ2UodCkgPyB0IDogZWxhc3RpY091dCh0LCAwLjA3NSwgMC4zKSxcblxuICBlYXNlSW5PdXRFbGFzdGljKHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHMgPSAwLjExMjU7XG4gICAgY29uc3QgcCA9IDAuNDU7XG4gICAgcmV0dXJuIGF0RWRnZSh0KSA/IHQgOlxuICAgICAgdCA8IDAuNVxuICAgICAgICA/IDAuNSAqIGVsYXN0aWNJbih0ICogMiwgcywgcClcbiAgICAgICAgOiAwLjUgKyAwLjUgKiBlbGFzdGljT3V0KHQgKiAyIC0gMSwgcywgcCk7XG4gIH0sXG5cbiAgZWFzZUluQmFjayh0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTtcbiAgfSxcblxuICBlYXNlT3V0QmFjayh0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gKHQgLT0gMSkgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAxO1xuICB9LFxuXG4gIGVhc2VJbk91dEJhY2sodDogbnVtYmVyKSB7XG4gICAgbGV0IHMgPSAxLjcwMTU4O1xuICAgIGlmICgodCAvPSAwLjUpIDwgMSkge1xuICAgICAgcmV0dXJuIDAuNSAqICh0ICogdCAqICgoKHMgKj0gKDEuNTI1KSkgKyAxKSAqIHQgLSBzKSk7XG4gICAgfVxuICAgIHJldHVybiAwLjUgKiAoKHQgLT0gMikgKiB0ICogKCgocyAqPSAoMS41MjUpKSArIDEpICogdCArIHMpICsgMik7XG4gIH0sXG5cbiAgZWFzZUluQm91bmNlOiAodDogbnVtYmVyKSA9PiAxIC0gZWZmZWN0cy5lYXNlT3V0Qm91bmNlKDEgLSB0KSxcblxuICBlYXNlT3V0Qm91bmNlKHQ6IG51bWJlcikge1xuICAgIGNvbnN0IG0gPSA3LjU2MjU7XG4gICAgY29uc3QgZCA9IDIuNzU7XG4gICAgaWYgKHQgPCAoMSAvIGQpKSB7XG4gICAgICByZXR1cm4gbSAqIHQgKiB0O1xuICAgIH1cbiAgICBpZiAodCA8ICgyIC8gZCkpIHtcbiAgICAgIHJldHVybiBtICogKHQgLT0gKDEuNSAvIGQpKSAqIHQgKyAwLjc1O1xuICAgIH1cbiAgICBpZiAodCA8ICgyLjUgLyBkKSkge1xuICAgICAgcmV0dXJuIG0gKiAodCAtPSAoMi4yNSAvIGQpKSAqIHQgKyAwLjkzNzU7XG4gICAgfVxuICAgIHJldHVybiBtICogKHQgLT0gKDIuNjI1IC8gZCkpICogdCArIDAuOTg0Mzc1O1xuICB9LFxuXG4gIGVhc2VJbk91dEJvdW5jZTogKHQ6IG51bWJlcikgPT4gKHQgPCAwLjUpXG4gICAgPyBlZmZlY3RzLmVhc2VJbkJvdW5jZSh0ICogMikgKiAwLjVcbiAgICA6IGVmZmVjdHMuZWFzZU91dEJvdW5jZSh0ICogMiAtIDEpICogMC41ICsgMC41LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRWFzaW5nRnVuY3Rpb24gPSBrZXlvZiB0eXBlb2YgZWZmZWN0c1xuXG5leHBvcnQgZGVmYXVsdCBlZmZlY3RzO1xuIiwgImltcG9ydCB7Q29sb3J9IGZyb20gJ0BrdXJrbGUvY29sb3InO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXR0ZXJuT3JHcmFkaWVudCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENhbnZhc1BhdHRlcm4gfCBDYW52YXNHcmFkaWVudCB7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgdHlwZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdbb2JqZWN0IENhbnZhc1BhdHRlcm5dJyB8fCB0eXBlID09PSAnW29iamVjdCBDYW52YXNHcmFkaWVudF0nO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sb3IodmFsdWU6IENhbnZhc0dyYWRpZW50KTogQ2FudmFzR3JhZGllbnQ7XG5leHBvcnQgZnVuY3Rpb24gY29sb3IodmFsdWU6IENhbnZhc1BhdHRlcm4pOiBDYW52YXNQYXR0ZXJuO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKFxuICB2YWx1ZTpcbiAgfCBzdHJpbmdcbiAgfCB7IHI6IG51bWJlcjsgZzogbnVtYmVyOyBiOiBudW1iZXI7IGE6IG51bWJlciB9XG4gIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdXG4gIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbik6IENvbG9yO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKHZhbHVlKSB7XG4gIHJldHVybiBpc1BhdHRlcm5PckdyYWRpZW50KHZhbHVlKSA/IHZhbHVlIDogbmV3IENvbG9yKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhvdmVyQ29sb3IodmFsdWU6IENhbnZhc0dyYWRpZW50KTogQ2FudmFzR3JhZGllbnQ7XG5leHBvcnQgZnVuY3Rpb24gZ2V0SG92ZXJDb2xvcih2YWx1ZTogQ2FudmFzUGF0dGVybik6IENhbnZhc1BhdHRlcm47XG5leHBvcnQgZnVuY3Rpb24gZ2V0SG92ZXJDb2xvcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhvdmVyQ29sb3IodmFsdWUpIHtcbiAgcmV0dXJuIGlzUGF0dGVybk9yR3JhZGllbnQodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IENvbG9yKHZhbHVlKS5zYXR1cmF0ZSgwLjUpLmRhcmtlbigwLjEpLmhleFN0cmluZygpO1xufVxuIiwgImNvbnN0IG51bWJlcnMgPSBbJ3gnLCAneScsICdib3JkZXJXaWR0aCcsICdyYWRpdXMnLCAndGVuc2lvbiddO1xuY29uc3QgY29sb3JzID0gWydjb2xvcicsICdib3JkZXJDb2xvcicsICdiYWNrZ3JvdW5kQ29sb3InXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QW5pbWF0aW9uc0RlZmF1bHRzKGRlZmF1bHRzKSB7XG4gIGRlZmF1bHRzLnNldCgnYW5pbWF0aW9uJywge1xuICAgIGRlbGF5OiB1bmRlZmluZWQsXG4gICAgZHVyYXRpb246IDEwMDAsXG4gICAgZWFzaW5nOiAnZWFzZU91dFF1YXJ0JyxcbiAgICBmbjogdW5kZWZpbmVkLFxuICAgIGZyb206IHVuZGVmaW5lZCxcbiAgICBsb29wOiB1bmRlZmluZWQsXG4gICAgdG86IHVuZGVmaW5lZCxcbiAgICB0eXBlOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIGRlZmF1bHRzLmRlc2NyaWJlKCdhbmltYXRpb24nLCB7XG4gICAgX2ZhbGxiYWNrOiBmYWxzZSxcbiAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgICBfc2NyaXB0YWJsZTogKG5hbWUpID0+IG5hbWUgIT09ICdvblByb2dyZXNzJyAmJiBuYW1lICE9PSAnb25Db21wbGV0ZScgJiYgbmFtZSAhPT0gJ2ZuJyxcbiAgfSk7XG5cbiAgZGVmYXVsdHMuc2V0KCdhbmltYXRpb25zJywge1xuICAgIGNvbG9yczoge1xuICAgICAgdHlwZTogJ2NvbG9yJyxcbiAgICAgIHByb3BlcnRpZXM6IGNvbG9yc1xuICAgIH0sXG4gICAgbnVtYmVyczoge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBwcm9wZXJ0aWVzOiBudW1iZXJzXG4gICAgfSxcbiAgfSk7XG5cbiAgZGVmYXVsdHMuZGVzY3JpYmUoJ2FuaW1hdGlvbnMnLCB7XG4gICAgX2ZhbGxiYWNrOiAnYW5pbWF0aW9uJyxcbiAgfSk7XG5cbiAgZGVmYXVsdHMuc2V0KCd0cmFuc2l0aW9ucycsIHtcbiAgICBhY3RpdmU6IHtcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBkdXJhdGlvbjogNDAwXG4gICAgICB9XG4gICAgfSxcbiAgICByZXNpemU6IHtcbiAgICAgIGFuaW1hdGlvbjoge1xuICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgfVxuICAgIH0sXG4gICAgc2hvdzoge1xuICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICBmcm9tOiAndHJhbnNwYXJlbnQnXG4gICAgICAgIH0sXG4gICAgICAgIHZpc2libGU6IHtcbiAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgZHVyYXRpb246IDAgLy8gc2hvdyBpbW1lZGlhdGVseVxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH0sXG4gICAgaGlkZToge1xuICAgICAgYW5pbWF0aW9uczoge1xuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICB0bzogJ3RyYW5zcGFyZW50J1xuICAgICAgICB9LFxuICAgICAgICB2aXNpYmxlOiB7XG4gICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgIGVhc2luZzogJ2xpbmVhcicsXG4gICAgICAgICAgZm46IHYgPT4gdiB8IDAgLy8gZm9yIGtlZXBpbmcgdGhlIGRhdGFzZXQgdmlzaWJsZSBhbGwgdGhlIHdheSB0aHJvdWdoIHRoZSBhbmltYXRpb25cbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwgImV4cG9ydCBmdW5jdGlvbiBhcHBseUxheW91dHNEZWZhdWx0cyhkZWZhdWx0cykge1xuICBkZWZhdWx0cy5zZXQoJ2xheW91dCcsIHtcbiAgICBhdXRvUGFkZGluZzogdHJ1ZSxcbiAgICBwYWRkaW5nOiB7XG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDBcbiAgICB9XG4gIH0pO1xufVxuIiwgIlxuY29uc3QgaW50bENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEludGwuTnVtYmVyRm9ybWF0PigpO1xuXG5mdW5jdGlvbiBnZXROdW1iZXJGb3JtYXQobG9jYWxlOiBzdHJpbmcsIG9wdGlvbnM/OiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGNhY2hlS2V5ID0gbG9jYWxlICsgSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gIGxldCBmb3JtYXR0ZXIgPSBpbnRsQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFmb3JtYXR0ZXIpIHtcbiAgICBmb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKTtcbiAgICBpbnRsQ2FjaGUuc2V0KGNhY2hlS2V5LCBmb3JtYXR0ZXIpO1xuICB9XG4gIHJldHVybiBmb3JtYXR0ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXIobnVtOiBudW1iZXIsIGxvY2FsZTogc3RyaW5nLCBvcHRpb25zPzogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zKSB7XG4gIHJldHVybiBnZXROdW1iZXJGb3JtYXQobG9jYWxlLCBvcHRpb25zKS5mb3JtYXQobnVtKTtcbn1cbiIsICJpbXBvcnQge2lzQXJyYXl9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Zm9ybWF0TnVtYmVyfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuaW50bC5qcyc7XG5pbXBvcnQge2xvZzEwfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5cbi8qKlxuICogTmFtZXNwYWNlIHRvIGhvbGQgZm9ybWF0dGVycyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRpY2tzXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnNcbiAqL1xuY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLyoqXG4gICAqIEZvcm1hdHRlciBmb3IgdmFsdWUgbGFiZWxzXG4gICAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy52YWx1ZXNcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBkaXNwbGF5XG4gICAqIEByZXR1cm4ge3N0cmluZ3xzdHJpbmdbXX0gdGhlIGxhYmVsIHRvIGRpc3BsYXlcbiAgICovXG4gIHZhbHVlcyh2YWx1ZSkge1xuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IC8qKiBAdHlwZSB7c3RyaW5nW119ICovICh2YWx1ZSkgOiAnJyArIHZhbHVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZXIgZm9yIG51bWVyaWMgdGlja3NcbiAgICogQG1ldGhvZCBDaGFydC5UaWNrcy5mb3JtYXR0ZXJzLm51bWVyaWNcbiAgICogQHBhcmFtIHRpY2tWYWx1ZSB7bnVtYmVyfSB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkXG4gICAqIEBwYXJhbSBpbmRleCB7bnVtYmVyfSB0aGUgcG9zaXRpb24gb2YgdGhlIHRpY2tWYWx1ZSBwYXJhbWV0ZXIgaW4gdGhlIHRpY2tzIGFycmF5XG4gICAqIEBwYXJhbSB0aWNrcyB7b2JqZWN0W119IHRoZSBsaXN0IG9mIHRpY2tzIGJlaW5nIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlclxuICAgKi9cbiAgbnVtZXJpYyh0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuICAgIGlmICh0aWNrVmFsdWUgPT09IDApIHtcbiAgICAgIHJldHVybiAnMCc7IC8vIG5ldmVyIHNob3cgZGVjaW1hbCBwbGFjZXMgZm9yIDBcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlO1xuICAgIGxldCBub3RhdGlvbjtcbiAgICBsZXQgZGVsdGEgPSB0aWNrVmFsdWU7IC8vIFRoaXMgaXMgdXNlZCB3aGVuIHRoZXJlIGFyZSBsZXNzIHRoYW4gMiB0aWNrcyBhcyB0aGUgdGljayBpbnRlcnZhbC5cblxuICAgIGlmICh0aWNrcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBhbGwgdGlja3MgYXJlIHNtYWxsIG9yIHRoZXJlIGh1Z2UgbnVtYmVyczsgdXNlIHNjaWVudGlmaWMgbm90YXRpb25cbiAgICAgIGNvbnN0IG1heFRpY2sgPSBNYXRoLm1heChNYXRoLmFicyh0aWNrc1swXS52YWx1ZSksIE1hdGguYWJzKHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlKSk7XG4gICAgICBpZiAobWF4VGljayA8IDFlLTQgfHwgbWF4VGljayA+IDFlKzE1KSB7XG4gICAgICAgIG5vdGF0aW9uID0gJ3NjaWVudGlmaWMnO1xuICAgICAgfVxuXG4gICAgICBkZWx0YSA9IGNhbGN1bGF0ZURlbHRhKHRpY2tWYWx1ZSwgdGlja3MpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvZ0RlbHRhID0gbG9nMTAoTWF0aC5hYnMoZGVsdGEpKTtcbiAgICBjb25zdCBudW1EZWNpbWFsID0gTWF0aC5tYXgoTWF0aC5taW4oLTEgKiBNYXRoLmZsb29yKGxvZ0RlbHRhKSwgMjApLCAwKTsgLy8gdG9GaXhlZCBoYXMgYSBtYXggb2YgMjAgZGVjaW1hbCBwbGFjZXNcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7bm90YXRpb24sIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbnVtRGVjaW1hbCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBudW1EZWNpbWFsfTtcbiAgICBPYmplY3QuYXNzaWduKG9wdGlvbnMsIHRoaXMub3B0aW9ucy50aWNrcy5mb3JtYXQpO1xuXG4gICAgcmV0dXJuIGZvcm1hdE51bWJlcih0aWNrVmFsdWUsIGxvY2FsZSwgb3B0aW9ucyk7XG4gIH0sXG5cblxuICAvKipcbiAgICogRm9ybWF0dGVyIGZvciBsb2dhcml0aG1pYyB0aWNrc1xuICAgKiBAbWV0aG9kIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnMubG9nYXJpdGhtaWNcbiAgICogQHBhcmFtIHRpY2tWYWx1ZSB7bnVtYmVyfSB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkXG4gICAqIEBwYXJhbSBpbmRleCB7bnVtYmVyfSB0aGUgcG9zaXRpb24gb2YgdGhlIHRpY2tWYWx1ZSBwYXJhbWV0ZXIgaW4gdGhlIHRpY2tzIGFycmF5XG4gICAqIEBwYXJhbSB0aWNrcyB7b2JqZWN0W119IHRoZSBsaXN0IG9mIHRpY2tzIGJlaW5nIGNvbnZlcnRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlclxuICAgKi9cbiAgbG9nYXJpdGhtaWModGlja1ZhbHVlLCBpbmRleCwgdGlja3MpIHtcbiAgICBpZiAodGlja1ZhbHVlID09PSAwKSB7XG4gICAgICByZXR1cm4gJzAnO1xuICAgIH1cbiAgICBjb25zdCByZW1haW4gPSB0aWNrc1tpbmRleF0uc2lnbmlmaWNhbmQgfHwgKHRpY2tWYWx1ZSAvIChNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihsb2cxMCh0aWNrVmFsdWUpKSkpKTtcbiAgICBpZiAoWzEsIDIsIDMsIDUsIDEwLCAxNV0uaW5jbHVkZXMocmVtYWluKSB8fCBpbmRleCA+IDAuOCAqIHRpY2tzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcm1hdHRlcnMubnVtZXJpYy5jYWxsKHRoaXMsIHRpY2tWYWx1ZSwgaW5kZXgsIHRpY2tzKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbn07XG5cblxuZnVuY3Rpb24gY2FsY3VsYXRlRGVsdGEodGlja1ZhbHVlLCB0aWNrcykge1xuICAvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGRpZ2l0cyB0byBzaG93XG4gIC8vIFRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gdGlja3MgbWlnaHQgYmUgc21hbGxlciB0aGFuIG5vcm1hbCBzcGFjaW5nXG4gIGxldCBkZWx0YSA9IHRpY2tzLmxlbmd0aCA+IDMgPyB0aWNrc1syXS52YWx1ZSAtIHRpY2tzWzFdLnZhbHVlIDogdGlja3NbMV0udmFsdWUgLSB0aWNrc1swXS52YWx1ZTtcblxuICAvLyBJZiB3ZSBoYXZlIGEgbnVtYmVyIGxpa2UgMi41IGFzIHRoZSBkZWx0YSwgZmlndXJlIG91dCBob3cgbWFueSBkZWNpbWFsIHBsYWNlcyB3ZSBuZWVkXG4gIGlmIChNYXRoLmFicyhkZWx0YSkgPj0gMSAmJiB0aWNrVmFsdWUgIT09IE1hdGguZmxvb3IodGlja1ZhbHVlKSkge1xuICAgIC8vIG5vdCBhbiBpbnRlZ2VyXG4gICAgZGVsdGEgPSB0aWNrVmFsdWUgLSBNYXRoLmZsb29yKHRpY2tWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGRlbHRhO1xufVxuXG4vKipcbiAqIE5hbWVzcGFjZSB0byBob2xkIHN0YXRpYyB0aWNrIGdlbmVyYXRpb24gZnVuY3Rpb25zXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtmb3JtYXR0ZXJzfTtcbiIsICJpbXBvcnQgVGlja3MgZnJvbSAnLi9jb3JlLnRpY2tzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U2NhbGVEZWZhdWx0cyhkZWZhdWx0cykge1xuICBkZWZhdWx0cy5zZXQoJ3NjYWxlJywge1xuICAgIGRpc3BsYXk6IHRydWUsXG4gICAgb2Zmc2V0OiBmYWxzZSxcbiAgICByZXZlcnNlOiBmYWxzZSxcbiAgICBiZWdpbkF0WmVybzogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBTY2FsZSBib3VuZGFyeSBzdHJhdGVneSAoYnlwYXNzZWQgYnkgbWluL21heCB0aW1lIG9wdGlvbnMpXG4gICAgICogLSBgZGF0YWA6IG1ha2Ugc3VyZSBkYXRhIGFyZSBmdWxseSB2aXNpYmxlLCB0aWNrcyBvdXRzaWRlIGFyZSByZW1vdmVkXG4gICAgICogLSBgdGlja3NgOiBtYWtlIHN1cmUgdGlja3MgYXJlIGZ1bGx5IHZpc2libGUsIGRhdGEgb3V0c2lkZSBhcmUgdHJ1bmNhdGVkXG4gICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1NTZcbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKi9cbiAgICBib3VuZHM6ICd0aWNrcycsXG5cbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbiBncmFjZSBhZGRlZCB0byBtYXggYW5kIHJlZHVjZWQgZnJvbSBtaW4gZGF0YSB2YWx1ZS5cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKi9cbiAgICBncmFjZTogMCxcblxuICAgIC8vIGdyaWQgbGluZSBzZXR0aW5nc1xuICAgIGdyaWQ6IHtcbiAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICBsaW5lV2lkdGg6IDEsXG4gICAgICBkcmF3T25DaGFydEFyZWE6IHRydWUsXG4gICAgICBkcmF3VGlja3M6IHRydWUsXG4gICAgICB0aWNrTGVuZ3RoOiA4LFxuICAgICAgdGlja1dpZHRoOiAoX2N0eCwgb3B0aW9ucykgPT4gb3B0aW9ucy5saW5lV2lkdGgsXG4gICAgICB0aWNrQ29sb3I6IChfY3R4LCBvcHRpb25zKSA9PiBvcHRpb25zLmNvbG9yLFxuICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICB9LFxuXG4gICAgYm9yZGVyOiB7XG4gICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgZGFzaDogW10sXG4gICAgICBkYXNoT2Zmc2V0OiAwLjAsXG4gICAgICB3aWR0aDogMVxuICAgIH0sXG5cbiAgICAvLyBzY2FsZSB0aXRsZVxuICAgIHRpdGxlOiB7XG4gICAgICAvLyBkaXNwbGF5IHByb3BlcnR5XG4gICAgICBkaXNwbGF5OiBmYWxzZSxcblxuICAgICAgLy8gYWN0dWFsIGxhYmVsXG4gICAgICB0ZXh0OiAnJyxcblxuICAgICAgLy8gdG9wL2JvdHRvbSBwYWRkaW5nXG4gICAgICBwYWRkaW5nOiB7XG4gICAgICAgIHRvcDogNCxcbiAgICAgICAgYm90dG9tOiA0XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIGxhYmVsIHNldHRpbmdzXG4gICAgdGlja3M6IHtcbiAgICAgIG1pblJvdGF0aW9uOiAwLFxuICAgICAgbWF4Um90YXRpb246IDUwLFxuICAgICAgbWlycm9yOiBmYWxzZSxcbiAgICAgIHRleHRTdHJva2VXaWR0aDogMCxcbiAgICAgIHRleHRTdHJva2VDb2xvcjogJycsXG4gICAgICBwYWRkaW5nOiAzLFxuICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgIGF1dG9Ta2lwOiB0cnVlLFxuICAgICAgYXV0b1NraXBQYWRkaW5nOiAzLFxuICAgICAgbGFiZWxPZmZzZXQ6IDAsXG4gICAgICAvLyBXZSBwYXNzIHRocm91Z2ggYXJyYXlzIHRvIGJlIHJlbmRlcmVkIGFzIG11bHRpbGluZSBsYWJlbHMsIHdlIGNvbnZlcnQgT3RoZXJzIHRvIHN0cmluZ3MgaGVyZS5cbiAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLnZhbHVlcyxcbiAgICAgIG1pbm9yOiB7fSxcbiAgICAgIG1ham9yOiB7fSxcbiAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgIGNyb3NzQWxpZ246ICduZWFyJyxcblxuICAgICAgc2hvd0xhYmVsQmFja2Ryb3A6IGZhbHNlLFxuICAgICAgYmFja2Ryb3BDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC43NSknLFxuICAgICAgYmFja2Ryb3BQYWRkaW5nOiAyLFxuICAgIH1cbiAgfSk7XG5cbiAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLnRpY2tzJywgJ2NvbG9yJywgJycsICdjb2xvcicpO1xuICBkZWZhdWx0cy5yb3V0ZSgnc2NhbGUuZ3JpZCcsICdjb2xvcicsICcnLCAnYm9yZGVyQ29sb3InKTtcbiAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLmJvcmRlcicsICdjb2xvcicsICcnLCAnYm9yZGVyQ29sb3InKTtcbiAgZGVmYXVsdHMucm91dGUoJ3NjYWxlLnRpdGxlJywgJ2NvbG9yJywgJycsICdjb2xvcicpO1xuXG4gIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZScsIHtcbiAgICBfZmFsbGJhY2s6IGZhbHNlLFxuICAgIF9zY3JpcHRhYmxlOiAobmFtZSkgPT4gIW5hbWUuc3RhcnRzV2l0aCgnYmVmb3JlJykgJiYgIW5hbWUuc3RhcnRzV2l0aCgnYWZ0ZXInKSAmJiBuYW1lICE9PSAnY2FsbGJhY2snICYmIG5hbWUgIT09ICdwYXJzZXInLFxuICAgIF9pbmRleGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnYm9yZGVyRGFzaCcgJiYgbmFtZSAhPT0gJ3RpY2tCb3JkZXJEYXNoJyAmJiBuYW1lICE9PSAnZGFzaCcsXG4gIH0pO1xuXG4gIGRlZmF1bHRzLmRlc2NyaWJlKCdzY2FsZXMnLCB7XG4gICAgX2ZhbGxiYWNrOiAnc2NhbGUnLFxuICB9KTtcblxuICBkZWZhdWx0cy5kZXNjcmliZSgnc2NhbGUudGlja3MnLCB7XG4gICAgX3NjcmlwdGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnYmFja2Ryb3BQYWRkaW5nJyAmJiBuYW1lICE9PSAnY2FsbGJhY2snLFxuICAgIF9pbmRleGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnYmFja2Ryb3BQYWRkaW5nJyxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHtnZXRIb3ZlckNvbG9yfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29sb3IuanMnO1xuaW1wb3J0IHtpc09iamVjdCwgbWVyZ2UsIHZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge2FwcGx5QW5pbWF0aW9uc0RlZmF1bHRzfSBmcm9tICcuL2NvcmUuYW5pbWF0aW9ucy5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge2FwcGx5TGF5b3V0c0RlZmF1bHRzfSBmcm9tICcuL2NvcmUubGF5b3V0cy5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge2FwcGx5U2NhbGVEZWZhdWx0c30gZnJvbSAnLi9jb3JlLnNjYWxlLmRlZmF1bHRzLmpzJztcblxuZXhwb3J0IGNvbnN0IG92ZXJyaWRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5leHBvcnQgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldFNjb3BlKG5vZGUsIGtleSkge1xuICBpZiAoIWtleSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgZm9yIChsZXQgaSA9IDAsIG4gPSBrZXlzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGNvbnN0IGsgPSBrZXlzW2ldO1xuICAgIG5vZGUgPSBub2RlW2tdIHx8IChub2RlW2tdID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIHNldChyb290LCBzY29wZSwgdmFsdWVzKSB7XG4gIGlmICh0eXBlb2Ygc2NvcGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG1lcmdlKGdldFNjb3BlKHJvb3QsIHNjb3BlKSwgdmFsdWVzKTtcbiAgfVxuICByZXR1cm4gbWVyZ2UoZ2V0U2NvcGUocm9vdCwgJycpLCBzY29wZSk7XG59XG5cbi8qKlxuICogUGxlYXNlIHVzZSB0aGUgbW9kdWxlJ3MgZGVmYXVsdCBleHBvcnQgd2hpY2ggcHJvdmlkZXMgYSBzaW5nbGV0b24gaW5zdGFuY2VcbiAqIE5vdGU6IGNsYXNzIGlzIGV4cG9ydGVkIGZvciB0eXBlZG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0cyB7XG4gIGNvbnN0cnVjdG9yKF9kZXNjcmlwdG9ycywgX2FwcGxpZXJzKSB7XG4gICAgdGhpcy5hbmltYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgwLDAsMCwwLjEpJztcbiAgICB0aGlzLmJvcmRlckNvbG9yID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG4gICAgdGhpcy5jb2xvciA9ICcjNjY2JztcbiAgICB0aGlzLmRhdGFzZXRzID0ge307XG4gICAgdGhpcy5kZXZpY2VQaXhlbFJhdGlvID0gKGNvbnRleHQpID0+IGNvbnRleHQuY2hhcnQucGxhdGZvcm0uZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO1xuICAgIHRoaXMuZWxlbWVudHMgPSB7fTtcbiAgICB0aGlzLmV2ZW50cyA9IFtcbiAgICAgICdtb3VzZW1vdmUnLFxuICAgICAgJ21vdXNlb3V0JyxcbiAgICAgICdjbGljaycsXG4gICAgICAndG91Y2hzdGFydCcsXG4gICAgICAndG91Y2htb3ZlJ1xuICAgIF07XG4gICAgdGhpcy5mb250ID0ge1xuICAgICAgZmFtaWx5OiBcIidIZWx2ZXRpY2EgTmV1ZScsICdIZWx2ZXRpY2EnLCAnQXJpYWwnLCBzYW5zLXNlcmlmXCIsXG4gICAgICBzaXplOiAxMixcbiAgICAgIHN0eWxlOiAnbm9ybWFsJyxcbiAgICAgIGxpbmVIZWlnaHQ6IDEuMixcbiAgICAgIHdlaWdodDogbnVsbFxuICAgIH07XG4gICAgdGhpcy5ob3ZlciA9IHt9O1xuICAgIHRoaXMuaG92ZXJCYWNrZ3JvdW5kQ29sb3IgPSAoY3R4LCBvcHRpb25zKSA9PiBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKTtcbiAgICB0aGlzLmhvdmVyQm9yZGVyQ29sb3IgPSAoY3R4LCBvcHRpb25zKSA9PiBnZXRIb3ZlckNvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpO1xuICAgIHRoaXMuaG92ZXJDb2xvciA9IChjdHgsIG9wdGlvbnMpID0+IGdldEhvdmVyQ29sb3Iob3B0aW9ucy5jb2xvcik7XG4gICAgdGhpcy5pbmRleEF4aXMgPSAneCc7XG4gICAgdGhpcy5pbnRlcmFjdGlvbiA9IHtcbiAgICAgIG1vZGU6ICduZWFyZXN0JyxcbiAgICAgIGludGVyc2VjdDogdHJ1ZSxcbiAgICAgIGluY2x1ZGVJbnZpc2libGU6IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLm1haW50YWluQXNwZWN0UmF0aW8gPSB0cnVlO1xuICAgIHRoaXMub25Ib3ZlciA9IG51bGw7XG4gICAgdGhpcy5vbkNsaWNrID0gbnVsbDtcbiAgICB0aGlzLnBhcnNpbmcgPSB0cnVlO1xuICAgIHRoaXMucGx1Z2lucyA9IHt9O1xuICAgIHRoaXMucmVzcG9uc2l2ZSA9IHRydWU7XG4gICAgdGhpcy5zY2FsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNjYWxlcyA9IHt9O1xuICAgIHRoaXMuc2hvd0xpbmUgPSB0cnVlO1xuICAgIHRoaXMuZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3AgPSB0cnVlO1xuXG4gICAgdGhpcy5kZXNjcmliZShfZGVzY3JpcHRvcnMpO1xuICAgIHRoaXMuYXBwbHkoX2FwcGxpZXJzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHNjb3BlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbdmFsdWVzXVxuXHQgKi9cbiAgc2V0KHNjb3BlLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gc2V0KHRoaXMsIHNjb3BlLCB2YWx1ZXMpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZVxuXHQgKi9cbiAgZ2V0KHNjb3BlKSB7XG4gICAgcmV0dXJuIGdldFNjb3BlKHRoaXMsIHNjb3BlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHNjb3BlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbdmFsdWVzXVxuXHQgKi9cbiAgZGVzY3JpYmUoc2NvcGUsIHZhbHVlcykge1xuICAgIHJldHVybiBzZXQoZGVzY3JpcHRvcnMsIHNjb3BlLCB2YWx1ZXMpO1xuICB9XG5cbiAgb3ZlcnJpZGUoc2NvcGUsIHZhbHVlcykge1xuICAgIHJldHVybiBzZXQob3ZlcnJpZGVzLCBzY29wZSwgdmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSb3V0ZXMgdGhlIG5hbWVkIGRlZmF1bHRzIHRvIGZhbGxiYWNrIHRvIGFub3RoZXIgc2NvcGUvbmFtZS5cblx0ICogVGhpcyByb3V0aW5nIGlzIHVzZWZ1bCB3aGVuIHRob3NlIHRhcmdldCB2YWx1ZXMsIGxpa2UgZGVmYXVsdHMuY29sb3IsIGFyZSBjaGFuZ2VkIHJ1bnRpbWUuXG5cdCAqIElmIHRoZSB2YWx1ZXMgd291bGQgYmUgY29waWVkLCB0aGUgcnVudGltZSBjaGFuZ2Ugd291bGQgbm90IHRha2UgZWZmZWN0LiBCeSByb3V0aW5nLCB0aGVcblx0ICogZmFsbGJhY2sgaXMgZXZhbHVhdGVkIGF0IGVhY2ggYWNjZXNzLCBzbyBpdHMgYWx3YXlzIHVwIHRvIGRhdGUuXG5cdCAqXG5cdCAqIEV4YW1wbGU6XG5cdCAqXG5cdCAqIFx0ZGVmYXVsdHMucm91dGUoJ2VsZW1lbnRzLmFyYycsICdiYWNrZ3JvdW5kQ29sb3InLCAnJywgJ2NvbG9yJylcblx0ICogICAtIHJlYWRzIHRoZSBiYWNrZ3JvdW5kQ29sb3IgZnJvbSBkZWZhdWx0cy5jb2xvciB3aGVuIHVuZGVmaW5lZCBsb2NhbGx5XG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzY29wZSBTY29wZSB0aGlzIHJvdXRlIGFwcGxpZXMgdG8uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFByb3BlcnR5IG5hbWUgdGhhdCBzaG91bGQgYmUgcm91dGVkIHRvIGRpZmZlcmVudCBuYW1lc3BhY2Ugd2hlbiBub3QgZGVmaW5lZCBoZXJlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0U2NvcGUgVGhlIG5hbWVzcGFjZSB3aGVyZSB0aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSByb3V0ZWQgdG8uXG5cdCAqIEVtcHR5IHN0cmluZyAoJycpIGlzIHRoZSByb290IG9mIGRlZmF1bHRzLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0TmFtZSBUaGUgdGFyZ2V0IG5hbWUgaW4gdGhlIHRhcmdldCBzY29wZSB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHJvdXRlZCB0by5cblx0ICovXG4gIHJvdXRlKHNjb3BlLCBuYW1lLCB0YXJnZXRTY29wZSwgdGFyZ2V0TmFtZSkge1xuICAgIGNvbnN0IHNjb3BlT2JqZWN0ID0gZ2V0U2NvcGUodGhpcywgc2NvcGUpO1xuICAgIGNvbnN0IHRhcmdldFNjb3BlT2JqZWN0ID0gZ2V0U2NvcGUodGhpcywgdGFyZ2V0U2NvcGUpO1xuICAgIGNvbnN0IHByaXZhdGVOYW1lID0gJ18nICsgbmFtZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNjb3BlT2JqZWN0LCB7XG4gICAgICAvLyBBIHByaXZhdGUgcHJvcGVydHkgaXMgZGVmaW5lZCB0byBob2xkIHRoZSBhY3R1YWwgdmFsdWUsIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQgaW4gaXRzIHNjb3BlIChzZXQgaW4gdGhlIHNldHRlcilcbiAgICAgIFtwcml2YXRlTmFtZV06IHtcbiAgICAgICAgdmFsdWU6IHNjb3BlT2JqZWN0W25hbWVdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFRoZSBhY3R1YWwgcHJvcGVydHkgaXMgZGVmaW5lZCBhcyBnZXR0ZXIvc2V0dGVyIHNvIHdlIGNhbiBkbyB0aGUgcm91dGluZyB3aGVuIHZhbHVlIGlzIG5vdCBsb2NhbGx5IHNldC5cbiAgICAgIFtuYW1lXToge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgbG9jYWwgPSB0aGlzW3ByaXZhdGVOYW1lXTtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRTY29wZU9iamVjdFt0YXJnZXROYW1lXTtcbiAgICAgICAgICBpZiAoaXNPYmplY3QobG9jYWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0LCBsb2NhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZU9yRGVmYXVsdChsb2NhbCwgdGFyZ2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpc1twcml2YXRlTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHkoYXBwbGllcnMpIHtcbiAgICBhcHBsaWVycy5mb3JFYWNoKChhcHBseSkgPT4gYXBwbHkodGhpcykpO1xuICB9XG59XG5cbi8vIHNpbmdsZXRvbiBpbnN0YW5jZVxuZXhwb3J0IGRlZmF1bHQgLyogI19fUFVSRV9fICovIG5ldyBEZWZhdWx0cyh7XG4gIF9zY3JpcHRhYmxlOiAobmFtZSkgPT4gIW5hbWUuc3RhcnRzV2l0aCgnb24nKSxcbiAgX2luZGV4YWJsZTogKG5hbWUpID0+IG5hbWUgIT09ICdldmVudHMnLFxuICBob3Zlcjoge1xuICAgIF9mYWxsYmFjazogJ2ludGVyYWN0aW9uJ1xuICB9LFxuICBpbnRlcmFjdGlvbjoge1xuICAgIF9zY3JpcHRhYmxlOiBmYWxzZSxcbiAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgfVxufSwgW2FwcGx5QW5pbWF0aW9uc0RlZmF1bHRzLCBhcHBseUxheW91dHNEZWZhdWx0cywgYXBwbHlTY2FsZURlZmF1bHRzXSk7XG4iLCAiaW1wb3J0IHtpc0FycmF5LCBpc051bGxPclVuZGVmfSBmcm9tICcuL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge1BJLCBUQVUsIEhBTEZfUEksIFFVQVJURVJfUEksIFRXT19USElSRFNfUEksIFJBRF9QRVJfREVHfSBmcm9tICcuL2hlbHBlcnMubWF0aC5qcyc7XG5cbi8qKlxuICogTm90ZTogdHlwZWRlZnMgYXJlIGF1dG8tZXhwb3J0ZWQsIHNvIHVzZSBhIG1hZGUtdXAgYGNhbnZhc2AgbmFtZXNwYWNlIHdoZXJlXG4gKiBuZWNlc3NhcnkgdG8gYXZvaWQgZHVwbGljYXRlcyB3aXRoIGBleHBvcnQgKiBmcm9tICcuL2hlbHBlcnNgOyBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNDYwMTFcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBjYW52YXMuQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLlBvaW50IH0gUG9pbnRcbiAqL1xuXG4vKipcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuaGVscGVycy5jYW52YXNcbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBmb250IG9iamVjdCBpbnRvIGEgQ1NTIGZvbnQgc3RyaW5nLlxuICogQHBhcmFtIHtvYmplY3R9IGZvbnQgLSBBIGZvbnQgb2JqZWN0LlxuICogQHJldHVybiB7c3RyaW5nfG51bGx9IFRoZSBDU1MgZm9udCBzdHJpbmcuIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRm9udFN0cmluZyhmb250KSB7XG4gIGlmICghZm9udCB8fCBpc051bGxPclVuZGVmKGZvbnQuc2l6ZSkgfHwgaXNOdWxsT3JVbmRlZihmb250LmZhbWlseSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoZm9udC5zdHlsZSA/IGZvbnQuc3R5bGUgKyAnICcgOiAnJylcblx0XHQrIChmb250LndlaWdodCA/IGZvbnQud2VpZ2h0ICsgJyAnIDogJycpXG5cdFx0KyBmb250LnNpemUgKyAncHggJ1xuXHRcdCsgZm9udC5mYW1pbHk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBzdHJpbmcpIHtcbiAgbGV0IHRleHRXaWR0aCA9IGRhdGFbc3RyaW5nXTtcbiAgaWYgKCF0ZXh0V2lkdGgpIHtcbiAgICB0ZXh0V2lkdGggPSBkYXRhW3N0cmluZ10gPSBjdHgubWVhc3VyZVRleHQoc3RyaW5nKS53aWR0aDtcbiAgICBnYy5wdXNoKHN0cmluZyk7XG4gIH1cbiAgaWYgKHRleHRXaWR0aCA+IGxvbmdlc3QpIHtcbiAgICBsb25nZXN0ID0gdGV4dFdpZHRoO1xuICB9XG4gIHJldHVybiBsb25nZXN0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfbG9uZ2VzdFRleHQoY3R4LCBmb250LCBhcnJheU9mVGhpbmdzLCBjYWNoZSkge1xuICBjYWNoZSA9IGNhY2hlIHx8IHt9O1xuICBsZXQgZGF0YSA9IGNhY2hlLmRhdGEgPSBjYWNoZS5kYXRhIHx8IHt9O1xuICBsZXQgZ2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0IHx8IFtdO1xuXG4gIGlmIChjYWNoZS5mb250ICE9PSBmb250KSB7XG4gICAgZGF0YSA9IGNhY2hlLmRhdGEgPSB7fTtcbiAgICBnYyA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0ID0gW107XG4gICAgY2FjaGUuZm9udCA9IGZvbnQ7XG4gIH1cblxuICBjdHguc2F2ZSgpO1xuXG4gIGN0eC5mb250ID0gZm9udDtcbiAgbGV0IGxvbmdlc3QgPSAwO1xuICBjb25zdCBpbGVuID0gYXJyYXlPZlRoaW5ncy5sZW5ndGg7XG4gIGxldCBpLCBqLCBqbGVuLCB0aGluZywgbmVzdGVkVGhpbmc7XG4gIGZvciAoaSA9IDA7IGkgPCBpbGVuOyBpKyspIHtcbiAgICB0aGluZyA9IGFycmF5T2ZUaGluZ3NbaV07XG5cbiAgICAvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICBpZiAodGhpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGluZyAhPT0gbnVsbCAmJiBpc0FycmF5KHRoaW5nKSAhPT0gdHJ1ZSkge1xuICAgICAgbG9uZ2VzdCA9IF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCB0aGluZyk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHRoaW5nKSkge1xuICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgbGV0cyBtZWFzdXJlIGVhY2ggZWxlbWVudFxuICAgICAgLy8gdG8gZG8gbWF5YmUgc2ltcGxpZnkgdGhpcyBmdW5jdGlvbiBhIGJpdCBzbyB3ZSBjYW4gZG8gdGhpcyBtb3JlIHJlY3Vyc2l2ZWx5P1xuICAgICAgZm9yIChqID0gMCwgamxlbiA9IHRoaW5nLmxlbmd0aDsgaiA8IGpsZW47IGorKykge1xuICAgICAgICBuZXN0ZWRUaGluZyA9IHRoaW5nW2pdO1xuICAgICAgICAvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICAgICAgaWYgKG5lc3RlZFRoaW5nICE9PSB1bmRlZmluZWQgJiYgbmVzdGVkVGhpbmcgIT09IG51bGwgJiYgIWlzQXJyYXkobmVzdGVkVGhpbmcpKSB7XG4gICAgICAgICAgbG9uZ2VzdCA9IF9tZWFzdXJlVGV4dChjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBuZXN0ZWRUaGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdHgucmVzdG9yZSgpO1xuXG4gIGNvbnN0IGdjTGVuID0gZ2MubGVuZ3RoIC8gMjtcbiAgaWYgKGdjTGVuID4gYXJyYXlPZlRoaW5ncy5sZW5ndGgpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ2NMZW47IGkrKykge1xuICAgICAgZGVsZXRlIGRhdGFbZ2NbaV1dO1xuICAgIH1cbiAgICBnYy5zcGxpY2UoMCwgZ2NMZW4pO1xuICB9XG4gIHJldHVybiBsb25nZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFsaWduZWQgcGl4ZWwgdmFsdWUgdG8gYXZvaWQgYW50aS1hbGlhc2luZyBibHVyXG4gKiBAcGFyYW0ge2NhbnZhcy5DaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gcGl4ZWwgLSBBIHBpeGVsIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxuICogQHJldHVybnMge251bWJlcn0gVGhlIGFsaWduZWQgcGl4ZWwgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2FsaWduUGl4ZWwoY2hhcnQsIHBpeGVsLCB3aWR0aCkge1xuICBjb25zdCBkZXZpY2VQaXhlbFJhdGlvID0gY2hhcnQuY3VycmVudERldmljZVBpeGVsUmF0aW87XG4gIGNvbnN0IGhhbGZXaWR0aCA9IHdpZHRoICE9PSAwID8gTWF0aC5tYXgod2lkdGggLyAyLCAwLjUpIDogMDtcbiAgcmV0dXJuIE1hdGgucm91bmQoKHBpeGVsIC0gaGFsZldpZHRoKSAqIGRldmljZVBpeGVsUmF0aW8pIC8gZGV2aWNlUGl4ZWxSYXRpbyArIGhhbGZXaWR0aDtcbn1cblxuLyoqXG4gKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMuXG4gKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBbY3R4XVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpIHtcbiAgY3R4ID0gY3R4IHx8IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gIGN0eC5zYXZlKCk7XG4gIC8vIGNhbnZhcy53aWR0aCBhbmQgY2FudmFzLmhlaWdodCBkbyBub3QgY29uc2lkZXIgdGhlIGNhbnZhcyB0cmFuc2Zvcm0sXG4gIC8vIHdoaWxlIGNsZWFyUmVjdCBkb2VzXG4gIGN0eC5yZXNldFRyYW5zZm9ybSgpO1xuICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gIGN0eC5yZXN0b3JlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3UG9pbnQoY3R4LCBvcHRpb25zLCB4LCB5KSB7XG4gIGRyYXdQb2ludExlZ2VuZChjdHgsIG9wdGlvbnMsIHgsIHksIG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd1BvaW50TGVnZW5kKGN0eCwgb3B0aW9ucywgeCwgeSwgdykge1xuICBsZXQgdHlwZSwgeE9mZnNldCwgeU9mZnNldCwgc2l6ZSwgY29ybmVyUmFkaXVzLCB3aWR0aCwgeE9mZnNldFcsIHlPZmZzZXRXO1xuICBjb25zdCBzdHlsZSA9IG9wdGlvbnMucG9pbnRTdHlsZTtcbiAgY29uc3Qgcm90YXRpb24gPSBvcHRpb25zLnJvdGF0aW9uO1xuICBjb25zdCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cztcbiAgbGV0IHJhZCA9IChyb3RhdGlvbiB8fCAwKSAqIFJBRF9QRVJfREVHO1xuXG4gIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XG4gICAgdHlwZSA9IHN0eWxlLnRvU3RyaW5nKCk7XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEhUTUxJbWFnZUVsZW1lbnRdJyB8fCB0eXBlID09PSAnW29iamVjdCBIVE1MQ2FudmFzRWxlbWVudF0nKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICAgIGN0eC5yb3RhdGUocmFkKTtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3R5bGUsIC1zdHlsZS53aWR0aCAvIDIsIC1zdHlsZS5oZWlnaHQgLyAyLCBzdHlsZS53aWR0aCwgc3R5bGUuaGVpZ2h0KTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgc3dpdGNoIChzdHlsZSkge1xuICAvLyBEZWZhdWx0IGluY2x1ZGVzIGNpcmNsZVxuICBkZWZhdWx0OlxuICAgIGlmICh3KSB7XG4gICAgICBjdHguZWxsaXBzZSh4LCB5LCB3IC8gMiwgcmFkaXVzLCAwLCAwLCBUQVUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgMCwgVEFVKTtcbiAgICB9XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGJyZWFrO1xuICBjYXNlICd0cmlhbmdsZSc6XG4gICAgd2lkdGggPSB3ID8gdyAvIDIgOiByYWRpdXM7XG4gICAgY3R4Lm1vdmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgcmFkICs9IFRXT19USElSRFNfUEk7XG4gICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgcmFkICs9IFRXT19USElSRFNfUEk7XG4gICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5zaW4ocmFkKSAqIHdpZHRoLCB5IC0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cyk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGJyZWFrO1xuICBjYXNlICdyZWN0Um91bmRlZCc6XG4gICAgLy8gTk9URTogdGhlIHJvdW5kZWQgcmVjdCBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VkIHRvIHVzZSBgYXJjYCBpbnN0ZWFkIG9mXG4gICAgLy8gYHF1YWRyYXRpY0N1cnZlVG9gIHNpbmNlIGl0IGdlbmVyYXRlcyBiZXR0ZXIgcmVzdWx0cyB3aGVuIHJlY3QgaXNcbiAgICAvLyBhbG1vc3QgYSBjaXJjbGUuIDAuNTE2IChpbnN0ZWFkIG9mIDAuNSkgcHJvZHVjZXMgcmVzdWx0cyB3aXRoIHZpc3VhbGx5XG4gICAgLy8gY2xvc2VyIHByb3BvcnRpb24gdG8gdGhlIHByZXZpb3VzIGltcGwgYW5kIGl0IGlzIGluc2NyaWJlZCBpbiB0aGVcbiAgICAvLyBjaXJjbGUgd2l0aCBgcmFkaXVzYC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBmb2xsb3dpbmcgUFJzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81NTk3XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzU4NThcbiAgICBjb3JuZXJSYWRpdXMgPSByYWRpdXMgKiAwLjUxNjtcbiAgICBzaXplID0gcmFkaXVzIC0gY29ybmVyUmFkaXVzO1xuICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQgKyBRVUFSVEVSX1BJKSAqIHNpemU7XG4gICAgeE9mZnNldFcgPSBNYXRoLmNvcyhyYWQgKyBRVUFSVEVSX1BJKSAqICh3ID8gdyAvIDIgLSBjb3JuZXJSYWRpdXMgOiBzaXplKTtcbiAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkICsgUVVBUlRFUl9QSSkgKiBzaXplO1xuICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkICsgUVVBUlRFUl9QSSkgKiAodyA/IHcgLyAyIC0gY29ybmVyUmFkaXVzIDogc2l6ZSk7XG4gICAgY3R4LmFyYyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0LCBjb3JuZXJSYWRpdXMsIHJhZCAtIFBJLCByYWQgLSBIQUxGX1BJKTtcbiAgICBjdHguYXJjKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkIC0gSEFMRl9QSSwgcmFkKTtcbiAgICBjdHguYXJjKHggKyB4T2Zmc2V0VywgeSArIHlPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkLCByYWQgKyBIQUxGX1BJKTtcbiAgICBjdHguYXJjKHggLSB5T2Zmc2V0VywgeSArIHhPZmZzZXQsIGNvcm5lclJhZGl1cywgcmFkICsgSEFMRl9QSSwgcmFkICsgUEkpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICBicmVhaztcbiAgY2FzZSAncmVjdCc6XG4gICAgaWYgKCFyb3RhdGlvbikge1xuICAgICAgc2l6ZSA9IE1hdGguU1FSVDFfMiAqIHJhZGl1cztcbiAgICAgIHdpZHRoID0gdyA/IHcgLyAyIDogc2l6ZTtcbiAgICAgIGN0eC5yZWN0KHggLSB3aWR0aCwgeSAtIHNpemUsIDIgKiB3aWR0aCwgMiAqIHNpemUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJhZCArPSBRVUFSVEVSX1BJO1xuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgY2FzZSAncmVjdFJvdCc6XG4gICAgeE9mZnNldFcgPSBNYXRoLmNvcyhyYWQpICogKHcgPyB3IC8gMiA6IHJhZGl1cyk7XG4gICAgeE9mZnNldCA9IE1hdGguY29zKHJhZCkgKiByYWRpdXM7XG4gICAgeU9mZnNldCA9IE1hdGguc2luKHJhZCkgKiByYWRpdXM7XG4gICAgeU9mZnNldFcgPSBNYXRoLnNpbihyYWQpICogKHcgPyB3IC8gMiA6IHJhZGl1cyk7XG4gICAgY3R4Lm1vdmVUbyh4IC0geE9mZnNldFcsIHkgLSB5T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgY3R4LmxpbmVUbyh4IC0geU9mZnNldFcsIHkgKyB4T2Zmc2V0KTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2Nyb3NzUm90JzpcbiAgICByYWQgKz0gUVVBUlRFUl9QSTtcbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gIGNhc2UgJ2Nyb3NzJzpcbiAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICB4T2Zmc2V0ID0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICBjdHgubW92ZVRvKHggLSB4T2Zmc2V0VywgeSAtIHlPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggLSB5T2Zmc2V0VywgeSArIHhPZmZzZXQpO1xuICAgIGJyZWFrO1xuICBjYXNlICdzdGFyJzpcbiAgICB4T2Zmc2V0VyA9IE1hdGguY29zKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICB4T2Zmc2V0ID0gTWF0aC5jb3MocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0ID0gTWF0aC5zaW4ocmFkKSAqIHJhZGl1cztcbiAgICB5T2Zmc2V0VyA9IE1hdGguc2luKHJhZCkgKiAodyA/IHcgLyAyIDogcmFkaXVzKTtcbiAgICBjdHgubW92ZVRvKHggLSB4T2Zmc2V0VywgeSAtIHlPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCArIHhPZmZzZXRXLCB5ICsgeU9mZnNldCk7XG4gICAgY3R4Lm1vdmVUbyh4ICsgeU9mZnNldFcsIHkgLSB4T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggLSB5T2Zmc2V0VywgeSArIHhPZmZzZXQpO1xuICAgIHJhZCArPSBRVUFSVEVSX1BJO1xuICAgIHhPZmZzZXRXID0gTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgIHhPZmZzZXQgPSBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgIHlPZmZzZXQgPSBNYXRoLnNpbihyYWQpICogcmFkaXVzO1xuICAgIHlPZmZzZXRXID0gTWF0aC5zaW4ocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpO1xuICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXRXLCB5IC0geU9mZnNldCk7XG4gICAgY3R4LmxpbmVUbyh4ICsgeE9mZnNldFcsIHkgKyB5T2Zmc2V0KTtcbiAgICBjdHgubW92ZVRvKHggKyB5T2Zmc2V0VywgeSAtIHhPZmZzZXQpO1xuICAgIGN0eC5saW5lVG8oeCAtIHlPZmZzZXRXLCB5ICsgeE9mZnNldCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2xpbmUnOlxuICAgIHhPZmZzZXQgPSB3ID8gdyAvIDIgOiBNYXRoLmNvcyhyYWQpICogcmFkaXVzO1xuICAgIHlPZmZzZXQgPSBNYXRoLnNpbihyYWQpICogcmFkaXVzO1xuICAgIGN0eC5tb3ZlVG8oeCAtIHhPZmZzZXQsIHkgLSB5T2Zmc2V0KTtcbiAgICBjdHgubGluZVRvKHggKyB4T2Zmc2V0LCB5ICsgeU9mZnNldCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2Rhc2gnOlxuICAgIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgY3R4LmxpbmVUbyh4ICsgTWF0aC5jb3MocmFkKSAqICh3ID8gdyAvIDIgOiByYWRpdXMpLCB5ICsgTWF0aC5zaW4ocmFkKSAqIHJhZGl1cyk7XG4gICAgYnJlYWs7XG4gIGNhc2UgZmFsc2U6XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY3R4LmZpbGwoKTtcbiAgaWYgKG9wdGlvbnMuYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludCBpcyBpbnNpZGUgdGhlIHJlY3RhbmdsZVxuICogQHBhcmFtIHtQb2ludH0gcG9pbnQgLSBUaGUgcG9pbnQgdG8gdGVzdFxuICogQHBhcmFtIHtvYmplY3R9IGFyZWEgLSBUaGUgcmVjdGFuZ2xlXG4gKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbl0gLSBhbGxvd2VkIG1hcmdpblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2lzUG9pbnRJbkFyZWEocG9pbnQsIGFyZWEsIG1hcmdpbikge1xuICBtYXJnaW4gPSBtYXJnaW4gfHwgMC41OyAvLyBtYXJnaW4gLSBkZWZhdWx0IGlzIHRvIG1hdGNoIHJvdW5kZWQgZGVjaW1hbHNcblxuICByZXR1cm4gIWFyZWEgfHwgKHBvaW50ICYmIHBvaW50LnggPiBhcmVhLmxlZnQgLSBtYXJnaW4gJiYgcG9pbnQueCA8IGFyZWEucmlnaHQgKyBtYXJnaW4gJiZcblx0XHRwb2ludC55ID4gYXJlYS50b3AgLSBtYXJnaW4gJiYgcG9pbnQueSA8IGFyZWEuYm90dG9tICsgbWFyZ2luKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsaXBBcmVhKGN0eCwgYXJlYSkge1xuICBjdHguc2F2ZSgpO1xuICBjdHguYmVnaW5QYXRoKCk7XG4gIGN0eC5yZWN0KGFyZWEubGVmdCwgYXJlYS50b3AsIGFyZWEucmlnaHQgLSBhcmVhLmxlZnQsIGFyZWEuYm90dG9tIC0gYXJlYS50b3ApO1xuICBjdHguY2xpcCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5jbGlwQXJlYShjdHgpIHtcbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX3N0ZXBwZWRMaW5lVG8oY3R4LCBwcmV2aW91cywgdGFyZ2V0LCBmbGlwLCBtb2RlKSB7XG4gIGlmICghcHJldmlvdXMpIHtcbiAgICByZXR1cm4gY3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICB9XG4gIGlmIChtb2RlID09PSAnbWlkZGxlJykge1xuICAgIGNvbnN0IG1pZHBvaW50ID0gKHByZXZpb3VzLnggKyB0YXJnZXQueCkgLyAyLjA7XG4gICAgY3R4LmxpbmVUbyhtaWRwb2ludCwgcHJldmlvdXMueSk7XG4gICAgY3R4LmxpbmVUbyhtaWRwb2ludCwgdGFyZ2V0LnkpO1xuICB9IGVsc2UgaWYgKG1vZGUgPT09ICdhZnRlcicgIT09ICEhZmxpcCkge1xuICAgIGN0eC5saW5lVG8ocHJldmlvdXMueCwgdGFyZ2V0LnkpO1xuICB9IGVsc2Uge1xuICAgIGN0eC5saW5lVG8odGFyZ2V0LngsIHByZXZpb3VzLnkpO1xuICB9XG4gIGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2JlemllckN1cnZlVG8oY3R4LCBwcmV2aW91cywgdGFyZ2V0LCBmbGlwKSB7XG4gIGlmICghcHJldmlvdXMpIHtcbiAgICByZXR1cm4gY3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICB9XG4gIGN0eC5iZXppZXJDdXJ2ZVRvKFxuICAgIGZsaXAgPyBwcmV2aW91cy5jcDF4IDogcHJldmlvdXMuY3AyeCxcbiAgICBmbGlwID8gcHJldmlvdXMuY3AxeSA6IHByZXZpb3VzLmNwMnksXG4gICAgZmxpcCA/IHRhcmdldC5jcDJ4IDogdGFyZ2V0LmNwMXgsXG4gICAgZmxpcCA/IHRhcmdldC5jcDJ5IDogdGFyZ2V0LmNwMXksXG4gICAgdGFyZ2V0LngsXG4gICAgdGFyZ2V0LnkpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0ZXh0IG9udG8gdGhlIGNhbnZhc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVGV4dChjdHgsIHRleHQsIHgsIHksIGZvbnQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBsaW5lcyA9IGlzQXJyYXkodGV4dCkgPyB0ZXh0IDogW3RleHRdO1xuICBjb25zdCBzdHJva2UgPSBvcHRzLnN0cm9rZVdpZHRoID4gMCAmJiBvcHRzLnN0cm9rZUNvbG9yICE9PSAnJztcbiAgbGV0IGksIGxpbmU7XG5cbiAgY3R4LnNhdmUoKTtcbiAgY3R4LmZvbnQgPSBmb250LnN0cmluZztcbiAgc2V0UmVuZGVyT3B0cyhjdHgsIG9wdHMpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgIGxpbmUgPSBsaW5lc1tpXTtcblxuICAgIGlmIChvcHRzLmJhY2tkcm9wKSB7XG4gICAgICBkcmF3QmFja2Ryb3AoY3R4LCBvcHRzLmJhY2tkcm9wKTtcbiAgICB9XG5cbiAgICBpZiAoc3Ryb2tlKSB7XG4gICAgICBpZiAob3B0cy5zdHJva2VDb2xvcikge1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBvcHRzLnN0cm9rZUNvbG9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWYob3B0cy5zdHJva2VXaWR0aCkpIHtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IG9wdHMuc3Ryb2tlV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGN0eC5zdHJva2VUZXh0KGxpbmUsIHgsIHksIG9wdHMubWF4V2lkdGgpO1xuICAgIH1cblxuICAgIGN0eC5maWxsVGV4dChsaW5lLCB4LCB5LCBvcHRzLm1heFdpZHRoKTtcbiAgICBkZWNvcmF0ZVRleHQoY3R4LCB4LCB5LCBsaW5lLCBvcHRzKTtcblxuICAgIHkgKz0gZm9udC5saW5lSGVpZ2h0O1xuICB9XG5cbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gc2V0UmVuZGVyT3B0cyhjdHgsIG9wdHMpIHtcbiAgaWYgKG9wdHMudHJhbnNsYXRpb24pIHtcbiAgICBjdHgudHJhbnNsYXRlKG9wdHMudHJhbnNsYXRpb25bMF0sIG9wdHMudHJhbnNsYXRpb25bMV0pO1xuICB9XG5cbiAgaWYgKCFpc051bGxPclVuZGVmKG9wdHMucm90YXRpb24pKSB7XG4gICAgY3R4LnJvdGF0ZShvcHRzLnJvdGF0aW9uKTtcbiAgfVxuXG4gIGlmIChvcHRzLmNvbG9yKSB7XG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdHMuY29sb3I7XG4gIH1cblxuICBpZiAob3B0cy50ZXh0QWxpZ24pIHtcbiAgICBjdHgudGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ247XG4gIH1cblxuICBpZiAob3B0cy50ZXh0QmFzZWxpbmUpIHtcbiAgICBjdHgudGV4dEJhc2VsaW5lID0gb3B0cy50ZXh0QmFzZWxpbmU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb3JhdGVUZXh0KGN0eCwgeCwgeSwgbGluZSwgb3B0cykge1xuICBpZiAob3B0cy5zdHJpa2V0aHJvdWdoIHx8IG9wdHMudW5kZXJsaW5lKSB7XG4gICAgLyoqXG4gICAgICogTm93IHRoYXQgSUUxMSBzdXBwb3J0IGhhcyBiZWVuIGRyb3BwZWQsIHdlIGNhbiB1c2UgbW9yZVxuICAgICAqIG9mIHRoZSBUZXh0TWV0cmljcyBvYmplY3QuIFRoZSBhY3R1YWwgYm91bmRpbmcgYm94ZXNcbiAgICAgKiBhcmUgdW5mbGFnZ2VkIGluIENocm9tZSwgRmlyZWZveCwgRWRnZSwgYW5kIFNhZmFyaSBzbyB0aGV5XG4gICAgICogY2FuIGJlIHNhZmVseSB1c2VkLlxuICAgICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dE1ldHJpY3MjQnJvd3Nlcl9jb21wYXRpYmlsaXR5XG4gICAgICovXG4gICAgY29uc3QgbWV0cmljcyA9IGN0eC5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICBjb25zdCBsZWZ0ID0geCAtIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hMZWZ0O1xuICAgIGNvbnN0IHJpZ2h0ID0geCArIG1ldHJpY3MuYWN0dWFsQm91bmRpbmdCb3hSaWdodDtcbiAgICBjb25zdCB0b3AgPSB5IC0gbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDtcbiAgICBjb25zdCBib3R0b20gPSB5ICsgbWV0cmljcy5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQ7XG4gICAgY29uc3QgeURlY29yYXRpb24gPSBvcHRzLnN0cmlrZXRocm91Z2ggPyAodG9wICsgYm90dG9tKSAvIDIgOiBib3R0b207XG5cbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjdHguZmlsbFN0eWxlO1xuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubGluZVdpZHRoID0gb3B0cy5kZWNvcmF0aW9uV2lkdGggfHwgMjtcbiAgICBjdHgubW92ZVRvKGxlZnQsIHlEZWNvcmF0aW9uKTtcbiAgICBjdHgubGluZVRvKHJpZ2h0LCB5RGVjb3JhdGlvbik7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZHJvcChjdHgsIG9wdHMpIHtcbiAgY29uc3Qgb2xkQ29sb3IgPSBjdHguZmlsbFN0eWxlO1xuXG4gIGN0eC5maWxsU3R5bGUgPSBvcHRzLmNvbG9yO1xuICBjdHguZmlsbFJlY3Qob3B0cy5sZWZ0LCBvcHRzLnRvcCwgb3B0cy53aWR0aCwgb3B0cy5oZWlnaHQpO1xuICBjdHguZmlsbFN0eWxlID0gb2xkQ29sb3I7XG59XG5cbi8qKlxuICogQWRkIGEgcGF0aCBvZiBhIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVycyB0byB0aGUgY3VycmVudCBzdWItcGF0aFxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCBDb250ZXh0XG4gKiBAcGFyYW0geyp9IHJlY3QgQm91bmRpbmcgcmVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwgcmVjdCkge1xuICBjb25zdCB7eCwgeSwgdywgaCwgcmFkaXVzfSA9IHJlY3Q7XG5cbiAgLy8gdG9wIGxlZnQgYXJjXG4gIGN0eC5hcmMoeCArIHJhZGl1cy50b3BMZWZ0LCB5ICsgcmFkaXVzLnRvcExlZnQsIHJhZGl1cy50b3BMZWZ0LCAtSEFMRl9QSSwgUEksIHRydWUpO1xuXG4gIC8vIGxpbmUgZnJvbSB0b3AgbGVmdCB0byBib3R0b20gbGVmdFxuICBjdHgubGluZVRvKHgsIHkgKyBoIC0gcmFkaXVzLmJvdHRvbUxlZnQpO1xuXG4gIC8vIGJvdHRvbSBsZWZ0IGFyY1xuICBjdHguYXJjKHggKyByYWRpdXMuYm90dG9tTGVmdCwgeSArIGggLSByYWRpdXMuYm90dG9tTGVmdCwgcmFkaXVzLmJvdHRvbUxlZnQsIFBJLCBIQUxGX1BJLCB0cnVlKTtcblxuICAvLyBsaW5lIGZyb20gYm90dG9tIGxlZnQgdG8gYm90dG9tIHJpZ2h0XG4gIGN0eC5saW5lVG8oeCArIHcgLSByYWRpdXMuYm90dG9tUmlnaHQsIHkgKyBoKTtcblxuICAvLyBib3R0b20gcmlnaHQgYXJjXG4gIGN0eC5hcmMoeCArIHcgLSByYWRpdXMuYm90dG9tUmlnaHQsIHkgKyBoIC0gcmFkaXVzLmJvdHRvbVJpZ2h0LCByYWRpdXMuYm90dG9tUmlnaHQsIEhBTEZfUEksIDAsIHRydWUpO1xuXG4gIC8vIGxpbmUgZnJvbSBib3R0b20gcmlnaHQgdG8gdG9wIHJpZ2h0XG4gIGN0eC5saW5lVG8oeCArIHcsIHkgKyByYWRpdXMudG9wUmlnaHQpO1xuXG4gIC8vIHRvcCByaWdodCBhcmNcbiAgY3R4LmFyYyh4ICsgdyAtIHJhZGl1cy50b3BSaWdodCwgeSArIHJhZGl1cy50b3BSaWdodCwgcmFkaXVzLnRvcFJpZ2h0LCAwLCAtSEFMRl9QSSwgdHJ1ZSk7XG5cbiAgLy8gbGluZSBmcm9tIHRvcCByaWdodCB0byB0b3AgbGVmdFxuICBjdHgubGluZVRvKHggKyByYWRpdXMudG9wTGVmdCwgeSk7XG59XG4iLCAiaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4uL2NvcmUvY29yZS5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzT2JqZWN0LCB0b0RpbWVuc2lvbiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4vaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7UG9pbnQsIHRvRm9udFN0cmluZ30gZnJvbSAnLi9oZWxwZXJzLmNhbnZhcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhcnRBcmVhLCBGb250U3BlY30gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1RSQkwsIFRSQkxDb3JuZXJzfSBmcm9tICcuLi90eXBlcy9nZW9tZXRyaWMuanMnO1xuXG5jb25zdCBMSU5FX0hFSUdIVCA9IC9eKG5vcm1hbHwoXFxkKyg/OlxcLlxcZCspPykocHh8ZW18JSk/KSQvO1xuY29uc3QgRk9OVF9TVFlMRSA9IC9eKG5vcm1hbHxpdGFsaWN8aW5pdGlhbHxpbmhlcml0fHVuc2V0fChvYmxpcXVlKCAtP1swLTldP1swLTldZGVnKT8pKSQvO1xuXG4vKipcbiAqIEBhbGlhcyBDaGFydC5oZWxwZXJzLm9wdGlvbnNcbiAqIEBuYW1lc3BhY2VcbiAqL1xuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbGluZSBoZWlnaHQgYHZhbHVlYCBpbiBwaXhlbHMgZm9yIGEgc3BlY2lmaWMgZm9udCBgc2l6ZWAuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgbGluZUhlaWdodCB0byBwYXJzZSAoZWcuIDEuNiwgJzE0cHgnLCAnNzUlJywgJzEuNmVtJykuXG4gKiBAcGFyYW0gc2l6ZSAtIFRoZSBmb250IHNpemUgKGluIHBpeGVscykgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIGB2YWx1ZWAuXG4gKiBAcmV0dXJucyBUaGUgZWZmZWN0aXZlIGxpbmUgaGVpZ2h0IGluIHBpeGVscyAoc2l6ZSAqIDEuMiBpZiB2YWx1ZSBpcyBpbnZhbGlkKS5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmUtaGVpZ2h0XG4gKiBAc2luY2UgMi43LjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGluZUhlaWdodCh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nLCBzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBtYXRjaGVzID0gKCcnICsgdmFsdWUpLm1hdGNoKExJTkVfSEVJR0hUKTtcbiAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXNbMV0gPT09ICdub3JtYWwnKSB7XG4gICAgcmV0dXJuIHNpemUgKiAxLjI7XG4gIH1cblxuICB2YWx1ZSA9ICttYXRjaGVzWzJdO1xuXG4gIHN3aXRjaCAobWF0Y2hlc1szXSkge1xuICAgIGNhc2UgJ3B4JzpcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICBjYXNlICclJzpcbiAgICAgIHZhbHVlIC89IDEwMDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBzaXplICogdmFsdWU7XG59XG5cbmNvbnN0IG51bWJlck9yWmVybyA9ICh2OiB1bmtub3duKSA9PiArdiB8fCAwO1xuXG4vKipcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHByb3BzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVhZFZhbHVlVG9Qcm9wczxLIGV4dGVuZHMgc3RyaW5nPih2YWx1ZTogbnVtYmVyIHwgUmVjb3JkPEssIG51bWJlcj4sIHByb3BzOiBLW10pOiBSZWNvcmQ8SywgbnVtYmVyPjtcbmV4cG9ydCBmdW5jdGlvbiBfcmVhZFZhbHVlVG9Qcm9wczxLIGV4dGVuZHMgc3RyaW5nLCBUIGV4dGVuZHMgc3RyaW5nPih2YWx1ZTogbnVtYmVyIHwgUmVjb3JkPEsgJiBULCBudW1iZXI+LCBwcm9wczogUmVjb3JkPFQsIEs+KTogUmVjb3JkPFQsIG51bWJlcj47XG5leHBvcnQgZnVuY3Rpb24gX3JlYWRWYWx1ZVRvUHJvcHModmFsdWU6IG51bWJlciB8IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIHByb3BzOiBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGNvbnN0IG9ialByb3BzID0gaXNPYmplY3QocHJvcHMpO1xuICBjb25zdCBrZXlzID0gb2JqUHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykgOiBwcm9wcztcbiAgY29uc3QgcmVhZCA9IGlzT2JqZWN0KHZhbHVlKVxuICAgID8gb2JqUHJvcHNcbiAgICAgID8gcHJvcCA9PiB2YWx1ZU9yRGVmYXVsdCh2YWx1ZVtwcm9wXSwgdmFsdWVbcHJvcHNbcHJvcF1dKVxuICAgICAgOiBwcm9wID0+IHZhbHVlW3Byb3BdXG4gICAgOiAoKSA9PiB2YWx1ZTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cykge1xuICAgIHJldFtwcm9wXSA9IG51bWJlck9yWmVybyhyZWFkKHByb3ApKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGEgVFJCTCBvYmplY3QuXG4gKiBAcGFyYW0gdmFsdWUgLSBJZiBhIG51bWJlciwgc2V0IHRoZSB2YWx1ZSB0byBhbGwgVFJCTCBjb21wb25lbnQsXG4gKiAgZWxzZSwgaWYgYW4gb2JqZWN0LCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCBzZXRzIHVuZGVmaW5lZCBvbmVzIHRvIDAuXG4gKiAgeCAvIHkgYXJlIHNob3J0aGFuZHMgZm9yIHNhbWUgdmFsdWUgZm9yIGxlZnQvcmlnaHQgYW5kIHRvcC9ib3R0b20uXG4gKiBAcmV0dXJucyBUaGUgcGFkZGluZyB2YWx1ZXMgKHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdClcbiAqIEBzaW5jZSAzLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UUkJMKHZhbHVlOiBudW1iZXIgfCBUUkJMIHwgUG9pbnQpIHtcbiAgcmV0dXJuIF9yZWFkVmFsdWVUb1Byb3BzKHZhbHVlLCB7dG9wOiAneScsIHJpZ2h0OiAneCcsIGJvdHRvbTogJ3knLCBsZWZ0OiAneCd9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIFRSQkwgY29ybmVycyBvYmplY3QgKHNpbWlsYXIgd2l0aCBjc3MgYm9yZGVyLXJhZGl1cykuXG4gKiBAcGFyYW0gdmFsdWUgLSBJZiBhIG51bWJlciwgc2V0IHRoZSB2YWx1ZSB0byBhbGwgVFJCTCBjb3JuZXIgY29tcG9uZW50cyxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqIEByZXR1cm5zIFRoZSBUUkJMIGNvcm5lciB2YWx1ZXMgKHRvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodClcbiAqIEBzaW5jZSAzLjAuMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9UUkJMQ29ybmVycyh2YWx1ZTogbnVtYmVyIHwgVFJCTENvcm5lcnMpIHtcbiAgcmV0dXJuIF9yZWFkVmFsdWVUb1Byb3BzKHZhbHVlLCBbJ3RvcExlZnQnLCAndG9wUmlnaHQnLCAnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCddKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cbiAqIEBwYXJhbSB2YWx1ZSAtIElmIGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIGFsbCBUUkJMIGNvbXBvbmVudCxcbiAqICBlbHNlLCBpZiBhbiBvYmplY3QsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHNldHMgdW5kZWZpbmVkIG9uZXMgdG8gMC5cbiAqICB4IC8geSBhcmUgc2hvcnRoYW5kcyBmb3Igc2FtZSB2YWx1ZSBmb3IgbGVmdC9yaWdodCBhbmQgdG9wL2JvdHRvbS5cbiAqIEByZXR1cm5zIFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KVxuICogQHNpbmNlIDIuNy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BhZGRpbmcodmFsdWU/OiBudW1iZXIgfCBUUkJMKTogQ2hhcnRBcmVhIHtcbiAgY29uc3Qgb2JqID0gdG9UUkJMKHZhbHVlKSBhcyBDaGFydEFyZWE7XG5cbiAgb2JqLndpZHRoID0gb2JqLmxlZnQgKyBvYmoucmlnaHQ7XG4gIG9iai5oZWlnaHQgPSBvYmoudG9wICsgb2JqLmJvdHRvbTtcblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbnZhc0ZvbnRTcGVjIGV4dGVuZHMgRm9udFNwZWMge1xuICBzdHJpbmc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJzZXMgZm9udCBvcHRpb25zIGFuZCByZXR1cm5zIHRoZSBmb250IG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQSBvYmplY3QgdGhhdCBjb250YWlucyBmb250IG9wdGlvbnMgdG8gYmUgcGFyc2VkLlxuICogQHBhcmFtIGZhbGxiYWNrIC0gQSBvYmplY3QgdGhhdCBjb250YWlucyBmYWxsYmFjayBmb250IG9wdGlvbnMuXG4gKiBAcmV0dXJuIFRoZSBmb250IG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRm9udChvcHRpb25zOiBQYXJ0aWFsPEZvbnRTcGVjPiwgZmFsbGJhY2s/OiBQYXJ0aWFsPEZvbnRTcGVjPikge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgZmFsbGJhY2sgPSBmYWxsYmFjayB8fCBkZWZhdWx0cy5mb250IGFzIEZvbnRTcGVjO1xuXG4gIGxldCBzaXplID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5zaXplLCBmYWxsYmFjay5zaXplKTtcblxuICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgc2l6ZSA9IHBhcnNlSW50KHNpemUsIDEwKTtcbiAgfVxuICBsZXQgc3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnN0eWxlLCBmYWxsYmFjay5zdHlsZSk7XG4gIGlmIChzdHlsZSAmJiAhKCcnICsgc3R5bGUpLm1hdGNoKEZPTlRfU1RZTEUpKSB7XG4gICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGZvbnQgc3R5bGUgc3BlY2lmaWVkOiBcIicgKyBzdHlsZSArICdcIicpO1xuICAgIHN0eWxlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZm9udCA9IHtcbiAgICBmYW1pbHk6IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuZmFtaWx5LCBmYWxsYmFjay5mYW1pbHkpLFxuICAgIGxpbmVIZWlnaHQ6IHRvTGluZUhlaWdodCh2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmxpbmVIZWlnaHQsIGZhbGxiYWNrLmxpbmVIZWlnaHQpLCBzaXplKSxcbiAgICBzaXplLFxuICAgIHN0eWxlLFxuICAgIHdlaWdodDogdmFsdWVPckRlZmF1bHQob3B0aW9ucy53ZWlnaHQsIGZhbGxiYWNrLndlaWdodCksXG4gICAgc3RyaW5nOiAnJ1xuICB9O1xuXG4gIGZvbnQuc3RyaW5nID0gdG9Gb250U3RyaW5nKGZvbnQpO1xuICByZXR1cm4gZm9udDtcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGBpbnB1dHNgIHNlcXVlbnRpYWxseSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZGVmaW5lZCB2YWx1ZS5cbiAqIEBwYXJhbSBpbnB1dHMgLSBBbiBhcnJheSBvZiB2YWx1ZXMsIGZhbGxpbmcgYmFjayB0byB0aGUgbGFzdCB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gSWYgZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBmdW5jdGlvbiwgdGhlIHZhbHVlXG4gKiBpcyBjYWxsZWQgd2l0aCBgY29udGV4dGAgYXMgZmlyc3QgYXJndW1lbnQgYW5kIHRoZSByZXN1bHQgYmVjb21lcyB0aGUgbmV3IGlucHV0LlxuICogQHBhcmFtIGluZGV4IC0gSWYgZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYW4gYXJyYXksIHRoZSB2YWx1ZVxuICogYXQgYGluZGV4YCBiZWNvbWUgdGhlIG5ldyBpbnB1dC5cbiAqIEBwYXJhbSBpbmZvIC0gb2JqZWN0IHRvIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCByZXNvbHV0aW9uIGluXG4gKiBAcGFyYW0gaW5mby5jYWNoZWFibGUgLSBXaWxsIGJlIHNldCB0byBgZmFsc2VgIGlmIG9wdGlvbiBpcyBub3QgY2FjaGVhYmxlLlxuICogQHNpbmNlIDIuNy4wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGlucHV0czogQXJyYXk8dW5rbm93bj4sIGNvbnRleHQ/OiBvYmplY3QsIGluZGV4PzogbnVtYmVyLCBpbmZvPzogeyBjYWNoZWFibGU6IGJvb2xlYW4gfSkge1xuICBsZXQgY2FjaGVhYmxlID0gdHJ1ZTtcbiAgbGV0IGk6IG51bWJlciwgaWxlbjogbnVtYmVyLCB2YWx1ZTogdW5rbm93bjtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gaW5wdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgIHZhbHVlID0gaW5wdXRzW2ldO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUoY29udGV4dCk7XG4gICAgICBjYWNoZWFibGUgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWVbaW5kZXggJSB2YWx1ZS5sZW5ndGhdO1xuICAgICAgY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaW5mbyAmJiAhY2FjaGVhYmxlKSB7XG4gICAgICAgIGluZm8uY2FjaGVhYmxlID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIG1pbm1heFxuICogQHBhcmFtIGdyYWNlXG4gKiBAcGFyYW0gYmVnaW5BdFplcm9cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYWRkR3JhY2UobWlubWF4OiB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlcjsgfSwgZ3JhY2U6IG51bWJlciB8IHN0cmluZywgYmVnaW5BdFplcm86IGJvb2xlYW4pIHtcbiAgY29uc3Qge21pbiwgbWF4fSA9IG1pbm1heDtcbiAgY29uc3QgY2hhbmdlID0gdG9EaW1lbnNpb24oZ3JhY2UsIChtYXggLSBtaW4pIC8gMik7XG4gIGNvbnN0IGtlZXBaZXJvID0gKHZhbHVlOiBudW1iZXIsIGFkZDogbnVtYmVyKSA9PiBiZWdpbkF0WmVybyAmJiB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSArIGFkZDtcbiAgcmV0dXJuIHtcbiAgICBtaW46IGtlZXBaZXJvKG1pbiwgLU1hdGguYWJzKGNoYW5nZSkpLFxuICAgIG1heDoga2VlcFplcm8obWF4LCBjaGFuZ2UpXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29udGV4dCBpbmhlcml0aW5nIHBhcmVudENvbnRleHRcbiAqIEBwYXJhbSBwYXJlbnRDb250ZXh0XG4gKiBAcGFyYW0gY29udGV4dFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCBleHRlbmRzIG9iamVjdD4ocGFyZW50Q29udGV4dDogbnVsbCwgY29udGV4dDogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dDxUIGV4dGVuZHMgb2JqZWN0LCBQIGV4dGVuZHMgVD4ocGFyZW50Q29udGV4dDogUCwgY29udGV4dDogVCk6IFAgJiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQocGFyZW50Q29udGV4dDogb2JqZWN0LCBjb250ZXh0OiBvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShwYXJlbnRDb250ZXh0KSwgY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHtkZWZpbmVkLCBpc0FycmF5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgcmVzb2x2ZU9iamVjdEtleSwgX2NhcGl0YWxpemV9IGZyb20gJy4vaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJveHkgZm9yIHJlc29sdmluZyByYXcgdmFsdWVzIGZvciBvcHRpb25zLlxuICogQHBhcmFtIHtvYmplY3RbXX0gc2NvcGVzIC0gVGhlIG9wdGlvbiBzY29wZXMgdG8gbG9vayBmb3IgdmFsdWVzLCBpbiByZXNvbHV0aW9uIG9yZGVyXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbcHJlZml4ZXNdIC0gVGhlIHByZWZpeGVzIGZvciB2YWx1ZXMsIGluIHJlc29sdXRpb24gb3JkZXIuXG4gKiBAcGFyYW0ge29iamVjdFtdfSBbcm9vdFNjb3Blc10gLSBUaGUgcm9vdCBvcHRpb24gc2NvcGVzXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbZmFsbGJhY2tdIC0gUGFyZW50IHNjb3BlcyBmYWxsYmFja1xuICogQHBhcmFtIHtmdW5jdGlvbn0gW2dldFRhcmdldF0gLSBjYWxsYmFjayBmb3IgZ2V0dGluZyB0aGUgdGFyZ2V0IGZvciBjaGFuZ2VkIHZhbHVlc1xuICogQHJldHVybnMgUHJveHlcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCBwcmVmaXhlcyA9IFsnJ10sIHJvb3RTY29wZXMgPSBzY29wZXMsIGZhbGxiYWNrLCBnZXRUYXJnZXQgPSAoKSA9PiBzY29wZXNbMF0pIHtcbiAgaWYgKCFkZWZpbmVkKGZhbGxiYWNrKSkge1xuICAgIGZhbGxiYWNrID0gX3Jlc29sdmUoJ19mYWxsYmFjaycsIHNjb3Blcyk7XG4gIH1cbiAgY29uc3QgY2FjaGUgPSB7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdPYmplY3QnLFxuICAgIF9jYWNoZWFibGU6IHRydWUsXG4gICAgX3Njb3Blczogc2NvcGVzLFxuICAgIF9yb290U2NvcGVzOiByb290U2NvcGVzLFxuICAgIF9mYWxsYmFjazogZmFsbGJhY2ssXG4gICAgX2dldFRhcmdldDogZ2V0VGFyZ2V0LFxuICAgIG92ZXJyaWRlOiAoc2NvcGUpID0+IF9jcmVhdGVSZXNvbHZlcihbc2NvcGUsIC4uLnNjb3Blc10sIHByZWZpeGVzLCByb290U2NvcGVzLCBmYWxsYmFjayksXG4gIH07XG4gIHJldHVybiBuZXcgUHJveHkoY2FjaGUsIHtcbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHRoZSBkZWxldGUgb3BlcmF0b3IuXG4gICAgICovXG4gICAgZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKSB7XG4gICAgICBkZWxldGUgdGFyZ2V0W3Byb3BdOyAvLyByZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgZGVsZXRlIHRhcmdldC5fa2V5czsgLy8gcmVtb3ZlIGNhY2hlZCBrZXlzXG4gICAgICBkZWxldGUgc2NvcGVzWzBdW3Byb3BdOyAvLyByZW1vdmUgZnJvbSB0b3AgbGV2ZWwgc2NvcGVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIGdldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqL1xuICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBfY2FjaGVkKHRhcmdldCwgcHJvcCxcbiAgICAgICAgKCkgPT4gX3Jlc29sdmVXaXRoUHJlZml4ZXMocHJvcCwgcHJlZml4ZXMsIHNjb3BlcywgdGFyZ2V0KSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvci5cbiAgICAgKiBBbHNvIHVzZWQgYnkgT2JqZWN0Lmhhc093blByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuX3Njb3Blc1swXSwgcHJvcCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mLlxuICAgICAqL1xuICAgIGdldFByb3RvdHlwZU9mKCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0UHJvdG90eXBlT2Yoc2NvcGVzWzBdKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgaW4gb3BlcmF0b3IuXG4gICAgICovXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIGdldEtleXNGcm9tQWxsU2NvcGVzKHRhcmdldCkuaW5jbHVkZXMocHJvcCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgYW5kIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMuXG4gICAgICovXG4gICAgb3duS2V5cyh0YXJnZXQpIHtcbiAgICAgIHJldHVybiBnZXRLZXlzRnJvbUFsbFNjb3Blcyh0YXJnZXQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIHNldHRpbmcgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqL1xuICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gdGFyZ2V0Ll9zdG9yYWdlIHx8ICh0YXJnZXQuX3N0b3JhZ2UgPSBnZXRUYXJnZXQoKSk7XG4gICAgICB0YXJnZXRbcHJvcF0gPSBzdG9yYWdlW3Byb3BdID0gdmFsdWU7IC8vIHNldCB0byB0b3AgbGV2ZWwgc2NvcGUgKyBjYWNoZVxuICAgICAgZGVsZXRlIHRhcmdldC5fa2V5czsgLy8gcmVtb3ZlIGNhY2hlZCBrZXlzXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gUHJveHkgZm9yIHJlc29sdmluZyBvcHRpb24gdmFsdWVzIHdpdGggY29udGV4dC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm94eSAtIFRoZSBQcm94eSByZXR1cm5lZCBieSBgX2NyZWF0ZVJlc29sdmVyYFxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgLSBDb250ZXh0IG9iamVjdCBmb3Igc2NyaXB0YWJsZS9pbmRleGFibGUgb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IFtzdWJQcm94eV0gLSBUaGUgcHJveHkgcHJvdmlkZWQgZm9yIHNjcmlwdGFibGUgb3B0aW9uc1xuICogQHBhcmFtIHt7c2NyaXB0YWJsZTogYm9vbGVhbiwgaW5kZXhhYmxlOiBib29sZWFuLCBhbGxLZXlzPzogYm9vbGVhbn19IFtkZXNjcmlwdG9yRGVmYXVsdHNdIC0gRGVmYXVsdHMgZm9yIGRlc2NyaXB0b3JzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2F0dGFjaENvbnRleHQocHJveHksIGNvbnRleHQsIHN1YlByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpIHtcbiAgY29uc3QgY2FjaGUgPSB7XG4gICAgX2NhY2hlYWJsZTogZmFsc2UsXG4gICAgX3Byb3h5OiBwcm94eSxcbiAgICBfY29udGV4dDogY29udGV4dCxcbiAgICBfc3ViUHJveHk6IHN1YlByb3h5LFxuICAgIF9zdGFjazogbmV3IFNldCgpLFxuICAgIF9kZXNjcmlwdG9yczogX2Rlc2NyaXB0b3JzKHByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpLFxuICAgIHNldENvbnRleHQ6IChjdHgpID0+IF9hdHRhY2hDb250ZXh0KHByb3h5LCBjdHgsIHN1YlByb3h5LCBkZXNjcmlwdG9yRGVmYXVsdHMpLFxuICAgIG92ZXJyaWRlOiAoc2NvcGUpID0+IF9hdHRhY2hDb250ZXh0KHByb3h5Lm92ZXJyaWRlKHNjb3BlKSwgY29udGV4dCwgc3ViUHJveHksIGRlc2NyaXB0b3JEZWZhdWx0cylcbiAgfTtcbiAgcmV0dXJuIG5ldyBQcm94eShjYWNoZSwge1xuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRvci5cbiAgICAgKi9cbiAgICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApIHtcbiAgICAgIGRlbGV0ZSB0YXJnZXRbcHJvcF07IC8vIHJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICBkZWxldGUgcHJveHlbcHJvcF07IC8vIHJlbW92ZSBmcm9tIHByb3h5XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBnZXR0aW5nIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKi9cbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgcmV0dXJuIF9jYWNoZWQodGFyZ2V0LCBwcm9wLFxuICAgICAgICAoKSA9PiBfcmVzb2x2ZVdpdGhDb250ZXh0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLlxuICAgICAqIEFsc28gdXNlZCBieSBPYmplY3QuaGFzT3duUHJvcGVydHkuXG4gICAgICovXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIHRhcmdldC5fZGVzY3JpcHRvcnMuYWxsS2V5c1xuICAgICAgICA/IFJlZmxlY3QuaGFzKHByb3h5LCBwcm9wKSA/IHtlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWV9IDogdW5kZWZpbmVkXG4gICAgICAgIDogUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJveHksIHByb3ApO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBIHRyYXAgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZi5cbiAgICAgKi9cbiAgICBnZXRQcm90b3R5cGVPZigpIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHByb3h5KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciB0aGUgaW4gb3BlcmF0b3IuXG4gICAgICovXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKHByb3h5LCBwcm9wKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSB0cmFwIGZvciBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyBhbmQgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scy5cbiAgICAgKi9cbiAgICBvd25LZXlzKCkge1xuICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhwcm94eSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgdHJhcCBmb3Igc2V0dGluZyBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICovXG4gICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgIHByb3h5W3Byb3BdID0gdmFsdWU7IC8vIHNldCB0byBwcm94eVxuICAgICAgZGVsZXRlIHRhcmdldFtwcm9wXTsgLy8gcmVtb3ZlIGZyb20gY2FjaGVcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9kZXNjcmlwdG9ycyhwcm94eSwgZGVmYXVsdHMgPSB7c2NyaXB0YWJsZTogdHJ1ZSwgaW5kZXhhYmxlOiB0cnVlfSkge1xuICBjb25zdCB7X3NjcmlwdGFibGUgPSBkZWZhdWx0cy5zY3JpcHRhYmxlLCBfaW5kZXhhYmxlID0gZGVmYXVsdHMuaW5kZXhhYmxlLCBfYWxsS2V5cyA9IGRlZmF1bHRzLmFsbEtleXN9ID0gcHJveHk7XG4gIHJldHVybiB7XG4gICAgYWxsS2V5czogX2FsbEtleXMsXG4gICAgc2NyaXB0YWJsZTogX3NjcmlwdGFibGUsXG4gICAgaW5kZXhhYmxlOiBfaW5kZXhhYmxlLFxuICAgIGlzU2NyaXB0YWJsZTogaXNGdW5jdGlvbihfc2NyaXB0YWJsZSkgPyBfc2NyaXB0YWJsZSA6ICgpID0+IF9zY3JpcHRhYmxlLFxuICAgIGlzSW5kZXhhYmxlOiBpc0Z1bmN0aW9uKF9pbmRleGFibGUpID8gX2luZGV4YWJsZSA6ICgpID0+IF9pbmRleGFibGVcbiAgfTtcbn1cblxuY29uc3QgcmVhZEtleSA9IChwcmVmaXgsIG5hbWUpID0+IHByZWZpeCA/IHByZWZpeCArIF9jYXBpdGFsaXplKG5hbWUpIDogbmFtZTtcbmNvbnN0IG5lZWRzU3ViUmVzb2x2ZXIgPSAocHJvcCwgdmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSAmJiBwcm9wICE9PSAnYWRhcHRlcnMnICYmXG4gIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBudWxsIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpO1xuXG5mdW5jdGlvbiBfY2FjaGVkKHRhcmdldCwgcHJvcCwgcmVzb2x2ZSkge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSByZXNvbHZlKCk7XG4gIC8vIGNhY2hlIHRoZSByZXNvbHZlZCB2YWx1ZVxuICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZVdpdGhDb250ZXh0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgY29uc3Qge19wcm94eSwgX2NvbnRleHQsIF9zdWJQcm94eSwgX2Rlc2NyaXB0b3JzOiBkZXNjcmlwdG9yc30gPSB0YXJnZXQ7XG4gIGxldCB2YWx1ZSA9IF9wcm94eVtwcm9wXTsgLy8gcmVzb2x2ZSBmcm9tIHByb3h5XG5cbiAgLy8gcmVzb2x2ZSB3aXRoIGNvbnRleHRcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpICYmIGRlc2NyaXB0b3JzLmlzU2NyaXB0YWJsZShwcm9wKSkge1xuICAgIHZhbHVlID0gX3Jlc29sdmVTY3JpcHRhYmxlKHByb3AsIHZhbHVlLCB0YXJnZXQsIHJlY2VpdmVyKTtcbiAgfVxuICBpZiAoaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgdmFsdWUgPSBfcmVzb2x2ZUFycmF5KHByb3AsIHZhbHVlLCB0YXJnZXQsIGRlc2NyaXB0b3JzLmlzSW5kZXhhYmxlKTtcbiAgfVxuICBpZiAobmVlZHNTdWJSZXNvbHZlcihwcm9wLCB2YWx1ZSkpIHtcbiAgICAvLyBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYW4gb2JqZWN0LCBjcmVhdGUgYSBzdWIgcmVzb2x2ZXIgZm9yIGl0XG4gICAgdmFsdWUgPSBfYXR0YWNoQ29udGV4dCh2YWx1ZSwgX2NvbnRleHQsIF9zdWJQcm94eSAmJiBfc3ViUHJveHlbcHJvcF0sIGRlc2NyaXB0b3JzKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlU2NyaXB0YWJsZShwcm9wLCB2YWx1ZSwgdGFyZ2V0LCByZWNlaXZlcikge1xuICBjb25zdCB7X3Byb3h5LCBfY29udGV4dCwgX3N1YlByb3h5LCBfc3RhY2t9ID0gdGFyZ2V0O1xuICBpZiAoX3N0YWNrLmhhcyhwcm9wKSkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY3Vyc2lvbiBkZXRlY3RlZDogJyArIEFycmF5LmZyb20oX3N0YWNrKS5qb2luKCctPicpICsgJy0+JyArIHByb3ApO1xuICB9XG4gIF9zdGFjay5hZGQocHJvcCk7XG4gIHZhbHVlID0gdmFsdWUoX2NvbnRleHQsIF9zdWJQcm94eSB8fCByZWNlaXZlcik7XG4gIF9zdGFjay5kZWxldGUocHJvcCk7XG4gIGlmIChuZWVkc1N1YlJlc29sdmVyKHByb3AsIHZhbHVlKSkge1xuICAgIC8vIFdoZW4gc2NyaXB0YWJsZSBvcHRpb24gcmV0dXJucyBhbiBvYmplY3QsIGNyZWF0ZSBhIHJlc29sdmVyIG9uIHRoYXQuXG4gICAgdmFsdWUgPSBjcmVhdGVTdWJSZXNvbHZlcihfcHJveHkuX3Njb3BlcywgX3Byb3h5LCBwcm9wLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBfcmVzb2x2ZUFycmF5KHByb3AsIHZhbHVlLCB0YXJnZXQsIGlzSW5kZXhhYmxlKSB7XG4gIGNvbnN0IHtfcHJveHksIF9jb250ZXh0LCBfc3ViUHJveHksIF9kZXNjcmlwdG9yczogZGVzY3JpcHRvcnN9ID0gdGFyZ2V0O1xuXG4gIGlmIChkZWZpbmVkKF9jb250ZXh0LmluZGV4KSAmJiBpc0luZGV4YWJsZShwcm9wKSkge1xuICAgIHZhbHVlID0gdmFsdWVbX2NvbnRleHQuaW5kZXggJSB2YWx1ZS5sZW5ndGhdO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlWzBdKSkge1xuICAgIC8vIEFycmF5IG9mIG9iamVjdHMsIHJldHVybiBhcnJheSBvciByZXNvbHZlcnNcbiAgICBjb25zdCBhcnIgPSB2YWx1ZTtcbiAgICBjb25zdCBzY29wZXMgPSBfcHJveHkuX3Njb3Blcy5maWx0ZXIocyA9PiBzICE9PSBhcnIpO1xuICAgIHZhbHVlID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgY29uc3QgcmVzb2x2ZXIgPSBjcmVhdGVTdWJSZXNvbHZlcihzY29wZXMsIF9wcm94eSwgcHJvcCwgaXRlbSk7XG4gICAgICB2YWx1ZS5wdXNoKF9hdHRhY2hDb250ZXh0KHJlc29sdmVyLCBfY29udGV4dCwgX3N1YlByb3h5ICYmIF9zdWJQcm94eVtwcm9wXSwgZGVzY3JpcHRvcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmFsbGJhY2soZmFsbGJhY2ssIHByb3AsIHZhbHVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKGZhbGxiYWNrKSA/IGZhbGxiYWNrKHByb3AsIHZhbHVlKSA6IGZhbGxiYWNrO1xufVxuXG5jb25zdCBnZXRTY29wZSA9IChrZXksIHBhcmVudCkgPT4ga2V5ID09PSB0cnVlID8gcGFyZW50XG4gIDogdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyByZXNvbHZlT2JqZWN0S2V5KHBhcmVudCwga2V5KSA6IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gYWRkU2NvcGVzKHNldCwgcGFyZW50U2NvcGVzLCBrZXksIHBhcmVudEZhbGxiYWNrLCB2YWx1ZSkge1xuICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRTY29wZXMpIHtcbiAgICBjb25zdCBzY29wZSA9IGdldFNjb3BlKGtleSwgcGFyZW50KTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHNldC5hZGQoc2NvcGUpO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSByZXNvbHZlRmFsbGJhY2soc2NvcGUuX2ZhbGxiYWNrLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmIChkZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjayAhPT0ga2V5ICYmIGZhbGxiYWNrICE9PSBwYXJlbnRGYWxsYmFjaykge1xuICAgICAgICAvLyBXaGVuIHdlIHJlYWNoIHRoZSBkZXNjcmlwdG9yIHRoYXQgZGVmaW5lcyBhIG5ldyBfZmFsbGJhY2ssIHJldHVybiB0aGF0LlxuICAgICAgICAvLyBUaGUgZmFsbGJhY2sgd2lsbCByZXN1bWUgdG8gdGhhdCBuZXcgc2NvcGUuXG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNjb3BlID09PSBmYWxzZSAmJiBkZWZpbmVkKHBhcmVudEZhbGxiYWNrKSAmJiBrZXkgIT09IHBhcmVudEZhbGxiYWNrKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBgZmFsc2VgIHJlc3VsdHMgdG8gYGZhbHNlYCwgd2hlbiBmYWxsaW5nIGJhY2sgdG8gZGlmZmVyZW50IGtleS5cbiAgICAgIC8vIEZvciBleGFtcGxlIGBpbnRlcmFjdGlvbmAgZnJvbSBgaG92ZXJgIG9yIGBwbHVnaW5zLnRvb2x0aXBgIGFuZCBgYW5pbWF0aW9uYCBmcm9tIGBhbmltYXRpb25zYFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3ViUmVzb2x2ZXIocGFyZW50U2NvcGVzLCByZXNvbHZlciwgcHJvcCwgdmFsdWUpIHtcbiAgY29uc3Qgcm9vdFNjb3BlcyA9IHJlc29sdmVyLl9yb290U2NvcGVzO1xuICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVGYWxsYmFjayhyZXNvbHZlci5fZmFsbGJhY2ssIHByb3AsIHZhbHVlKTtcbiAgY29uc3QgYWxsU2NvcGVzID0gWy4uLnBhcmVudFNjb3BlcywgLi4ucm9vdFNjb3Blc107XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoKTtcbiAgc2V0LmFkZCh2YWx1ZSk7XG4gIGxldCBrZXkgPSBhZGRTY29wZXNGcm9tS2V5KHNldCwgYWxsU2NvcGVzLCBwcm9wLCBmYWxsYmFjayB8fCBwcm9wLCB2YWx1ZSk7XG4gIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrICE9PSBwcm9wKSB7XG4gICAga2V5ID0gYWRkU2NvcGVzRnJvbUtleShzZXQsIGFsbFNjb3BlcywgZmFsbGJhY2ssIGtleSwgdmFsdWUpO1xuICAgIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9jcmVhdGVSZXNvbHZlcihBcnJheS5mcm9tKHNldCksIFsnJ10sIHJvb3RTY29wZXMsIGZhbGxiYWNrLFxuICAgICgpID0+IHN1YkdldFRhcmdldChyZXNvbHZlciwgcHJvcCwgdmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gYWRkU2NvcGVzRnJvbUtleShzZXQsIGFsbFNjb3Blcywga2V5LCBmYWxsYmFjaywgaXRlbSkge1xuICB3aGlsZSAoa2V5KSB7XG4gICAga2V5ID0gYWRkU2NvcGVzKHNldCwgYWxsU2NvcGVzLCBrZXksIGZhbGxiYWNrLCBpdGVtKTtcbiAgfVxuICByZXR1cm4ga2V5O1xufVxuXG5mdW5jdGlvbiBzdWJHZXRUYXJnZXQocmVzb2x2ZXIsIHByb3AsIHZhbHVlKSB7XG4gIGNvbnN0IHBhcmVudCA9IHJlc29sdmVyLl9nZXRUYXJnZXQoKTtcbiAgaWYgKCEocHJvcCBpbiBwYXJlbnQpKSB7XG4gICAgcGFyZW50W3Byb3BdID0ge307XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gcGFyZW50W3Byb3BdO1xuICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIC8vIEZvciBhcnJheSBvZiBvYmplY3RzLCB0aGUgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdXBkYXRlZCB2YWx1ZXNcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHRhcmdldCB8fCB7fTtcbn1cblxuZnVuY3Rpb24gX3Jlc29sdmVXaXRoUHJlZml4ZXMocHJvcCwgcHJlZml4ZXMsIHNjb3BlcywgcHJveHkpIHtcbiAgbGV0IHZhbHVlO1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBwcmVmaXhlcykge1xuICAgIHZhbHVlID0gX3Jlc29sdmUocmVhZEtleShwcmVmaXgsIHByb3ApLCBzY29wZXMpO1xuICAgIGlmIChkZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG5lZWRzU3ViUmVzb2x2ZXIocHJvcCwgdmFsdWUpXG4gICAgICAgID8gY3JlYXRlU3ViUmVzb2x2ZXIoc2NvcGVzLCBwcm94eSwgcHJvcCwgdmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIF9yZXNvbHZlKGtleSwgc2NvcGVzKSB7XG4gIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgaWYgKCFzY29wZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gc2NvcGVba2V5XTtcbiAgICBpZiAoZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0S2V5c0Zyb21BbGxTY29wZXModGFyZ2V0KSB7XG4gIGxldCBrZXlzID0gdGFyZ2V0Ll9rZXlzO1xuICBpZiAoIWtleXMpIHtcbiAgICBrZXlzID0gdGFyZ2V0Ll9rZXlzID0gcmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzKHRhcmdldC5fc2NvcGVzKTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzKHNjb3Blcykge1xuICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NvcGUpLmZpbHRlcihrID0+ICFrLnN0YXJ0c1dpdGgoJ18nKSkpIHtcbiAgICAgIHNldC5hZGQoa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgY29uc3Qge2lTY2FsZX0gPSBtZXRhO1xuICBjb25zdCB7a2V5ID0gJ3InfSA9IHRoaXMuX3BhcnNpbmc7XG4gIGNvbnN0IHBhcnNlZCA9IG5ldyBBcnJheShjb3VudCk7XG4gIGxldCBpLCBpbGVuLCBpbmRleCwgaXRlbTtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICBpdGVtID0gZGF0YVtpbmRleF07XG4gICAgcGFyc2VkW2ldID0ge1xuICAgICAgcjogaVNjYWxlLnBhcnNlKHJlc29sdmVPYmplY3RLZXkoaXRlbSwga2V5KSwgaW5kZXgpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuIiwgImltcG9ydCB7YWxtb3N0RXF1YWxzLCBkaXN0YW5jZUJldHdlZW5Qb2ludHMsIHNpZ259IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7X2lzUG9pbnRJbkFyZWF9IGZyb20gJy4vaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHR5cGUge0NoYXJ0QXJlYX0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGluZVBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHNraXA/OiBib29sZWFuO1xuXG4gIC8vIEJvdGggQmV6aWVyIGFuZCBtb25vdG9uZSBpbnRlcnBvbGF0aW9ucyBoYXZlIHRoZXNlIGZpZWxkc1xuICAvLyBidXQgdGhleSBhcmUgYWRkZWQgaW4gZGlmZmVyZW50IHNwb3RzXG4gIGNwMXg/OiBudW1iZXI7XG4gIGNwMXk/OiBudW1iZXI7XG4gIGNwMng/OiBudW1iZXI7XG4gIGNwMnk/OiBudW1iZXI7XG59XG5cbmNvbnN0IEVQU0lMT04gPSBOdW1iZXIuRVBTSUxPTiB8fCAxZS0xNDtcblxudHlwZSBPcHRpb25hbFNwbGluZVBvaW50ID0gU3BsaW5lUG9pbnQgfCBmYWxzZVxuY29uc3QgZ2V0UG9pbnQgPSAocG9pbnRzOiBTcGxpbmVQb2ludFtdLCBpOiBudW1iZXIpOiBPcHRpb25hbFNwbGluZVBvaW50ID0+IGkgPCBwb2ludHMubGVuZ3RoICYmICFwb2ludHNbaV0uc2tpcCAmJiBwb2ludHNbaV07XG5jb25zdCBnZXRWYWx1ZUF4aXMgPSAoaW5kZXhBeGlzOiAneCcgfCAneScpID0+IGluZGV4QXhpcyA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaW5lQ3VydmUoXG4gIGZpcnN0UG9pbnQ6IFNwbGluZVBvaW50LFxuICBtaWRkbGVQb2ludDogU3BsaW5lUG9pbnQsXG4gIGFmdGVyUG9pbnQ6IFNwbGluZVBvaW50LFxuICB0OiBudW1iZXJcbik6IHtcbiAgICBwcmV2aW91czogU3BsaW5lUG9pbnRcbiAgICBuZXh0OiBTcGxpbmVQb2ludFxuICB9IHtcbiAgLy8gUHJvcHMgdG8gUm9iIFNwZW5jZXIgYXQgc2NhbGVkIGlubm92YXRpb24gZm9yIGhpcyBwb3N0IG9uIHNwbGluaW5nIGJldHdlZW4gcG9pbnRzXG4gIC8vIGh0dHA6Ly9zY2FsZWRpbm5vdmF0aW9uLmNvbS9hbmFseXRpY3Mvc3BsaW5lcy9hYm91dFNwbGluZXMuaHRtbFxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHNvIHJlc3BlY3QgXCJza2lwcGVkXCIgcG9pbnRzXG5cbiAgY29uc3QgcHJldmlvdXMgPSBmaXJzdFBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGZpcnN0UG9pbnQ7XG4gIGNvbnN0IGN1cnJlbnQgPSBtaWRkbGVQb2ludDtcbiAgY29uc3QgbmV4dCA9IGFmdGVyUG9pbnQuc2tpcCA/IG1pZGRsZVBvaW50IDogYWZ0ZXJQb2ludDtcbiAgY29uc3QgZDAxID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGN1cnJlbnQsIHByZXZpb3VzKTtcbiAgY29uc3QgZDEyID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKG5leHQsIGN1cnJlbnQpO1xuXG4gIGxldCBzMDEgPSBkMDEgLyAoZDAxICsgZDEyKTtcbiAgbGV0IHMxMiA9IGQxMiAvIChkMDEgKyBkMTIpO1xuXG4gIC8vIElmIGFsbCBwb2ludHMgYXJlIHRoZSBzYW1lLCBzMDEgJiBzMDIgd2lsbCBiZSBpbmZcbiAgczAxID0gaXNOYU4oczAxKSA/IDAgOiBzMDE7XG4gIHMxMiA9IGlzTmFOKHMxMikgPyAwIDogczEyO1xuXG4gIGNvbnN0IGZhID0gdCAqIHMwMTsgLy8gc2NhbGluZyBmYWN0b3IgZm9yIHRyaWFuZ2xlIFRhXG4gIGNvbnN0IGZiID0gdCAqIHMxMjtcblxuICByZXR1cm4ge1xuICAgIHByZXZpb3VzOiB7XG4gICAgICB4OiBjdXJyZW50LnggLSBmYSAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcbiAgICAgIHk6IGN1cnJlbnQueSAtIGZhICogKG5leHQueSAtIHByZXZpb3VzLnkpXG4gICAgfSxcbiAgICBuZXh0OiB7XG4gICAgICB4OiBjdXJyZW50LnggKyBmYiAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcbiAgICAgIHk6IGN1cnJlbnQueSArIGZiICogKG5leHQueSAtIHByZXZpb3VzLnkpXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEFkanVzdCB0YW5nZW50cyB0byBlbnN1cmUgbW9ub3RvbmljIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbW9ub3RvbmVBZGp1c3QocG9pbnRzOiBTcGxpbmVQb2ludFtdLCBkZWx0YUs6IG51bWJlcltdLCBtSzogbnVtYmVyW10pIHtcbiAgY29uc3QgcG9pbnRzTGVuID0gcG9pbnRzLmxlbmd0aDtcblxuICBsZXQgYWxwaGFLOiBudW1iZXIsIGJldGFLOiBudW1iZXIsIHRhdUs6IG51bWJlciwgc3F1YXJlZE1hZ25pdHVkZTogbnVtYmVyLCBwb2ludEN1cnJlbnQ6IE9wdGlvbmFsU3BsaW5lUG9pbnQ7XG4gIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNMZW4gLSAxOyArK2kpIHtcbiAgICBwb2ludEN1cnJlbnQgPSBwb2ludEFmdGVyO1xuICAgIHBvaW50QWZ0ZXIgPSBnZXRQb2ludChwb2ludHMsIGkgKyAxKTtcbiAgICBpZiAoIXBvaW50Q3VycmVudCB8fCAhcG9pbnRBZnRlcikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFsbW9zdEVxdWFscyhkZWx0YUtbaV0sIDAsIEVQU0lMT04pKSB7XG4gICAgICBtS1tpXSA9IG1LW2kgKyAxXSA9IDA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhbHBoYUsgPSBtS1tpXSAvIGRlbHRhS1tpXTtcbiAgICBiZXRhSyA9IG1LW2kgKyAxXSAvIGRlbHRhS1tpXTtcbiAgICBzcXVhcmVkTWFnbml0dWRlID0gTWF0aC5wb3coYWxwaGFLLCAyKSArIE1hdGgucG93KGJldGFLLCAyKTtcbiAgICBpZiAoc3F1YXJlZE1hZ25pdHVkZSA8PSA5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXVLID0gMyAvIE1hdGguc3FydChzcXVhcmVkTWFnbml0dWRlKTtcbiAgICBtS1tpXSA9IGFscGhhSyAqIHRhdUsgKiBkZWx0YUtbaV07XG4gICAgbUtbaSArIDFdID0gYmV0YUsgKiB0YXVLICogZGVsdGFLW2ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vbm90b25lQ29tcHV0ZShwb2ludHM6IFNwbGluZVBvaW50W10sIG1LOiBudW1iZXJbXSwgaW5kZXhBeGlzOiAneCcgfCAneScgPSAneCcpIHtcbiAgY29uc3QgdmFsdWVBeGlzID0gZ2V0VmFsdWVBeGlzKGluZGV4QXhpcyk7XG4gIGNvbnN0IHBvaW50c0xlbiA9IHBvaW50cy5sZW5ndGg7XG4gIGxldCBkZWx0YTogbnVtYmVyLCBwb2ludEJlZm9yZTogT3B0aW9uYWxTcGxpbmVQb2ludCwgcG9pbnRDdXJyZW50OiBPcHRpb25hbFNwbGluZVBvaW50O1xuICBsZXQgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgMCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xuICAgIHBvaW50QmVmb3JlID0gcG9pbnRDdXJyZW50O1xuICAgIHBvaW50Q3VycmVudCA9IHBvaW50QWZ0ZXI7XG4gICAgcG9pbnRBZnRlciA9IGdldFBvaW50KHBvaW50cywgaSArIDEpO1xuICAgIGlmICghcG9pbnRDdXJyZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpUGl4ZWwgPSBwb2ludEN1cnJlbnRbaW5kZXhBeGlzXTtcbiAgICBjb25zdCB2UGl4ZWwgPSBwb2ludEN1cnJlbnRbdmFsdWVBeGlzXTtcbiAgICBpZiAocG9pbnRCZWZvcmUpIHtcbiAgICAgIGRlbHRhID0gKGlQaXhlbCAtIHBvaW50QmVmb3JlW2luZGV4QXhpc10pIC8gMztcbiAgICAgIHBvaW50Q3VycmVudFtgY3AxJHtpbmRleEF4aXN9YF0gPSBpUGl4ZWwgLSBkZWx0YTtcbiAgICAgIHBvaW50Q3VycmVudFtgY3AxJHt2YWx1ZUF4aXN9YF0gPSB2UGl4ZWwgLSBkZWx0YSAqIG1LW2ldO1xuICAgIH1cbiAgICBpZiAocG9pbnRBZnRlcikge1xuICAgICAgZGVsdGEgPSAocG9pbnRBZnRlcltpbmRleEF4aXNdIC0gaVBpeGVsKSAvIDM7XG4gICAgICBwb2ludEN1cnJlbnRbYGNwMiR7aW5kZXhBeGlzfWBdID0gaVBpeGVsICsgZGVsdGE7XG4gICAgICBwb2ludEN1cnJlbnRbYGNwMiR7dmFsdWVBeGlzfWBdID0gdlBpeGVsICsgZGVsdGEgKiBtS1tpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgQsOpemllciBjb250cm9sIHBvaW50cyBpbiBhIHNpbWlsYXIgd2F5IHRoYW4gfHNwbGluZUN1cnZlfCxcbiAqIGJ1dCBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5IG9mIHRoZSBwcm92aWRlZCBkYXRhIGFuZCBlbnN1cmVzIG5vIGxvY2FsIGV4dHJlbXVtcyBhcmUgYWRkZWRcbiAqIGJldHdlZW4gdGhlIGRhdGFzZXQgZGlzY3JldGUgcG9pbnRzIGR1ZSB0byB0aGUgaW50ZXJwb2xhdGlvbi5cbiAqIFNlZSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vbm90b25lX2N1YmljX2ludGVycG9sYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGluZUN1cnZlTW9ub3RvbmUocG9pbnRzOiBTcGxpbmVQb2ludFtdLCBpbmRleEF4aXM6ICd4JyB8ICd5JyA9ICd4Jykge1xuICBjb25zdCB2YWx1ZUF4aXMgPSBnZXRWYWx1ZUF4aXMoaW5kZXhBeGlzKTtcbiAgY29uc3QgcG9pbnRzTGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgY29uc3QgZGVsdGFLOiBudW1iZXJbXSA9IEFycmF5KHBvaW50c0xlbikuZmlsbCgwKTtcbiAgY29uc3QgbUs6IG51bWJlcltdID0gQXJyYXkocG9pbnRzTGVuKTtcblxuICAvLyBDYWxjdWxhdGUgc2xvcGVzIChkZWx0YUspIGFuZCBpbml0aWFsaXplIHRhbmdlbnRzIChtSylcbiAgbGV0IGksIHBvaW50QmVmb3JlOiBPcHRpb25hbFNwbGluZVBvaW50LCBwb2ludEN1cnJlbnQ6IE9wdGlvbmFsU3BsaW5lUG9pbnQ7XG4gIGxldCBwb2ludEFmdGVyID0gZ2V0UG9pbnQocG9pbnRzLCAwKTtcblxuICBmb3IgKGkgPSAwOyBpIDwgcG9pbnRzTGVuOyArK2kpIHtcbiAgICBwb2ludEJlZm9yZSA9IHBvaW50Q3VycmVudDtcbiAgICBwb2ludEN1cnJlbnQgPSBwb2ludEFmdGVyO1xuICAgIHBvaW50QWZ0ZXIgPSBnZXRQb2ludChwb2ludHMsIGkgKyAxKTtcbiAgICBpZiAoIXBvaW50Q3VycmVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHBvaW50QWZ0ZXIpIHtcbiAgICAgIGNvbnN0IHNsb3BlRGVsdGEgPSBwb2ludEFmdGVyW2luZGV4QXhpc10gLSBwb2ludEN1cnJlbnRbaW5kZXhBeGlzXTtcblxuICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgdHdvIHBvaW50cyB0aGF0IGFwcGVhciBhdCB0aGUgc2FtZSB4IHBpeGVsLCBzbG9wZURlbHRhWCBpcyAwXG4gICAgICBkZWx0YUtbaV0gPSBzbG9wZURlbHRhICE9PSAwID8gKHBvaW50QWZ0ZXJbdmFsdWVBeGlzXSAtIHBvaW50Q3VycmVudFt2YWx1ZUF4aXNdKSAvIHNsb3BlRGVsdGEgOiAwO1xuICAgIH1cbiAgICBtS1tpXSA9ICFwb2ludEJlZm9yZSA/IGRlbHRhS1tpXVxuICAgICAgOiAhcG9pbnRBZnRlciA/IGRlbHRhS1tpIC0gMV1cbiAgICAgICAgOiAoc2lnbihkZWx0YUtbaSAtIDFdKSAhPT0gc2lnbihkZWx0YUtbaV0pKSA/IDBcbiAgICAgICAgICA6IChkZWx0YUtbaSAtIDFdICsgZGVsdGFLW2ldKSAvIDI7XG4gIH1cblxuICBtb25vdG9uZUFkanVzdChwb2ludHMsIGRlbHRhSywgbUspO1xuXG4gIG1vbm90b25lQ29tcHV0ZShwb2ludHMsIG1LLCBpbmRleEF4aXMpO1xufVxuXG5mdW5jdGlvbiBjYXBDb250cm9sUG9pbnQocHQ6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKSB7XG4gIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihwdCwgbWF4KSwgbWluKTtcbn1cblxuZnVuY3Rpb24gY2FwQmV6aWVyUG9pbnRzKHBvaW50czogU3BsaW5lUG9pbnRbXSwgYXJlYTogQ2hhcnRBcmVhKSB7XG4gIGxldCBpLCBpbGVuLCBwb2ludCwgaW5BcmVhLCBpbkFyZWFQcmV2O1xuICBsZXQgaW5BcmVhTmV4dCA9IF9pc1BvaW50SW5BcmVhKHBvaW50c1swXSwgYXJlYSk7XG4gIGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgaW5BcmVhUHJldiA9IGluQXJlYTtcbiAgICBpbkFyZWEgPSBpbkFyZWFOZXh0O1xuICAgIGluQXJlYU5leHQgPSBpIDwgaWxlbiAtIDEgJiYgX2lzUG9pbnRJbkFyZWEocG9pbnRzW2kgKyAxXSwgYXJlYSk7XG4gICAgaWYgKCFpbkFyZWEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwb2ludCA9IHBvaW50c1tpXTtcbiAgICBpZiAoaW5BcmVhUHJldikge1xuICAgICAgcG9pbnQuY3AxeCA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDF4LCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuICAgICAgcG9pbnQuY3AxeSA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDF5LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuICAgIH1cbiAgICBpZiAoaW5BcmVhTmV4dCkge1xuICAgICAgcG9pbnQuY3AyeCA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDJ4LCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuICAgICAgcG9pbnQuY3AyeSA9IGNhcENvbnRyb2xQb2ludChwb2ludC5jcDJ5LCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfdXBkYXRlQmV6aWVyQ29udHJvbFBvaW50cyhcbiAgcG9pbnRzOiBTcGxpbmVQb2ludFtdLFxuICBvcHRpb25zLFxuICBhcmVhOiBDaGFydEFyZWEsXG4gIGxvb3A6IGJvb2xlYW4sXG4gIGluZGV4QXhpczogJ3gnIHwgJ3knXG4pIHtcbiAgbGV0IGk6IG51bWJlciwgaWxlbjogbnVtYmVyLCBwb2ludDogU3BsaW5lUG9pbnQsIGNvbnRyb2xQb2ludHM6IFJldHVyblR5cGU8dHlwZW9mIHNwbGluZUN1cnZlPjtcblxuICAvLyBPbmx5IGNvbnNpZGVyIHBvaW50cyB0aGF0IGFyZSBkcmF3biBpbiBjYXNlIHRoZSBzcGFuR2FwcyBvcHRpb24gaXMgdXNlZFxuICBpZiAob3B0aW9ucy5zcGFuR2Fwcykge1xuICAgIHBvaW50cyA9IHBvaW50cy5maWx0ZXIoKHB0KSA9PiAhcHQuc2tpcCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG4gICAgc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMsIGluZGV4QXhpcyk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHByZXYgPSBsb29wID8gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXSA6IHBvaW50c1swXTtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICBjb250cm9sUG9pbnRzID0gc3BsaW5lQ3VydmUoXG4gICAgICAgIHByZXYsXG4gICAgICAgIHBvaW50LFxuICAgICAgICBwb2ludHNbTWF0aC5taW4oaSArIDEsIGlsZW4gLSAobG9vcCA/IDAgOiAxKSkgJSBpbGVuXSxcbiAgICAgICAgb3B0aW9ucy50ZW5zaW9uXG4gICAgICApO1xuICAgICAgcG9pbnQuY3AxeCA9IGNvbnRyb2xQb2ludHMucHJldmlvdXMueDtcbiAgICAgIHBvaW50LmNwMXkgPSBjb250cm9sUG9pbnRzLnByZXZpb3VzLnk7XG4gICAgICBwb2ludC5jcDJ4ID0gY29udHJvbFBvaW50cy5uZXh0Lng7XG4gICAgICBwb2ludC5jcDJ5ID0gY29udHJvbFBvaW50cy5uZXh0Lnk7XG4gICAgICBwcmV2ID0gcG9pbnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMuY2FwQmV6aWVyUG9pbnRzKSB7XG4gICAgY2FwQmV6aWVyUG9pbnRzKHBvaW50cywgYXJlYSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7Q2hhcnRBcmVhLCBTY2FsZX0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgQ2hhcnQgZnJvbSAnLi4vY29yZS9jb3JlLmNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHR5cGUge0NoYXJ0RXZlbnR9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7SU5GSU5JVFl9IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcblxuLyoqXG4gKiBOb3RlOiB0eXBlZGVmcyBhcmUgYXV0by1leHBvcnRlZCwgc28gdXNlIGEgbWFkZS11cCBgZG9tYCBuYW1lc3BhY2Ugd2hlcmVcbiAqIG5lY2Vzc2FyeSB0byBhdm9pZCBkdXBsaWNhdGVzIHdpdGggYGV4cG9ydCAqIGZyb20gJy4vaGVscGVyc2A7IHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80NjAxMVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IGRvbS5DaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL3R5cGVzJykuQ2hhcnRFdmVudCB9IENoYXJ0RXZlbnRcbiAqL1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfaXNEb21TdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0UGFyZW50Tm9kZShkb21Ob2RlOiBIVE1MQ2FudmFzRWxlbWVudCk6IEhUTUxDYW52YXNFbGVtZW50IHtcbiAgbGV0IHBhcmVudCA9IGRvbU5vZGUucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCAmJiBwYXJlbnQudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgU2hhZG93Um9vdF0nKSB7XG4gICAgcGFyZW50ID0gKHBhcmVudCBhcyBTaGFkb3dSb290KS5ob3N0O1xuICB9XG4gIHJldHVybiBwYXJlbnQgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XG59XG5cbi8qKlxuICogY29udmVydCBtYXgtd2lkdGgvbWF4LWhlaWdodCB2YWx1ZXMgdGhhdCBtYXkgYmUgcGVyY2VudGFnZXMgaW50byBhIG51bWJlclxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZU1heFN0eWxlKHN0eWxlVmFsdWU6IHN0cmluZyB8IG51bWJlciwgbm9kZTogSFRNTEVsZW1lbnQsIHBhcmVudFByb3BlcnR5OiBzdHJpbmcpIHtcbiAgbGV0IHZhbHVlSW5QaXhlbHM6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBzdHlsZVZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHZhbHVlSW5QaXhlbHMgPSBwYXJzZUludChzdHlsZVZhbHVlLCAxMCk7XG5cbiAgICBpZiAoc3R5bGVWYWx1ZS5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAvLyBwZXJjZW50YWdlICogc2l6ZSBpbiBkaW1lbnNpb25cbiAgICAgIHZhbHVlSW5QaXhlbHMgPSAodmFsdWVJblBpeGVscyAvIDEwMCkgKiBub2RlLnBhcmVudE5vZGVbcGFyZW50UHJvcGVydHldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZUluUGl4ZWxzID0gc3R5bGVWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZUluUGl4ZWxzO1xufVxuXG5jb25zdCBnZXRDb21wdXRlZFN0eWxlID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogQ1NTU3R5bGVEZWNsYXJhdGlvbiA9PlxuICBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlKGVsOiBIVE1MRWxlbWVudCwgcHJvcGVydHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbn1cblxuY29uc3QgcG9zaXRpb25zID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcbmZ1bmN0aW9uIGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZXM6IENTU1N0eWxlRGVjbGFyYXRpb24sIHN0eWxlOiBzdHJpbmcsIHN1ZmZpeD86IHN0cmluZyk6IENoYXJ0QXJlYSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIENoYXJ0QXJlYTtcbiAgc3VmZml4ID0gc3VmZml4ID8gJy0nICsgc3VmZml4IDogJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgY29uc3QgcG9zID0gcG9zaXRpb25zW2ldO1xuICAgIHJlc3VsdFtwb3NdID0gcGFyc2VGbG9hdChzdHlsZXNbc3R5bGUgKyAnLScgKyBwb3MgKyBzdWZmaXhdKSB8fCAwO1xuICB9XG4gIHJlc3VsdC53aWR0aCA9IHJlc3VsdC5sZWZ0ICsgcmVzdWx0LnJpZ2h0O1xuICByZXN1bHQuaGVpZ2h0ID0gcmVzdWx0LnRvcCArIHJlc3VsdC5ib3R0b207XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHVzZU9mZnNldFBvcyA9ICh4OiBudW1iZXIsIHk6IG51bWJlciwgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IEV2ZW50VGFyZ2V0KSA9PlxuICAoeCA+IDAgfHwgeSA+IDApICYmICghdGFyZ2V0IHx8ICEodGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zaGFkb3dSb290KTtcblxuLyoqXG4gKiBAcGFyYW0gZVxuICogQHBhcmFtIGNhbnZhc1xuICogQHJldHVybnMgQ2FudmFzIHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldENhbnZhc1Bvc2l0aW9uKFxuICBlOiBFdmVudCB8IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50LFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4pOiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBib3g6IGJvb2xlYW47XG4gIH0ge1xuICBjb25zdCB0b3VjaGVzID0gKGUgYXMgVG91Y2hFdmVudCkudG91Y2hlcztcbiAgY29uc3Qgc291cmNlID0gKHRvdWNoZXMgJiYgdG91Y2hlcy5sZW5ndGggPyB0b3VjaGVzWzBdIDogZSkgYXMgTW91c2VFdmVudDtcbiAgY29uc3Qge29mZnNldFgsIG9mZnNldFl9ID0gc291cmNlIGFzIE1vdXNlRXZlbnQ7XG4gIGxldCBib3ggPSBmYWxzZTtcbiAgbGV0IHgsIHk7XG4gIGlmICh1c2VPZmZzZXRQb3Mob2Zmc2V0WCwgb2Zmc2V0WSwgZS50YXJnZXQpKSB7XG4gICAgeCA9IG9mZnNldFg7XG4gICAgeSA9IG9mZnNldFk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB4ID0gc291cmNlLmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgeSA9IHNvdXJjZS5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgYm94ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4ge3gsIHksIGJveH07XG59XG5cbi8qKlxuICogR2V0cyBhbiBldmVudCdzIHgsIHkgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHRoZSBjaGFydCBhcmVhXG4gKiBAcGFyYW0gZXZlbnRcbiAqIEBwYXJhbSBjaGFydFxuICogQHJldHVybnMgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgZXZlbnRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQb3NpdGlvbihcbiAgZXZlbnQ6IEV2ZW50IHwgQ2hhcnRFdmVudCB8IFRvdWNoRXZlbnQgfCBNb3VzZUV2ZW50LFxuICBjaGFydDogQ2hhcnRcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB7XG4gIGlmICgnbmF0aXZlJyBpbiBldmVudCkge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIGNvbnN0IHtjYW52YXMsIGN1cnJlbnREZXZpY2VQaXhlbFJhdGlvfSA9IGNoYXJ0O1xuICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY2FudmFzKTtcbiAgY29uc3QgYm9yZGVyQm94ID0gc3R5bGUuYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCc7XG4gIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICBjb25zdCBib3JkZXJzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAnYm9yZGVyJywgJ3dpZHRoJyk7XG4gIGNvbnN0IHt4LCB5LCBib3h9ID0gZ2V0Q2FudmFzUG9zaXRpb24oZXZlbnQsIGNhbnZhcyk7XG4gIGNvbnN0IHhPZmZzZXQgPSBwYWRkaW5ncy5sZWZ0ICsgKGJveCAmJiBib3JkZXJzLmxlZnQpO1xuICBjb25zdCB5T2Zmc2V0ID0gcGFkZGluZ3MudG9wICsgKGJveCAmJiBib3JkZXJzLnRvcCk7XG5cbiAgbGV0IHt3aWR0aCwgaGVpZ2h0fSA9IGNoYXJ0O1xuICBpZiAoYm9yZGVyQm94KSB7XG4gICAgd2lkdGggLT0gcGFkZGluZ3Mud2lkdGggKyBib3JkZXJzLndpZHRoO1xuICAgIGhlaWdodCAtPSBwYWRkaW5ncy5oZWlnaHQgKyBib3JkZXJzLmhlaWdodDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IE1hdGgucm91bmQoKHggLSB4T2Zmc2V0KSAvIHdpZHRoICogY2FudmFzLndpZHRoIC8gY3VycmVudERldmljZVBpeGVsUmF0aW8pLFxuICAgIHk6IE1hdGgucm91bmQoKHkgLSB5T2Zmc2V0KSAvIGhlaWdodCAqIGNhbnZhcy5oZWlnaHQgLyBjdXJyZW50RGV2aWNlUGl4ZWxSYXRpbylcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyU2l6ZShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFBhcnRpYWw8U2NhbGU+IHtcbiAgbGV0IG1heFdpZHRoOiBudW1iZXIsIG1heEhlaWdodDogbnVtYmVyO1xuXG4gIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gX2dldFBhcmVudE5vZGUoY2FudmFzKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgd2lkdGggPSBjYW52YXMuY2xpZW50V2lkdGg7XG4gICAgICBoZWlnaHQgPSBjYW52YXMuY2xpZW50SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyB0aGlzIGlzIHRoZSBib3JkZXIgYm94IG9mIHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IGNvbnRhaW5lclN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgY29uc3QgY29udGFpbmVyQm9yZGVyID0gZ2V0UG9zaXRpb25lZFN0eWxlKGNvbnRhaW5lclN0eWxlLCAnYm9yZGVyJywgJ3dpZHRoJyk7XG4gICAgICBjb25zdCBjb250YWluZXJQYWRkaW5nID0gZ2V0UG9zaXRpb25lZFN0eWxlKGNvbnRhaW5lclN0eWxlLCAncGFkZGluZycpO1xuICAgICAgd2lkdGggPSByZWN0LndpZHRoIC0gY29udGFpbmVyUGFkZGluZy53aWR0aCAtIGNvbnRhaW5lckJvcmRlci53aWR0aDtcbiAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0IC0gY29udGFpbmVyUGFkZGluZy5oZWlnaHQgLSBjb250YWluZXJCb3JkZXIuaGVpZ2h0O1xuICAgICAgbWF4V2lkdGggPSBwYXJzZU1heFN0eWxlKGNvbnRhaW5lclN0eWxlLm1heFdpZHRoLCBjb250YWluZXIsICdjbGllbnRXaWR0aCcpO1xuICAgICAgbWF4SGVpZ2h0ID0gcGFyc2VNYXhTdHlsZShjb250YWluZXJTdHlsZS5tYXhIZWlnaHQsIGNvbnRhaW5lciwgJ2NsaWVudEhlaWdodCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBtYXhXaWR0aDogbWF4V2lkdGggfHwgSU5GSU5JVFksXG4gICAgbWF4SGVpZ2h0OiBtYXhIZWlnaHQgfHwgSU5GSU5JVFlcbiAgfTtcbn1cblxuY29uc3Qgcm91bmQxID0gKHY6IG51bWJlcikgPT4gTWF0aC5yb3VuZCh2ICogMTApIC8gMTA7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4aW11bVNpemUoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gIGJiV2lkdGg/OiBudW1iZXIsXG4gIGJiSGVpZ2h0PzogbnVtYmVyLFxuICBhc3BlY3RSYXRpbz86IG51bWJlclxuKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNhbnZhcyk7XG4gIGNvbnN0IG1hcmdpbnMgPSBnZXRQb3NpdGlvbmVkU3R5bGUoc3R5bGUsICdtYXJnaW4nKTtcbiAgY29uc3QgbWF4V2lkdGggPSBwYXJzZU1heFN0eWxlKHN0eWxlLm1heFdpZHRoLCBjYW52YXMsICdjbGllbnRXaWR0aCcpIHx8IElORklOSVRZO1xuICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZU1heFN0eWxlKHN0eWxlLm1heEhlaWdodCwgY2FudmFzLCAnY2xpZW50SGVpZ2h0JykgfHwgSU5GSU5JVFk7XG4gIGNvbnN0IGNvbnRhaW5lclNpemUgPSBnZXRDb250YWluZXJTaXplKGNhbnZhcywgYmJXaWR0aCwgYmJIZWlnaHQpO1xuICBsZXQge3dpZHRoLCBoZWlnaHR9ID0gY29udGFpbmVyU2l6ZTtcblxuICBpZiAoc3R5bGUuYm94U2l6aW5nID09PSAnY29udGVudC1ib3gnKSB7XG4gICAgY29uc3QgYm9yZGVycyA9IGdldFBvc2l0aW9uZWRTdHlsZShzdHlsZSwgJ2JvcmRlcicsICd3aWR0aCcpO1xuICAgIGNvbnN0IHBhZGRpbmdzID0gZ2V0UG9zaXRpb25lZFN0eWxlKHN0eWxlLCAncGFkZGluZycpO1xuICAgIHdpZHRoIC09IHBhZGRpbmdzLndpZHRoICsgYm9yZGVycy53aWR0aDtcbiAgICBoZWlnaHQgLT0gcGFkZGluZ3MuaGVpZ2h0ICsgYm9yZGVycy5oZWlnaHQ7XG4gIH1cbiAgd2lkdGggPSBNYXRoLm1heCgwLCB3aWR0aCAtIG1hcmdpbnMud2lkdGgpO1xuICBoZWlnaHQgPSBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IHdpZHRoIC8gYXNwZWN0UmF0aW8gOiBoZWlnaHQgLSBtYXJnaW5zLmhlaWdodCk7XG4gIHdpZHRoID0gcm91bmQxKE1hdGgubWluKHdpZHRoLCBtYXhXaWR0aCwgY29udGFpbmVyU2l6ZS5tYXhXaWR0aCkpO1xuICBoZWlnaHQgPSByb3VuZDEoTWF0aC5taW4oaGVpZ2h0LCBtYXhIZWlnaHQsIGNvbnRhaW5lclNpemUubWF4SGVpZ2h0KSk7XG4gIGlmICh3aWR0aCAmJiAhaGVpZ2h0KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQ2NTlcbiAgICAvLyBJZiB0aGUgY2FudmFzIGhhcyB3aWR0aCwgYnV0IG5vIGhlaWdodCwgZGVmYXVsdCB0byBhc3BlY3RSYXRpbyBvZiAyIChjYW52YXMgZGVmYXVsdClcbiAgICBoZWlnaHQgPSByb3VuZDEod2lkdGggLyAyKTtcbiAgfVxuXG4gIGNvbnN0IG1haW50YWluSGVpZ2h0ID0gYmJXaWR0aCAhPT0gdW5kZWZpbmVkIHx8IGJiSGVpZ2h0ICE9PSB1bmRlZmluZWQ7XG5cbiAgaWYgKG1haW50YWluSGVpZ2h0ICYmIGFzcGVjdFJhdGlvICYmIGNvbnRhaW5lclNpemUuaGVpZ2h0ICYmIGhlaWdodCA+IGNvbnRhaW5lclNpemUuaGVpZ2h0KSB7XG4gICAgaGVpZ2h0ID0gY29udGFpbmVyU2l6ZS5oZWlnaHQ7XG4gICAgd2lkdGggPSByb3VuZDEoTWF0aC5mbG9vcihoZWlnaHQgKiBhc3BlY3RSYXRpbykpO1xuICB9XG5cbiAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0fTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY2hhcnRcbiAqIEBwYXJhbSBmb3JjZVJhdGlvXG4gKiBAcGFyYW0gZm9yY2VTdHlsZVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2FudmFzIGNvbnRleHQgc2l6ZSBvciB0cmFuc2Zvcm1hdGlvbiBoYXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldGluYVNjYWxlKFxuICBjaGFydDogQ2hhcnQsXG4gIGZvcmNlUmF0aW86IG51bWJlcixcbiAgZm9yY2VTdHlsZT86IGJvb2xlYW5cbik6IGJvb2xlYW4gfCB2b2lkIHtcbiAgY29uc3QgcGl4ZWxSYXRpbyA9IGZvcmNlUmF0aW8gfHwgMTtcbiAgY29uc3QgZGV2aWNlSGVpZ2h0ID0gTWF0aC5mbG9vcihjaGFydC5oZWlnaHQgKiBwaXhlbFJhdGlvKTtcbiAgY29uc3QgZGV2aWNlV2lkdGggPSBNYXRoLmZsb29yKGNoYXJ0LndpZHRoICogcGl4ZWxSYXRpbyk7XG5cbiAgY2hhcnQuaGVpZ2h0ID0gTWF0aC5mbG9vcihjaGFydC5oZWlnaHQpO1xuICBjaGFydC53aWR0aCA9IE1hdGguZmxvb3IoY2hhcnQud2lkdGgpO1xuXG4gIGNvbnN0IGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblxuICAvLyBJZiBubyBzdHlsZSBoYXMgYmVlbiBzZXQgb24gdGhlIGNhbnZhcywgdGhlIHJlbmRlciBzaXplIGlzIHVzZWQgYXMgZGlzcGxheSBzaXplLFxuICAvLyBtYWtpbmcgdGhlIGNoYXJ0IHZpc3VhbGx5IGJpZ2dlciwgc28gbGV0J3MgZW5mb3JjZSBpdCB0byB0aGUgXCJjb3JyZWN0XCIgdmFsdWVzLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM1NzVcbiAgaWYgKGNhbnZhcy5zdHlsZSAmJiAoZm9yY2VTdHlsZSB8fCAoIWNhbnZhcy5zdHlsZS5oZWlnaHQgJiYgIWNhbnZhcy5zdHlsZS53aWR0aCkpKSB7XG4gICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2NoYXJ0LmhlaWdodH1weGA7XG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gYCR7Y2hhcnQud2lkdGh9cHhgO1xuICB9XG5cbiAgaWYgKGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvICE9PSBwaXhlbFJhdGlvXG4gICAgICB8fCBjYW52YXMuaGVpZ2h0ICE9PSBkZXZpY2VIZWlnaHRcbiAgICAgIHx8IGNhbnZhcy53aWR0aCAhPT0gZGV2aWNlV2lkdGgpIHtcbiAgICBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgY2FudmFzLmhlaWdodCA9IGRldmljZUhlaWdodDtcbiAgICBjYW52YXMud2lkdGggPSBkZXZpY2VXaWR0aDtcbiAgICBjaGFydC5jdHguc2V0VHJhbnNmb3JtKHBpeGVsUmF0aW8sIDAsIDAsIHBpeGVsUmF0aW8sIDAsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHN1cHBvcnQgZm9yIG9wdGlvbnMgb2JqZWN0IGFyZ3VtZW50IGluIGFkZEV2ZW50TGlzdGVuZXIuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA9IChmdW5jdGlvbigpIHtcbiAgbGV0IHBhc3NpdmVTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgZ2V0IHBhc3NpdmUoKSB7IC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgYnJvd3NlciBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHBhc3NpdmUgcHJvcGVydHkuXG4gICAgICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBhcyBFdmVudExpc3RlbmVyT3B0aW9ucztcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRpb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3JcbiAgfVxuICByZXR1cm4gcGFzc2l2ZVN1cHBvcnRlZDtcbn0oKSk7XG5cbi8qKlxuICogVGhlIFwidXNlZFwiIHNpemUgaXMgdGhlIGZpbmFsIHZhbHVlIG9mIGEgZGltZW5zaW9uIHByb3BlcnR5IGFmdGVyIGFsbCBjYWxjdWxhdGlvbnMgaGF2ZVxuICogYmVlbiBwZXJmb3JtZWQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIGBlbGVtZW50YCBidXQgcmV0dXJucyB1bmRlZmluZWRcbiAqIGlmIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBub3QgZXhwcmVzc2VkIGluIHBpeGVscy4gVGhhdCBjYW4gaGFwcGVuIGluIHNvbWUgY2FzZXMgd2hlcmVcbiAqIGBlbGVtZW50YCBoYXMgYSBzaXplIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgYW5kIHRoaXMgbGFzdCBvbmUgaXMgbm90IHlldCBkaXNwbGF5ZWQsXG4gKiBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGBkaXNwbGF5OiBub25lYCBvbiBhIHBhcmVudCBub2RlLlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdXNlZF92YWx1ZVxuICogQHJldHVybnMgU2l6ZSBpbiBwaXhlbHMgb3IgdW5kZWZpbmVkIGlmIHVua25vd24uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVc2VkU2l6ZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIHByb3BlcnR5OiAnd2lkdGgnIHwgJ2hlaWdodCdcbik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gZ2V0U3R5bGUoZWxlbWVudCwgcHJvcGVydHkpO1xuICBjb25zdCBtYXRjaGVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goL14oXFxkKykoXFwuXFxkKyk/cHgkLyk7XG4gIHJldHVybiBtYXRjaGVzID8gK21hdGNoZXNbMV0gOiB1bmRlZmluZWQ7XG59XG4iLCAiaW1wb3J0IHR5cGUge1BvaW50fSBmcm9tICcuLi90eXBlcy9nZW9tZXRyaWMuanMnO1xuaW1wb3J0IHR5cGUge1NwbGluZVBvaW50fSBmcm9tICcuL2hlbHBlcnMuY3VydmUuanMnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcG9pbnRJbkxpbmUocDE6IFBvaW50LCBwMjogUG9pbnQsIHQ6IG51bWJlciwgbW9kZT8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHtcbiAgICB4OiBwMS54ICsgdCAqIChwMi54IC0gcDEueCksXG4gICAgeTogcDEueSArIHQgKiAocDIueSAtIHAxLnkpXG4gIH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zdGVwcGVkSW50ZXJwb2xhdGlvbihcbiAgcDE6IFBvaW50LFxuICBwMjogUG9pbnQsXG4gIHQ6IG51bWJlciwgbW9kZTogJ21pZGRsZScgfCAnYWZ0ZXInIHwgdW5rbm93blxuKSB7XG4gIHJldHVybiB7XG4gICAgeDogcDEueCArIHQgKiAocDIueCAtIHAxLngpLFxuICAgIHk6IG1vZGUgPT09ICdtaWRkbGUnID8gdCA8IDAuNSA/IHAxLnkgOiBwMi55XG4gICAgICA6IG1vZGUgPT09ICdhZnRlcicgPyB0IDwgMSA/IHAxLnkgOiBwMi55XG4gICAgICAgIDogdCA+IDAgPyBwMi55IDogcDEueVxuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYmV6aWVySW50ZXJwb2xhdGlvbihwMTogU3BsaW5lUG9pbnQsIHAyOiBTcGxpbmVQb2ludCwgdDogbnVtYmVyLCBtb2RlPykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdCBjcDEgPSB7eDogcDEuY3AyeCwgeTogcDEuY3AyeX07XG4gIGNvbnN0IGNwMiA9IHt4OiBwMi5jcDF4LCB5OiBwMi5jcDF5fTtcbiAgY29uc3QgYSA9IF9wb2ludEluTGluZShwMSwgY3AxLCB0KTtcbiAgY29uc3QgYiA9IF9wb2ludEluTGluZShjcDEsIGNwMiwgdCk7XG4gIGNvbnN0IGMgPSBfcG9pbnRJbkxpbmUoY3AyLCBwMiwgdCk7XG4gIGNvbnN0IGQgPSBfcG9pbnRJbkxpbmUoYSwgYiwgdCk7XG4gIGNvbnN0IGUgPSBfcG9pbnRJbkxpbmUoYiwgYywgdCk7XG4gIHJldHVybiBfcG9pbnRJbkxpbmUoZCwgZSwgdCk7XG59XG4iLCAiZXhwb3J0IGludGVyZmFjZSBSVExBZGFwdGVyIHtcbiAgeCh4OiBudW1iZXIpOiBudW1iZXI7XG4gIHNldFdpZHRoKHc6IG51bWJlcik6IHZvaWQ7XG4gIHRleHRBbGlnbihhbGlnbjogJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnKTogJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnO1xuICB4UGx1cyh4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiBudW1iZXI7XG4gIGxlZnRGb3JMdHIoeDogbnVtYmVyLCBpdGVtV2lkdGg6IG51bWJlcik6IG51bWJlcjtcbn1cblxuY29uc3QgZ2V0UmlnaHRUb0xlZnRBZGFwdGVyID0gZnVuY3Rpb24ocmVjdFg6IG51bWJlciwgd2lkdGg6IG51bWJlcik6IFJUTEFkYXB0ZXIge1xuICByZXR1cm4ge1xuICAgIHgoeCkge1xuICAgICAgcmV0dXJuIHJlY3RYICsgcmVjdFggKyB3aWR0aCAtIHg7XG4gICAgfSxcbiAgICBzZXRXaWR0aCh3KSB7XG4gICAgICB3aWR0aCA9IHc7XG4gICAgfSxcbiAgICB0ZXh0QWxpZ24oYWxpZ24pIHtcbiAgICAgIGlmIChhbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgcmV0dXJuIGFsaWduO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFsaWduID09PSAncmlnaHQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICB9LFxuICAgIHhQbHVzKHgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4geCAtIHZhbHVlO1xuICAgIH0sXG4gICAgbGVmdEZvckx0cih4LCBpdGVtV2lkdGgpIHtcbiAgICAgIHJldHVybiB4IC0gaXRlbVdpZHRoO1xuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCBnZXRMZWZ0VG9SaWdodEFkYXB0ZXIgPSBmdW5jdGlvbigpOiBSVExBZGFwdGVyIHtcbiAgcmV0dXJuIHtcbiAgICB4KHgpIHtcbiAgICAgIHJldHVybiB4O1xuICAgIH0sXG4gICAgc2V0V2lkdGgodykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgfSxcbiAgICB0ZXh0QWxpZ24oYWxpZ24pIHtcbiAgICAgIHJldHVybiBhbGlnbjtcbiAgICB9LFxuICAgIHhQbHVzKHgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4geCArIHZhbHVlO1xuICAgIH0sXG4gICAgbGVmdEZvckx0cih4LCBfaXRlbVdpZHRoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4geDtcbiAgICB9LFxuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ0bEFkYXB0ZXIocnRsOiBib29sZWFuLCByZWN0WDogbnVtYmVyLCB3aWR0aDogbnVtYmVyKSB7XG4gIHJldHVybiBydGwgPyBnZXRSaWdodFRvTGVmdEFkYXB0ZXIocmVjdFgsIHdpZHRoKSA6IGdldExlZnRUb1JpZ2h0QWRhcHRlcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBkaXJlY3Rpb246ICdsdHInIHwgJ3J0bCcpIHtcbiAgbGV0IHN0eWxlOiBDU1NTdHlsZURlY2xhcmF0aW9uLCBvcmlnaW5hbDogW3N0cmluZywgc3RyaW5nXTtcbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ2x0cicgfHwgZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHN0eWxlID0gY3R4LmNhbnZhcy5zdHlsZTtcbiAgICBvcmlnaW5hbCA9IFtcbiAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2RpcmVjdGlvbicpLFxuICAgICAgc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eSgnZGlyZWN0aW9uJyksXG4gICAgXTtcblxuICAgIHN0eWxlLnNldFByb3BlcnR5KCdkaXJlY3Rpb24nLCBkaXJlY3Rpb24sICdpbXBvcnRhbnQnKTtcbiAgICAoY3R4IGFzIHsgcHJldlRleHREaXJlY3Rpb24/OiBbc3RyaW5nLCBzdHJpbmddIH0pLnByZXZUZXh0RGlyZWN0aW9uID0gb3JpZ2luYWw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVUZXh0RGlyZWN0aW9uKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBvcmlnaW5hbD86IFtzdHJpbmcsIHN0cmluZ10pIHtcbiAgaWYgKG9yaWdpbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICBkZWxldGUgKGN0eCBhcyB7IHByZXZUZXh0RGlyZWN0aW9uPzogW3N0cmluZywgc3RyaW5nXSB9KS5wcmV2VGV4dERpcmVjdGlvbjtcbiAgICBjdHguY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCdkaXJlY3Rpb24nLCBvcmlnaW5hbFswXSwgb3JpZ2luYWxbMV0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHtfYW5nbGVCZXR3ZWVuLCBfYW5nbGVEaWZmLCBfaXNCZXR3ZWVuLCBfbm9ybWFsaXplQW5nbGV9IGZyb20gJy4vaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7Y3JlYXRlQ29udGV4dH0gZnJvbSAnLi9oZWxwZXJzLm9wdGlvbnMuanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9lbGVtZW50cy9lbGVtZW50LmxpbmUuanMnKS5kZWZhdWx0IH0gTGluZUVsZW1lbnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9lbGVtZW50cy9lbGVtZW50LnBvaW50LmpzJykuZGVmYXVsdCB9IFBvaW50RWxlbWVudFxuICogQHR5cGVkZWYge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgbG9vcDogYm9vbGVhbiwgc3R5bGU/OiBhbnl9fSBTZWdtZW50XG4gKi9cblxuZnVuY3Rpb24gcHJvcGVydHlGbihwcm9wZXJ0eSkge1xuICBpZiAocHJvcGVydHkgPT09ICdhbmdsZScpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmV0d2VlbjogX2FuZ2xlQmV0d2VlbixcbiAgICAgIGNvbXBhcmU6IF9hbmdsZURpZmYsXG4gICAgICBub3JtYWxpemU6IF9ub3JtYWxpemVBbmdsZSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgYmV0d2VlbjogX2lzQmV0d2VlbixcbiAgICBjb21wYXJlOiAoYSwgYikgPT4gYSAtIGIsXG4gICAgbm9ybWFsaXplOiB4ID0+IHhcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU2VnbWVudCh7c3RhcnQsIGVuZCwgY291bnQsIGxvb3AsIHN0eWxlfSkge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCAlIGNvdW50LFxuICAgIGVuZDogZW5kICUgY291bnQsXG4gICAgbG9vcDogbG9vcCAmJiAoZW5kIC0gc3RhcnQgKyAxKSAlIGNvdW50ID09PSAwLFxuICAgIHN0eWxlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNlZ21lbnQoc2VnbWVudCwgcG9pbnRzLCBib3VuZHMpIHtcbiAgY29uc3Qge3Byb3BlcnR5LCBzdGFydDogc3RhcnRCb3VuZCwgZW5kOiBlbmRCb3VuZH0gPSBib3VuZHM7XG4gIGNvbnN0IHtiZXR3ZWVuLCBub3JtYWxpemV9ID0gcHJvcGVydHlGbihwcm9wZXJ0eSk7XG4gIGNvbnN0IGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQge3N0YXJ0LCBlbmQsIGxvb3B9ID0gc2VnbWVudDtcbiAgbGV0IGksIGlsZW47XG5cbiAgaWYgKGxvb3ApIHtcbiAgICBzdGFydCArPSBjb3VudDtcbiAgICBlbmQgKz0gY291bnQ7XG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBpZiAoIWJldHdlZW4obm9ybWFsaXplKHBvaW50c1tzdGFydCAlIGNvdW50XVtwcm9wZXJ0eV0pLCBzdGFydEJvdW5kLCBlbmRCb3VuZCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGFydC0tO1xuICAgICAgZW5kLS07XG4gICAgfVxuICAgIHN0YXJ0ICU9IGNvdW50O1xuICAgIGVuZCAlPSBjb3VudDtcbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkge1xuICAgIGVuZCArPSBjb3VudDtcbiAgfVxuICByZXR1cm4ge3N0YXJ0LCBlbmQsIGxvb3AsIHN0eWxlOiBzZWdtZW50LnN0eWxlfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdWItc2VnbWVudChzKSBvZiBhIGxpbmUgc2VnbWVudCB0aGF0IGZhbGwgaW4gdGhlIGdpdmVuIGJvdW5kc1xuICogQHBhcmFtIHtvYmplY3R9IHNlZ21lbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LnN0YXJ0IC0gc3RhcnQgaW5kZXggb2YgdGhlIHNlZ21lbnQsIHJlZmVycmluZyB0aGUgcG9pbnRzIGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gc2VnbWVudC5lbmQgLSBlbmQgaW5kZXggb2YgdGhlIHNlZ21lbnQsIHJlZmVycmluZyB0aGUgcG9pbnRzIGFycmF5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNlZ21lbnQubG9vcCAtIGluZGljYXRlcyB0aGF0IHRoZSBzZWdtZW50IGlzIGEgbG9vcFxuICogQHBhcmFtIHtvYmplY3R9IFtzZWdtZW50LnN0eWxlXSAtIHNlZ21lbnQgc3R5bGVcbiAqIEBwYXJhbSB7UG9pbnRFbGVtZW50W119IHBvaW50cyAtIHRoZSBwb2ludHMgdGhhdCB0aGlzIHNlZ21lbnQgcmVmZXJzIHRvXG4gKiBAcGFyYW0ge29iamVjdH0gW2JvdW5kc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZHMucHJvcGVydHkgLSB0aGUgcHJvcGVydHkgb2YgYSBgUG9pbnRFbGVtZW50YCB3ZSBhcmUgYm91bmRpbmcuIGB4YCwgYHlgIG9yIGBhbmdsZWAuXG4gKiBAcGFyYW0ge251bWJlcn0gYm91bmRzLnN0YXJ0IC0gc3RhcnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0ge251bWJlcn0gYm91bmRzLmVuZCAtIGVuZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHlcbiAqIEBwcml2YXRlXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gX2JvdW5kU2VnbWVudChzZWdtZW50LCBwb2ludHMsIGJvdW5kcykge1xuICBpZiAoIWJvdW5kcykge1xuICAgIHJldHVybiBbc2VnbWVudF07XG4gIH1cblxuICBjb25zdCB7cHJvcGVydHksIHN0YXJ0OiBzdGFydEJvdW5kLCBlbmQ6IGVuZEJvdW5kfSA9IGJvdW5kcztcbiAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICBjb25zdCB7Y29tcGFyZSwgYmV0d2Vlbiwgbm9ybWFsaXplfSA9IHByb3BlcnR5Rm4ocHJvcGVydHkpO1xuICBjb25zdCB7c3RhcnQsIGVuZCwgbG9vcCwgc3R5bGV9ID0gZ2V0U2VnbWVudChzZWdtZW50LCBwb2ludHMsIGJvdW5kcyk7XG5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgbGV0IHN1YlN0YXJ0ID0gbnVsbDtcbiAgbGV0IHZhbHVlLCBwb2ludCwgcHJldlZhbHVlO1xuXG4gIGNvbnN0IHN0YXJ0SXNCZWZvcmUgPSAoKSA9PiBiZXR3ZWVuKHN0YXJ0Qm91bmQsIHByZXZWYWx1ZSwgdmFsdWUpICYmIGNvbXBhcmUoc3RhcnRCb3VuZCwgcHJldlZhbHVlKSAhPT0gMDtcbiAgY29uc3QgZW5kSXNCZWZvcmUgPSAoKSA9PiBjb21wYXJlKGVuZEJvdW5kLCB2YWx1ZSkgPT09IDAgfHwgYmV0d2VlbihlbmRCb3VuZCwgcHJldlZhbHVlLCB2YWx1ZSk7XG4gIGNvbnN0IHNob3VsZFN0YXJ0ID0gKCkgPT4gaW5zaWRlIHx8IHN0YXJ0SXNCZWZvcmUoKTtcbiAgY29uc3Qgc2hvdWxkU3RvcCA9ICgpID0+ICFpbnNpZGUgfHwgZW5kSXNCZWZvcmUoKTtcblxuICBmb3IgKGxldCBpID0gc3RhcnQsIHByZXYgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkge1xuICAgIHBvaW50ID0gcG9pbnRzW2kgJSBjb3VudF07XG5cbiAgICBpZiAocG9pbnQuc2tpcCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFsdWUgPSBub3JtYWxpemUocG9pbnRbcHJvcGVydHldKTtcblxuICAgIGlmICh2YWx1ZSA9PT0gcHJldlZhbHVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpbnNpZGUgPSBiZXR3ZWVuKHZhbHVlLCBzdGFydEJvdW5kLCBlbmRCb3VuZCk7XG5cbiAgICBpZiAoc3ViU3RhcnQgPT09IG51bGwgJiYgc2hvdWxkU3RhcnQoKSkge1xuICAgICAgc3ViU3RhcnQgPSBjb21wYXJlKHZhbHVlLCBzdGFydEJvdW5kKSA9PT0gMCA/IGkgOiBwcmV2O1xuICAgIH1cblxuICAgIGlmIChzdWJTdGFydCAhPT0gbnVsbCAmJiBzaG91bGRTdG9wKCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5vcm1hbGl6ZVNlZ21lbnQoe3N0YXJ0OiBzdWJTdGFydCwgZW5kOiBpLCBsb29wLCBjb3VudCwgc3R5bGV9KSk7XG4gICAgICBzdWJTdGFydCA9IG51bGw7XG4gICAgfVxuICAgIHByZXYgPSBpO1xuICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgaWYgKHN1YlN0YXJ0ICE9PSBudWxsKSB7XG4gICAgcmVzdWx0LnB1c2gobm9ybWFsaXplU2VnbWVudCh7c3RhcnQ6IHN1YlN0YXJ0LCBlbmQsIGxvb3AsIGNvdW50LCBzdHlsZX0pKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWdtZW50cyBvZiB0aGUgbGluZSB0aGF0IGFyZSBpbnNpZGUgZ2l2ZW4gYm91bmRzXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gW2JvdW5kc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBib3VuZHMucHJvcGVydHkgLSB0aGUgcHJvcGVydHkgd2UgYXJlIGJvdW5kaW5nIHdpdGguIGB4YCwgYHlgIG9yIGBhbmdsZWAuXG4gKiBAcGFyYW0ge251bWJlcn0gYm91bmRzLnN0YXJ0IC0gc3RhcnQgdmFsdWUgb2YgdGhlIGBwcm9wZXJ0eWBcbiAqIEBwYXJhbSB7bnVtYmVyfSBib3VuZHMuZW5kIC0gZW5kIHZhbHVlIG9mIHRoZSBgcHJvcGVydHlgXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2JvdW5kU2VnbWVudHMobGluZSwgYm91bmRzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBjb25zdCBzZWdtZW50cyA9IGxpbmUuc2VnbWVudHM7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN1YiA9IF9ib3VuZFNlZ21lbnQoc2VnbWVudHNbaV0sIGxpbmUucG9pbnRzLCBib3VuZHMpO1xuICAgIGlmIChzdWIubGVuZ3RoKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5zdWIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpbmQgc3RhcnQgYW5kIGVuZCBpbmRleCBvZiBhIGxpbmUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTdGFydEFuZEVuZChwb2ludHMsIGNvdW50LCBsb29wLCBzcGFuR2Fwcykge1xuICBsZXQgc3RhcnQgPSAwO1xuICBsZXQgZW5kID0gY291bnQgLSAxO1xuXG4gIGlmIChsb29wICYmICFzcGFuR2Fwcykge1xuICAgIC8vIGxvb3AgYW5kIG5vdCBzcGFubmluZyBnYXBzLCBmaXJzdCBmaW5kIGEgZ2FwIHRvIHN0YXJ0IGZyb21cbiAgICB3aGlsZSAoc3RhcnQgPCBjb3VudCAmJiAhcG9pbnRzW3N0YXJ0XS5za2lwKSB7XG4gICAgICBzdGFydCsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgZmlyc3Qgbm9uIHNraXBwZWQgcG9pbnQgKGFmdGVyIHRoZSBmaXJzdCBnYXAgcG9zc2libHkpXG4gIHdoaWxlIChzdGFydCA8IGNvdW50ICYmIHBvaW50c1tzdGFydF0uc2tpcCkge1xuICAgIHN0YXJ0Kys7XG4gIH1cblxuICAvLyBpZiB3ZSBsb29wZWQgdG8gY291bnQsIHN0YXJ0IG5lZWRzIHRvIGJlIDBcbiAgc3RhcnQgJT0gY291bnQ7XG5cbiAgaWYgKGxvb3ApIHtcbiAgICAvLyBsb29wIHdpbGwgZ28gcGFzdCBjb3VudCwgaWYgc3RhcnQgPiAwXG4gICAgZW5kICs9IHN0YXJ0O1xuICB9XG5cbiAgd2hpbGUgKGVuZCA+IHN0YXJ0ICYmIHBvaW50c1tlbmQgJSBjb3VudF0uc2tpcCkge1xuICAgIGVuZC0tO1xuICB9XG5cbiAgLy8gZW5kIGNvdWxkIGJlIG1vcmUgdGhhbiBjb3VudCwgbm9ybWFsaXplXG4gIGVuZCAlPSBjb3VudDtcblxuICByZXR1cm4ge3N0YXJ0LCBlbmR9O1xufVxuXG4vKipcbiAqIENvbXB1dGUgc29saWQgc2VnbWVudHMgZnJvbSBQb2ludHMsIHdoZW4gc3BhbkdhcHMgPT09IGZhbHNlXG4gKiBAcGFyYW0ge1BvaW50RWxlbWVudFtdfSBwb2ludHMgLSB0aGUgcG9pbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBzdGFydCBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IG1heCAtIG1heCBpbmRleCAoY2FuIGdvIHBhc3QgY291bnQgb24gYSBsb29wKVxuICogQHBhcmFtIHtib29sZWFufSBsb29wIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhpcyB3b3VsZCBiZSBhIGxvb3AgaWYgbm8gZ2FwcyBhcmUgZm91bmRcbiAqL1xuZnVuY3Rpb24gc29saWRTZWdtZW50cyhwb2ludHMsIHN0YXJ0LCBtYXgsIGxvb3ApIHtcbiAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgbGV0IGxhc3QgPSBzdGFydDtcbiAgbGV0IHByZXYgPSBwb2ludHNbc3RhcnRdO1xuICBsZXQgZW5kO1xuXG4gIGZvciAoZW5kID0gc3RhcnQgKyAxOyBlbmQgPD0gbWF4OyArK2VuZCkge1xuICAgIGNvbnN0IGN1ciA9IHBvaW50c1tlbmQgJSBjb3VudF07XG4gICAgaWYgKGN1ci5za2lwIHx8IGN1ci5zdG9wKSB7XG4gICAgICBpZiAoIXByZXYuc2tpcCkge1xuICAgICAgICBsb29wID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtzdGFydDogc3RhcnQgJSBjb3VudCwgZW5kOiAoZW5kIC0gMSkgJSBjb3VudCwgbG9vcH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0ID0gbGFzdCA9IGN1ci5zdG9wID8gZW5kIDogbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdCA9IGVuZDtcbiAgICAgIGlmIChwcmV2LnNraXApIHtcbiAgICAgICAgc3RhcnQgPSBlbmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHByZXYgPSBjdXI7XG4gIH1cblxuICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgIHJlc3VsdC5wdXNoKHtzdGFydDogc3RhcnQgJSBjb3VudCwgZW5kOiBsYXN0ICUgY291bnQsIGxvb3B9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgY29udGludW91cyBzZWdtZW50cyB0aGF0IGRlZmluZSB0aGUgd2hvbGUgbGluZVxuICogVGhlcmUgY2FuIGJlIHNraXBwZWQgcG9pbnRzIHdpdGhpbiBhIHNlZ21lbnQsIGlmIHNwYW5HYXBzIGlzIHRydWUuXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gW3NlZ21lbnRPcHRpb25zXVxuICogQHJldHVybiB7U2VnbWVudFtdfVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jb21wdXRlU2VnbWVudHMobGluZSwgc2VnbWVudE9wdGlvbnMpIHtcbiAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IHNwYW5HYXBzID0gbGluZS5vcHRpb25zLnNwYW5HYXBzO1xuICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cbiAgaWYgKCFjb3VudCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxvb3AgPSAhIWxpbmUuX2xvb3A7XG4gIGNvbnN0IHtzdGFydCwgZW5kfSA9IGZpbmRTdGFydEFuZEVuZChwb2ludHMsIGNvdW50LCBsb29wLCBzcGFuR2Fwcyk7XG5cbiAgaWYgKHNwYW5HYXBzID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHNwbGl0QnlTdHlsZXMobGluZSwgW3tzdGFydCwgZW5kLCBsb29wfV0sIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgbWF4ID0gZW5kIDwgc3RhcnQgPyBlbmQgKyBjb3VudCA6IGVuZDtcbiAgY29uc3QgY29tcGxldGVMb29wID0gISFsaW5lLl9mdWxsTG9vcCAmJiBzdGFydCA9PT0gMCAmJiBlbmQgPT09IGNvdW50IC0gMTtcbiAgcmV0dXJuIHNwbGl0QnlTdHlsZXMobGluZSwgc29saWRTZWdtZW50cyhwb2ludHMsIHN0YXJ0LCBtYXgsIGNvbXBsZXRlTG9vcCksIHBvaW50cywgc2VnbWVudE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U2VnbWVudFtdfSBzZWdtZW50c1xuICogQHBhcmFtIHtQb2ludEVsZW1lbnRbXX0gcG9pbnRzXG4gKiBAcGFyYW0ge29iamVjdH0gW3NlZ21lbnRPcHRpb25zXVxuICogQHJldHVybiB7U2VnbWVudFtdfVxuICovXG5mdW5jdGlvbiBzcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKSB7XG4gIGlmICghc2VnbWVudE9wdGlvbnMgfHwgIXNlZ21lbnRPcHRpb25zLnNldENvbnRleHQgfHwgIXBvaW50cykge1xuICAgIHJldHVybiBzZWdtZW50cztcbiAgfVxuICByZXR1cm4gZG9TcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge1NlZ21lbnRbXX0gc2VnbWVudHNcbiAqIEBwYXJhbSB7UG9pbnRFbGVtZW50W119IHBvaW50c1xuICogQHBhcmFtIHtvYmplY3R9IFtzZWdtZW50T3B0aW9uc11cbiAqIEByZXR1cm4ge1NlZ21lbnRbXX1cbiAqL1xuZnVuY3Rpb24gZG9TcGxpdEJ5U3R5bGVzKGxpbmUsIHNlZ21lbnRzLCBwb2ludHMsIHNlZ21lbnRPcHRpb25zKSB7XG4gIGNvbnN0IGNoYXJ0Q29udGV4dCA9IGxpbmUuX2NoYXJ0LmdldENvbnRleHQoKTtcbiAgY29uc3QgYmFzZVN0eWxlID0gcmVhZFN0eWxlKGxpbmUub3B0aW9ucyk7XG4gIGNvbnN0IHtfZGF0YXNldEluZGV4OiBkYXRhc2V0SW5kZXgsIG9wdGlvbnM6IHtzcGFuR2Fwc319ID0gbGluZTtcbiAgY29uc3QgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgbGV0IHByZXZTdHlsZSA9IGJhc2VTdHlsZTtcbiAgbGV0IHN0YXJ0ID0gc2VnbWVudHNbMF0uc3RhcnQ7XG4gIGxldCBpID0gc3RhcnQ7XG5cbiAgZnVuY3Rpb24gYWRkU3R5bGUocywgZSwgbCwgc3QpIHtcbiAgICBjb25zdCBkaXIgPSBzcGFuR2FwcyA/IC0xIDogMTtcbiAgICBpZiAocyA9PT0gZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdHlsZSBjYW4gbm90IHN0YXJ0L2VuZCBvbiBhIHNraXBwZWQgcG9pbnQsIGFkanVzdCBpbmRpY2VzIGFjY29yZGluZ2x5XG4gICAgcyArPSBjb3VudDtcbiAgICB3aGlsZSAocG9pbnRzW3MgJSBjb3VudF0uc2tpcCkge1xuICAgICAgcyAtPSBkaXI7XG4gICAgfVxuICAgIHdoaWxlIChwb2ludHNbZSAlIGNvdW50XS5za2lwKSB7XG4gICAgICBlICs9IGRpcjtcbiAgICB9XG4gICAgaWYgKHMgJSBjb3VudCAhPT0gZSAlIGNvdW50KSB7XG4gICAgICByZXN1bHQucHVzaCh7c3RhcnQ6IHMgJSBjb3VudCwgZW5kOiBlICUgY291bnQsIGxvb3A6IGwsIHN0eWxlOiBzdH0pO1xuICAgICAgcHJldlN0eWxlID0gc3Q7XG4gICAgICBzdGFydCA9IGUgJSBjb3VudDtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBzdGFydCA9IHNwYW5HYXBzID8gc3RhcnQgOiBzZWdtZW50LnN0YXJ0O1xuICAgIGxldCBwcmV2ID0gcG9pbnRzW3N0YXJ0ICUgY291bnRdO1xuICAgIGxldCBzdHlsZTtcbiAgICBmb3IgKGkgPSBzdGFydCArIDE7IGkgPD0gc2VnbWVudC5lbmQ7IGkrKykge1xuICAgICAgY29uc3QgcHQgPSBwb2ludHNbaSAlIGNvdW50XTtcbiAgICAgIHN0eWxlID0gcmVhZFN0eWxlKHNlZ21lbnRPcHRpb25zLnNldENvbnRleHQoY3JlYXRlQ29udGV4dChjaGFydENvbnRleHQsIHtcbiAgICAgICAgdHlwZTogJ3NlZ21lbnQnLFxuICAgICAgICBwMDogcHJldixcbiAgICAgICAgcDE6IHB0LFxuICAgICAgICBwMERhdGFJbmRleDogKGkgLSAxKSAlIGNvdW50LFxuICAgICAgICBwMURhdGFJbmRleDogaSAlIGNvdW50LFxuICAgICAgICBkYXRhc2V0SW5kZXhcbiAgICAgIH0pKSk7XG4gICAgICBpZiAoc3R5bGVDaGFuZ2VkKHN0eWxlLCBwcmV2U3R5bGUpKSB7XG4gICAgICAgIGFkZFN0eWxlKHN0YXJ0LCBpIC0gMSwgc2VnbWVudC5sb29wLCBwcmV2U3R5bGUpO1xuICAgICAgfVxuICAgICAgcHJldiA9IHB0O1xuICAgICAgcHJldlN0eWxlID0gc3R5bGU7XG4gICAgfVxuICAgIGlmIChzdGFydCA8IGkgLSAxKSB7XG4gICAgICBhZGRTdHlsZShzdGFydCwgaSAtIDEsIHNlZ21lbnQubG9vcCwgcHJldlN0eWxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZWFkU3R5bGUob3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgYm9yZGVyQ2FwU3R5bGU6IG9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUsXG4gICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgIGJvcmRlckRhc2hPZmZzZXQ6IG9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCxcbiAgICBib3JkZXJKb2luU3R5bGU6IG9wdGlvbnMuYm9yZGVySm9pblN0eWxlLFxuICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ2hhbmdlZChzdHlsZSwgcHJldlN0eWxlKSB7XG4gIHJldHVybiBwcmV2U3R5bGUgJiYgSlNPTi5zdHJpbmdpZnkoc3R5bGUpICE9PSBKU09OLnN0cmluZ2lmeShwcmV2U3R5bGUpO1xufVxuIiwgImltcG9ydCB7cmVxdWVzdEFuaW1GcmFtZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4vY29yZS5hbmltYXRpb24uanMnKS5kZWZhdWx0IH0gQW5pbWF0aW9uXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqL1xuXG4vKipcbiAqIFBsZWFzZSB1c2UgdGhlIG1vZHVsZSdzIGRlZmF1bHQgZXhwb3J0IHdoaWNoIHByb3ZpZGVzIGEgc2luZ2xldG9uIGluc3RhbmNlXG4gKiBOb3RlOiBjbGFzcyBpcyBleHBvcnQgZm9yIHR5cGVkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIEFuaW1hdG9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgdGhpcy5fY2hhcnRzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9sYXN0RGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX25vdGlmeShjaGFydCwgYW5pbXMsIGRhdGUsIHR5cGUpIHtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBhbmltcy5saXN0ZW5lcnNbdHlwZV07XG4gICAgY29uc3QgbnVtU3RlcHMgPSBhbmltcy5kdXJhdGlvbjtcblxuICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZuID0+IGZuKHtcbiAgICAgIGNoYXJ0LFxuICAgICAgaW5pdGlhbDogYW5pbXMuaW5pdGlhbCxcbiAgICAgIG51bVN0ZXBzLFxuICAgICAgY3VycmVudFN0ZXA6IE1hdGgubWluKGRhdGUgLSBhbmltcy5zdGFydCwgbnVtU3RlcHMpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVmcmVzaCgpIHtcbiAgICBpZiAodGhpcy5fcmVxdWVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuX3JlcXVlc3QgPSByZXF1ZXN0QW5pbUZyYW1lLmNhbGwod2luZG93LCAoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcnVubmluZykge1xuICAgICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF91cGRhdGUoZGF0ZSA9IERhdGUubm93KCkpIHtcbiAgICBsZXQgcmVtYWluaW5nID0gMDtcblxuICAgIHRoaXMuX2NoYXJ0cy5mb3JFYWNoKChhbmltcywgY2hhcnQpID0+IHtcbiAgICAgIGlmICghYW5pbXMucnVubmluZyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW1zID0gYW5pbXMuaXRlbXM7XG4gICAgICBsZXQgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICBsZXQgZHJhdyA9IGZhbHNlO1xuICAgICAgbGV0IGl0ZW07XG5cbiAgICAgIGZvciAoOyBpID49IDA7IC0taSkge1xuICAgICAgICBpdGVtID0gaXRlbXNbaV07XG5cbiAgICAgICAgaWYgKGl0ZW0uX2FjdGl2ZSkge1xuICAgICAgICAgIGlmIChpdGVtLl90b3RhbCA+IGFuaW1zLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYW5pbWF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIGl0cyBkdXJhdGlvbiBwcm9sb25nZWQsXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdG90YWwgZHVyYXRpb24gb2YgY3VycmVudCBhbmltYXRpb25zIHJ1biAoZm9yIHByb2dyZXNzIGV2ZW50KVxuICAgICAgICAgICAgYW5pbXMuZHVyYXRpb24gPSBpdGVtLl90b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaXRlbS50aWNrKGRhdGUpO1xuICAgICAgICAgIGRyYXcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBieSByZXBsYWNpbmcgaXQgd2l0aCBsYXN0IGl0ZW0gYW5kIHJlbW92aW5nIHRoZSBsYXN0XG4gICAgICAgICAgLy8gQSBsb3QgZmFzdGVyIHRoYW4gc3BsaWNlLlxuICAgICAgICAgIGl0ZW1zW2ldID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaXRlbXMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRyYXcpIHtcbiAgICAgICAgY2hhcnQuZHJhdygpO1xuICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCAncHJvZ3Jlc3MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgYW5pbXMucnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBkYXRlLCAnY29tcGxldGUnKTtcbiAgICAgICAgYW5pbXMuaW5pdGlhbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZW1haW5pbmcgKz0gaXRlbXMubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fbGFzdERhdGUgPSBkYXRlO1xuXG4gICAgaWYgKHJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldEFuaW1zKGNoYXJ0KSB7XG4gICAgY29uc3QgY2hhcnRzID0gdGhpcy5fY2hhcnRzO1xuICAgIGxldCBhbmltcyA9IGNoYXJ0cy5nZXQoY2hhcnQpO1xuICAgIGlmICghYW5pbXMpIHtcbiAgICAgIGFuaW1zID0ge1xuICAgICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgICAgaW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBjb21wbGV0ZTogW10sXG4gICAgICAgICAgcHJvZ3Jlc3M6IFtdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjaGFydHMuc2V0KGNoYXJ0LCBhbmltcyk7XG4gICAgfVxuICAgIHJldHVybiBhbmltcztcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBldmVudCBuYW1lXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIC0gY2FsbGJhY2tcblx0ICovXG4gIGxpc3RlbihjaGFydCwgZXZlbnQsIGNiKSB7XG4gICAgdGhpcy5fZ2V0QW5pbXMoY2hhcnQpLmxpc3RlbmVyc1tldmVudF0ucHVzaChjYik7XG4gIH1cblxuICAvKipcblx0ICogQWRkIGFuaW1hdGlvbnNcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnRcblx0ICogQHBhcmFtIHtBbmltYXRpb25bXX0gaXRlbXMgLSBhbmltYXRpb25zXG5cdCAqL1xuICBhZGQoY2hhcnQsIGl0ZW1zKSB7XG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2dldEFuaW1zKGNoYXJ0KS5pdGVtcy5wdXNoKC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBDb3VudHMgbnVtYmVyIG9mIGFjdGl2ZSBhbmltYXRpb25zIGZvciB0aGUgY2hhcnRcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnRcblx0ICovXG4gIGhhcyhjaGFydCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRBbmltcyhjaGFydCkuaXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBTdGFydCBhbmltYXRpbmcgKGFsbCBjaGFydHMpXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqL1xuICBzdGFydChjaGFydCkge1xuICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgaWYgKCFhbmltcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhbmltcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICBhbmltcy5zdGFydCA9IERhdGUubm93KCk7XG4gICAgYW5pbXMuZHVyYXRpb24gPSBhbmltcy5pdGVtcy5yZWR1Y2UoKGFjYywgY3VyKSA9PiBNYXRoLm1heChhY2MsIGN1ci5fZHVyYXRpb24pLCAwKTtcbiAgICB0aGlzLl9yZWZyZXNoKCk7XG4gIH1cblxuICBydW5uaW5nKGNoYXJ0KSB7XG4gICAgaWYgKCF0aGlzLl9ydW5uaW5nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgaWYgKCFhbmltcyB8fCAhYW5pbXMucnVubmluZyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG5cdCAqIFN0b3AgYWxsIGFuaW1hdGlvbnMgZm9yIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKi9cbiAgc3RvcChjaGFydCkge1xuICAgIGNvbnN0IGFuaW1zID0gdGhpcy5fY2hhcnRzLmdldChjaGFydCk7XG4gICAgaWYgKCFhbmltcyB8fCAhYW5pbXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1zID0gYW5pbXMuaXRlbXM7XG4gICAgbGV0IGkgPSBpdGVtcy5sZW5ndGggLSAxO1xuXG4gICAgZm9yICg7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBpdGVtc1tpXS5jYW5jZWwoKTtcbiAgICB9XG4gICAgYW5pbXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLl9ub3RpZnkoY2hhcnQsIGFuaW1zLCBEYXRlLm5vdygpLCAnY29tcGxldGUnKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZW1vdmUgY2hhcnQgZnJvbSBBbmltYXRvclxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKi9cbiAgcmVtb3ZlKGNoYXJ0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0cy5kZWxldGUoY2hhcnQpO1xuICB9XG59XG5cbi8vIHNpbmdsZXRvbiBpbnN0YW5jZVxuZXhwb3J0IGRlZmF1bHQgLyogI19fUFVSRV9fICovIG5ldyBBbmltYXRvcigpO1xuIiwgImltcG9ydCBlZmZlY3RzIGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5lYXNpbmcuanMnO1xuaW1wb3J0IHtyZXNvbHZlfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMub3B0aW9ucy5qcyc7XG5pbXBvcnQge2NvbG9yIGFzIGhlbHBlcnNDb2xvcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvbG9yLmpzJztcblxuY29uc3QgdHJhbnNwYXJlbnQgPSAndHJhbnNwYXJlbnQnO1xuY29uc3QgaW50ZXJwb2xhdG9ycyA9IHtcbiAgYm9vbGVhbihmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgcmV0dXJuIGZhY3RvciA+IDAuNSA/IHRvIDogZnJvbTtcbiAgfSxcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b1xuICAgKiBAcGFyYW0ge251bWJlcn0gZmFjdG9yXG4gICAqL1xuICBjb2xvcihmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgY29uc3QgYzAgPSBoZWxwZXJzQ29sb3IoZnJvbSB8fCB0cmFuc3BhcmVudCk7XG4gICAgY29uc3QgYzEgPSBjMC52YWxpZCAmJiBoZWxwZXJzQ29sb3IodG8gfHwgdHJhbnNwYXJlbnQpO1xuICAgIHJldHVybiBjMSAmJiBjMS52YWxpZFxuICAgICAgPyBjMS5taXgoYzAsIGZhY3RvcikuaGV4U3RyaW5nKClcbiAgICAgIDogdG87XG4gIH0sXG4gIG51bWJlcihmcm9tLCB0bywgZmFjdG9yKSB7XG4gICAgcmV0dXJuIGZyb20gKyAodG8gLSBmcm9tKSAqIGZhY3RvcjtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5pbWF0aW9uIHtcbiAgY29uc3RydWN0b3IoY2ZnLCB0YXJnZXQsIHByb3AsIHRvKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuXG4gICAgdG8gPSByZXNvbHZlKFtjZmcudG8sIHRvLCBjdXJyZW50VmFsdWUsIGNmZy5mcm9tXSk7XG4gICAgY29uc3QgZnJvbSA9IHJlc29sdmUoW2NmZy5mcm9tLCBjdXJyZW50VmFsdWUsIHRvXSk7XG5cbiAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuX2ZuID0gY2ZnLmZuIHx8IGludGVycG9sYXRvcnNbY2ZnLnR5cGUgfHwgdHlwZW9mIGZyb21dO1xuICAgIHRoaXMuX2Vhc2luZyA9IGVmZmVjdHNbY2ZnLmVhc2luZ10gfHwgZWZmZWN0cy5saW5lYXI7XG4gICAgdGhpcy5fc3RhcnQgPSBNYXRoLmZsb29yKERhdGUubm93KCkgKyAoY2ZnLmRlbGF5IHx8IDApKTtcbiAgICB0aGlzLl9kdXJhdGlvbiA9IHRoaXMuX3RvdGFsID0gTWF0aC5mbG9vcihjZmcuZHVyYXRpb24pO1xuICAgIHRoaXMuX2xvb3AgPSAhIWNmZy5sb29wO1xuICAgIHRoaXMuX3RhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLl9wcm9wID0gcHJvcDtcbiAgICB0aGlzLl9mcm9tID0gZnJvbTtcbiAgICB0aGlzLl90byA9IHRvO1xuICAgIHRoaXMuX3Byb21pc2VzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICB1cGRhdGUoY2ZnLCB0bywgZGF0ZSkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuX25vdGlmeShmYWxzZSk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX3RhcmdldFt0aGlzLl9wcm9wXTtcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSBkYXRlIC0gdGhpcy5fc3RhcnQ7XG4gICAgICBjb25zdCByZW1haW4gPSB0aGlzLl9kdXJhdGlvbiAtIGVsYXBzZWQ7XG4gICAgICB0aGlzLl9zdGFydCA9IGRhdGU7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IE1hdGguZmxvb3IoTWF0aC5tYXgocmVtYWluLCBjZmcuZHVyYXRpb24pKTtcbiAgICAgIHRoaXMuX3RvdGFsICs9IGVsYXBzZWQ7XG4gICAgICB0aGlzLl9sb29wID0gISFjZmcubG9vcDtcbiAgICAgIHRoaXMuX3RvID0gcmVzb2x2ZShbY2ZnLnRvLCB0bywgY3VycmVudFZhbHVlLCBjZmcuZnJvbV0pO1xuICAgICAgdGhpcy5fZnJvbSA9IHJlc29sdmUoW2NmZy5mcm9tLCBjdXJyZW50VmFsdWUsIHRvXSk7XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIC8vIHVwZGF0ZSBjdXJyZW50IGV2YWx1YXRlZCB2YWx1ZSwgZm9yIHNtb290aGVyIGFuaW1hdGlvbnNcbiAgICAgIHRoaXMudGljayhEYXRlLm5vdygpKTtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbm90aWZ5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICB0aWNrKGRhdGUpIHtcbiAgICBjb25zdCBlbGFwc2VkID0gZGF0ZSAtIHRoaXMuX3N0YXJ0O1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuX3Byb3A7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuX2Zyb207XG4gICAgY29uc3QgbG9vcCA9IHRoaXMuX2xvb3A7XG4gICAgY29uc3QgdG8gPSB0aGlzLl90bztcbiAgICBsZXQgZmFjdG9yO1xuXG4gICAgdGhpcy5fYWN0aXZlID0gZnJvbSAhPT0gdG8gJiYgKGxvb3AgfHwgKGVsYXBzZWQgPCBkdXJhdGlvbikpO1xuXG4gICAgaWYgKCF0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuX3RhcmdldFtwcm9wXSA9IHRvO1xuICAgICAgdGhpcy5fbm90aWZ5KHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbGFwc2VkIDwgMCkge1xuICAgICAgdGhpcy5fdGFyZ2V0W3Byb3BdID0gZnJvbTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmYWN0b3IgPSAoZWxhcHNlZCAvIGR1cmF0aW9uKSAlIDI7XG4gICAgZmFjdG9yID0gbG9vcCAmJiBmYWN0b3IgPiAxID8gMiAtIGZhY3RvciA6IGZhY3RvcjtcbiAgICBmYWN0b3IgPSB0aGlzLl9lYXNpbmcoTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgZmFjdG9yKSkpO1xuXG4gICAgdGhpcy5fdGFyZ2V0W3Byb3BdID0gdGhpcy5fZm4oZnJvbSwgdG8sIGZhY3Rvcik7XG4gIH1cblxuICB3YWl0KCkge1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5fcHJvbWlzZXMgfHwgKHRoaXMuX3Byb21pc2VzID0gW10pO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIHByb21pc2VzLnB1c2goe3JlcywgcmVqfSk7XG4gICAgfSk7XG4gIH1cblxuICBfbm90aWZ5KHJlc29sdmVkKSB7XG4gICAgY29uc3QgbWV0aG9kID0gcmVzb2x2ZWQgPyAncmVzJyA6ICdyZWonO1xuICAgIGNvbnN0IHByb21pc2VzID0gdGhpcy5fcHJvbWlzZXMgfHwgW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcHJvbWlzZXNbaV1bbWV0aG9kXSgpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBhbmltYXRvciBmcm9tICcuL2NvcmUuYW5pbWF0b3IuanMnO1xuaW1wb3J0IEFuaW1hdGlvbiBmcm9tICcuL2NvcmUuYW5pbWF0aW9uLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2NvcmUuZGVmYXVsdHMuanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc09iamVjdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbmltYXRpb25zIHtcbiAgY29uc3RydWN0b3IoY2hhcnQsIGNvbmZpZykge1xuICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gICAgdGhpcy5fcHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmNvbmZpZ3VyZShjb25maWcpO1xuICB9XG5cbiAgY29uZmlndXJlKGNvbmZpZykge1xuICAgIGlmICghaXNPYmplY3QoY29uZmlnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSBPYmplY3Qua2V5cyhkZWZhdWx0cy5hbmltYXRpb24pO1xuICAgIGNvbnN0IGFuaW1hdGVkUHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzO1xuXG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29uZmlnKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBjb25maWdba2V5XTtcbiAgICAgIGlmICghaXNPYmplY3QoY2ZnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgYW5pbWF0aW9uT3B0aW9ucykge1xuICAgICAgICByZXNvbHZlZFtvcHRpb25dID0gY2ZnW29wdGlvbl07XG4gICAgICB9XG5cbiAgICAgIChpc0FycmF5KGNmZy5wcm9wZXJ0aWVzKSAmJiBjZmcucHJvcGVydGllcyB8fCBba2V5XSkuZm9yRWFjaCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcCA9PT0ga2V5IHx8ICFhbmltYXRlZFByb3BzLmhhcyhwcm9wKSkge1xuICAgICAgICAgIGFuaW1hdGVkUHJvcHMuc2V0KHByb3AsIHJlc29sdmVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcblx0ICogVXRpbGl0eSB0byBoYW5kbGUgYW5pbWF0aW9uIG9mIGBvcHRpb25zYC5cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9hbmltYXRlT3B0aW9ucyh0YXJnZXQsIHZhbHVlcykge1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB2YWx1ZXMub3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZVRhcmdldE9wdGlvbnModGFyZ2V0LCBuZXdPcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5fY3JlYXRlQW5pbWF0aW9ucyhvcHRpb25zLCBuZXdPcHRpb25zKTtcbiAgICBpZiAobmV3T3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgICAvLyBHb2luZyB0byBzaGFyZWQgb3B0aW9uczpcbiAgICAgIC8vIEFmdGVyIGFsbCBhbmltYXRpb25zIGFyZSBkb25lLCBhc3NpZ24gdGhlIHNoYXJlZCBvcHRpb25zIG9iamVjdCB0byB0aGUgZWxlbWVudFxuICAgICAgLy8gU28gYW55IG5ldyB1cGRhdGVzIHRvIHRoZSBzaGFyZWQgb3B0aW9ucyBhcmUgb2JzZXJ2ZWRcbiAgICAgIGF3YWl0QWxsKHRhcmdldC5vcHRpb25zLiRhbmltYXRpb25zLCBuZXdPcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFyZ2V0Lm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAvLyByZWplY3RlZCwgbm9vcFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9jcmVhdGVBbmltYXRpb25zKHRhcmdldCwgdmFsdWVzKSB7XG4gICAgY29uc3QgYW5pbWF0ZWRQcm9wcyA9IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgY29uc3QgYW5pbWF0aW9ucyA9IFtdO1xuICAgIGNvbnN0IHJ1bm5pbmcgPSB0YXJnZXQuJGFuaW1hdGlvbnMgfHwgKHRhcmdldC4kYW5pbWF0aW9ucyA9IHt9KTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG4gICAgY29uc3QgZGF0ZSA9IERhdGUubm93KCk7XG4gICAgbGV0IGk7XG5cbiAgICBmb3IgKGkgPSBwcm9wcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgaWYgKHByb3AuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wID09PSAnb3B0aW9ucycpIHtcbiAgICAgICAgYW5pbWF0aW9ucy5wdXNoKC4uLnRoaXMuX2FuaW1hdGVPcHRpb25zKHRhcmdldCwgdmFsdWVzKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbcHJvcF07XG4gICAgICBsZXQgYW5pbWF0aW9uID0gcnVubmluZ1twcm9wXTtcbiAgICAgIGNvbnN0IGNmZyA9IGFuaW1hdGVkUHJvcHMuZ2V0KHByb3ApO1xuXG4gICAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICAgIGlmIChjZmcgJiYgYW5pbWF0aW9uLmFjdGl2ZSgpKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXhpc3RpbmcgYWN0aXZlIGFuaW1hdGlvbiwgbGV0J3MgdXBkYXRlIHRoYXRcbiAgICAgICAgICBhbmltYXRpb24udXBkYXRlKGNmZywgdmFsdWUsIGRhdGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjZmcgfHwgIWNmZy5kdXJhdGlvbikge1xuICAgICAgICAvLyBub3QgYW5pbWF0ZWQsIHNldCBkaXJlY3RseSB0byBuZXcgdmFsdWVcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBydW5uaW5nW3Byb3BdID0gYW5pbWF0aW9uID0gbmV3IEFuaW1hdGlvbihjZmcsIHRhcmdldCwgcHJvcCwgdmFsdWUpO1xuICAgICAgYW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBhbmltYXRpb25zO1xuICB9XG5cblxuICAvKipcblx0ICogVXBkYXRlIGB0YXJnZXRgIHByb3BlcnRpZXMgdG8gbmV3IHZhbHVlcywgdXNpbmcgY29uZmlndXJlZCBhbmltYXRpb25zXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgLSBvYmplY3QgdG8gdXBkYXRlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgLSBuZXcgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge2Jvb2xlYW58dW5kZWZpbmVkfSAtIGB0cnVlYCBpZiBhbmltYXRpb25zIHdlcmUgc3RhcnRlZFxuXHQgKiovXG4gIHVwZGF0ZSh0YXJnZXQsIHZhbHVlcykge1xuICAgIGlmICh0aGlzLl9wcm9wZXJ0aWVzLnNpemUgPT09IDApIHtcbiAgICAgIC8vIE5vdGhpbmcgaXMgYW5pbWF0ZWQsIGp1c3QgYXBwbHkgdGhlIG5ldyB2YWx1ZXMuXG4gICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgdmFsdWVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbmltYXRpb25zID0gdGhpcy5fY3JlYXRlQW5pbWF0aW9ucyh0YXJnZXQsIHZhbHVlcyk7XG5cbiAgICBpZiAoYW5pbWF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGFuaW1hdG9yLmFkZCh0aGlzLl9jaGFydCwgYW5pbWF0aW9ucyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXdhaXRBbGwoYW5pbWF0aW9ucywgcHJvcGVydGllcykge1xuICBjb25zdCBydW5uaW5nID0gW107XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYW5pbSA9IGFuaW1hdGlvbnNba2V5c1tpXV07XG4gICAgaWYgKGFuaW0gJiYgYW5pbS5hY3RpdmUoKSkge1xuICAgICAgcnVubmluZy5wdXNoKGFuaW0ud2FpdCgpKTtcbiAgICB9XG4gIH1cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gUHJvbWlzZS5hbGwocnVubmluZyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUYXJnZXRPcHRpb25zKHRhcmdldCwgbmV3T3B0aW9ucykge1xuICBpZiAoIW5ld09wdGlvbnMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG9wdGlvbnMgPSB0YXJnZXQub3B0aW9ucztcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgdGFyZ2V0Lm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAob3B0aW9ucy4kc2hhcmVkKSB7XG4gICAgLy8gR29pbmcgZnJvbSBzaGFyZWQgb3B0aW9ucyB0byBkaXN0aW5jdCBvbmU6XG4gICAgLy8gQ3JlYXRlIG5ldyBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIHRoZSBvbGQgc2hhcmVkIHZhbHVlcyBhbmQgc3RhcnQgdXBkYXRpbmcgdGhhdC5cbiAgICB0YXJnZXQub3B0aW9ucyA9IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7JHNoYXJlZDogZmFsc2UsICRhbmltYXRpb25zOiB7fX0pO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuIiwgImltcG9ydCBBbmltYXRpb25zIGZyb20gJy4vY29yZS5hbmltYXRpb25zLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2NvcmUuZGVmYXVsdHMuanMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc0Zpbml0ZSwgaXNPYmplY3QsIHZhbHVlT3JEZWZhdWx0LCByZXNvbHZlT2JqZWN0S2V5LCBkZWZpbmVkfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge2xpc3RlbkFycmF5RXZlbnRzLCB1bmxpc3RlbkFycmF5RXZlbnRzfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQge2NyZWF0ZUNvbnRleHQsIHNpZ259IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4vY29yZS5zY2FsZS5qcycpLmRlZmF1bHQgfSBTY2FsZVxuICovXG5cbmZ1bmN0aW9uIHNjYWxlQ2xpcChzY2FsZSwgYWxsb3dlZE92ZXJmbG93KSB7XG4gIGNvbnN0IG9wdHMgPSBzY2FsZSAmJiBzY2FsZS5vcHRpb25zIHx8IHt9O1xuICBjb25zdCByZXZlcnNlID0gb3B0cy5yZXZlcnNlO1xuICBjb25zdCBtaW4gPSBvcHRzLm1pbiA9PT0gdW5kZWZpbmVkID8gYWxsb3dlZE92ZXJmbG93IDogMDtcbiAgY29uc3QgbWF4ID0gb3B0cy5tYXggPT09IHVuZGVmaW5lZCA/IGFsbG93ZWRPdmVyZmxvdyA6IDA7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHJldmVyc2UgPyBtYXggOiBtaW4sXG4gICAgZW5kOiByZXZlcnNlID8gbWluIDogbWF4XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDbGlwKHhTY2FsZSwgeVNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpIHtcbiAgaWYgKGFsbG93ZWRPdmVyZmxvdyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgeCA9IHNjYWxlQ2xpcCh4U2NhbGUsIGFsbG93ZWRPdmVyZmxvdyk7XG4gIGNvbnN0IHkgPSBzY2FsZUNsaXAoeVNjYWxlLCBhbGxvd2VkT3ZlcmZsb3cpO1xuXG4gIHJldHVybiB7XG4gICAgdG9wOiB5LmVuZCxcbiAgICByaWdodDogeC5lbmQsXG4gICAgYm90dG9tOiB5LnN0YXJ0LFxuICAgIGxlZnQ6IHguc3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9DbGlwKHZhbHVlKSB7XG4gIGxldCB0LCByLCBiLCBsO1xuXG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB0ID0gdmFsdWUudG9wO1xuICAgIHIgPSB2YWx1ZS5yaWdodDtcbiAgICBiID0gdmFsdWUuYm90dG9tO1xuICAgIGwgPSB2YWx1ZS5sZWZ0O1xuICB9IGVsc2Uge1xuICAgIHQgPSByID0gYiA9IGwgPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiB0LFxuICAgIHJpZ2h0OiByLFxuICAgIGJvdHRvbTogYixcbiAgICBsZWZ0OiBsLFxuICAgIGRpc2FibGVkOiB2YWx1ZSA9PT0gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIGZpbHRlclZpc2libGUpIHtcbiAgY29uc3Qga2V5cyA9IFtdO1xuICBjb25zdCBtZXRhc2V0cyA9IGNoYXJ0Ll9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZmlsdGVyVmlzaWJsZSk7XG4gIGxldCBpLCBpbGVuO1xuXG4gIGZvciAoaSA9IDAsIGlsZW4gPSBtZXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBrZXlzLnB1c2gobWV0YXNldHNbaV0uaW5kZXgpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuXG5mdW5jdGlvbiBhcHBseVN0YWNrKHN0YWNrLCB2YWx1ZSwgZHNJbmRleCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGtleXMgPSBzdGFjay5rZXlzO1xuICBjb25zdCBzaW5nbGVNb2RlID0gb3B0aW9ucy5tb2RlID09PSAnc2luZ2xlJztcbiAgbGV0IGksIGlsZW4sIGRhdGFzZXRJbmRleCwgb3RoZXJWYWx1ZTtcblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBkYXRhc2V0SW5kZXggPSAra2V5c1tpXTtcbiAgICBpZiAoZGF0YXNldEluZGV4ID09PSBkc0luZGV4KSB7XG4gICAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgb3RoZXJWYWx1ZSA9IHN0YWNrLnZhbHVlc1tkYXRhc2V0SW5kZXhdO1xuICAgIGlmIChpc0Zpbml0ZShvdGhlclZhbHVlKSAmJiAoc2luZ2xlTW9kZSB8fCAodmFsdWUgPT09IDAgfHwgc2lnbih2YWx1ZSkgPT09IHNpZ24ob3RoZXJWYWx1ZSkpKSkge1xuICAgICAgdmFsdWUgKz0gb3RoZXJWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2JqZWN0RGF0YVRvQXJyYXkoZGF0YSkge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIGNvbnN0IGFkYXRhID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgbGV0IGksIGlsZW4sIGtleTtcbiAgZm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICBhZGF0YVtpXSA9IHtcbiAgICAgIHg6IGtleSxcbiAgICAgIHk6IGRhdGFba2V5XVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGFkYXRhO1xufVxuXG5mdW5jdGlvbiBpc1N0YWNrZWQoc2NhbGUsIG1ldGEpIHtcbiAgY29uc3Qgc3RhY2tlZCA9IHNjYWxlICYmIHNjYWxlLm9wdGlvbnMuc3RhY2tlZDtcbiAgcmV0dXJuIHN0YWNrZWQgfHwgKHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrICE9PSB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBnZXRTdGFja0tleShpbmRleFNjYWxlLCB2YWx1ZVNjYWxlLCBtZXRhKSB7XG4gIHJldHVybiBgJHtpbmRleFNjYWxlLmlkfS4ke3ZhbHVlU2NhbGUuaWR9LiR7bWV0YS5zdGFjayB8fCBtZXRhLnR5cGV9YDtcbn1cblxuZnVuY3Rpb24gZ2V0VXNlckJvdW5kcyhzY2FsZSkge1xuICBjb25zdCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gc2NhbGUuZ2V0VXNlckJvdW5kcygpO1xuICByZXR1cm4ge1xuICAgIG1pbjogbWluRGVmaW5lZCA/IG1pbiA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxcbiAgICBtYXg6IG1heERlZmluZWQgPyBtYXggOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JDcmVhdGVTdGFjayhzdGFja3MsIHN0YWNrS2V5LCBpbmRleFZhbHVlKSB7XG4gIGNvbnN0IHN1YlN0YWNrID0gc3RhY2tzW3N0YWNrS2V5XSB8fCAoc3RhY2tzW3N0YWNrS2V5XSA9IHt9KTtcbiAgcmV0dXJuIHN1YlN0YWNrW2luZGV4VmFsdWVdIHx8IChzdWJTdGFja1tpbmRleFZhbHVlXSA9IHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCBwb3NpdGl2ZSwgdHlwZSkge1xuICBmb3IgKGNvbnN0IG1ldGEgb2YgdlNjYWxlLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKHR5cGUpLnJldmVyc2UoKSkge1xuICAgIGNvbnN0IHZhbHVlID0gc3RhY2tbbWV0YS5pbmRleF07XG4gICAgaWYgKChwb3NpdGl2ZSAmJiB2YWx1ZSA+IDApIHx8ICghcG9zaXRpdmUgJiYgdmFsdWUgPCAwKSkge1xuICAgICAgcmV0dXJuIG1ldGEuaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0YWNrcyhjb250cm9sbGVyLCBwYXJzZWQpIHtcbiAgY29uc3Qge2NoYXJ0LCBfY2FjaGVkTWV0YTogbWV0YX0gPSBjb250cm9sbGVyO1xuICBjb25zdCBzdGFja3MgPSBjaGFydC5fc3RhY2tzIHx8IChjaGFydC5fc3RhY2tzID0ge30pOyAvLyBtYXAgc3RydWN0dXJlIGlzIHtzdGFja0tleToge2RhdGFzZXRJbmRleDogdmFsdWV9fVxuICBjb25zdCB7aVNjYWxlLCB2U2NhbGUsIGluZGV4OiBkYXRhc2V0SW5kZXh9ID0gbWV0YTtcbiAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcbiAgY29uc3Qga2V5ID0gZ2V0U3RhY2tLZXkoaVNjYWxlLCB2U2NhbGUsIG1ldGEpO1xuICBjb25zdCBpbGVuID0gcGFyc2VkLmxlbmd0aDtcbiAgbGV0IHN0YWNrO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY29uc3QgaXRlbSA9IHBhcnNlZFtpXTtcbiAgICBjb25zdCB7W2lBeGlzXTogaW5kZXgsIFt2QXhpc106IHZhbHVlfSA9IGl0ZW07XG4gICAgY29uc3QgaXRlbVN0YWNrcyA9IGl0ZW0uX3N0YWNrcyB8fCAoaXRlbS5fc3RhY2tzID0ge30pO1xuICAgIHN0YWNrID0gaXRlbVN0YWNrc1t2QXhpc10gPSBnZXRPckNyZWF0ZVN0YWNrKHN0YWNrcywga2V5LCBpbmRleCk7XG4gICAgc3RhY2tbZGF0YXNldEluZGV4XSA9IHZhbHVlO1xuXG4gICAgc3RhY2suX3RvcCA9IGdldExhc3RJbmRleEluU3RhY2soc3RhY2ssIHZTY2FsZSwgdHJ1ZSwgbWV0YS50eXBlKTtcbiAgICBzdGFjay5fYm90dG9tID0gZ2V0TGFzdEluZGV4SW5TdGFjayhzdGFjaywgdlNjYWxlLCBmYWxzZSwgbWV0YS50eXBlKTtcblxuICAgIGNvbnN0IHZpc3VhbFZhbHVlcyA9IHN0YWNrLl92aXN1YWxWYWx1ZXMgfHwgKHN0YWNrLl92aXN1YWxWYWx1ZXMgPSB7fSk7XG4gICAgdmlzdWFsVmFsdWVzW2RhdGFzZXRJbmRleF0gPSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsIGF4aXMpIHtcbiAgY29uc3Qgc2NhbGVzID0gY2hhcnQuc2NhbGVzO1xuICByZXR1cm4gT2JqZWN0LmtleXMoc2NhbGVzKS5maWx0ZXIoa2V5ID0+IHNjYWxlc1trZXldLmF4aXMgPT09IGF4aXMpLnNoaWZ0KCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGFzZXRDb250ZXh0KHBhcmVudCwgaW5kZXgpIHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LFxuICAgIHtcbiAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICBkYXRhc2V0OiB1bmRlZmluZWQsXG4gICAgICBkYXRhc2V0SW5kZXg6IGluZGV4LFxuICAgICAgaW5kZXgsXG4gICAgICBtb2RlOiAnZGVmYXVsdCcsXG4gICAgICB0eXBlOiAnZGF0YXNldCdcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURhdGFDb250ZXh0KHBhcmVudCwgaW5kZXgsIGVsZW1lbnQpIHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBkYXRhSW5kZXg6IGluZGV4LFxuICAgIHBhcnNlZDogdW5kZWZpbmVkLFxuICAgIHJhdzogdW5kZWZpbmVkLFxuICAgIGVsZW1lbnQsXG4gICAgaW5kZXgsXG4gICAgbW9kZTogJ2RlZmF1bHQnLFxuICAgIHR5cGU6ICdkYXRhJ1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJTdGFja3MobWV0YSwgaXRlbXMpIHtcbiAgLy8gTm90IHVzaW5nIG1ldGEuaW5kZXggaGVyZSwgYmVjYXVzZSBpdCBtaWdodCBiZSBhbHJlYWR5IHVwZGF0ZWQgaWYgdGhlIGRhdGFzZXQgY2hhbmdlZCBsb2NhdGlvblxuICBjb25zdCBkYXRhc2V0SW5kZXggPSBtZXRhLmNvbnRyb2xsZXIuaW5kZXg7XG4gIGNvbnN0IGF4aXMgPSBtZXRhLnZTY2FsZSAmJiBtZXRhLnZTY2FsZS5heGlzO1xuICBpZiAoIWF4aXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpdGVtcyA9IGl0ZW1zIHx8IG1ldGEuX3BhcnNlZDtcbiAgZm9yIChjb25zdCBwYXJzZWQgb2YgaXRlbXMpIHtcbiAgICBjb25zdCBzdGFja3MgPSBwYXJzZWQuX3N0YWNrcztcbiAgICBpZiAoIXN0YWNrcyB8fCBzdGFja3NbYXhpc10gPT09IHVuZGVmaW5lZCB8fCBzdGFja3NbYXhpc11bZGF0YXNldEluZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRlbGV0ZSBzdGFja3NbYXhpc11bZGF0YXNldEluZGV4XTtcbiAgICBpZiAoc3RhY2tzW2F4aXNdLl92aXN1YWxWYWx1ZXMgIT09IHVuZGVmaW5lZCAmJiBzdGFja3NbYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBzdGFja3NbYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBpc0RpcmVjdFVwZGF0ZU1vZGUgPSAobW9kZSkgPT4gbW9kZSA9PT0gJ3Jlc2V0JyB8fCBtb2RlID09PSAnbm9uZSc7XG5jb25zdCBjbG9uZUlmTm90U2hhcmVkID0gKGNhY2hlZCwgc2hhcmVkKSA9PiBzaGFyZWQgPyBjYWNoZWQgOiBPYmplY3QuYXNzaWduKHt9LCBjYWNoZWQpO1xuY29uc3QgY3JlYXRlU3RhY2sgPSAoY2FuU3RhY2ssIG1ldGEsIGNoYXJ0KSA9PiBjYW5TdGFjayAmJiAhbWV0YS5oaWRkZW4gJiYgbWV0YS5fc3RhY2tlZFxuICAmJiB7a2V5czogZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIHRydWUpLCB2YWx1ZXM6IG51bGx9O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7fTtcblxuICAvKipcbiAgICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGFzZXQgKGUuZy4gQ2hhcnQuZWxlbWVudC5MaW5lRWxlbWVudCkuXG4gICAqL1xuICBzdGF0aWMgZGF0YXNldEVsZW1lbnRUeXBlID0gbnVsbDtcblxuICAvKipcbiAgICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGEgKGUuZy4gQ2hhcnQuZWxlbWVudC5Qb2ludEVsZW1lbnQpLlxuICAgKi9cbiAgc3RhdGljIGRhdGFFbGVtZW50VHlwZSA9IG51bGw7XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkYXRhc2V0SW5kZXhcblx0ICovXG4gIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcbiAgICB0aGlzLmNoYXJ0ID0gY2hhcnQ7XG4gICAgdGhpcy5fY3R4ID0gY2hhcnQuY3R4O1xuICAgIHRoaXMuaW5kZXggPSBkYXRhc2V0SW5kZXg7XG4gICAgdGhpcy5fY2FjaGVkRGF0YU9wdHMgPSB7fTtcbiAgICB0aGlzLl9jYWNoZWRNZXRhID0gdGhpcy5nZXRNZXRhKCk7XG4gICAgdGhpcy5fdHlwZSA9IHRoaXMuX2NhY2hlZE1ldGEudHlwZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtib29sZWFuIHwgb2JqZWN0fSAqL1xuICAgIHRoaXMuX3BhcnNpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9kYXRhID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX29iamVjdERhdGEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2hhcmVkT3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9kcmF3U3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZHJhd0NvdW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IGZhbHNlO1xuICAgIHRoaXMuc3VwcG9ydHNEZWNpbWF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zeW5jTGlzdCA9IFtdO1xuICAgIHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlID0gbmV3LnRhcmdldC5kYXRhc2V0RWxlbWVudFR5cGU7XG4gICAgdGhpcy5kYXRhRWxlbWVudFR5cGUgPSBuZXcudGFyZ2V0LmRhdGFFbGVtZW50VHlwZTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuICAgIHRoaXMubGlua1NjYWxlcygpO1xuICAgIG1ldGEuX3N0YWNrZWQgPSBpc1N0YWNrZWQobWV0YS52U2NhbGUsIG1ldGEpO1xuICAgIHRoaXMuYWRkRWxlbWVudHMoKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsbCAmJiAhdGhpcy5jaGFydC5pc1BsdWdpbkVuYWJsZWQoJ2ZpbGxlcicpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJUcmllZCB0byB1c2UgdGhlICdmaWxsJyBvcHRpb24gd2l0aG91dCB0aGUgJ0ZpbGxlcicgcGx1Z2luIGVuYWJsZWQuIFBsZWFzZSBpbXBvcnQgYW5kIHJlZ2lzdGVyIHRoZSAnRmlsbGVyJyBwbHVnaW4gYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZGlzYWJsZWQgaW4gdGhlIG9wdGlvbnNcIik7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSW5kZXgoZGF0YXNldEluZGV4KSB7XG4gICAgaWYgKHRoaXMuaW5kZXggIT09IGRhdGFzZXRJbmRleCkge1xuICAgICAgY2xlYXJTdGFja3ModGhpcy5fY2FjaGVkTWV0YSk7XG4gICAgfVxuICAgIHRoaXMuaW5kZXggPSBkYXRhc2V0SW5kZXg7XG4gIH1cblxuICBsaW5rU2NhbGVzKCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cbiAgICBjb25zdCBjaG9vc2VJZCA9IChheGlzLCB4LCB5LCByKSA9PiBheGlzID09PSAneCcgPyB4IDogYXhpcyA9PT0gJ3InID8gciA6IHk7XG5cbiAgICBjb25zdCB4aWQgPSBtZXRhLnhBeGlzSUQgPSB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LnhBeGlzSUQsIGdldEZpcnN0U2NhbGVJZChjaGFydCwgJ3gnKSk7XG4gICAgY29uc3QgeWlkID0gbWV0YS55QXhpc0lEID0gdmFsdWVPckRlZmF1bHQoZGF0YXNldC55QXhpc0lELCBnZXRGaXJzdFNjYWxlSWQoY2hhcnQsICd5JykpO1xuICAgIGNvbnN0IHJpZCA9IG1ldGEuckF4aXNJRCA9IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuckF4aXNJRCwgZ2V0Rmlyc3RTY2FsZUlkKGNoYXJ0LCAncicpKTtcbiAgICBjb25zdCBpbmRleEF4aXMgPSBtZXRhLmluZGV4QXhpcztcbiAgICBjb25zdCBpaWQgPSBtZXRhLmlBeGlzSUQgPSBjaG9vc2VJZChpbmRleEF4aXMsIHhpZCwgeWlkLCByaWQpO1xuICAgIGNvbnN0IHZpZCA9IG1ldGEudkF4aXNJRCA9IGNob29zZUlkKGluZGV4QXhpcywgeWlkLCB4aWQsIHJpZCk7XG4gICAgbWV0YS54U2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoeGlkKTtcbiAgICBtZXRhLnlTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh5aWQpO1xuICAgIG1ldGEuclNjYWxlID0gdGhpcy5nZXRTY2FsZUZvcklkKHJpZCk7XG4gICAgbWV0YS5pU2NhbGUgPSB0aGlzLmdldFNjYWxlRm9ySWQoaWlkKTtcbiAgICBtZXRhLnZTY2FsZSA9IHRoaXMuZ2V0U2NhbGVGb3JJZCh2aWQpO1xuICB9XG5cbiAgZ2V0RGF0YXNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3RoaXMuaW5kZXhdO1xuICB9XG5cbiAgZ2V0TWV0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YSh0aGlzLmluZGV4KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc2NhbGVJRFxuXHQgKiBAcmV0dXJuIHtTY2FsZX1cblx0ICovXG4gIGdldFNjYWxlRm9ySWQoc2NhbGVJRCkge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LnNjYWxlc1tzY2FsZUlEXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldE90aGVyU2NhbGUoc2NhbGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICByZXR1cm4gc2NhbGUgPT09IG1ldGEuaVNjYWxlXG4gICAgICA/IG1ldGEudlNjYWxlXG4gICAgICA6IG1ldGEuaVNjYWxlO1xuICB9XG5cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fdXBkYXRlKCdyZXNldCcpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZGVzdHJveSgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBpZiAodGhpcy5fZGF0YSkge1xuICAgICAgdW5saXN0ZW5BcnJheUV2ZW50cyh0aGlzLl9kYXRhLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKG1ldGEuX3N0YWNrZWQpIHtcbiAgICAgIGNsZWFyU3RhY2tzKG1ldGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2RhdGFDaGVjaygpIHtcbiAgICBjb25zdCBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG4gICAgY29uc3QgZGF0YSA9IGRhdGFzZXQuZGF0YSB8fCAoZGF0YXNldC5kYXRhID0gW10pO1xuICAgIGNvbnN0IF9kYXRhID0gdGhpcy5fZGF0YTtcblxuICAgIC8vIEluIG9yZGVyIHRvIGNvcnJlY3RseSBoYW5kbGUgZGF0YSBhZGRpdGlvbi9kZWxldGlvbiBhbmltYXRpb24gKGFuIHRodXMgc2ltdWxhdGVcbiAgICAvLyByZWFsLXRpbWUgY2hhcnRzKSwgd2UgbmVlZCB0byBtb25pdG9yIHRoZXNlIGRhdGEgbW9kaWZpY2F0aW9ucyBhbmQgc3luY2hyb25pemVcbiAgICAvLyB0aGUgaW50ZXJuYWwgbWV0YSBkYXRhIGFjY29yZGluZ2x5LlxuXG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0gY29udmVydE9iamVjdERhdGFUb0FycmF5KGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoX2RhdGEgIT09IGRhdGEpIHtcbiAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAvLyBUaGlzIGNhc2UgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHJlcGxhY2VkIHRoZSBkYXRhIGFycmF5IGluc3RhbmNlLlxuICAgICAgICB1bmxpc3RlbkFycmF5RXZlbnRzKF9kYXRhLCB0aGlzKTtcbiAgICAgICAgLy8gRGlzY2FyZCBvbGQgcGFyc2VkIGRhdGEgYW5kIHN0YWNrc1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICAgICAgY2xlYXJTdGFja3MobWV0YSk7XG4gICAgICAgIG1ldGEuX3BhcnNlZCA9IFtdO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShkYXRhKSkge1xuICAgICAgICBsaXN0ZW5BcnJheUV2ZW50cyhkYXRhLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG4gICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB9XG4gIH1cblxuICBhZGRFbGVtZW50cygpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcblxuICAgIHRoaXMuX2RhdGFDaGVjaygpO1xuXG4gICAgaWYgKHRoaXMuZGF0YXNldEVsZW1lbnRUeXBlKSB7XG4gICAgICBtZXRhLmRhdGFzZXQgPSBuZXcgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUoKTtcbiAgICB9XG4gIH1cblxuICBidWlsZE9yVXBkYXRlRWxlbWVudHMocmVzZXROZXdFbGVtZW50cykge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcbiAgICBsZXQgc3RhY2tDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9kYXRhQ2hlY2soKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBjYWNoZWQgX3N0YWNrZWQgc3RhdHVzIGlzIGN1cnJlbnRcbiAgICBjb25zdCBvbGRTdGFja2VkID0gbWV0YS5fc3RhY2tlZDtcbiAgICBtZXRhLl9zdGFja2VkID0gaXNTdGFja2VkKG1ldGEudlNjYWxlLCBtZXRhKTtcblxuICAgIC8vIGRldGVjdCBjaGFuZ2UgaW4gc3RhY2sgb3B0aW9uXG4gICAgaWYgKG1ldGEuc3RhY2sgIT09IGRhdGFzZXQuc3RhY2spIHtcbiAgICAgIHN0YWNrQ2hhbmdlZCA9IHRydWU7XG4gICAgICAvLyByZW1vdmUgdmFsdWVzIGZyb20gb2xkIHN0YWNrXG4gICAgICBjbGVhclN0YWNrcyhtZXRhKTtcbiAgICAgIG1ldGEuc3RhY2sgPSBkYXRhc2V0LnN0YWNrO1xuICAgIH1cblxuICAgIC8vIFJlLXN5bmMgbWV0YSBkYXRhIGluIGNhc2UgdGhlIHVzZXIgcmVwbGFjZWQgdGhlIGRhdGEgYXJyYXkgb3IgaWYgd2UgbWlzc2VkXG4gICAgLy8gYW55IHVwZGF0ZXMgYW5kIHNvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhbmRsZSBudW1iZXIgb2YgZGF0YXBvaW50cyBjaGFuZ2luZy5cbiAgICB0aGlzLl9yZXN5bmNFbGVtZW50cyhyZXNldE5ld0VsZW1lbnRzKTtcblxuICAgIC8vIGlmIHN0YWNrIGNoYW5nZWQsIHVwZGF0ZSBzdGFjayB2YWx1ZXMgZm9yIHRoZSB3aG9sZSBkYXRhc2V0XG4gICAgaWYgKHN0YWNrQ2hhbmdlZCB8fCBvbGRTdGFja2VkICE9PSBtZXRhLl9zdGFja2VkKSB7XG4gICAgICB1cGRhdGVTdGFja3ModGhpcywgbWV0YS5fcGFyc2VkKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogTWVyZ2VzIHVzZXItc3VwcGxpZWQgYW5kIGRlZmF1bHQgZGF0YXNldC1sZXZlbCBvcHRpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBjb25maWd1cmUoKSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jaGFydC5jb25maWc7XG4gICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRTY29wZUtleXModGhpcy5fdHlwZSk7XG4gICAgY29uc3Qgc2NvcGVzID0gY29uZmlnLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSwgc2NvcGVLZXlzLCB0cnVlKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoc2NvcGVzLCB0aGlzLmdldENvbnRleHQoKSk7XG4gICAgdGhpcy5fcGFyc2luZyA9IHRoaXMub3B0aW9ucy5wYXJzaW5nO1xuICAgIHRoaXMuX2NhY2hlZERhdGFPcHRzID0ge307XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudFxuXHQgKi9cbiAgcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3Qge19jYWNoZWRNZXRhOiBtZXRhLCBfZGF0YTogZGF0YX0gPSB0aGlzO1xuICAgIGNvbnN0IHtpU2NhbGUsIF9zdGFja2VkfSA9IG1ldGE7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcblxuICAgIGxldCBzb3J0ZWQgPSBzdGFydCA9PT0gMCAmJiBjb3VudCA9PT0gZGF0YS5sZW5ndGggPyB0cnVlIDogbWV0YS5fc29ydGVkO1xuICAgIGxldCBwcmV2ID0gc3RhcnQgPiAwICYmIG1ldGEuX3BhcnNlZFtzdGFydCAtIDFdO1xuICAgIGxldCBpLCBjdXIsIHBhcnNlZDtcblxuICAgIGlmICh0aGlzLl9wYXJzaW5nID09PSBmYWxzZSkge1xuICAgICAgbWV0YS5fcGFyc2VkID0gZGF0YTtcbiAgICAgIG1ldGEuX3NvcnRlZCA9IHRydWU7XG4gICAgICBwYXJzZWQgPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNBcnJheShkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5wYXJzZUFycmF5RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgcGFyc2VkID0gdGhpcy5wYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlZCA9IHRoaXMucGFyc2VQcmltaXRpdmVEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTm90SW5PcmRlckNvbXBhcmVkVG9QcmV2ID0gKCkgPT4gY3VyW2lBeGlzXSA9PT0gbnVsbCB8fCAocHJldiAmJiBjdXJbaUF4aXNdIDwgcHJldltpQXhpc10pO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgbWV0YS5fcGFyc2VkW2kgKyBzdGFydF0gPSBjdXIgPSBwYXJzZWRbaV07XG4gICAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgICBpZiAoaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYoKSkge1xuICAgICAgICAgICAgc29ydGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXYgPSBjdXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1ldGEuX3NvcnRlZCA9IHNvcnRlZDtcbiAgICB9XG5cbiAgICBpZiAoX3N0YWNrZWQpIHtcbiAgICAgIHVwZGF0ZVN0YWNrcyh0aGlzLCBwYXJzZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBwcmltaXRpdmUgdmFsdWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhIC0gZGF0YXNldCBtZXRhXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGRhdGEgLSBkYXRhIGFycmF5LiBFeGFtcGxlIFsxLDMsNF1cblx0ICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gc3RhcnQgaW5kZXhcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gbnVtYmVyIG9mIGl0ZW1zIHRvIHBhcnNlXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IHBhcnNlZCBpdGVtIC0gaXRlbSBjb250YWluaW5nIGluZGV4IGFuZCBhIHBhcnNlZCB2YWx1ZVxuXHQgKiBmb3IgZWFjaCBzY2FsZSBpZC5cblx0ICogRXhhbXBsZToge3hTY2FsZTA6IDAsIHlTY2FsZTA6IDF9XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCB7aVNjYWxlLCB2U2NhbGV9ID0gbWV0YTtcbiAgICBjb25zdCBpQXhpcyA9IGlTY2FsZS5heGlzO1xuICAgIGNvbnN0IHZBeGlzID0gdlNjYWxlLmF4aXM7XG4gICAgY29uc3QgbGFiZWxzID0gaVNjYWxlLmdldExhYmVscygpO1xuICAgIGNvbnN0IHNpbmdsZVNjYWxlID0gaVNjYWxlID09PSB2U2NhbGU7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICBsZXQgaSwgaWxlbiwgaW5kZXg7XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICBbaUF4aXNdOiBzaW5nbGVTY2FsZSB8fCBpU2NhbGUucGFyc2UobGFiZWxzW2luZGV4XSwgaW5kZXgpLFxuICAgICAgICBbdkF4aXNdOiB2U2NhbGUucGFyc2UoZGF0YVtpbmRleF0sIGluZGV4KVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBhcnJheXNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1ldGEgLSBkYXRhc2V0IG1ldGFcblx0ICogQHBhcmFtIHthcnJheX0gZGF0YSAtIGRhdGEgYXJyYXkuIEV4YW1wbGUgW1sxLDJdLFszLDRdXVxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBzdGFydCBpbmRleFxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBudW1iZXIgb2YgaXRlbXMgdG8gcGFyc2Vcblx0ICogQHJldHVybnMge29iamVjdH0gcGFyc2VkIGl0ZW0gLSBpdGVtIGNvbnRhaW5pbmcgaW5kZXggYW5kIGEgcGFyc2VkIHZhbHVlXG5cdCAqIGZvciBlYWNoIHNjYWxlIGlkLlxuXHQgKiBFeGFtcGxlOiB7eDogMCwgeTogMX1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3Qge3hTY2FsZSwgeVNjYWxlfSA9IG1ldGE7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICBsZXQgaSwgaWxlbiwgaW5kZXgsIGl0ZW07XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGluZGV4ID0gaSArIHN0YXJ0O1xuICAgICAgaXRlbSA9IGRhdGFbaW5kZXhdO1xuICAgICAgcGFyc2VkW2ldID0ge1xuICAgICAgICB4OiB4U2NhbGUucGFyc2UoaXRlbVswXSwgaW5kZXgpLFxuICAgICAgICB5OiB5U2NhbGUucGFyc2UoaXRlbVsxXSwgaW5kZXgpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG5cdCAqIFBhcnNlIGFycmF5IG9mIG9iamVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG1ldGEgLSBkYXRhc2V0IG1ldGFcblx0ICogQHBhcmFtIHthcnJheX0gZGF0YSAtIGRhdGEgYXJyYXkuIEV4YW1wbGUgW3t4OjEsIHk6NX0sIHt4OjIsIHk6MTB9XVxuXHQgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBzdGFydCBpbmRleFxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBudW1iZXIgb2YgaXRlbXMgdG8gcGFyc2Vcblx0ICogQHJldHVybnMge29iamVjdH0gcGFyc2VkIGl0ZW0gLSBpdGVtIGNvbnRhaW5pbmcgaW5kZXggYW5kIGEgcGFyc2VkIHZhbHVlXG5cdCAqIGZvciBlYWNoIHNjYWxlIGlkLiBfY3VzdG9tIGlzIG9wdGlvbmFsXG5cdCAqIEV4YW1wbGU6IHt4U2NhbGUwOiAwLCB5U2NhbGUwOiAxLCBfY3VzdG9tOiB7cjogMTAsIGZvbzogJ2Jhcid9fVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3Qge3hTY2FsZSwgeVNjYWxlfSA9IG1ldGE7XG4gICAgY29uc3Qge3hBeGlzS2V5ID0gJ3gnLCB5QXhpc0tleSA9ICd5J30gPSB0aGlzLl9wYXJzaW5nO1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgbGV0IGksIGlsZW4sIGluZGV4LCBpdGVtO1xuXG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBpbmRleCA9IGkgKyBzdGFydDtcbiAgICAgIGl0ZW0gPSBkYXRhW2luZGV4XTtcbiAgICAgIHBhcnNlZFtpXSA9IHtcbiAgICAgICAgeDogeFNjYWxlLnBhcnNlKHJlc29sdmVPYmplY3RLZXkoaXRlbSwgeEF4aXNLZXkpLCBpbmRleCksXG4gICAgICAgIHk6IHlTY2FsZS5wYXJzZShyZXNvbHZlT2JqZWN0S2V5KGl0ZW0sIHlBeGlzS2V5KSwgaW5kZXgpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldFBhcnNlZChpbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRNZXRhLl9wYXJzZWRbaW5kZXhdO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldERhdGFFbGVtZW50KGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgYXBwbHlTdGFjayhzY2FsZSwgcGFyc2VkLCBtb2RlKSB7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VkW3NjYWxlLmF4aXNdO1xuICAgIGNvbnN0IHN0YWNrID0ge1xuICAgICAga2V5czogZ2V0U29ydGVkRGF0YXNldEluZGljZXMoY2hhcnQsIHRydWUpLFxuICAgICAgdmFsdWVzOiBwYXJzZWQuX3N0YWNrc1tzY2FsZS5heGlzXS5fdmlzdWFsVmFsdWVzXG4gICAgfTtcbiAgICByZXR1cm4gYXBwbHlTdGFjayhzdGFjaywgdmFsdWUsIG1ldGEuaW5kZXgsIHttb2RlfSk7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgdXBkYXRlUmFuZ2VGcm9tUGFyc2VkKHJhbmdlLCBzY2FsZSwgcGFyc2VkLCBzdGFjaykge1xuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gcGFyc2VkW3NjYWxlLmF4aXNdO1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlZFZhbHVlID09PSBudWxsID8gTmFOIDogcGFyc2VkVmFsdWU7XG4gICAgY29uc3QgdmFsdWVzID0gc3RhY2sgJiYgcGFyc2VkLl9zdGFja3Nbc2NhbGUuYXhpc107XG4gICAgaWYgKHN0YWNrICYmIHZhbHVlcykge1xuICAgICAgc3RhY2sudmFsdWVzID0gdmFsdWVzO1xuICAgICAgdmFsdWUgPSBhcHBseVN0YWNrKHN0YWNrLCBwYXJzZWRWYWx1ZSwgdGhpcy5fY2FjaGVkTWV0YS5pbmRleCk7XG4gICAgfVxuICAgIHJhbmdlLm1pbiA9IE1hdGgubWluKHJhbmdlLm1pbiwgdmFsdWUpO1xuICAgIHJhbmdlLm1heCA9IE1hdGgubWF4KHJhbmdlLm1heCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldE1pbk1heChzY2FsZSwgY2FuU3RhY2spIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBfcGFyc2VkID0gbWV0YS5fcGFyc2VkO1xuICAgIGNvbnN0IHNvcnRlZCA9IG1ldGEuX3NvcnRlZCAmJiBzY2FsZSA9PT0gbWV0YS5pU2NhbGU7XG4gICAgY29uc3QgaWxlbiA9IF9wYXJzZWQubGVuZ3RoO1xuICAgIGNvbnN0IG90aGVyU2NhbGUgPSB0aGlzLl9nZXRPdGhlclNjYWxlKHNjYWxlKTtcbiAgICBjb25zdCBzdGFjayA9IGNyZWF0ZVN0YWNrKGNhblN0YWNrLCBtZXRhLCB0aGlzLmNoYXJ0KTtcbiAgICBjb25zdCByYW5nZSA9IHttaW46IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgbWF4OiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFl9O1xuICAgIGNvbnN0IHttaW46IG90aGVyTWluLCBtYXg6IG90aGVyTWF4fSA9IGdldFVzZXJCb3VuZHMob3RoZXJTY2FsZSk7XG4gICAgbGV0IGksIHBhcnNlZDtcblxuICAgIGZ1bmN0aW9uIF9za2lwKCkge1xuICAgICAgcGFyc2VkID0gX3BhcnNlZFtpXTtcbiAgICAgIGNvbnN0IG90aGVyVmFsdWUgPSBwYXJzZWRbb3RoZXJTY2FsZS5heGlzXTtcbiAgICAgIHJldHVybiAhaXNGaW5pdGUocGFyc2VkW3NjYWxlLmF4aXNdKSB8fCBvdGhlck1pbiA+IG90aGVyVmFsdWUgfHwgb3RoZXJNYXggPCBvdGhlclZhbHVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGlmIChfc2tpcCgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKTtcbiAgICAgIGlmIChzb3J0ZWQpIHtcbiAgICAgICAgLy8gaWYgdGhlIGRhdGEgaXMgc29ydGVkLCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZ1cnRoZXIgZnJvbSB0aGlzIGVuZCBvZiBhcnJheVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNvcnRlZCkge1xuICAgICAgLy8gaW4gdGhlIHNvcnRlZCBjYXNlLCBmaW5kIGZpcnN0IG5vbi1za2lwcGVkIHZhbHVlIGZyb20gb3RoZXIgZW5kIG9mIGFycmF5XG4gICAgICBmb3IgKGkgPSBpbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKF9za2lwKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgZ2V0QWxsUGFyc2VkVmFsdWVzKHNjYWxlKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5fY2FjaGVkTWV0YS5fcGFyc2VkO1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGxldCBpLCBpbGVuLCB2YWx1ZTtcblxuICAgIGZvciAoaSA9IDAsIGlsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlZFtpXVtzY2FsZS5heGlzXTtcbiAgICAgIGlmIChpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge251bWJlcnxib29sZWFufVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGlTY2FsZSA9IG1ldGEuaVNjYWxlO1xuICAgIGNvbnN0IHZTY2FsZSA9IG1ldGEudlNjYWxlO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGlTY2FsZSA/ICcnICsgaVNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkW2lTY2FsZS5heGlzXSkgOiAnJyxcbiAgICAgIHZhbHVlOiB2U2NhbGUgPyAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pIDogJydcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICB0aGlzLnVwZGF0ZShtb2RlIHx8ICdkZWZhdWx0Jyk7XG4gICAgbWV0YS5fY2xpcCA9IHRvQ2xpcCh2YWx1ZU9yRGVmYXVsdCh0aGlzLm9wdGlvbnMuY2xpcCwgZGVmYXVsdENsaXAobWV0YS54U2NhbGUsIG1ldGEueVNjYWxlLCB0aGlzLmdldE1heE92ZXJmbG93KCkpKSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1vZGVcblx0ICovXG4gIHVwZGF0ZShtb2RlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgZHJhdygpIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLl9jdHg7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuICAgIGNvbnN0IGFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgY29uc3QgYWN0aXZlID0gW107XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9kcmF3U3RhcnQgfHwgMDtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RyYXdDb3VudCB8fCAoZWxlbWVudHMubGVuZ3RoIC0gc3RhcnQpO1xuICAgIGNvbnN0IGRyYXdBY3RpdmVFbGVtZW50c09uVG9wID0gdGhpcy5vcHRpb25zLmRyYXdBY3RpdmVFbGVtZW50c09uVG9wO1xuICAgIGxldCBpO1xuXG4gICAgaWYgKG1ldGEuZGF0YXNldCkge1xuICAgICAgbWV0YS5kYXRhc2V0LmRyYXcoY3R4LCBhcmVhLCBzdGFydCwgY291bnQpO1xuICAgIH1cblxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWxlbWVudC5oaWRkZW4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZWxlbWVudC5hY3RpdmUgJiYgZHJhd0FjdGl2ZUVsZW1lbnRzT25Ub3ApIHtcbiAgICAgICAgYWN0aXZlLnB1c2goZWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmRyYXcoY3R4LCBhcmVhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgKytpKSB7XG4gICAgICBhY3RpdmVbaV0uZHJhdyhjdHgsIGFyZWEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIGEgc2V0IG9mIHByZWRlZmluZWQgc3R5bGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGF0YXNldFxuXHQgKiBvciB0aGUgZGF0YSBpZiB0aGUgaW5kZXggaXMgc3BlY2lmaWVkXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIGRhdGEgaW5kZXhcblx0ICogQHBhcmFtIHtib29sZWFufSBbYWN0aXZlXSAtIHRydWUgaWYgaG92ZXJcblx0ICogQHJldHVybiB7b2JqZWN0fSBzdHlsZSBvYmplY3Rcblx0ICovXG4gIGdldFN0eWxlKGluZGV4LCBhY3RpdmUpIHtcbiAgICBjb25zdCBtb2RlID0gYWN0aXZlID8gJ2FjdGl2ZScgOiAnZGVmYXVsdCc7XG4gICAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgJiYgdGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0XG4gICAgICA/IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKVxuICAgICAgOiB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXggfHwgMCwgbW9kZSk7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCBtb2RlKSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuICAgIGxldCBjb250ZXh0O1xuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YVtpbmRleF07XG4gICAgICBjb250ZXh0ID0gZWxlbWVudC4kY29udGV4dCB8fFxuICAgICAgICAoZWxlbWVudC4kY29udGV4dCA9IGNyZWF0ZURhdGFDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpLCBpbmRleCwgZWxlbWVudCkpO1xuICAgICAgY29udGV4dC5wYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpbmRleCk7XG4gICAgICBjb250ZXh0LnJhdyA9IGRhdGFzZXQuZGF0YVtpbmRleF07XG4gICAgICBjb250ZXh0LmluZGV4ID0gY29udGV4dC5kYXRhSW5kZXggPSBpbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IHRoaXMuJGNvbnRleHQgfHxcbiAgICAgICAgKHRoaXMuJGNvbnRleHQgPSBjcmVhdGVEYXRhc2V0Q29udGV4dCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSwgdGhpcy5pbmRleCkpO1xuICAgICAgY29udGV4dC5kYXRhc2V0ID0gZGF0YXNldDtcbiAgICAgIGNvbnRleHQuaW5kZXggPSBjb250ZXh0LmRhdGFzZXRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgfVxuXG4gICAgY29udGV4dC5hY3RpdmUgPSAhIWFjdGl2ZTtcbiAgICBjb250ZXh0Lm1vZGUgPSBtb2RlO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVFbGVtZW50T3B0aW9ucyh0aGlzLmRhdGFzZXRFbGVtZW50VHlwZS5pZCwgbW9kZSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCwgbW9kZSkge1xuICAgIHJldHVybiB0aGlzLl9yZXNvbHZlRWxlbWVudE9wdGlvbnModGhpcy5kYXRhRWxlbWVudFR5cGUuaWQsIG1vZGUsIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3Jlc29sdmVFbGVtZW50T3B0aW9ucyhlbGVtZW50VHlwZSwgbW9kZSA9ICdkZWZhdWx0JywgaW5kZXgpIHtcbiAgICBjb25zdCBhY3RpdmUgPSBtb2RlID09PSAnYWN0aXZlJztcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlZERhdGFPcHRzO1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gZWxlbWVudFR5cGUgKyAnLScgKyBtb2RlO1xuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICBjb25zdCBzaGFyaW5nID0gdGhpcy5lbmFibGVPcHRpb25TaGFyaW5nICYmIGRlZmluZWQoaW5kZXgpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjbG9uZUlmTm90U2hhcmVkKGNhY2hlZCwgc2hhcmluZyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY2hhcnQuY29uZmlnO1xuICAgIGNvbnN0IHNjb3BlS2V5cyA9IGNvbmZpZy5kYXRhc2V0RWxlbWVudFNjb3BlS2V5cyh0aGlzLl90eXBlLCBlbGVtZW50VHlwZSk7XG4gICAgY29uc3QgcHJlZml4ZXMgPSBhY3RpdmUgPyBbYCR7ZWxlbWVudFR5cGV9SG92ZXJgLCAnaG92ZXInLCBlbGVtZW50VHlwZSwgJyddIDogW2VsZW1lbnRUeXBlLCAnJ107XG4gICAgY29uc3Qgc2NvcGVzID0gY29uZmlnLmdldE9wdGlvblNjb3Blcyh0aGlzLmdldERhdGFzZXQoKSwgc2NvcGVLZXlzKTtcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKGRlZmF1bHRzLmVsZW1lbnRzW2VsZW1lbnRUeXBlXSk7XG4gICAgLy8gY29udGV4dCBpcyBwcm92aWRlZCBhcyBhIGZ1bmN0aW9uLCBhbmQgaXMgY2FsbGVkIG9ubHkgaWYgbmVlZGVkLFxuICAgIC8vIHNvIHdlIGRvbid0IGNyZWF0ZSBhIGNvbnRleHQgZm9yIGVhY2ggZWxlbWVudCBpZiBub3QgbmVlZGVkLlxuICAgIGNvbnN0IGNvbnRleHQgPSAoKSA9PiB0aGlzLmdldENvbnRleHQoaW5kZXgsIGFjdGl2ZSwgbW9kZSk7XG4gICAgY29uc3QgdmFsdWVzID0gY29uZmlnLnJlc29sdmVOYW1lZE9wdGlvbnMoc2NvcGVzLCBuYW1lcywgY29udGV4dCwgcHJlZml4ZXMpO1xuXG4gICAgaWYgKHZhbHVlcy4kc2hhcmVkKSB7XG4gICAgICAvLyBgJHNoYXJlZGAgaW5kaWNhdGVzIHRoaXMgc2V0IG9mIG9wdGlvbnMgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGVsZW1lbnRzLlxuICAgICAgLy8gU2hhcmluZyBpcyB1c2VkIHRvIHJlZHVjZSBudW1iZXIgb2YgcHJvcGVydGllcyB0byBjaGFuZ2UgZHVyaW5nIGFuaW1hdGlvbi5cbiAgICAgIHZhbHVlcy4kc2hhcmVkID0gc2hhcmluZztcblxuICAgICAgLy8gV2UgY2FjaGUgb3B0aW9ucyBieSBgbW9kZWAsIHdoaWNoIGNhbiBiZSAnYWN0aXZlJyBmb3IgZXhhbXBsZS4gVGhpcyBlbmFibGVzIHVzXG4gICAgICAvLyB0byBoYXZlIHRoZSAnYWN0aXZlJyBlbGVtZW50IG9wdGlvbnMgYW5kICdkZWZhdWx0JyBvcHRpb25zIHRvIHN3aXRjaCBiZXR3ZWVuXG4gICAgICAvLyB3aGVuIGludGVyYWN0aW5nLlxuICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShjbG9uZUlmTm90U2hhcmVkKHZhbHVlcywgc2hhcmluZykpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCB0cmFuc2l0aW9uLCBhY3RpdmUpIHtcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLl9jYWNoZWREYXRhT3B0cztcbiAgICBjb25zdCBjYWNoZUtleSA9IGBhbmltYXRpb24tJHt0cmFuc2l0aW9ufWA7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGVbY2FjaGVLZXldO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGxldCBvcHRpb25zO1xuICAgIGlmIChjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY2hhcnQuY29uZmlnO1xuICAgICAgY29uc3Qgc2NvcGVLZXlzID0gY29uZmlnLmRhdGFzZXRBbmltYXRpb25TY29wZUtleXModGhpcy5fdHlwZSwgdHJhbnNpdGlvbik7XG4gICAgICBjb25zdCBzY29wZXMgPSBjb25maWcuZ2V0T3B0aW9uU2NvcGVzKHRoaXMuZ2V0RGF0YXNldCgpLCBzY29wZUtleXMpO1xuICAgICAgb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIHRoaXMuZ2V0Q29udGV4dChpbmRleCwgYWN0aXZlLCB0cmFuc2l0aW9uKSk7XG4gICAgfVxuICAgIGNvbnN0IGFuaW1hdGlvbnMgPSBuZXcgQW5pbWF0aW9ucyhjaGFydCwgb3B0aW9ucyAmJiBvcHRpb25zLmFuaW1hdGlvbnMpO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2NhY2hlYWJsZSkge1xuICAgICAgY2FjaGVbY2FjaGVLZXldID0gT2JqZWN0LmZyZWV6ZShhbmltYXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGFuaW1hdGlvbnM7XG4gIH1cblxuICAvKipcblx0ICogVXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgb3B0aW9ucyBvYmplY3Qgc2hhcmVkIGJldHdlZW4gZWxlbWVudHNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0U2hhcmVkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLiRzaGFyZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NoYXJlZE9wdGlvbnMgfHwgKHRoaXMuX3NoYXJlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSk7XG4gIH1cblxuICAvKipcblx0ICogVXRpbGl0eSBmb3IgZGV0ZXJtaW5pbmcgaWYgYG9wdGlvbnNgIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgdXBkYXRlZCBwcm9wZXJ0aWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGluY2x1ZGVPcHRpb25zKG1vZGUsIHNoYXJlZE9wdGlvbnMpIHtcbiAgICByZXR1cm4gIXNoYXJlZE9wdGlvbnMgfHwgaXNEaXJlY3RVcGRhdGVNb2RlKG1vZGUpIHx8IHRoaXMuY2hhcnQuX2FuaW1hdGlvbnNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdG9kbyB2NCwgcmVuYW1lIHRvIGdldFNoYXJlZE9wdGlvbnMgYW5kIHJlbW92ZSBleGNlc3MgZnVuY3Rpb25zXG4gICAqL1xuICBfZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSkge1xuICAgIGNvbnN0IGZpcnN0T3B0cyA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgY29uc3QgcHJldmlvdXNseVNoYXJlZE9wdGlvbnMgPSB0aGlzLl9zaGFyZWRPcHRpb25zO1xuICAgIGNvbnN0IHNoYXJlZE9wdGlvbnMgPSB0aGlzLmdldFNoYXJlZE9wdGlvbnMoZmlyc3RPcHRzKTtcbiAgICBjb25zdCBpbmNsdWRlT3B0aW9ucyA9IHRoaXMuaW5jbHVkZU9wdGlvbnMobW9kZSwgc2hhcmVkT3B0aW9ucykgfHwgKHNoYXJlZE9wdGlvbnMgIT09IHByZXZpb3VzbHlTaGFyZWRPcHRpb25zKTtcbiAgICB0aGlzLnVwZGF0ZVNoYXJlZE9wdGlvbnMoc2hhcmVkT3B0aW9ucywgbW9kZSwgZmlyc3RPcHRzKTtcbiAgICByZXR1cm4ge3NoYXJlZE9wdGlvbnMsIGluY2x1ZGVPcHRpb25zfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVdGlsaXR5IGZvciB1cGRhdGluZyBhbiBlbGVtZW50IHdpdGggbmV3IHByb3BlcnRpZXMsIHVzaW5nIGFuaW1hdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgdXBkYXRlRWxlbWVudChlbGVtZW50LCBpbmRleCwgcHJvcGVydGllcywgbW9kZSkge1xuICAgIGlmIChpc0RpcmVjdFVwZGF0ZU1vZGUobW9kZSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCBtb2RlKS51cGRhdGUoZWxlbWVudCwgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIFV0aWxpdHkgdG8gYW5pbWF0ZSB0aGUgc2hhcmVkIG9wdGlvbnMsIHRoYXQgYXJlIHBvdGVudGlhbGx5IGFmZmVjdGluZyBtdWx0aXBsZSBlbGVtZW50cy5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgdXBkYXRlU2hhcmVkT3B0aW9ucyhzaGFyZWRPcHRpb25zLCBtb2RlLCBuZXdPcHRpb25zKSB7XG4gICAgaWYgKHNoYXJlZE9wdGlvbnMgJiYgIWlzRGlyZWN0VXBkYXRlTW9kZShtb2RlKSkge1xuICAgICAgdGhpcy5fcmVzb2x2ZUFuaW1hdGlvbnModW5kZWZpbmVkLCBtb2RlKS51cGRhdGUoc2hhcmVkT3B0aW9ucywgbmV3T3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfc2V0U3R5bGUoZWxlbWVudCwgaW5kZXgsIG1vZGUsIGFjdGl2ZSkge1xuICAgIGVsZW1lbnQuYWN0aXZlID0gYWN0aXZlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldFN0eWxlKGluZGV4LCBhY3RpdmUpO1xuICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKGluZGV4LCBtb2RlLCBhY3RpdmUpLnVwZGF0ZShlbGVtZW50LCB7XG4gICAgICAvLyBXaGVuIGdvaW5nIGZyb20gYWN0aXZlIHRvIGluYWN0aXZlLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0byB0aGUgc2hhcmVkIG9wdGlvbnMuXG4gICAgICAvLyBUaGlzIHdheSB0aGUgb25jZSBob3ZlcmVkIGVsZW1lbnQgd2lsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzaGFyZWQgb3B0aW9ucyBpbnN0YW5jZSwgYWZ0ZXIgYW5pbWF0aW9uLlxuICAgICAgb3B0aW9uczogKCFhY3RpdmUgJiYgdGhpcy5nZXRTaGFyZWRPcHRpb25zKG9wdGlvbnMpKSB8fCBvcHRpb25zXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVIb3ZlclN0eWxlKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICB0aGlzLl9zZXRTdHlsZShlbGVtZW50LCBpbmRleCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgfVxuXG4gIHNldEhvdmVyU3R5bGUoZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleCkge1xuICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIGluZGV4LCAnYWN0aXZlJywgdHJ1ZSk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O1xuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCwgJ2FjdGl2ZScsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9zZXREYXRhc2V0SG92ZXJTdHlsZSgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhc2V0O1xuXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlKGVsZW1lbnQsIHVuZGVmaW5lZCwgJ2FjdGl2ZScsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3Jlc3luY0VsZW1lbnRzKHJlc2V0TmV3RWxlbWVudHMpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2NhY2hlZE1ldGEuZGF0YTtcblxuICAgIC8vIEFwcGx5IGNoYW5nZXMgZGV0ZWN0ZWQgdGhyb3VnaCBhcnJheSBsaXN0ZW5lcnNcbiAgICBmb3IgKGNvbnN0IFttZXRob2QsIGFyZzEsIGFyZzJdIG9mIHRoaXMuX3N5bmNMaXN0KSB7XG4gICAgICB0aGlzW21ldGhvZF0oYXJnMSwgYXJnMik7XG4gICAgfVxuICAgIHRoaXMuX3N5bmNMaXN0ID0gW107XG5cbiAgICBjb25zdCBudW1NZXRhID0gZWxlbWVudHMubGVuZ3RoO1xuICAgIGNvbnN0IG51bURhdGEgPSBkYXRhLmxlbmd0aDtcbiAgICBjb25zdCBjb3VudCA9IE1hdGgubWluKG51bURhdGEsIG51bU1ldGEpO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAvLyBUT0RPOiBJdCBpcyBub3Qgb3B0aW1hbCB0byBhbHdheXMgcGFyc2UgdGhlIG9sZCBkYXRhXG4gICAgICAvLyBUaGlzIGlzIGRvbmUgYmVjYXVzZSB3ZSBhcmUgbm90IGRldGVjdGluZyBkaXJlY3QgYXNzaWdubWVudHM6XG4gICAgICAvLyBjaGFydC5kYXRhLmRhdGFzZXRzWzBdLmRhdGFbNV0gPSAxMDtcbiAgICAgIC8vIGNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uZGF0YVs1XS55ID0gMTA7XG4gICAgICB0aGlzLnBhcnNlKDAsIGNvdW50KTtcbiAgICB9XG5cbiAgICBpZiAobnVtRGF0YSA+IG51bU1ldGEpIHtcbiAgICAgIHRoaXMuX2luc2VydEVsZW1lbnRzKG51bU1ldGEsIG51bURhdGEgLSBudW1NZXRhLCByZXNldE5ld0VsZW1lbnRzKTtcbiAgICB9IGVsc2UgaWYgKG51bURhdGEgPCBudW1NZXRhKSB7XG4gICAgICB0aGlzLl9yZW1vdmVFbGVtZW50cyhudW1EYXRhLCBudW1NZXRhIC0gbnVtRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaW5zZXJ0RWxlbWVudHMoc3RhcnQsIGNvdW50LCByZXNldE5ld0VsZW1lbnRzID0gdHJ1ZSkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGRhdGEgPSBtZXRhLmRhdGE7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBjb3VudDtcbiAgICBsZXQgaTtcblxuICAgIGNvbnN0IG1vdmUgPSAoYXJyKSA9PiB7XG4gICAgICBhcnIubGVuZ3RoICs9IGNvdW50O1xuICAgICAgZm9yIChpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgICAgYXJyW2ldID0gYXJyW2kgLSBjb3VudF07XG4gICAgICB9XG4gICAgfTtcbiAgICBtb3ZlKGRhdGEpO1xuXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgZGF0YVtpXSA9IG5ldyB0aGlzLmRhdGFFbGVtZW50VHlwZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wYXJzaW5nKSB7XG4gICAgICBtb3ZlKG1ldGEuX3BhcnNlZCk7XG4gICAgfVxuICAgIHRoaXMucGFyc2Uoc3RhcnQsIGNvdW50KTtcblxuICAgIGlmIChyZXNldE5ld0VsZW1lbnRzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGRhdGEsIHN0YXJ0LCBjb3VudCwgJ3Jlc2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMoZWxlbWVudCwgc3RhcnQsIGNvdW50LCBtb2RlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVtb3ZlRWxlbWVudHMoc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSBtZXRhLl9wYXJzZWQuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG4gICAgICBpZiAobWV0YS5fc3RhY2tlZCkge1xuICAgICAgICBjbGVhclN0YWNrcyhtZXRhLCByZW1vdmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbWV0YS5kYXRhLnNwbGljZShzdGFydCwgY291bnQpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG4gICAqL1xuICBfc3luYyhhcmdzKSB7XG4gICAgaWYgKHRoaXMuX3BhcnNpbmcpIHtcbiAgICAgIHRoaXMuX3N5bmNMaXN0LnB1c2goYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFttZXRob2QsIGFyZzEsIGFyZzJdID0gYXJncztcbiAgICAgIHRoaXNbbWV0aG9kXShhcmcxLCBhcmcyKTtcbiAgICB9XG4gICAgdGhpcy5jaGFydC5fZGF0YUNoYW5nZXMucHVzaChbdGhpcy5pbmRleCwgLi4uYXJnc10pO1xuICB9XG5cbiAgX29uRGF0YVB1c2goKSB7XG4gICAgY29uc3QgY291bnQgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHRoaXMuX3N5bmMoWydfaW5zZXJ0RWxlbWVudHMnLCB0aGlzLmdldERhdGFzZXQoKS5kYXRhLmxlbmd0aCAtIGNvdW50LCBjb3VudF0pO1xuICB9XG5cbiAgX29uRGF0YVBvcCgpIHtcbiAgICB0aGlzLl9zeW5jKFsnX3JlbW92ZUVsZW1lbnRzJywgdGhpcy5fY2FjaGVkTWV0YS5kYXRhLmxlbmd0aCAtIDEsIDFdKTtcbiAgfVxuXG4gIF9vbkRhdGFTaGlmdCgpIHtcbiAgICB0aGlzLl9zeW5jKFsnX3JlbW92ZUVsZW1lbnRzJywgMCwgMV0pO1xuICB9XG5cbiAgX29uRGF0YVNwbGljZShzdGFydCwgY291bnQpIHtcbiAgICBpZiAoY291bnQpIHtcbiAgICAgIHRoaXMuX3N5bmMoWydfcmVtb3ZlRWxlbWVudHMnLCBzdGFydCwgY291bnRdKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICBpZiAobmV3Q291bnQpIHtcbiAgICAgIHRoaXMuX3N5bmMoWydfaW5zZXJ0RWxlbWVudHMnLCBzdGFydCwgbmV3Q291bnRdKTtcbiAgICB9XG4gIH1cblxuICBfb25EYXRhVW5zaGlmdCgpIHtcbiAgICB0aGlzLl9zeW5jKFsnX2luc2VydEVsZW1lbnRzJywgMCwgYXJndW1lbnRzLmxlbmd0aF0pO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge1xuICBfYXJyYXlVbmlxdWUsIGlzQXJyYXksIGlzTnVsbE9yVW5kZWYsXG4gIHZhbHVlT3JEZWZhdWx0LCByZXNvbHZlT2JqZWN0S2V5LCBzaWduLCBkZWZpbmVkXG59IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG5mdW5jdGlvbiBnZXRBbGxTY2FsZVZhbHVlcyhzY2FsZSwgdHlwZSkge1xuICBpZiAoIXNjYWxlLl9jYWNoZS4kYmFyKSB7XG4gICAgY29uc3QgdmlzaWJsZU1ldGFzID0gc2NhbGUuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSk7XG4gICAgbGV0IHZhbHVlcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGlsZW4gPSB2aXNpYmxlTWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHZpc2libGVNZXRhc1tpXS5jb250cm9sbGVyLmdldEFsbFBhcnNlZFZhbHVlcyhzY2FsZSkpO1xuICAgIH1cbiAgICBzY2FsZS5fY2FjaGUuJGJhciA9IF9hcnJheVVuaXF1ZSh2YWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpKTtcbiAgfVxuICByZXR1cm4gc2NhbGUuX2NhY2hlLiRiYXI7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIFwib3B0aW1hbFwiIHNhbXBsZSBzaXplIHRvIG1haW50YWluIGJhcnMgZXF1YWxseSBzaXplZCB3aGlsZSBwcmV2ZW50aW5nIG92ZXJsYXAuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb21wdXRlTWluU2FtcGxlU2l6ZShtZXRhKSB7XG4gIGNvbnN0IHNjYWxlID0gbWV0YS5pU2NhbGU7XG4gIGNvbnN0IHZhbHVlcyA9IGdldEFsbFNjYWxlVmFsdWVzKHNjYWxlLCBtZXRhLnR5cGUpO1xuICBsZXQgbWluID0gc2NhbGUuX2xlbmd0aDtcbiAgbGV0IGksIGlsZW4sIGN1cnIsIHByZXY7XG4gIGNvbnN0IHVwZGF0ZU1pbkFuZFByZXYgPSAoKSA9PiB7XG4gICAgaWYgKGN1cnIgPT09IDMyNzY3IHx8IGN1cnIgPT09IC0zMjc2OCkge1xuICAgICAgLy8gSWdub3JlIHRydW5jYXRlZCBwaXhlbHNcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGRlZmluZWQocHJldikpIHtcbiAgICAgIC8vIGN1cnIgLSBwcmV2ID09PSAwIGlzIGlnbm9yZWRcbiAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgTWF0aC5hYnMoY3VyciAtIHByZXYpIHx8IG1pbik7XG4gICAgfVxuICAgIHByZXYgPSBjdXJyO1xuICB9O1xuXG4gIGZvciAoaSA9IDAsIGlsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY3VyciA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUodmFsdWVzW2ldKTtcbiAgICB1cGRhdGVNaW5BbmRQcmV2KCk7XG4gIH1cblxuICBwcmV2ID0gdW5kZWZpbmVkO1xuICBmb3IgKGkgPSAwLCBpbGVuID0gc2NhbGUudGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgY3VyciA9IHNjYWxlLmdldFBpeGVsRm9yVGljayhpKTtcbiAgICB1cGRhdGVNaW5BbmRQcmV2KCk7XG4gIH1cblxuICByZXR1cm4gbWluO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuIFwiaWRlYWxcIiBjYXRlZ29yeSBiYXNlZCBvbiB0aGUgYWJzb2x1dGUgYmFyIHRoaWNrbmVzcyBvciwgaWYgdW5kZWZpbmVkIG9yIG51bGwsXG4gKiB1c2VzIHRoZSBzbWFsbGVzdCBpbnRlcnZhbCAoc2VlIGNvbXB1dGVNaW5TYW1wbGVTaXplKSB0aGF0IHByZXZlbnRzIGJhciBvdmVybGFwcGluZy4gVGhpc1xuICogbW9kZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlcyBiYXJzIGVxdWFsbHkgc2l6ZWQgKHVudGlsIHdlIGludHJvZHVjZSBzY3JpcHRhYmxlIG9wdGlvbnM/KS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpIHtcbiAgY29uc3QgdGhpY2tuZXNzID0gb3B0aW9ucy5iYXJUaGlja25lc3M7XG4gIGxldCBzaXplLCByYXRpbztcblxuICBpZiAoaXNOdWxsT3JVbmRlZih0aGlja25lc3MpKSB7XG4gICAgc2l6ZSA9IHJ1bGVyLm1pbiAqIG9wdGlvbnMuY2F0ZWdvcnlQZXJjZW50YWdlO1xuICAgIHJhdGlvID0gb3B0aW9ucy5iYXJQZXJjZW50YWdlO1xuICB9IGVsc2Uge1xuICAgIC8vIFdoZW4gYmFyIHRoaWNrbmVzcyBpcyBlbmZvcmNlZCwgY2F0ZWdvcnkgYW5kIGJhciBwZXJjZW50YWdlcyBhcmUgaWdub3JlZC5cbiAgICAvLyBOb3RlKFNCKTogd2UgY291bGQgYWRkIHN1cHBvcnQgZm9yIHJlbGF0aXZlIGJhciB0aGlja25lc3MgKGUuZy4gYmFyVGhpY2tuZXNzOiAnNTAlJylcbiAgICAvLyBhbmQgZGVwcmVjYXRlIGJhclBlcmNlbnRhZ2Ugc2luY2UgdGhpcyB2YWx1ZSBpcyBpZ25vcmVkIHdoZW4gdGhpY2tuZXNzIGlzIGFic29sdXRlLlxuICAgIHNpemUgPSB0aGlja25lc3MgKiBzdGFja0NvdW50O1xuICAgIHJhdGlvID0gMTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2h1bms6IHNpemUgLyBzdGFja0NvdW50LFxuICAgIHJhdGlvLFxuICAgIHN0YXJ0OiBydWxlci5waXhlbHNbaW5kZXhdIC0gKHNpemUgLyAyKVxuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuIFwib3B0aW1hbFwiIGNhdGVnb3J5IHRoYXQgZ2xvYmFsbHkgYXJyYW5nZXMgYmFycyBzaWRlIGJ5IHNpZGUgKG5vIGdhcCB3aGVuXG4gKiBwZXJjZW50YWdlIG9wdGlvbnMgYXJlIDEpLCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgYW5kIGZvbGxvd2luZyBjYXRlZ29yaWVzLiBUaGlzIG1vZGVcbiAqIGdlbmVyYXRlcyBiYXJzIHdpdGggZGlmZmVyZW50IHdpZHRocyB3aGVuIGRhdGEgYXJlIG5vdCBldmVubHkgc3BhY2VkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUZsZXhDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpIHtcbiAgY29uc3QgcGl4ZWxzID0gcnVsZXIucGl4ZWxzO1xuICBjb25zdCBjdXJyID0gcGl4ZWxzW2luZGV4XTtcbiAgbGV0IHByZXYgPSBpbmRleCA+IDAgPyBwaXhlbHNbaW5kZXggLSAxXSA6IG51bGw7XG4gIGxldCBuZXh0ID0gaW5kZXggPCBwaXhlbHMubGVuZ3RoIC0gMSA/IHBpeGVsc1tpbmRleCArIDFdIDogbnVsbDtcbiAgY29uc3QgcGVyY2VudCA9IG9wdGlvbnMuY2F0ZWdvcnlQZXJjZW50YWdlO1xuXG4gIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgLy8gZmlyc3QgZGF0YTogaXRzIHNpemUgaXMgZG91YmxlIGJhc2VkIG9uIHRoZSBuZXh0IHBvaW50IG9yLFxuICAgIC8vIGlmIGl0J3MgYWxzbyB0aGUgbGFzdCBkYXRhLCB3ZSB1c2UgdGhlIHNjYWxlIHNpemUuXG4gICAgcHJldiA9IGN1cnIgLSAobmV4dCA9PT0gbnVsbCA/IHJ1bGVyLmVuZCAtIHJ1bGVyLnN0YXJ0IDogbmV4dCAtIGN1cnIpO1xuICB9XG5cbiAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAvLyBsYXN0IGRhdGE6IGl0cyBzaXplIGlzIGFsc28gZG91YmxlIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBwb2ludC5cbiAgICBuZXh0ID0gY3VyciArIGN1cnIgLSBwcmV2O1xuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBjdXJyIC0gKGN1cnIgLSBNYXRoLm1pbihwcmV2LCBuZXh0KSkgLyAyICogcGVyY2VudDtcbiAgY29uc3Qgc2l6ZSA9IE1hdGguYWJzKG5leHQgLSBwcmV2KSAvIDIgKiBwZXJjZW50O1xuXG4gIHJldHVybiB7XG4gICAgY2h1bms6IHNpemUgLyBzdGFja0NvdW50LFxuICAgIHJhdGlvOiBvcHRpb25zLmJhclBlcmNlbnRhZ2UsXG4gICAgc3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGbG9hdEJhcihlbnRyeSwgaXRlbSwgdlNjYWxlLCBpKSB7XG4gIGNvbnN0IHN0YXJ0VmFsdWUgPSB2U2NhbGUucGFyc2UoZW50cnlbMF0sIGkpO1xuICBjb25zdCBlbmRWYWx1ZSA9IHZTY2FsZS5wYXJzZShlbnRyeVsxXSwgaSk7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0VmFsdWUsIGVuZFZhbHVlKTtcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgoc3RhcnRWYWx1ZSwgZW5kVmFsdWUpO1xuICBsZXQgYmFyU3RhcnQgPSBtaW47XG4gIGxldCBiYXJFbmQgPSBtYXg7XG5cbiAgaWYgKE1hdGguYWJzKG1pbikgPiBNYXRoLmFicyhtYXgpKSB7XG4gICAgYmFyU3RhcnQgPSBtYXg7XG4gICAgYmFyRW5kID0gbWluO1xuICB9XG5cbiAgLy8gU3RvcmUgYGJhckVuZGAgKGZ1cnRoZXN0IGF3YXkgZnJvbSBvcmlnaW4pIGFzIHBhcnNlZCB2YWx1ZSxcbiAgLy8gdG8gbWFrZSBzdGFja2luZyBzdHJhaWdodCBmb3J3YXJkXG4gIGl0ZW1bdlNjYWxlLmF4aXNdID0gYmFyRW5kO1xuXG4gIGl0ZW0uX2N1c3RvbSA9IHtcbiAgICBiYXJTdGFydCxcbiAgICBiYXJFbmQsXG4gICAgc3RhcnQ6IHN0YXJ0VmFsdWUsXG4gICAgZW5kOiBlbmRWYWx1ZSxcbiAgICBtaW4sXG4gICAgbWF4XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZW50cnksIGl0ZW0sIHZTY2FsZSwgaSkge1xuICBpZiAoaXNBcnJheShlbnRyeSkpIHtcbiAgICBwYXJzZUZsb2F0QmFyKGVudHJ5LCBpdGVtLCB2U2NhbGUsIGkpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW1bdlNjYWxlLmF4aXNdID0gdlNjYWxlLnBhcnNlKGVudHJ5LCBpKTtcbiAgfVxuICByZXR1cm4gaXRlbTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBcnJheU9yUHJpbWl0aXZlKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICBjb25zdCBpU2NhbGUgPSBtZXRhLmlTY2FsZTtcbiAgY29uc3QgdlNjYWxlID0gbWV0YS52U2NhbGU7XG4gIGNvbnN0IGxhYmVscyA9IGlTY2FsZS5nZXRMYWJlbHMoKTtcbiAgY29uc3Qgc2luZ2xlU2NhbGUgPSBpU2NhbGUgPT09IHZTY2FsZTtcbiAgY29uc3QgcGFyc2VkID0gW107XG4gIGxldCBpLCBpbGVuLCBpdGVtLCBlbnRyeTtcblxuICBmb3IgKGkgPSBzdGFydCwgaWxlbiA9IHN0YXJ0ICsgY291bnQ7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBlbnRyeSA9IGRhdGFbaV07XG4gICAgaXRlbSA9IHt9O1xuICAgIGl0ZW1baVNjYWxlLmF4aXNdID0gc2luZ2xlU2NhbGUgfHwgaVNjYWxlLnBhcnNlKGxhYmVsc1tpXSwgaSk7XG4gICAgcGFyc2VkLnB1c2gocGFyc2VWYWx1ZShlbnRyeSwgaXRlbSwgdlNjYWxlLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gaXNGbG9hdEJhcihjdXN0b20pIHtcbiAgcmV0dXJuIGN1c3RvbSAmJiBjdXN0b20uYmFyU3RhcnQgIT09IHVuZGVmaW5lZCAmJiBjdXN0b20uYmFyRW5kICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJhclNpZ24oc2l6ZSwgdlNjYWxlLCBhY3R1YWxCYXNlKSB7XG4gIGlmIChzaXplICE9PSAwKSB7XG4gICAgcmV0dXJuIHNpZ24oc2l6ZSk7XG4gIH1cbiAgcmV0dXJuICh2U2NhbGUuaXNIb3Jpem9udGFsKCkgPyAxIDogLTEpICogKHZTY2FsZS5taW4gPj0gYWN0dWFsQmFzZSA/IDEgOiAtMSk7XG59XG5cbmZ1bmN0aW9uIGJvcmRlclByb3BzKHByb3BlcnRpZXMpIHtcbiAgbGV0IHJldmVyc2UsIHN0YXJ0LCBlbmQsIHRvcCwgYm90dG9tO1xuICBpZiAocHJvcGVydGllcy5ob3Jpem9udGFsKSB7XG4gICAgcmV2ZXJzZSA9IHByb3BlcnRpZXMuYmFzZSA+IHByb3BlcnRpZXMueDtcbiAgICBzdGFydCA9ICdsZWZ0JztcbiAgICBlbmQgPSAncmlnaHQnO1xuICB9IGVsc2Uge1xuICAgIHJldmVyc2UgPSBwcm9wZXJ0aWVzLmJhc2UgPCBwcm9wZXJ0aWVzLnk7XG4gICAgc3RhcnQgPSAnYm90dG9tJztcbiAgICBlbmQgPSAndG9wJztcbiAgfVxuICBpZiAocmV2ZXJzZSkge1xuICAgIHRvcCA9ICdlbmQnO1xuICAgIGJvdHRvbSA9ICdzdGFydCc7XG4gIH0gZWxzZSB7XG4gICAgdG9wID0gJ3N0YXJ0JztcbiAgICBib3R0b20gPSAnZW5kJztcbiAgfVxuICByZXR1cm4ge3N0YXJ0LCBlbmQsIHJldmVyc2UsIHRvcCwgYm90dG9tfTtcbn1cblxuZnVuY3Rpb24gc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpIHtcbiAgbGV0IGVkZ2UgPSBvcHRpb25zLmJvcmRlclNraXBwZWQ7XG4gIGNvbnN0IHJlcyA9IHt9O1xuXG4gIGlmICghZWRnZSkge1xuICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHJlcztcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZWRnZSA9PT0gdHJ1ZSkge1xuICAgIHByb3BlcnRpZXMuYm9yZGVyU2tpcHBlZCA9IHt0b3A6IHRydWUsIHJpZ2h0OiB0cnVlLCBib3R0b206IHRydWUsIGxlZnQ6IHRydWV9O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtzdGFydCwgZW5kLCByZXZlcnNlLCB0b3AsIGJvdHRvbX0gPSBib3JkZXJQcm9wcyhwcm9wZXJ0aWVzKTtcblxuICBpZiAoZWRnZSA9PT0gJ21pZGRsZScgJiYgc3RhY2spIHtcbiAgICBwcm9wZXJ0aWVzLmVuYWJsZUJvcmRlclJhZGl1cyA9IHRydWU7XG4gICAgaWYgKChzdGFjay5fdG9wIHx8IDApID09PSBpbmRleCkge1xuICAgICAgZWRnZSA9IHRvcDtcbiAgICB9IGVsc2UgaWYgKChzdGFjay5fYm90dG9tIHx8IDApID09PSBpbmRleCkge1xuICAgICAgZWRnZSA9IGJvdHRvbTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW3BhcnNlRWRnZShib3R0b20sIHN0YXJ0LCBlbmQsIHJldmVyc2UpXSA9IHRydWU7XG4gICAgICBlZGdlID0gdG9wO1xuICAgIH1cbiAgfVxuXG4gIHJlc1twYXJzZUVkZ2UoZWRnZSwgc3RhcnQsIGVuZCwgcmV2ZXJzZSldID0gdHJ1ZTtcbiAgcHJvcGVydGllcy5ib3JkZXJTa2lwcGVkID0gcmVzO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVkZ2UoZWRnZSwgYSwgYiwgcmV2ZXJzZSkge1xuICBpZiAocmV2ZXJzZSkge1xuICAgIGVkZ2UgPSBzd2FwKGVkZ2UsIGEsIGIpO1xuICAgIGVkZ2UgPSBzdGFydEVuZChlZGdlLCBiLCBhKTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlID0gc3RhcnRFbmQoZWRnZSwgYSwgYik7XG4gIH1cbiAgcmV0dXJuIGVkZ2U7XG59XG5cbmZ1bmN0aW9uIHN3YXAob3JpZywgdjEsIHYyKSB7XG4gIHJldHVybiBvcmlnID09PSB2MSA/IHYyIDogb3JpZyA9PT0gdjIgPyB2MSA6IG9yaWc7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0RW5kKHYsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHYgPT09ICdzdGFydCcgPyBzdGFydCA6IHYgPT09ICdlbmQnID8gZW5kIDogdjtcbn1cblxuZnVuY3Rpb24gc2V0SW5mbGF0ZUFtb3VudChwcm9wZXJ0aWVzLCB7aW5mbGF0ZUFtb3VudH0sIHJhdGlvKSB7XG4gIHByb3BlcnRpZXMuaW5mbGF0ZUFtb3VudCA9IGluZmxhdGVBbW91bnQgPT09ICdhdXRvJ1xuICAgID8gcmF0aW8gPT09IDEgPyAwLjMzIDogMFxuICAgIDogaW5mbGF0ZUFtb3VudDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFyQ29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcblxuICBzdGF0aWMgaWQgPSAnYmFyJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgIGRhdGFFbGVtZW50VHlwZTogJ2JhcicsXG5cbiAgICBjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcbiAgICBiYXJQZXJjZW50YWdlOiAwLjksXG4gICAgZ3JvdXBlZDogdHJ1ZSxcblxuICAgIGFuaW1hdGlvbnM6IHtcbiAgICAgIG51bWJlcnM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIHByb3BlcnRpZXM6IFsneCcsICd5JywgJ2Jhc2UnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIHNjYWxlczoge1xuICAgICAgX2luZGV4Xzoge1xuICAgICAgICB0eXBlOiAnY2F0ZWdvcnknLFxuICAgICAgICBvZmZzZXQ6IHRydWUsXG4gICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF92YWx1ZV86IHtcbiAgICAgICAgdHlwZTogJ2xpbmVhcicsXG4gICAgICAgIGJlZ2luQXRaZXJvOiB0cnVlLFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuXG4gIC8qKlxuXHQgKiBPdmVycmlkaW5nIHByaW1pdGl2ZSBkYXRhIHBhcnNpbmcgc2luY2Ugd2Ugc3VwcG9ydCBtaXhlZCBwcmltaXRpdmUvYXJyYXlcblx0ICogZGF0YSBmb3IgZmxvYXQgYmFyc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBwYXJzZVByaW1pdGl2ZURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICB9XG5cbiAgLyoqXG5cdCAqIE92ZXJyaWRpbmcgYXJyYXkgZGF0YSBwYXJzaW5nIHNpbmNlIHdlIHN1cHBvcnQgbWl4ZWQgcHJpbWl0aXZlL2FycmF5XG5cdCAqIGRhdGEgZm9yIGZsb2F0IGJhcnNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgcmV0dXJuIHBhcnNlQXJyYXlPclByaW1pdGl2ZShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICB9XG5cbiAgLyoqXG5cdCAqIE92ZXJyaWRpbmcgb2JqZWN0IGRhdGEgcGFyc2luZyBzaW5jZSB3ZSBzdXBwb3J0IG1peGVkIHByaW1pdGl2ZS9hcnJheVxuXHQgKiB2YWx1ZS1zY2FsZSBkYXRhIGZvciBmbG9hdCBiYXJzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCB7aVNjYWxlLCB2U2NhbGV9ID0gbWV0YTtcbiAgICBjb25zdCB7eEF4aXNLZXkgPSAneCcsIHlBeGlzS2V5ID0gJ3knfSA9IHRoaXMuX3BhcnNpbmc7XG4gICAgY29uc3QgaUF4aXNLZXkgPSBpU2NhbGUuYXhpcyA9PT0gJ3gnID8geEF4aXNLZXkgOiB5QXhpc0tleTtcbiAgICBjb25zdCB2QXhpc0tleSA9IHZTY2FsZS5heGlzID09PSAneCcgPyB4QXhpc0tleSA6IHlBeGlzS2V5O1xuICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgIGxldCBpLCBpbGVuLCBpdGVtLCBvYmo7XG4gICAgZm9yIChpID0gc3RhcnQsIGlsZW4gPSBzdGFydCArIGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBvYmogPSBkYXRhW2ldO1xuICAgICAgaXRlbSA9IHt9O1xuICAgICAgaXRlbVtpU2NhbGUuYXhpc10gPSBpU2NhbGUucGFyc2UocmVzb2x2ZU9iamVjdEtleShvYmosIGlBeGlzS2V5KSwgaSk7XG4gICAgICBwYXJzZWQucHVzaChwYXJzZVZhbHVlKHJlc29sdmVPYmplY3RLZXkob2JqLCB2QXhpc0tleSksIGl0ZW0sIHZTY2FsZSwgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHVwZGF0ZVJhbmdlRnJvbVBhcnNlZChyYW5nZSwgc2NhbGUsIHBhcnNlZCwgc3RhY2spIHtcbiAgICBzdXBlci51cGRhdGVSYW5nZUZyb21QYXJzZWQocmFuZ2UsIHNjYWxlLCBwYXJzZWQsIHN0YWNrKTtcbiAgICBjb25zdCBjdXN0b20gPSBwYXJzZWQuX2N1c3RvbTtcbiAgICBpZiAoY3VzdG9tICYmIHNjYWxlID09PSB0aGlzLl9jYWNoZWRNZXRhLnZTY2FsZSkge1xuICAgICAgLy8gZmxvYXQgYmFyOiBvbmx5IG9uZSBlbmQgb2YgdGhlIGJhciBpcyBjb25zaWRlcmVkIGJ5IGBzdXBlcmBcbiAgICAgIHJhbmdlLm1pbiA9IE1hdGgubWluKHJhbmdlLm1pbiwgY3VzdG9tLm1pbik7XG4gICAgICByYW5nZS5tYXggPSBNYXRoLm1heChyYW5nZS5tYXgsIGN1c3RvbS5tYXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtudW1iZXJ8Ym9vbGVhbn1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IHtpU2NhbGUsIHZTY2FsZX0gPSBtZXRhO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICBjb25zdCBjdXN0b20gPSBwYXJzZWQuX2N1c3RvbTtcbiAgICBjb25zdCB2YWx1ZSA9IGlzRmxvYXRCYXIoY3VzdG9tKVxuICAgICAgPyAnWycgKyBjdXN0b20uc3RhcnQgKyAnLCAnICsgY3VzdG9tLmVuZCArICddJ1xuICAgICAgOiAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiAnJyArIGlTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFtpU2NhbGUuYXhpc10pLFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmVuYWJsZU9wdGlvblNoYXJpbmcgPSB0cnVlO1xuXG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuXG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgbWV0YS5zdGFjayA9IHRoaXMuZ2V0RGF0YXNldCgpLnN0YWNrO1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKG1ldGEuZGF0YSwgMCwgbWV0YS5kYXRhLmxlbmd0aCwgbW9kZSk7XG4gIH1cblxuICB1cGRhdGVFbGVtZW50cyhiYXJzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2luZGV4LCBfY2FjaGVkTWV0YToge3ZTY2FsZX19ID0gdGhpcztcbiAgICBjb25zdCBiYXNlID0gdlNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICAgIGNvbnN0IGhvcml6b250YWwgPSB2U2NhbGUuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgcnVsZXIgPSB0aGlzLl9nZXRSdWxlcigpO1xuICAgIGNvbnN0IHtzaGFyZWRPcHRpb25zLCBpbmNsdWRlT3B0aW9uc30gPSB0aGlzLl9nZXRTaGFyZWRPcHRpb25zKHN0YXJ0LCBtb2RlKTtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaSk7XG4gICAgICBjb25zdCB2cGl4ZWxzID0gcmVzZXQgfHwgaXNOdWxsT3JVbmRlZihwYXJzZWRbdlNjYWxlLmF4aXNdKSA/IHtiYXNlLCBoZWFkOiBiYXNlfSA6IHRoaXMuX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGkpO1xuICAgICAgY29uc3QgaXBpeGVscyA9IHRoaXMuX2NhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKGksIHJ1bGVyKTtcbiAgICAgIGNvbnN0IHN0YWNrID0gKHBhcnNlZC5fc3RhY2tzIHx8IHt9KVt2U2NhbGUuYXhpc107XG5cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgIGhvcml6b250YWwsXG4gICAgICAgIGJhc2U6IHZwaXhlbHMuYmFzZSxcbiAgICAgICAgZW5hYmxlQm9yZGVyUmFkaXVzOiAhc3RhY2sgfHwgaXNGbG9hdEJhcihwYXJzZWQuX2N1c3RvbSkgfHwgKGluZGV4ID09PSBzdGFjay5fdG9wIHx8IGluZGV4ID09PSBzdGFjay5fYm90dG9tKSxcbiAgICAgICAgeDogaG9yaXpvbnRhbCA/IHZwaXhlbHMuaGVhZCA6IGlwaXhlbHMuY2VudGVyLFxuICAgICAgICB5OiBob3Jpem9udGFsID8gaXBpeGVscy5jZW50ZXIgOiB2cGl4ZWxzLmhlYWQsXG4gICAgICAgIGhlaWdodDogaG9yaXpvbnRhbCA/IGlwaXhlbHMuc2l6ZSA6IE1hdGguYWJzKHZwaXhlbHMuc2l6ZSksXG4gICAgICAgIHdpZHRoOiBob3Jpem9udGFsID8gTWF0aC5hYnModnBpeGVscy5zaXplKSA6IGlwaXhlbHMuc2l6ZVxuICAgICAgfTtcblxuICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIGJhcnNbaV0uYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0aWVzLm9wdGlvbnMgfHwgYmFyc1tpXS5vcHRpb25zO1xuICAgICAgc2V0Qm9yZGVyU2tpcHBlZChwcm9wZXJ0aWVzLCBvcHRpb25zLCBzdGFjaywgaW5kZXgpO1xuICAgICAgc2V0SW5mbGF0ZUFtb3VudChwcm9wZXJ0aWVzLCBvcHRpb25zLCBydWxlci5yYXRpbyk7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoYmFyc1tpXSwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIHN0YWNrcyBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2xhc3RdIC0gVGhlIGRhdGFzZXQgaW5kZXhcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtkYXRhSW5kZXhdIC0gVGhlIGRhdGEgaW5kZXggb2YgdGhlIHJ1bGVyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVGhlIGxpc3Qgb2Ygc3RhY2sgSURzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0U3RhY2tzKGxhc3QsIGRhdGFJbmRleCkge1xuICAgIGNvbnN0IHtpU2NhbGV9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBtZXRhc2V0cyA9IGlTY2FsZS5nZXRNYXRjaGluZ1Zpc2libGVNZXRhcyh0aGlzLl90eXBlKVxuICAgICAgLmZpbHRlcihtZXRhID0+IG1ldGEuY29udHJvbGxlci5vcHRpb25zLmdyb3VwZWQpO1xuICAgIGNvbnN0IHN0YWNrZWQgPSBpU2NhbGUub3B0aW9ucy5zdGFja2VkO1xuICAgIGNvbnN0IHN0YWNrcyA9IFtdO1xuXG4gICAgY29uc3Qgc2tpcE51bGwgPSAobWV0YSkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gbWV0YS5jb250cm9sbGVyLmdldFBhcnNlZChkYXRhSW5kZXgpO1xuICAgICAgY29uc3QgdmFsID0gcGFyc2VkICYmIHBhcnNlZFttZXRhLnZTY2FsZS5heGlzXTtcblxuICAgICAgaWYgKGlzTnVsbE9yVW5kZWYodmFsKSB8fCBpc05hTih2YWwpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgbWV0YXNldHMpIHtcbiAgICAgIGlmIChkYXRhSW5kZXggIT09IHVuZGVmaW5lZCAmJiBza2lwTnVsbChtZXRhKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gc3RhY2tlZCAgIHwgbWV0YS5zdGFja1xuICAgICAgLy8gICAgICAgICAgIHwgZm91bmQgfCBub3QgZm91bmQgfCB1bmRlZmluZWRcbiAgICAgIC8vIGZhbHNlICAgICB8ICAgeCAgIHwgICAgIHggICAgIHwgICAgIHhcbiAgICAgIC8vIHRydWUgICAgICB8ICAgICAgIHwgICAgIHggICAgIHxcbiAgICAgIC8vIHVuZGVmaW5lZCB8ICAgICAgIHwgICAgIHggICAgIHwgICAgIHhcbiAgICAgIGlmIChzdGFja2VkID09PSBmYWxzZSB8fCBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEgfHxcblx0XHRcdFx0KHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHN0YWNrcy5wdXNoKG1ldGEuc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGEuaW5kZXggPT09IGxhc3QpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gc3RhY2tzPyB0aGF0IG1lYW5zIHRoZXJlIGlzIG5vIHZpc2libGUgZGF0YS4gTGV0J3Mgc3RpbGwgaW5pdGlhbGl6ZSBhbiBgdW5kZWZpbmVkYFxuICAgIC8vIHN0YWNrIHdoZXJlIHBvc3NpYmxlIGludmlzaWJsZSBiYXJzIHdpbGwgYmUgbG9jYXRlZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNjM2OFxuICAgIGlmICghc3RhY2tzLmxlbmd0aCkge1xuICAgICAgc3RhY2tzLnB1c2godW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBudW1iZXIgb2Ygc3RhY2tzIGJhc2VkIG9uIGdyb3VwcyBhbmQgYmFyIHZpc2liaWxpdHkuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0U3RhY2tDb3VudChpbmRleCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTdGFja3ModW5kZWZpbmVkLCBpbmRleCkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIHN0YWNrIGluZGV4IGZvciB0aGUgZ2l2ZW4gZGF0YXNldCBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2RhdGFzZXRJbmRleF0gLSBUaGUgZGF0YXNldCBpbmRleFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIHN0YWNrIG5hbWUgdG8gZmluZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGFJbmRleF1cblx0ICogQHJldHVybnMge251bWJlcn0gVGhlIHN0YWNrIGluZGV4XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0U3RhY2tJbmRleChkYXRhc2V0SW5kZXgsIG5hbWUsIGRhdGFJbmRleCkge1xuICAgIGNvbnN0IHN0YWNrcyA9IHRoaXMuX2dldFN0YWNrcyhkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCk7XG4gICAgY29uc3QgaW5kZXggPSAobmFtZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgPyBzdGFja3MuaW5kZXhPZihuYW1lKVxuICAgICAgOiAtMTsgLy8gaW5kZXhPZiByZXR1cm5zIC0xIGlmIGVsZW1lbnQgaXMgbm90IHByZXNlbnRcblxuICAgIHJldHVybiAoaW5kZXggPT09IC0xKVxuICAgICAgPyBzdGFja3MubGVuZ3RoIC0gMVxuICAgICAgOiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldFJ1bGVyKCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgaVNjYWxlID0gbWV0YS5pU2NhbGU7XG4gICAgY29uc3QgcGl4ZWxzID0gW107XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YS5kYXRhLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgcGl4ZWxzLnB1c2goaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRQYXJzZWQoaSlbaVNjYWxlLmF4aXNdLCBpKSk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFyVGhpY2tuZXNzID0gb3B0cy5iYXJUaGlja25lc3M7XG4gICAgY29uc3QgbWluID0gYmFyVGhpY2tuZXNzIHx8IGNvbXB1dGVNaW5TYW1wbGVTaXplKG1ldGEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbixcbiAgICAgIHBpeGVscyxcbiAgICAgIHN0YXJ0OiBpU2NhbGUuX3N0YXJ0UGl4ZWwsXG4gICAgICBlbmQ6IGlTY2FsZS5fZW5kUGl4ZWwsXG4gICAgICBzdGFja0NvdW50OiB0aGlzLl9nZXRTdGFja0NvdW50KCksXG4gICAgICBzY2FsZTogaVNjYWxlLFxuICAgICAgZ3JvdXBlZDogb3B0cy5ncm91cGVkLFxuICAgICAgLy8gYmFyIHRoaWNrbmVzcyByYXRpbyB1c2VkIGZvciBub24tZ3JvdXBlZCBiYXJzXG4gICAgICByYXRpbzogYmFyVGhpY2tuZXNzID8gMSA6IG9wdHMuY2F0ZWdvcnlQZXJjZW50YWdlICogb3B0cy5iYXJQZXJjZW50YWdlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBOb3RlOiBwaXhlbCB2YWx1ZXMgYXJlIG5vdCBjbGFtcGVkIHRvIHRoZSBzY2FsZSBhcmVhLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKGluZGV4KSB7XG4gICAgY29uc3Qge19jYWNoZWRNZXRhOiB7dlNjYWxlLCBfc3RhY2tlZCwgaW5kZXg6IGRhdGFzZXRJbmRleH0sIG9wdGlvbnM6IHtiYXNlOiBiYXNlVmFsdWUsIG1pbkJhckxlbmd0aH19ID0gdGhpcztcbiAgICBjb25zdCBhY3R1YWxCYXNlID0gYmFzZVZhbHVlIHx8IDA7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgIGNvbnN0IGN1c3RvbSA9IHBhcnNlZC5fY3VzdG9tO1xuICAgIGNvbnN0IGZsb2F0aW5nID0gaXNGbG9hdEJhcihjdXN0b20pO1xuICAgIGxldCB2YWx1ZSA9IHBhcnNlZFt2U2NhbGUuYXhpc107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgbGVuZ3RoID0gX3N0YWNrZWQgPyB0aGlzLmFwcGx5U3RhY2sodlNjYWxlLCBwYXJzZWQsIF9zdGFja2VkKSA6IHZhbHVlO1xuICAgIGxldCBoZWFkLCBzaXplO1xuXG4gICAgaWYgKGxlbmd0aCAhPT0gdmFsdWUpIHtcbiAgICAgIHN0YXJ0ID0gbGVuZ3RoIC0gdmFsdWU7XG4gICAgICBsZW5ndGggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoZmxvYXRpbmcpIHtcbiAgICAgIHZhbHVlID0gY3VzdG9tLmJhclN0YXJ0O1xuICAgICAgbGVuZ3RoID0gY3VzdG9tLmJhckVuZCAtIGN1c3RvbS5iYXJTdGFydDtcbiAgICAgIC8vIGJhcnMgY3Jvc3Npbmcgb3JpZ2luIGFyZSBub3Qgc3RhY2tlZFxuICAgICAgaWYgKHZhbHVlICE9PSAwICYmIHNpZ24odmFsdWUpICE9PSBzaWduKGN1c3RvbS5iYXJFbmQpKSB7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ICs9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSAhaXNOdWxsT3JVbmRlZihiYXNlVmFsdWUpICYmICFmbG9hdGluZyA/IGJhc2VWYWx1ZSA6IHN0YXJ0O1xuICAgIGxldCBiYXNlID0gdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnRWYWx1ZSk7XG5cbiAgICBpZiAodGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShpbmRleCkpIHtcbiAgICAgIGhlYWQgPSB2U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCArIGxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdoZW4gbm90IHZpc2libGUsIG5vIGhlaWdodFxuICAgICAgaGVhZCA9IGJhc2U7XG4gICAgfVxuXG4gICAgc2l6ZSA9IGhlYWQgLSBiYXNlO1xuXG4gICAgaWYgKE1hdGguYWJzKHNpemUpIDwgbWluQmFyTGVuZ3RoKSB7XG4gICAgICBzaXplID0gYmFyU2lnbihzaXplLCB2U2NhbGUsIGFjdHVhbEJhc2UpICogbWluQmFyTGVuZ3RoO1xuICAgICAgaWYgKHZhbHVlID09PSBhY3R1YWxCYXNlKSB7XG4gICAgICAgIGJhc2UgLT0gc2l6ZSAvIDI7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGFydFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwKTtcbiAgICAgIGNvbnN0IGVuZFBpeGVsID0gdlNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgxKTtcbiAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHN0YXJ0UGl4ZWwsIGVuZFBpeGVsKTtcbiAgICAgIGJhc2UgPSBNYXRoLm1heChNYXRoLm1pbihiYXNlLCBtYXgpLCBtaW4pO1xuICAgICAgaGVhZCA9IGJhc2UgKyBzaXplO1xuXG4gICAgICBpZiAoX3N0YWNrZWQgJiYgIWZsb2F0aW5nKSB7XG4gICAgICAgIC8vIHZpc3VhbCBkYXRhIGNvb3JkaW5hdGVzIGFmdGVyIGFwcGx5aW5nIG1pbkJhckxlbmd0aFxuICAgICAgICBwYXJzZWQuX3N0YWNrc1t2U2NhbGUuYXhpc10uX3Zpc3VhbFZhbHVlc1tkYXRhc2V0SW5kZXhdID0gdlNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoaGVhZCkgLSB2U2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChiYXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUoYWN0dWFsQmFzZSkpIHtcbiAgICAgIGNvbnN0IGhhbGZHcmlkID0gc2lnbihzaXplKSAqIHZTY2FsZS5nZXRMaW5lV2lkdGhGb3JWYWx1ZShhY3R1YWxCYXNlKSAvIDI7XG4gICAgICBiYXNlICs9IGhhbGZHcmlkO1xuICAgICAgc2l6ZSAtPSBoYWxmR3JpZDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZSxcbiAgICAgIGJhc2UsXG4gICAgICBoZWFkLFxuICAgICAgY2VudGVyOiBoZWFkICsgc2l6ZSAvIDJcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMoaW5kZXgsIHJ1bGVyKSB7XG4gICAgY29uc3Qgc2NhbGUgPSBydWxlci5zY2FsZTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHNraXBOdWxsID0gb3B0aW9ucy5za2lwTnVsbDtcbiAgICBjb25zdCBtYXhCYXJUaGlja25lc3MgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLm1heEJhclRoaWNrbmVzcywgSW5maW5pdHkpO1xuICAgIGxldCBjZW50ZXIsIHNpemU7XG4gICAgaWYgKHJ1bGVyLmdyb3VwZWQpIHtcbiAgICAgIGNvbnN0IHN0YWNrQ291bnQgPSBza2lwTnVsbCA/IHRoaXMuX2dldFN0YWNrQ291bnQoaW5kZXgpIDogcnVsZXIuc3RhY2tDb3VudDtcbiAgICAgIGNvbnN0IHJhbmdlID0gb3B0aW9ucy5iYXJUaGlja25lc3MgPT09ICdmbGV4J1xuICAgICAgICA/IGNvbXB1dGVGbGV4Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zLCBzdGFja0NvdW50KVxuICAgICAgICA6IGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMsIHN0YWNrQ291bnQpO1xuXG4gICAgICBjb25zdCBzdGFja0luZGV4ID0gdGhpcy5fZ2V0U3RhY2tJbmRleCh0aGlzLmluZGV4LCB0aGlzLl9jYWNoZWRNZXRhLnN0YWNrLCBza2lwTnVsbCA/IGluZGV4IDogdW5kZWZpbmVkKTtcbiAgICAgIGNlbnRlciA9IHJhbmdlLnN0YXJ0ICsgKHJhbmdlLmNodW5rICogc3RhY2tJbmRleCkgKyAocmFuZ2UuY2h1bmsgLyAyKTtcbiAgICAgIHNpemUgPSBNYXRoLm1pbihtYXhCYXJUaGlja25lc3MsIHJhbmdlLmNodW5rICogcmFuZ2UucmF0aW8pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3Igbm9uLWdyb3VwZWQgYmFyIGNoYXJ0cywgZXhhY3QgcGl4ZWwgdmFsdWVzIGFyZSB1c2VkXG4gICAgICBjZW50ZXIgPSBzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKGluZGV4KVtzY2FsZS5heGlzXSwgaW5kZXgpO1xuICAgICAgc2l6ZSA9IE1hdGgubWluKG1heEJhclRoaWNrbmVzcywgcnVsZXIubWluICogcnVsZXIucmF0aW8pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBiYXNlOiBjZW50ZXIgLSBzaXplIC8gMixcbiAgICAgIGhlYWQ6IGNlbnRlciArIHNpemUgLyAyLFxuICAgICAgY2VudGVyLFxuICAgICAgc2l6ZVxuICAgIH07XG4gIH1cblxuICBkcmF3KCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IHZTY2FsZSA9IG1ldGEudlNjYWxlO1xuICAgIGNvbnN0IHJlY3RzID0gbWV0YS5kYXRhO1xuICAgIGNvbnN0IGlsZW4gPSByZWN0cy5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuXG4gICAgZm9yICg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmdldFBhcnNlZChpKVt2U2NhbGUuYXhpc10gIT09IG51bGwpIHtcbiAgICAgICAgcmVjdHNbaV0uZHJhdyh0aGlzLl9jdHgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge3ZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1YmJsZUNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgc3RhdGljIGlkID0gJ2J1YmJsZSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGF0YXNldEVsZW1lbnRUeXBlOiBmYWxzZSxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG5cbiAgICBhbmltYXRpb25zOiB7XG4gICAgICBudW1iZXJzOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBwcm9wZXJ0aWVzOiBbJ3gnLCAneScsICdib3JkZXJXaWR0aCcsICdyYWRpdXMnXVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgc2NhbGVzOiB7XG4gICAgICB4OiB7XG4gICAgICAgIHR5cGU6ICdsaW5lYXInXG4gICAgICB9LFxuICAgICAgeToge1xuICAgICAgICB0eXBlOiAnbGluZWFyJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IHRydWU7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIFBhcnNlIGFycmF5IG9mIHByaW1pdGl2ZSB2YWx1ZXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VQcmltaXRpdmVEYXRhKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHN1cGVyLnBhcnNlUHJpbWl0aXZlRGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXJzZWRbaV0uX2N1c3RvbSA9IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpICsgc3RhcnQpLnJhZGl1cztcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBhcnJheXNcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgcGFyc2VkID0gc3VwZXIucGFyc2VBcnJheURhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgIHBhcnNlZFtpXS5fY3VzdG9tID0gdmFsdWVPckRlZmF1bHQoaXRlbVsyXSwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkgKyBzdGFydCkucmFkaXVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBQYXJzZSBhcnJheSBvZiBvYmplY3RzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBzdXBlci5wYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IGRhdGFbc3RhcnQgKyBpXTtcbiAgICAgIHBhcnNlZFtpXS5fY3VzdG9tID0gdmFsdWVPckRlZmF1bHQoaXRlbSAmJiBpdGVtLnIgJiYgK2l0ZW0uciwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkgKyBzdGFydCkucmFkaXVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBnZXRNYXhPdmVyZmxvdygpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fY2FjaGVkTWV0YS5kYXRhO1xuXG4gICAgbGV0IG1heCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IGRhdGEubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZGF0YVtpXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpKSkgLyAyKTtcbiAgICB9XG4gICAgcmV0dXJuIG1heCA+IDAgJiYgbWF4O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldExhYmVsQW5kVmFsdWUoaW5kZXgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmNoYXJ0LmRhdGEubGFiZWxzIHx8IFtdO1xuICAgIGNvbnN0IHt4U2NhbGUsIHlTY2FsZX0gPSBtZXRhO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICBjb25zdCB4ID0geFNjYWxlLmdldExhYmVsRm9yVmFsdWUocGFyc2VkLngpO1xuICAgIGNvbnN0IHkgPSB5U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueSk7XG4gICAgY29uc3QgciA9IHBhcnNlZC5fY3VzdG9tO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBsYWJlbHNbaW5kZXhdIHx8ICcnLFxuICAgICAgdmFsdWU6ICcoJyArIHggKyAnLCAnICsgeSArIChyID8gJywgJyArIHIgOiAnJykgKyAnKSdcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG5cbiAgICAvLyBVcGRhdGUgUG9pbnRzXG4gICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIDAsIHBvaW50cy5sZW5ndGgsIG1vZGUpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2lTY2FsZSwgdlNjYWxlfSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3Qge3NoYXJlZE9wdGlvbnMsIGluY2x1ZGVPcHRpb25zfSA9IHRoaXMuX2dldFNoYXJlZE9wdGlvbnMoc3RhcnQsIG1vZGUpO1xuICAgIGNvbnN0IGlBeGlzID0gaVNjYWxlLmF4aXM7XG4gICAgY29uc3QgdkF4aXMgPSB2U2NhbGUuYXhpcztcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICBjb25zdCBwYXJzZWQgPSAhcmVzZXQgJiYgdGhpcy5nZXRQYXJzZWQoaSk7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge307XG4gICAgICBjb25zdCBpUGl4ZWwgPSBwcm9wZXJ0aWVzW2lBeGlzXSA9IHJlc2V0ID8gaVNjYWxlLmdldFBpeGVsRm9yRGVjaW1hbCgwLjUpIDogaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUocGFyc2VkW2lBeGlzXSk7XG4gICAgICBjb25zdCB2UGl4ZWwgPSBwcm9wZXJ0aWVzW3ZBeGlzXSA9IHJlc2V0ID8gdlNjYWxlLmdldEJhc2VQaXhlbCgpIDogdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUocGFyc2VkW3ZBeGlzXSk7XG5cbiAgICAgIHByb3BlcnRpZXMuc2tpcCA9IGlzTmFOKGlQaXhlbCkgfHwgaXNOYU4odlBpeGVsKTtcblxuICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG5cbiAgICAgICAgaWYgKHJlc2V0KSB7XG4gICAgICAgICAgcHJvcGVydGllcy5vcHRpb25zLnJhZGl1cyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHBvaW50LCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbW9kZV1cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgcmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCwgbW9kZSkge1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcbiAgICBsZXQgdmFsdWVzID0gc3VwZXIucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpbmRleCwgbW9kZSk7XG5cbiAgICAvLyBJbiBjYXNlIHZhbHVlcyB3ZXJlIGNhY2hlZCAoYW5kIHRodXMgZnJvemVuKSwgd2UgbmVlZCB0byBjbG9uZSB0aGUgdmFsdWVzXG4gICAgaWYgKHZhbHVlcy4kc2hhcmVkKSB7XG4gICAgICB2YWx1ZXMgPSBPYmplY3QuYXNzaWduKHt9LCB2YWx1ZXMsIHskc2hhcmVkOiBmYWxzZX0pO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbSByYWRpdXMgcmVzb2x1dGlvblxuICAgIGNvbnN0IHJhZGl1cyA9IHZhbHVlcy5yYWRpdXM7XG4gICAgaWYgKG1vZGUgIT09ICdhY3RpdmUnKSB7XG4gICAgICB2YWx1ZXMucmFkaXVzID0gMDtcbiAgICB9XG4gICAgdmFsdWVzLnJhZGl1cyArPSB2YWx1ZU9yRGVmYXVsdChwYXJzZWQgJiYgcGFyc2VkLl9jdXN0b20sIHJhZGl1cyk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge2lzT2JqZWN0LCByZXNvbHZlT2JqZWN0S2V5LCB0b1BlcmNlbnRhZ2UsIHRvRGltZW5zaW9uLCB2YWx1ZU9yRGVmYXVsdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuaW1wb3J0IHtmb3JtYXROdW1iZXJ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5pbnRsLmpzJztcbmltcG9ydCB7dG9SYWRpYW5zLCBQSSwgVEFVLCBIQUxGX1BJLCBfYW5nbGVCZXR3ZWVufSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IENoYXJ0XG4gKi9cblxuZnVuY3Rpb24gZ2V0UmF0aW9BbmRPZmZzZXQocm90YXRpb24sIGNpcmN1bWZlcmVuY2UsIGN1dG91dCkge1xuICBsZXQgcmF0aW9YID0gMTtcbiAgbGV0IHJhdGlvWSA9IDE7XG4gIGxldCBvZmZzZXRYID0gMDtcbiAgbGV0IG9mZnNldFkgPSAwO1xuICAvLyBJZiB0aGUgY2hhcnQncyBjaXJjdW1mZXJlbmNlIGlzbid0IGEgZnVsbCBjaXJjbGUsIGNhbGN1bGF0ZSBzaXplIGFzIGEgcmF0aW8gb2YgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgYXJjXG4gIGlmIChjaXJjdW1mZXJlbmNlIDwgVEFVKSB7XG4gICAgY29uc3Qgc3RhcnRBbmdsZSA9IHJvdGF0aW9uO1xuICAgIGNvbnN0IGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIGNpcmN1bWZlcmVuY2U7XG4gICAgY29uc3Qgc3RhcnRYID0gTWF0aC5jb3Moc3RhcnRBbmdsZSk7XG4gICAgY29uc3Qgc3RhcnRZID0gTWF0aC5zaW4oc3RhcnRBbmdsZSk7XG4gICAgY29uc3QgZW5kWCA9IE1hdGguY29zKGVuZEFuZ2xlKTtcbiAgICBjb25zdCBlbmRZID0gTWF0aC5zaW4oZW5kQW5nbGUpO1xuICAgIGNvbnN0IGNhbGNNYXggPSAoYW5nbGUsIGEsIGIpID0+IF9hbmdsZUJldHdlZW4oYW5nbGUsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlLCB0cnVlKSA/IDEgOiBNYXRoLm1heChhLCBhICogY3V0b3V0LCBiLCBiICogY3V0b3V0KTtcbiAgICBjb25zdCBjYWxjTWluID0gKGFuZ2xlLCBhLCBiKSA9PiBfYW5nbGVCZXR3ZWVuKGFuZ2xlLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgdHJ1ZSkgPyAtMSA6IE1hdGgubWluKGEsIGEgKiBjdXRvdXQsIGIsIGIgKiBjdXRvdXQpO1xuICAgIGNvbnN0IG1heFggPSBjYWxjTWF4KDAsIHN0YXJ0WCwgZW5kWCk7XG4gICAgY29uc3QgbWF4WSA9IGNhbGNNYXgoSEFMRl9QSSwgc3RhcnRZLCBlbmRZKTtcbiAgICBjb25zdCBtaW5YID0gY2FsY01pbihQSSwgc3RhcnRYLCBlbmRYKTtcbiAgICBjb25zdCBtaW5ZID0gY2FsY01pbihQSSArIEhBTEZfUEksIHN0YXJ0WSwgZW5kWSk7XG4gICAgcmF0aW9YID0gKG1heFggLSBtaW5YKSAvIDI7XG4gICAgcmF0aW9ZID0gKG1heFkgLSBtaW5ZKSAvIDI7XG4gICAgb2Zmc2V0WCA9IC0obWF4WCArIG1pblgpIC8gMjtcbiAgICBvZmZzZXRZID0gLShtYXhZICsgbWluWSkgLyAyO1xuICB9XG4gIHJldHVybiB7cmF0aW9YLCByYXRpb1ksIG9mZnNldFgsIG9mZnNldFl9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3VnaG51dENvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgc3RhdGljIGlkID0gJ2RvdWdobnV0JztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGZhbHNlLFxuICAgIGRhdGFFbGVtZW50VHlwZTogJ2FyYycsXG4gICAgYW5pbWF0aW9uOiB7XG4gICAgICAvLyBCb29sZWFuIC0gV2hldGhlciB3ZSBhbmltYXRlIHRoZSByb3RhdGlvbiBvZiB0aGUgRG91Z2hudXRcbiAgICAgIGFuaW1hdGVSb3RhdGU6IHRydWUsXG4gICAgICAvLyBCb29sZWFuIC0gV2hldGhlciB3ZSBhbmltYXRlIHNjYWxpbmcgdGhlIERvdWdobnV0IGZyb20gdGhlIGNlbnRyZVxuICAgICAgYW5pbWF0ZVNjYWxlOiBmYWxzZVxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgbnVtYmVyczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgcHJvcGVydGllczogWydjaXJjdW1mZXJlbmNlJywgJ2VuZEFuZ2xlJywgJ2lubmVyUmFkaXVzJywgJ291dGVyUmFkaXVzJywgJ3N0YXJ0QW5nbGUnLCAneCcsICd5JywgJ29mZnNldCcsICdib3JkZXJXaWR0aCcsICdzcGFjaW5nJ11cbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgdGhhdCB3ZSBjdXQgb3V0IG9mIHRoZSBtaWRkbGUuXG4gICAgY3V0b3V0OiAnNTAlJyxcblxuICAgIC8vIFRoZSByb3RhdGlvbiBvZiB0aGUgY2hhcnQsIHdoZXJlIHRoZSBmaXJzdCBkYXRhIGFyYyBiZWdpbnMuXG4gICAgcm90YXRpb246IDAsXG5cbiAgICAvLyBUaGUgdG90YWwgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2hhcnQuXG4gICAgY2lyY3VtZmVyZW5jZTogMzYwLFxuXG4gICAgLy8gVGhlIG91dHIgcmFkaXVzIG9mIHRoZSBjaGFydFxuICAgIHJhZGl1czogJzEwMCUnLFxuXG4gICAgLy8gU3BhY2luZyBiZXR3ZWVuIGFyY3NcbiAgICBzcGFjaW5nOiAwLFxuXG4gICAgaW5kZXhBeGlzOiAncicsXG4gIH07XG5cbiAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgIF9zY3JpcHRhYmxlOiAobmFtZSkgPT4gbmFtZSAhPT0gJ3NwYWNpbmcnLFxuICAgIF9pbmRleGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnc3BhY2luZycsXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIGFzcGVjdFJhdGlvOiAxLFxuXG4gICAgLy8gTmVlZCB0byBvdmVycmlkZSB0aGVzZSB0byBnaXZlIGEgbmljZSBkZWZhdWx0XG4gICAgcGx1Z2luczoge1xuICAgICAgbGVnZW5kOiB7XG4gICAgICAgIGxhYmVsczoge1xuICAgICAgICAgIGdlbmVyYXRlTGFiZWxzKGNoYXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3Qge2xhYmVsczoge3BvaW50U3R5bGUsIGNvbG9yfX0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcblxuICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sYWJlbHMubWFwKChsYWJlbCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSgwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IG1ldGEuY29udHJvbGxlci5nZXRTdHlsZShpKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogc3R5bGUuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlU3R5bGU6IHN0eWxlLmJvcmRlckNvbG9yLFxuICAgICAgICAgICAgICAgICAgZm9udENvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgICAgIGxpbmVXaWR0aDogc3R5bGUuYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICBwb2ludFN0eWxlOiBwb2ludFN0eWxlLFxuICAgICAgICAgICAgICAgICAgaGlkZGVuOiAhY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSksXG5cbiAgICAgICAgICAgICAgICAgIC8vIEV4dHJhIGRhdGEgdXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGNvcnJlY3QgaXRlbVxuICAgICAgICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgb25DbGljayhlLCBsZWdlbmRJdGVtLCBsZWdlbmQpIHtcbiAgICAgICAgICBsZWdlbmQuY2hhcnQudG9nZ2xlRGF0YVZpc2liaWxpdHkobGVnZW5kSXRlbS5pbmRleCk7XG4gICAgICAgICAgbGVnZW5kLmNoYXJ0LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcbiAgICBzdXBlcihjaGFydCwgZGF0YXNldEluZGV4KTtcblxuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IHRydWU7XG4gICAgdGhpcy5pbm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub2Zmc2V0WCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9mZnNldFkgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBsaW5rU2NhbGVzKCkge31cblxuICAvKipcblx0ICogT3ZlcnJpZGUgZGF0YSBwYXJzaW5nLCBzaW5jZSB3ZSBhcmUgbm90IHVzaW5nIHNjYWxlc1xuXHQgKi9cbiAgcGFyc2Uoc3RhcnQsIGNvdW50KSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YXNldCgpLmRhdGE7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG5cbiAgICBpZiAodGhpcy5fcGFyc2luZyA9PT0gZmFsc2UpIHtcbiAgICAgIG1ldGEuX3BhcnNlZCA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBnZXR0ZXIgPSAoaSkgPT4gK2RhdGFbaV07XG5cbiAgICAgIGlmIChpc09iamVjdChkYXRhW3N0YXJ0XSkpIHtcbiAgICAgICAgY29uc3Qge2tleSA9ICd2YWx1ZSd9ID0gdGhpcy5fcGFyc2luZztcbiAgICAgICAgZ2V0dGVyID0gKGkpID0+ICtyZXNvbHZlT2JqZWN0S2V5KGRhdGFbaV0sIGtleSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBpLCBpbGVuO1xuICAgICAgZm9yIChpID0gc3RhcnQsIGlsZW4gPSBzdGFydCArIGNvdW50OyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICAgIG1ldGEuX3BhcnNlZFtpXSA9IGdldHRlcihpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRSb3RhdGlvbigpIHtcbiAgICByZXR1cm4gdG9SYWRpYW5zKHRoaXMub3B0aW9ucy5yb3RhdGlvbiAtIDkwKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldENpcmN1bWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRvUmFkaWFucyh0aGlzLm9wdGlvbnMuY2lyY3VtZmVyZW5jZSk7XG4gIH1cblxuICAvKipcblx0ICogR2V0IHRoZSBtYXhpbWFsIHJvdGF0aW9uICYgY2lyY3VtZmVyZW5jZSBleHRlbnRzXG5cdCAqIGFjcm9zcyBhbGwgdmlzaWJsZSBkYXRhc2V0cy5cblx0ICovXG4gIF9nZXRSb3RhdGlvbkV4dGVudHMoKSB7XG4gICAgbGV0IG1pbiA9IFRBVTtcbiAgICBsZXQgbWF4ID0gLVRBVTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAodGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpICYmIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSkudHlwZSA9PT0gdGhpcy5fdHlwZSkge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5jaGFydC5nZXREYXRhc2V0TWV0YShpKS5jb250cm9sbGVyO1xuICAgICAgICBjb25zdCByb3RhdGlvbiA9IGNvbnRyb2xsZXIuX2dldFJvdGF0aW9uKCk7XG4gICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSBjb250cm9sbGVyLl9nZXRDaXJjdW1mZXJlbmNlKCk7XG5cbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCByb3RhdGlvbik7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgcm90YXRpb24gKyBjaXJjdW1mZXJlbmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm90YXRpb246IG1pbixcbiAgICAgIGNpcmN1bWZlcmVuY2U6IG1heCAtIG1pbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlXG5cdCAqL1xuICB1cGRhdGUobW9kZSkge1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCB7Y2hhcnRBcmVhfSA9IGNoYXJ0O1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGFyY3MgPSBtZXRhLmRhdGE7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuZ2V0TWF4Qm9yZGVyV2lkdGgoKSArIHRoaXMuZ2V0TWF4T2Zmc2V0KGFyY3MpICsgdGhpcy5vcHRpb25zLnNwYWNpbmc7XG4gICAgY29uc3QgbWF4U2l6ZSA9IE1hdGgubWF4KChNYXRoLm1pbihjaGFydEFyZWEud2lkdGgsIGNoYXJ0QXJlYS5oZWlnaHQpIC0gc3BhY2luZykgLyAyLCAwKTtcbiAgICBjb25zdCBjdXRvdXQgPSBNYXRoLm1pbih0b1BlcmNlbnRhZ2UodGhpcy5vcHRpb25zLmN1dG91dCwgbWF4U2l6ZSksIDEpO1xuICAgIGNvbnN0IGNoYXJ0V2VpZ2h0ID0gdGhpcy5fZ2V0UmluZ1dlaWdodCh0aGlzLmluZGV4KTtcblxuICAgIC8vIENvbXB1dGUgdGhlIG1heGltYWwgcm90YXRpb24gJiBjaXJjdW1mZXJlbmNlIGxpbWl0cy5cbiAgICAvLyBJZiB3ZSBvbmx5IGNvbnNpZGVyIG91ciBkYXRhc2V0LCB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyB3aGVuIHR3byBkYXRhc2V0c1xuICAgIC8vIGFyZSBib3RoIGxlc3MgdGhhbiBhIGNpcmNsZSB3aXRoIGRpZmZlcmVudCByb3RhdGlvbnMgKHN0YXJ0aW5nIGFuZ2xlcylcbiAgICBjb25zdCB7Y2lyY3VtZmVyZW5jZSwgcm90YXRpb259ID0gdGhpcy5fZ2V0Um90YXRpb25FeHRlbnRzKCk7XG4gICAgY29uc3Qge3JhdGlvWCwgcmF0aW9ZLCBvZmZzZXRYLCBvZmZzZXRZfSA9IGdldFJhdGlvQW5kT2Zmc2V0KHJvdGF0aW9uLCBjaXJjdW1mZXJlbmNlLCBjdXRvdXQpO1xuICAgIGNvbnN0IG1heFdpZHRoID0gKGNoYXJ0QXJlYS53aWR0aCAtIHNwYWNpbmcpIC8gcmF0aW9YO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IChjaGFydEFyZWEuaGVpZ2h0IC0gc3BhY2luZykgLyByYXRpb1k7XG4gICAgY29uc3QgbWF4UmFkaXVzID0gTWF0aC5tYXgoTWF0aC5taW4obWF4V2lkdGgsIG1heEhlaWdodCkgLyAyLCAwKTtcbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IHRvRGltZW5zaW9uKHRoaXMub3B0aW9ucy5yYWRpdXMsIG1heFJhZGl1cyk7XG4gICAgY29uc3QgaW5uZXJSYWRpdXMgPSBNYXRoLm1heChvdXRlclJhZGl1cyAqIGN1dG91dCwgMCk7XG4gICAgY29uc3QgcmFkaXVzTGVuZ3RoID0gKG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMpIC8gdGhpcy5fZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpO1xuICAgIHRoaXMub2Zmc2V0WCA9IG9mZnNldFggKiBvdXRlclJhZGl1cztcbiAgICB0aGlzLm9mZnNldFkgPSBvZmZzZXRZICogb3V0ZXJSYWRpdXM7XG5cbiAgICBtZXRhLnRvdGFsID0gdGhpcy5jYWxjdWxhdGVUb3RhbCgpO1xuXG4gICAgdGhpcy5vdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIC0gcmFkaXVzTGVuZ3RoICogdGhpcy5fZ2V0UmluZ1dlaWdodE9mZnNldCh0aGlzLmluZGV4KTtcbiAgICB0aGlzLmlubmVyUmFkaXVzID0gTWF0aC5tYXgodGhpcy5vdXRlclJhZGl1cyAtIHJhZGl1c0xlbmd0aCAqIGNoYXJ0V2VpZ2h0LCAwKTtcblxuICAgIHRoaXMudXBkYXRlRWxlbWVudHMoYXJjcywgMCwgYXJjcy5sZW5ndGgsIG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2lyY3VtZmVyZW5jZShpLCByZXNldCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IHRoaXMuX2dldENpcmN1bWZlcmVuY2UoKTtcbiAgICBpZiAoKHJlc2V0ICYmIG9wdHMuYW5pbWF0aW9uLmFuaW1hdGVSb3RhdGUpIHx8ICF0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpIHx8IG1ldGEuX3BhcnNlZFtpXSA9PT0gbnVsbCB8fCBtZXRhLmRhdGFbaV0uaGlkZGVuKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2lyY3VtZmVyZW5jZShtZXRhLl9wYXJzZWRbaV0gKiBjaXJjdW1mZXJlbmNlIC8gVEFVKTtcbiAgfVxuXG4gIHVwZGF0ZUVsZW1lbnRzKGFyY3MsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xuICAgIGNvbnN0IG9wdHMgPSBjaGFydC5vcHRpb25zO1xuICAgIGNvbnN0IGFuaW1hdGlvbk9wdHMgPSBvcHRzLmFuaW1hdGlvbjtcbiAgICBjb25zdCBjZW50ZXJYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IChjaGFydEFyZWEudG9wICsgY2hhcnRBcmVhLmJvdHRvbSkgLyAyO1xuICAgIGNvbnN0IGFuaW1hdGVTY2FsZSA9IHJlc2V0ICYmIGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVNjYWxlO1xuICAgIGNvbnN0IGlubmVyUmFkaXVzID0gYW5pbWF0ZVNjYWxlID8gMCA6IHRoaXMuaW5uZXJSYWRpdXM7XG4gICAgY29uc3Qgb3V0ZXJSYWRpdXMgPSBhbmltYXRlU2NhbGUgPyAwIDogdGhpcy5vdXRlclJhZGl1cztcbiAgICBjb25zdCB7c2hhcmVkT3B0aW9ucywgaW5jbHVkZU9wdGlvbnN9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgbGV0IHN0YXJ0QW5nbGUgPSB0aGlzLl9nZXRSb3RhdGlvbigpO1xuICAgIGxldCBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHN0YXJ0OyArK2kpIHtcbiAgICAgIHN0YXJ0QW5nbGUgKz0gdGhpcy5fY2lyY3VtZmVyZW5jZShpLCByZXNldCk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyArK2kpIHtcbiAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSB0aGlzLl9jaXJjdW1mZXJlbmNlKGksIHJlc2V0KTtcbiAgICAgIGNvbnN0IGFyYyA9IGFyY3NbaV07XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICB4OiBjZW50ZXJYICsgdGhpcy5vZmZzZXRYLFxuICAgICAgICB5OiBjZW50ZXJZICsgdGhpcy5vZmZzZXRZLFxuICAgICAgICBzdGFydEFuZ2xlLFxuICAgICAgICBlbmRBbmdsZTogc3RhcnRBbmdsZSArIGNpcmN1bWZlcmVuY2UsXG4gICAgICAgIGNpcmN1bWZlcmVuY2UsXG4gICAgICAgIG91dGVyUmFkaXVzLFxuICAgICAgICBpbm5lclJhZGl1c1xuICAgICAgfTtcbiAgICAgIGlmIChpbmNsdWRlT3B0aW9ucykge1xuICAgICAgICBwcm9wZXJ0aWVzLm9wdGlvbnMgPSBzaGFyZWRPcHRpb25zIHx8IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBhcmMuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0QW5nbGUgKz0gY2lyY3VtZmVyZW5jZTtcblxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGFyYywgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlVG90YWwoKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgbWV0YURhdGEgPSBtZXRhLmRhdGE7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBsZXQgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBtZXRhRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSBtZXRhLl9wYXJzZWRbaV07XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgIWlzTmFOKHZhbHVlKSAmJiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGkpICYmICFtZXRhRGF0YVtpXS5oaWRkZW4pIHtcbiAgICAgICAgdG90YWwgKz0gTWF0aC5hYnModmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UodmFsdWUpIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuX2NhY2hlZE1ldGEudG90YWw7XG4gICAgaWYgKHRvdGFsID4gMCAmJiAhaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gVEFVICogKE1hdGguYWJzKHZhbHVlKSAvIHRvdGFsKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBnZXRMYWJlbEFuZFZhbHVlKGluZGV4KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IGxhYmVscyA9IGNoYXJ0LmRhdGEubGFiZWxzIHx8IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0TnVtYmVyKG1ldGEuX3BhcnNlZFtpbmRleF0sIGNoYXJ0Lm9wdGlvbnMubG9jYWxlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgIHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBnZXRNYXhCb3JkZXJXaWR0aChhcmNzKSB7XG4gICAgbGV0IG1heCA9IDA7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGxldCBpLCBpbGVuLCBtZXRhLCBjb250cm9sbGVyLCBvcHRpb25zO1xuXG4gICAgaWYgKCFhcmNzKSB7XG4gICAgICAvLyBGaW5kIHRoZSBvdXRtb3N0IHZpc2libGUgZGF0YXNldFxuICAgICAgZm9yIChpID0gMCwgaWxlbiA9IGNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICAgIGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG4gICAgICAgICAgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgICAgIGFyY3MgPSBtZXRhLmRhdGE7XG4gICAgICAgICAgY29udHJvbGxlciA9IG1ldGEuY29udHJvbGxlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXJjcykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGFyY3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBvcHRpb25zID0gY29udHJvbGxlci5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO1xuICAgICAgaWYgKG9wdGlvbnMuYm9yZGVyQWxpZ24gIT09ICdpbm5lcicpIHtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBvcHRpb25zLmJvcmRlcldpZHRoIHx8IDAsIG9wdGlvbnMuaG92ZXJCb3JkZXJXaWR0aCB8fCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuXG4gIGdldE1heE9mZnNldChhcmNzKSB7XG4gICAgbGV0IG1heCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IGFyY3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGkpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBvcHRpb25zLm9mZnNldCB8fCAwLCBvcHRpb25zLmhvdmVyT2Zmc2V0IHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gbWF4O1xuICB9XG5cbiAgLyoqXG5cdCAqIEdldCByYWRpdXMgbGVuZ3RoIG9mZnNldCBvZiB0aGUgZGF0YXNldCBpbiByZWxhdGlvbiB0byB0aGUgdmlzaWJsZSBkYXRhc2V0cyB3ZWlnaHRzLiBUaGlzIGFsbG93cyBkZXRlcm1pbmluZyB0aGUgaW5uZXIgYW5kIG91dGVyIHJhZGl1cyBjb3JyZWN0bHlcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRSaW5nV2VpZ2h0T2Zmc2V0KGRhdGFzZXRJbmRleCkge1xuICAgIGxldCByaW5nV2VpZ2h0T2Zmc2V0ID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YXNldEluZGV4OyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcbiAgICAgICAgcmluZ1dlaWdodE9mZnNldCArPSB0aGlzLl9nZXRSaW5nV2VpZ2h0KGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByaW5nV2VpZ2h0T2Zmc2V0O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0UmluZ1dlaWdodChkYXRhc2V0SW5kZXgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgodmFsdWVPckRlZmF1bHQodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0ud2VpZ2h0LCAxKSwgMCk7XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgc3VtIG9mIGFsbCB2aXNpYmxlIGRhdGEgc2V0IHdlaWdodHMuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0UmluZ1dlaWdodE9mZnNldCh0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoKSB8fCAxO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge2lzTnVsbE9yVW5kZWZ9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHtpc051bWJlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuaW1wb3J0IHtfZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50cywgX3NjYWxlUmFuZ2VzQ2hhbmdlZH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmVDb250cm9sbGVyIGV4dGVuZHMgRGF0YXNldENvbnRyb2xsZXIge1xuXG4gIHN0YXRpYyBpZCA9ICdsaW5lJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6ICdsaW5lJyxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG5cbiAgICBzaG93TGluZTogdHJ1ZSxcbiAgICBzcGFuR2FwczogZmFsc2UsXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIHNjYWxlczoge1xuICAgICAgX2luZGV4Xzoge1xuICAgICAgICB0eXBlOiAnY2F0ZWdvcnknLFxuICAgICAgfSxcbiAgICAgIF92YWx1ZV86IHtcbiAgICAgICAgdHlwZTogJ2xpbmVhcicsXG4gICAgICB9LFxuICAgIH1cbiAgfTtcblxuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuZW5hYmxlT3B0aW9uU2hhcmluZyA9IHRydWU7XG4gICAgdGhpcy5zdXBwb3J0c0RlY2ltYXRpb24gPSB0cnVlO1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZShtb2RlKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3Qge2RhdGFzZXQ6IGxpbmUsIGRhdGE6IHBvaW50cyA9IFtdLCBfZGF0YXNldH0gPSBtZXRhO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBhbmltYXRpb25zRGlzYWJsZWQgPSB0aGlzLmNoYXJ0Ll9hbmltYXRpb25zRGlzYWJsZWQ7XG4gICAgbGV0IHtzdGFydCwgY291bnR9ID0gX2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMobWV0YSwgcG9pbnRzLCBhbmltYXRpb25zRGlzYWJsZWQpO1xuXG4gICAgdGhpcy5fZHJhd1N0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5fZHJhd0NvdW50ID0gY291bnQ7XG5cbiAgICBpZiAoX3NjYWxlUmFuZ2VzQ2hhbmdlZChtZXRhKSkge1xuICAgICAgc3RhcnQgPSAwO1xuICAgICAgY291bnQgPSBwb2ludHMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBMaW5lXG4gICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGxpbmUuX2RhdGFzZXRJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgbGluZS5fZGVjaW1hdGVkID0gISFfZGF0YXNldC5fZGVjaW1hdGVkO1xuICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zaG93TGluZSkge1xuICAgICAgb3B0aW9ucy5ib3JkZXJXaWR0aCA9IDA7XG4gICAgfVxuICAgIG9wdGlvbnMuc2VnbWVudCA9IHRoaXMub3B0aW9ucy5zZWdtZW50O1xuICAgIHRoaXMudXBkYXRlRWxlbWVudChsaW5lLCB1bmRlZmluZWQsIHtcbiAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgb3B0aW9uc1xuICAgIH0sIG1vZGUpO1xuXG4gICAgLy8gVXBkYXRlIFBvaW50c1xuICAgIHRoaXMudXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2lTY2FsZSwgdlNjYWxlLCBfc3RhY2tlZCwgX2RhdGFzZXR9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCB7c2hhcmVkT3B0aW9ucywgaW5jbHVkZU9wdGlvbnN9ID0gdGhpcy5fZ2V0U2hhcmVkT3B0aW9ucyhzdGFydCwgbW9kZSk7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB2QXhpcyA9IHZTY2FsZS5heGlzO1xuICAgIGNvbnN0IHtzcGFuR2Fwcywgc2VnbWVudH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWF4R2FwTGVuZ3RoID0gaXNOdW1iZXIoc3BhbkdhcHMpID8gc3BhbkdhcHMgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgY29uc3QgZGlyZWN0VXBkYXRlID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkIHx8IHJlc2V0IHx8IG1vZGUgPT09ICdub25lJztcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGNvdW50O1xuICAgIGNvbnN0IHBvaW50c0NvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICBsZXQgcHJldlBhcnNlZCA9IHN0YXJ0ID4gMCAmJiB0aGlzLmdldFBhcnNlZChzdGFydCAtIDEpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludHNDb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBkaXJlY3RVcGRhdGUgPyBwb2ludCA6IHt9O1xuXG4gICAgICBpZiAoaSA8IHN0YXJ0IHx8IGkgPj0gZW5kKSB7XG4gICAgICAgIHByb3BlcnRpZXMuc2tpcCA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLmdldFBhcnNlZChpKTtcbiAgICAgIGNvbnN0IG51bGxEYXRhID0gaXNOdWxsT3JVbmRlZihwYXJzZWRbdkF4aXNdKTtcbiAgICAgIGNvbnN0IGlQaXhlbCA9IHByb3BlcnRpZXNbaUF4aXNdID0gaVNjYWxlLmdldFBpeGVsRm9yVmFsdWUocGFyc2VkW2lBeGlzXSwgaSk7XG4gICAgICBjb25zdCB2UGl4ZWwgPSBwcm9wZXJ0aWVzW3ZBeGlzXSA9IHJlc2V0IHx8IG51bGxEYXRhID8gdlNjYWxlLmdldEJhc2VQaXhlbCgpIDogdlNjYWxlLmdldFBpeGVsRm9yVmFsdWUoX3N0YWNrZWQgPyB0aGlzLmFwcGx5U3RhY2sodlNjYWxlLCBwYXJzZWQsIF9zdGFja2VkKSA6IHBhcnNlZFt2QXhpc10sIGkpO1xuXG4gICAgICBwcm9wZXJ0aWVzLnNraXAgPSBpc05hTihpUGl4ZWwpIHx8IGlzTmFOKHZQaXhlbCkgfHwgbnVsbERhdGE7XG4gICAgICBwcm9wZXJ0aWVzLnN0b3AgPSBpID4gMCAmJiAoTWF0aC5hYnMocGFyc2VkW2lBeGlzXSAtIHByZXZQYXJzZWRbaUF4aXNdKSkgPiBtYXhHYXBMZW5ndGg7XG4gICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBwcm9wZXJ0aWVzLnBhcnNlZCA9IHBhcnNlZDtcbiAgICAgICAgcHJvcGVydGllcy5yYXcgPSBfZGF0YXNldC5kYXRhW2ldO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5jbHVkZU9wdGlvbnMpIHtcbiAgICAgICAgcHJvcGVydGllcy5vcHRpb25zID0gc2hhcmVkT3B0aW9ucyB8fCB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaSwgcG9pbnQuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaXJlY3RVcGRhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVFbGVtZW50KHBvaW50LCBpLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICAgIH1cblxuICAgICAgcHJldlBhcnNlZCA9IHBhcnNlZDtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgZGF0YXNldCA9IG1ldGEuZGF0YXNldDtcbiAgICBjb25zdCBib3JkZXIgPSBkYXRhc2V0Lm9wdGlvbnMgJiYgZGF0YXNldC5vcHRpb25zLmJvcmRlcldpZHRoIHx8IDA7XG4gICAgY29uc3QgZGF0YSA9IG1ldGEuZGF0YSB8fCBbXTtcbiAgICBpZiAoIWRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYm9yZGVyO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdFBvaW50ID0gZGF0YVswXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucygwKSk7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdLnNpemUodGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGRhdGEubGVuZ3RoIC0gMSkpO1xuICAgIHJldHVybiBNYXRoLm1heChib3JkZXIsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCkgLyAyO1xuICB9XG5cbiAgZHJhdygpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBtZXRhLmRhdGFzZXQudXBkYXRlQ29udHJvbFBvaW50cyh0aGlzLmNoYXJ0LmNoYXJ0QXJlYSwgbWV0YS5pU2NhbGUuYXhpcyk7XG4gICAgc3VwZXIuZHJhdygpO1xuICB9XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQge3RvUmFkaWFucywgUEksIGZvcm1hdE51bWJlciwgX3BhcnNlT2JqZWN0RGF0YVJhZGlhbFNjYWxlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9sYXJBcmVhQ29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcblxuICBzdGF0aWMgaWQgPSAncG9sYXJBcmVhJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdhcmMnLFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgYW5pbWF0ZVJvdGF0ZTogdHJ1ZSxcbiAgICAgIGFuaW1hdGVTY2FsZTogdHJ1ZVxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgbnVtYmVyczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgcHJvcGVydGllczogWyd4JywgJ3knLCAnc3RhcnRBbmdsZScsICdlbmRBbmdsZScsICdpbm5lclJhZGl1cycsICdvdXRlclJhZGl1cyddXG4gICAgICB9LFxuICAgIH0sXG4gICAgaW5kZXhBeGlzOiAncicsXG4gICAgc3RhcnRBbmdsZTogMCxcbiAgfTtcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZXMgPSB7XG4gICAgYXNwZWN0UmF0aW86IDEsXG5cbiAgICBwbHVnaW5zOiB7XG4gICAgICBsZWdlbmQ6IHtcbiAgICAgICAgbGFiZWxzOiB7XG4gICAgICAgICAgZ2VuZXJhdGVMYWJlbHMoY2hhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBjaGFydC5kYXRhO1xuICAgICAgICAgICAgaWYgKGRhdGEubGFiZWxzLmxlbmd0aCAmJiBkYXRhLmRhdGFzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB7bGFiZWxzOiB7cG9pbnRTdHlsZSwgY29sb3J9fSA9IGNoYXJ0LmxlZ2VuZC5vcHRpb25zO1xuXG4gICAgICAgICAgICAgIHJldHVybiBkYXRhLmxhYmVscy5tYXAoKGxhYmVsLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKGkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6IGxhYmVsLFxuICAgICAgICAgICAgICAgICAgZmlsbFN0eWxlOiBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICAgICAgICBzdHJva2VTdHlsZTogc3R5bGUuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgICBmb250Q29sb3I6IGNvbG9yLFxuICAgICAgICAgICAgICAgICAgbGluZVdpZHRoOiBzdHlsZS5ib3JkZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgIHBvaW50U3R5bGU6IHBvaW50U3R5bGUsXG4gICAgICAgICAgICAgICAgICBoaWRkZW46ICFjaGFydC5nZXREYXRhVmlzaWJpbGl0eShpKSxcblxuICAgICAgICAgICAgICAgICAgLy8gRXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgY29ycmVjdCBpdGVtXG4gICAgICAgICAgICAgICAgICBpbmRleDogaVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkNsaWNrKGUsIGxlZ2VuZEl0ZW0sIGxlZ2VuZCkge1xuICAgICAgICAgIGxlZ2VuZC5jaGFydC50b2dnbGVEYXRhVmlzaWJpbGl0eShsZWdlbmRJdGVtLmluZGV4KTtcbiAgICAgICAgICBsZWdlbmQuY2hhcnQudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2NhbGVzOiB7XG4gICAgICByOiB7XG4gICAgICAgIHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuICAgICAgICBhbmdsZUxpbmVzOiB7XG4gICAgICAgICAgZGlzcGxheTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYmVnaW5BdFplcm86IHRydWUsXG4gICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICBjaXJjdWxhcjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBwb2ludExhYmVsczoge1xuICAgICAgICAgIGRpc3BsYXk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXJ0QW5nbGU6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3RydWN0b3IoY2hhcnQsIGRhdGFzZXRJbmRleCkge1xuICAgIHN1cGVyKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xuXG4gICAgdGhpcy5pbm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm91dGVyUmFkaXVzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCBsYWJlbHMgPSBjaGFydC5kYXRhLmxhYmVscyB8fCBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IGZvcm1hdE51bWJlcihtZXRhLl9wYXJzZWRbaW5kZXhdLnIsIGNoYXJ0Lm9wdGlvbnMubG9jYWxlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgIHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBwYXJzZU9iamVjdERhdGEobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KSB7XG4gICAgcmV0dXJuIF9wYXJzZU9iamVjdERhdGFSYWRpYWxTY2FsZS5iaW5kKHRoaXMpKG1ldGEsIGRhdGEsIHN0YXJ0LCBjb3VudCk7XG4gIH1cblxuICB1cGRhdGUobW9kZSkge1xuICAgIGNvbnN0IGFyY3MgPSB0aGlzLl9jYWNoZWRNZXRhLmRhdGE7XG5cbiAgICB0aGlzLl91cGRhdGVSYWRpdXMoKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRzKGFyY3MsIDAsIGFyY3MubGVuZ3RoLCBtb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBnZXRNaW5NYXgoKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgcmFuZ2UgPSB7bWluOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1heDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZfTtcblxuICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpLnI7XG5cbiAgICAgIGlmICghaXNOYU4ocGFyc2VkKSAmJiB0aGlzLmNoYXJ0LmdldERhdGFWaXNpYmlsaXR5KGluZGV4KSkge1xuICAgICAgICBpZiAocGFyc2VkIDwgcmFuZ2UubWluKSB7XG4gICAgICAgICAgcmFuZ2UubWluID0gcGFyc2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlZCA+IHJhbmdlLm1heCkge1xuICAgICAgICAgIHJhbmdlLm1heCA9IHBhcnNlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJhbmdlO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlUmFkaXVzKCkge1xuICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy5jaGFydDtcbiAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG4gICAgY29uc3Qgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XG4gICAgY29uc3QgbWluU2l6ZSA9IE1hdGgubWluKGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCk7XG5cbiAgICBjb25zdCBvdXRlclJhZGl1cyA9IE1hdGgubWF4KG1pblNpemUgLyAyLCAwKTtcbiAgICBjb25zdCBpbm5lclJhZGl1cyA9IE1hdGgubWF4KG9wdHMuY3V0b3V0UGVyY2VudGFnZSA/IChvdXRlclJhZGl1cyAvIDEwMCkgKiAob3B0cy5jdXRvdXRQZXJjZW50YWdlKSA6IDEsIDApO1xuICAgIGNvbnN0IHJhZGl1c0xlbmd0aCA9IChvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzKSAvIGNoYXJ0LmdldFZpc2libGVEYXRhc2V0Q291bnQoKTtcblxuICAgIHRoaXMub3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyAtIChyYWRpdXNMZW5ndGggKiB0aGlzLmluZGV4KTtcbiAgICB0aGlzLmlubmVyUmFkaXVzID0gdGhpcy5vdXRlclJhZGl1cyAtIHJhZGl1c0xlbmd0aDtcbiAgfVxuXG4gIHVwZGF0ZUVsZW1lbnRzKGFyY3MsIHN0YXJ0LCBjb3VudCwgbW9kZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3Qgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XG4gICAgY29uc3QgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fY2FjaGVkTWV0YS5yU2NhbGU7XG4gICAgY29uc3QgY2VudGVyWCA9IHNjYWxlLnhDZW50ZXI7XG4gICAgY29uc3QgY2VudGVyWSA9IHNjYWxlLnlDZW50ZXI7XG4gICAgY29uc3QgZGF0YXNldFN0YXJ0QW5nbGUgPSBzY2FsZS5nZXRJbmRleEFuZ2xlKDApIC0gMC41ICogUEk7XG4gICAgbGV0IGFuZ2xlID0gZGF0YXNldFN0YXJ0QW5nbGU7XG4gICAgbGV0IGk7XG5cbiAgICBjb25zdCBkZWZhdWx0QW5nbGUgPSAzNjAgLyB0aGlzLmNvdW50VmlzaWJsZUVsZW1lbnRzKCk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RhcnQ7ICsraSkge1xuICAgICAgYW5nbGUgKz0gdGhpcy5fY29tcHV0ZUFuZ2xlKGksIG1vZGUsIGRlZmF1bHRBbmdsZSk7XG4gICAgfVxuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmMgPSBhcmNzW2ldO1xuICAgICAgbGV0IHN0YXJ0QW5nbGUgPSBhbmdsZTtcbiAgICAgIGxldCBlbmRBbmdsZSA9IGFuZ2xlICsgdGhpcy5fY29tcHV0ZUFuZ2xlKGksIG1vZGUsIGRlZmF1bHRBbmdsZSk7XG4gICAgICBsZXQgb3V0ZXJSYWRpdXMgPSBjaGFydC5nZXREYXRhVmlzaWJpbGl0eShpKSA/IHNjYWxlLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHRoaXMuZ2V0UGFyc2VkKGkpLnIpIDogMDtcbiAgICAgIGFuZ2xlID0gZW5kQW5nbGU7XG5cbiAgICAgIGlmIChyZXNldCkge1xuICAgICAgICBpZiAoYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUpIHtcbiAgICAgICAgICBvdXRlclJhZGl1cyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVJvdGF0ZSkge1xuICAgICAgICAgIHN0YXJ0QW5nbGUgPSBlbmRBbmdsZSA9IGRhdGFzZXRTdGFydEFuZ2xlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7XG4gICAgICAgIHg6IGNlbnRlclgsXG4gICAgICAgIHk6IGNlbnRlclksXG4gICAgICAgIGlubmVyUmFkaXVzOiAwLFxuICAgICAgICBvdXRlclJhZGl1cyxcbiAgICAgICAgc3RhcnRBbmdsZSxcbiAgICAgICAgZW5kQW5nbGUsXG4gICAgICAgIG9wdGlvbnM6IHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpLCBhcmMuYWN0aXZlID8gJ2FjdGl2ZScgOiBtb2RlKVxuICAgICAgfTtcblxuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KGFyYywgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgfVxuICB9XG5cbiAgY291bnRWaXNpYmxlRWxlbWVudHMoKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgbGV0IGNvdW50ID0gMDtcblxuICAgIG1ldGEuZGF0YS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFpc05hTih0aGlzLmdldFBhcnNlZChpbmRleCkucikgJiYgdGhpcy5jaGFydC5nZXREYXRhVmlzaWJpbGl0eShpbmRleCkpIHtcbiAgICAgICAgY291bnQrKztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbXB1dGVBbmdsZShpbmRleCwgbW9kZSwgZGVmYXVsdEFuZ2xlKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaW5kZXgpXG4gICAgICA/IHRvUmFkaWFucyh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoaW5kZXgsIG1vZGUpLmFuZ2xlIHx8IGRlZmF1bHRBbmdsZSlcbiAgICAgIDogMDtcbiAgfVxufVxuIiwgImltcG9ydCBEb3VnaG51dENvbnRyb2xsZXIgZnJvbSAnLi9jb250cm9sbGVyLmRvdWdobnV0LmpzJztcblxuLy8gUGllIGNoYXJ0cyBhcmUgRG91Z2hudXQgY2hhcnQgd2l0aCBkaWZmZXJlbnQgZGVmYXVsdHNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpZUNvbnRyb2xsZXIgZXh0ZW5kcyBEb3VnaG51dENvbnRyb2xsZXIge1xuXG4gIHN0YXRpYyBpZCA9ICdwaWUnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBjaGFydCB0aGF0IHdlIGN1dCBvdXQgb2YgdGhlIG1pZGRsZS5cbiAgICBjdXRvdXQ6IDAsXG5cbiAgICAvLyBUaGUgcm90YXRpb24gb2YgdGhlIGNoYXJ0LCB3aGVyZSB0aGUgZmlyc3QgZGF0YSBhcmMgYmVnaW5zLlxuICAgIHJvdGF0aW9uOiAwLFxuXG4gICAgLy8gVGhlIHRvdGFsIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIGNoYXJ0LlxuICAgIGNpcmN1bWZlcmVuY2U6IDM2MCxcblxuICAgIC8vIFRoZSBvdXRyIHJhZGl1cyBvZiB0aGUgY2hhcnRcbiAgICByYWRpdXM6ICcxMDAlJ1xuICB9O1xufVxuIiwgImltcG9ydCBEYXRhc2V0Q29udHJvbGxlciBmcm9tICcuLi9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHtfcGFyc2VPYmplY3REYXRhUmFkaWFsU2NhbGV9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRhckNvbnRyb2xsZXIgZXh0ZW5kcyBEYXRhc2V0Q29udHJvbGxlciB7XG5cbiAgc3RhdGljIGlkID0gJ3JhZGFyJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBkYXRhc2V0RWxlbWVudFR5cGU6ICdsaW5lJyxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgaW5kZXhBeGlzOiAncicsXG4gICAgc2hvd0xpbmU6IHRydWUsXG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGxpbmU6IHtcbiAgICAgICAgZmlsbDogJ3N0YXJ0J1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuICAgIGFzcGVjdFJhdGlvOiAxLFxuXG4gICAgc2NhbGVzOiB7XG4gICAgICByOiB7XG4gICAgICAgIHR5cGU6ICdyYWRpYWxMaW5lYXInLFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IHZTY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEudlNjYWxlO1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGluZGV4KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogdlNjYWxlLmdldExhYmVscygpW2luZGV4XSxcbiAgICAgIHZhbHVlOiAnJyArIHZTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZFt2U2NhbGUuYXhpc10pXG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlT2JqZWN0RGF0YShtZXRhLCBkYXRhLCBzdGFydCwgY291bnQpIHtcbiAgICByZXR1cm4gX3BhcnNlT2JqZWN0RGF0YVJhZGlhbFNjYWxlLmJpbmQodGhpcykobWV0YSwgZGF0YSwgc3RhcnQsIGNvdW50KTtcbiAgfVxuXG4gIHVwZGF0ZShtb2RlKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgbGluZSA9IG1ldGEuZGF0YXNldDtcbiAgICBjb25zdCBwb2ludHMgPSBtZXRhLmRhdGEgfHwgW107XG4gICAgY29uc3QgbGFiZWxzID0gbWV0YS5pU2NhbGUuZ2V0TGFiZWxzKCk7XG5cbiAgICAvLyBVcGRhdGUgTGluZVxuICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuICAgIC8vIEluIHJlc2l6ZSBtb2RlIG9ubHkgcG9pbnQgbG9jYXRpb25zIGNoYW5nZSwgc28gbm8gbmVlZCB0byBzZXQgdGhlIHBvaW50cyBvciBvcHRpb25zLlxuICAgIGlmIChtb2RlICE9PSAncmVzaXplJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucmVzb2x2ZURhdGFzZXRFbGVtZW50T3B0aW9ucyhtb2RlKTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICAgIG9wdGlvbnMuYm9yZGVyV2lkdGggPSAwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICBfbG9vcDogdHJ1ZSxcbiAgICAgICAgX2Z1bGxMb29wOiBsYWJlbHMubGVuZ3RoID09PSBwb2ludHMubGVuZ3RoLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQobGluZSwgdW5kZWZpbmVkLCBwcm9wZXJ0aWVzLCBtb2RlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgUG9pbnRzXG4gICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIDAsIHBvaW50cy5sZW5ndGgsIG1vZGUpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuX2NhY2hlZE1ldGEuclNjYWxlO1xuICAgIGNvbnN0IHJlc2V0ID0gbW9kZSA9PT0gJ3Jlc2V0JztcblxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICBjb25zdCBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGksIHRoaXMuZ2V0UGFyc2VkKGkpLnIpO1xuXG4gICAgICBjb25zdCB4ID0gcmVzZXQgPyBzY2FsZS54Q2VudGVyIDogcG9pbnRQb3NpdGlvbi54O1xuICAgICAgY29uc3QgeSA9IHJlc2V0ID8gc2NhbGUueUNlbnRlciA6IHBvaW50UG9zaXRpb24ueTtcblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgYW5nbGU6IHBvaW50UG9zaXRpb24uYW5nbGUsXG4gICAgICAgIHNraXA6IGlzTmFOKHgpIHx8IGlzTmFOKHkpLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQocG9pbnQsIGksIHByb3BlcnRpZXMsIG1vZGUpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCBEYXRhc2V0Q29udHJvbGxlciBmcm9tICcuLi9jb3JlL2NvcmUuZGF0YXNldENvbnRyb2xsZXIuanMnO1xuaW1wb3J0IHtpc051bGxPclVuZGVmfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7X2dldFN0YXJ0QW5kQ291bnRPZlZpc2libGVQb2ludHMsIF9zY2FsZVJhbmdlc0NoYW5nZWR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5leHRyYXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2F0dGVyQ29udHJvbGxlciBleHRlbmRzIERhdGFzZXRDb250cm9sbGVyIHtcblxuICBzdGF0aWMgaWQgPSAnc2NhdHRlcic7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGF0YXNldEVsZW1lbnRUeXBlOiBmYWxzZSxcbiAgICBkYXRhRWxlbWVudFR5cGU6ICdwb2ludCcsXG4gICAgc2hvd0xpbmU6IGZhbHNlLFxuICAgIGZpbGw6IGZhbHNlXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgb3ZlcnJpZGVzID0ge1xuXG4gICAgaW50ZXJhY3Rpb246IHtcbiAgICAgIG1vZGU6ICdwb2ludCdcbiAgICB9LFxuXG4gICAgc2NhbGVzOiB7XG4gICAgICB4OiB7XG4gICAgICAgIHR5cGU6ICdsaW5lYXInXG4gICAgICB9LFxuICAgICAgeToge1xuICAgICAgICB0eXBlOiAnbGluZWFyJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TGFiZWxBbmRWYWx1ZShpbmRleCkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9jYWNoZWRNZXRhO1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuY2hhcnQuZGF0YS5sYWJlbHMgfHwgW107XG4gICAgY29uc3Qge3hTY2FsZSwgeVNjYWxlfSA9IG1ldGE7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5nZXRQYXJzZWQoaW5kZXgpO1xuICAgIGNvbnN0IHggPSB4U2NhbGUuZ2V0TGFiZWxGb3JWYWx1ZShwYXJzZWQueCk7XG4gICAgY29uc3QgeSA9IHlTY2FsZS5nZXRMYWJlbEZvclZhbHVlKHBhcnNlZC55KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogbGFiZWxzW2luZGV4XSB8fCAnJyxcbiAgICAgIHZhbHVlOiAnKCcgKyB4ICsgJywgJyArIHkgKyAnKSdcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCB7ZGF0YTogcG9pbnRzID0gW119ID0gbWV0YTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgYW5pbWF0aW9uc0Rpc2FibGVkID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkO1xuICAgIGxldCB7c3RhcnQsIGNvdW50fSA9IF9nZXRTdGFydEFuZENvdW50T2ZWaXNpYmxlUG9pbnRzKG1ldGEsIHBvaW50cywgYW5pbWF0aW9uc0Rpc2FibGVkKTtcblxuICAgIHRoaXMuX2RyYXdTdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX2RyYXdDb3VudCA9IGNvdW50O1xuXG4gICAgaWYgKF9zY2FsZVJhbmdlc0NoYW5nZWQobWV0YSkpIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIGNvdW50ID0gcG9pbnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG5cbiAgICAgIGNvbnN0IHtkYXRhc2V0OiBsaW5lLCBfZGF0YXNldH0gPSBtZXRhO1xuXG4gICAgICAvLyBVcGRhdGUgTGluZVxuICAgICAgbGluZS5fY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgICAgbGluZS5fZGF0YXNldEluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIGxpbmUuX2RlY2ltYXRlZCA9ICEhX2RhdGFzZXQuX2RlY2ltYXRlZDtcbiAgICAgIGxpbmUucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5yZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zKG1vZGUpO1xuICAgICAgb3B0aW9ucy5zZWdtZW50ID0gdGhpcy5vcHRpb25zLnNlZ21lbnQ7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQobGluZSwgdW5kZWZpbmVkLCB7XG4gICAgICAgIGFuaW1hdGVkOiAhYW5pbWF0aW9uc0Rpc2FibGVkLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9LCBtb2RlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgUG9pbnRzXG4gICAgdGhpcy51cGRhdGVFbGVtZW50cyhwb2ludHMsIHN0YXJ0LCBjb3VudCwgbW9kZSk7XG4gIH1cblxuICBhZGRFbGVtZW50cygpIHtcbiAgICBjb25zdCB7c2hvd0xpbmV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKCF0aGlzLmRhdGFzZXRFbGVtZW50VHlwZSAmJiBzaG93TGluZSkge1xuICAgICAgdGhpcy5kYXRhc2V0RWxlbWVudFR5cGUgPSB0aGlzLmNoYXJ0LnJlZ2lzdHJ5LmdldEVsZW1lbnQoJ2xpbmUnKTtcbiAgICB9XG5cbiAgICBzdXBlci5hZGRFbGVtZW50cygpO1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudHMocG9pbnRzLCBzdGFydCwgY291bnQsIG1vZGUpIHtcbiAgICBjb25zdCByZXNldCA9IG1vZGUgPT09ICdyZXNldCc7XG4gICAgY29uc3Qge2lTY2FsZSwgdlNjYWxlLCBfc3RhY2tlZCwgX2RhdGFzZXR9ID0gdGhpcy5fY2FjaGVkTWV0YTtcbiAgICBjb25zdCBmaXJzdE9wdHMgPSB0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoc3RhcnQsIG1vZGUpO1xuICAgIGNvbnN0IHNoYXJlZE9wdGlvbnMgPSB0aGlzLmdldFNoYXJlZE9wdGlvbnMoZmlyc3RPcHRzKTtcbiAgICBjb25zdCBpbmNsdWRlT3B0aW9ucyA9IHRoaXMuaW5jbHVkZU9wdGlvbnMobW9kZSwgc2hhcmVkT3B0aW9ucyk7XG4gICAgY29uc3QgaUF4aXMgPSBpU2NhbGUuYXhpcztcbiAgICBjb25zdCB2QXhpcyA9IHZTY2FsZS5heGlzO1xuICAgIGNvbnN0IHtzcGFuR2Fwcywgc2VnbWVudH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgbWF4R2FwTGVuZ3RoID0gaXNOdW1iZXIoc3BhbkdhcHMpID8gc3BhbkdhcHMgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgY29uc3QgZGlyZWN0VXBkYXRlID0gdGhpcy5jaGFydC5fYW5pbWF0aW9uc0Rpc2FibGVkIHx8IHJlc2V0IHx8IG1vZGUgPT09ICdub25lJztcbiAgICBsZXQgcHJldlBhcnNlZCA9IHN0YXJ0ID4gMCAmJiB0aGlzLmdldFBhcnNlZChzdGFydCAtIDEpO1xuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7XG4gICAgICBjb25zdCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuZ2V0UGFyc2VkKGkpO1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IGRpcmVjdFVwZGF0ZSA/IHBvaW50IDoge307XG4gICAgICBjb25zdCBudWxsRGF0YSA9IGlzTnVsbE9yVW5kZWYocGFyc2VkW3ZBeGlzXSk7XG4gICAgICBjb25zdCBpUGl4ZWwgPSBwcm9wZXJ0aWVzW2lBeGlzXSA9IGlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHBhcnNlZFtpQXhpc10sIGkpO1xuICAgICAgY29uc3QgdlBpeGVsID0gcHJvcGVydGllc1t2QXhpc10gPSByZXNldCB8fCBudWxsRGF0YSA/IHZTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHZTY2FsZS5nZXRQaXhlbEZvclZhbHVlKF9zdGFja2VkID8gdGhpcy5hcHBseVN0YWNrKHZTY2FsZSwgcGFyc2VkLCBfc3RhY2tlZCkgOiBwYXJzZWRbdkF4aXNdLCBpKTtcblxuICAgICAgcHJvcGVydGllcy5za2lwID0gaXNOYU4oaVBpeGVsKSB8fCBpc05hTih2UGl4ZWwpIHx8IG51bGxEYXRhO1xuICAgICAgcHJvcGVydGllcy5zdG9wID0gaSA+IDAgJiYgKE1hdGguYWJzKHBhcnNlZFtpQXhpc10gLSBwcmV2UGFyc2VkW2lBeGlzXSkpID4gbWF4R2FwTGVuZ3RoO1xuICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgcHJvcGVydGllcy5wYXJzZWQgPSBwYXJzZWQ7XG4gICAgICAgIHByb3BlcnRpZXMucmF3ID0gX2RhdGFzZXQuZGF0YVtpXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluY2x1ZGVPcHRpb25zKSB7XG4gICAgICAgIHByb3BlcnRpZXMub3B0aW9ucyA9IHNoYXJlZE9wdGlvbnMgfHwgdGhpcy5yZXNvbHZlRGF0YUVsZW1lbnRPcHRpb25zKGksIHBvaW50LmFjdGl2ZSA/ICdhY3RpdmUnIDogbW9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZGlyZWN0VXBkYXRlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudChwb2ludCwgaSwgcHJvcGVydGllcywgbW9kZSk7XG4gICAgICB9XG5cbiAgICAgIHByZXZQYXJzZWQgPSBwYXJzZWQ7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTaGFyZWRPcHRpb25zKHNoYXJlZE9wdGlvbnMsIG1vZGUsIGZpcnN0T3B0cyk7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgZ2V0TWF4T3ZlcmZsb3coKSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuX2NhY2hlZE1ldGE7XG4gICAgY29uc3QgZGF0YSA9IG1ldGEuZGF0YSB8fCBbXTtcblxuICAgIGlmICghdGhpcy5vcHRpb25zLnNob3dMaW5lKSB7XG4gICAgICBsZXQgbWF4ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSBkYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgZGF0YVtpXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhpKSkgLyAyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXggPiAwICYmIG1heDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gbWV0YS5kYXRhc2V0O1xuICAgIGNvbnN0IGJvcmRlciA9IGRhdGFzZXQub3B0aW9ucyAmJiBkYXRhc2V0Lm9wdGlvbnMuYm9yZGVyV2lkdGggfHwgMDtcblxuICAgIGlmICghZGF0YS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBib3JkZXI7XG4gICAgfVxuXG4gICAgY29uc3QgZmlyc3RQb2ludCA9IGRhdGFbMF0uc2l6ZSh0aGlzLnJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMoMCkpO1xuICAgIGNvbnN0IGxhc3RQb2ludCA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXS5zaXplKHRoaXMucmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyhkYXRhLmxlbmd0aCAtIDEpKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoYm9yZGVyLCBmaXJzdFBvaW50LCBsYXN0UG9pbnQpIC8gMjtcbiAgfVxufVxuIiwgIi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5fYWRhcHRlcnNcbiAqIEBzaW5jZSAyLjguMFxuICogQHByaXZhdGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7QW55T2JqZWN0fSBmcm9tICcuLi90eXBlcy9iYXNpYy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhcnRPcHRpb25zfSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB0eXBlIFRpbWVVbml0ID0gJ21pbGxpc2Vjb25kJyB8ICdzZWNvbmQnIHwgJ21pbnV0ZScgfCAnaG91cicgfCAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCcgfCAncXVhcnRlcicgfCAneWVhcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZUFkYXB0ZXI8VCBleHRlbmRzIEFueU9iamVjdCA9IEFueU9iamVjdD4ge1xuICByZWFkb25seSBvcHRpb25zOiBUO1xuICAvKipcbiAgICogV2lsbCBjYWxsZWQgd2l0aCBjaGFydCBvcHRpb25zIGFmdGVyIGFkYXB0ZXIgY3JlYXRpb24uXG4gICAqL1xuICBpbml0KHRoaXM6IERhdGVBZGFwdGVyPFQ+LCBjaGFydE9wdGlvbnM6IENoYXJ0T3B0aW9ucyk6IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbWFwIG9mIHRpbWUgZm9ybWF0cyBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXR0aW5nIHVuaXRzIGRlZmluZWRcbiAgICogaW4gVW5pdCBhcyB3ZWxsIGFzICdkYXRldGltZScgcmVwcmVzZW50aW5nIGEgZGV0YWlsZWQgZGF0ZS90aW1lIHN0cmluZy5cbiAgICovXG4gIGZvcm1hdHModGhpczogRGF0ZUFkYXB0ZXI8VD4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogUGFyc2VzIHRoZSBnaXZlbiBgdmFsdWVgIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gcGFyc2UgKHVzdWFsbHkgY29tZXMgZnJvbSB0aGUgZGF0YSlcbiAgICogQHBhcmFtIFtmb3JtYXRdIC0gdGhlIGV4cGVjdGVkIGRhdGEgZm9ybWF0XG4gICAqL1xuICBwYXJzZSh0aGlzOiBEYXRlQWRhcHRlcjxUPiwgdmFsdWU6IHVua25vd24sIGZvcm1hdD86IFRpbWVVbml0KTogbnVtYmVyIHwgbnVsbDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBkYXRlIGluIHRoZSBzcGVjaWZpZWQgYGZvcm1hdGAgZm9yIGEgZ2l2ZW4gYHRpbWVzdGFtcGAuXG4gICAqIEBwYXJhbSB0aW1lc3RhbXAgLSB0aGUgdGltZXN0YW1wIHRvIGZvcm1hdFxuICAgKiBAcGFyYW0gZm9ybWF0IC0gdGhlIGRhdGUvdGltZSB0b2tlblxuICAgKi9cbiAgZm9ybWF0KHRoaXM6IERhdGVBZGFwdGVyPFQ+LCB0aW1lc3RhbXA6IG51bWJlciwgZm9ybWF0OiBUaW1lVW5pdCk6IHN0cmluZztcbiAgLyoqXG4gICAqIEFkZHMgdGhlIHNwZWNpZmllZCBgYW1vdW50YCBvZiBgdW5pdGAgdG8gdGhlIGdpdmVuIGB0aW1lc3RhbXBgLlxuICAgKiBAcGFyYW0gdGltZXN0YW1wIC0gdGhlIGlucHV0IHRpbWVzdGFtcFxuICAgKiBAcGFyYW0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBhZGRcbiAgICogQHBhcmFtIHVuaXQgLSB0aGUgdW5pdCBhcyBzdHJpbmdcbiAgICovXG4gIGFkZCh0aGlzOiBEYXRlQWRhcHRlcjxUPiwgdGltZXN0YW1wOiBudW1iZXIsIGFtb3VudDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCk6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBgdW5pdGAgYmV0d2VlbiB0aGUgZ2l2ZW4gdGltZXN0YW1wcy5cbiAgICogQHBhcmFtIGEgLSB0aGUgaW5wdXQgdGltZXN0YW1wIChyZWZlcmVuY2UpXG4gICAqIEBwYXJhbSBiIC0gdGhlIHRpbWVzdGFtcCB0byBzdWJ0cmFjdFxuICAgKiBAcGFyYW0gdW5pdCAtIHRoZSB1bml0IGFzIHN0cmluZ1xuICAgKi9cbiAgZGlmZih0aGlzOiBEYXRlQWRhcHRlcjxUPiwgYTogbnVtYmVyLCBiOiBudW1iZXIsIHVuaXQ6IFRpbWVVbml0KTogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJucyBzdGFydCBvZiBgdW5pdGAgZm9yIHRoZSBnaXZlbiBgdGltZXN0YW1wYC5cbiAgICogQHBhcmFtIHRpbWVzdGFtcCAtIHRoZSBpbnB1dCB0aW1lc3RhbXBcbiAgICogQHBhcmFtIHVuaXQgLSB0aGUgdW5pdCBhcyBzdHJpbmdcbiAgICogQHBhcmFtIFt3ZWVrZGF5XSAtIHRoZSBJU08gZGF5IG9mIHRoZSB3ZWVrIHdpdGggMSBiZWluZyBNb25kYXlcbiAgICogYW5kIDcgYmVpbmcgU3VuZGF5IChvbmx5IG5lZWRlZCBpZiBwYXJhbSAqdW5pdCogaXMgYGlzb1dlZWtgKS5cbiAgICovXG4gIHN0YXJ0T2YodGhpczogRGF0ZUFkYXB0ZXI8VD4sIHRpbWVzdGFtcDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCB8ICdpc29XZWVrJywgd2Vla2RheT86IG51bWJlcik6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybnMgZW5kIG9mIGB1bml0YCBmb3IgdGhlIGdpdmVuIGB0aW1lc3RhbXBgLlxuICAgKiBAcGFyYW0gdGltZXN0YW1wIC0gdGhlIGlucHV0IHRpbWVzdGFtcFxuICAgKiBAcGFyYW0gdW5pdCAtIHRoZSB1bml0IGFzIHN0cmluZ1xuICAgKi9cbiAgZW5kT2YodGhpczogRGF0ZUFkYXB0ZXI8VD4sIHRpbWVzdGFtcDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCB8ICdpc29XZWVrJyk6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gYWJzdHJhY3Q8VCA9IHZvaWQ+KCk6IFQge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZDogQ2hlY2sgdGhhdCBhIGNvbXBsZXRlIGRhdGUgYWRhcHRlciBpcyBwcm92aWRlZC4nKTtcbn1cblxuLyoqXG4gKiBEYXRlIGFkYXB0ZXIgKGN1cnJlbnQgdXNlZCBieSB0aGUgdGltZSBzY2FsZSlcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuX2FkYXB0ZXJzLl9kYXRlXG4gKiBAbWVtYmVyb2YgQ2hhcnQuX2FkYXB0ZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBEYXRlQWRhcHRlckJhc2UgaW1wbGVtZW50cyBEYXRlQWRhcHRlciB7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgZGF0ZSBhZGFwdGVyIG1ldGhvZHMuXG4gICAqIEFjY2VwdHMgdHlwZSBwYXJhbWV0ZXIgdG8gZGVmaW5lIG9wdGlvbnMgdHlwZS5cbiAgICogQGV4YW1wbGVcbiAgICogQ2hhcnQuX2FkYXB0ZXJzLl9kYXRlLm92ZXJyaWRlPHtteUFkYXB0ZXJPcHRpb246IHN0cmluZ30+KHtcbiAgICogICBpbml0KCkge1xuICAgKiAgICAgY29uc29sZS5sb2codGhpcy5vcHRpb25zLm15QWRhcHRlck9wdGlvbik7XG4gICAqICAgfVxuICAgKiB9KVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlPFQgZXh0ZW5kcyBBbnlPYmplY3QgPSBBbnlPYmplY3Q+KFxuICAgIG1lbWJlcnM6IFBhcnRpYWw8T21pdDxEYXRlQWRhcHRlcjxUPiwgJ29wdGlvbnMnPj5cbiAgKSB7XG4gICAgT2JqZWN0LmFzc2lnbihEYXRlQWRhcHRlckJhc2UucHJvdG90eXBlLCBtZW1iZXJzKTtcbiAgfVxuXG4gIHJlYWRvbmx5IG9wdGlvbnM6IEFueU9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBBbnlPYmplY3QpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBpbml0KCkge31cblxuICBmb3JtYXRzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgcGFyc2UoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIGFic3RyYWN0KCk7XG4gIH1cblxuICBmb3JtYXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgfVxuXG4gIGFkZCgpOiBudW1iZXIge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgZGlmZigpOiBudW1iZXIge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgc3RhcnRPZigpOiBudW1iZXIge1xuICAgIHJldHVybiBhYnN0cmFjdCgpO1xuICB9XG5cbiAgZW5kT2YoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYWJzdHJhY3QoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9kYXRlOiBEYXRlQWRhcHRlckJhc2Vcbn07XG4iLCAiaW1wb3J0IHtfbG9va3VwQnlLZXksIF9ybG9va3VwQnlLZXl9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7Z2V0UmVsYXRpdmVQb3NpdGlvbn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmRvbS5qcyc7XG5pbXBvcnQge19hbmdsZUJldHdlZW4sIGdldEFuZ2xlRnJvbVBvaW50fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5pbXBvcnQge19pc1BvaW50SW5BcmVhfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLkNoYXJ0RXZlbnQgfSBDaGFydEV2ZW50XG4gKiBAdHlwZWRlZiB7e2F4aXM/OiBzdHJpbmcsIGludGVyc2VjdD86IGJvb2xlYW4sIGluY2x1ZGVJbnZpc2libGU/OiBib29sZWFufX0gSW50ZXJhY3Rpb25PcHRpb25zXG4gKiBAdHlwZWRlZiB7e2RhdGFzZXRJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyLCBlbGVtZW50OiBpbXBvcnQoJy4vY29yZS5lbGVtZW50LmpzJykuZGVmYXVsdH19IEludGVyYWN0aW9uSXRlbVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL3R5cGVzL2luZGV4LmpzJykuUG9pbnQgfSBQb2ludFxuICovXG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRvIGJpbmFyeSBzZWFyY2ggd2hlbiBwb3NzaWJsZVxuICogQHBhcmFtIHtvYmplY3R9IG1ldGFzZXQgLSB0aGUgZGF0YXNldCBtZXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGlzIG1vZGUuIHh8eXx4eXxyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSB0aGUgdmFsdWUgdG8gZmluZFxuICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJzZWN0XSAtIHNob3VsZCB0aGUgZWxlbWVudCBpbnRlcnNlY3RcbiAqIEByZXR1cm5zIHt7bG86bnVtYmVyLCBoaTpudW1iZXJ9fSBpbmRpY2VzIHRvIHNlYXJjaCBkYXRhIGFycmF5IGJldHdlZW5cbiAqL1xuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKG1ldGFzZXQsIGF4aXMsIHZhbHVlLCBpbnRlcnNlY3QpIHtcbiAgY29uc3Qge2NvbnRyb2xsZXIsIGRhdGEsIF9zb3J0ZWR9ID0gbWV0YXNldDtcbiAgY29uc3QgaVNjYWxlID0gY29udHJvbGxlci5fY2FjaGVkTWV0YS5pU2NhbGU7XG4gIGlmIChpU2NhbGUgJiYgYXhpcyA9PT0gaVNjYWxlLmF4aXMgJiYgYXhpcyAhPT0gJ3InICYmIF9zb3J0ZWQgJiYgZGF0YS5sZW5ndGgpIHtcbiAgICBjb25zdCBsb29rdXBNZXRob2QgPSBpU2NhbGUuX3JldmVyc2VQaXhlbHMgPyBfcmxvb2t1cEJ5S2V5IDogX2xvb2t1cEJ5S2V5O1xuICAgIGlmICghaW50ZXJzZWN0KSB7XG4gICAgICByZXR1cm4gbG9va3VwTWV0aG9kKGRhdGEsIGF4aXMsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIuX3NoYXJlZE9wdGlvbnMpIHtcbiAgICAgIC8vIF9zaGFyZWRPcHRpb25zIGluZGljYXRlcyB0aGF0IGVhY2ggZWxlbWVudCBoYXMgZXF1YWwgb3B0aW9ucyAtPiBlcXVhbCBwcm9wb3J0aW9uc1xuICAgICAgLy8gU28gd2UgY2FuIGRvIGEgcmFuZ2VkIGJpbmFyeSBzZWFyY2ggYmFzZWQgb24gdGhlIHJhbmdlIG9mIGZpcnN0IGVsZW1lbnQgYW5kXG4gICAgICAvLyBiZSBjb25maWRlbnQgdG8gZ2V0IHRoZSBmdWxsIHJhbmdlIG9mIGluZGljZXMgdGhhdCBjYW4gaW50ZXJzZWN0IHdpdGggdGhlIHZhbHVlLlxuICAgICAgY29uc3QgZWwgPSBkYXRhWzBdO1xuICAgICAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgZWwuZ2V0UmFuZ2UgPT09ICdmdW5jdGlvbicgJiYgZWwuZ2V0UmFuZ2UoYXhpcyk7XG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBsb29rdXBNZXRob2QoZGF0YSwgYXhpcywgdmFsdWUgLSByYW5nZSk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGxvb2t1cE1ldGhvZChkYXRhLCBheGlzLCB2YWx1ZSArIHJhbmdlKTtcbiAgICAgICAgcmV0dXJuIHtsbzogc3RhcnQubG8sIGhpOiBlbmQuaGl9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBEZWZhdWx0IHRvIGFsbCBlbGVtZW50cywgd2hlbiBiaW5hcnkgc2VhcmNoIGNhbiBub3QgYmUgdXNlZC5cbiAgcmV0dXJuIHtsbzogMCwgaGk6IGRhdGEubGVuZ3RoIC0gMX07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHNlbGVjdCBjYW5kaWRhdGUgZWxlbWVudHMgZm9yIGludGVyYWN0aW9uXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuICogQHBhcmFtIHtzdHJpbmd9IGF4aXMgLSB0aGUgYXhpcyBtb2RlLiB4fHl8eHl8clxuICogQHBhcmFtIHtQb2ludH0gcG9zaXRpb24gLSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0bywgaW4gcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSB0aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBmb3IgZWFjaCB2aXNpYmxlIGl0ZW1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVyc2VjdF0gLSBjb25zaWRlciBpbnRlcnNlY3RpbmcgaXRlbXNcbiAqL1xuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgaGFuZGxlciwgaW50ZXJzZWN0KSB7XG4gIGNvbnN0IG1ldGFzZXRzID0gY2hhcnQuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpO1xuICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW2F4aXNdO1xuICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IG1ldGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgIGNvbnN0IHtpbmRleCwgZGF0YX0gPSBtZXRhc2V0c1tpXTtcbiAgICBjb25zdCB7bG8sIGhpfSA9IGJpbmFyeVNlYXJjaChtZXRhc2V0c1tpXSwgYXhpcywgdmFsdWUsIGludGVyc2VjdCk7XG4gICAgZm9yIChsZXQgaiA9IGxvOyBqIDw9IGhpOyArK2opIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkYXRhW2pdO1xuICAgICAgaWYgKCFlbGVtZW50LnNraXApIHtcbiAgICAgICAgaGFuZGxlcihlbGVtZW50LCBpbmRleCwgaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2V0IGEgZGlzdGFuY2UgbWV0cmljIGZ1bmN0aW9uIGZvciB0d28gcG9pbnRzIGJhc2VkIG9uIHRoZVxuICogYXhpcyBtb2RlIHNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBheGlzIC0gdGhlIGF4aXMgbW9kZS4geHx5fHh5fHJcbiAqL1xuZnVuY3Rpb24gZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzKGF4aXMpIHtcbiAgY29uc3QgdXNlWCA9IGF4aXMuaW5kZXhPZigneCcpICE9PSAtMTtcbiAgY29uc3QgdXNlWSA9IGF4aXMuaW5kZXhPZigneScpICE9PSAtMTtcblxuICByZXR1cm4gZnVuY3Rpb24ocHQxLCBwdDIpIHtcbiAgICBjb25zdCBkZWx0YVggPSB1c2VYID8gTWF0aC5hYnMocHQxLnggLSBwdDIueCkgOiAwO1xuICAgIGNvbnN0IGRlbHRhWSA9IHVzZVkgPyBNYXRoLmFicyhwdDEueSAtIHB0Mi55KSA6IDA7XG4gICAgcmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhkZWx0YVgsIDIpICsgTWF0aC5wb3coZGVsdGFZLCAyKSk7XG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgdGhhdCBpbnRlcnNlY3QgdGhlIGV2ZW50IHBvc2l0aW9uXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuICogQHBhcmFtIHtQb2ludH0gcG9zaXRpb24gLSB0aGUgcG9pbnQgdG8gYmUgbmVhcmVzdCB0bywgaW4gcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBheGlzIC0gdGhlIGF4aXMgbW9kZS4geHx5fHh5fHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVJbnZpc2libGVdIC0gaW5jbHVkZSBpbnZpc2libGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIGNoYXJ0IGFyZWFcbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIHVzZUZpbmFsUG9zaXRpb24sIGluY2x1ZGVJbnZpc2libGUpIHtcbiAgY29uc3QgaXRlbXMgPSBbXTtcblxuICBpZiAoIWluY2x1ZGVJbnZpc2libGUgJiYgIWNoYXJ0LmlzUG9pbnRJbkFyZWEocG9zaXRpb24pKSB7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgY29uc3QgZXZhbHVhdGlvbkZ1bmMgPSBmdW5jdGlvbihlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG4gICAgaWYgKCFpbmNsdWRlSW52aXNpYmxlICYmICFfaXNQb2ludEluQXJlYShlbGVtZW50LCBjaGFydC5jaGFydEFyZWEsIDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgdXNlRmluYWxQb3NpdGlvbikpIHtcbiAgICAgIGl0ZW1zLnB1c2goe2VsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXh9KTtcbiAgICB9XG4gIH07XG5cbiAgZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgZXZhbHVhdGlvbkZ1bmMsIHRydWUpO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb24gZm9yIGEgcmFkaWFsIGNoYXJ0XG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7UG9pbnR9IHBvc2l0aW9uIC0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG8sIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGVzIGFsb25nIHdoaWNoIHRvIG1lYXN1cmUgZGlzdGFuY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXROZWFyZXN0UmFkaWFsSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gIGxldCBpdGVtcyA9IFtdO1xuXG4gIGZ1bmN0aW9uIGV2YWx1YXRpb25GdW5jKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcbiAgICBjb25zdCB7c3RhcnRBbmdsZSwgZW5kQW5nbGV9ID0gZWxlbWVudC5nZXRQcm9wcyhbJ3N0YXJ0QW5nbGUnLCAnZW5kQW5nbGUnXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgY29uc3Qge2FuZ2xlfSA9IGdldEFuZ2xlRnJvbVBvaW50KGVsZW1lbnQsIHt4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55fSk7XG5cbiAgICBpZiAoX2FuZ2xlQmV0d2VlbihhbmdsZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUpKSB7XG4gICAgICBpdGVtcy5wdXNoKHtlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fSk7XG4gICAgfVxuICB9XG5cbiAgZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgZXZhbHVhdGlvbkZ1bmMpO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb24gZm9yIGEgY2FydGVzaWFuIGNoYXJ0XG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7UG9pbnR9IHBvc2l0aW9uIC0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG8sIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGVzIGFsb25nIHdoaWNoIHRvIG1lYXN1cmUgZGlzdGFuY2VcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVyc2VjdF0gLSBpZiB0cnVlLCBvbmx5IGNvbnNpZGVyIGl0ZW1zIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbdXNlRmluYWxQb3NpdGlvbl0gLSB1c2UgdGhlIGVsZW1lbnQncyBhbmltYXRpb24gdGFyZ2V0IGluc3RlYWQgb2YgY3VycmVudCBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFufSBbaW5jbHVkZUludmlzaWJsZV0gLSBpbmNsdWRlIGludmlzaWJsZSBwb2ludHMgdGhhdCBhcmUgb3V0c2lkZSBvZiB0aGUgY2hhcnQgYXJlYVxuICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IHRoZSBuZWFyZXN0IGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3RDYXJ0ZXNpYW5JdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSkge1xuICBsZXQgaXRlbXMgPSBbXTtcbiAgY29uc3QgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMoYXhpcyk7XG4gIGxldCBtaW5EaXN0YW5jZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICBmdW5jdGlvbiBldmFsdWF0aW9uRnVuYyhlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4KSB7XG4gICAgY29uc3QgaW5SYW5nZSA9IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBpZiAoaW50ZXJzZWN0ICYmICFpblJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyID0gZWxlbWVudC5nZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBjb25zdCBwb2ludEluQXJlYSA9ICEhaW5jbHVkZUludmlzaWJsZSB8fCBjaGFydC5pc1BvaW50SW5BcmVhKGNlbnRlcik7XG4gICAgaWYgKCFwb2ludEluQXJlYSAmJiAhaW5SYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VNZXRyaWMocG9zaXRpb24sIGNlbnRlcik7XG4gICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgIGl0ZW1zID0gW3tlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fV07XG4gICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPT09IG1pbkRpc3RhbmNlKSB7XG4gICAgICAvLyBDYW4gaGF2ZSBtdWx0aXBsZSBpdGVtcyBhdCB0aGUgc2FtZSBkaXN0YW5jZSBpbiB3aGljaCBjYXNlIHdlIHNvcnQgYnkgc2l6ZVxuICAgICAgaXRlbXMucHVzaCh7ZWxlbWVudCwgZGF0YXNldEluZGV4LCBpbmRleH0pO1xuICAgIH1cbiAgfVxuXG4gIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyhjaGFydCwgYXhpcywgcG9zaXRpb24sIGV2YWx1YXRpb25GdW5jKTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGl0ZW1zIG5lYXJlc3QgdG8gdGhlIGV2ZW50IHBvc2l0aW9uIGNvbnNpZGVyaW5nIGFsbCB2aXNpYmxlIGl0ZW1zIGluIHRoZSBjaGFydFxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgdG8gbG9vayBhdCBlbGVtZW50cyBmcm9tXG4gKiBAcGFyYW0ge1BvaW50fSBwb3NpdGlvbiAtIHRoZSBwb2ludCB0byBiZSBuZWFyZXN0IHRvLCBpbiByZWxhdGl2ZSBjb29yZGluYXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IGF4aXMgLSB0aGUgYXhlcyBhbG9uZyB3aGljaCB0byBtZWFzdXJlIGRpc3RhbmNlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcnNlY3RdIC0gaWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVJbnZpc2libGVdIC0gaW5jbHVkZSBpbnZpc2libGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgb2YgdGhlIGNoYXJ0IGFyZWFcbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBpbnRlcnNlY3QsIHVzZUZpbmFsUG9zaXRpb24sIGluY2x1ZGVJbnZpc2libGUpIHtcbiAgaWYgKCFpbmNsdWRlSW52aXNpYmxlICYmICFjaGFydC5pc1BvaW50SW5BcmVhKHBvc2l0aW9uKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBheGlzID09PSAncicgJiYgIWludGVyc2VjdFxuICAgID8gZ2V0TmVhcmVzdFJhZGlhbEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbilcbiAgICA6IGdldE5lYXJlc3RDYXJ0ZXNpYW5JdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGludGVyc2VjdCwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgaXRlbXMgbWF0Y2hpbmcgYWxvbmcgdGhlIGdpdmVuIFggb3IgWSBheGlzXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byBsb29rIGF0IGVsZW1lbnRzIGZyb21cbiAqIEBwYXJhbSB7UG9pbnR9IHBvc2l0aW9uIC0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG8sIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXhpcyAtIHRoZSBheGlzIHRvIG1hdGNoXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbnRlcnNlY3RdIC0gaWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIHRoZSBlbGVtZW50J3MgYW5pbWF0aW9uIHRhcmdldCBpbnN0ZWFkIG9mIGN1cnJlbnQgcG9zaXRpb25cbiAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXRBeGlzSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBpbnRlcnNlY3QsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgY29uc3QgcmFuZ2VNZXRob2QgPSBheGlzID09PSAneCcgPyAnaW5YUmFuZ2UnIDogJ2luWVJhbmdlJztcbiAgbGV0IGludGVyc2VjdHNJdGVtID0gZmFsc2U7XG5cbiAgZXZhbHVhdGVJbnRlcmFjdGlvbkl0ZW1zKGNoYXJ0LCBheGlzLCBwb3NpdGlvbiwgKGVsZW1lbnQsIGRhdGFzZXRJbmRleCwgaW5kZXgpID0+IHtcbiAgICBpZiAoZWxlbWVudFtyYW5nZU1ldGhvZF0ocG9zaXRpb25bYXhpc10sIHVzZUZpbmFsUG9zaXRpb24pKSB7XG4gICAgICBpdGVtcy5wdXNoKHtlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fSk7XG4gICAgICBpbnRlcnNlY3RzSXRlbSA9IGludGVyc2VjdHNJdGVtIHx8IGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIElmIHdlIHdhbnQgdG8gdHJpZ2dlciBvbiBhbiBpbnRlcnNlY3QgYW5kIHdlIGRvbid0IGhhdmUgYW55IGl0ZW1zXG4gIC8vIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvbiwgcmV0dXJuIG5vdGhpbmdcbiAgaWYgKGludGVyc2VjdCAmJiAhaW50ZXJzZWN0c0l0ZW0pIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGludGVyYWN0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zXG4gKiBAbmFtZXNwYWNlIENoYXJ0LkludGVyYWN0aW9uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgLy8gUGFydCBvZiB0aGUgcHVibGljIEFQSSB0byBmYWNpbGl0YXRlIGRldmVsb3BlcnMgY3JlYXRpbmcgdGhlaXIgb3duIG1vZGVzXG4gIGV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyxcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGRpZmZlcmVudCBtb2Rlc1xuICBtb2Rlczoge1xuICAgIC8qKlxuXHRcdCAqIFJldHVybnMgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXguIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBwYXJhbWV0ZXIgaXMgdHJ1ZSwgd2Ugb25seSByZXR1cm4gaXRlbXMgaWYgd2UgaW50ZXJzZWN0IHNvbWV0aGluZ1xuXHRcdCAqIElmIHRoZSBvcHRpb25zLmludGVyc2VjdCBtb2RlIGlzIGZhbHNlLCB3ZSBmaW5kIHRoZSBuZWFyZXN0IGl0ZW0gYW5kIHJldHVybiB0aGUgaXRlbXMgYXQgdGhlIHNhbWUgaW5kZXggYXMgdGhhdCBpdGVtXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmluZGV4XG5cdFx0ICogQHNpbmNlIHYyLjQuMFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIGZpbmFsIGVsZW1lbnQgcG9zaXRpb24gKGFuaW1hdGlvbiB0YXJnZXQpXG5cdFx0ICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IC0gaXRlbXMgdGhhdCBhcmUgZm91bmRcblx0XHQgKi9cbiAgICBpbmRleChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIC8vIERlZmF1bHQgYXhpcyBmb3IgaW5kZXggbW9kZSBpcyAneCcgdG8gbWF0Y2ggb2xkIGJlaGF2aW91clxuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneCc7XG4gICAgICBjb25zdCBpbmNsdWRlSW52aXNpYmxlID0gb3B0aW9ucy5pbmNsdWRlSW52aXNpYmxlIHx8IGZhbHNlO1xuICAgICAgY29uc3QgaXRlbXMgPSBvcHRpb25zLmludGVyc2VjdFxuICAgICAgICA/IGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgYXhpcywgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSlcbiAgICAgICAgOiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCBmYWxzZSwgdXNlRmluYWxQb3NpdGlvbiwgaW5jbHVkZUludmlzaWJsZSk7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IFtdO1xuXG4gICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNoYXJ0LmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKS5mb3JFYWNoKChtZXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXNbMF0uaW5kZXg7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBtZXRhLmRhdGFbaW5kZXhdO1xuXG4gICAgICAgIC8vIGRvbid0IGNvdW50IGl0ZW1zIHRoYXQgYXJlIHNraXBwZWQgKG51bGwgZGF0YSlcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQuc2tpcCkge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goe2VsZW1lbnQsIGRhdGFzZXRJbmRleDogbWV0YS5pbmRleCwgaW5kZXh9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogUmV0dXJucyBpdGVtcyBpbiB0aGUgc2FtZSBkYXRhc2V0LiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgcGFyYW1ldGVyIGlzIHRydWUsIHdlIG9ubHkgcmV0dXJuIGl0ZW1zIGlmIHdlIGludGVyc2VjdCBzb21ldGhpbmdcblx0XHQgKiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgaXMgZmFsc2UsIHdlIGZpbmQgdGhlIG5lYXJlc3QgaXRlbSBhbmQgcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGF0IGRhdGFzZXRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuZGF0YXNldFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIGZpbmFsIGVsZW1lbnQgcG9zaXRpb24gKGFuaW1hdGlvbiB0YXJnZXQpXG5cdFx0ICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IC0gaXRlbXMgdGhhdCBhcmUgZm91bmRcblx0XHQgKi9cbiAgICBkYXRhc2V0KGNoYXJ0LCBlLCBvcHRpb25zLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuICAgICAgY29uc3QgYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuICAgICAgY29uc3QgaW5jbHVkZUludmlzaWJsZSA9IG9wdGlvbnMuaW5jbHVkZUludmlzaWJsZSB8fCBmYWxzZTtcbiAgICAgIGxldCBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0XG4gICAgICAgID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKSA6XG4gICAgICAgIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIGZhbHNlLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZGF0YXNldEluZGV4ID0gaXRlbXNbMF0uZGF0YXNldEluZGV4O1xuICAgICAgICBjb25zdCBkYXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5kYXRhO1xuICAgICAgICBpdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpdGVtcy5wdXNoKHtlbGVtZW50OiBkYXRhW2ldLCBkYXRhc2V0SW5kZXgsIGluZGV4OiBpfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH0sXG5cbiAgICAvKipcblx0XHQgKiBQb2ludCBtb2RlIHJldHVybnMgYWxsIGVsZW1lbnRzIHRoYXQgaGl0IHRlc3QgYmFzZWQgb24gdGhlIGV2ZW50IHBvc2l0aW9uXG5cdFx0ICogb2YgdGhlIGV2ZW50XG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmludGVyc2VjdFxuXHRcdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSB7RXZlbnR9IGUgLSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIHtJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dIC0gdXNlIGZpbmFsIGVsZW1lbnQgcG9zaXRpb24gKGFuaW1hdGlvbiB0YXJnZXQpXG5cdFx0ICogQHJldHVybiB7SW50ZXJhY3Rpb25JdGVtW119IC0gaXRlbXMgdGhhdCBhcmUgZm91bmRcblx0XHQgKi9cbiAgICBwb2ludChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIGNvbnN0IGF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3h5JztcbiAgICAgIGNvbnN0IGluY2x1ZGVJbnZpc2libGUgPSBvcHRpb25zLmluY2x1ZGVJbnZpc2libGUgfHwgZmFsc2U7XG4gICAgICByZXR1cm4gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBheGlzLCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogbmVhcmVzdCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnQgY2xvc2VzdCB0byB0aGUgcG9pbnRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuaW50ZXJzZWN0XG5cdFx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIHtFdmVudH0gZSAtIHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0ge0ludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyAtIG9wdGlvbnMgdG8gdXNlXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbdXNlRmluYWxQb3NpdGlvbl0gLSB1c2UgZmluYWwgZWxlbWVudCBwb3NpdGlvbiAoYW5pbWF0aW9uIHRhcmdldClcblx0XHQgKiBAcmV0dXJuIHtJbnRlcmFjdGlvbkl0ZW1bXX0gLSBpdGVtcyB0aGF0IGFyZSBmb3VuZFxuXHRcdCAqL1xuICAgIG5lYXJlc3QoY2hhcnQsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG4gICAgICBjb25zdCBheGlzID0gb3B0aW9ucy5heGlzIHx8ICd4eSc7XG4gICAgICBjb25zdCBpbmNsdWRlSW52aXNpYmxlID0gb3B0aW9ucy5pbmNsdWRlSW52aXNpYmxlIHx8IGZhbHNlO1xuICAgICAgcmV0dXJuIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGF4aXMsIG9wdGlvbnMuaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uLCBpbmNsdWRlSW52aXNpYmxlKTtcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogeCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeCBjb29yZGluYXRlXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnhcblx0XHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlIC0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSB7SW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gb3B0aW9ucyB0byB1c2Vcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VGaW5hbFBvc2l0aW9uXSAtIHVzZSBmaW5hbCBlbGVtZW50IHBvc2l0aW9uIChhbmltYXRpb24gdGFyZ2V0KVxuXHRcdCAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSAtIGl0ZW1zIHRoYXQgYXJlIGZvdW5kXG5cdFx0ICovXG4gICAgeChjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIHJldHVybiBnZXRBeGlzSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCAneCcsIG9wdGlvbnMuaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9LFxuXG4gICAgLyoqXG5cdFx0ICogeSBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeSBjb29yZGluYXRlXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnlcblx0XHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0ge0V2ZW50fSBlIC0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSB7SW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIC0gb3B0aW9ucyB0byB1c2Vcblx0XHQgKiBAcGFyYW0ge2Jvb2xlYW59IFt1c2VGaW5hbFBvc2l0aW9uXSAtIHVzZSBmaW5hbCBlbGVtZW50IHBvc2l0aW9uIChhbmltYXRpb24gdGFyZ2V0KVxuXHRcdCAqIEByZXR1cm4ge0ludGVyYWN0aW9uSXRlbVtdfSAtIGl0ZW1zIHRoYXQgYXJlIGZvdW5kXG5cdFx0ICovXG4gICAgeShjaGFydCwgZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbiAgICAgIHJldHVybiBnZXRBeGlzSXRlbXMoY2hhcnQsIHBvc2l0aW9uLCAneScsIG9wdGlvbnMuaW50ZXJzZWN0LCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICB9XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtkZWZpbmVkLCBlYWNoLCBpc09iamVjdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuaW1wb3J0IHt0b1BhZGRpbmd9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqL1xuXG5jb25zdCBTVEFUSUNfUE9TSVRJT05TID0gWydsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nXTtcblxuZnVuY3Rpb24gZmlsdGVyQnlQb3NpdGlvbihhcnJheSwgcG9zaXRpb24pIHtcbiAgcmV0dXJuIGFycmF5LmZpbHRlcih2ID0+IHYucG9zID09PSBwb3NpdGlvbik7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyhhcnJheSwgYXhpcykge1xuICByZXR1cm4gYXJyYXkuZmlsdGVyKHYgPT4gU1RBVElDX1BPU0lUSU9OUy5pbmRleE9mKHYucG9zKSA9PT0gLTEgJiYgdi5ib3guYXhpcyA9PT0gYXhpcyk7XG59XG5cbmZ1bmN0aW9uIHNvcnRCeVdlaWdodChhcnJheSwgcmV2ZXJzZSkge1xuICByZXR1cm4gYXJyYXkuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHYwID0gcmV2ZXJzZSA/IGIgOiBhO1xuICAgIGNvbnN0IHYxID0gcmV2ZXJzZSA/IGEgOiBiO1xuICAgIHJldHVybiB2MC53ZWlnaHQgPT09IHYxLndlaWdodCA/XG4gICAgICB2MC5pbmRleCAtIHYxLmluZGV4IDpcbiAgICAgIHYwLndlaWdodCAtIHYxLndlaWdodDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBCb3hlcyhib3hlcykge1xuICBjb25zdCBsYXlvdXRCb3hlcyA9IFtdO1xuICBsZXQgaSwgaWxlbiwgYm94LCBwb3MsIHN0YWNrLCBzdGFja1dlaWdodDtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gKGJveGVzIHx8IFtdKS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBib3ggPSBib3hlc1tpXTtcbiAgICAoe3Bvc2l0aW9uOiBwb3MsIG9wdGlvbnM6IHtzdGFjaywgc3RhY2tXZWlnaHQgPSAxfX0gPSBib3gpO1xuICAgIGxheW91dEJveGVzLnB1c2goe1xuICAgICAgaW5kZXg6IGksXG4gICAgICBib3gsXG4gICAgICBwb3MsXG4gICAgICBob3Jpem9udGFsOiBib3guaXNIb3Jpem9udGFsKCksXG4gICAgICB3ZWlnaHQ6IGJveC53ZWlnaHQsXG4gICAgICBzdGFjazogc3RhY2sgJiYgKHBvcyArIHN0YWNrKSxcbiAgICAgIHN0YWNrV2VpZ2h0XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGxheW91dEJveGVzO1xufVxuXG5mdW5jdGlvbiBidWlsZFN0YWNrcyhsYXlvdXRzKSB7XG4gIGNvbnN0IHN0YWNrcyA9IHt9O1xuICBmb3IgKGNvbnN0IHdyYXAgb2YgbGF5b3V0cykge1xuICAgIGNvbnN0IHtzdGFjaywgcG9zLCBzdGFja1dlaWdodH0gPSB3cmFwO1xuICAgIGlmICghc3RhY2sgfHwgIVNUQVRJQ19QT1NJVElPTlMuaW5jbHVkZXMocG9zKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IF9zdGFjayA9IHN0YWNrc1tzdGFja10gfHwgKHN0YWNrc1tzdGFja10gPSB7Y291bnQ6IDAsIHBsYWNlZDogMCwgd2VpZ2h0OiAwLCBzaXplOiAwfSk7XG4gICAgX3N0YWNrLmNvdW50Kys7XG4gICAgX3N0YWNrLndlaWdodCArPSBzdGFja1dlaWdodDtcbiAgfVxuICByZXR1cm4gc3RhY2tzO1xufVxuXG4vKipcbiAqIHN0b3JlIGRpbWVuc2lvbnMgdXNlZCBpbnN0ZWFkIG9mIGF2YWlsYWJsZSBjaGFydEFyZWEgaW4gZml0Qm94ZXNcbiAqKi9cbmZ1bmN0aW9uIHNldExheW91dERpbXMobGF5b3V0cywgcGFyYW1zKSB7XG4gIGNvbnN0IHN0YWNrcyA9IGJ1aWxkU3RhY2tzKGxheW91dHMpO1xuICBjb25zdCB7dkJveE1heFdpZHRoLCBoQm94TWF4SGVpZ2h0fSA9IHBhcmFtcztcbiAgbGV0IGksIGlsZW4sIGxheW91dDtcbiAgZm9yIChpID0gMCwgaWxlbiA9IGxheW91dHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgbGF5b3V0ID0gbGF5b3V0c1tpXTtcbiAgICBjb25zdCB7ZnVsbFNpemV9ID0gbGF5b3V0LmJveDtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdO1xuICAgIGNvbnN0IGZhY3RvciA9IHN0YWNrICYmIGxheW91dC5zdGFja1dlaWdodCAvIHN0YWNrLndlaWdodDtcbiAgICBpZiAobGF5b3V0Lmhvcml6b250YWwpIHtcbiAgICAgIGxheW91dC53aWR0aCA9IGZhY3RvciA/IGZhY3RvciAqIHZCb3hNYXhXaWR0aCA6IGZ1bGxTaXplICYmIHBhcmFtcy5hdmFpbGFibGVXaWR0aDtcbiAgICAgIGxheW91dC5oZWlnaHQgPSBoQm94TWF4SGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXlvdXQud2lkdGggPSB2Qm94TWF4V2lkdGg7XG4gICAgICBsYXlvdXQuaGVpZ2h0ID0gZmFjdG9yID8gZmFjdG9yICogaEJveE1heEhlaWdodCA6IGZ1bGxTaXplICYmIHBhcmFtcy5hdmFpbGFibGVIZWlnaHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdGFja3M7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGF5b3V0Qm94ZXMoYm94ZXMpIHtcbiAgY29uc3QgbGF5b3V0Qm94ZXMgPSB3cmFwQm94ZXMoYm94ZXMpO1xuICBjb25zdCBmdWxsU2l6ZSA9IHNvcnRCeVdlaWdodChsYXlvdXRCb3hlcy5maWx0ZXIod3JhcCA9PiB3cmFwLmJveC5mdWxsU2l6ZSksIHRydWUpO1xuICBjb25zdCBsZWZ0ID0gc29ydEJ5V2VpZ2h0KGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdsZWZ0JyksIHRydWUpO1xuICBjb25zdCByaWdodCA9IHNvcnRCeVdlaWdodChmaWx0ZXJCeVBvc2l0aW9uKGxheW91dEJveGVzLCAncmlnaHQnKSk7XG4gIGNvbnN0IHRvcCA9IHNvcnRCeVdlaWdodChmaWx0ZXJCeVBvc2l0aW9uKGxheW91dEJveGVzLCAndG9wJyksIHRydWUpO1xuICBjb25zdCBib3R0b20gPSBzb3J0QnlXZWlnaHQoZmlsdGVyQnlQb3NpdGlvbihsYXlvdXRCb3hlcywgJ2JvdHRvbScpKTtcbiAgY29uc3QgY2VudGVySG9yaXpvbnRhbCA9IGZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyhsYXlvdXRCb3hlcywgJ3gnKTtcbiAgY29uc3QgY2VudGVyVmVydGljYWwgPSBmaWx0ZXJEeW5hbWljUG9zaXRpb25CeUF4aXMobGF5b3V0Qm94ZXMsICd5Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICBmdWxsU2l6ZSxcbiAgICBsZWZ0QW5kVG9wOiBsZWZ0LmNvbmNhdCh0b3ApLFxuICAgIHJpZ2h0QW5kQm90dG9tOiByaWdodC5jb25jYXQoY2VudGVyVmVydGljYWwpLmNvbmNhdChib3R0b20pLmNvbmNhdChjZW50ZXJIb3Jpem9udGFsKSxcbiAgICBjaGFydEFyZWE6IGZpbHRlckJ5UG9zaXRpb24obGF5b3V0Qm94ZXMsICdjaGFydEFyZWEnKSxcbiAgICB2ZXJ0aWNhbDogbGVmdC5jb25jYXQocmlnaHQpLmNvbmNhdChjZW50ZXJWZXJ0aWNhbCksXG4gICAgaG9yaXpvbnRhbDogdG9wLmNvbmNhdChib3R0b20pLmNvbmNhdChjZW50ZXJIb3Jpem9udGFsKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDb21iaW5lZE1heChtYXhQYWRkaW5nLCBjaGFydEFyZWEsIGEsIGIpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1heFBhZGRpbmdbYV0sIGNoYXJ0QXJlYVthXSkgKyBNYXRoLm1heChtYXhQYWRkaW5nW2JdLCBjaGFydEFyZWFbYl0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNYXhQYWRkaW5nKG1heFBhZGRpbmcsIGJveFBhZGRpbmcpIHtcbiAgbWF4UGFkZGluZy50b3AgPSBNYXRoLm1heChtYXhQYWRkaW5nLnRvcCwgYm94UGFkZGluZy50b3ApO1xuICBtYXhQYWRkaW5nLmxlZnQgPSBNYXRoLm1heChtYXhQYWRkaW5nLmxlZnQsIGJveFBhZGRpbmcubGVmdCk7XG4gIG1heFBhZGRpbmcuYm90dG9tID0gTWF0aC5tYXgobWF4UGFkZGluZy5ib3R0b20sIGJveFBhZGRpbmcuYm90dG9tKTtcbiAgbWF4UGFkZGluZy5yaWdodCA9IE1hdGgubWF4KG1heFBhZGRpbmcucmlnaHQsIGJveFBhZGRpbmcucmlnaHQpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVEaW1zKGNoYXJ0QXJlYSwgcGFyYW1zLCBsYXlvdXQsIHN0YWNrcykge1xuICBjb25zdCB7cG9zLCBib3h9ID0gbGF5b3V0O1xuICBjb25zdCBtYXhQYWRkaW5nID0gY2hhcnRBcmVhLm1heFBhZGRpbmc7XG5cbiAgLy8gZHluYW1pY2FsbHkgcGxhY2VkIGJveGVzIHNpemUgaXMgbm90IGNvbnNpZGVyZWRcbiAgaWYgKCFpc09iamVjdChwb3MpKSB7XG4gICAgaWYgKGxheW91dC5zaXplKSB7XG4gICAgICAvLyB0aGlzIGxheW91dCB3YXMgYWxyZWFkeSBjb3VudGVkIGZvciwgbGV0cyBmaXJzdCByZWR1Y2Ugb2xkIHNpemVcbiAgICAgIGNoYXJ0QXJlYVtwb3NdIC09IGxheW91dC5zaXplO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdIHx8IHtzaXplOiAwLCBjb3VudDogMX07XG4gICAgc3RhY2suc2l6ZSA9IE1hdGgubWF4KHN0YWNrLnNpemUsIGxheW91dC5ob3Jpem9udGFsID8gYm94LmhlaWdodCA6IGJveC53aWR0aCk7XG4gICAgbGF5b3V0LnNpemUgPSBzdGFjay5zaXplIC8gc3RhY2suY291bnQ7XG4gICAgY2hhcnRBcmVhW3Bvc10gKz0gbGF5b3V0LnNpemU7XG4gIH1cblxuICBpZiAoYm94LmdldFBhZGRpbmcpIHtcbiAgICB1cGRhdGVNYXhQYWRkaW5nKG1heFBhZGRpbmcsIGJveC5nZXRQYWRkaW5nKCkpO1xuICB9XG5cbiAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCgwLCBwYXJhbXMub3V0ZXJXaWR0aCAtIGdldENvbWJpbmVkTWF4KG1heFBhZGRpbmcsIGNoYXJ0QXJlYSwgJ2xlZnQnLCAncmlnaHQnKSk7XG4gIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KDAsIHBhcmFtcy5vdXRlckhlaWdodCAtIGdldENvbWJpbmVkTWF4KG1heFBhZGRpbmcsIGNoYXJ0QXJlYSwgJ3RvcCcsICdib3R0b20nKSk7XG4gIGNvbnN0IHdpZHRoQ2hhbmdlZCA9IG5ld1dpZHRoICE9PSBjaGFydEFyZWEudztcbiAgY29uc3QgaGVpZ2h0Q2hhbmdlZCA9IG5ld0hlaWdodCAhPT0gY2hhcnRBcmVhLmg7XG4gIGNoYXJ0QXJlYS53ID0gbmV3V2lkdGg7XG4gIGNoYXJ0QXJlYS5oID0gbmV3SGVpZ2h0O1xuXG4gIC8vIHJldHVybiBib29sZWFucyBvbiB0aGUgY2hhbmdlcyBwZXIgZGlyZWN0aW9uXG4gIHJldHVybiBsYXlvdXQuaG9yaXpvbnRhbFxuICAgID8ge3NhbWU6IHdpZHRoQ2hhbmdlZCwgb3RoZXI6IGhlaWdodENoYW5nZWR9XG4gICAgOiB7c2FtZTogaGVpZ2h0Q2hhbmdlZCwgb3RoZXI6IHdpZHRoQ2hhbmdlZH07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1heFBhZGRpbmcoY2hhcnRBcmVhKSB7XG4gIGNvbnN0IG1heFBhZGRpbmcgPSBjaGFydEFyZWEubWF4UGFkZGluZztcblxuICBmdW5jdGlvbiB1cGRhdGVQb3MocG9zKSB7XG4gICAgY29uc3QgY2hhbmdlID0gTWF0aC5tYXgobWF4UGFkZGluZ1twb3NdIC0gY2hhcnRBcmVhW3Bvc10sIDApO1xuICAgIGNoYXJ0QXJlYVtwb3NdICs9IGNoYW5nZTtcbiAgICByZXR1cm4gY2hhbmdlO1xuICB9XG4gIGNoYXJ0QXJlYS55ICs9IHVwZGF0ZVBvcygndG9wJyk7XG4gIGNoYXJ0QXJlYS54ICs9IHVwZGF0ZVBvcygnbGVmdCcpO1xuICB1cGRhdGVQb3MoJ3JpZ2h0Jyk7XG4gIHVwZGF0ZVBvcygnYm90dG9tJyk7XG59XG5cbmZ1bmN0aW9uIGdldE1hcmdpbnMoaG9yaXpvbnRhbCwgY2hhcnRBcmVhKSB7XG4gIGNvbnN0IG1heFBhZGRpbmcgPSBjaGFydEFyZWEubWF4UGFkZGluZztcblxuICBmdW5jdGlvbiBtYXJnaW5Gb3JQb3NpdGlvbnMocG9zaXRpb25zKSB7XG4gICAgY29uc3QgbWFyZ2luID0ge2xlZnQ6IDAsIHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMH07XG4gICAgcG9zaXRpb25zLmZvckVhY2goKHBvcykgPT4ge1xuICAgICAgbWFyZ2luW3Bvc10gPSBNYXRoLm1heChjaGFydEFyZWFbcG9zXSwgbWF4UGFkZGluZ1twb3NdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFyZ2luO1xuICB9XG5cbiAgcmV0dXJuIGhvcml6b250YWxcbiAgICA/IG1hcmdpbkZvclBvc2l0aW9ucyhbJ2xlZnQnLCAncmlnaHQnXSlcbiAgICA6IG1hcmdpbkZvclBvc2l0aW9ucyhbJ3RvcCcsICdib3R0b20nXSk7XG59XG5cbmZ1bmN0aW9uIGZpdEJveGVzKGJveGVzLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKSB7XG4gIGNvbnN0IHJlZml0Qm94ZXMgPSBbXTtcbiAgbGV0IGksIGlsZW4sIGxheW91dCwgYm94LCByZWZpdCwgY2hhbmdlZDtcblxuICBmb3IgKGkgPSAwLCBpbGVuID0gYm94ZXMubGVuZ3RoLCByZWZpdCA9IDA7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBsYXlvdXQgPSBib3hlc1tpXTtcbiAgICBib3ggPSBsYXlvdXQuYm94O1xuXG4gICAgYm94LnVwZGF0ZShcbiAgICAgIGxheW91dC53aWR0aCB8fCBjaGFydEFyZWEudyxcbiAgICAgIGxheW91dC5oZWlnaHQgfHwgY2hhcnRBcmVhLmgsXG4gICAgICBnZXRNYXJnaW5zKGxheW91dC5ob3Jpem9udGFsLCBjaGFydEFyZWEpXG4gICAgKTtcbiAgICBjb25zdCB7c2FtZSwgb3RoZXJ9ID0gdXBkYXRlRGltcyhjaGFydEFyZWEsIHBhcmFtcywgbGF5b3V0LCBzdGFja3MpO1xuXG4gICAgLy8gRGltZW5zaW9ucyBjaGFuZ2VkIGFuZCB0aGVyZSB3ZXJlIG5vbiBmdWxsIHdpZHRoIGJveGVzIGJlZm9yZSB0aGlzXG4gICAgLy8gLT4gd2UgaGF2ZSB0byByZWZpdCB0aG9zZVxuICAgIHJlZml0IHw9IHNhbWUgJiYgcmVmaXRCb3hlcy5sZW5ndGg7XG5cbiAgICAvLyBDaGFydCBhcmVhIGNoYW5nZWQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHx8IG90aGVyO1xuXG4gICAgaWYgKCFib3guZnVsbFNpemUpIHsgLy8gZnVsbFNpemUgYm94ZXMgZG9uJ3QgbmVlZCB0byBiZSByZS1maXR0ZWQgaW4gYW55IGNhc2VcbiAgICAgIHJlZml0Qm94ZXMucHVzaChsYXlvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZpdCAmJiBmaXRCb3hlcyhyZWZpdEJveGVzLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKSB8fCBjaGFuZ2VkO1xufVxuXG5mdW5jdGlvbiBzZXRCb3hEaW1zKGJveCwgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGJveC50b3AgPSB0b3A7XG4gIGJveC5sZWZ0ID0gbGVmdDtcbiAgYm94LnJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICBib3guYm90dG9tID0gdG9wICsgaGVpZ2h0O1xuICBib3gud2lkdGggPSB3aWR0aDtcbiAgYm94LmhlaWdodCA9IGhlaWdodDtcbn1cblxuZnVuY3Rpb24gcGxhY2VCb3hlcyhib3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcykge1xuICBjb25zdCB1c2VyUGFkZGluZyA9IHBhcmFtcy5wYWRkaW5nO1xuICBsZXQge3gsIHl9ID0gY2hhcnRBcmVhO1xuXG4gIGZvciAoY29uc3QgbGF5b3V0IG9mIGJveGVzKSB7XG4gICAgY29uc3QgYm94ID0gbGF5b3V0LmJveDtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrc1tsYXlvdXQuc3RhY2tdIHx8IHtjb3VudDogMSwgcGxhY2VkOiAwLCB3ZWlnaHQ6IDF9O1xuICAgIGNvbnN0IHdlaWdodCA9IChsYXlvdXQuc3RhY2tXZWlnaHQgLyBzdGFjay53ZWlnaHQpIHx8IDE7XG4gICAgaWYgKGxheW91dC5ob3Jpem9udGFsKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IGNoYXJ0QXJlYS53ICogd2VpZ2h0O1xuICAgICAgY29uc3QgaGVpZ2h0ID0gc3RhY2suc2l6ZSB8fCBib3guaGVpZ2h0O1xuICAgICAgaWYgKGRlZmluZWQoc3RhY2suc3RhcnQpKSB7XG4gICAgICAgIHkgPSBzdGFjay5zdGFydDtcbiAgICAgIH1cbiAgICAgIGlmIChib3guZnVsbFNpemUpIHtcbiAgICAgICAgc2V0Qm94RGltcyhib3gsIHVzZXJQYWRkaW5nLmxlZnQsIHksIHBhcmFtcy5vdXRlcldpZHRoIC0gdXNlclBhZGRpbmcucmlnaHQgLSB1c2VyUGFkZGluZy5sZWZ0LCBoZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Qm94RGltcyhib3gsIGNoYXJ0QXJlYS5sZWZ0ICsgc3RhY2sucGxhY2VkLCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnN0YXJ0ID0geTtcbiAgICAgIHN0YWNrLnBsYWNlZCArPSB3aWR0aDtcbiAgICAgIHkgPSBib3guYm90dG9tO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSBjaGFydEFyZWEuaCAqIHdlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gc3RhY2suc2l6ZSB8fCBib3gud2lkdGg7XG4gICAgICBpZiAoZGVmaW5lZChzdGFjay5zdGFydCkpIHtcbiAgICAgICAgeCA9IHN0YWNrLnN0YXJ0O1xuICAgICAgfVxuICAgICAgaWYgKGJveC5mdWxsU2l6ZSkge1xuICAgICAgICBzZXRCb3hEaW1zKGJveCwgeCwgdXNlclBhZGRpbmcudG9wLCB3aWR0aCwgcGFyYW1zLm91dGVySGVpZ2h0IC0gdXNlclBhZGRpbmcuYm90dG9tIC0gdXNlclBhZGRpbmcudG9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEJveERpbXMoYm94LCB4LCBjaGFydEFyZWEudG9wICsgc3RhY2sucGxhY2VkLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnN0YXJ0ID0geDtcbiAgICAgIHN0YWNrLnBsYWNlZCArPSBoZWlnaHQ7XG4gICAgICB4ID0gYm94LnJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIGNoYXJ0QXJlYS54ID0geDtcbiAgY2hhcnRBcmVhLnkgPSB5O1xufVxuXG4vKipcbiAqIEBpbnRlcmZhY2UgTGF5b3V0SXRlbVxuICogQHR5cGVkZWYge29iamVjdH0gTGF5b3V0SXRlbVxuICogQHByb3Age3N0cmluZ30gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIGNoYXJ0IGxheW91dC4gUG9zc2libGUgdmFsdWVzIGFyZVxuICogJ2xlZnQnLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsIGFuZCAnY2hhcnRBcmVhJ1xuICogQHByb3Age251bWJlcn0gd2VpZ2h0IC0gVGhlIHdlaWdodCB1c2VkIHRvIHNvcnQgdGhlIGl0ZW0uIEhpZ2hlciB3ZWlnaHRzIGFyZSBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2hhcnQgYXJlYVxuICogQHByb3Age2Jvb2xlYW59IGZ1bGxTaXplIC0gaWYgdHJ1ZSwgYW5kIHRoZSBpdGVtIGlzIGhvcml6b250YWwsIHRoZW4gcHVzaCB2ZXJ0aWNhbCBib3hlcyBkb3duXG4gKiBAcHJvcCB7ZnVuY3Rpb259IGlzSG9yaXpvbnRhbCAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGF5b3V0IGl0ZW0gaXMgaG9yaXpvbnRhbCAoaWUuIHRvcCBvciBib3R0b20pXG4gKiBAcHJvcCB7ZnVuY3Rpb259IHVwZGF0ZSAtIFRha2VzIHR3byBwYXJhbWV0ZXJzOiB3aWR0aCBhbmQgaGVpZ2h0LiBSZXR1cm5zIHNpemUgb2YgaXRlbVxuICogQHByb3Age2Z1bmN0aW9ufSBkcmF3IC0gRHJhd3MgdGhlIGVsZW1lbnRcbiAqIEBwcm9wIHtmdW5jdGlvbn0gW2dldFBhZGRpbmddIC0gIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcGFkZGluZyBvbiB0aGUgZWRnZXNcbiAqIEBwcm9wIHtudW1iZXJ9IHdpZHRoIC0gV2lkdGggb2YgaXRlbS4gTXVzdCBiZSB2YWxpZCBhZnRlciB1cGRhdGUoKVxuICogQHByb3Age251bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIGl0ZW0uIE11c3QgYmUgdmFsaWQgYWZ0ZXIgdXBkYXRlKClcbiAqIEBwcm9wIHtudW1iZXJ9IGxlZnQgLSBMZWZ0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtudW1iZXJ9IHRvcCAtIFRvcCBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXG4gKiBAcHJvcCB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtudW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXG4gKi9cblxuLy8gVGhlIGxheW91dCBzZXJ2aWNlIGlzIHZlcnkgc2VsZiBleHBsYW5hdG9yeS4gIEl0J3MgcmVzcG9uc2libGUgZm9yIHRoZSBsYXlvdXQgd2l0aGluIGEgY2hhcnQuXG4vLyBTY2FsZXMsIExlZ2VuZHMgYW5kIFBsdWdpbnMgYWxsIHJlbHkgb24gdGhlIGxheW91dCBzZXJ2aWNlIGFuZCBjYW4gZWFzaWx5IHJlZ2lzdGVyIHRvIGJlIHBsYWNlZCBhbnl3aGVyZSB0aGV5IG5lZWRcbi8vIEl0IGlzIHRoaXMgc2VydmljZSdzIHJlc3BvbnNpYmlsaXR5IG9mIGNhcnJ5aW5nIG91dCB0aGF0IGxheW91dC5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICAvKipcblx0ICogUmVnaXN0ZXIgYSBib3ggdG8gYSBjaGFydC5cblx0ICogQSBib3ggaXMgc2ltcGx5IGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0IHJlcXVpcmVzIGxheW91dC4gZWcuIFNjYWxlcywgTGVnZW5kLCBUaXRsZS5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgdG8gdXNlXG5cdCAqIEBwYXJhbSB7TGF5b3V0SXRlbX0gaXRlbSAtIHRoZSBpdGVtIHRvIGFkZCB0byBiZSBsYWlkIG91dFxuXHQgKi9cbiAgYWRkQm94KGNoYXJ0LCBpdGVtKSB7XG4gICAgaWYgKCFjaGFydC5ib3hlcykge1xuICAgICAgY2hhcnQuYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBpbml0aWFsaXplIGl0ZW0gd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgIGl0ZW0uZnVsbFNpemUgPSBpdGVtLmZ1bGxTaXplIHx8IGZhbHNlO1xuICAgIGl0ZW0ucG9zaXRpb24gPSBpdGVtLnBvc2l0aW9uIHx8ICd0b3AnO1xuICAgIGl0ZW0ud2VpZ2h0ID0gaXRlbS53ZWlnaHQgfHwgMDtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaXRlbS5fbGF5ZXJzID0gaXRlbS5fbGF5ZXJzIHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHo6IDAsXG4gICAgICAgIGRyYXcoY2hhcnRBcmVhKSB7XG4gICAgICAgICAgaXRlbS5kcmF3KGNoYXJ0QXJlYSk7XG4gICAgICAgIH1cbiAgICAgIH1dO1xuICAgIH07XG5cbiAgICBjaGFydC5ib3hlcy5wdXNoKGl0ZW0pO1xuICB9LFxuXG4gIC8qKlxuXHQgKiBSZW1vdmUgYSBsYXlvdXRJdGVtIGZyb20gYSBjaGFydFxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydCB0byByZW1vdmUgdGhlIGJveCBmcm9tXG5cdCAqIEBwYXJhbSB7TGF5b3V0SXRlbX0gbGF5b3V0SXRlbSAtIHRoZSBpdGVtIHRvIHJlbW92ZSBmcm9tIHRoZSBsYXlvdXRcblx0ICovXG4gIHJlbW92ZUJveChjaGFydCwgbGF5b3V0SXRlbSkge1xuICAgIGNvbnN0IGluZGV4ID0gY2hhcnQuYm94ZXMgPyBjaGFydC5ib3hlcy5pbmRleE9mKGxheW91dEl0ZW0pIDogLTE7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgY2hhcnQuYm94ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG5cdCAqIFNldHMgKG9yIHVwZGF0ZXMpIG9wdGlvbnMgb24gdGhlIGdpdmVuIGBpdGVtYC5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgaW4gd2hpY2ggdGhlIGl0ZW0gbGl2ZXMgKG9yIHdpbGwgYmUgYWRkZWQgdG8pXG5cdCAqIEBwYXJhbSB7TGF5b3V0SXRlbX0gaXRlbSAtIHRoZSBpdGVtIHRvIGNvbmZpZ3VyZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gdGhlIG5ldyBpdGVtIG9wdGlvbnMuXG5cdCAqL1xuICBjb25maWd1cmUoY2hhcnQsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgICBpdGVtLmZ1bGxTaXplID0gb3B0aW9ucy5mdWxsU2l6ZTtcbiAgICBpdGVtLnBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbjtcbiAgICBpdGVtLndlaWdodCA9IG9wdGlvbnMud2VpZ2h0O1xuICB9LFxuXG4gIC8qKlxuXHQgKiBGaXRzIGJveGVzIG9mIHRoZSBnaXZlbiBjaGFydCBpbnRvIHRoZSBnaXZlbiBzaXplIGJ5IGhhdmluZyBlYWNoIGJveCBtZWFzdXJlIGl0c2VsZlxuXHQgKiB0aGVuIHJ1bm5pbmcgYSBmaXR0aW5nIGFsZ29yaXRobVxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggLSB0aGUgd2lkdGggdG8gZml0IGludG9cblx0ICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCAtIHRoZSBoZWlnaHQgdG8gZml0IGludG9cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pblBhZGRpbmcgLSBtaW5pbXVtIHBhZGRpbmcgcmVxdWlyZWQgZm9yIGVhY2ggc2lkZSBvZiBjaGFydCBhcmVhXG5cdCAqL1xuICB1cGRhdGUoY2hhcnQsIHdpZHRoLCBoZWlnaHQsIG1pblBhZGRpbmcpIHtcbiAgICBpZiAoIWNoYXJ0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhjaGFydC5vcHRpb25zLmxheW91dC5wYWRkaW5nKTtcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IE1hdGgubWF4KHdpZHRoIC0gcGFkZGluZy53aWR0aCwgMCk7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0IC0gcGFkZGluZy5oZWlnaHQsIDApO1xuICAgIGNvbnN0IGJveGVzID0gYnVpbGRMYXlvdXRCb3hlcyhjaGFydC5ib3hlcyk7XG4gICAgY29uc3QgdmVydGljYWxCb3hlcyA9IGJveGVzLnZlcnRpY2FsO1xuICAgIGNvbnN0IGhvcml6b250YWxCb3hlcyA9IGJveGVzLmhvcml6b250YWw7XG5cbiAgICAvLyBCZWZvcmUgYW55IGNoYW5nZXMgYXJlIG1hZGUsIG5vdGlmeSBib3hlcyB0aGF0IGFuIHVwZGF0ZSBpcyBhYm91dCB0byBiZWluZ1xuICAgIC8vIFRoaXMgaXMgdXNlZCB0byBjbGVhciBhbnkgY2FjaGVkIGRhdGEgKGUuZy4gc2NhbGUgbGltaXRzKVxuICAgIGVhY2goY2hhcnQuYm94ZXMsIGJveCA9PiB7XG4gICAgICBpZiAodHlwZW9mIGJveC5iZWZvcmVMYXlvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYm94LmJlZm9yZUxheW91dCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRXNzZW50aWFsbHkgd2Ugbm93IGhhdmUgYW55IG51bWJlciBvZiBib3hlcyBvbiBlYWNoIG9mIHRoZSA0IHNpZGVzLlxuICAgIC8vIE91ciBjYW52YXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLlxuICAgIC8vIFRoZSBhcmVhcyBMMSBhbmQgTDIgYXJlIHRoZSBsZWZ0IGF4ZXMuIFIxIGlzIHRoZSByaWdodCBheGlzLCBUMSBpcyB0aGUgdG9wIGF4aXMgYW5kXG4gICAgLy8gQjEgaXMgdGhlIGJvdHRvbSBheGlzXG4gICAgLy8gVGhlcmUgYXJlIGFsc28gNCBxdWFkcmFudC1saWtlIGxvY2F0aW9ucyAobGVmdCB0byByaWdodCBpbnN0ZWFkIG9mIGNsb2Nrd2lzZSkgcmVzZXJ2ZWQgZm9yIGNoYXJ0IG92ZXJsYXlzXG4gICAgLy8gVGhlc2UgbG9jYXRpb25zIGFyZSBzaW5nbGUtYm94IGxvY2F0aW9ucyBvbmx5LCB3aGVuIHRyeWluZyB0byByZWdpc3RlciBhIGNoYXJ0QXJlYSBsb2NhdGlvbiB0aGF0IGlzIGFscmVhZHkgdGFrZW4sXG4gICAgLy8gYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAgLy9cbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8ICAgICAgICAgICAgICAgICAgVDEgKEZ1bGwgV2lkdGgpICAgICAgICAgICAgICAgICAgIHxcbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgVDIgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8ICAgIHwtLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLXxcbiAgICAvLyB8ICAgIHwgICAgfCBDMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDMiB8ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfC0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS18ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8IEwxIHwgTDIgfCAgICAgICAgICAgQ2hhcnRBcmVhIChDMCkgICAgICAgICAgICB8IFIxIHxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfC0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS18ICAgIHxcbiAgICAvLyB8ICAgIHwgICAgfCBDMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDNCB8ICAgIHxcbiAgICAvLyB8ICAgIHwtLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLXxcbiAgICAvLyB8ICAgIHwgICAgfCAgICAgICAgICAgICAgICAgQjEgICAgICAgICAgICAgICAgICB8ICAgIHxcbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8ICAgICAgICAgICAgICAgICAgQjIgKEZ1bGwgV2lkdGgpICAgICAgICAgICAgICAgICAgIHxcbiAgICAvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAgICAvL1xuXG4gICAgY29uc3QgdmlzaWJsZVZlcnRpY2FsQm94Q291bnQgPSB2ZXJ0aWNhbEJveGVzLnJlZHVjZSgodG90YWwsIHdyYXApID0+XG4gICAgICB3cmFwLmJveC5vcHRpb25zICYmIHdyYXAuYm94Lm9wdGlvbnMuZGlzcGxheSA9PT0gZmFsc2UgPyB0b3RhbCA6IHRvdGFsICsgMSwgMCkgfHwgMTtcblxuICAgIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgb3V0ZXJXaWR0aDogd2lkdGgsXG4gICAgICBvdXRlckhlaWdodDogaGVpZ2h0LFxuICAgICAgcGFkZGluZyxcbiAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgYXZhaWxhYmxlSGVpZ2h0LFxuICAgICAgdkJveE1heFdpZHRoOiBhdmFpbGFibGVXaWR0aCAvIDIgLyB2aXNpYmxlVmVydGljYWxCb3hDb3VudCxcbiAgICAgIGhCb3hNYXhIZWlnaHQ6IGF2YWlsYWJsZUhlaWdodCAvIDJcbiAgICB9KTtcbiAgICBjb25zdCBtYXhQYWRkaW5nID0gT2JqZWN0LmFzc2lnbih7fSwgcGFkZGluZyk7XG4gICAgdXBkYXRlTWF4UGFkZGluZyhtYXhQYWRkaW5nLCB0b1BhZGRpbmcobWluUGFkZGluZykpO1xuICAgIGNvbnN0IGNoYXJ0QXJlYSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbWF4UGFkZGluZyxcbiAgICAgIHc6IGF2YWlsYWJsZVdpZHRoLFxuICAgICAgaDogYXZhaWxhYmxlSGVpZ2h0LFxuICAgICAgeDogcGFkZGluZy5sZWZ0LFxuICAgICAgeTogcGFkZGluZy50b3BcbiAgICB9LCBwYWRkaW5nKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHNldExheW91dERpbXModmVydGljYWxCb3hlcy5jb25jYXQoaG9yaXpvbnRhbEJveGVzKSwgcGFyYW1zKTtcblxuICAgIC8vIEZpcnN0IGZpdCB0aGUgZnVsbFNpemUgYm94ZXMsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiByZS1maXR0aW5nLlxuICAgIGZpdEJveGVzKGJveGVzLmZ1bGxTaXplLCBjaGFydEFyZWEsIHBhcmFtcywgc3RhY2tzKTtcblxuICAgIC8vIFRoZW4gZml0IHZlcnRpY2FsIGJveGVzXG4gICAgZml0Qm94ZXModmVydGljYWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG5cbiAgICAvLyBUaGVuIGZpdCBob3Jpem9udGFsIGJveGVzXG4gICAgaWYgKGZpdEJveGVzKGhvcml6b250YWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcykpIHtcbiAgICAgIC8vIGlmIHRoZSBhcmVhIGNoYW5nZWQsIHJlLWZpdCB2ZXJ0aWNhbCBib3hlc1xuICAgICAgZml0Qm94ZXModmVydGljYWxCb3hlcywgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG4gICAgfVxuXG4gICAgaGFuZGxlTWF4UGFkZGluZyhjaGFydEFyZWEpO1xuXG4gICAgLy8gRmluYWxseSBwbGFjZSB0aGUgYm94ZXMgdG8gY29ycmVjdCBjb29yZGluYXRlc1xuICAgIHBsYWNlQm94ZXMoYm94ZXMubGVmdEFuZFRvcCwgY2hhcnRBcmVhLCBwYXJhbXMsIHN0YWNrcyk7XG5cbiAgICAvLyBNb3ZlIHRvIG9wcG9zaXRlIHNpZGUgb2YgY2hhcnRcbiAgICBjaGFydEFyZWEueCArPSBjaGFydEFyZWEudztcbiAgICBjaGFydEFyZWEueSArPSBjaGFydEFyZWEuaDtcblxuICAgIHBsYWNlQm94ZXMoYm94ZXMucmlnaHRBbmRCb3R0b20sIGNoYXJ0QXJlYSwgcGFyYW1zLCBzdGFja3MpO1xuXG4gICAgY2hhcnQuY2hhcnRBcmVhID0ge1xuICAgICAgbGVmdDogY2hhcnRBcmVhLmxlZnQsXG4gICAgICB0b3A6IGNoYXJ0QXJlYS50b3AsXG4gICAgICByaWdodDogY2hhcnRBcmVhLmxlZnQgKyBjaGFydEFyZWEudyxcbiAgICAgIGJvdHRvbTogY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5oLFxuICAgICAgaGVpZ2h0OiBjaGFydEFyZWEuaCxcbiAgICAgIHdpZHRoOiBjaGFydEFyZWEudyxcbiAgICB9O1xuXG4gICAgLy8gRmluYWxseSB1cGRhdGUgYm94ZXMgaW4gY2hhcnRBcmVhIChyYWRpYWwgc2NhbGUgZm9yIGV4YW1wbGUpXG4gICAgZWFjaChib3hlcy5jaGFydEFyZWEsIChsYXlvdXQpID0+IHtcbiAgICAgIGNvbnN0IGJveCA9IGxheW91dC5ib3g7XG4gICAgICBPYmplY3QuYXNzaWduKGJveCwgY2hhcnQuY2hhcnRBcmVhKTtcbiAgICAgIGJveC51cGRhdGUoY2hhcnRBcmVhLncsIGNoYXJ0QXJlYS5oLCB7bGVmdDogMCwgdG9wOiAwLCByaWdodDogMCwgYm90dG9tOiAwfSk7XG4gICAgfSk7XG4gIH1cbn07XG4iLCAiXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICovXG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgdGhhdCBhbGxvd3MgYWJzdHJhY3RpbmcgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIGF3YXkgZnJvbSB0aGUgY2hhcnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VQbGF0Zm9ybSB7XG4gIC8qKlxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgY29uc3RydWN0aW9uIHRpbWUsIHJldHVybnMgYSBjb250ZXh0MmQgaW5zdGFuY2UgaW1wbGVtZW50aW5nXG5cdCAqIHRoZSBbVzNDIENhbnZhcyAyRCBDb250ZXh0IEFQSSBzdGFuZGFyZF17QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSLzJkY29udGV4dC99LlxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXMgLSBUaGUgY2FudmFzIGZyb20gd2hpY2ggdG8gYWNxdWlyZSBjb250ZXh0IChwbGF0Zm9ybSBzcGVjaWZpYylcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb10gLSBUaGUgY2hhcnQgb3B0aW9uc1xuXHQgKi9cbiAgYWNxdWlyZUNvbnRleHQoY2FudmFzLCBhc3BlY3RSYXRpbykge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8qKlxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgZGVzdHJ1Y3Rpb24gdGltZSwgcmVsZWFzZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0XG5cdCAqIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgdGhlIGFjcXVpcmVDb250ZXh0KCkgbWV0aG9kLlxuXHQgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCAtIFRoZSBjb250ZXh0MmQgaW5zdGFuY2Vcblx0ICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIG1ldGhvZCBzdWNjZWVkZWQsIGVsc2UgZmFsc2Vcblx0ICovXG4gIHJlbGVhc2VDb250ZXh0KGNvbnRleHQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZWdpc3RlcnMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBvbiB0aGUgZ2l2ZW4gY2hhcnQuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gQ2hhcnQgZnJvbSB3aGljaCB0byBsaXN0ZW4gZm9yIGV2ZW50XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gVGhlICh7QGxpbmsgQ2hhcnRFdmVudH0pIHR5cGUgdG8gbGlzdGVuIGZvclxuXHQgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciAtIFJlY2VpdmVzIGEgbm90aWZpY2F0aW9uIChhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzXG5cdCAqIHRoZSB7QGxpbmsgQ2hhcnRFdmVudH0gaW50ZXJmYWNlKSB3aGVuIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBvY2N1cnMuXG5cdCAqL1xuICBhZGRFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggYWRkRXZlbnRMaXN0ZW5lci5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBDaGFydCBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgLSBUaGUgKHtAbGluayBDaGFydEV2ZW50fSkgdHlwZSB0byByZW1vdmVcblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50IHRhcmdldC5cblx0ICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjdXJyZW50IGRldmljZVBpeGVsUmF0aW8gb2YgdGhlIGRldmljZSB0aGlzIHBsYXRmb3JtIGlzIGNvbm5lY3RlZCB0by5cblx0ICovXG4gIGdldERldmljZVBpeGVsUmF0aW8oKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgbWF4aW11bSBzaXplIGluIHBpeGVscyBvZiBnaXZlbiBjYW52YXMgZWxlbWVudC5cblx0ICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gZWxlbWVudFxuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIGNvbnRlbnQgd2lkdGggb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gY29udGVudCBoZWlnaHQgb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb10gLSBhc3BlY3QgcmF0aW8gdG8gbWFpbnRhaW5cblx0ICovXG4gIGdldE1heGltdW1TaXplKGVsZW1lbnQsIHdpZHRoLCBoZWlnaHQsIGFzcGVjdFJhdGlvKSB7XG4gICAgd2lkdGggPSBNYXRoLm1heCgwLCB3aWR0aCB8fCBlbGVtZW50LndpZHRoKTtcbiAgICBoZWlnaHQgPSBoZWlnaHQgfHwgZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0OiBNYXRoLm1heCgwLCBhc3BlY3RSYXRpbyA/IE1hdGguZmxvb3Iod2lkdGggLyBhc3BlY3RSYXRpbykgOiBoZWlnaHQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcblx0ICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGNhbnZhcyBpcyBhdHRhY2hlZCB0byB0aGUgcGxhdGZvcm0sIGZhbHNlIGlmIG5vdC5cblx0ICovXG4gIGlzQXR0YWNoZWQoY2FudmFzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGNvbmZpZyB3aXRoIHBsYXRmb3JtIHNwZWNpZmljIHJlcXVpcmVtZW50c1xuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vY29yZS9jb3JlLmNvbmZpZy5qcycpLmRlZmF1bHR9IGNvbmZpZ1xuICAgKi9cbiAgdXBkYXRlQ29uZmlnKGNvbmZpZykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgLy8gbm8tb3BcbiAgfVxufVxuIiwgIi8qKlxuICogUGxhdGZvcm0gZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gKG1pbmltYWwpLlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1OTEjaXNzdWVjb21tZW50LTMxOTU3NTkzOVxuICovXG5cbmltcG9ydCBCYXNlUGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5iYXNlLmpzJztcblxuLyoqXG4gKiBQbGF0Zm9ybSBjbGFzcyBmb3IgY2hhcnRzIHdpdGhvdXQgYWNjZXNzIHRvIHRoZSBET00gb3IgdG8gbWFueSBlbGVtZW50IHByb3BlcnRpZXNcbiAqIFRoaXMgcGxhdGZvcm0gaXMgdXNlZCBieSBkZWZhdWx0IGZvciBhbnkgY2hhcnQgcGFzc2VkIGFuIE9mZnNjcmVlbkNhbnZhcy5cbiAqIEBleHRlbmRzIEJhc2VQbGF0Zm9ybVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNpY1BsYXRmb3JtIGV4dGVuZHMgQmFzZVBsYXRmb3JtIHtcbiAgYWNxdWlyZUNvbnRleHQoaXRlbSkge1xuICAgIC8vIFRvIHByZXZlbnQgY2FudmFzIGZpbmdlcnByaW50aW5nLCBzb21lIGFkZC1vbnMgdW5kZWZpbmUgdGhlIGdldENvbnRleHRcbiAgICAvLyBtZXRob2QsIGZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20va2thcHNuZXIvQ2FudmFzQmxvY2tlclxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yODA3XG4gICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5nZXRDb250ZXh0ICYmIGl0ZW0uZ2V0Q29udGV4dCgnMmQnKSB8fCBudWxsO1xuICB9XG4gIHVwZGF0ZUNvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcub3B0aW9ucy5hbmltYXRpb24gPSBmYWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQ2hhcnQuUGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHRhcmdldGluZyBhIHdlYiBicm93c2VyXG4gKi9cblxuaW1wb3J0IEJhc2VQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmJhc2UuanMnO1xuaW1wb3J0IHtfZ2V0UGFyZW50Tm9kZSwgZ2V0UmVsYXRpdmVQb3NpdGlvbiwgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucywgcmVhZFVzZWRTaXplLCBnZXRNYXhpbXVtU2l6ZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmRvbS5qcyc7XG5pbXBvcnQge3Rocm90dGxlZH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5pbXBvcnQge2lzTnVsbE9yVW5kZWZ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vY29yZS9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqL1xuXG5jb25zdCBFWFBBTkRPX0tFWSA9ICckY2hhcnRqcyc7XG5cbi8qKlxuICogRE9NIGV2ZW50IHR5cGVzIC0+IENoYXJ0LmpzIGV2ZW50IHR5cGVzLlxuICogTm90ZTogb25seSBldmVudHMgd2l0aCBkaWZmZXJlbnQgdHlwZXMgYXJlIG1hcHBlZC5cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzXG4gKi9cbmNvbnN0IEVWRU5UX1RZUEVTID0ge1xuICB0b3VjaHN0YXJ0OiAnbW91c2Vkb3duJyxcbiAgdG91Y2htb3ZlOiAnbW91c2Vtb3ZlJyxcbiAgdG91Y2hlbmQ6ICdtb3VzZXVwJyxcbiAgcG9pbnRlcmVudGVyOiAnbW91c2VlbnRlcicsXG4gIHBvaW50ZXJkb3duOiAnbW91c2Vkb3duJyxcbiAgcG9pbnRlcm1vdmU6ICdtb3VzZW1vdmUnLFxuICBwb2ludGVydXA6ICdtb3VzZXVwJyxcbiAgcG9pbnRlcmxlYXZlOiAnbW91c2VvdXQnLFxuICBwb2ludGVyb3V0OiAnbW91c2VvdXQnXG59O1xuXG5jb25zdCBpc051bGxPckVtcHR5ID0gdmFsdWUgPT4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnO1xuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgY2FudmFzIHN0eWxlIGFuZCByZW5kZXIgc2l6ZSB3aXRob3V0IG1vZGlmeWluZyB0aGUgY2FudmFzIGRpc3BsYXkgc2l6ZSxcbiAqIHNpbmNlIHJlc3BvbnNpdmVuZXNzIGlzIGhhbmRsZWQgYnkgdGhlIGNvbnRyb2xsZXIucmVzaXplKCkgbWV0aG9kLiBUaGUgY29uZmlnIGlzIHVzZWRcbiAqIHRvIGRldGVybWluZSB0aGUgYXNwZWN0IHJhdGlvIHRvIGFwcGx5IGluIGNhc2Ugbm8gZXhwbGljaXQgaGVpZ2h0IGhhcyBiZWVuIHNwZWNpZmllZC5cbiAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb11cbiAqL1xuZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gIGNvbnN0IHN0eWxlID0gY2FudmFzLnN0eWxlO1xuXG4gIC8vIE5PVEUoU0IpIGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykgIT09IGNhbnZhcy53aWR0aDogaW4gdGhlIGZpcnN0IGNhc2UgaXRcbiAgLy8gcmV0dXJucyBudWxsIG9yICcnIGlmIG5vIGV4cGxpY2l0IHZhbHVlIGhhcyBiZWVuIHNldCB0byB0aGUgY2FudmFzIGF0dHJpYnV0ZS5cbiAgY29uc3QgcmVuZGVySGVpZ2h0ID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gIGNvbnN0IHJlbmRlcldpZHRoID0gY2FudmFzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKTtcblxuICAvLyBDaGFydC5qcyBtb2RpZmllcyBzb21lIGNhbnZhcyB2YWx1ZXMgdGhhdCB3ZSB3YW50IHRvIHJlc3RvcmUgb24gZGVzdHJveVxuICBjYW52YXNbRVhQQU5ET19LRVldID0ge1xuICAgIGluaXRpYWw6IHtcbiAgICAgIGhlaWdodDogcmVuZGVySGVpZ2h0LFxuICAgICAgd2lkdGg6IHJlbmRlcldpZHRoLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogc3R5bGUuZGlzcGxheSxcbiAgICAgICAgaGVpZ2h0OiBzdHlsZS5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBzdHlsZS53aWR0aFxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBGb3JjZSBjYW52YXMgdG8gZGlzcGxheSBhcyBibG9jayB0byBhdm9pZCBleHRyYSBzcGFjZSBjYXVzZWQgYnkgaW5saW5lXG4gIC8vIGVsZW1lbnRzLCB3aGljaCB3b3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVzcG9uc2l2ZSByZXNpemUgcHJvY2Vzcy5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI1MzhcbiAgc3R5bGUuZGlzcGxheSA9IHN0eWxlLmRpc3BsYXkgfHwgJ2Jsb2NrJztcbiAgLy8gSW5jbHVkZSBwb3NzaWJsZSBib3JkZXJzIGluIHRoZSBzaXplXG4gIHN0eWxlLmJveFNpemluZyA9IHN0eWxlLmJveFNpemluZyB8fCAnYm9yZGVyLWJveCc7XG5cbiAgaWYgKGlzTnVsbE9yRW1wdHkocmVuZGVyV2lkdGgpKSB7XG4gICAgY29uc3QgZGlzcGxheVdpZHRoID0gcmVhZFVzZWRTaXplKGNhbnZhcywgJ3dpZHRoJyk7XG4gICAgaWYgKGRpc3BsYXlXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYW52YXMud2lkdGggPSBkaXNwbGF5V2lkdGg7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzTnVsbE9yRW1wdHkocmVuZGVySGVpZ2h0KSkge1xuICAgIGlmIChjYW52YXMuc3R5bGUuaGVpZ2h0ID09PSAnJykge1xuICAgICAgLy8gSWYgbm8gZXhwbGljaXQgcmVuZGVyIGhlaWdodCBhbmQgc3R5bGUgaGVpZ2h0LCBsZXQncyBhcHBseSB0aGUgYXNwZWN0IHJhdGlvLFxuICAgICAgLy8gd2hpY2ggb25lIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgYnV0IGFsc28gYnkgY2hhcnRzIGFzIGRlZmF1bHQgb3B0aW9uXG4gICAgICAvLyAoaS5lLiBvcHRpb25zLmFzcGVjdFJhdGlvKS4gSWYgbm90IHNwZWNpZmllZCwgdXNlIGNhbnZhcyBhc3BlY3QgcmF0aW8gb2YgMi5cbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBjYW52YXMud2lkdGggLyAoYXNwZWN0UmF0aW8gfHwgMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlIZWlnaHQgPSByZWFkVXNlZFNpemUoY2FudmFzLCAnaGVpZ2h0Jyk7XG4gICAgICBpZiAoZGlzcGxheUhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkaXNwbGF5SGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjYW52YXM7XG59XG5cbi8vIERlZmF1bHQgcGFzc2l2ZSB0byB0cnVlIGFzIGV4cGVjdGVkIGJ5IENocm9tZSBmb3IgJ3RvdWNoc3RhcnQnIGFuZCAndG91Y2hlbmQnIGV2ZW50cy5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80Mjg3XG5jb25zdCBldmVudExpc3RlbmVyT3B0aW9ucyA9IHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZTtcblxuZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgbm9kZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICBjaGFydC5jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSB7XG4gIGNvbnN0IHR5cGUgPSBFVkVOVF9UWVBFU1tldmVudC50eXBlXSB8fCBldmVudC50eXBlO1xuICBjb25zdCB7eCwgeX0gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGV2ZW50LCBjaGFydCk7XG4gIHJldHVybiB7XG4gICAgdHlwZSxcbiAgICBjaGFydCxcbiAgICBuYXRpdmU6IGV2ZW50LFxuICAgIHg6IHggIT09IHVuZGVmaW5lZCA/IHggOiBudWxsLFxuICAgIHk6IHkgIT09IHVuZGVmaW5lZCA/IHkgOiBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub2RlTGlzdENvbnRhaW5zKG5vZGVMaXN0LCBjYW52YXMpIHtcbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVMaXN0KSB7XG4gICAgaWYgKG5vZGUgPT09IGNhbnZhcyB8fCBub2RlLmNvbnRhaW5zKGNhbnZhcykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVBdHRhY2hPYnNlcnZlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGxldCB0cmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICB0cmlnZ2VyID0gdHJpZ2dlciB8fCBub2RlTGlzdENvbnRhaW5zKGVudHJ5LmFkZGVkTm9kZXMsIGNhbnZhcyk7XG4gICAgICB0cmlnZ2VyID0gdHJpZ2dlciAmJiAhbm9kZUxpc3RDb250YWlucyhlbnRyeS5yZW1vdmVkTm9kZXMsIGNhbnZhcyk7XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfSk7XG4gIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9KTtcbiAgcmV0dXJuIG9ic2VydmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZXRhY2hPYnNlcnZlcihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgY29uc3QgY2FudmFzID0gY2hhcnQuY2FudmFzO1xuICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgIGxldCB0cmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICB0cmlnZ2VyID0gdHJpZ2dlciB8fCBub2RlTGlzdENvbnRhaW5zKGVudHJ5LnJlbW92ZWROb2RlcywgY2FudmFzKTtcbiAgICAgIHRyaWdnZXIgPSB0cmlnZ2VyICYmICFub2RlTGlzdENvbnRhaW5zKGVudHJ5LmFkZGVkTm9kZXMsIGNhbnZhcyk7XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyKSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfSk7XG4gIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9KTtcbiAgcmV0dXJuIG9ic2VydmVyO1xufVxuXG5jb25zdCBkcnBMaXN0ZW5pbmdDaGFydHMgPSBuZXcgTWFwKCk7XG5sZXQgb2xkRGV2aWNlUGl4ZWxSYXRpbyA9IDA7XG5cbmZ1bmN0aW9uIG9uV2luZG93UmVzaXplKCkge1xuICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgaWYgKGRwciA9PT0gb2xkRGV2aWNlUGl4ZWxSYXRpbykge1xuICAgIHJldHVybjtcbiAgfVxuICBvbGREZXZpY2VQaXhlbFJhdGlvID0gZHByO1xuICBkcnBMaXN0ZW5pbmdDaGFydHMuZm9yRWFjaCgocmVzaXplLCBjaGFydCkgPT4ge1xuICAgIGlmIChjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyAhPT0gZHByKSB7XG4gICAgICByZXNpemUoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCwgcmVzaXplKSB7XG4gIGlmICghZHJwTGlzdGVuaW5nQ2hhcnRzLnNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25XaW5kb3dSZXNpemUpO1xuICB9XG4gIGRycExpc3RlbmluZ0NoYXJ0cy5zZXQoY2hhcnQsIHJlc2l6ZSk7XG59XG5cbmZ1bmN0aW9uIHVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQpIHtcbiAgZHJwTGlzdGVuaW5nQ2hhcnRzLmRlbGV0ZShjaGFydCk7XG4gIGlmICghZHJwTGlzdGVuaW5nQ2hhcnRzLnNpemUpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgb25XaW5kb3dSZXNpemUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlc2l6ZU9ic2VydmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcyAmJiBfZ2V0UGFyZW50Tm9kZShjYW52YXMpO1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZXNpemUgPSB0aHJvdHRsZWQoKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCB3ID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgIGxpc3RlbmVyKHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmICh3IDwgY29udGFpbmVyLmNsaWVudFdpZHRoKSB7XG4gICAgICAvLyBJZiB0aGUgY29udGFpbmVyIHNpemUgc2hyYW5rIGR1cmluZyBjaGFydCByZXNpemUsIGxldCdzIGFzc3VtZVxuICAgICAgLy8gc2Nyb2xsYmFyIGFwcGVhcmVkLiBTbyB3ZSByZXNpemUgYWdhaW4gd2l0aCB0aGUgc2Nyb2xsYmFyIHZpc2libGUgLVxuICAgICAgLy8gZWZmZWN0aXZlbHkgbWFraW5nIGNoYXJ0IHNtYWxsZXIgYW5kIHRoZSBzY3JvbGxiYXIgaGlkZGVuIGFnYWluLlxuICAgICAgLy8gQmVjYXVzZSB3ZSBhcmUgaW5zaWRlIGB0aHJvdHRsZWRgLCBhbmQgY3VycmVudGx5IGB0aWNraW5nYCwgc2Nyb2xsXG4gICAgICAvLyBldmVudHMgYXJlIGlnbm9yZWQgZHVyaW5nIHRoaXMgd2hvbGUgMiByZXNpemUgcHJvY2Vzcy5cbiAgICAgIC8vIElmIHdlIGFzc3VtZWQgd3JvbmcgYW5kIHNvbWV0aGluZyBlbHNlIGhhcHBlbmVkLCB3ZSBhcmUgcmVzaXppbmdcbiAgICAgIC8vIHR3aWNlIGluIGEgZnJhbWUgKHBvdGVudGlhbCBwZXJmb3JtYW5jZSBpc3N1ZSlcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICB9LCB3aW5kb3cpO1xuXG4gIC8vIEB0cy1pZ25vcmUgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNzg2MSBpbXBsZW1lbnRlZFxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihlbnRyaWVzID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbMF07XG4gICAgY29uc3Qgd2lkdGggPSBlbnRyeS5jb250ZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBoZWlnaHQgPSBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQ7XG4gICAgLy8gV2hlbiBpdHMgY29udGFpbmVyJ3MgZGlzcGxheSBpcyBzZXQgdG8gJ25vbmUnIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFcbiAgICAvLyBzaXplIG9mICgwLCAwKSwgd2hpY2ggd2lsbCBjYXVzZSB0aGUgY2hhcnQgdG8gbG9zZSBpdHMgb3JpZ2luYWwgaGVpZ2h0LCBzbyBza2lwXG4gICAgLy8gcmVzaXppbmcgaW4gc3VjaCBjYXNlLlxuICAgIGlmICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9KTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpO1xuICBsaXN0ZW5EZXZpY2VQaXhlbFJhdGlvQ2hhbmdlcyhjaGFydCwgcmVzaXplKTtcblxuICByZXR1cm4gb2JzZXJ2ZXI7XG59XG5cbmZ1bmN0aW9uIHJlbGVhc2VPYnNlcnZlcihjaGFydCwgdHlwZSwgb2JzZXJ2ZXIpIHtcbiAgaWYgKG9ic2VydmVyKSB7XG4gICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9XG4gIGlmICh0eXBlID09PSAncmVzaXplJykge1xuICAgIHVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMoY2hhcnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3h5QW5kTGlzdGVuKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICBjb25zdCBjYW52YXMgPSBjaGFydC5jYW52YXM7XG4gIGNvbnN0IHByb3h5ID0gdGhyb3R0bGVkKChldmVudCkgPT4ge1xuICAgIC8vIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgdGhlIGNoYXJ0IGlzIGRlc3Ryb3llZCB3aGlsZSB3YWl0aW5nXG4gICAgLy8gZm9yIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gdG8gb2NjdXIuIFdlIHByZXZlbnQgY3Jhc2hlcyBieSBjaGVja2luZ1xuICAgIC8vIGZvciBhIGRlc3Ryb3llZCBjaGFydFxuICAgIGlmIChjaGFydC5jdHggIT09IG51bGwpIHtcbiAgICAgIGxpc3RlbmVyKGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpKTtcbiAgICB9XG4gIH0sIGNoYXJ0KTtcblxuICBhZGRMaXN0ZW5lcihjYW52YXMsIHR5cGUsIHByb3h5KTtcblxuICByZXR1cm4gcHJveHk7XG59XG5cbi8qKlxuICogUGxhdGZvcm0gY2xhc3MgZm9yIGNoYXJ0cyB0aGF0IGNhbiBhY2Nlc3MgdGhlIERPTSBhbmQgZ2xvYmFsIHdpbmRvdy9kb2N1bWVudCBwcm9wZXJ0aWVzXG4gKiBAZXh0ZW5kcyBCYXNlUGxhdGZvcm1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9tUGxhdGZvcm0gZXh0ZW5kcyBCYXNlUGxhdGZvcm0ge1xuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0hUTUxDYW52YXNFbGVtZW50fSBjYW52YXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb11cblx0ICogQHJldHVybiB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfG51bGx9XG5cdCAqL1xuICBhY3F1aXJlQ29udGV4dChjYW52YXMsIGFzcGVjdFJhdGlvKSB7XG4gICAgLy8gVG8gcHJldmVudCBjYW52YXMgZmluZ2VycHJpbnRpbmcsIHNvbWUgYWRkLW9ucyB1bmRlZmluZSB0aGUgZ2V0Q29udGV4dFxuICAgIC8vIG1ldGhvZCwgZm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ra2Fwc25lci9DYW52YXNCbG9ja2VyXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI4MDdcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzICYmIGNhbnZhcy5nZXRDb250ZXh0ICYmIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgLy8gYGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEYCBmYWlscyB3aGVuIHRoZSBjYW52YXMgaXNcbiAgICAvLyBpbnNpZGUgYW4gaWZyYW1lIG9yIHdoZW4gcnVubmluZyBpbiBhIHByb3RlY3RlZCBlbnZpcm9ubWVudC4gV2UgY291bGQgZ3Vlc3MgdGhlXG4gICAgLy8gdHlwZXMgZnJvbSB0aGVpciB0b1N0cmluZygpIHZhbHVlIGJ1dCBsZXQncyBrZWVwIHRoaW5ncyBmbGV4aWJsZSBhbmQgYXNzdW1lIGl0J3NcbiAgICAvLyBhIHN1ZmZpY2llbnQgY29uZGl0aW9uIGlmIHRoZSBjYW52YXMgaGFzIGEgY29udGV4dDJEIHdoaWNoIGhhcyBjYW52YXMgYXMgYGNhbnZhc2AuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM4ODdcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNDEwMlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80MTUyXG4gICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5jYW52YXMgPT09IGNhbnZhcykge1xuICAgICAgLy8gTG9hZCBwbGF0Zm9ybSByZXNvdXJjZXMgb24gZmlyc3QgY2hhcnQgY3JlYXRpb24sIHRvIG1ha2UgaXQgcG9zc2libGUgdG9cbiAgICAgIC8vIGltcG9ydCB0aGUgbGlicmFyeSBiZWZvcmUgc2V0dGluZyBwbGF0Zm9ybSBvcHRpb25zLlxuICAgICAgaW5pdENhbnZhcyhjYW52YXMsIGFzcGVjdFJhdGlvKTtcbiAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjb250ZXh0XG5cdCAqL1xuICByZWxlYXNlQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29uc3QgY2FudmFzID0gY29udGV4dC5jYW52YXM7XG4gICAgaWYgKCFjYW52YXNbRVhQQU5ET19LRVldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbCA9IGNhbnZhc1tFWFBBTkRPX0tFWV0uaW5pdGlhbDtcbiAgICBbJ2hlaWdodCcsICd3aWR0aCddLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5pdGlhbFtwcm9wXTtcbiAgICAgIGlmIChpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgICBjYW52YXMucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZShwcm9wLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzdHlsZSA9IGluaXRpYWwuc3R5bGUgfHwge307XG4gICAgT2JqZWN0LmtleXMoc3R5bGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY2FudmFzLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGNhbnZhcyByZW5kZXIgc2l6ZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCAoYW5kIHRodXMgdGhlIHN0YXRlIHN0YWNrIGRpc2NhcmRlZCksXG4gICAgLy8gd2UgY2FuJ3QgdXNlIHNhdmUoKSBhbmQgcmVzdG9yZSgpIHRvIHJlc3RvcmUgdGhlIGluaXRpYWwgc3RhdGUuIFNvIG1ha2Ugc3VyZSB0aGF0IGF0XG4gICAgLy8gbGVhc3QgdGhlIGNhbnZhcyBjb250ZXh0IGlzIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHN0YXRlIGJ5IHNldHRpbmcgdGhlIGNhbnZhcyB3aWR0aC5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1odG1sNS0yMDExMDUyNS90aGUtY2FudmFzLWVsZW1lbnQuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy53aWR0aDtcblxuICAgIGRlbGV0ZSBjYW52YXNbRVhQQU5ET19LRVldO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG5cdCAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG5cdCAqL1xuICBhZGRFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuICAgIC8vIENhbiBoYXZlIG9ubHkgb25lIGxpc3RlbmVyIHBlciB0eXBlLCBzbyBtYWtlIHN1cmUgcHJldmlvdXMgaXMgcmVtb3ZlZFxuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjaGFydCwgdHlwZSk7XG5cbiAgICBjb25zdCBwcm94aWVzID0gY2hhcnQuJHByb3hpZXMgfHwgKGNoYXJ0LiRwcm94aWVzID0ge30pO1xuICAgIGNvbnN0IGhhbmRsZXJzID0ge1xuICAgICAgYXR0YWNoOiBjcmVhdGVBdHRhY2hPYnNlcnZlcixcbiAgICAgIGRldGFjaDogY3JlYXRlRGV0YWNoT2JzZXJ2ZXIsXG4gICAgICByZXNpemU6IGNyZWF0ZVJlc2l6ZU9ic2VydmVyXG4gICAgfTtcbiAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbdHlwZV0gfHwgY3JlYXRlUHJveHlBbmRMaXN0ZW47XG4gICAgcHJveGllc1t0eXBlXSA9IGhhbmRsZXIoY2hhcnQsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG5cdCAqL1xuICByZW1vdmVFdmVudExpc3RlbmVyKGNoYXJ0LCB0eXBlKSB7XG4gICAgY29uc3QgcHJveGllcyA9IGNoYXJ0LiRwcm94aWVzIHx8IChjaGFydC4kcHJveGllcyA9IHt9KTtcbiAgICBjb25zdCBwcm94eSA9IHByb3hpZXNbdHlwZV07XG5cbiAgICBpZiAoIXByb3h5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgICBhdHRhY2g6IHJlbGVhc2VPYnNlcnZlcixcbiAgICAgIGRldGFjaDogcmVsZWFzZU9ic2VydmVyLFxuICAgICAgcmVzaXplOiByZWxlYXNlT2JzZXJ2ZXJcbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1t0eXBlXSB8fCByZW1vdmVMaXN0ZW5lcjtcbiAgICBoYW5kbGVyKGNoYXJ0LCB0eXBlLCBwcm94eSk7XG4gICAgcHJveGllc1t0eXBlXSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldERldmljZVBpeGVsUmF0aW8oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7SFRNTENhbnZhc0VsZW1lbnR9IGNhbnZhc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIGNvbnRlbnQgd2lkdGggb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtoZWlnaHRdIC0gY29udGVudCBoZWlnaHQgb2YgcGFyZW50IGVsZW1lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IFthc3BlY3RSYXRpb10gLSBhc3BlY3QgcmF0aW8gdG8gbWFpbnRhaW5cblx0ICovXG4gIGdldE1heGltdW1TaXplKGNhbnZhcywgd2lkdGgsIGhlaWdodCwgYXNwZWN0UmF0aW8pIHtcbiAgICByZXR1cm4gZ2V0TWF4aW11bVNpemUoY2FudmFzLCB3aWR0aCwgaGVpZ2h0LCBhc3BlY3RSYXRpbyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzXG5cdCAqL1xuICBpc0F0dGFjaGVkKGNhbnZhcykge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IF9nZXRQYXJlbnROb2RlKGNhbnZhcyk7XG4gICAgcmV0dXJuICEhKGNvbnRhaW5lciAmJiBjb250YWluZXIuaXNDb25uZWN0ZWQpO1xuICB9XG59XG4iLCAiaW1wb3J0IHtfaXNEb21TdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IEJhc2VQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmJhc2UuanMnO1xuaW1wb3J0IEJhc2ljUGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5iYXNpYy5qcyc7XG5pbXBvcnQgRG9tUGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5kb20uanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gX2RldGVjdFBsYXRmb3JtKGNhbnZhcykge1xuICBpZiAoIV9pc0RvbVN1cHBvcnRlZCgpIHx8ICh0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJyAmJiBjYW52YXMgaW5zdGFuY2VvZiBPZmZzY3JlZW5DYW52YXMpKSB7XG4gICAgcmV0dXJuIEJhc2ljUGxhdGZvcm07XG4gIH1cbiAgcmV0dXJuIERvbVBsYXRmb3JtO1xufVxuXG5leHBvcnQge0Jhc2VQbGF0Zm9ybSwgQmFzaWNQbGF0Zm9ybSwgRG9tUGxhdGZvcm19O1xuIiwgImltcG9ydCB0eXBlIHtBbnlPYmplY3R9IGZyb20gJy4uL3R5cGVzL2Jhc2ljLmpzJztcbmltcG9ydCB0eXBlIHtQb2ludH0gZnJvbSAnLi4vdHlwZXMvZ2VvbWV0cmljLmpzJztcbmltcG9ydCB0eXBlIHtBbmltYXRpb259IGZyb20gJy4uL3R5cGVzL2FuaW1hdGlvbi5qcyc7XG5pbXBvcnQge2lzTnVtYmVyfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZW1lbnQ8VCA9IEFueU9iamVjdCwgTyA9IEFueU9iamVjdD4ge1xuXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHt9O1xuICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHVuZGVmaW5lZDtcblxuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgYWN0aXZlID0gZmFsc2U7XG4gIG9wdGlvbnM6IE87XG4gICRhbmltYXRpb25zOiBSZWNvcmQ8a2V5b2YgVCwgQW5pbWF0aW9uPjtcblxuICB0b29sdGlwUG9zaXRpb24odXNlRmluYWxQb3NpdGlvbjogYm9vbGVhbik6IFBvaW50IHtcbiAgICBjb25zdCB7eCwgeX0gPSB0aGlzLmdldFByb3BzKFsneCcsICd5J10sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIHJldHVybiB7eCwgeX0gYXMgUG9pbnQ7XG4gIH1cblxuICBoYXNWYWx1ZSgpIHtcbiAgICByZXR1cm4gaXNOdW1iZXIodGhpcy54KSAmJiBpc051bWJlcih0aGlzLnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgb3IgZmluYWwgdmFsdWUgb2YgZWFjaCBwcm9wLiBDYW4gcmV0dXJuIGV4dHJhIHByb3BlcnRpZXMgKHdob2xlIG9iamVjdCkuXG4gICAqIEBwYXJhbSBwcm9wcyAtIHByb3BlcnRpZXMgdG8gZ2V0XG4gICAqIEBwYXJhbSBbZmluYWxdIC0gZ2V0IHRoZSBmaW5hbCB2YWx1ZSAoYW5pbWF0aW9uIHRhcmdldClcbiAgICovXG4gIGdldFByb3BzPFAgZXh0ZW5kcyAoa2V5b2YgVClbXT4ocHJvcHM6IFAsIGZpbmFsPzogYm9vbGVhbik6IFBpY2s8VCwgUFtudW1iZXJdPjtcbiAgZ2V0UHJvcHM8UCBleHRlbmRzIHN0cmluZz4ocHJvcHM6IFBbXSwgZmluYWw/OiBib29sZWFuKTogUGFydGlhbDxSZWNvcmQ8UCwgdW5rbm93bj4+O1xuICBnZXRQcm9wcyhwcm9wczogc3RyaW5nW10sIGZpbmFsPzogYm9vbGVhbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBhbmltcyA9IHRoaXMuJGFuaW1hdGlvbnM7XG4gICAgaWYgKCFmaW5hbCB8fCAhYW5pbXMpIHtcbiAgICAgIC8vIGxldCdzIG5vdCBjcmVhdGUgYW4gb2JqZWN0LCBpZiBub3QgbmVlZGVkXG4gICAgICByZXR1cm4gdGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIHByb3BzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgIHJldFtwcm9wXSA9IGFuaW1zW3Byb3BdICYmIGFuaW1zW3Byb3BdLmFjdGl2ZSgpID8gYW5pbXNbcHJvcF0uX3RvIDogdGhpc1twcm9wIGFzIHN0cmluZ107XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuIiwgImltcG9ydCB7aXNOdWxsT3JVbmRlZiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7X2ZhY3Rvcml6ZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuXG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4vY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IENoYXJ0XG4gKiBAdHlwZWRlZiB7e3ZhbHVlOm51bWJlciB8IHN0cmluZywgbGFiZWw/OnN0cmluZywgbWFqb3I/OmJvb2xlYW4sICRjb250ZXh0Pzphbnl9fSBUaWNrXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3Vic2V0IG9mIHRpY2tzIHRvIGJlIHBsb3R0ZWQgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgbGFiZWxzLlxuICogQHBhcmFtIHtpbXBvcnQoJy4vY29yZS5zY2FsZS5qcycpLmRlZmF1bHR9IHNjYWxlXG4gKiBAcGFyYW0ge1RpY2tbXX0gdGlja3NcbiAqIEByZXR1cm4ge1RpY2tbXX1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvU2tpcChzY2FsZSwgdGlja3MpIHtcbiAgY29uc3QgdGlja09wdHMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xuICBjb25zdCBkZXRlcm1pbmVkTWF4VGlja3MgPSBkZXRlcm1pbmVNYXhUaWNrcyhzY2FsZSk7XG4gIGNvbnN0IHRpY2tzTGltaXQgPSBNYXRoLm1pbih0aWNrT3B0cy5tYXhUaWNrc0xpbWl0IHx8IGRldGVybWluZWRNYXhUaWNrcywgZGV0ZXJtaW5lZE1heFRpY2tzKTtcbiAgY29uc3QgbWFqb3JJbmRpY2VzID0gdGlja09wdHMubWFqb3IuZW5hYmxlZCA/IGdldE1ham9ySW5kaWNlcyh0aWNrcykgOiBbXTtcbiAgY29uc3QgbnVtTWFqb3JJbmRpY2VzID0gbWFqb3JJbmRpY2VzLmxlbmd0aDtcbiAgY29uc3QgZmlyc3QgPSBtYWpvckluZGljZXNbMF07XG4gIGNvbnN0IGxhc3QgPSBtYWpvckluZGljZXNbbnVtTWFqb3JJbmRpY2VzIC0gMV07XG4gIGNvbnN0IG5ld1RpY2tzID0gW107XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHRvbyBtYW55IG1ham9yIHRpY2tzIHRvIGRpc3BsYXkgdGhlbSBhbGxcbiAgaWYgKG51bU1ham9ySW5kaWNlcyA+IHRpY2tzTGltaXQpIHtcbiAgICBza2lwTWFqb3JzKHRpY2tzLCBuZXdUaWNrcywgbWFqb3JJbmRpY2VzLCBudW1NYWpvckluZGljZXMgLyB0aWNrc0xpbWl0KTtcbiAgICByZXR1cm4gbmV3VGlja3M7XG4gIH1cblxuICBjb25zdCBzcGFjaW5nID0gY2FsY3VsYXRlU3BhY2luZyhtYWpvckluZGljZXMsIHRpY2tzLCB0aWNrc0xpbWl0KTtcblxuICBpZiAobnVtTWFqb3JJbmRpY2VzID4gMCkge1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGNvbnN0IGF2Z01ham9yU3BhY2luZyA9IG51bU1ham9ySW5kaWNlcyA+IDEgPyBNYXRoLnJvdW5kKChsYXN0IC0gZmlyc3QpIC8gKG51bU1ham9ySW5kaWNlcyAtIDEpKSA6IG51bGw7XG4gICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIGlzTnVsbE9yVW5kZWYoYXZnTWFqb3JTcGFjaW5nKSA/IDAgOiBmaXJzdCAtIGF2Z01ham9yU3BhY2luZywgZmlyc3QpO1xuICAgIGZvciAoaSA9IDAsIGlsZW4gPSBudW1NYWpvckluZGljZXMgLSAxOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZywgbWFqb3JJbmRpY2VzW2ldLCBtYWpvckluZGljZXNbaSArIDFdKTtcbiAgICB9XG4gICAgc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIGxhc3QsIGlzTnVsbE9yVW5kZWYoYXZnTWFqb3JTcGFjaW5nKSA/IHRpY2tzLmxlbmd0aCA6IGxhc3QgKyBhdmdNYWpvclNwYWNpbmcpO1xuICAgIHJldHVybiBuZXdUaWNrcztcbiAgfVxuICBza2lwKHRpY2tzLCBuZXdUaWNrcywgc3BhY2luZyk7XG4gIHJldHVybiBuZXdUaWNrcztcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTWF4VGlja3Moc2NhbGUpIHtcbiAgY29uc3Qgb2Zmc2V0ID0gc2NhbGUub3B0aW9ucy5vZmZzZXQ7XG4gIGNvbnN0IHRpY2tMZW5ndGggPSBzY2FsZS5fdGlja1NpemUoKTtcbiAgY29uc3QgbWF4U2NhbGUgPSBzY2FsZS5fbGVuZ3RoIC8gdGlja0xlbmd0aCArIChvZmZzZXQgPyAwIDogMSk7XG4gIGNvbnN0IG1heENoYXJ0ID0gc2NhbGUuX21heExlbmd0aCAvIHRpY2tMZW5ndGg7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgubWluKG1heFNjYWxlLCBtYXhDaGFydCkpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyW119IG1ham9ySW5kaWNlc1xuICogQHBhcmFtIHtUaWNrW119IHRpY2tzXG4gKiBAcGFyYW0ge251bWJlcn0gdGlja3NMaW1pdFxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVTcGFjaW5nKG1ham9ySW5kaWNlcywgdGlja3MsIHRpY2tzTGltaXQpIHtcbiAgY29uc3QgZXZlbk1ham9yU3BhY2luZyA9IGdldEV2ZW5TcGFjaW5nKG1ham9ySW5kaWNlcyk7XG4gIGNvbnN0IHNwYWNpbmcgPSB0aWNrcy5sZW5ndGggLyB0aWNrc0xpbWl0O1xuXG4gIC8vIElmIHRoZSBtYWpvciB0aWNrcyBhcmUgZXZlbmx5IHNwYWNlZCBhcGFydCwgcGxhY2UgdGhlIG1pbm9yIHRpY2tzXG4gIC8vIHNvIHRoYXQgdGhleSBkaXZpZGUgdGhlIG1ham9yIHRpY2tzIGludG8gZXZlbiBjaHVua3NcbiAgaWYgKCFldmVuTWFqb3JTcGFjaW5nKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KHNwYWNpbmcsIDEpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9ycyA9IF9mYWN0b3JpemUoZXZlbk1ham9yU3BhY2luZyk7XG4gIGZvciAobGV0IGkgPSAwLCBpbGVuID0gZmFjdG9ycy5sZW5ndGggLSAxOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgY29uc3QgZmFjdG9yID0gZmFjdG9yc1tpXTtcbiAgICBpZiAoZmFjdG9yID4gc3BhY2luZykge1xuICAgICAgcmV0dXJuIGZhY3RvcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE1hdGgubWF4KHNwYWNpbmcsIDEpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7VGlja1tdfSB0aWNrc1xuICovXG5mdW5jdGlvbiBnZXRNYWpvckluZGljZXModGlja3MpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGxldCBpLCBpbGVuO1xuICBmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgaWYgKHRpY2tzW2ldLm1ham9yKSB7XG4gICAgICByZXN1bHQucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RpY2tbXX0gdGlja3NcbiAqIEBwYXJhbSB7VGlja1tdfSBuZXdUaWNrc1xuICogQHBhcmFtIHtudW1iZXJbXX0gbWFqb3JJbmRpY2VzXG4gKiBAcGFyYW0ge251bWJlcn0gc3BhY2luZ1xuICovXG5mdW5jdGlvbiBza2lwTWFqb3JzKHRpY2tzLCBuZXdUaWNrcywgbWFqb3JJbmRpY2VzLCBzcGFjaW5nKSB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBuZXh0ID0gbWFqb3JJbmRpY2VzWzBdO1xuICBsZXQgaTtcblxuICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcpO1xuICBmb3IgKGkgPSAwOyBpIDwgdGlja3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA9PT0gbmV4dCkge1xuICAgICAgbmV3VGlja3MucHVzaCh0aWNrc1tpXSk7XG4gICAgICBjb3VudCsrO1xuICAgICAgbmV4dCA9IG1ham9ySW5kaWNlc1tjb3VudCAqIHNwYWNpbmddO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VGlja1tdfSB0aWNrc1xuICogQHBhcmFtIHtUaWNrW119IG5ld1RpY2tzXG4gKiBAcGFyYW0ge251bWJlcn0gc3BhY2luZ1xuICogQHBhcmFtIHtudW1iZXJ9IFttYWpvclN0YXJ0XVxuICogQHBhcmFtIHtudW1iZXJ9IFttYWpvckVuZF1cbiAqL1xuZnVuY3Rpb24gc2tpcCh0aWNrcywgbmV3VGlja3MsIHNwYWNpbmcsIG1ham9yU3RhcnQsIG1ham9yRW5kKSB7XG4gIGNvbnN0IHN0YXJ0ID0gdmFsdWVPckRlZmF1bHQobWFqb3JTdGFydCwgMCk7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKHZhbHVlT3JEZWZhdWx0KG1ham9yRW5kLCB0aWNrcy5sZW5ndGgpLCB0aWNrcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBsZXQgbGVuZ3RoLCBpLCBuZXh0O1xuXG4gIHNwYWNpbmcgPSBNYXRoLmNlaWwoc3BhY2luZyk7XG4gIGlmIChtYWpvckVuZCkge1xuICAgIGxlbmd0aCA9IG1ham9yRW5kIC0gbWFqb3JTdGFydDtcbiAgICBzcGFjaW5nID0gbGVuZ3RoIC8gTWF0aC5mbG9vcihsZW5ndGggLyBzcGFjaW5nKTtcbiAgfVxuXG4gIG5leHQgPSBzdGFydDtcblxuICB3aGlsZSAobmV4dCA8IDApIHtcbiAgICBjb3VudCsrO1xuICAgIG5leHQgPSBNYXRoLnJvdW5kKHN0YXJ0ICsgY291bnQgKiBzcGFjaW5nKTtcbiAgfVxuXG4gIGZvciAoaSA9IE1hdGgubWF4KHN0YXJ0LCAwKTsgaSA8IGVuZDsgaSsrKSB7XG4gICAgaWYgKGkgPT09IG5leHQpIHtcbiAgICAgIG5ld1RpY2tzLnB1c2godGlja3NbaV0pO1xuICAgICAgY291bnQrKztcbiAgICAgIG5leHQgPSBNYXRoLnJvdW5kKHN0YXJ0ICsgY291bnQgKiBzcGFjaW5nKTtcbiAgICB9XG4gIH1cbn1cblxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyW119IGFyclxuICovXG5mdW5jdGlvbiBnZXRFdmVuU3BhY2luZyhhcnIpIHtcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgbGV0IGksIGRpZmY7XG5cbiAgaWYgKGxlbiA8IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGRpZmYgPSBhcnJbMF0sIGkgPSAxOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYXJyW2ldIC0gYXJyW2kgLSAxXSAhPT0gZGlmZikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlmZjtcbn1cbiIsICJpbXBvcnQgRWxlbWVudCBmcm9tICcuL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQge19hbGlnblBpeGVsLCBfbWVhc3VyZVRleHQsIHJlbmRlclRleHQsIGNsaXBBcmVhLCB1bmNsaXBBcmVhfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLmpzJztcbmltcG9ydCB7Y2FsbGJhY2sgYXMgY2FsbCwgZWFjaCwgZmluaXRlT3JEZWZhdWx0LCBpc0FycmF5LCBpc0Zpbml0ZSwgaXNOdWxsT3JVbmRlZiwgaXNPYmplY3QsIHZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge3RvRGVncmVlcywgdG9SYWRpYW5zLCBfaW50MTZSYW5nZSwgX2xpbWl0VmFsdWUsIEhBTEZfUEl9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7X2FsaWduU3RhcnRFbmQsIF90b0xlZnRSaWdodENlbnRlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5pbXBvcnQge2NyZWF0ZUNvbnRleHQsIHRvRm9udCwgdG9QYWRkaW5nLCBfYWRkR3JhY2V9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcbmltcG9ydCB7YXV0b1NraXB9IGZyb20gJy4vY29yZS5zY2FsZS5hdXRvc2tpcC5qcyc7XG5cbmNvbnN0IHJldmVyc2VBbGlnbiA9IChhbGlnbikgPT4gYWxpZ24gPT09ICdsZWZ0JyA/ICdyaWdodCcgOiBhbGlnbiA9PT0gJ3JpZ2h0JyA/ICdsZWZ0JyA6IGFsaWduO1xuY29uc3Qgb2Zmc2V0RnJvbUVkZ2UgPSAoc2NhbGUsIGVkZ2UsIG9mZnNldCkgPT4gZWRnZSA9PT0gJ3RvcCcgfHwgZWRnZSA9PT0gJ2xlZnQnID8gc2NhbGVbZWRnZV0gKyBvZmZzZXQgOiBzY2FsZVtlZGdlXSAtIG9mZnNldDtcbmNvbnN0IGdldFRpY2tzTGltaXQgPSAodGlja3NMZW5ndGgsIG1heFRpY2tzTGltaXQpID0+IE1hdGgubWluKG1heFRpY2tzTGltaXQgfHwgdGlja3NMZW5ndGgsIHRpY2tzTGVuZ3RoKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHt7dmFsdWU6bnVtYmVyIHwgc3RyaW5nLCBsYWJlbD86c3RyaW5nLCBtYWpvcj86Ym9vbGVhbiwgJGNvbnRleHQ/OmFueX19IFRpY2tcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyBudW1JdGVtcyBmcm9tIGFyclxuICogQHBhcmFtIHthbnlbXX0gYXJyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtSXRlbXNcbiAqL1xuZnVuY3Rpb24gc2FtcGxlKGFyciwgbnVtSXRlbXMpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGluY3JlbWVudCA9IGFyci5sZW5ndGggLyBudW1JdGVtcztcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoOyBpIDwgbGVuOyBpICs9IGluY3JlbWVudCkge1xuICAgIHJlc3VsdC5wdXNoKGFycltNYXRoLmZsb29yKGkpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1NjYWxlfSBzY2FsZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9mZnNldEdyaWRMaW5lc1xuICovXG5mdW5jdGlvbiBnZXRQaXhlbEZvckdyaWRMaW5lKHNjYWxlLCBpbmRleCwgb2Zmc2V0R3JpZExpbmVzKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHNjYWxlLnRpY2tzLmxlbmd0aDtcbiAgY29uc3QgdmFsaWRJbmRleCA9IE1hdGgubWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgY29uc3Qgc3RhcnQgPSBzY2FsZS5fc3RhcnRQaXhlbDtcbiAgY29uc3QgZW5kID0gc2NhbGUuX2VuZFBpeGVsO1xuICBjb25zdCBlcHNpbG9uID0gMWUtNjsgLy8gMWUtNiBpcyBtYXJnaW4gaW4gcGl4ZWxzIGZvciBhY2N1bXVsYXRlZCBlcnJvci5cbiAgbGV0IGxpbmVWYWx1ZSA9IHNjYWxlLmdldFBpeGVsRm9yVGljayh2YWxpZEluZGV4KTtcbiAgbGV0IG9mZnNldDtcblxuICBpZiAob2Zmc2V0R3JpZExpbmVzKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gMSkge1xuICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgobGluZVZhbHVlIC0gc3RhcnQsIGVuZCAtIGxpbmVWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgb2Zmc2V0ID0gKHNjYWxlLmdldFBpeGVsRm9yVGljaygxKSAtIGxpbmVWYWx1ZSkgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBvZmZzZXQgPSAobGluZVZhbHVlIC0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKHZhbGlkSW5kZXggLSAxKSkgLyAyO1xuICAgIH1cbiAgICBsaW5lVmFsdWUgKz0gdmFsaWRJbmRleCA8IGluZGV4ID8gb2Zmc2V0IDogLW9mZnNldDtcblxuICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgdGhlIHBpeGVsIGlzIG91dCBvZiB0aGUgcmFuZ2VcbiAgICBpZiAobGluZVZhbHVlIDwgc3RhcnQgLSBlcHNpbG9uIHx8IGxpbmVWYWx1ZSA+IGVuZCArIGVwc2lsb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVWYWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FjaGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKi9cbmZ1bmN0aW9uIGdhcmJhZ2VDb2xsZWN0KGNhY2hlcywgbGVuZ3RoKSB7XG4gIGVhY2goY2FjaGVzLCAoY2FjaGUpID0+IHtcbiAgICBjb25zdCBnYyA9IGNhY2hlLmdjO1xuICAgIGNvbnN0IGdjTGVuID0gZ2MubGVuZ3RoIC8gMjtcbiAgICBsZXQgaTtcbiAgICBpZiAoZ2NMZW4gPiBsZW5ndGgpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnY0xlbjsgKytpKSB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZS5kYXRhW2djW2ldXTtcbiAgICAgIH1cbiAgICAgIGdjLnNwbGljZSgwLCBnY0xlbik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zLmRyYXdUaWNrcyA/IG9wdGlvbnMudGlja0xlbmd0aCA6IDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gZ2V0VGl0bGVIZWlnaHQob3B0aW9ucywgZmFsbGJhY2spIHtcbiAgaWYgKCFvcHRpb25zLmRpc3BsYXkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IGZvbnQgPSB0b0ZvbnQob3B0aW9ucy5mb250LCBmYWxsYmFjayk7XG4gIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcob3B0aW9ucy5wYWRkaW5nKTtcbiAgY29uc3QgbGluZXMgPSBpc0FycmF5KG9wdGlvbnMudGV4dCkgPyBvcHRpb25zLnRleHQubGVuZ3RoIDogMTtcblxuICByZXR1cm4gKGxpbmVzICogZm9udC5saW5lSGVpZ2h0KSArIHBhZGRpbmcuaGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2FsZUNvbnRleHQocGFyZW50LCBzY2FsZSkge1xuICByZXR1cm4gY3JlYXRlQ29udGV4dChwYXJlbnQsIHtcbiAgICBzY2FsZSxcbiAgICB0eXBlOiAnc2NhbGUnXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUaWNrQ29udGV4dChwYXJlbnQsIGluZGV4LCB0aWNrKSB7XG4gIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgIHRpY2ssXG4gICAgaW5kZXgsXG4gICAgdHlwZTogJ3RpY2snXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0aXRsZUFsaWduKGFsaWduLCBwb3NpdGlvbiwgcmV2ZXJzZSkge1xuICBsZXQgcmV0ID0gX3RvTGVmdFJpZ2h0Q2VudGVyKGFsaWduKTtcbiAgaWYgKChyZXZlcnNlICYmIHBvc2l0aW9uICE9PSAncmlnaHQnKSB8fCAoIXJldmVyc2UgJiYgcG9zaXRpb24gPT09ICdyaWdodCcpKSB7XG4gICAgcmV0ID0gcmV2ZXJzZUFsaWduKHJldCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gdGl0bGVBcmdzKHNjYWxlLCBvZmZzZXQsIHBvc2l0aW9uLCBhbGlnbikge1xuICBjb25zdCB7dG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCBjaGFydH0gPSBzY2FsZTtcbiAgY29uc3Qge2NoYXJ0QXJlYSwgc2NhbGVzfSA9IGNoYXJ0O1xuICBsZXQgcm90YXRpb24gPSAwO1xuICBsZXQgbWF4V2lkdGgsIHRpdGxlWCwgdGl0bGVZO1xuICBjb25zdCBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG4gIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuXG4gIGlmIChzY2FsZS5pc0hvcml6b250YWwoKSkge1xuICAgIHRpdGxlWCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBsZWZ0LCByaWdodCk7XG5cbiAgICBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgdGl0bGVZID0gc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSArIGhlaWdodCAtIG9mZnNldDtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgdGl0bGVZID0gKGNoYXJ0QXJlYS5ib3R0b20gKyBjaGFydEFyZWEudG9wKSAvIDIgKyBoZWlnaHQgLSBvZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpdGxlWSA9IG9mZnNldEZyb21FZGdlKHNjYWxlLCBwb3NpdGlvbiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgbWF4V2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgIHRpdGxlWCA9IHNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkgLSB3aWR0aCArIG9mZnNldDtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgdGl0bGVYID0gKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIgLSB3aWR0aCArIG9mZnNldDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGl0bGVYID0gb2Zmc2V0RnJvbUVkZ2Uoc2NhbGUsIHBvc2l0aW9uLCBvZmZzZXQpO1xuICAgIH1cbiAgICB0aXRsZVkgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgYm90dG9tLCB0b3ApO1xuICAgIHJvdGF0aW9uID0gcG9zaXRpb24gPT09ICdsZWZ0JyA/IC1IQUxGX1BJIDogSEFMRl9QSTtcbiAgfVxuICByZXR1cm4ge3RpdGxlWCwgdGl0bGVZLCBtYXhXaWR0aCwgcm90YXRpb259O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2FsZSBleHRlbmRzIEVsZW1lbnQge1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgdGhpcy5pZCA9IGNmZy5pZDtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICB0aGlzLnR5cGUgPSBjZmcudHlwZTtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9ICovXG4gICAgdGhpcy5jdHggPSBjZmcuY3R4O1xuICAgIC8qKiBAdHlwZSB7Q2hhcnR9ICovXG4gICAgdGhpcy5jaGFydCA9IGNmZy5jaGFydDtcblxuICAgIC8vIGltcGxlbWVudHMgYm94XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy50b3AgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5ib3R0b20gPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5sZWZ0ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMucmlnaHQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9tYXJnaW5zID0ge1xuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwXG4gICAgfTtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLm1heFdpZHRoID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMubWF4SGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMucGFkZGluZ1RvcCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnBhZGRpbmdSaWdodCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIHNjYWxlLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICAvKiogQHR5cGUge3N0cmluZz19ICovXG4gICAgdGhpcy5heGlzID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyPX0gKi9cbiAgICB0aGlzLmxhYmVsUm90YXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5taW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtUaWNrW119ICovXG4gICAgdGhpcy50aWNrcyA9IFtdO1xuICAgIC8qKiBAdHlwZSB7b2JqZWN0W118bnVsbH0gKi9cbiAgICB0aGlzLl9ncmlkTGluZUl0ZW1zID0gbnVsbDtcbiAgICAvKiogQHR5cGUge29iamVjdFtdfG51bGx9ICovXG4gICAgdGhpcy5fbGFiZWxJdGVtcyA9IG51bGw7XG4gICAgLyoqIEB0eXBlIHtvYmplY3R8bnVsbH0gKi9cbiAgICB0aGlzLl9sYWJlbFNpemVzID0gbnVsbDtcbiAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgIHRoaXMuX21heExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbG9uZ2VzdFRleHRDYWNoZSA9IHt9O1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuX3N0YXJ0UGl4ZWwgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fZW5kUGl4ZWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmV2ZXJzZVBpeGVscyA9IGZhbHNlO1xuICAgIHRoaXMuX3VzZXJNYXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdXNlck1pbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdWdnZXN0ZWRNYXggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3VnZ2VzdGVkTWluID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3RpY2tzTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9ib3JkZXJWYWx1ZSA9IDA7XG4gICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB0aGlzLl9kYXRhTGltaXRzQ2FjaGVkID0gZmFsc2U7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge2FueX0gb3B0aW9uc1xuXHQgKiBAc2luY2UgMy4wXG5cdCAqL1xuICBpbml0KG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuXG4gICAgdGhpcy5heGlzID0gb3B0aW9ucy5heGlzO1xuXG4gICAgLy8gcGFyc2UgbWluL21heCB2YWx1ZSwgc28gd2UgY2FuIHByb3Blcmx5IGRldGVybWluZSBtaW4vbWF4IGZvciBvdGhlciBzY2FsZXNcbiAgICB0aGlzLl91c2VyTWluID0gdGhpcy5wYXJzZShvcHRpb25zLm1pbik7XG4gICAgdGhpcy5fdXNlck1heCA9IHRoaXMucGFyc2Uob3B0aW9ucy5tYXgpO1xuICAgIHRoaXMuX3N1Z2dlc3RlZE1pbiA9IHRoaXMucGFyc2Uob3B0aW9ucy5zdWdnZXN0ZWRNaW4pO1xuICAgIHRoaXMuX3N1Z2dlc3RlZE1heCA9IHRoaXMucGFyc2Uob3B0aW9ucy5zdWdnZXN0ZWRNYXgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIFBhcnNlIGEgc3VwcG9ydGVkIGlucHV0IHZhbHVlIHRvIGludGVybmFsIHJlcHJlc2VudGF0aW9uLlxuXHQgKiBAcGFyYW0geyp9IHJhd1xuXHQgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XVxuXHQgKiBAc2luY2UgMy4wXG5cdCAqL1xuICBwYXJzZShyYXcsIGluZGV4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge3ttaW46IG51bWJlciwgbWF4OiBudW1iZXIsIG1pbkRlZmluZWQ6IGJvb2xlYW4sIG1heERlZmluZWQ6IGJvb2xlYW59fVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBzaW5jZSAzLjBcblx0ICovXG4gIGdldFVzZXJCb3VuZHMoKSB7XG4gICAgbGV0IHtfdXNlck1pbiwgX3VzZXJNYXgsIF9zdWdnZXN0ZWRNaW4sIF9zdWdnZXN0ZWRNYXh9ID0gdGhpcztcbiAgICBfdXNlck1pbiA9IGZpbml0ZU9yRGVmYXVsdChfdXNlck1pbiwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICBfdXNlck1heCA9IGZpbml0ZU9yRGVmYXVsdChfdXNlck1heCwgTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTtcbiAgICBfc3VnZ2VzdGVkTWluID0gZmluaXRlT3JEZWZhdWx0KF9zdWdnZXN0ZWRNaW4sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgX3N1Z2dlc3RlZE1heCA9IGZpbml0ZU9yRGVmYXVsdChfc3VnZ2VzdGVkTWF4LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuICAgIHJldHVybiB7XG4gICAgICBtaW46IGZpbml0ZU9yRGVmYXVsdChfdXNlck1pbiwgX3N1Z2dlc3RlZE1pbiksXG4gICAgICBtYXg6IGZpbml0ZU9yRGVmYXVsdChfdXNlck1heCwgX3N1Z2dlc3RlZE1heCksXG4gICAgICBtaW5EZWZpbmVkOiBpc0Zpbml0ZShfdXNlck1pbiksXG4gICAgICBtYXhEZWZpbmVkOiBpc0Zpbml0ZShfdXNlck1heClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gY2FuU3RhY2tcblx0ICogQHJldHVybiB7e21pbjogbnVtYmVyLCBtYXg6IG51bWJlcn19XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHNpbmNlIDMuMFxuXHQgKi9cbiAgZ2V0TWluTWF4KGNhblN0YWNrKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IHJhbmdlO1xuXG4gICAgaWYgKG1pbkRlZmluZWQgJiYgbWF4RGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHttaW4sIG1heH07XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXMgPSB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlsZW4gPSBtZXRhcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHJhbmdlID0gbWV0YXNbaV0uY29udHJvbGxlci5nZXRNaW5NYXgodGhpcywgY2FuU3RhY2spO1xuICAgICAgaWYgKCFtaW5EZWZpbmVkKSB7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgcmFuZ2UubWluKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWF4RGVmaW5lZCkge1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHJhbmdlLm1heCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIG1pbiA8PSBtYXggd2hlbiBvbmx5IG1pbiBvciBtYXggaXMgZGVmaW5lZCBieSB1c2VyIGFuZCB0aGUgZGF0YSBpcyBvdXRzaWRlIHRoYXQgcmFuZ2VcbiAgICBtaW4gPSBtYXhEZWZpbmVkICYmIG1pbiA+IG1heCA/IG1heCA6IG1pbjtcbiAgICBtYXggPSBtaW5EZWZpbmVkICYmIG1pbiA+IG1heCA/IG1pbiA6IG1heDtcblxuICAgIHJldHVybiB7XG4gICAgICBtaW46IGZpbml0ZU9yRGVmYXVsdChtaW4sIGZpbml0ZU9yRGVmYXVsdChtYXgsIG1pbikpLFxuICAgICAgbWF4OiBmaW5pdGVPckRlZmF1bHQobWF4LCBmaW5pdGVPckRlZmF1bHQobWluLCBtYXgpKVxuICAgIH07XG4gIH1cblxuICAvKipcblx0ICogR2V0IHRoZSBwYWRkaW5nIG5lZWRlZCBmb3IgdGhlIHNjYWxlXG5cdCAqIEByZXR1cm4ge3t0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyLCBib3R0b206IG51bWJlciwgcmlnaHQ6IG51bWJlcn19IHRoZSBuZWNlc3NhcnkgcGFkZGluZ1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgZ2V0UGFkZGluZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogdGhpcy5wYWRkaW5nTGVmdCB8fCAwLFxuICAgICAgdG9wOiB0aGlzLnBhZGRpbmdUb3AgfHwgMCxcbiAgICAgIHJpZ2h0OiB0aGlzLnBhZGRpbmdSaWdodCB8fCAwLFxuICAgICAgYm90dG9tOiB0aGlzLnBhZGRpbmdCb3R0b20gfHwgMFxuICAgIH07XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgc2NhbGUgdGljayBvYmplY3RzXG5cdCAqIEByZXR1cm4ge1RpY2tbXX1cblx0ICogQHNpbmNlIDIuN1xuXHQgKi9cbiAgZ2V0VGlja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudGlja3M7XG4gIH1cblxuICAvKipcblx0ICogQHJldHVybiB7c3RyaW5nW119XG5cdCAqL1xuICBnZXRMYWJlbHMoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY2hhcnQuZGF0YTtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmxhYmVscyB8fCAodGhpcy5pc0hvcml6b250YWwoKSA/IGRhdGEueExhYmVscyA6IGRhdGEueUxhYmVscykgfHwgZGF0YS5sYWJlbHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7aW1wb3J0KCcuLi90eXBlcy5qcycpLkxhYmVsSXRlbVtdfVxuICAgKi9cbiAgZ2V0TGFiZWxJdGVtcyhjaGFydEFyZWEgPSB0aGlzLmNoYXJ0LmNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fbGFiZWxJdGVtcyB8fCAodGhpcy5fbGFiZWxJdGVtcyA9IHRoaXMuX2NvbXB1dGVMYWJlbEl0ZW1zKGNoYXJ0QXJlYSkpO1xuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIC8vIFdoZW4gYSBuZXcgbGF5b3V0IGlzIGNyZWF0ZWQsIHJlc2V0IHRoZSBkYXRhIGxpbWl0cyBjYWNoZVxuICBiZWZvcmVMYXlvdXQoKSB7XG4gICAgdGhpcy5fY2FjaGUgPSB7fTtcbiAgICB0aGlzLl9kYXRhTGltaXRzQ2FjaGVkID0gZmFsc2U7XG4gIH1cblxuICAvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuICAvLyBBbnkgZnVuY3Rpb24gZGVmaW5lZCBoZXJlIGlzIGluaGVyaXRlZCBieSBhbGwgc2NhbGUgdHlwZXMuXG4gIC8vIEFueSBmdW5jdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIHNjYWxlIHR5cGVcblxuICBiZWZvcmVVcGRhdGUoKSB7XG4gICAgY2FsbCh0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLCBbdGhpc10pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhXaWR0aCAtIHRoZSBtYXggd2lkdGggaW4gcGl4ZWxzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXhIZWlnaHQgLSB0aGUgbWF4IGhlaWdodCBpbiBwaXhlbHNcblx0ICogQHBhcmFtIHt7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciwgYm90dG9tOiBudW1iZXIsIHJpZ2h0OiBudW1iZXJ9fSBtYXJnaW5zIC0gdGhlIHNwYWNlIGJldHdlZW4gdGhlIGVkZ2Ugb2YgdGhlIG90aGVyIHNjYWxlcyBhbmQgZWRnZSBvZiB0aGUgY2hhcnRcblx0ICogICBUaGlzIHNwYWNlIGNvbWVzIGZyb20gdHdvIHNvdXJjZXM6XG5cdCAqICAgICAtIHBhZGRpbmcgLSBzcGFjZSB0aGF0J3MgcmVxdWlyZWQgdG8gc2hvdyB0aGUgbGFiZWxzIGF0IHRoZSBlZGdlcyBvZiB0aGUgc2NhbGVcblx0ICogICAgIC0gdGhpY2tuZXNzIG9mIHNjYWxlcyBvciBsZWdlbmRzIGluIGFub3RoZXIgb3JpZW50YXRpb25cblx0ICovXG4gIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXJnaW5zKSB7XG4gICAgY29uc3Qge2JlZ2luQXRaZXJvLCBncmFjZSwgdGlja3M6IHRpY2tPcHRzfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBzYW1wbGVTaXplID0gdGlja09wdHMuc2FtcGxlU2l6ZTtcblxuICAgIC8vIFVwZGF0ZSBMaWZlY3ljbGUgLSBQcm9iYWJseSBkb24ndCB3YW50IHRvIGV2ZXIgZXh0ZW5kIG9yIG92ZXJ3cml0ZSB0aGlzIGZ1bmN0aW9uIDspXG4gICAgdGhpcy5iZWZvcmVVcGRhdGUoKTtcblxuICAgIC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuICAgIHRoaXMubWF4V2lkdGggPSBtYXhXaWR0aDtcbiAgICB0aGlzLm1heEhlaWdodCA9IG1heEhlaWdodDtcbiAgICB0aGlzLl9tYXJnaW5zID0gbWFyZ2lucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwXG4gICAgfSwgbWFyZ2lucyk7XG5cbiAgICB0aGlzLnRpY2tzID0gbnVsbDtcbiAgICB0aGlzLl9sYWJlbFNpemVzID0gbnVsbDtcbiAgICB0aGlzLl9ncmlkTGluZUl0ZW1zID0gbnVsbDtcbiAgICB0aGlzLl9sYWJlbEl0ZW1zID0gbnVsbDtcblxuICAgIC8vIERpbWVuc2lvbnNcbiAgICB0aGlzLmJlZm9yZVNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuXG4gICAgdGhpcy5fbWF4TGVuZ3RoID0gdGhpcy5pc0hvcml6b250YWwoKVxuICAgICAgPyB0aGlzLndpZHRoICsgbWFyZ2lucy5sZWZ0ICsgbWFyZ2lucy5yaWdodFxuICAgICAgOiB0aGlzLmhlaWdodCArIG1hcmdpbnMudG9wICsgbWFyZ2lucy5ib3R0b207XG5cbiAgICAvLyBEYXRhIG1pbi9tYXhcbiAgICBpZiAoIXRoaXMuX2RhdGFMaW1pdHNDYWNoZWQpIHtcbiAgICAgIHRoaXMuYmVmb3JlRGF0YUxpbWl0cygpO1xuICAgICAgdGhpcy5kZXRlcm1pbmVEYXRhTGltaXRzKCk7XG4gICAgICB0aGlzLmFmdGVyRGF0YUxpbWl0cygpO1xuICAgICAgdGhpcy5fcmFuZ2UgPSBfYWRkR3JhY2UodGhpcywgZ3JhY2UsIGJlZ2luQXRaZXJvKTtcbiAgICAgIHRoaXMuX2RhdGFMaW1pdHNDYWNoZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuYmVmb3JlQnVpbGRUaWNrcygpO1xuXG4gICAgdGhpcy50aWNrcyA9IHRoaXMuYnVpbGRUaWNrcygpIHx8IFtdO1xuXG4gICAgLy8gQWxsb3cgbW9kaWZpY2F0aW9uIG9mIHRpY2tzIGluIGNhbGxiYWNrLlxuICAgIHRoaXMuYWZ0ZXJCdWlsZFRpY2tzKCk7XG5cbiAgICAvLyBDb21wdXRlIHRpY2sgcm90YXRpb24gYW5kIGZpdCB1c2luZyBhIHNhbXBsZWQgc3Vic2V0IG9mIGxhYmVsc1xuICAgIC8vIFdlIGdlbmVyYWxseSBkb24ndCBuZWVkIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZXZlcnkgc2luZ2xlIGxhYmVsIGZvciBkZXRlcm1pbmluZyBzY2FsZSBzaXplXG4gICAgY29uc3Qgc2FtcGxpbmdFbmFibGVkID0gc2FtcGxlU2l6ZSA8IHRoaXMudGlja3MubGVuZ3RoO1xuICAgIHRoaXMuX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHNhbXBsaW5nRW5hYmxlZCA/IHNhbXBsZSh0aGlzLnRpY2tzLCBzYW1wbGVTaXplKSA6IHRoaXMudGlja3MpO1xuXG4gICAgLy8gY29uZmlndXJlIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBoZXJlLCBvbmNlIGZyb20gY29yZS5jb250cm9sbGVyLnVwZGF0ZUxheW91dC5cbiAgICAvLyBIZXJlIHdlIGhhdmVuJ3QgYmVlbiBwb3NpdGlvbmVkIHlldCwgYnV0IGRpbWVuc2lvbnMgYXJlIGNvcnJlY3QuXG4gICAgLy8gVmFyaWFibGVzIHNldCBpbiBjb25maWd1cmUgYXJlIG5lZWRlZCBmb3IgY2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgYW5kXG4gICAgLy8gaXQncyBvayB0aGF0IGNvb3JkaW5hdGVzIGFyZSBub3QgY29ycmVjdCB0aGVyZSwgb25seSBkaW1lbnNpb25zIG1hdHRlci5cbiAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuXG4gICAgLy8gVGljayBSb3RhdGlvblxuICAgIHRoaXMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGFiZWxSb3RhdGlvbigpOyAvLyBQcmVjb25kaXRpb25zOiBudW1iZXIgb2YgdGlja3MgYW5kIHNpemVzIG9mIGxhcmdlc3QgbGFiZWxzIG11c3QgYmUgY2FsY3VsYXRlZCBiZWZvcmVoYW5kXG4gICAgdGhpcy5hZnRlckNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKTtcblxuICAgIC8vIEF1dG8tc2tpcFxuICAgIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmICh0aWNrT3B0cy5hdXRvU2tpcCB8fCB0aWNrT3B0cy5zb3VyY2UgPT09ICdhdXRvJykpIHtcbiAgICAgIHRoaXMudGlja3MgPSBhdXRvU2tpcCh0aGlzLCB0aGlzLnRpY2tzKTtcbiAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBudWxsO1xuICAgICAgdGhpcy5hZnRlckF1dG9Ta2lwKCk7XG4gICAgfVxuXG4gICAgaWYgKHNhbXBsaW5nRW5hYmxlZCkge1xuICAgICAgLy8gR2VuZXJhdGUgbGFiZWxzIHVzaW5nIGFsbCBub24tc2tpcHBlZCB0aWNrc1xuICAgICAgdGhpcy5fY29udmVydFRpY2tzVG9MYWJlbHModGhpcy50aWNrcyk7XG4gICAgfVxuXG4gICAgdGhpcy5iZWZvcmVGaXQoKTtcbiAgICB0aGlzLmZpdCgpOyAvLyBQcmVjb25kaXRpb25zOiBsYWJlbCByb3RhdGlvbiBhbmQgbGFiZWwgc2l6ZXMgbXVzdCBiZSBjYWxjdWxhdGVkIGJlZm9yZWhhbmRcbiAgICB0aGlzLmFmdGVyRml0KCk7XG5cbiAgICAvLyBJTVBPUlRBTlQ6IGFmdGVyIHRoaXMgcG9pbnQsIHdlIGNvbnNpZGVyIHRoYXQgYHRoaXMudGlja3NgIHdpbGwgTkVWRVIgY2hhbmdlIVxuXG4gICAgdGhpcy5hZnRlclVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGNvbmZpZ3VyZSgpIHtcbiAgICBsZXQgcmV2ZXJzZVBpeGVscyA9IHRoaXMub3B0aW9ucy5yZXZlcnNlO1xuICAgIGxldCBzdGFydFBpeGVsLCBlbmRQaXhlbDtcblxuICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICBzdGFydFBpeGVsID0gdGhpcy5sZWZ0O1xuICAgICAgZW5kUGl4ZWwgPSB0aGlzLnJpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFBpeGVsID0gdGhpcy50b3A7XG4gICAgICBlbmRQaXhlbCA9IHRoaXMuYm90dG9tO1xuICAgICAgLy8gYnkgZGVmYXVsdCB2ZXJ0aWNhbCBzY2FsZXMgYXJlIGZyb20gYm90dG9tIHRvIHRvcCwgc28gcGl4ZWxzIGFyZSByZXZlcnNlZFxuICAgICAgcmV2ZXJzZVBpeGVscyA9ICFyZXZlcnNlUGl4ZWxzO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydFBpeGVsID0gc3RhcnRQaXhlbDtcbiAgICB0aGlzLl9lbmRQaXhlbCA9IGVuZFBpeGVsO1xuICAgIHRoaXMuX3JldmVyc2VQaXhlbHMgPSByZXZlcnNlUGl4ZWxzO1xuICAgIHRoaXMuX2xlbmd0aCA9IGVuZFBpeGVsIC0gc3RhcnRQaXhlbDtcbiAgICB0aGlzLl9hbGlnblRvUGl4ZWxzID0gdGhpcy5vcHRpb25zLmFsaWduVG9QaXhlbHM7XG4gIH1cblxuICBhZnRlclVwZGF0ZSgpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5hZnRlclVwZGF0ZSwgW3RoaXNdKTtcbiAgfVxuXG4gIC8vXG5cbiAgYmVmb3JlU2V0RGltZW5zaW9ucygpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5iZWZvcmVTZXREaW1lbnNpb25zLCBbdGhpc10pO1xuICB9XG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgLy8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgLy8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5tYXhXaWR0aDtcbiAgICAgIHRoaXMubGVmdCA9IDA7XG4gICAgICB0aGlzLnJpZ2h0ID0gdGhpcy53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLm1heEhlaWdodDtcblxuICAgICAgLy8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXG4gICAgICB0aGlzLnRvcCA9IDA7XG4gICAgICB0aGlzLmJvdHRvbSA9IHRoaXMuaGVpZ2h0O1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHBhZGRpbmdcbiAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gMDtcbiAgICB0aGlzLnBhZGRpbmdUb3AgPSAwO1xuICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gMDtcbiAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSAwO1xuICB9XG4gIGFmdGVyU2V0RGltZW5zaW9ucygpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5hZnRlclNldERpbWVuc2lvbnMsIFt0aGlzXSk7XG4gIH1cblxuICBfY2FsbEhvb2tzKG5hbWUpIHtcbiAgICB0aGlzLmNoYXJ0Lm5vdGlmeVBsdWdpbnMobmFtZSwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNhbGwodGhpcy5vcHRpb25zW25hbWVdLCBbdGhpc10pO1xuICB9XG5cbiAgLy8gRGF0YSBsaW1pdHNcbiAgYmVmb3JlRGF0YUxpbWl0cygpIHtcbiAgICB0aGlzLl9jYWxsSG9va3MoJ2JlZm9yZURhdGFMaW1pdHMnKTtcbiAgfVxuICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge31cbiAgYWZ0ZXJEYXRhTGltaXRzKCkge1xuICAgIHRoaXMuX2NhbGxIb29rcygnYWZ0ZXJEYXRhTGltaXRzJyk7XG4gIH1cblxuICAvL1xuICBiZWZvcmVCdWlsZFRpY2tzKCkge1xuICAgIHRoaXMuX2NhbGxIb29rcygnYmVmb3JlQnVpbGRUaWNrcycpO1xuICB9XG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtvYmplY3RbXX0gdGhlIHRpY2tzXG5cdCAqL1xuICBidWlsZFRpY2tzKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBhZnRlckJ1aWxkVGlja3MoKSB7XG4gICAgdGhpcy5fY2FsbEhvb2tzKCdhZnRlckJ1aWxkVGlja3MnKTtcbiAgfVxuXG4gIGJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbigpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG4gIH1cbiAgLyoqXG5cdCAqIENvbnZlcnQgdGlja3MgdG8gbGFiZWwgc3RyaW5nc1xuXHQgKiBAcGFyYW0ge1RpY2tbXX0gdGlja3Ncblx0ICovXG4gIGdlbmVyYXRlVGlja0xhYmVscyh0aWNrcykge1xuICAgIGNvbnN0IHRpY2tPcHRzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuICAgIGxldCBpLCBpbGVuLCB0aWNrO1xuICAgIGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyBpKyspIHtcbiAgICAgIHRpY2sgPSB0aWNrc1tpXTtcbiAgICAgIHRpY2subGFiZWwgPSBjYWxsKHRpY2tPcHRzLmNhbGxiYWNrLCBbdGljay52YWx1ZSwgaSwgdGlja3NdLCB0aGlzKTtcbiAgICB9XG4gIH1cbiAgYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24oKSB7XG4gICAgY2FsbCh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG4gIH1cblxuICAvL1xuXG4gIGJlZm9yZUNhbGN1bGF0ZUxhYmVsUm90YXRpb24oKSB7XG4gICAgY2FsbCh0aGlzLm9wdGlvbnMuYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgW3RoaXNdKTtcbiAgfVxuICBjYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IG51bVRpY2tzID0gZ2V0VGlja3NMaW1pdCh0aGlzLnRpY2tzLmxlbmd0aCwgb3B0aW9ucy50aWNrcy5tYXhUaWNrc0xpbWl0KTtcbiAgICBjb25zdCBtaW5Sb3RhdGlvbiA9IHRpY2tPcHRzLm1pblJvdGF0aW9uIHx8IDA7XG4gICAgY29uc3QgbWF4Um90YXRpb24gPSB0aWNrT3B0cy5tYXhSb3RhdGlvbjtcbiAgICBsZXQgbGFiZWxSb3RhdGlvbiA9IG1pblJvdGF0aW9uO1xuICAgIGxldCB0aWNrV2lkdGgsIG1heEhlaWdodCwgbWF4TGFiZWxEaWFnb25hbDtcblxuICAgIGlmICghdGhpcy5faXNWaXNpYmxlKCkgfHwgIXRpY2tPcHRzLmRpc3BsYXkgfHwgbWluUm90YXRpb24gPj0gbWF4Um90YXRpb24gfHwgbnVtVGlja3MgPD0gMSB8fCAhdGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgdGhpcy5sYWJlbFJvdGF0aW9uID0gbWluUm90YXRpb247XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxTaXplcyA9IHRoaXMuX2dldExhYmVsU2l6ZXMoKTtcbiAgICBjb25zdCBtYXhMYWJlbFdpZHRoID0gbGFiZWxTaXplcy53aWRlc3Qud2lkdGg7XG4gICAgY29uc3QgbWF4TGFiZWxIZWlnaHQgPSBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0O1xuXG4gICAgLy8gRXN0aW1hdGUgdGhlIHdpZHRoIG9mIGVhY2ggZ3JpZCBiYXNlZCBvbiB0aGUgY2FudmFzIHdpZHRoLCB0aGUgbWF4aW11bVxuICAgIC8vIGxhYmVsIHdpZHRoIGFuZCB0aGUgbnVtYmVyIG9mIHRpY2sgaW50ZXJ2YWxzXG4gICAgY29uc3QgbWF4V2lkdGggPSBfbGltaXRWYWx1ZSh0aGlzLmNoYXJ0LndpZHRoIC0gbWF4TGFiZWxXaWR0aCwgMCwgdGhpcy5tYXhXaWR0aCk7XG4gICAgdGlja1dpZHRoID0gb3B0aW9ucy5vZmZzZXQgPyB0aGlzLm1heFdpZHRoIC8gbnVtVGlja3MgOiBtYXhXaWR0aCAvIChudW1UaWNrcyAtIDEpO1xuXG4gICAgLy8gQWxsb3cgMyBwaXhlbHMgeDIgcGFkZGluZyBlaXRoZXIgc2lkZSBmb3IgbGFiZWwgcmVhZGFiaWxpdHlcbiAgICBpZiAobWF4TGFiZWxXaWR0aCArIDYgPiB0aWNrV2lkdGgpIHtcbiAgICAgIHRpY2tXaWR0aCA9IG1heFdpZHRoIC8gKG51bVRpY2tzIC0gKG9wdGlvbnMub2Zmc2V0ID8gMC41IDogMSkpO1xuICAgICAgbWF4SGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQgLSBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zLmdyaWQpXG5cdFx0XHRcdC0gdGlja09wdHMucGFkZGluZyAtIGdldFRpdGxlSGVpZ2h0KG9wdGlvbnMudGl0bGUsIHRoaXMuY2hhcnQub3B0aW9ucy5mb250KTtcbiAgICAgIG1heExhYmVsRGlhZ29uYWwgPSBNYXRoLnNxcnQobWF4TGFiZWxXaWR0aCAqIG1heExhYmVsV2lkdGggKyBtYXhMYWJlbEhlaWdodCAqIG1heExhYmVsSGVpZ2h0KTtcbiAgICAgIGxhYmVsUm90YXRpb24gPSB0b0RlZ3JlZXMoTWF0aC5taW4oXG4gICAgICAgIE1hdGguYXNpbihfbGltaXRWYWx1ZSgobGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCArIDYpIC8gdGlja1dpZHRoLCAtMSwgMSkpLFxuICAgICAgICBNYXRoLmFzaW4oX2xpbWl0VmFsdWUobWF4SGVpZ2h0IC8gbWF4TGFiZWxEaWFnb25hbCwgLTEsIDEpKSAtIE1hdGguYXNpbihfbGltaXRWYWx1ZShtYXhMYWJlbEhlaWdodCAvIG1heExhYmVsRGlhZ29uYWwsIC0xLCAxKSlcbiAgICAgICkpO1xuICAgICAgbGFiZWxSb3RhdGlvbiA9IE1hdGgubWF4KG1pblJvdGF0aW9uLCBNYXRoLm1pbihtYXhSb3RhdGlvbiwgbGFiZWxSb3RhdGlvbikpO1xuICAgIH1cblxuICAgIHRoaXMubGFiZWxSb3RhdGlvbiA9IGxhYmVsUm90YXRpb247XG4gIH1cbiAgYWZ0ZXJDYWxjdWxhdGVMYWJlbFJvdGF0aW9uKCkge1xuICAgIGNhbGwodGhpcy5vcHRpb25zLmFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiwgW3RoaXNdKTtcbiAgfVxuICBhZnRlckF1dG9Ta2lwKCkge31cblxuICAvL1xuXG4gIGJlZm9yZUZpdCgpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5iZWZvcmVGaXQsIFt0aGlzXSk7XG4gIH1cbiAgZml0KCkge1xuICAgIC8vIFJlc2V0XG4gICAgY29uc3QgbWluU2l6ZSA9IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcblxuICAgIGNvbnN0IHtjaGFydCwgb3B0aW9uczoge3RpY2tzOiB0aWNrT3B0cywgdGl0bGU6IHRpdGxlT3B0cywgZ3JpZDogZ3JpZE9wdHN9fSA9IHRoaXM7XG4gICAgY29uc3QgZGlzcGxheSA9IHRoaXMuX2lzVmlzaWJsZSgpO1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG5cbiAgICBpZiAoZGlzcGxheSkge1xuICAgICAgY29uc3QgdGl0bGVIZWlnaHQgPSBnZXRUaXRsZUhlaWdodCh0aXRsZU9wdHMsIGNoYXJ0Lm9wdGlvbnMuZm9udCk7XG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIG1pblNpemUud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgICBtaW5TaXplLmhlaWdodCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWRPcHRzKSArIHRpdGxlSGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluU2l6ZS5oZWlnaHQgPSB0aGlzLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxuICAgICAgICBtaW5TaXplLndpZHRoID0gZ2V0VGlja01hcmtMZW5ndGgoZ3JpZE9wdHMpICsgdGl0bGVIZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGJvdGhlciBmaXR0aW5nIHRoZSB0aWNrcyBpZiB3ZSBhcmUgbm90IHNob3dpbmcgdGhlIGxhYmVsc1xuICAgICAgaWYgKHRpY2tPcHRzLmRpc3BsYXkgJiYgdGhpcy50aWNrcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qge2ZpcnN0LCBsYXN0LCB3aWRlc3QsIGhpZ2hlc3R9ID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgICAgICBjb25zdCB0aWNrUGFkZGluZyA9IHRpY2tPcHRzLnBhZGRpbmcgKiAyO1xuICAgICAgICBjb25zdCBhbmdsZVJhZGlhbnMgPSB0b1JhZGlhbnModGhpcy5sYWJlbFJvdGF0aW9uKTtcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGVSYWRpYW5zKTtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGVSYWRpYW5zKTtcblxuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIC8vIEEgaG9yaXpvbnRhbCBheGlzIGlzIG1vcmUgY29uc3RyYWluZWQgYnkgdGhlIGhlaWdodC5cbiAgICAgICAgICBjb25zdCBsYWJlbEhlaWdodCA9IHRpY2tPcHRzLm1pcnJvciA/IDAgOiBzaW4gKiB3aWRlc3Qud2lkdGggKyBjb3MgKiBoaWdoZXN0LmhlaWdodDtcbiAgICAgICAgICBtaW5TaXplLmhlaWdodCA9IE1hdGgubWluKHRoaXMubWF4SGVpZ2h0LCBtaW5TaXplLmhlaWdodCArIGxhYmVsSGVpZ2h0ICsgdGlja1BhZGRpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBIHZlcnRpY2FsIGF4aXMgaXMgbW9yZSBjb25zdHJhaW5lZCBieSB0aGUgd2lkdGguIExhYmVscyBhcmUgdGhlXG4gICAgICAgIC8vIGRvbWluYW50IGZhY3RvciBoZXJlLCBzbyBnZXQgdGhhdCBsZW5ndGggZmlyc3QgYW5kIGFjY291bnQgZm9yIHBhZGRpbmdcbiAgICAgICAgICBjb25zdCBsYWJlbFdpZHRoID0gdGlja09wdHMubWlycm9yID8gMCA6IGNvcyAqIHdpZGVzdC53aWR0aCArIHNpbiAqIGhpZ2hlc3QuaGVpZ2h0O1xuXG4gICAgICAgICAgbWluU2l6ZS53aWR0aCA9IE1hdGgubWluKHRoaXMubWF4V2lkdGgsIG1pblNpemUud2lkdGggKyBsYWJlbFdpZHRoICsgdGlja1BhZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZVBhZGRpbmcoZmlyc3QsIGxhc3QsIHNpbiwgY29zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVNYXJnaW5zKCk7XG5cbiAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5fbGVuZ3RoID0gY2hhcnQud2lkdGggLSB0aGlzLl9tYXJnaW5zLmxlZnQgLSB0aGlzLl9tYXJnaW5zLnJpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQgPSBtaW5TaXplLmhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aWR0aCA9IG1pblNpemUud2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHRoaXMuX2xlbmd0aCA9IGNoYXJ0LmhlaWdodCAtIHRoaXMuX21hcmdpbnMudG9wIC0gdGhpcy5fbWFyZ2lucy5ib3R0b207XG4gICAgfVxuICB9XG5cbiAgX2NhbGN1bGF0ZVBhZGRpbmcoZmlyc3QsIGxhc3QsIHNpbiwgY29zKSB7XG4gICAgY29uc3Qge3RpY2tzOiB7YWxpZ24sIHBhZGRpbmd9LCBwb3NpdGlvbn0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgaXNSb3RhdGVkID0gdGhpcy5sYWJlbFJvdGF0aW9uICE9PSAwO1xuICAgIGNvbnN0IGxhYmVsc0JlbG93VGlja3MgPSBwb3NpdGlvbiAhPT0gJ3RvcCcgJiYgdGhpcy5heGlzID09PSAneCc7XG5cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgY29uc3Qgb2Zmc2V0TGVmdCA9IHRoaXMuZ2V0UGl4ZWxGb3JUaWNrKDApIC0gdGhpcy5sZWZ0O1xuICAgICAgY29uc3Qgb2Zmc2V0UmlnaHQgPSB0aGlzLnJpZ2h0IC0gdGhpcy5nZXRQaXhlbEZvclRpY2sodGhpcy50aWNrcy5sZW5ndGggLSAxKTtcbiAgICAgIGxldCBwYWRkaW5nTGVmdCA9IDA7XG4gICAgICBsZXQgcGFkZGluZ1JpZ2h0ID0gMDtcblxuICAgICAgLy8gRW5zdXJlIHRoYXQgb3VyIHRpY2tzIGFyZSBhbHdheXMgaW5zaWRlIHRoZSBjYW52YXMuIFdoZW4gcm90YXRlZCwgdGlja3MgYXJlIHJpZ2h0IGFsaWduZWRcbiAgICAgIC8vIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJpZ2h0IHBhZGRpbmcgaXMgZG9taW5hdGVkIGJ5IHRoZSBmb250IGhlaWdodFxuICAgICAgaWYgKGlzUm90YXRlZCkge1xuICAgICAgICBpZiAobGFiZWxzQmVsb3dUaWNrcykge1xuICAgICAgICAgIHBhZGRpbmdMZWZ0ID0gY29zICogZmlyc3Qud2lkdGg7XG4gICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gc2luICogbGFzdC5oZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFkZGluZ0xlZnQgPSBzaW4gKiBmaXJzdC5oZWlnaHQ7XG4gICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gY29zICogbGFzdC53aWR0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ3N0YXJ0Jykge1xuICAgICAgICBwYWRkaW5nUmlnaHQgPSBsYXN0LndpZHRoO1xuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcGFkZGluZ0xlZnQgPSBmaXJzdC53aWR0aDtcbiAgICAgIH0gZWxzZSBpZiAoYWxpZ24gIT09ICdpbm5lcicpIHtcbiAgICAgICAgcGFkZGluZ0xlZnQgPSBmaXJzdC53aWR0aCAvIDI7XG4gICAgICAgIHBhZGRpbmdSaWdodCA9IGxhc3Qud2lkdGggLyAyO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3QgcGFkZGluZyB0YWtpbmcgaW50byBhY2NvdW50IGNoYW5nZXMgaW4gb2Zmc2V0c1xuICAgICAgdGhpcy5wYWRkaW5nTGVmdCA9IE1hdGgubWF4KChwYWRkaW5nTGVmdCAtIG9mZnNldExlZnQgKyBwYWRkaW5nKSAqIHRoaXMud2lkdGggLyAodGhpcy53aWR0aCAtIG9mZnNldExlZnQpLCAwKTtcbiAgICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gTWF0aC5tYXgoKHBhZGRpbmdSaWdodCAtIG9mZnNldFJpZ2h0ICsgcGFkZGluZykgKiB0aGlzLndpZHRoIC8gKHRoaXMud2lkdGggLSBvZmZzZXRSaWdodCksIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGFkZGluZ1RvcCA9IGxhc3QuaGVpZ2h0IC8gMjtcbiAgICAgIGxldCBwYWRkaW5nQm90dG9tID0gZmlyc3QuaGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHBhZGRpbmdUb3AgPSAwO1xuICAgICAgICBwYWRkaW5nQm90dG9tID0gZmlyc3QuaGVpZ2h0O1xuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcGFkZGluZ1RvcCA9IGxhc3QuaGVpZ2h0O1xuICAgICAgICBwYWRkaW5nQm90dG9tID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wYWRkaW5nVG9wID0gcGFkZGluZ1RvcCArIHBhZGRpbmc7XG4gICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSBwYWRkaW5nQm90dG9tICsgcGFkZGluZztcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogSGFuZGxlIG1hcmdpbnMgYW5kIHBhZGRpbmcgaW50ZXJhY3Rpb25zXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaGFuZGxlTWFyZ2lucygpIHtcbiAgICBpZiAodGhpcy5fbWFyZ2lucykge1xuICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nTGVmdCwgdGhpcy5fbWFyZ2lucy5sZWZ0KTtcbiAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nVG9wLCB0aGlzLl9tYXJnaW5zLnRvcCk7XG4gICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gTWF0aC5tYXgodGhpcy5wYWRkaW5nUmlnaHQsIHRoaXMuX21hcmdpbnMucmlnaHQpO1xuICAgICAgdGhpcy5fbWFyZ2lucy5ib3R0b20gPSBNYXRoLm1heCh0aGlzLnBhZGRpbmdCb3R0b20sIHRoaXMuX21hcmdpbnMuYm90dG9tKTtcbiAgICB9XG4gIH1cblxuICBhZnRlckZpdCgpIHtcbiAgICBjYWxsKHRoaXMub3B0aW9ucy5hZnRlckZpdCwgW3RoaXNdKTtcbiAgfVxuXG4gIC8vIFNoYXJlZCBNZXRob2RzXG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cbiAgaXNIb3Jpem9udGFsKCkge1xuICAgIGNvbnN0IHtheGlzLCBwb3NpdGlvbn0gPSB0aGlzLm9wdGlvbnM7XG4gICAgcmV0dXJuIHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgYXhpcyA9PT0gJ3gnO1xuICB9XG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cbiAgaXNGdWxsU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZ1bGxTaXplO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7VGlja1tdfSB0aWNrc1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbnZlcnRUaWNrc1RvTGFiZWxzKHRpY2tzKSB7XG4gICAgdGhpcy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24oKTtcblxuICAgIHRoaXMuZ2VuZXJhdGVUaWNrTGFiZWxzKHRpY2tzKTtcblxuICAgIC8vIFRpY2tzIHNob3VsZCBiZSBza2lwcGVkIHdoZW4gY2FsbGJhY2sgcmV0dXJucyBudWxsIG9yIHVuZGVmLCBzbyBsZXRzIHJlbW92ZSB0aG9zZS5cbiAgICBsZXQgaSwgaWxlbjtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZih0aWNrc1tpXS5sYWJlbCkpIHtcbiAgICAgICAgdGlja3Muc3BsaWNlKGksIDEpO1xuICAgICAgICBpbGVuLS07XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uKCk7XG4gIH1cblxuICAvKipcblx0ICogQHJldHVybiB7eyBmaXJzdDogb2JqZWN0LCBsYXN0OiBvYmplY3QsIHdpZGVzdDogb2JqZWN0LCBoaWdoZXN0OiBvYmplY3QsIHdpZHRoczogQXJyYXksIGhlaWdodHM6IGFycmF5IH19XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0TGFiZWxTaXplcygpIHtcbiAgICBsZXQgbGFiZWxTaXplcyA9IHRoaXMuX2xhYmVsU2l6ZXM7XG5cbiAgICBpZiAoIWxhYmVsU2l6ZXMpIHtcbiAgICAgIGNvbnN0IHNhbXBsZVNpemUgPSB0aGlzLm9wdGlvbnMudGlja3Muc2FtcGxlU2l6ZTtcbiAgICAgIGxldCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgICBpZiAoc2FtcGxlU2l6ZSA8IHRpY2tzLmxlbmd0aCkge1xuICAgICAgICB0aWNrcyA9IHNhbXBsZSh0aWNrcywgc2FtcGxlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2xhYmVsU2l6ZXMgPSBsYWJlbFNpemVzID0gdGhpcy5fY29tcHV0ZUxhYmVsU2l6ZXModGlja3MsIHRpY2tzLmxlbmd0aCwgdGhpcy5vcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQpO1xuICAgIH1cblxuICAgIHJldHVybiBsYWJlbFNpemVzO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMge3dpZHRoLCBoZWlnaHQsIG9mZnNldH0gb2JqZWN0cyBmb3IgdGhlIGZpcnN0LCBsYXN0LCB3aWRlc3QsIGhpZ2hlc3QgdGlja1xuXHQgKiBsYWJlbHMgd2hlcmUgb2Zmc2V0IGluZGljYXRlcyB0aGUgYW5jaG9yIHBvaW50IG9mZnNldCBmcm9tIHRoZSB0b3AgaW4gcGl4ZWxzLlxuXHQgKiBAcmV0dXJuIHt7IGZpcnN0OiBvYmplY3QsIGxhc3Q6IG9iamVjdCwgd2lkZXN0OiBvYmplY3QsIGhpZ2hlc3Q6IG9iamVjdCwgd2lkdGhzOiBBcnJheSwgaGVpZ2h0czogYXJyYXkgfX1cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9jb21wdXRlTGFiZWxTaXplcyh0aWNrcywgbGVuZ3RoLCBtYXhUaWNrc0xpbWl0KSB7XG4gICAgY29uc3Qge2N0eCwgX2xvbmdlc3RUZXh0Q2FjaGU6IGNhY2hlc30gPSB0aGlzO1xuICAgIGNvbnN0IHdpZHRocyA9IFtdO1xuICAgIGNvbnN0IGhlaWdodHMgPSBbXTtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSBNYXRoLmZsb29yKGxlbmd0aCAvIGdldFRpY2tzTGltaXQobGVuZ3RoLCBtYXhUaWNrc0xpbWl0KSk7XG4gICAgbGV0IHdpZGVzdExhYmVsU2l6ZSA9IDA7XG4gICAgbGV0IGhpZ2hlc3RMYWJlbFNpemUgPSAwO1xuICAgIGxldCBpLCBqLCBqbGVuLCBsYWJlbCwgdGlja0ZvbnQsIGZvbnRTdHJpbmcsIGNhY2hlLCBsaW5lSGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBuZXN0ZWRMYWJlbDtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gaW5jcmVtZW50KSB7XG4gICAgICBsYWJlbCA9IHRpY2tzW2ldLmxhYmVsO1xuICAgICAgdGlja0ZvbnQgPSB0aGlzLl9yZXNvbHZlVGlja0ZvbnRPcHRpb25zKGkpO1xuICAgICAgY3R4LmZvbnQgPSBmb250U3RyaW5nID0gdGlja0ZvbnQuc3RyaW5nO1xuICAgICAgY2FjaGUgPSBjYWNoZXNbZm9udFN0cmluZ10gPSBjYWNoZXNbZm9udFN0cmluZ10gfHwge2RhdGE6IHt9LCBnYzogW119O1xuICAgICAgbGluZUhlaWdodCA9IHRpY2tGb250LmxpbmVIZWlnaHQ7XG4gICAgICB3aWR0aCA9IGhlaWdodCA9IDA7XG4gICAgICAvLyBVbmRlZmluZWQgbGFiZWxzIGFuZCBhcnJheXMgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZFxuICAgICAgaWYgKCFpc051bGxPclVuZGVmKGxhYmVsKSAmJiAhaXNBcnJheShsYWJlbCkpIHtcbiAgICAgICAgd2lkdGggPSBfbWVhc3VyZVRleHQoY3R4LCBjYWNoZS5kYXRhLCBjYWNoZS5nYywgd2lkdGgsIGxhYmVsKTtcbiAgICAgICAgaGVpZ2h0ID0gbGluZUhlaWdodDtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShsYWJlbCkpIHtcbiAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgbGV0J3MgbWVhc3VyZSBlYWNoIGVsZW1lbnRcbiAgICAgICAgZm9yIChqID0gMCwgamxlbiA9IGxhYmVsLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuICAgICAgICAgIG5lc3RlZExhYmVsID0gbGFiZWxbal07XG4gICAgICAgICAgLy8gVW5kZWZpbmVkIGxhYmVscyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcbiAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWYobmVzdGVkTGFiZWwpICYmICFpc0FycmF5KG5lc3RlZExhYmVsKSkge1xuICAgICAgICAgICAgd2lkdGggPSBfbWVhc3VyZVRleHQoY3R4LCBjYWNoZS5kYXRhLCBjYWNoZS5nYywgd2lkdGgsIG5lc3RlZExhYmVsKTtcbiAgICAgICAgICAgIGhlaWdodCArPSBsaW5lSGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2lkdGhzLnB1c2god2lkdGgpO1xuICAgICAgaGVpZ2h0cy5wdXNoKGhlaWdodCk7XG4gICAgICB3aWRlc3RMYWJlbFNpemUgPSBNYXRoLm1heCh3aWR0aCwgd2lkZXN0TGFiZWxTaXplKTtcbiAgICAgIGhpZ2hlc3RMYWJlbFNpemUgPSBNYXRoLm1heChoZWlnaHQsIGhpZ2hlc3RMYWJlbFNpemUpO1xuICAgIH1cbiAgICBnYXJiYWdlQ29sbGVjdChjYWNoZXMsIGxlbmd0aCk7XG5cbiAgICBjb25zdCB3aWRlc3QgPSB3aWR0aHMuaW5kZXhPZih3aWRlc3RMYWJlbFNpemUpO1xuICAgIGNvbnN0IGhpZ2hlc3QgPSBoZWlnaHRzLmluZGV4T2YoaGlnaGVzdExhYmVsU2l6ZSk7XG5cbiAgICBjb25zdCB2YWx1ZUF0ID0gKGlkeCkgPT4gKHt3aWR0aDogd2lkdGhzW2lkeF0gfHwgMCwgaGVpZ2h0OiBoZWlnaHRzW2lkeF0gfHwgMH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0OiB2YWx1ZUF0KDApLFxuICAgICAgbGFzdDogdmFsdWVBdChsZW5ndGggLSAxKSxcbiAgICAgIHdpZGVzdDogdmFsdWVBdCh3aWRlc3QpLFxuICAgICAgaGlnaGVzdDogdmFsdWVBdChoaWdoZXN0KSxcbiAgICAgIHdpZHRocyxcbiAgICAgIGhlaWdodHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgbGFiZWwgdG8gZGlzcGxheSBpbiB0aGUgdG9vbHRpcCBmb3IgdGhlIGdpdmVuIHZhbHVlXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWVcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cbiAgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBwb2ludC4gVmFsdWUgY2FuIGVpdGhlciBiZSBhbiBpbmRleCBvciBhIG51bWVyaWNhbCB2YWx1ZVxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHsqfSB2YWx1ZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gW2luZGV4XVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlLCBpbmRleCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgZGF0YSB2YWx1ZSBmcm9tIGEgZ2l2ZW4gcGl4ZWwuIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgZ2V0UGl4ZWxGb3JWYWx1ZVxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBpeGVsXG5cdCAqIEByZXR1cm4geyp9XG5cdCAqL1xuICBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0aWNrIGF0IHRoZSBnaXZlbiBpbmRleFxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG4gIGdldFBpeGVsRm9yVGljayhpbmRleCkge1xuICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlja3MubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGlja3NbaW5kZXhdLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVdGlsaXR5IGZvciBnZXR0aW5nIHRoZSBwaXhlbCBsb2NhdGlvbiBvZiBhIHBlcmNlbnRhZ2Ugb2Ygc2NhbGVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG4gIGdldFBpeGVsRm9yRGVjaW1hbChkZWNpbWFsKSB7XG4gICAgaWYgKHRoaXMuX3JldmVyc2VQaXhlbHMpIHtcbiAgICAgIGRlY2ltYWwgPSAxIC0gZGVjaW1hbDtcbiAgICB9XG5cbiAgICBjb25zdCBwaXhlbCA9IHRoaXMuX3N0YXJ0UGl4ZWwgKyBkZWNpbWFsICogdGhpcy5fbGVuZ3RoO1xuICAgIHJldHVybiBfaW50MTZSYW5nZSh0aGlzLl9hbGlnblRvUGl4ZWxzID8gX2FsaWduUGl4ZWwodGhpcy5jaGFydCwgcGl4ZWwsIDApIDogcGl4ZWwpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICBjb25zdCBkZWNpbWFsID0gKHBpeGVsIC0gdGhpcy5fc3RhcnRQaXhlbCkgLyB0aGlzLl9sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuX3JldmVyc2VQaXhlbHMgPyAxIC0gZGVjaW1hbCA6IGRlY2ltYWw7XG4gIH1cblxuICAvKipcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgZm9yIHRoZSBtaW5pbXVtIGNoYXJ0IHZhbHVlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRCYXNlUGl4ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLmdldEJhc2VWYWx1ZSgpKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRCYXNlVmFsdWUoKSB7XG4gICAgY29uc3Qge21pbiwgbWF4fSA9IHRoaXM7XG5cbiAgICByZXR1cm4gbWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDpcbiAgICAgIG1pbiA+IDAgJiYgbWF4ID4gMCA/IG1pbiA6XG4gICAgICAwO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldENvbnRleHQoaW5kZXgpIHtcbiAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3MgfHwgW107XG5cbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRpY2tzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdGljayA9IHRpY2tzW2luZGV4XTtcbiAgICAgIHJldHVybiB0aWNrLiRjb250ZXh0IHx8XG5cdFx0XHRcdCh0aWNrLiRjb250ZXh0ID0gY3JlYXRlVGlja0NvbnRleHQodGhpcy5nZXRDb250ZXh0KCksIGluZGV4LCB0aWNrKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiRjb250ZXh0IHx8XG5cdFx0XHQodGhpcy4kY29udGV4dCA9IGNyZWF0ZVNjYWxlQ29udGV4dCh0aGlzLmNoYXJ0LmdldENvbnRleHQoKSwgdGhpcykpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF90aWNrU2l6ZSgpIHtcbiAgICBjb25zdCBvcHRpb25UaWNrcyA9IHRoaXMub3B0aW9ucy50aWNrcztcblxuICAgIC8vIENhbGN1bGF0ZSBzcGFjZSBuZWVkZWQgYnkgbGFiZWwgaW4gYXhpcyBkaXJlY3Rpb24uXG4gICAgY29uc3Qgcm90ID0gdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG4gICAgY29uc3QgY29zID0gTWF0aC5hYnMoTWF0aC5jb3Mocm90KSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5hYnMoTWF0aC5zaW4ocm90KSk7XG5cbiAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgIGNvbnN0IHBhZGRpbmcgPSBvcHRpb25UaWNrcy5hdXRvU2tpcFBhZGRpbmcgfHwgMDtcbiAgICBjb25zdCB3ID0gbGFiZWxTaXplcyA/IGxhYmVsU2l6ZXMud2lkZXN0LndpZHRoICsgcGFkZGluZyA6IDA7XG4gICAgY29uc3QgaCA9IGxhYmVsU2l6ZXMgPyBsYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0ICsgcGFkZGluZyA6IDA7XG5cbiAgICAvLyBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGZvciAxIHRpY2sgaW4gYXhpcyBkaXJlY3Rpb24uXG4gICAgcmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKClcbiAgICAgID8gaCAqIGNvcyA+IHcgKiBzaW4gPyB3IC8gY29zIDogaCAvIHNpblxuICAgICAgOiBoICogc2luIDwgdyAqIGNvcyA/IGggLyBjb3MgOiB3IC8gc2luO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge2Jvb2xlYW59XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaXNWaXNpYmxlKCkge1xuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTtcblxuICAgIGlmIChkaXNwbGF5ICE9PSAnYXV0bycpIHtcbiAgICAgIHJldHVybiAhIWRpc3BsYXk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXMoKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY29tcHV0ZUdyaWRMaW5lSXRlbXMoY2hhcnRBcmVhKSB7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcztcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB7Z3JpZCwgcG9zaXRpb24sIGJvcmRlcn0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9mZnNldCA9IGdyaWQub2Zmc2V0O1xuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgIGNvbnN0IHRpY2tzTGVuZ3RoID0gdGlja3MubGVuZ3RoICsgKG9mZnNldCA/IDEgOiAwKTtcbiAgICBjb25zdCB0bCA9IGdldFRpY2tNYXJrTGVuZ3RoKGdyaWQpO1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG5cbiAgICBjb25zdCBib3JkZXJPcHRzID0gYm9yZGVyLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNvbnN0IGF4aXNXaWR0aCA9IGJvcmRlck9wdHMuZGlzcGxheSA/IGJvcmRlck9wdHMud2lkdGggOiAwO1xuICAgIGNvbnN0IGF4aXNIYWxmV2lkdGggPSBheGlzV2lkdGggLyAyO1xuICAgIGNvbnN0IGFsaWduQm9yZGVyVmFsdWUgPSBmdW5jdGlvbihwaXhlbCkge1xuICAgICAgcmV0dXJuIF9hbGlnblBpeGVsKGNoYXJ0LCBwaXhlbCwgYXhpc1dpZHRoKTtcbiAgICB9O1xuICAgIGxldCBib3JkZXJWYWx1ZSwgaSwgbGluZVZhbHVlLCBhbGlnbmVkTGluZVZhbHVlO1xuICAgIGxldCB0eDEsIHR5MSwgdHgyLCB0eTIsIHgxLCB5MSwgeDIsIHkyO1xuXG4gICAgaWYgKHBvc2l0aW9uID09PSAndG9wJykge1xuICAgICAgYm9yZGVyVmFsdWUgPSBhbGlnbkJvcmRlclZhbHVlKHRoaXMuYm90dG9tKTtcbiAgICAgIHR5MSA9IHRoaXMuYm90dG9tIC0gdGw7XG4gICAgICB0eTIgPSBib3JkZXJWYWx1ZSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICB5MSA9IGFsaWduQm9yZGVyVmFsdWUoY2hhcnRBcmVhLnRvcCkgKyBheGlzSGFsZldpZHRoO1xuICAgICAgeTIgPSBjaGFydEFyZWEuYm90dG9tO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy50b3ApO1xuICAgICAgeTEgPSBjaGFydEFyZWEudG9wO1xuICAgICAgeTIgPSBhbGlnbkJvcmRlclZhbHVlKGNoYXJ0QXJlYS5ib3R0b20pIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR5MSA9IGJvcmRlclZhbHVlICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR5MiA9IHRoaXMudG9wICsgdGw7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy5yaWdodCk7XG4gICAgICB0eDEgPSB0aGlzLnJpZ2h0IC0gdGw7XG4gICAgICB0eDIgPSBib3JkZXJWYWx1ZSAtIGF4aXNIYWxmV2lkdGg7XG4gICAgICB4MSA9IGFsaWduQm9yZGVyVmFsdWUoY2hhcnRBcmVhLmxlZnQpICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgIHgyID0gY2hhcnRBcmVhLnJpZ2h0O1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLmxlZnQpO1xuICAgICAgeDEgPSBjaGFydEFyZWEubGVmdDtcbiAgICAgIHgyID0gYWxpZ25Cb3JkZXJWYWx1ZShjaGFydEFyZWEucmlnaHQpIC0gYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR4MSA9IGJvcmRlclZhbHVlICsgYXhpc0hhbGZXaWR0aDtcbiAgICAgIHR4MiA9IHRoaXMubGVmdCArIHRsO1xuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3gnKSB7XG4gICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSgoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMiArIDAuNSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgIGJvcmRlclZhbHVlID0gYWxpZ25Cb3JkZXJWYWx1ZSh0aGlzLmNoYXJ0LnNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkpO1xuICAgICAgfVxuXG4gICAgICB5MSA9IGNoYXJ0QXJlYS50b3A7XG4gICAgICB5MiA9IGNoYXJ0QXJlYS5ib3R0b207XG4gICAgICB0eTEgPSBib3JkZXJWYWx1ZSArIGF4aXNIYWxmV2lkdGg7XG4gICAgICB0eTIgPSB0eTEgKyB0bDtcbiAgICB9IGVsc2UgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgaWYgKHBvc2l0aW9uID09PSAnY2VudGVyJykge1xuICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUoKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIpO1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25BeGlzSUQgPSBPYmplY3Qua2V5cyhwb3NpdGlvbilbMF07XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcG9zaXRpb25bcG9zaXRpb25BeGlzSURdO1xuICAgICAgICBib3JkZXJWYWx1ZSA9IGFsaWduQm9yZGVyVmFsdWUodGhpcy5jaGFydC5zY2FsZXNbcG9zaXRpb25BeGlzSURdLmdldFBpeGVsRm9yVmFsdWUodmFsdWUpKTtcbiAgICAgIH1cblxuICAgICAgdHgxID0gYm9yZGVyVmFsdWUgLSBheGlzSGFsZldpZHRoO1xuICAgICAgdHgyID0gdHgxIC0gdGw7XG4gICAgICB4MSA9IGNoYXJ0QXJlYS5sZWZ0O1xuICAgICAgeDIgPSBjaGFydEFyZWEucmlnaHQ7XG4gICAgfVxuXG4gICAgY29uc3QgbGltaXQgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnRpY2tzLm1heFRpY2tzTGltaXQsIHRpY2tzTGVuZ3RoKTtcbiAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRpY2tzTGVuZ3RoIC8gbGltaXQpKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGlja3NMZW5ndGg7IGkgKz0gc3RlcCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChpKTtcbiAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gZ3JpZC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgY29uc3Qgb3B0c0F0SW5kZXhCb3JkZXIgPSBib3JkZXIuc2V0Q29udGV4dChjb250ZXh0KTtcblxuICAgICAgY29uc3QgbGluZVdpZHRoID0gb3B0c0F0SW5kZXgubGluZVdpZHRoO1xuICAgICAgY29uc3QgbGluZUNvbG9yID0gb3B0c0F0SW5kZXguY29sb3I7XG4gICAgICBjb25zdCBib3JkZXJEYXNoID0gb3B0c0F0SW5kZXhCb3JkZXIuZGFzaCB8fCBbXTtcbiAgICAgIGNvbnN0IGJvcmRlckRhc2hPZmZzZXQgPSBvcHRzQXRJbmRleEJvcmRlci5kYXNoT2Zmc2V0O1xuXG4gICAgICBjb25zdCB0aWNrV2lkdGggPSBvcHRzQXRJbmRleC50aWNrV2lkdGg7XG4gICAgICBjb25zdCB0aWNrQ29sb3IgPSBvcHRzQXRJbmRleC50aWNrQ29sb3I7XG4gICAgICBjb25zdCB0aWNrQm9yZGVyRGFzaCA9IG9wdHNBdEluZGV4LnRpY2tCb3JkZXJEYXNoIHx8IFtdO1xuICAgICAgY29uc3QgdGlja0JvcmRlckRhc2hPZmZzZXQgPSBvcHRzQXRJbmRleC50aWNrQm9yZGVyRGFzaE9mZnNldDtcblxuICAgICAgbGluZVZhbHVlID0gZ2V0UGl4ZWxGb3JHcmlkTGluZSh0aGlzLCBpLCBvZmZzZXQpO1xuXG4gICAgICAvLyBTa2lwIGlmIHRoZSBwaXhlbCBpcyBvdXQgb2YgdGhlIHJhbmdlXG4gICAgICBpZiAobGluZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFsaWduZWRMaW5lVmFsdWUgPSBfYWxpZ25QaXhlbChjaGFydCwgbGluZVZhbHVlLCBsaW5lV2lkdGgpO1xuXG4gICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgIHR4MSA9IHR4MiA9IHgxID0geDIgPSBhbGlnbmVkTGluZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHkxID0gdHkyID0geTEgPSB5MiA9IGFsaWduZWRMaW5lVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICB0eDEsXG4gICAgICAgIHR5MSxcbiAgICAgICAgdHgyLFxuICAgICAgICB0eTIsXG4gICAgICAgIHgxLFxuICAgICAgICB5MSxcbiAgICAgICAgeDIsXG4gICAgICAgIHkyLFxuICAgICAgICB3aWR0aDogbGluZVdpZHRoLFxuICAgICAgICBjb2xvcjogbGluZUNvbG9yLFxuICAgICAgICBib3JkZXJEYXNoLFxuICAgICAgICBib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgICB0aWNrV2lkdGgsXG4gICAgICAgIHRpY2tDb2xvcixcbiAgICAgICAgdGlja0JvcmRlckRhc2gsXG4gICAgICAgIHRpY2tCb3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdGlja3NMZW5ndGggPSB0aWNrc0xlbmd0aDtcbiAgICB0aGlzLl9ib3JkZXJWYWx1ZSA9IGJvcmRlclZhbHVlO1xuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY29tcHV0ZUxhYmVsSXRlbXMoY2hhcnRBcmVhKSB7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcztcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHtwb3NpdGlvbiwgdGlja3M6IG9wdGlvblRpY2tzfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgaXNIb3Jpem9udGFsID0gdGhpcy5pc0hvcml6b250YWwoKTtcbiAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgY29uc3Qge2FsaWduLCBjcm9zc0FsaWduLCBwYWRkaW5nLCBtaXJyb3J9ID0gb3B0aW9uVGlja3M7XG4gICAgY29uc3QgdGwgPSBnZXRUaWNrTWFya0xlbmd0aChvcHRpb25zLmdyaWQpO1xuICAgIGNvbnN0IHRpY2tBbmRQYWRkaW5nID0gdGwgKyBwYWRkaW5nO1xuICAgIGNvbnN0IGhUaWNrQW5kUGFkZGluZyA9IG1pcnJvciA/IC1wYWRkaW5nIDogdGlja0FuZFBhZGRpbmc7XG4gICAgY29uc3Qgcm90YXRpb24gPSAtdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG4gICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICBsZXQgaSwgaWxlbiwgdGljaywgbGFiZWwsIHgsIHksIHRleHRBbGlnbiwgcGl4ZWwsIGZvbnQsIGxpbmVIZWlnaHQsIGxpbmVDb3VudCwgdGV4dE9mZnNldDtcbiAgICBsZXQgdGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICB5ID0gdGhpcy5ib3R0b20gLSBoVGlja0FuZFBhZGRpbmc7XG4gICAgICB0ZXh0QWxpZ24gPSB0aGlzLl9nZXRYQXhpc0xhYmVsQWxpZ25tZW50KCk7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHkgPSB0aGlzLnRvcCArIGhUaWNrQW5kUGFkZGluZztcbiAgICAgIHRleHRBbGlnbiA9IHRoaXMuX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKTtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgIGNvbnN0IHJldCA9IHRoaXMuX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQodGwpO1xuICAgICAgdGV4dEFsaWduID0gcmV0LnRleHRBbGlnbjtcbiAgICAgIHggPSByZXQueDtcbiAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICBjb25zdCByZXQgPSB0aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHRsKTtcbiAgICAgIHRleHRBbGlnbiA9IHJldC50ZXh0QWxpZ247XG4gICAgICB4ID0gcmV0Lng7XG4gICAgfSBlbHNlIGlmIChheGlzID09PSAneCcpIHtcbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgeSA9ICgoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMikgKyB0aWNrQW5kUGFkZGluZztcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QocG9zaXRpb24pKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uQXhpc0lEID0gT2JqZWN0LmtleXMocG9zaXRpb24pWzBdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHBvc2l0aW9uW3Bvc2l0aW9uQXhpc0lEXTtcbiAgICAgICAgeSA9IHRoaXMuY2hhcnQuc2NhbGVzW3Bvc2l0aW9uQXhpc0lEXS5nZXRQaXhlbEZvclZhbHVlKHZhbHVlKSArIHRpY2tBbmRQYWRkaW5nO1xuICAgICAgfVxuICAgICAgdGV4dEFsaWduID0gdGhpcy5fZ2V0WEF4aXNMYWJlbEFsaWdubWVudCgpO1xuICAgIH0gZWxzZSBpZiAoYXhpcyA9PT0gJ3knKSB7XG4gICAgICBpZiAocG9zaXRpb24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgIHggPSAoKGNoYXJ0QXJlYS5sZWZ0ICsgY2hhcnRBcmVhLnJpZ2h0KSAvIDIpIC0gdGlja0FuZFBhZGRpbmc7XG4gICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBvc2l0aW9uKSkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbkF4aXNJRCA9IE9iamVjdC5rZXlzKHBvc2l0aW9uKVswXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwb3NpdGlvbltwb3NpdGlvbkF4aXNJRF07XG4gICAgICAgIHggPSB0aGlzLmNoYXJ0LnNjYWxlc1twb3NpdGlvbkF4aXNJRF0uZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0ZXh0QWxpZ24gPSB0aGlzLl9nZXRZQXhpc0xhYmVsQWxpZ25tZW50KHRsKS50ZXh0QWxpZ247XG4gICAgfVxuXG4gICAgaWYgKGF4aXMgPT09ICd5Jykge1xuICAgICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICAgIHRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgICAgfSBlbHNlIGlmIChhbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgdGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxTaXplcyA9IHRoaXMuX2dldExhYmVsU2l6ZXMoKTtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB0aWNrID0gdGlja3NbaV07XG4gICAgICBsYWJlbCA9IHRpY2subGFiZWw7XG5cbiAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gb3B0aW9uVGlja3Muc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoaSkpO1xuICAgICAgcGl4ZWwgPSB0aGlzLmdldFBpeGVsRm9yVGljayhpKSArIG9wdGlvblRpY2tzLmxhYmVsT2Zmc2V0O1xuICAgICAgZm9udCA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoaSk7XG4gICAgICBsaW5lSGVpZ2h0ID0gZm9udC5saW5lSGVpZ2h0O1xuICAgICAgbGluZUNvdW50ID0gaXNBcnJheShsYWJlbCkgPyBsYWJlbC5sZW5ndGggOiAxO1xuICAgICAgY29uc3QgaGFsZkNvdW50ID0gbGluZUNvdW50IC8gMjtcbiAgICAgIGNvbnN0IGNvbG9yID0gb3B0c0F0SW5kZXguY29sb3I7XG4gICAgICBjb25zdCBzdHJva2VDb2xvciA9IG9wdHNBdEluZGV4LnRleHRTdHJva2VDb2xvcjtcbiAgICAgIGNvbnN0IHN0cm9rZVdpZHRoID0gb3B0c0F0SW5kZXgudGV4dFN0cm9rZVdpZHRoO1xuICAgICAgbGV0IHRpY2tUZXh0QWxpZ24gPSB0ZXh0QWxpZ247XG5cbiAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgeCA9IHBpeGVsO1xuXG4gICAgICAgIGlmICh0ZXh0QWxpZ24gPT09ICdpbm5lcicpIHtcbiAgICAgICAgICBpZiAoaSA9PT0gaWxlbiAtIDEpIHtcbiAgICAgICAgICAgIHRpY2tUZXh0QWxpZ24gPSAhdGhpcy5vcHRpb25zLnJldmVyc2UgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdGlja1RleHRBbGlnbiA9ICF0aGlzLm9wdGlvbnMucmV2ZXJzZSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpY2tUZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKGNyb3NzQWxpZ24gPT09ICduZWFyJyB8fCByb3RhdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1saW5lQ291bnQgKiBsaW5lSGVpZ2h0ICsgbGluZUhlaWdodCAvIDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgdGV4dE9mZnNldCA9IC1sYWJlbFNpemVzLmhpZ2hlc3QuaGVpZ2h0IC8gMiAtIGhhbGZDb3VudCAqIGxpbmVIZWlnaHQgKyBsaW5lSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gLWxhYmVsU2l6ZXMuaGlnaGVzdC5oZWlnaHQgKyBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxuICAgICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicgfHwgcm90YXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIHRleHRPZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAvIDIgLSBoYWxmQ291bnQgKiBsaW5lSGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0T2Zmc2V0ID0gbGFiZWxTaXplcy5oaWdoZXN0LmhlaWdodCAtIGxpbmVDb3VudCAqIGxpbmVIZWlnaHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaXJyb3IpIHtcbiAgICAgICAgICB0ZXh0T2Zmc2V0ICo9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3RhdGlvbiAhPT0gMCAmJiAhb3B0c0F0SW5kZXguc2hvd0xhYmVsQmFja2Ryb3ApIHtcbiAgICAgICAgICB4ICs9IChsaW5lSGVpZ2h0IC8gMikgKiBNYXRoLnNpbihyb3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkgPSBwaXhlbDtcbiAgICAgICAgdGV4dE9mZnNldCA9ICgxIC0gbGluZUNvdW50KSAqIGxpbmVIZWlnaHQgLyAyO1xuICAgICAgfVxuXG4gICAgICBsZXQgYmFja2Ryb3A7XG5cbiAgICAgIGlmIChvcHRzQXRJbmRleC5zaG93TGFiZWxCYWNrZHJvcCkge1xuICAgICAgICBjb25zdCBsYWJlbFBhZGRpbmcgPSB0b1BhZGRpbmcob3B0c0F0SW5kZXguYmFja2Ryb3BQYWRkaW5nKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gbGFiZWxTaXplcy5oZWlnaHRzW2ldO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGxhYmVsU2l6ZXMud2lkdGhzW2ldO1xuXG4gICAgICAgIGxldCB0b3AgPSB0ZXh0T2Zmc2V0IC0gbGFiZWxQYWRkaW5nLnRvcDtcbiAgICAgICAgbGV0IGxlZnQgPSAwIC0gbGFiZWxQYWRkaW5nLmxlZnQ7XG5cbiAgICAgICAgc3dpdGNoICh0ZXh0QmFzZWxpbmUpIHtcbiAgICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgICB0b3AgLT0gaGVpZ2h0IC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgLT0gaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHtcbiAgICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgICBsZWZ0IC09IHdpZHRoIC8gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gd2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBiYWNrZHJvcCA9IHtcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aDogd2lkdGggKyBsYWJlbFBhZGRpbmcud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgKyBsYWJlbFBhZGRpbmcuaGVpZ2h0LFxuXG4gICAgICAgICAgY29sb3I6IG9wdHNBdEluZGV4LmJhY2tkcm9wQ29sb3IsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbCxcbiAgICAgICAgZm9udCxcbiAgICAgICAgdGV4dE9mZnNldCxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHJvdGF0aW9uLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHN0cm9rZUNvbG9yLFxuICAgICAgICAgIHN0cm9rZVdpZHRoLFxuICAgICAgICAgIHRleHRBbGlnbjogdGlja1RleHRBbGlnbixcbiAgICAgICAgICB0ZXh0QmFzZWxpbmUsXG4gICAgICAgICAgdHJhbnNsYXRpb246IFt4LCB5XSxcbiAgICAgICAgICBiYWNrZHJvcCxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQoKSB7XG4gICAgY29uc3Qge3Bvc2l0aW9uLCB0aWNrc30gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qgcm90YXRpb24gPSAtdG9SYWRpYW5zKHRoaXMubGFiZWxSb3RhdGlvbik7XG5cbiAgICBpZiAocm90YXRpb24pIHtcbiAgICAgIHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH1cblxuICAgIGxldCBhbGlnbiA9ICdjZW50ZXInO1xuXG4gICAgaWYgKHRpY2tzLmFsaWduID09PSAnc3RhcnQnKSB7XG4gICAgICBhbGlnbiA9ICdsZWZ0JztcbiAgICB9IGVsc2UgaWYgKHRpY2tzLmFsaWduID09PSAnZW5kJykge1xuICAgICAgYWxpZ24gPSAncmlnaHQnO1xuICAgIH0gZWxzZSBpZiAodGlja3MuYWxpZ24gPT09ICdpbm5lcicpIHtcbiAgICAgIGFsaWduID0gJ2lubmVyJztcbiAgICB9XG5cbiAgICByZXR1cm4gYWxpZ247XG4gIH1cblxuICBfZ2V0WUF4aXNMYWJlbEFsaWdubWVudCh0bCkge1xuICAgIGNvbnN0IHtwb3NpdGlvbiwgdGlja3M6IHtjcm9zc0FsaWduLCBtaXJyb3IsIHBhZGRpbmd9fSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBsYWJlbFNpemVzID0gdGhpcy5fZ2V0TGFiZWxTaXplcygpO1xuICAgIGNvbnN0IHRpY2tBbmRQYWRkaW5nID0gdGwgKyBwYWRkaW5nO1xuICAgIGNvbnN0IHdpZGVzdCA9IGxhYmVsU2l6ZXMud2lkZXN0LndpZHRoO1xuXG4gICAgbGV0IHRleHRBbGlnbjtcbiAgICBsZXQgeDtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICBpZiAobWlycm9yKSB7XG4gICAgICAgIHggPSB0aGlzLnJpZ2h0ICsgcGFkZGluZztcblxuICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgICAgeCArPSAod2lkZXN0IC8gMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICB4ICs9IHdpZGVzdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IHRoaXMucmlnaHQgLSB0aWNrQW5kUGFkZGluZztcblxuICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgIHggLT0gKHdpZGVzdCAvIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICB4ID0gdGhpcy5sZWZ0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgaWYgKG1pcnJvcikge1xuICAgICAgICB4ID0gdGhpcy5sZWZ0ICsgcGFkZGluZztcblxuICAgICAgICBpZiAoY3Jvc3NBbGlnbiA9PT0gJ25lYXInKSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgfSBlbHNlIGlmIChjcm9zc0FsaWduID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICAgIHggLT0gKHdpZGVzdCAvIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICB4IC09IHdpZGVzdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeCA9IHRoaXMubGVmdCArIHRpY2tBbmRQYWRkaW5nO1xuXG4gICAgICAgIGlmIChjcm9zc0FsaWduID09PSAnbmVhcicpIHtcbiAgICAgICAgICB0ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgIH0gZWxzZSBpZiAoY3Jvc3NBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICB0ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgICB4ICs9IHdpZGVzdCAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgICAgICAgICB4ID0gdGhpcy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgIH1cblxuICAgIHJldHVybiB7dGV4dEFsaWduLCB4fTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbXB1dGVMYWJlbEFyZWEoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50aWNrcy5taXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdsZWZ0JyB8fCBwb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgcmV0dXJuIHt0b3A6IDAsIGxlZnQ6IHRoaXMubGVmdCwgYm90dG9tOiBjaGFydC5oZWlnaHQsIHJpZ2h0OiB0aGlzLnJpZ2h0fTtcbiAgICB9IGlmIChwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICByZXR1cm4ge3RvcDogdGhpcy50b3AsIGxlZnQ6IDAsIGJvdHRvbTogdGhpcy5ib3R0b20sIHJpZ2h0OiBjaGFydC53aWR0aH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIGRyYXdCYWNrZ3JvdW5kKCkge1xuICAgIGNvbnN0IHtjdHgsIG9wdGlvbnM6IHtiYWNrZ3JvdW5kQ29sb3J9LCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHR9ID0gdGhpcztcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgIGN0eC5maWxsUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRMaW5lV2lkdGhGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLm9wdGlvbnMuZ3JpZDtcbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8ICFncmlkLmRpc3BsYXkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCB0aWNrcyA9IHRoaXMudGlja3M7XG4gICAgY29uc3QgaW5kZXggPSB0aWNrcy5maW5kSW5kZXgodCA9PiB0LnZhbHVlID09PSB2YWx1ZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IG9wdHMgPSBncmlkLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGluZGV4KSk7XG4gICAgICByZXR1cm4gb3B0cy5saW5lV2lkdGg7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdHcmlkKGNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IGdyaWQgPSB0aGlzLm9wdGlvbnMuZ3JpZDtcbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2dyaWRMaW5lSXRlbXMgfHwgKHRoaXMuX2dyaWRMaW5lSXRlbXMgPSB0aGlzLl9jb21wdXRlR3JpZExpbmVJdGVtcyhjaGFydEFyZWEpKTtcbiAgICBsZXQgaSwgaWxlbjtcblxuICAgIGNvbnN0IGRyYXdMaW5lID0gKHAxLCBwMiwgc3R5bGUpID0+IHtcbiAgICAgIGlmICghc3R5bGUud2lkdGggfHwgIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHgubGluZVdpZHRoID0gc3R5bGUud2lkdGg7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHlsZS5jb2xvcjtcbiAgICAgIGN0eC5zZXRMaW5lRGFzaChzdHlsZS5ib3JkZXJEYXNoIHx8IFtdKTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IHN0eWxlLmJvcmRlckRhc2hPZmZzZXQ7XG5cbiAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgIGN0eC5tb3ZlVG8ocDEueCwgcDEueSk7XG4gICAgICBjdHgubGluZVRvKHAyLngsIHAyLnkpO1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9O1xuXG4gICAgaWYgKGdyaWQuZGlzcGxheSkge1xuICAgICAgZm9yIChpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG5cbiAgICAgICAgaWYgKGdyaWQuZHJhd09uQ2hhcnRBcmVhKSB7XG4gICAgICAgICAgZHJhd0xpbmUoXG4gICAgICAgICAgICB7eDogaXRlbS54MSwgeTogaXRlbS55MX0sXG4gICAgICAgICAgICB7eDogaXRlbS54MiwgeTogaXRlbS55Mn0sXG4gICAgICAgICAgICBpdGVtXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChncmlkLmRyYXdUaWNrcykge1xuICAgICAgICAgIGRyYXdMaW5lKFxuICAgICAgICAgICAge3g6IGl0ZW0udHgxLCB5OiBpdGVtLnR5MX0sXG4gICAgICAgICAgICB7eDogaXRlbS50eDIsIHk6IGl0ZW0udHkyfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sb3I6IGl0ZW0udGlja0NvbG9yLFxuICAgICAgICAgICAgICB3aWR0aDogaXRlbS50aWNrV2lkdGgsXG4gICAgICAgICAgICAgIGJvcmRlckRhc2g6IGl0ZW0udGlja0JvcmRlckRhc2gsXG4gICAgICAgICAgICAgIGJvcmRlckRhc2hPZmZzZXQ6IGl0ZW0udGlja0JvcmRlckRhc2hPZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdCb3JkZXIoKSB7XG4gICAgY29uc3Qge2NoYXJ0LCBjdHgsIG9wdGlvbnM6IHtib3JkZXIsIGdyaWR9fSA9IHRoaXM7XG4gICAgY29uc3QgYm9yZGVyT3B0cyA9IGJvcmRlci5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICBjb25zdCBheGlzV2lkdGggPSBib3JkZXIuZGlzcGxheSA/IGJvcmRlck9wdHMud2lkdGggOiAwO1xuICAgIGlmICghYXhpc1dpZHRoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RMaW5lV2lkdGggPSBncmlkLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KDApKS5saW5lV2lkdGg7XG4gICAgY29uc3QgYm9yZGVyVmFsdWUgPSB0aGlzLl9ib3JkZXJWYWx1ZTtcbiAgICBsZXQgeDEsIHgyLCB5MSwgeTI7XG5cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgeDEgPSBfYWxpZ25QaXhlbChjaGFydCwgdGhpcy5sZWZ0LCBheGlzV2lkdGgpIC0gYXhpc1dpZHRoIC8gMjtcbiAgICAgIHgyID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMucmlnaHQsIGxhc3RMaW5lV2lkdGgpICsgbGFzdExpbmVXaWR0aCAvIDI7XG4gICAgICB5MSA9IHkyID0gYm9yZGVyVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHkxID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMudG9wLCBheGlzV2lkdGgpIC0gYXhpc1dpZHRoIC8gMjtcbiAgICAgIHkyID0gX2FsaWduUGl4ZWwoY2hhcnQsIHRoaXMuYm90dG9tLCBsYXN0TGluZVdpZHRoKSArIGxhc3RMaW5lV2lkdGggLyAyO1xuICAgICAgeDEgPSB4MiA9IGJvcmRlclZhbHVlO1xuICAgIH1cbiAgICBjdHguc2F2ZSgpO1xuICAgIGN0eC5saW5lV2lkdGggPSBib3JkZXJPcHRzLndpZHRoO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGJvcmRlck9wdHMuY29sb3I7XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4Lm1vdmVUbyh4MSwgeTEpO1xuICAgIGN0eC5saW5lVG8oeDIsIHkyKTtcbiAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdMYWJlbHMoY2hhcnRBcmVhKSB7XG4gICAgY29uc3Qgb3B0aW9uVGlja3MgPSB0aGlzLm9wdGlvbnMudGlja3M7XG5cbiAgICBpZiAoIW9wdGlvblRpY2tzLmRpc3BsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcblxuICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9jb21wdXRlTGFiZWxBcmVhKCk7XG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIGNsaXBBcmVhKGN0eCwgYXJlYSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldExhYmVsSXRlbXMoY2hhcnRBcmVhKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgIGNvbnN0IHJlbmRlclRleHRPcHRpb25zID0gaXRlbS5vcHRpb25zO1xuICAgICAgY29uc3QgdGlja0ZvbnQgPSBpdGVtLmZvbnQ7XG4gICAgICBjb25zdCBsYWJlbCA9IGl0ZW0ubGFiZWw7XG4gICAgICBjb25zdCB5ID0gaXRlbS50ZXh0T2Zmc2V0O1xuICAgICAgcmVuZGVyVGV4dChjdHgsIGxhYmVsLCAwLCB5LCB0aWNrRm9udCwgcmVuZGVyVGV4dE9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChhcmVhKSB7XG4gICAgICB1bmNsaXBBcmVhKGN0eCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdUaXRsZSgpIHtcbiAgICBjb25zdCB7Y3R4LCBvcHRpb25zOiB7cG9zaXRpb24sIHRpdGxlLCByZXZlcnNlfX0gPSB0aGlzO1xuXG4gICAgaWYgKCF0aXRsZS5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9udCA9IHRvRm9udCh0aXRsZS5mb250KTtcbiAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlLnBhZGRpbmcpO1xuICAgIGNvbnN0IGFsaWduID0gdGl0bGUuYWxpZ247XG4gICAgbGV0IG9mZnNldCA9IGZvbnQubGluZUhlaWdodCAvIDI7XG5cbiAgICBpZiAocG9zaXRpb24gPT09ICdib3R0b20nIHx8IHBvc2l0aW9uID09PSAnY2VudGVyJyB8fCBpc09iamVjdChwb3NpdGlvbikpIHtcbiAgICAgIG9mZnNldCArPSBwYWRkaW5nLmJvdHRvbTtcbiAgICAgIGlmIChpc0FycmF5KHRpdGxlLnRleHQpKSB7XG4gICAgICAgIG9mZnNldCArPSBmb250LmxpbmVIZWlnaHQgKiAodGl0bGUudGV4dC5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0ICs9IHBhZGRpbmcudG9wO1xuICAgIH1cblxuICAgIGNvbnN0IHt0aXRsZVgsIHRpdGxlWSwgbWF4V2lkdGgsIHJvdGF0aW9ufSA9IHRpdGxlQXJncyh0aGlzLCBvZmZzZXQsIHBvc2l0aW9uLCBhbGlnbik7XG5cbiAgICByZW5kZXJUZXh0KGN0eCwgdGl0bGUudGV4dCwgMCwgMCwgZm9udCwge1xuICAgICAgY29sb3I6IHRpdGxlLmNvbG9yLFxuICAgICAgbWF4V2lkdGgsXG4gICAgICByb3RhdGlvbixcbiAgICAgIHRleHRBbGlnbjogdGl0bGVBbGlnbihhbGlnbiwgcG9zaXRpb24sIHJldmVyc2UpLFxuICAgICAgdGV4dEJhc2VsaW5lOiAnbWlkZGxlJyxcbiAgICAgIHRyYW5zbGF0aW9uOiBbdGl0bGVYLCB0aXRsZVldLFxuICAgIH0pO1xuICB9XG5cbiAgZHJhdyhjaGFydEFyZWEpIHtcbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmF3QmFja2dyb3VuZCgpO1xuICAgIHRoaXMuZHJhd0dyaWQoY2hhcnRBcmVhKTtcbiAgICB0aGlzLmRyYXdCb3JkZXIoKTtcbiAgICB0aGlzLmRyYXdUaXRsZSgpO1xuICAgIHRoaXMuZHJhd0xhYmVscyhjaGFydEFyZWEpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEByZXR1cm4ge29iamVjdFtdfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2xheWVycygpIHtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHR6ID0gb3B0cy50aWNrcyAmJiBvcHRzLnRpY2tzLnogfHwgMDtcbiAgICBjb25zdCBneiA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZ3JpZCAmJiBvcHRzLmdyaWQueiwgLTEpO1xuICAgIGNvbnN0IGJ6ID0gdmFsdWVPckRlZmF1bHQob3B0cy5ib3JkZXIgJiYgb3B0cy5ib3JkZXIueiwgMCk7XG5cbiAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZSgpIHx8IHRoaXMuZHJhdyAhPT0gU2NhbGUucHJvdG90eXBlLmRyYXcpIHtcbiAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGRyYXcgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBjdXN0b20gc2NhbGVcbiAgICAgIHJldHVybiBbe1xuICAgICAgICB6OiB0eixcbiAgICAgICAgZHJhdzogKGNoYXJ0QXJlYSkgPT4ge1xuICAgICAgICAgIHRoaXMuZHJhdyhjaGFydEFyZWEpO1xuICAgICAgICB9XG4gICAgICB9XTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3tcbiAgICAgIHo6IGd6LFxuICAgICAgZHJhdzogKGNoYXJ0QXJlYSkgPT4ge1xuICAgICAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMuZHJhd0dyaWQoY2hhcnRBcmVhKTtcbiAgICAgICAgdGhpcy5kcmF3VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB6OiBieixcbiAgICAgIGRyYXc6ICgpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3Qm9yZGVyKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgejogdHosXG4gICAgICBkcmF3OiAoY2hhcnRBcmVhKSA9PiB7XG4gICAgICAgIHRoaXMuZHJhd0xhYmVscyhjaGFydEFyZWEpO1xuICAgICAgfVxuICAgIH1dO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdmlzaWJsZSBkYXRhc2V0IG1ldGFzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoaXMgc2NhbGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlXSAtIGlmIHNwZWNpZmllZCwgYWxzbyBmaWx0ZXIgYnkgZGF0YXNldCB0eXBlXG5cdCAqIEByZXR1cm4ge29iamVjdFtdfVxuXHQgKi9cbiAgZ2V0TWF0Y2hpbmdWaXNpYmxlTWV0YXModHlwZSkge1xuICAgIGNvbnN0IG1ldGFzID0gdGhpcy5jaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgY29uc3QgYXhpc0lEID0gdGhpcy5heGlzICsgJ0F4aXNJRCc7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBjb25zdCBtZXRhID0gbWV0YXNbaV07XG4gICAgICBpZiAobWV0YVtheGlzSURdID09PSB0aGlzLmlkICYmICghdHlwZSB8fCBtZXRhLnR5cGUgPT09IHR5cGUpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1ldGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuXHQgKiBAcmV0dXJuIHtvYmplY3R9XG5cdCAqIEBwcm90ZWN0ZWRcbiBcdCAqL1xuICBfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyhpbmRleCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMudGlja3Muc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoaW5kZXgpKTtcbiAgICByZXR1cm4gdG9Gb250KG9wdHMuZm9udCk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgX21heERpZ2l0cygpIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCkubGluZUhlaWdodDtcbiAgICByZXR1cm4gKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoIDogdGhpcy5oZWlnaHQpIC8gZm9udFNpemU7XG4gIH1cbn1cbiIsICJpbXBvcnQge21lcmdlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCBkZWZhdWx0cywge292ZXJyaWRlc30gZnJvbSAnLi9jb3JlLmRlZmF1bHRzLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcsIGRlZmF1bHRzOiBhbnksIG92ZXJyaWRlcz86IGFueSwgZGVmYXVsdFJvdXRlczogYW55fX0gSUNoYXJ0Q29tcG9uZW50XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHlwZWRSZWdpc3RyeSB7XG4gIGNvbnN0cnVjdG9yKHR5cGUsIHNjb3BlLCBvdmVycmlkZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTtcbiAgICB0aGlzLml0ZW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGlzRm9yVHlwZSh0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZi5jYWxsKHRoaXMudHlwZS5wcm90b3R5cGUsIHR5cGUucHJvdG90eXBlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0lDaGFydENvbXBvbmVudH0gaXRlbVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2NvcGUgd2hlcmUgaXRlbXMgZGVmYXVsdHMgd2VyZSByZWdpc3RlcmVkIHRvLlxuXHQgKi9cbiAgcmVnaXN0ZXIoaXRlbSkge1xuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGl0ZW0pO1xuICAgIGxldCBwYXJlbnRTY29wZTtcblxuICAgIGlmIChpc0lDaGFydENvbXBvbmVudChwcm90bykpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHJlZ2lzdGVyZWQgYW5kIG5vdGUgdGhlIHNjb3BlIHdoZXJlIGl0cyBkZWZhdWx0cyBhcmUuXG4gICAgICBwYXJlbnRTY29wZSA9IHRoaXMucmVnaXN0ZXIocHJvdG8pO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBjb25zdCBpZCA9IGl0ZW0uaWQ7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnNjb3BlICsgJy4nICsgaWQ7XG5cbiAgICBpZiAoIWlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsYXNzIGRvZXMgbm90IGhhdmUgaWQ6ICcgKyBpdGVtKTtcbiAgICB9XG5cbiAgICBpZiAoaWQgaW4gaXRlbXMpIHtcbiAgICAgIC8vIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH1cblxuICAgIGl0ZW1zW2lkXSA9IGl0ZW07XG4gICAgcmVnaXN0ZXJEZWZhdWx0cyhpdGVtLCBzY29wZSwgcGFyZW50U2NvcGUpO1xuICAgIGlmICh0aGlzLm92ZXJyaWRlKSB7XG4gICAgICBkZWZhdWx0cy5vdmVycmlkZShpdGVtLmlkLCBpdGVtLm92ZXJyaWRlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0P31cblx0ICovXG4gIGdldChpZCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zW2lkXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0lDaGFydENvbXBvbmVudH0gaXRlbVxuXHQgKi9cbiAgdW5yZWdpc3RlcihpdGVtKSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIGNvbnN0IGlkID0gaXRlbS5pZDtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuc2NvcGU7XG5cbiAgICBpZiAoaWQgaW4gaXRlbXMpIHtcbiAgICAgIGRlbGV0ZSBpdGVtc1tpZF07XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlICYmIGlkIGluIGRlZmF1bHRzW3Njb3BlXSkge1xuICAgICAgZGVsZXRlIGRlZmF1bHRzW3Njb3BlXVtpZF07XG4gICAgICBpZiAodGhpcy5vdmVycmlkZSkge1xuICAgICAgICBkZWxldGUgb3ZlcnJpZGVzW2lkXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0cyhpdGVtLCBzY29wZSwgcGFyZW50U2NvcGUpIHtcbiAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGVmYXVsdHMgYW5kIGtlZXAgZXhpc3RpbmcgZGVmYXVsdHNcbiAgY29uc3QgaXRlbURlZmF1bHRzID0gbWVyZ2UoT2JqZWN0LmNyZWF0ZShudWxsKSwgW1xuICAgIHBhcmVudFNjb3BlID8gZGVmYXVsdHMuZ2V0KHBhcmVudFNjb3BlKSA6IHt9LFxuICAgIGRlZmF1bHRzLmdldChzY29wZSksXG4gICAgaXRlbS5kZWZhdWx0c1xuICBdKTtcblxuICBkZWZhdWx0cy5zZXQoc2NvcGUsIGl0ZW1EZWZhdWx0cyk7XG5cbiAgaWYgKGl0ZW0uZGVmYXVsdFJvdXRlcykge1xuICAgIHJvdXRlRGVmYXVsdHMoc2NvcGUsIGl0ZW0uZGVmYXVsdFJvdXRlcyk7XG4gIH1cblxuICBpZiAoaXRlbS5kZXNjcmlwdG9ycykge1xuICAgIGRlZmF1bHRzLmRlc2NyaWJlKHNjb3BlLCBpdGVtLmRlc2NyaXB0b3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByb3V0ZURlZmF1bHRzKHNjb3BlLCByb3V0ZXMpIHtcbiAgT2JqZWN0LmtleXMocm91dGVzKS5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eVBhcnRzID0gcHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBzb3VyY2VOYW1lID0gcHJvcGVydHlQYXJ0cy5wb3AoKTtcbiAgICBjb25zdCBzb3VyY2VTY29wZSA9IFtzY29wZV0uY29uY2F0KHByb3BlcnR5UGFydHMpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBwYXJ0cyA9IHJvdXRlc1twcm9wZXJ0eV0uc3BsaXQoJy4nKTtcbiAgICBjb25zdCB0YXJnZXROYW1lID0gcGFydHMucG9wKCk7XG4gICAgY29uc3QgdGFyZ2V0U2NvcGUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgZGVmYXVsdHMucm91dGUoc291cmNlU2NvcGUsIHNvdXJjZU5hbWUsIHRhcmdldFNjb3BlLCB0YXJnZXROYW1lKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzSUNoYXJ0Q29tcG9uZW50KHByb3RvKSB7XG4gIHJldHVybiAnaWQnIGluIHByb3RvICYmICdkZWZhdWx0cycgaW4gcHJvdG87XG59XG4iLCAiaW1wb3J0IERhdGFzZXRDb250cm9sbGVyIGZyb20gJy4vY29yZS5kYXRhc2V0Q29udHJvbGxlci5qcyc7XG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQgU2NhbGUgZnJvbSAnLi9jb3JlLnNjYWxlLmpzJztcbmltcG9ydCBUeXBlZFJlZ2lzdHJ5IGZyb20gJy4vY29yZS50eXBlZFJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7ZWFjaCwgY2FsbGJhY2sgYXMgY2FsbCwgX2NhcGl0YWxpemV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBQbGVhc2UgdXNlIHRoZSBtb2R1bGUncyBkZWZhdWx0IGV4cG9ydCB3aGljaCBwcm92aWRlcyBhIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogTm90ZTogY2xhc3MgaXMgZXhwb3J0ZWQgZm9yIHR5cGVkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lzdHJ5IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250cm9sbGVycyA9IG5ldyBUeXBlZFJlZ2lzdHJ5KERhdGFzZXRDb250cm9sbGVyLCAnZGF0YXNldHMnLCB0cnVlKTtcbiAgICB0aGlzLmVsZW1lbnRzID0gbmV3IFR5cGVkUmVnaXN0cnkoRWxlbWVudCwgJ2VsZW1lbnRzJyk7XG4gICAgdGhpcy5wbHVnaW5zID0gbmV3IFR5cGVkUmVnaXN0cnkoT2JqZWN0LCAncGx1Z2lucycpO1xuICAgIHRoaXMuc2NhbGVzID0gbmV3IFR5cGVkUmVnaXN0cnkoU2NhbGUsICdzY2FsZXMnKTtcbiAgICAvLyBPcmRlciBpcyBpbXBvcnRhbnQsIFNjYWxlIGhhcyBFbGVtZW50IGluIHByb3RvdHlwZSBjaGFpbixcbiAgICAvLyBzbyBTY2FsZXMgbXVzdCBiZSBiZWZvcmUgRWxlbWVudHMuIFBsdWdpbnMgYXJlIGEgZmFsbGJhY2ssIHNvIG5vdCBsaXN0ZWQgaGVyZS5cbiAgICB0aGlzLl90eXBlZFJlZ2lzdHJpZXMgPSBbdGhpcy5jb250cm9sbGVycywgdGhpcy5zY2FsZXMsIHRoaXMuZWxlbWVudHNdO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuXHQgKi9cbiAgYWRkKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MpO1xuICB9XG5cbiAgcmVtb3ZlKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4udHlwZW9mIERhdGFzZXRDb250cm9sbGVyfSBhcmdzXG5cdCAqL1xuICBhZGRDb250cm9sbGVycyguLi5hcmdzKSB7XG4gICAgdGhpcy5fZWFjaCgncmVnaXN0ZXInLCBhcmdzLCB0aGlzLmNvbnRyb2xsZXJzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0gIHsuLi50eXBlb2YgRWxlbWVudH0gYXJnc1xuXHQgKi9cbiAgYWRkRWxlbWVudHMoLi4uYXJncykge1xuICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncywgdGhpcy5lbGVtZW50cyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG5cdCAqL1xuICBhZGRQbHVnaW5zKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCdyZWdpc3RlcicsIGFyZ3MsIHRoaXMucGx1Z2lucyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4udHlwZW9mIFNjYWxlfSBhcmdzXG5cdCAqL1xuICBhZGRTY2FsZXMoLi4uYXJncykge1xuICAgIHRoaXMuX2VhY2goJ3JlZ2lzdGVyJywgYXJncywgdGhpcy5zY2FsZXMpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7dHlwZW9mIERhdGFzZXRDb250cm9sbGVyfVxuXHQgKi9cbiAgZ2V0Q29udHJvbGxlcihpZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMuY29udHJvbGxlcnMsICdjb250cm9sbGVyJyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt0eXBlb2YgRWxlbWVudH1cblx0ICovXG4gIGdldEVsZW1lbnQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0KGlkLCB0aGlzLmVsZW1lbnRzLCAnZWxlbWVudCcpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fVxuXHQgKi9cbiAgZ2V0UGx1Z2luKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldChpZCwgdGhpcy5wbHVnaW5zLCAncGx1Z2luJyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkXG5cdCAqIEByZXR1cm5zIHt0eXBlb2YgU2NhbGV9XG5cdCAqL1xuICBnZXRTY2FsZShpZCkge1xuICAgIHJldHVybiB0aGlzLl9nZXQoaWQsIHRoaXMuc2NhbGVzLCAnc2NhbGUnKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0gIHsuLi50eXBlb2YgRGF0YXNldENvbnRyb2xsZXJ9IGFyZ3Ncblx0ICovXG4gIHJlbW92ZUNvbnRyb2xsZXJzKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5jb250cm9sbGVycyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4udHlwZW9mIEVsZW1lbnR9IGFyZ3Ncblx0ICovXG4gIHJlbW92ZUVsZW1lbnRzKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5lbGVtZW50cyk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG5cdCAqL1xuICByZW1vdmVQbHVnaW5zKC4uLmFyZ3MpIHtcbiAgICB0aGlzLl9lYWNoKCd1bnJlZ2lzdGVyJywgYXJncywgdGhpcy5wbHVnaW5zKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0gIHsuLi50eXBlb2YgU2NhbGV9IGFyZ3Ncblx0ICovXG4gIHJlbW92ZVNjYWxlcyguLi5hcmdzKSB7XG4gICAgdGhpcy5fZWFjaCgndW5yZWdpc3RlcicsIGFyZ3MsIHRoaXMuc2NhbGVzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2VhY2gobWV0aG9kLCBhcmdzLCB0eXBlZFJlZ2lzdHJ5KSB7XG4gICAgWy4uLmFyZ3NdLmZvckVhY2goYXJnID0+IHtcbiAgICAgIGNvbnN0IHJlZyA9IHR5cGVkUmVnaXN0cnkgfHwgdGhpcy5fZ2V0UmVnaXN0cnlGb3JUeXBlKGFyZyk7XG4gICAgICBpZiAodHlwZWRSZWdpc3RyeSB8fCByZWcuaXNGb3JUeXBlKGFyZykgfHwgKHJlZyA9PT0gdGhpcy5wbHVnaW5zICYmIGFyZy5pZCkpIHtcbiAgICAgICAgdGhpcy5fZXhlYyhtZXRob2QsIHJlZywgYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBsb29wYWJsZSBhcmdzXG4gICAgICAgIC8vIFVzZSBjYXNlOlxuICAgICAgICAvLyAgaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tICcuL3BsdWdpbnMuanMnO1xuICAgICAgICAvLyAgQ2hhcnQucmVnaXN0ZXIocGx1Z2lucyk7XG4gICAgICAgIGVhY2goYXJnLCBpdGVtID0+IHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbWl4ZWQgdHlwZXMgaW4gdGhlIGxvb3BhYmxlLCBtYWtlIHN1cmUgdGhvc2UgYXJlXG4gICAgICAgICAgLy8gcmVnaXN0ZXJlZCBpbiBjb3JyZWN0IHJlZ2lzdHJ5XG4gICAgICAgICAgLy8gVXNlIGNhc2U6ICh0cmVlbWFwIGV4cG9ydGluZyBjb250cm9sbGVyLCBlbGVtZW50cyBldGMpXG4gICAgICAgICAgLy8gIGltcG9ydCAqIGFzIHRyZWVtYXAgZnJvbSAnY2hhcnRqcy1jaGFydC10cmVlbWFwLmpzJztcbiAgICAgICAgICAvLyAgQ2hhcnQucmVnaXN0ZXIodHJlZW1hcCk7XG5cbiAgICAgICAgICBjb25zdCBpdGVtUmVnID0gdHlwZWRSZWdpc3RyeSB8fCB0aGlzLl9nZXRSZWdpc3RyeUZvclR5cGUoaXRlbSk7XG4gICAgICAgICAgdGhpcy5fZXhlYyhtZXRob2QsIGl0ZW1SZWcsIGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2V4ZWMobWV0aG9kLCByZWdpc3RyeSwgY29tcG9uZW50KSB7XG4gICAgY29uc3QgY2FtZWxNZXRob2QgPSBfY2FwaXRhbGl6ZShtZXRob2QpO1xuICAgIGNhbGwoY29tcG9uZW50WydiZWZvcmUnICsgY2FtZWxNZXRob2RdLCBbXSwgY29tcG9uZW50KTsgLy8gYmVmb3JlUmVnaXN0ZXIgLyBiZWZvcmVVbnJlZ2lzdGVyXG4gICAgcmVnaXN0cnlbbWV0aG9kXShjb21wb25lbnQpO1xuICAgIGNhbGwoY29tcG9uZW50WydhZnRlcicgKyBjYW1lbE1ldGhvZF0sIFtdLCBjb21wb25lbnQpOyAvLyBhZnRlclJlZ2lzdGVyIC8gYWZ0ZXJVbnJlZ2lzdGVyXG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRSZWdpc3RyeUZvclR5cGUodHlwZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdHlwZWRSZWdpc3RyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZWcgPSB0aGlzLl90eXBlZFJlZ2lzdHJpZXNbaV07XG4gICAgICBpZiAocmVnLmlzRm9yVHlwZSh0eXBlKSkge1xuICAgICAgICByZXR1cm4gcmVnO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBwbHVnaW5zIGlzIHRoZSBmYWxsYmFjayByZWdpc3RyeVxuICAgIHJldHVybiB0aGlzLnBsdWdpbnM7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXQoaWQsIHR5cGVkUmVnaXN0cnksIHR5cGUpIHtcbiAgICBjb25zdCBpdGVtID0gdHlwZWRSZWdpc3RyeS5nZXQoaWQpO1xuICAgIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgaWQgKyAnXCIgaXMgbm90IGEgcmVnaXN0ZXJlZCAnICsgdHlwZSArICcuJyk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbn1cblxuLy8gc2luZ2xldG9uIGluc3RhbmNlXG5leHBvcnQgZGVmYXVsdCAvKiAjX19QVVJFX18gKi8gbmV3IFJlZ2lzdHJ5KCk7XG4iLCAiaW1wb3J0IHJlZ2lzdHJ5IGZyb20gJy4vY29yZS5yZWdpc3RyeS5qcyc7XG5pbXBvcnQge2NhbGxiYWNrIGFzIGNhbGxDYWxsYmFjaywgaXNOdWxsT3JVbmRlZiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9jb3JlLmNvbnRyb2xsZXIuanMnKS5kZWZhdWx0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLkNoYXJ0RXZlbnQgfSBDaGFydEV2ZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vcGx1Z2lucy9wbHVnaW4udG9vbHRpcC5qcycpLmRlZmF1bHQgfSBUb29sdGlwXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgZmlsdGVyQ2FsbGJhY2tcbiAqIEBwYXJhbSB7e3BsdWdpbjogb2JqZWN0LCBvcHRpb25zOiBvYmplY3R9fSB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IFtpbmRleF1cbiAqIEBwYXJhbSB7YXJyYXl9IFthcnJheV1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbdGhpc0FyZ11cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5TZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5faW5pdCA9IFtdO1xuICB9XG5cbiAgLyoqXG5cdCAqIENhbGxzIGVuYWJsZWQgcGx1Z2lucyBmb3IgYGNoYXJ0YCBvbiB0aGUgc3BlY2lmaWVkIGhvb2sgYW5kIHdpdGggdGhlIGdpdmVuIGFyZ3MuXG5cdCAqIFRoaXMgbWV0aG9kIGltbWVkaWF0ZWx5IHJldHVybnMgYXMgc29vbiBhcyBhIHBsdWdpbiBleHBsaWNpdGx5IHJldHVybnMgZmFsc2UuIFRoZVxuXHQgKiByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCwgZm9yIGluc3RhbmNlLCB0byBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgYWN0aW9uLlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZSBmb3Igd2hpY2ggcGx1Z2lucyBzaG91bGQgYmUgY2FsbGVkLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaG9vayAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gbWV0aG9kIHRvIGNhbGwgKGUuZy4gJ2JlZm9yZVVwZGF0ZScpLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gRXh0cmEgYXJndW1lbnRzIHRvIGFwcGx5IHRvIHRoZSBob29rIGNhbGwuXG4gICAqIEBwYXJhbSB7ZmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdIC0gRmlsdGVyaW5nIGZ1bmN0aW9uIGZvciBsaW1pdGluZyB3aGljaCBwbHVnaW5zIGFyZSBub3RpZmllZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gZmFsc2UgaWYgYW55IG9mIHRoZSBwbHVnaW5zIHJldHVybiBmYWxzZSwgZWxzZSByZXR1cm5zIHRydWUuXG5cdCAqL1xuICBub3RpZnkoY2hhcnQsIGhvb2ssIGFyZ3MsIGZpbHRlcikge1xuICAgIGlmIChob29rID09PSAnYmVmb3JlSW5pdCcpIHtcbiAgICAgIHRoaXMuX2luaXQgPSB0aGlzLl9jcmVhdGVEZXNjcmlwdG9ycyhjaGFydCwgdHJ1ZSk7XG4gICAgICB0aGlzLl9ub3RpZnkodGhpcy5faW5pdCwgY2hhcnQsICdpbnN0YWxsJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSBmaWx0ZXIgPyB0aGlzLl9kZXNjcmlwdG9ycyhjaGFydCkuZmlsdGVyKGZpbHRlcikgOiB0aGlzLl9kZXNjcmlwdG9ycyhjaGFydCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fbm90aWZ5KGRlc2NyaXB0b3JzLCBjaGFydCwgaG9vaywgYXJncyk7XG5cbiAgICBpZiAoaG9vayA9PT0gJ2FmdGVyRGVzdHJveScpIHtcbiAgICAgIHRoaXMuX25vdGlmeShkZXNjcmlwdG9ycywgY2hhcnQsICdzdG9wJyk7XG4gICAgICB0aGlzLl9ub3RpZnkodGhpcy5faW5pdCwgY2hhcnQsICd1bmluc3RhbGwnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX25vdGlmeShkZXNjcmlwdG9ycywgY2hhcnQsIGhvb2ssIGFyZ3MpIHtcbiAgICBhcmdzID0gYXJncyB8fCB7fTtcbiAgICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgZGVzY3JpcHRvcnMpIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGRlc2NyaXB0b3IucGx1Z2luO1xuICAgICAgY29uc3QgbWV0aG9kID0gcGx1Z2luW2hvb2tdO1xuICAgICAgY29uc3QgcGFyYW1zID0gW2NoYXJ0LCBhcmdzLCBkZXNjcmlwdG9yLm9wdGlvbnNdO1xuICAgICAgaWYgKGNhbGxDYWxsYmFjayhtZXRob2QsIHBhcmFtcywgcGx1Z2luKSA9PT0gZmFsc2UgJiYgYXJncy5jYW5jZWxhYmxlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGludmFsaWRhdGUoKSB7XG4gICAgLy8gV2hlbiBwbHVnaW5zIGFyZSByZWdpc3RlcmVkLCB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgb2YgYSBkb3VibGVcbiAgICAvLyBpbnZhbGlkYXRlIHNpdHVhdGlvbi4gSW4gdGhpcyBjYXNlLCB3ZSBvbmx5IHdhbnQgdG8gaW52YWxpZGF0ZSBvbmNlLlxuICAgIC8vIElmIHdlIGludmFsaWRhdGUgbXVsdGlwbGUgdGltZXMsIHRoZSBgX29sZENhY2hlYCBpcyBsb3N0IGFuZCBhbGwgb2YgdGhlXG4gICAgLy8gcGx1Z2lucyBhcmUgcmVzdGFydGVkIHdpdGhvdXQgYmVpbmcgY29ycmVjdGx5IHN0b3BwZWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy84MTQ3XG4gICAgaWYgKCFpc051bGxPclVuZGVmKHRoaXMuX2NhY2hlKSkge1xuICAgICAgdGhpcy5fb2xkQ2FjaGUgPSB0aGlzLl9jYWNoZTtcbiAgICAgIHRoaXMuX2NhY2hlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2Rlc2NyaXB0b3JzKGNoYXJ0KSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRvcnMgPSB0aGlzLl9jYWNoZSA9IHRoaXMuX2NyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0KTtcblxuICAgIHRoaXMuX25vdGlmeVN0YXRlQ2hhbmdlcyhjaGFydCk7XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcnM7XG4gIH1cblxuICBfY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQsIGFsbCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNoYXJ0ICYmIGNoYXJ0LmNvbmZpZztcbiAgICBjb25zdCBvcHRpb25zID0gdmFsdWVPckRlZmF1bHQoY29uZmlnLm9wdGlvbnMgJiYgY29uZmlnLm9wdGlvbnMucGx1Z2lucywge30pO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBhbGxQbHVnaW5zKGNvbmZpZyk7XG4gICAgLy8gb3B0aW9ucyA9PT0gZmFsc2UgPT4gYWxsIHBsdWdpbnMgYXJlIGRpc2FibGVkXG4gICAgcmV0dXJuIG9wdGlvbnMgPT09IGZhbHNlICYmICFhbGwgPyBbXSA6IGNyZWF0ZURlc2NyaXB0b3JzKGNoYXJ0LCBwbHVnaW5zLCBvcHRpb25zLCBhbGwpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfbm90aWZ5U3RhdGVDaGFuZ2VzKGNoYXJ0KSB7XG4gICAgY29uc3QgcHJldmlvdXNEZXNjcmlwdG9ycyA9IHRoaXMuX29sZENhY2hlIHx8IFtdO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gdGhpcy5fY2FjaGU7XG4gICAgY29uc3QgZGlmZiA9IChhLCBiKSA9PiBhLmZpbHRlcih4ID0+ICFiLnNvbWUoeSA9PiB4LnBsdWdpbi5pZCA9PT0geS5wbHVnaW4uaWQpKTtcbiAgICB0aGlzLl9ub3RpZnkoZGlmZihwcmV2aW91c0Rlc2NyaXB0b3JzLCBkZXNjcmlwdG9ycyksIGNoYXJ0LCAnc3RvcCcpO1xuICAgIHRoaXMuX25vdGlmeShkaWZmKGRlc2NyaXB0b3JzLCBwcmV2aW91c0Rlc2NyaXB0b3JzKSwgY2hhcnQsICdzdGFydCcpO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vY29yZS5jb25maWcuanMnKS5kZWZhdWx0fSBjb25maWdcbiAqL1xuZnVuY3Rpb24gYWxsUGx1Z2lucyhjb25maWcpIHtcbiAgY29uc3QgbG9jYWxJZHMgPSB7fTtcbiAgY29uc3QgcGx1Z2lucyA9IFtdO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVnaXN0cnkucGx1Z2lucy5pdGVtcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHBsdWdpbnMucHVzaChyZWdpc3RyeS5nZXRQbHVnaW4oa2V5c1tpXSkpO1xuICB9XG5cbiAgY29uc3QgbG9jYWwgPSBjb25maWcucGx1Z2lucyB8fCBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBsdWdpbiA9IGxvY2FsW2ldO1xuXG4gICAgaWYgKHBsdWdpbnMuaW5kZXhPZihwbHVnaW4pID09PSAtMSkge1xuICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICBsb2NhbElkc1twbHVnaW4uaWRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3BsdWdpbnMsIGxvY2FsSWRzfTtcbn1cblxuZnVuY3Rpb24gZ2V0T3B0cyhvcHRpb25zLCBhbGwpIHtcbiAgaWYgKCFhbGwgJiYgb3B0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAob3B0aW9ucyA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gY3JlYXRlRGVzY3JpcHRvcnMoY2hhcnQsIHtwbHVnaW5zLCBsb2NhbElkc30sIG9wdGlvbnMsIGFsbCkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgY29udGV4dCA9IGNoYXJ0LmdldENvbnRleHQoKTtcblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG4gICAgY29uc3QgaWQgPSBwbHVnaW4uaWQ7XG4gICAgY29uc3Qgb3B0cyA9IGdldE9wdHMob3B0aW9uc1tpZF0sIGFsbCk7XG4gICAgaWYgKG9wdHMgPT09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXN1bHQucHVzaCh7XG4gICAgICBwbHVnaW4sXG4gICAgICBvcHRpb25zOiBwbHVnaW5PcHRzKGNoYXJ0LmNvbmZpZywge3BsdWdpbiwgbG9jYWw6IGxvY2FsSWRzW2lkXX0sIG9wdHMsIGNvbnRleHQpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBwbHVnaW5PcHRzKGNvbmZpZywge3BsdWdpbiwgbG9jYWx9LCBvcHRzLCBjb250ZXh0KSB7XG4gIGNvbnN0IGtleXMgPSBjb25maWcucGx1Z2luU2NvcGVLZXlzKHBsdWdpbik7XG4gIGNvbnN0IHNjb3BlcyA9IGNvbmZpZy5nZXRPcHRpb25TY29wZXMob3B0cywga2V5cyk7XG4gIGlmIChsb2NhbCAmJiBwbHVnaW4uZGVmYXVsdHMpIHtcbiAgICAvLyBtYWtlIHN1cmUgcGx1Z2luIGRlZmF1bHRzIGFyZSBpbiBzY29wZXMgZm9yIGxvY2FsIChub3QgcmVnaXN0ZXJlZCkgcGx1Z2luc1xuICAgIHNjb3Blcy5wdXNoKHBsdWdpbi5kZWZhdWx0cyk7XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5jcmVhdGVSZXNvbHZlcihzY29wZXMsIGNvbnRleHQsIFsnJ10sIHtcbiAgICAvLyBUaGVzZSBhcmUganVzdCBkZWZhdWx0cyB0aGF0IHBsdWdpbnMgY2FuIG92ZXJyaWRlXG4gICAgc2NyaXB0YWJsZTogZmFsc2UsXG4gICAgaW5kZXhhYmxlOiBmYWxzZSxcbiAgICBhbGxLZXlzOiB0cnVlXG4gIH0pO1xufVxuIiwgImltcG9ydCBkZWZhdWx0cywge292ZXJyaWRlcywgZGVzY3JpcHRvcnN9IGZyb20gJy4vY29yZS5kZWZhdWx0cy5qcyc7XG5pbXBvcnQge21lcmdlSWYsIHJlc29sdmVPYmplY3RLZXksIGlzQXJyYXksIGlzRnVuY3Rpb24sIHZhbHVlT3JEZWZhdWx0LCBpc09iamVjdH0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvcmUuanMnO1xuaW1wb3J0IHtfYXR0YWNoQ29udGV4dCwgX2NyZWF0ZVJlc29sdmVyLCBfZGVzY3JpcHRvcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhBeGlzKHR5cGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0YXNldERlZmF1bHRzID0gZGVmYXVsdHMuZGF0YXNldHNbdHlwZV0gfHwge307XG4gIGNvbnN0IGRhdGFzZXRPcHRpb25zID0gKG9wdGlvbnMuZGF0YXNldHMgfHwge30pW3R5cGVdIHx8IHt9O1xuICByZXR1cm4gZGF0YXNldE9wdGlvbnMuaW5kZXhBeGlzIHx8IG9wdGlvbnMuaW5kZXhBeGlzIHx8IGRhdGFzZXREZWZhdWx0cy5pbmRleEF4aXMgfHwgJ3gnO1xufVxuXG5mdW5jdGlvbiBnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEKGlkLCBpbmRleEF4aXMpIHtcbiAgbGV0IGF4aXMgPSBpZDtcbiAgaWYgKGlkID09PSAnX2luZGV4XycpIHtcbiAgICBheGlzID0gaW5kZXhBeGlzO1xuICB9IGVsc2UgaWYgKGlkID09PSAnX3ZhbHVlXycpIHtcbiAgICBheGlzID0gaW5kZXhBeGlzID09PSAneCcgPyAneScgOiAneCc7XG4gIH1cbiAgcmV0dXJuIGF4aXM7XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRTY2FsZUlERnJvbUF4aXMoYXhpcywgaW5kZXhBeGlzKSB7XG4gIHJldHVybiBheGlzID09PSBpbmRleEF4aXMgPyAnX2luZGV4XycgOiAnX3ZhbHVlXyc7XG59XG5cbmZ1bmN0aW9uIGF4aXNGcm9tUG9zaXRpb24ocG9zaXRpb24pIHtcbiAgaWYgKHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICByZXR1cm4gJ3gnO1xuICB9XG4gIGlmIChwb3NpdGlvbiA9PT0gJ2xlZnQnIHx8IHBvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgcmV0dXJuICd5JztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lQXhpcyhpZCwgc2NhbGVPcHRpb25zKSB7XG4gIGlmIChpZCA9PT0gJ3gnIHx8IGlkID09PSAneScgfHwgaWQgPT09ICdyJykge1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGlkID0gc2NhbGVPcHRpb25zLmF4aXNcbiAgICB8fCBheGlzRnJvbVBvc2l0aW9uKHNjYWxlT3B0aW9ucy5wb3NpdGlvbilcbiAgICB8fCBpZC5sZW5ndGggPiAxICYmIGRldGVybWluZUF4aXMoaWRbMF0udG9Mb3dlckNhc2UoKSwgc2NhbGVPcHRpb25zKTtcblxuICBpZiAoaWQpIHtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlcm1pbmUgdHlwZSBvZiAnJHtuYW1lfScgYXhpcy4gUGxlYXNlIHByb3ZpZGUgJ2F4aXMnIG9yICdwb3NpdGlvbicgb3B0aW9uLmApO1xufVxuXG5mdW5jdGlvbiBtZXJnZVNjYWxlQ29uZmlnKGNvbmZpZywgb3B0aW9ucykge1xuICBjb25zdCBjaGFydERlZmF1bHRzID0gb3ZlcnJpZGVzW2NvbmZpZy50eXBlXSB8fCB7c2NhbGVzOiB7fX07XG4gIGNvbnN0IGNvbmZpZ1NjYWxlcyA9IG9wdGlvbnMuc2NhbGVzIHx8IHt9O1xuICBjb25zdCBjaGFydEluZGV4QXhpcyA9IGdldEluZGV4QXhpcyhjb25maWcudHlwZSwgb3B0aW9ucyk7XG4gIGNvbnN0IHNjYWxlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gRmlyc3QgZmlndXJlIG91dCBmaXJzdCBzY2FsZSBpZCdzIHBlciBheGlzLlxuICBPYmplY3Qua2V5cyhjb25maWdTY2FsZXMpLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IHNjYWxlQ29uZiA9IGNvbmZpZ1NjYWxlc1tpZF07XG4gICAgaWYgKCFpc09iamVjdChzY2FsZUNvbmYpKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgSW52YWxpZCBzY2FsZSBjb25maWd1cmF0aW9uIGZvciBzY2FsZTogJHtpZH1gKTtcbiAgICB9XG4gICAgaWYgKHNjYWxlQ29uZi5fcHJveHkpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLndhcm4oYElnbm9yaW5nIHJlc29sdmVyIHBhc3NlZCBhcyBvcHRpb25zIGZvciBzY2FsZTogJHtpZH1gKTtcbiAgICB9XG4gICAgY29uc3QgYXhpcyA9IGRldGVybWluZUF4aXMoaWQsIHNjYWxlQ29uZik7XG4gICAgY29uc3QgZGVmYXVsdElkID0gZ2V0RGVmYXVsdFNjYWxlSURGcm9tQXhpcyhheGlzLCBjaGFydEluZGV4QXhpcyk7XG4gICAgY29uc3QgZGVmYXVsdFNjYWxlT3B0aW9ucyA9IGNoYXJ0RGVmYXVsdHMuc2NhbGVzIHx8IHt9O1xuICAgIHNjYWxlc1tpZF0gPSBtZXJnZUlmKE9iamVjdC5jcmVhdGUobnVsbCksIFt7YXhpc30sIHNjYWxlQ29uZiwgZGVmYXVsdFNjYWxlT3B0aW9uc1theGlzXSwgZGVmYXVsdFNjYWxlT3B0aW9uc1tkZWZhdWx0SWRdXSk7XG4gIH0pO1xuXG4gIC8vIFRoZW4gbWVyZ2UgZGF0YXNldCBkZWZhdWx0cyB0byBzY2FsZSBjb25maWdzXG4gIGNvbmZpZy5kYXRhLmRhdGFzZXRzLmZvckVhY2goZGF0YXNldCA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGFzZXQudHlwZSB8fCBjb25maWcudHlwZTtcbiAgICBjb25zdCBpbmRleEF4aXMgPSBkYXRhc2V0LmluZGV4QXhpcyB8fCBnZXRJbmRleEF4aXModHlwZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgZGF0YXNldERlZmF1bHRzID0gb3ZlcnJpZGVzW3R5cGVdIHx8IHt9O1xuICAgIGNvbnN0IGRlZmF1bHRTY2FsZU9wdGlvbnMgPSBkYXRhc2V0RGVmYXVsdHMuc2NhbGVzIHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKGRlZmF1bHRTY2FsZU9wdGlvbnMpLmZvckVhY2goZGVmYXVsdElEID0+IHtcbiAgICAgIGNvbnN0IGF4aXMgPSBnZXRBeGlzRnJvbURlZmF1bHRTY2FsZUlEKGRlZmF1bHRJRCwgaW5kZXhBeGlzKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YXNldFtheGlzICsgJ0F4aXNJRCddIHx8IGF4aXM7XG4gICAgICBzY2FsZXNbaWRdID0gc2NhbGVzW2lkXSB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbWVyZ2VJZihzY2FsZXNbaWRdLCBbe2F4aXN9LCBjb25maWdTY2FsZXNbaWRdLCBkZWZhdWx0U2NhbGVPcHRpb25zW2RlZmF1bHRJRF1dKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gYXBwbHkgc2NhbGUgZGVmYXVsdHMsIGlmIG5vdCBvdmVycmlkZGVuIGJ5IGRhdGFzZXQgZGVmYXVsdHNcbiAgT2JqZWN0LmtleXMoc2NhbGVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3Qgc2NhbGUgPSBzY2FsZXNba2V5XTtcbiAgICBtZXJnZUlmKHNjYWxlLCBbZGVmYXVsdHMuc2NhbGVzW3NjYWxlLnR5cGVdLCBkZWZhdWx0cy5zY2FsZV0pO1xuICB9KTtcblxuICByZXR1cm4gc2NhbGVzO1xufVxuXG5mdW5jdGlvbiBpbml0T3B0aW9ucyhjb25maWcpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zIHx8IChjb25maWcub3B0aW9ucyA9IHt9KTtcblxuICBvcHRpb25zLnBsdWdpbnMgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnBsdWdpbnMsIHt9KTtcbiAgb3B0aW9ucy5zY2FsZXMgPSBtZXJnZVNjYWxlQ29uZmlnKGNvbmZpZywgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhKGRhdGEpIHtcbiAgZGF0YSA9IGRhdGEgfHwge307XG4gIGRhdGEuZGF0YXNldHMgPSBkYXRhLmRhdGFzZXRzIHx8IFtdO1xuICBkYXRhLmxhYmVscyA9IGRhdGEubGFiZWxzIHx8IFtdO1xuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gaW5pdENvbmZpZyhjb25maWcpIHtcbiAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICBjb25maWcuZGF0YSA9IGluaXREYXRhKGNvbmZpZy5kYXRhKTtcblxuICBpbml0T3B0aW9ucyhjb25maWcpO1xuXG4gIHJldHVybiBjb25maWc7XG59XG5cbmNvbnN0IGtleUNhY2hlID0gbmV3IE1hcCgpO1xuY29uc3Qga2V5c0NhY2hlZCA9IG5ldyBTZXQoKTtcblxuZnVuY3Rpb24gY2FjaGVkS2V5cyhjYWNoZUtleSwgZ2VuZXJhdGUpIHtcbiAgbGV0IGtleXMgPSBrZXlDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICBpZiAoIWtleXMpIHtcbiAgICBrZXlzID0gZ2VuZXJhdGUoKTtcbiAgICBrZXlDYWNoZS5zZXQoY2FjaGVLZXksIGtleXMpO1xuICAgIGtleXNDYWNoZWQuYWRkKGtleXMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuXG5jb25zdCBhZGRJZkZvdW5kID0gKHNldCwgb2JqLCBrZXkpID0+IHtcbiAgY29uc3Qgb3B0cyA9IHJlc29sdmVPYmplY3RLZXkob2JqLCBrZXkpO1xuICBpZiAob3B0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0LmFkZChvcHRzKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gaW5pdENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX3Njb3BlQ2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fcmVzb2x2ZXJDYWNoZSA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIGdldCBwbGF0Zm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLnBsYXRmb3JtO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy50eXBlO1xuICB9XG5cbiAgc2V0IHR5cGUodHlwZSkge1xuICAgIHRoaXMuX2NvbmZpZy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuZGF0YTtcbiAgfVxuXG4gIHNldCBkYXRhKGRhdGEpIHtcbiAgICB0aGlzLl9jb25maWcuZGF0YSA9IGluaXREYXRhKGRhdGEpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5vcHRpb25zO1xuICB9XG5cbiAgc2V0IG9wdGlvbnMob3B0aW9ucykge1xuICAgIHRoaXMuX2NvbmZpZy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIGdldCBwbHVnaW5zKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcucGx1Z2lucztcbiAgfVxuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLl9jb25maWc7XG4gICAgdGhpcy5jbGVhckNhY2hlKCk7XG4gICAgaW5pdE9wdGlvbnMoY29uZmlnKTtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7XG4gICAgdGhpcy5fc2NvcGVDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX3Jlc29sdmVyQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcHRpb24gc2NvcGUga2V5cyBmb3IgcmVzb2x2aW5nIGRhdGFzZXQgb3B0aW9ucy5cbiAgICogVGhlc2Uga2V5cyBkbyBub3QgaW5jbHVkZSB0aGUgZGF0YXNldCBpdHNlbGYsIGJlY2F1c2UgaXQgaXMgbm90IHVuZGVyIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc2V0VHlwZVxuICAgKiBAcmV0dXJuIHtzdHJpbmdbXVtdfVxuICAgKi9cbiAgZGF0YXNldFNjb3BlS2V5cyhkYXRhc2V0VHlwZSkge1xuICAgIHJldHVybiBjYWNoZWRLZXlzKGRhdGFzZXRUeXBlLFxuICAgICAgKCkgPT4gW1tcbiAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgJydcbiAgICAgIF1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcHRpb24gc2NvcGUga2V5cyBmb3IgcmVzb2x2aW5nIGRhdGFzZXQgYW5pbWF0aW9uIG9wdGlvbnMuXG4gICAqIFRoZXNlIGtleXMgZG8gbm90IGluY2x1ZGUgdGhlIGRhdGFzZXQgaXRzZWxmLCBiZWNhdXNlIGl0IGlzIG5vdCB1bmRlciBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNldFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zaXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nW11bXX1cbiAgICovXG4gIGRhdGFzZXRBbmltYXRpb25TY29wZUtleXMoZGF0YXNldFR5cGUsIHRyYW5zaXRpb24pIHtcbiAgICByZXR1cm4gY2FjaGVkS2V5cyhgJHtkYXRhc2V0VHlwZX0udHJhbnNpdGlvbi4ke3RyYW5zaXRpb259YCxcbiAgICAgICgpID0+IFtcbiAgICAgICAgW1xuICAgICAgICAgIGBkYXRhc2V0cy4ke2RhdGFzZXRUeXBlfS50cmFuc2l0aW9ucy4ke3RyYW5zaXRpb259YCxcbiAgICAgICAgICBgdHJhbnNpdGlvbnMuJHt0cmFuc2l0aW9ufWAsXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgZm9yIGxvb2tpbmcgdXAgdGhlIGBhbmltYXRpb25zYCBhbmQgYGFuaW1hdGlvbmAga2V5c1xuICAgICAgICBbXG4gICAgICAgICAgYGRhdGFzZXRzLiR7ZGF0YXNldFR5cGV9YCxcbiAgICAgICAgICAnJ1xuICAgICAgICBdXG4gICAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvcHRpb25zIHNjb3BlIGtleXMgZm9yIHJlc29sdmluZyBlbGVtZW50IG9wdGlvbnMgdGhhdCBiZWxvbmdcbiAgICogdG8gYW4gZGF0YXNldC4gVGhlc2Uga2V5cyBkbyBub3QgaW5jbHVkZSB0aGUgZGF0YXNldCBpdHNlbGYsIGJlY2F1c2UgaXRcbiAgICogaXMgbm90IHVuZGVyIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc2V0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZWxlbWVudFR5cGVcbiAgICogQHJldHVybiB7c3RyaW5nW11bXX1cbiAgICovXG4gIGRhdGFzZXRFbGVtZW50U2NvcGVLZXlzKGRhdGFzZXRUeXBlLCBlbGVtZW50VHlwZSkge1xuICAgIHJldHVybiBjYWNoZWRLZXlzKGAke2RhdGFzZXRUeXBlfS0ke2VsZW1lbnRUeXBlfWAsXG4gICAgICAoKSA9PiBbW1xuICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX0uZWxlbWVudHMuJHtlbGVtZW50VHlwZX1gLFxuICAgICAgICBgZGF0YXNldHMuJHtkYXRhc2V0VHlwZX1gLFxuICAgICAgICBgZWxlbWVudHMuJHtlbGVtZW50VHlwZX1gLFxuICAgICAgICAnJ1xuICAgICAgXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG9wdGlvbnMgc2NvcGUga2V5cyBmb3IgcmVzb2x2aW5nIHBsdWdpbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3tpZDogc3RyaW5nLCBhZGRpdGlvbmFsT3B0aW9uU2NvcGVzPzogc3RyaW5nW119fSBwbHVnaW5cbiAgICogQHJldHVybiB7c3RyaW5nW11bXX1cbiAgICovXG4gIHBsdWdpblNjb3BlS2V5cyhwbHVnaW4pIHtcbiAgICBjb25zdCBpZCA9IHBsdWdpbi5pZDtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlO1xuICAgIHJldHVybiBjYWNoZWRLZXlzKGAke3R5cGV9LXBsdWdpbi0ke2lkfWAsXG4gICAgICAoKSA9PiBbW1xuICAgICAgICBgcGx1Z2lucy4ke2lkfWAsXG4gICAgICAgIC4uLnBsdWdpbi5hZGRpdGlvbmFsT3B0aW9uU2NvcGVzIHx8IFtdLFxuICAgICAgXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FjaGVkU2NvcGVzKG1haW5TY29wZSwgcmVzZXRDYWNoZSkge1xuICAgIGNvbnN0IF9zY29wZUNhY2hlID0gdGhpcy5fc2NvcGVDYWNoZTtcbiAgICBsZXQgY2FjaGUgPSBfc2NvcGVDYWNoZS5nZXQobWFpblNjb3BlKTtcbiAgICBpZiAoIWNhY2hlIHx8IHJlc2V0Q2FjaGUpIHtcbiAgICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgICAgX3Njb3BlQ2FjaGUuc2V0KG1haW5TY29wZSwgY2FjaGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIG9iamVjdHMgZnJvbSBvcHRpb25zIGFuZCBkZWZhdWx0cyBmb3Igb3B0aW9uIHZhbHVlIHJlc29sdXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtYWluU2NvcGUgLSBUaGUgbWFpbiBzY29wZSBvYmplY3QgZm9yIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmdbXVtdfSBrZXlMaXN0cyAtIFRoZSBhcnJheXMgb2Yga2V5cyBpbiByZXNvbHV0aW9uIG9yZGVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jlc2V0Q2FjaGVdIC0gcmVzZXQgdGhlIGNhY2hlIGZvciB0aGlzIG1haW5TY29wZVxuICAgKi9cbiAgZ2V0T3B0aW9uU2NvcGVzKG1haW5TY29wZSwga2V5TGlzdHMsIHJlc2V0Q2FjaGUpIHtcbiAgICBjb25zdCB7b3B0aW9ucywgdHlwZX0gPSB0aGlzO1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5fY2FjaGVkU2NvcGVzKG1haW5TY29wZSwgcmVzZXRDYWNoZSk7XG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGtleUxpc3RzKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlcyA9IG5ldyBTZXQoKTtcblxuICAgIGtleUxpc3RzLmZvckVhY2goa2V5cyA9PiB7XG4gICAgICBpZiAobWFpblNjb3BlKSB7XG4gICAgICAgIHNjb3Blcy5hZGQobWFpblNjb3BlKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiBhZGRJZkZvdW5kKHNjb3BlcywgbWFpblNjb3BlLCBrZXkpKTtcbiAgICAgIH1cbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4gYWRkSWZGb3VuZChzY29wZXMsIG9wdGlvbnMsIGtleSkpO1xuICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiBhZGRJZkZvdW5kKHNjb3Blcywgb3ZlcnJpZGVzW3R5cGVdIHx8IHt9LCBrZXkpKTtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4gYWRkSWZGb3VuZChzY29wZXMsIGRlZmF1bHRzLCBrZXkpKTtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4gYWRkSWZGb3VuZChzY29wZXMsIGRlc2NyaXB0b3JzLCBrZXkpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFycmF5ID0gQXJyYXkuZnJvbShzY29wZXMpO1xuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFycmF5LnB1c2goT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgfVxuICAgIGlmIChrZXlzQ2FjaGVkLmhhcyhrZXlMaXN0cykpIHtcbiAgICAgIGNhY2hlLnNldChrZXlMaXN0cywgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3B0aW9uIHNjb3BlcyBmb3IgcmVzb2x2aW5nIGNoYXJ0IG9wdGlvbnNcbiAgICogQHJldHVybiB7b2JqZWN0W119XG4gICAqL1xuICBjaGFydE9wdGlvblNjb3BlcygpIHtcbiAgICBjb25zdCB7b3B0aW9ucywgdHlwZX0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG9wdGlvbnMsXG4gICAgICBvdmVycmlkZXNbdHlwZV0gfHwge30sXG4gICAgICBkZWZhdWx0cy5kYXRhc2V0c1t0eXBlXSB8fCB7fSwgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzg1MzFcbiAgICAgIHt0eXBlfSxcbiAgICAgIGRlZmF1bHRzLFxuICAgICAgZGVzY3JpcHRvcnNcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IHNjb3Blc1xuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufG9iamVjdH0gY29udGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcHJlZml4ZXNdXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHJlc29sdmVOYW1lZE9wdGlvbnMoc2NvcGVzLCBuYW1lcywgY29udGV4dCwgcHJlZml4ZXMgPSBbJyddKSB7XG4gICAgY29uc3QgcmVzdWx0ID0geyRzaGFyZWQ6IHRydWV9O1xuICAgIGNvbnN0IHtyZXNvbHZlciwgc3ViUHJlZml4ZXN9ID0gZ2V0UmVzb2x2ZXIodGhpcy5fcmVzb2x2ZXJDYWNoZSwgc2NvcGVzLCBwcmVmaXhlcyk7XG4gICAgbGV0IG9wdGlvbnMgPSByZXNvbHZlcjtcbiAgICBpZiAobmVlZENvbnRleHQocmVzb2x2ZXIsIG5hbWVzKSkge1xuICAgICAgcmVzdWx0LiRzaGFyZWQgPSBmYWxzZTtcbiAgICAgIGNvbnRleHQgPSBpc0Z1bmN0aW9uKGNvbnRleHQpID8gY29udGV4dCgpIDogY29udGV4dDtcbiAgICAgIC8vIHN1YlJlc29sdmVyIGlzIHBhc3NlZCB0byBzY3JpcHRhYmxlIG9wdGlvbnMuIEl0IHNob3VsZCBub3QgcmVzb2x2ZSB0byBob3ZlciBvcHRpb25zLlxuICAgICAgY29uc3Qgc3ViUmVzb2x2ZXIgPSB0aGlzLmNyZWF0ZVJlc29sdmVyKHNjb3BlcywgY29udGV4dCwgc3ViUHJlZml4ZXMpO1xuICAgICAgb3B0aW9ucyA9IF9hdHRhY2hDb250ZXh0KHJlc29sdmVyLCBjb250ZXh0LCBzdWJSZXNvbHZlcik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIG5hbWVzKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBvcHRpb25zW3Byb3BdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0W119IHNjb3Blc1xuICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbnRleHRdXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtwcmVmaXhlc11cbiAgICogQHBhcmFtIHt7c2NyaXB0YWJsZTogYm9vbGVhbiwgaW5kZXhhYmxlOiBib29sZWFuLCBhbGxLZXlzPzogYm9vbGVhbn19IFtkZXNjcmlwdG9yRGVmYXVsdHNdXG4gICAqL1xuICBjcmVhdGVSZXNvbHZlcihzY29wZXMsIGNvbnRleHQsIHByZWZpeGVzID0gWycnXSwgZGVzY3JpcHRvckRlZmF1bHRzKSB7XG4gICAgY29uc3Qge3Jlc29sdmVyfSA9IGdldFJlc29sdmVyKHRoaXMuX3Jlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpO1xuICAgIHJldHVybiBpc09iamVjdChjb250ZXh0KVxuICAgICAgPyBfYXR0YWNoQ29udGV4dChyZXNvbHZlciwgY29udGV4dCwgdW5kZWZpbmVkLCBkZXNjcmlwdG9yRGVmYXVsdHMpXG4gICAgICA6IHJlc29sdmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlc29sdmVyKHJlc29sdmVyQ2FjaGUsIHNjb3BlcywgcHJlZml4ZXMpIHtcbiAgbGV0IGNhY2hlID0gcmVzb2x2ZXJDYWNoZS5nZXQoc2NvcGVzKTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHJlc29sdmVyQ2FjaGUuc2V0KHNjb3BlcywgY2FjaGUpO1xuICB9XG4gIGNvbnN0IGNhY2hlS2V5ID0gcHJlZml4ZXMuam9pbigpO1xuICBsZXQgY2FjaGVkID0gY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgaWYgKCFjYWNoZWQpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IF9jcmVhdGVSZXNvbHZlcihzY29wZXMsIHByZWZpeGVzKTtcbiAgICBjYWNoZWQgPSB7XG4gICAgICByZXNvbHZlcixcbiAgICAgIHN1YlByZWZpeGVzOiBwcmVmaXhlcy5maWx0ZXIocCA9PiAhcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdob3ZlcicpKVxuICAgIH07XG4gICAgY2FjaGUuc2V0KGNhY2hlS2V5LCBjYWNoZWQpO1xuICB9XG4gIHJldHVybiBjYWNoZWQ7XG59XG5cbmNvbnN0IGhhc0Z1bmN0aW9uID0gdmFsdWUgPT4gaXNPYmplY3QodmFsdWUpXG4gICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBhY2MgfHwgaXNGdW5jdGlvbih2YWx1ZVtrZXldKSwgZmFsc2UpO1xuXG5mdW5jdGlvbiBuZWVkQ29udGV4dChwcm94eSwgbmFtZXMpIHtcbiAgY29uc3Qge2lzU2NyaXB0YWJsZSwgaXNJbmRleGFibGV9ID0gX2Rlc2NyaXB0b3JzKHByb3h5KTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgbmFtZXMpIHtcbiAgICBjb25zdCBzY3JpcHRhYmxlID0gaXNTY3JpcHRhYmxlKHByb3ApO1xuICAgIGNvbnN0IGluZGV4YWJsZSA9IGlzSW5kZXhhYmxlKHByb3ApO1xuICAgIGNvbnN0IHZhbHVlID0gKGluZGV4YWJsZSB8fCBzY3JpcHRhYmxlKSAmJiBwcm94eVtwcm9wXTtcbiAgICBpZiAoKHNjcmlwdGFibGUgJiYgKGlzRnVuY3Rpb24odmFsdWUpIHx8IGhhc0Z1bmN0aW9uKHZhbHVlKSkpXG4gICAgICB8fCAoaW5kZXhhYmxlICYmIGlzQXJyYXkodmFsdWUpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICJpbXBvcnQgYW5pbWF0b3IgZnJvbSAnLi9jb3JlLmFuaW1hdG9yLmpzJztcbmltcG9ydCBkZWZhdWx0cywge292ZXJyaWRlc30gZnJvbSAnLi9jb3JlLmRlZmF1bHRzLmpzJztcbmltcG9ydCBJbnRlcmFjdGlvbiBmcm9tICcuL2NvcmUuaW50ZXJhY3Rpb24uanMnO1xuaW1wb3J0IGxheW91dHMgZnJvbSAnLi9jb3JlLmxheW91dHMuanMnO1xuaW1wb3J0IHtfZGV0ZWN0UGxhdGZvcm19IGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcbmltcG9ydCBQbHVnaW5TZXJ2aWNlIGZyb20gJy4vY29yZS5wbHVnaW5zLmpzJztcbmltcG9ydCByZWdpc3RyeSBmcm9tICcuL2NvcmUucmVnaXN0cnkuanMnO1xuaW1wb3J0IENvbmZpZywge2RldGVybWluZUF4aXMsIGdldEluZGV4QXhpc30gZnJvbSAnLi9jb3JlLmNvbmZpZy5qcyc7XG5pbXBvcnQge3JldGluYVNjYWxlLCBfaXNEb21TdXBwb3J0ZWR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5kb20uanMnO1xuaW1wb3J0IHtlYWNoLCBjYWxsYmFjayBhcyBjYWxsQ2FsbGJhY2ssIHVpZCwgdmFsdWVPckRlZmF1bHQsIF9lbGVtZW50c0VxdWFsLCBpc051bGxPclVuZGVmLCBzZXRzRXF1YWwsIGRlZmluZWQsIGlzRnVuY3Rpb24sIF9pc0NsaWNrRXZlbnR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Y2xlYXJDYW52YXMsIGNsaXBBcmVhLCBjcmVhdGVDb250ZXh0LCB1bmNsaXBBcmVhLCBfaXNQb2ludEluQXJlYX0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge3ZlcnNpb259IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQge2RlYm91bmNlfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuZXh0cmFzLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5DaGFydEV2ZW50IH0gQ2hhcnRFdmVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL3R5cGVzL2luZGV4LmpzJykuUG9pbnQgfSBQb2ludFxuICovXG5cbmNvbnN0IEtOT1dOX1BPU0lUSU9OUyA9IFsndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0JywgJ2NoYXJ0QXJlYSddO1xuZnVuY3Rpb24gcG9zaXRpb25Jc0hvcml6b250YWwocG9zaXRpb24sIGF4aXMpIHtcbiAgcmV0dXJuIHBvc2l0aW9uID09PSAndG9wJyB8fCBwb3NpdGlvbiA9PT0gJ2JvdHRvbScgfHwgKEtOT1dOX1BPU0lUSU9OUy5pbmRleE9mKHBvc2l0aW9uKSA9PT0gLTEgJiYgYXhpcyA9PT0gJ3gnKTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZTJMZXZlbChsMSwgbDIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYVtsMV0gPT09IGJbbDFdXG4gICAgICA/IGFbbDJdIC0gYltsMl1cbiAgICAgIDogYVtsMV0gLSBiW2wxXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BbmltYXRpb25zQ29tcGxldGUoY29udGV4dCkge1xuICBjb25zdCBjaGFydCA9IGNvbnRleHQuY2hhcnQ7XG4gIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmFuaW1hdGlvbjtcblxuICBjaGFydC5ub3RpZnlQbHVnaW5zKCdhZnRlclJlbmRlcicpO1xuICBjYWxsQ2FsbGJhY2soYW5pbWF0aW9uT3B0aW9ucyAmJiBhbmltYXRpb25PcHRpb25zLm9uQ29tcGxldGUsIFtjb250ZXh0XSwgY2hhcnQpO1xufVxuXG5mdW5jdGlvbiBvbkFuaW1hdGlvblByb2dyZXNzKGNvbnRleHQpIHtcbiAgY29uc3QgY2hhcnQgPSBjb250ZXh0LmNoYXJ0O1xuICBjb25zdCBhbmltYXRpb25PcHRpb25zID0gY2hhcnQub3B0aW9ucy5hbmltYXRpb247XG4gIGNhbGxDYWxsYmFjayhhbmltYXRpb25PcHRpb25zICYmIGFuaW1hdGlvbk9wdGlvbnMub25Qcm9ncmVzcywgW2NvbnRleHRdLCBjaGFydCk7XG59XG5cbi8qKlxuICogQ2hhcnQuanMgY2FuIHRha2UgYSBzdHJpbmcgaWQgb2YgYSBjYW52YXMgZWxlbWVudCwgYSAyZCBjb250ZXh0LCBvciBhIGNhbnZhcyBlbGVtZW50IGl0c2VsZi5cbiAqIEF0dGVtcHQgdG8gdW53cmFwIHRoZSBpdGVtIHBhc3NlZCBpbnRvIHRoZSBjaGFydCBjb25zdHJ1Y3RvciBzbyB0aGF0IGl0IGlzIGEgY2FudmFzIGVsZW1lbnQgKGlmIHBvc3NpYmxlKS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FudmFzKGl0ZW0pIHtcbiAgaWYgKF9pc0RvbVN1cHBvcnRlZCgpICYmIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgIGl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpdGVtKTtcbiAgfSBlbHNlIGlmIChpdGVtICYmIGl0ZW0ubGVuZ3RoKSB7XG4gICAgLy8gU3VwcG9ydCBmb3IgYXJyYXkgYmFzZWQgcXVlcmllcyAoc3VjaCBhcyBqUXVlcnkpXG4gICAgaXRlbSA9IGl0ZW1bMF07XG4gIH1cblxuICBpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xuICAgIC8vIFN1cHBvcnQgZm9yIGFueSBvYmplY3QgYXNzb2NpYXRlZCB0byBhIGNhbnZhcyAoaW5jbHVkaW5nIGEgY29udGV4dDJkKVxuICAgIGl0ZW0gPSBpdGVtLmNhbnZhcztcbiAgfVxuICByZXR1cm4gaXRlbTtcbn1cblxuY29uc3QgaW5zdGFuY2VzID0ge307XG5jb25zdCBnZXRDaGFydCA9IChrZXkpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZ2V0Q2FudmFzKGtleSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluc3RhbmNlcykuZmlsdGVyKChjKSA9PiBjLmNhbnZhcyA9PT0gY2FudmFzKS5wb3AoKTtcbn07XG5cbmZ1bmN0aW9uIG1vdmVOdW1lcmljS2V5cyhvYmosIHN0YXJ0LCBtb3ZlKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgaW50S2V5ID0gK2tleTtcbiAgICBpZiAoaW50S2V5ID49IHN0YXJ0KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgICAgaWYgKG1vdmUgPiAwIHx8IGludEtleSA+IHN0YXJ0KSB7XG4gICAgICAgIG9ialtpbnRLZXkgKyBtb3ZlXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Q2hhcnRFdmVudH0gZVxuICogQHBhcmFtIHtDaGFydEV2ZW50fG51bGx9IGxhc3RFdmVudFxuICogQHBhcmFtIHtib29sZWFufSBpbkNoYXJ0QXJlYVxuICogQHBhcmFtIHtib29sZWFufSBpc0NsaWNrXG4gKiBAcmV0dXJucyB7Q2hhcnRFdmVudHxudWxsfVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVMYXN0RXZlbnQoZSwgbGFzdEV2ZW50LCBpbkNoYXJ0QXJlYSwgaXNDbGljaykge1xuICBpZiAoIWluQ2hhcnRBcmVhIHx8IGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChpc0NsaWNrKSB7XG4gICAgcmV0dXJuIGxhc3RFdmVudDtcbiAgfVxuICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YXNldEFyZWEobWV0YSkge1xuICBjb25zdCB7eFNjYWxlLCB5U2NhbGV9ID0gbWV0YTtcbiAgaWYgKHhTY2FsZSAmJiB5U2NhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVmdDogeFNjYWxlLmxlZnQsXG4gICAgICByaWdodDogeFNjYWxlLnJpZ2h0LFxuICAgICAgdG9wOiB5U2NhbGUudG9wLFxuICAgICAgYm90dG9tOiB5U2NhbGUuYm90dG9tXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBDaGFydCB7XG5cbiAgc3RhdGljIGRlZmF1bHRzID0gZGVmYXVsdHM7XG4gIHN0YXRpYyBpbnN0YW5jZXMgPSBpbnN0YW5jZXM7XG4gIHN0YXRpYyBvdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gIHN0YXRpYyByZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICBzdGF0aWMgdmVyc2lvbiA9IHZlcnNpb247XG4gIHN0YXRpYyBnZXRDaGFydCA9IGdldENoYXJ0O1xuXG4gIHN0YXRpYyByZWdpc3RlciguLi5pdGVtcykge1xuICAgIHJlZ2lzdHJ5LmFkZCguLi5pdGVtcyk7XG4gICAgaW52YWxpZGF0ZVBsdWdpbnMoKTtcbiAgfVxuXG4gIHN0YXRpYyB1bnJlZ2lzdGVyKC4uLml0ZW1zKSB7XG4gICAgcmVnaXN0cnkucmVtb3ZlKC4uLml0ZW1zKTtcbiAgICBpbnZhbGlkYXRlUGx1Z2lucygpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIGNvbnN0cnVjdG9yKGl0ZW0sIHVzZXJDb25maWcpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZyA9IG5ldyBDb25maWcodXNlckNvbmZpZyk7XG4gICAgY29uc3QgaW5pdGlhbENhbnZhcyA9IGdldENhbnZhcyhpdGVtKTtcbiAgICBjb25zdCBleGlzdGluZ0NoYXJ0ID0gZ2V0Q2hhcnQoaW5pdGlhbENhbnZhcyk7XG4gICAgaWYgKGV4aXN0aW5nQ2hhcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NhbnZhcyBpcyBhbHJlYWR5IGluIHVzZS4gQ2hhcnQgd2l0aCBJRCBcXCcnICsgZXhpc3RpbmdDaGFydC5pZCArICdcXCcnICtcblx0XHRcdFx0JyBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGNhbnZhcyB3aXRoIElEIFxcJycgKyBleGlzdGluZ0NoYXJ0LmNhbnZhcy5pZCArICdcXCcgY2FuIGJlIHJldXNlZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuY3JlYXRlUmVzb2x2ZXIoY29uZmlnLmNoYXJ0T3B0aW9uU2NvcGVzKCksIHRoaXMuZ2V0Q29udGV4dCgpKTtcblxuICAgIHRoaXMucGxhdGZvcm0gPSBuZXcgKGNvbmZpZy5wbGF0Zm9ybSB8fCBfZGV0ZWN0UGxhdGZvcm0oaW5pdGlhbENhbnZhcykpKCk7XG4gICAgdGhpcy5wbGF0Zm9ybS51cGRhdGVDb25maWcoY29uZmlnKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KGluaXRpYWxDYW52YXMsIG9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgIGNvbnN0IGNhbnZhcyA9IGNvbnRleHQgJiYgY29udGV4dC5jYW52YXM7XG4gICAgY29uc3QgaGVpZ2h0ID0gY2FudmFzICYmIGNhbnZhcy5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSBjYW52YXMgJiYgY2FudmFzLndpZHRoO1xuXG4gICAgdGhpcy5pZCA9IHVpZCgpO1xuICAgIHRoaXMuY3R4ID0gY29udGV4dDtcbiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gU3RvcmUgdGhlIHByZXZpb3VzbHkgdXNlZCBhc3BlY3QgcmF0aW8gdG8gZGV0ZXJtaW5lIGlmIGEgcmVzaXplXG4gICAgLy8gaXMgbmVlZGVkIGR1cmluZyB1cGRhdGVzLiBEbyB0aGlzIGFmdGVyIF9vcHRpb25zIGlzIHNldCBzaW5jZVxuICAgIC8vIGFzcGVjdFJhdGlvIHVzZXMgYSBnZXR0ZXJcbiAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuYXNwZWN0UmF0aW87XG4gICAgdGhpcy5fbGF5ZXJzID0gW107XG4gICAgdGhpcy5fbWV0YXNldHMgPSBbXTtcbiAgICB0aGlzLl9zdGFja3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ib3hlcyA9IFtdO1xuICAgIHRoaXMuY3VycmVudERldmljZVBpeGVsUmF0aW8gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGFydEFyZWEgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYWN0aXZlID0gW107XG4gICAgdGhpcy5fbGFzdEV2ZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICAgIC8qKiBAdHlwZSB7P3thdHRhY2g/OiBmdW5jdGlvbiwgZGV0YWNoPzogZnVuY3Rpb24sIHJlc2l6ZT86IGZ1bmN0aW9ufX0gKi9cbiAgICB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NvcnRlZE1ldGFzZXRzID0gW107XG4gICAgdGhpcy5zY2FsZXMgPSB7fTtcbiAgICB0aGlzLl9wbHVnaW5zID0gbmV3IFBsdWdpblNlcnZpY2UoKTtcbiAgICB0aGlzLiRwcm94aWVzID0ge307XG4gICAgdGhpcy5faGlkZGVuSW5kaWNlcyA9IHt9O1xuICAgIHRoaXMuYXR0YWNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9kb1Jlc2l6ZSA9IGRlYm91bmNlKG1vZGUgPT4gdGhpcy51cGRhdGUobW9kZSksIG9wdGlvbnMucmVzaXplRGVsYXkgfHwgMCk7XG4gICAgdGhpcy5fZGF0YUNoYW5nZXMgPSBbXTtcblxuICAgIC8vIEFkZCB0aGUgY2hhcnQgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2VcbiAgICBpbnN0YW5jZXNbdGhpcy5pZF0gPSB0aGlzO1xuXG4gICAgaWYgKCFjb250ZXh0IHx8ICFjYW52YXMpIHtcbiAgICAgIC8vIFRoZSBnaXZlbiBpdGVtIGlzIG5vdCBhIGNvbXBhdGlibGUgY29udGV4dDJkIGVsZW1lbnQsIGxldCdzIHJldHVybiBiZWZvcmUgZmluYWxpemluZ1xuICAgICAgLy8gdGhlIGNoYXJ0IGluaXRpYWxpemF0aW9uIGJ1dCBhZnRlciBzZXR0aW5nIGJhc2ljIGNoYXJ0IC8gY29udHJvbGxlciBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgIC8vIGNhbiBoZWxwIHRvIGZpZ3VyZSBvdXQgdGhhdCB0aGUgY2hhcnQgaXMgbm90IHZhbGlkIChlLmcgY2hhcnQuY2FudmFzICE9PSBudWxsKTtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yODA3XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBjaGFydDogY2FuJ3QgYWNxdWlyZSBjb250ZXh0IGZyb20gdGhlIGdpdmVuIGl0ZW1cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYW5pbWF0b3IubGlzdGVuKHRoaXMsICdjb21wbGV0ZScsIG9uQW5pbWF0aW9uc0NvbXBsZXRlKTtcbiAgICBhbmltYXRvci5saXN0ZW4odGhpcywgJ3Byb2dyZXNzJywgb25BbmltYXRpb25Qcm9ncmVzcyk7XG5cbiAgICB0aGlzLl9pbml0aWFsaXplKCk7XG4gICAgaWYgKHRoaXMuYXR0YWNoZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFzcGVjdFJhdGlvKCkge1xuICAgIGNvbnN0IHtvcHRpb25zOiB7YXNwZWN0UmF0aW8sIG1haW50YWluQXNwZWN0UmF0aW99LCB3aWR0aCwgaGVpZ2h0LCBfYXNwZWN0UmF0aW99ID0gdGhpcztcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWYoYXNwZWN0UmF0aW8pKSB7XG4gICAgICAvLyBJZiBhc3BlY3RSYXRpbyBpcyBkZWZpbmVkIGluIG9wdGlvbnMsIHVzZSB0aGF0LlxuICAgICAgcmV0dXJuIGFzcGVjdFJhdGlvO1xuICAgIH1cblxuICAgIGlmIChtYWludGFpbkFzcGVjdFJhdGlvICYmIF9hc3BlY3RSYXRpbykge1xuICAgICAgLy8gSWYgbWFpbnRhaW5Bc3BlY3RSYXRpbyBpcyB0cnV0aGx5IGFuZCB3ZSBoYWQgcHJldmlvdXNseSBkZXRlcm1pbmVkIF9hc3BlY3RSYXRpbywgdXNlIHRoYXRcbiAgICAgIHJldHVybiBfYXNwZWN0UmF0aW87XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlXG4gICAgcmV0dXJuIGhlaWdodCA/IHdpZHRoIC8gaGVpZ2h0IDogbnVsbDtcbiAgfVxuXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhO1xuICB9XG5cbiAgc2V0IGRhdGEoZGF0YSkge1xuICAgIHRoaXMuY29uZmlnLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBzZXQgb3B0aW9ucyhvcHRpb25zKSB7XG4gICAgdGhpcy5jb25maWcub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBnZXQgcmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaW5pdGlhbGl6ZSgpIHtcbiAgICAvLyBCZWZvcmUgaW5pdCBwbHVnaW4gbm90aWZpY2F0aW9uXG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVJbml0Jyk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJlc3BvbnNpdmUpIHtcbiAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldGluYVNjYWxlKHRoaXMsIHRoaXMub3B0aW9ucy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRFdmVudHMoKTtcblxuICAgIC8vIEFmdGVyIGluaXQgcGx1Z2luIG5vdGlmaWNhdGlvblxuICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJJbml0Jyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIGNsZWFyQ2FudmFzKHRoaXMuY2FudmFzLCB0aGlzLmN0eCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdG9wKCkge1xuICAgIGFuaW1hdG9yLnN0b3AodGhpcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcblx0ICogUmVzaXplIHRoZSBjaGFydCB0byBpdHMgY29udGFpbmVyIG9yIHRvIGV4cGxpY2l0IGRpbWVuc2lvbnMuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbd2lkdGhdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbaGVpZ2h0XVxuXHQgKi9cbiAgcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBpZiAoIWFuaW1hdG9yLnJ1bm5pbmcodGhpcykpIHtcbiAgICAgIHRoaXMuX3Jlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVzaXplQmVmb3JlRHJhdyA9IHt3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG4gIH1cblxuICBfcmVzaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzO1xuICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gb3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvICYmIHRoaXMuYXNwZWN0UmF0aW87XG4gICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMucGxhdGZvcm0uZ2V0TWF4aW11bVNpemUoY2FudmFzLCB3aWR0aCwgaGVpZ2h0LCBhc3BlY3RSYXRpbyk7XG4gICAgY29uc3QgbmV3UmF0aW8gPSBvcHRpb25zLmRldmljZVBpeGVsUmF0aW8gfHwgdGhpcy5wbGF0Zm9ybS5nZXREZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgY29uc3QgbW9kZSA9IHRoaXMud2lkdGggPyAncmVzaXplJyA6ICdhdHRhY2gnO1xuXG4gICAgdGhpcy53aWR0aCA9IG5ld1NpemUud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBuZXdTaXplLmhlaWdodDtcbiAgICB0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuYXNwZWN0UmF0aW87XG4gICAgaWYgKCFyZXRpbmFTY2FsZSh0aGlzLCBuZXdSYXRpbywgdHJ1ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ3Jlc2l6ZScsIHtzaXplOiBuZXdTaXplfSk7XG5cbiAgICBjYWxsQ2FsbGJhY2sob3B0aW9ucy5vblJlc2l6ZSwgW3RoaXMsIG5ld1NpemVdLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICBpZiAodGhpcy5fZG9SZXNpemUobW9kZSkpIHtcbiAgICAgICAgLy8gVGhlIHJlc2l6ZSB1cGRhdGUgaXMgZGVsYXllZCwgb25seSBkcmF3IHdpdGhvdXQgdXBkYXRpbmcuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlU2NhbGVzSGF2ZUlEcygpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHNjYWxlc09wdGlvbnMgPSBvcHRpb25zLnNjYWxlcyB8fCB7fTtcblxuICAgIGVhY2goc2NhbGVzT3B0aW9ucywgKGF4aXNPcHRpb25zLCBheGlzSUQpID0+IHtcbiAgICAgIGF4aXNPcHRpb25zLmlkID0gYXhpc0lEO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEJ1aWxkcyBhIG1hcCBvZiBzY2FsZSBJRCB0byBzY2FsZSBvYmplY3QgZm9yIGZ1dHVyZSBsb29rdXAuXG5cdCAqL1xuICBidWlsZE9yVXBkYXRlU2NhbGVzKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qgc2NhbGVPcHRzID0gb3B0aW9ucy5zY2FsZXM7XG4gICAgY29uc3Qgc2NhbGVzID0gdGhpcy5zY2FsZXM7XG4gICAgY29uc3QgdXBkYXRlZCA9IE9iamVjdC5rZXlzKHNjYWxlcykucmVkdWNlKChvYmosIGlkKSA9PiB7XG4gICAgICBvYmpbaWRdID0gZmFsc2U7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sIHt9KTtcbiAgICBsZXQgaXRlbXMgPSBbXTtcblxuICAgIGlmIChzY2FsZU9wdHMpIHtcbiAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KFxuICAgICAgICBPYmplY3Qua2V5cyhzY2FsZU9wdHMpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSBzY2FsZU9wdHNbaWRdO1xuICAgICAgICAgIGNvbnN0IGF4aXMgPSBkZXRlcm1pbmVBeGlzKGlkLCBzY2FsZU9wdGlvbnMpO1xuICAgICAgICAgIGNvbnN0IGlzUmFkaWFsID0gYXhpcyA9PT0gJ3InO1xuICAgICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IGF4aXMgPT09ICd4JztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3B0aW9uczogc2NhbGVPcHRpb25zLFxuICAgICAgICAgICAgZHBvc2l0aW9uOiBpc1JhZGlhbCA/ICdjaGFydEFyZWEnIDogaXNIb3Jpem9udGFsID8gJ2JvdHRvbScgOiAnbGVmdCcsXG4gICAgICAgICAgICBkdHlwZTogaXNSYWRpYWwgPyAncmFkaWFsTGluZWFyJyA6IGlzSG9yaXpvbnRhbCA/ICdjYXRlZ29yeScgOiAnbGluZWFyJ1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGVhY2goaXRlbXMsIChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBzY2FsZU9wdGlvbnMgPSBpdGVtLm9wdGlvbnM7XG4gICAgICBjb25zdCBpZCA9IHNjYWxlT3B0aW9ucy5pZDtcbiAgICAgIGNvbnN0IGF4aXMgPSBkZXRlcm1pbmVBeGlzKGlkLCBzY2FsZU9wdGlvbnMpO1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gdmFsdWVPckRlZmF1bHQoc2NhbGVPcHRpb25zLnR5cGUsIGl0ZW0uZHR5cGUpO1xuXG4gICAgICBpZiAoc2NhbGVPcHRpb25zLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb25Jc0hvcml6b250YWwoc2NhbGVPcHRpb25zLnBvc2l0aW9uLCBheGlzKSAhPT0gcG9zaXRpb25Jc0hvcml6b250YWwoaXRlbS5kcG9zaXRpb24pKSB7XG4gICAgICAgIHNjYWxlT3B0aW9ucy5wb3NpdGlvbiA9IGl0ZW0uZHBvc2l0aW9uO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVkW2lkXSA9IHRydWU7XG4gICAgICBsZXQgc2NhbGUgPSBudWxsO1xuICAgICAgaWYgKGlkIGluIHNjYWxlcyAmJiBzY2FsZXNbaWRdLnR5cGUgPT09IHNjYWxlVHlwZSkge1xuICAgICAgICBzY2FsZSA9IHNjYWxlc1tpZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzY2FsZUNsYXNzID0gcmVnaXN0cnkuZ2V0U2NhbGUoc2NhbGVUeXBlKTtcbiAgICAgICAgc2NhbGUgPSBuZXcgc2NhbGVDbGFzcyh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdHlwZTogc2NhbGVUeXBlLFxuICAgICAgICAgIGN0eDogdGhpcy5jdHgsXG4gICAgICAgICAgY2hhcnQ6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIHNjYWxlc1tzY2FsZS5pZF0gPSBzY2FsZTtcbiAgICAgIH1cblxuICAgICAgc2NhbGUuaW5pdChzY2FsZU9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIC8vIGNsZWFyIHVwIGRpc2NhcmRlZCBzY2FsZXNcbiAgICBlYWNoKHVwZGF0ZWQsIChoYXNVcGRhdGVkLCBpZCkgPT4ge1xuICAgICAgaWYgKCFoYXNVcGRhdGVkKSB7XG4gICAgICAgIGRlbGV0ZSBzY2FsZXNbaWRdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWFjaChzY2FsZXMsIChzY2FsZSkgPT4ge1xuICAgICAgbGF5b3V0cy5jb25maWd1cmUodGhpcywgc2NhbGUsIHNjYWxlLm9wdGlvbnMpO1xuICAgICAgbGF5b3V0cy5hZGRCb3godGhpcywgc2NhbGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlTWV0YXNldHMoKSB7XG4gICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLl9tZXRhc2V0cztcbiAgICBjb25zdCBudW1EYXRhID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBudW1NZXRhID0gbWV0YXNldHMubGVuZ3RoO1xuXG4gICAgbWV0YXNldHMuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgIGlmIChudW1NZXRhID4gbnVtRGF0YSkge1xuICAgICAgZm9yIChsZXQgaSA9IG51bURhdGE7IGkgPCBudW1NZXRhOyArK2kpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveURhdGFzZXRNZXRhKGkpO1xuICAgICAgfVxuICAgICAgbWV0YXNldHMuc3BsaWNlKG51bURhdGEsIG51bU1ldGEgLSBudW1EYXRhKTtcbiAgICB9XG4gICAgdGhpcy5fc29ydGVkTWV0YXNldHMgPSBtZXRhc2V0cy5zbGljZSgwKS5zb3J0KGNvbXBhcmUyTGV2ZWwoJ29yZGVyJywgJ2luZGV4JykpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVtb3ZlVW5yZWZlcmVuY2VkTWV0YXNldHMoKSB7XG4gICAgY29uc3Qge19tZXRhc2V0czogbWV0YXNldHMsIGRhdGE6IHtkYXRhc2V0c319ID0gdGhpcztcbiAgICBpZiAobWV0YXNldHMubGVuZ3RoID4gZGF0YXNldHMubGVuZ3RoKSB7XG4gICAgICBkZWxldGUgdGhpcy5fc3RhY2tzO1xuICAgIH1cbiAgICBtZXRhc2V0cy5mb3JFYWNoKChtZXRhLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGRhdGFzZXRzLmZpbHRlcih4ID0+IHggPT09IG1ldGEuX2RhdGFzZXQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCkge1xuICAgIGNvbnN0IG5ld0NvbnRyb2xsZXJzID0gW107XG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmRhdGEuZGF0YXNldHM7XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICB0aGlzLl9yZW1vdmVVbnJlZmVyZW5jZWRNZXRhc2V0cygpO1xuXG4gICAgZm9yIChpID0gMCwgaWxlbiA9IGRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgICAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2ldO1xuICAgICAgbGV0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgY29uc3QgdHlwZSA9IGRhdGFzZXQudHlwZSB8fCB0aGlzLmNvbmZpZy50eXBlO1xuXG4gICAgICBpZiAobWV0YS50eXBlICYmIG1ldGEudHlwZSAhPT0gdHlwZSkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaSk7XG4gICAgICAgIG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgfVxuICAgICAgbWV0YS50eXBlID0gdHlwZTtcbiAgICAgIG1ldGEuaW5kZXhBeGlzID0gZGF0YXNldC5pbmRleEF4aXMgfHwgZ2V0SW5kZXhBeGlzKHR5cGUsIHRoaXMub3B0aW9ucyk7XG4gICAgICBtZXRhLm9yZGVyID0gZGF0YXNldC5vcmRlciB8fCAwO1xuICAgICAgbWV0YS5pbmRleCA9IGk7XG4gICAgICBtZXRhLmxhYmVsID0gJycgKyBkYXRhc2V0LmxhYmVsO1xuICAgICAgbWV0YS52aXNpYmxlID0gdGhpcy5pc0RhdGFzZXRWaXNpYmxlKGkpO1xuXG4gICAgICBpZiAobWV0YS5jb250cm9sbGVyKSB7XG4gICAgICAgIG1ldGEuY29udHJvbGxlci51cGRhdGVJbmRleChpKTtcbiAgICAgICAgbWV0YS5jb250cm9sbGVyLmxpbmtTY2FsZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IENvbnRyb2xsZXJDbGFzcyA9IHJlZ2lzdHJ5LmdldENvbnRyb2xsZXIodHlwZSk7XG4gICAgICAgIGNvbnN0IHtkYXRhc2V0RWxlbWVudFR5cGUsIGRhdGFFbGVtZW50VHlwZX0gPSBkZWZhdWx0cy5kYXRhc2V0c1t0eXBlXTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihDb250cm9sbGVyQ2xhc3MsIHtcbiAgICAgICAgICBkYXRhRWxlbWVudFR5cGU6IHJlZ2lzdHJ5LmdldEVsZW1lbnQoZGF0YUVsZW1lbnRUeXBlKSxcbiAgICAgICAgICBkYXRhc2V0RWxlbWVudFR5cGU6IGRhdGFzZXRFbGVtZW50VHlwZSAmJiByZWdpc3RyeS5nZXRFbGVtZW50KGRhdGFzZXRFbGVtZW50VHlwZSlcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGEuY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyQ2xhc3ModGhpcywgaSk7XG4gICAgICAgIG5ld0NvbnRyb2xsZXJzLnB1c2gobWV0YS5jb250cm9sbGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVNZXRhc2V0cygpO1xuICAgIHJldHVybiBuZXdDb250cm9sbGVycztcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXNldCB0aGUgZWxlbWVudHMgb2YgYWxsIGRhdGFzZXRzXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVzZXRFbGVtZW50cygpIHtcbiAgICBlYWNoKHRoaXMuZGF0YS5kYXRhc2V0cywgKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkgPT4ge1xuICAgICAgdGhpcy5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIucmVzZXQoKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuXHQqIFJlc2V0cyB0aGUgY2hhcnQgYmFjayB0byBpdHMgc3RhdGUgYmVmb3JlIHRoZSBpbml0aWFsIGFuaW1hdGlvblxuXHQqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRzKCk7XG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdyZXNldCcpO1xuICB9XG5cbiAgdXBkYXRlKG1vZGUpIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgIGNvbmZpZy51cGRhdGUoKTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fb3B0aW9ucyA9IGNvbmZpZy5jcmVhdGVSZXNvbHZlcihjb25maWcuY2hhcnRPcHRpb25TY29wZXMoKSwgdGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNvbnN0IGFuaW1zRGlzYWJsZWQgPSB0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQgPSAhb3B0aW9ucy5hbmltYXRpb247XG5cbiAgICB0aGlzLl91cGRhdGVTY2FsZXMoKTtcbiAgICB0aGlzLl9jaGVja0V2ZW50QmluZGluZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVIaWRkZW5JbmRpY2VzKCk7XG5cbiAgICAvLyBwbHVnaW5zIG9wdGlvbnMgcmVmZXJlbmNlcyBtaWdodCBoYXZlIGNoYW5nZSwgbGV0J3MgaW52YWxpZGF0ZSB0aGUgY2FjaGVcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTExMSNpc3N1ZWNvbW1lbnQtMzU1OTM0MTY3XG4gICAgdGhpcy5fcGx1Z2lucy5pbnZhbGlkYXRlKCk7XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVVcGRhdGUnLCB7bW9kZSwgY2FuY2VsYWJsZTogdHJ1ZX0pID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSBkYXRhc2V0IGNvbnRyb2xsZXJzIGFyZSB1cGRhdGVkIGFuZCBuZXcgY29udHJvbGxlcnMgYXJlIHJlc2V0XG4gICAgY29uc3QgbmV3Q29udHJvbGxlcnMgPSB0aGlzLmJ1aWxkT3JVcGRhdGVDb250cm9sbGVycygpO1xuXG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVFbGVtZW50c1VwZGF0ZScpO1xuXG4gICAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhc2V0IGNvbnRyb2xsZXJzIGhhdmUgY29ycmVjdCBtZXRhIGRhdGEgY291bnRzXG4gICAgbGV0IG1pblBhZGRpbmcgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBpbGVuID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xuICAgICAgY29uc3Qge2NvbnRyb2xsZXJ9ID0gdGhpcy5nZXREYXRhc2V0TWV0YShpKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gIWFuaW1zRGlzYWJsZWQgJiYgbmV3Q29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKSA9PT0gLTE7XG4gICAgICAvLyBOZXcgY29udHJvbGxlcnMgd2lsbCBiZSByZXNldCBhZnRlciB0aGUgbGF5b3V0IHBhc3MsIHNvIHdlIG9ubHkgd2FudCB0byBtb2RpZnlcbiAgICAgIC8vIGVsZW1lbnRzIGFkZGVkIHRvIG5ldyBkYXRhc2V0c1xuICAgICAgY29udHJvbGxlci5idWlsZE9yVXBkYXRlRWxlbWVudHMocmVzZXQpO1xuICAgICAgbWluUGFkZGluZyA9IE1hdGgubWF4KCtjb250cm9sbGVyLmdldE1heE92ZXJmbG93KCksIG1pblBhZGRpbmcpO1xuICAgIH1cbiAgICBtaW5QYWRkaW5nID0gdGhpcy5fbWluUGFkZGluZyA9IG9wdGlvbnMubGF5b3V0LmF1dG9QYWRkaW5nID8gbWluUGFkZGluZyA6IDA7XG4gICAgdGhpcy5fdXBkYXRlTGF5b3V0KG1pblBhZGRpbmcpO1xuXG4gICAgLy8gT25seSByZXNldCB0aGUgY29udHJvbGxlcnMgaWYgd2UgaGF2ZSBhbmltYXRpb25zXG4gICAgaWYgKCFhbmltc0Rpc2FibGVkKSB7XG4gICAgICAvLyBDYW4gb25seSByZXNldCB0aGUgbmV3IGNvbnRyb2xsZXJzIGFmdGVyIHRoZSBzY2FsZXMgaGF2ZSBiZWVuIHVwZGF0ZWRcbiAgICAgIC8vIFJlc2V0IGlzIGRvbmUgdG8gZ2V0IHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGluaXRpYWwgYW5pbWF0aW9uXG4gICAgICBlYWNoKG5ld0NvbnRyb2xsZXJzLCAoY29udHJvbGxlcikgPT4ge1xuICAgICAgICBjb250cm9sbGVyLnJlc2V0KCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVEYXRhc2V0cyhtb2RlKTtcblxuICAgIC8vIERvIHRoaXMgYmVmb3JlIHJlbmRlciBzbyB0aGF0IGFueSBwbHVnaW5zIHRoYXQgbmVlZCBmaW5hbCBzY2FsZSB1cGRhdGVzIGNhbiB1c2UgaXRcbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyVXBkYXRlJywge21vZGV9KTtcblxuICAgIHRoaXMuX2xheWVycy5zb3J0KGNvbXBhcmUyTGV2ZWwoJ3onLCAnX2lkeCcpKTtcblxuICAgIC8vIFJlcGxheSBsYXN0IGV2ZW50IGZyb20gYmVmb3JlIHVwZGF0ZSwgb3Igc2V0IGhvdmVyIHN0eWxlcyBvbiBhY3RpdmUgZWxlbWVudHNcbiAgICBjb25zdCB7X2FjdGl2ZSwgX2xhc3RFdmVudH0gPSB0aGlzO1xuICAgIGlmIChfbGFzdEV2ZW50KSB7XG4gICAgICB0aGlzLl9ldmVudEhhbmRsZXIoX2xhc3RFdmVudCwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChfYWN0aXZlLmxlbmd0aCkge1xuICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoX2FjdGl2ZSwgX2FjdGl2ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZVNjYWxlcygpIHtcbiAgICBlYWNoKHRoaXMuc2NhbGVzLCAoc2NhbGUpID0+IHtcbiAgICAgIGxheW91dHMucmVtb3ZlQm94KHRoaXMsIHNjYWxlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZW5zdXJlU2NhbGVzSGF2ZUlEcygpO1xuICAgIHRoaXMuYnVpbGRPclVwZGF0ZVNjYWxlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tFdmVudEJpbmRpbmdzKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgZXhpc3RpbmdFdmVudHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykpO1xuICAgIGNvbnN0IG5ld0V2ZW50cyA9IG5ldyBTZXQob3B0aW9ucy5ldmVudHMpO1xuXG4gICAgaWYgKCFzZXRzRXF1YWwoZXhpc3RpbmdFdmVudHMsIG5ld0V2ZW50cykgfHwgISF0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzICE9PSBvcHRpb25zLnJlc3BvbnNpdmUpIHtcbiAgICAgIC8vIFRoZSBjb25maWd1cmVkIGV2ZW50cyBoYXZlIGNoYW5nZWQuIFJlYmluZC5cbiAgICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gICAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVIaWRkZW5JbmRpY2VzKCkge1xuICAgIGNvbnN0IHtfaGlkZGVuSW5kaWNlc30gPSB0aGlzO1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9nZXRVbmlmb3JtRGF0YUNoYW5nZXMoKSB8fCBbXTtcbiAgICBmb3IgKGNvbnN0IHttZXRob2QsIHN0YXJ0LCBjb3VudH0gb2YgY2hhbmdlcykge1xuICAgICAgY29uc3QgbW92ZSA9IG1ldGhvZCA9PT0gJ19yZW1vdmVFbGVtZW50cycgPyAtY291bnQgOiBjb3VudDtcbiAgICAgIG1vdmVOdW1lcmljS2V5cyhfaGlkZGVuSW5kaWNlcywgc3RhcnQsIG1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldFVuaWZvcm1EYXRhQ2hhbmdlcygpIHtcbiAgICBjb25zdCBfZGF0YUNoYW5nZXMgPSB0aGlzLl9kYXRhQ2hhbmdlcztcbiAgICBpZiAoIV9kYXRhQ2hhbmdlcyB8fCAhX2RhdGFDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGFDaGFuZ2VzID0gW107XG4gICAgY29uc3QgZGF0YXNldENvdW50ID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBtYWtlU2V0ID0gKGlkeCkgPT4gbmV3IFNldChcbiAgICAgIF9kYXRhQ2hhbmdlc1xuICAgICAgICAuZmlsdGVyKGMgPT4gY1swXSA9PT0gaWR4KVxuICAgICAgICAubWFwKChjLCBpKSA9PiBpICsgJywnICsgYy5zcGxpY2UoMSkuam9pbignLCcpKVxuICAgICk7XG5cbiAgICBjb25zdCBjaGFuZ2VTZXQgPSBtYWtlU2V0KDApO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZGF0YXNldENvdW50OyBpKyspIHtcbiAgICAgIGlmICghc2V0c0VxdWFsKGNoYW5nZVNldCwgbWFrZVNldChpKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShjaGFuZ2VTZXQpXG4gICAgICAubWFwKGMgPT4gYy5zcGxpdCgnLCcpKVxuICAgICAgLm1hcChhID0+ICh7bWV0aG9kOiBhWzFdLCBzdGFydDogK2FbMl0sIGNvdW50OiArYVszXX0pKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBjaGFydCBsYXlvdXQgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZUxheW91dGBcblx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyTGF5b3V0YC5cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF91cGRhdGVMYXlvdXQobWluUGFkZGluZykge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUxheW91dCcsIHtjYW5jZWxhYmxlOiB0cnVlfSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGF5b3V0cy51cGRhdGUodGhpcywgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIG1pblBhZGRpbmcpO1xuXG4gICAgY29uc3QgYXJlYSA9IHRoaXMuY2hhcnRBcmVhO1xuICAgIGNvbnN0IG5vQXJlYSA9IGFyZWEud2lkdGggPD0gMCB8fCBhcmVhLmhlaWdodCA8PSAwO1xuXG4gICAgdGhpcy5fbGF5ZXJzID0gW107XG4gICAgZWFjaCh0aGlzLmJveGVzLCAoYm94KSA9PiB7XG4gICAgICBpZiAobm9BcmVhICYmIGJveC5wb3NpdGlvbiA9PT0gJ2NoYXJ0QXJlYScpIHtcbiAgICAgICAgLy8gU2tpcCBkcmF3aW5nIGFuZCBjb25maWd1cmluZyBjaGFydEFyZWEgYm94ZXMgd2hlbiBjaGFydEFyZWEgaXMgemVybyBvciBuZWdhdGl2ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmZpZ3VyZSBpcyBjYWxsZWQgdHdpY2UsIG9uY2UgaW4gY29yZS5zY2FsZS51cGRhdGUgYW5kIG9uY2UgaGVyZS5cbiAgICAgIC8vIEhlcmUgdGhlIGJveGVzIGFyZSBmdWxseSB1cGRhdGVkIGFuZCBhdCB0aGVpciBmaW5hbCBwb3NpdGlvbnMuXG4gICAgICBpZiAoYm94LmNvbmZpZ3VyZSkge1xuICAgICAgICBib3guY29uZmlndXJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9sYXllcnMucHVzaCguLi5ib3guX2xheWVycygpKTtcbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMuX2xheWVycy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaXRlbS5faWR4ID0gaW5kZXg7XG4gICAgfSk7XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyTGF5b3V0Jyk7XG4gIH1cblxuICAvKipcblx0ICogVXBkYXRlcyBhbGwgZGF0YXNldHMgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRzVXBkYXRlYFxuXHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlRGF0YXNldHMobW9kZSkge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURhdGFzZXRzVXBkYXRlJywge21vZGUsIGNhbmNlbGFibGU6IHRydWV9KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHRoaXMuZ2V0RGF0YXNldE1ldGEoaSkuY29udHJvbGxlci5jb25maWd1cmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGFzZXQoaSwgaXNGdW5jdGlvbihtb2RlKSA/IG1vZGUoe2RhdGFzZXRJbmRleDogaX0pIDogbW9kZSk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckRhdGFzZXRzVXBkYXRlJywge21vZGV9KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBVcGRhdGVzIGRhdGFzZXQgYXQgaW5kZXggdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRVcGRhdGVgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRVcGRhdGVgLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3VwZGF0ZURhdGFzZXQoaW5kZXgsIG1vZGUpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gICAgY29uc3QgYXJncyA9IHttZXRhLCBpbmRleCwgbW9kZSwgY2FuY2VsYWJsZTogdHJ1ZX07XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0VXBkYXRlJywgYXJncykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWV0YS5jb250cm9sbGVyLl91cGRhdGUobW9kZSk7XG5cbiAgICBhcmdzLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldFVwZGF0ZScsIGFyZ3MpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZVJlbmRlcicsIHtjYW5jZWxhYmxlOiB0cnVlfSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFuaW1hdG9yLmhhcyh0aGlzKSkge1xuICAgICAgaWYgKHRoaXMuYXR0YWNoZWQgJiYgIWFuaW1hdG9yLnJ1bm5pbmcodGhpcykpIHtcbiAgICAgICAgYW5pbWF0b3Iuc3RhcnQodGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgb25BbmltYXRpb25zQ29tcGxldGUoe2NoYXJ0OiB0aGlzfSk7XG4gICAgfVxuICB9XG5cbiAgZHJhdygpIHtcbiAgICBsZXQgaTtcbiAgICBpZiAodGhpcy5fcmVzaXplQmVmb3JlRHJhdykge1xuICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gdGhpcy5fcmVzaXplQmVmb3JlRHJhdztcbiAgICAgIHRoaXMuX3Jlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuX3Jlc2l6ZUJlZm9yZURyYXcgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNsZWFyKCk7XG5cbiAgICBpZiAodGhpcy53aWR0aCA8PSAwIHx8IHRoaXMuaGVpZ2h0IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEcmF3Jywge2NhbmNlbGFibGU6IHRydWV9KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCZWNhdXNlIG9mIHBsdWdpbiBob29rcyAoYmVmb3JlL2FmdGVyRGF0YXNldHNEcmF3KSwgZGF0YXNldHMgY2FuJ3RcbiAgICAvLyBjdXJyZW50bHkgYmUgcGFydCBvZiBsYXllcnMuIEluc3RlYWQsIHdlIGRyYXdcbiAgICAvLyBsYXllcnMgPD0gMCBiZWZvcmUoZGVmYXVsdCwgYmFja3dhcmQgY29tcGF0KSwgYW5kIHRoZSByZXN0IGFmdGVyXG4gICAgY29uc3QgbGF5ZXJzID0gdGhpcy5fbGF5ZXJzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoICYmIGxheWVyc1tpXS56IDw9IDA7ICsraSkge1xuICAgICAgbGF5ZXJzW2ldLmRyYXcodGhpcy5jaGFydEFyZWEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYXdEYXRhc2V0cygpO1xuXG4gICAgLy8gUmVzdCBvZiBsYXllcnNcbiAgICBmb3IgKDsgaSA8IGxheWVycy5sZW5ndGg7ICsraSkge1xuICAgICAgbGF5ZXJzW2ldLmRyYXcodGhpcy5jaGFydEFyZWEpO1xuICAgIH1cblxuICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEcmF3Jyk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRTb3J0ZWREYXRhc2V0TWV0YXMoZmlsdGVyVmlzaWJsZSkge1xuICAgIGNvbnN0IG1ldGFzZXRzID0gdGhpcy5fc29ydGVkTWV0YXNldHM7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IGksIGlsZW47XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBjb25zdCBtZXRhID0gbWV0YXNldHNbaV07XG4gICAgICBpZiAoIWZpbHRlclZpc2libGUgfHwgbWV0YS52aXNpYmxlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1ldGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcblx0ICogR2V0cyB0aGUgdmlzaWJsZSBkYXRhc2V0IG1ldGFzIGluIGRyYXdpbmcgb3JkZXJcblx0ICogQHJldHVybiB7b2JqZWN0W119XG5cdCAqL1xuICBnZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRTb3J0ZWREYXRhc2V0TWV0YXModHJ1ZSk7XG4gIH1cblxuICAvKipcblx0ICogRHJhd3MgYWxsIGRhdGFzZXRzIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0c0RyYXdgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRzRHJhd2AuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZHJhd0RhdGFzZXRzKCkge1xuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURhdGFzZXRzRHJhdycsIHtjYW5jZWxhYmxlOiB0cnVlfSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXNldHMgPSB0aGlzLmdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMoKTtcbiAgICBmb3IgKGxldCBpID0gbWV0YXNldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRoaXMuX2RyYXdEYXRhc2V0KG1ldGFzZXRzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGF0YXNldHNEcmF3Jyk7XG4gIH1cblxuICAvKipcblx0ICogRHJhd3MgZGF0YXNldCBhdCBpbmRleCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldERyYXdgXG5cdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXREcmF3YC5cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9kcmF3RGF0YXNldChtZXRhKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3QgY2xpcCA9IG1ldGEuX2NsaXA7XG4gICAgY29uc3QgdXNlQ2xpcCA9ICFjbGlwLmRpc2FibGVkO1xuICAgIGNvbnN0IGFyZWEgPSBnZXREYXRhc2V0QXJlYShtZXRhKSB8fCB0aGlzLmNoYXJ0QXJlYTtcbiAgICBjb25zdCBhcmdzID0ge1xuICAgICAgbWV0YSxcbiAgICAgIGluZGV4OiBtZXRhLmluZGV4LFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5ub3RpZnlQbHVnaW5zKCdiZWZvcmVEYXRhc2V0RHJhdycsIGFyZ3MpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh1c2VDbGlwKSB7XG4gICAgICBjbGlwQXJlYShjdHgsIHtcbiAgICAgICAgbGVmdDogY2xpcC5sZWZ0ID09PSBmYWxzZSA/IDAgOiBhcmVhLmxlZnQgLSBjbGlwLmxlZnQsXG4gICAgICAgIHJpZ2h0OiBjbGlwLnJpZ2h0ID09PSBmYWxzZSA/IHRoaXMud2lkdGggOiBhcmVhLnJpZ2h0ICsgY2xpcC5yaWdodCxcbiAgICAgICAgdG9wOiBjbGlwLnRvcCA9PT0gZmFsc2UgPyAwIDogYXJlYS50b3AgLSBjbGlwLnRvcCxcbiAgICAgICAgYm90dG9tOiBjbGlwLmJvdHRvbSA9PT0gZmFsc2UgPyB0aGlzLmhlaWdodCA6IGFyZWEuYm90dG9tICsgY2xpcC5ib3R0b21cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1ldGEuY29udHJvbGxlci5kcmF3KCk7XG5cbiAgICBpZiAodXNlQ2xpcCkge1xuICAgICAgdW5jbGlwQXJlYShjdHgpO1xuICAgIH1cblxuICAgIGFyZ3MuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMubm90aWZ5UGx1Z2lucygnYWZ0ZXJEYXRhc2V0RHJhdycsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwb2ludCBpcyBpbiB0aGUgY2hhcnQgYXJlYS5cbiAgICogQHBhcmFtIHtQb2ludH0gcG9pbnQgLSBpbiByZWxhdGl2ZSBjb29yZGluYXRlcyAoc2VlLCBlLmcuLCBnZXRSZWxhdGl2ZVBvc2l0aW9uKVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUG9pbnRJbkFyZWEocG9pbnQpIHtcbiAgICByZXR1cm4gX2lzUG9pbnRJbkFyZWEocG9pbnQsIHRoaXMuY2hhcnRBcmVhLCB0aGlzLl9taW5QYWRkaW5nKTtcbiAgfVxuXG4gIGdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgbW9kZSwgb3B0aW9ucywgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIGNvbnN0IG1ldGhvZCA9IEludGVyYWN0aW9uLm1vZGVzW21vZGVdO1xuICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWV0aG9kKHRoaXMsIGUsIG9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkge1xuICAgIGNvbnN0IGRhdGFzZXQgPSB0aGlzLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgICBjb25zdCBtZXRhc2V0cyA9IHRoaXMuX21ldGFzZXRzO1xuICAgIGxldCBtZXRhID0gbWV0YXNldHMuZmlsdGVyKHggPT4geCAmJiB4Ll9kYXRhc2V0ID09PSBkYXRhc2V0KS5wb3AoKTtcblxuICAgIGlmICghbWV0YSkge1xuICAgICAgbWV0YSA9IHtcbiAgICAgICAgdHlwZTogbnVsbCxcbiAgICAgICAgZGF0YTogW10sXG4gICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgIGNvbnRyb2xsZXI6IG51bGwsXG4gICAgICAgIGhpZGRlbjogbnVsbCxcdFx0XHQvLyBTZWUgaXNEYXRhc2V0VmlzaWJsZSgpIGNvbW1lbnRcbiAgICAgICAgeEF4aXNJRDogbnVsbCxcbiAgICAgICAgeUF4aXNJRDogbnVsbCxcbiAgICAgICAgb3JkZXI6IGRhdGFzZXQgJiYgZGF0YXNldC5vcmRlciB8fCAwLFxuICAgICAgICBpbmRleDogZGF0YXNldEluZGV4LFxuICAgICAgICBfZGF0YXNldDogZGF0YXNldCxcbiAgICAgICAgX3BhcnNlZDogW10sXG4gICAgICAgIF9zb3J0ZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgbWV0YXNldHMucHVzaChtZXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRleHQgfHwgKHRoaXMuJGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KG51bGwsIHtjaGFydDogdGhpcywgdHlwZTogJ2NoYXJ0J30pKTtcbiAgfVxuXG4gIGdldFZpc2libGVEYXRhc2V0Q291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U29ydGVkVmlzaWJsZURhdGFzZXRNZXRhcygpLmxlbmd0aDtcbiAgfVxuXG4gIGlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSB7XG4gICAgY29uc3QgZGF0YXNldCA9IHRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuICAgIGlmICghZGF0YXNldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cbiAgICAvLyBtZXRhLmhpZGRlbiBpcyBhIHBlciBjaGFydCBkYXRhc2V0IGhpZGRlbiBmbGFnIG92ZXJyaWRlIHdpdGggMyBzdGF0ZXM6IGlmIHRydWUgb3IgZmFsc2UsXG4gICAgLy8gdGhlIGRhdGFzZXQuaGlkZGVuIHZhbHVlIGlzIGlnbm9yZWQsIGVsc2UgaWYgbnVsbCwgdGhlIGRhdGFzZXQgaGlkZGVuIHN0YXRlIGlzIHJldHVybmVkLlxuICAgIHJldHVybiB0eXBlb2YgbWV0YS5oaWRkZW4gPT09ICdib29sZWFuJyA/ICFtZXRhLmhpZGRlbiA6ICFkYXRhc2V0LmhpZGRlbjtcbiAgfVxuXG4gIHNldERhdGFzZXRWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgdmlzaWJsZSkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgbWV0YS5oaWRkZW4gPSAhdmlzaWJsZTtcbiAgfVxuXG4gIHRvZ2dsZURhdGFWaXNpYmlsaXR5KGluZGV4KSB7XG4gICAgdGhpcy5faGlkZGVuSW5kaWNlc1tpbmRleF0gPSAhdGhpcy5faGlkZGVuSW5kaWNlc1tpbmRleF07XG4gIH1cblxuICBnZXREYXRhVmlzaWJpbGl0eShpbmRleCkge1xuICAgIHJldHVybiAhdGhpcy5faGlkZGVuSW5kaWNlc1tpbmRleF07XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF91cGRhdGVWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgZGF0YUluZGV4LCB2aXNpYmxlKSB7XG4gICAgY29uc3QgbW9kZSA9IHZpc2libGUgPyAnc2hvdycgOiAnaGlkZSc7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcbiAgICBjb25zdCBhbmltcyA9IG1ldGEuY29udHJvbGxlci5fcmVzb2x2ZUFuaW1hdGlvbnModW5kZWZpbmVkLCBtb2RlKTtcblxuICAgIGlmIChkZWZpbmVkKGRhdGFJbmRleCkpIHtcbiAgICAgIG1ldGEuZGF0YVtkYXRhSW5kZXhdLmhpZGRlbiA9ICF2aXNpYmxlO1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhc2V0VmlzaWJpbGl0eShkYXRhc2V0SW5kZXgsIHZpc2libGUpO1xuICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIHN0YXRlLCBzbyBoaWRlIGFuaW1hdGlvbiBjYW4gYmUgc2Vlbi4gVGhpcyBjb3VsZCBiZSBoYW5kbGVkIGJldHRlciBpZiB1cGRhdGUgLyB1cGRhdGVEYXRhc2V0IHJldHVybmVkIGEgUHJvbWlzZS5cbiAgICAgIGFuaW1zLnVwZGF0ZShtZXRhLCB7dmlzaWJsZX0pO1xuICAgICAgdGhpcy51cGRhdGUoKGN0eCkgPT4gY3R4LmRhdGFzZXRJbmRleCA9PT0gZGF0YXNldEluZGV4ID8gbW9kZSA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgaGlkZShkYXRhc2V0SW5kZXgsIGRhdGFJbmRleCkge1xuICAgIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHkoZGF0YXNldEluZGV4LCBkYXRhSW5kZXgsIGZhbHNlKTtcbiAgfVxuXG4gIHNob3coZGF0YXNldEluZGV4LCBkYXRhSW5kZXgpIHtcbiAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KGRhdGFzZXRJbmRleCwgZGF0YUluZGV4LCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2Rlc3Ryb3lEYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fbWV0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgICBpZiAobWV0YSAmJiBtZXRhLmNvbnRyb2xsZXIpIHtcbiAgICAgIG1ldGEuY29udHJvbGxlci5fZGVzdHJveSgpO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5fbWV0YXNldHNbZGF0YXNldEluZGV4XTtcbiAgfVxuXG4gIF9zdG9wKCkge1xuICAgIGxldCBpLCBpbGVuO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIGFuaW1hdG9yLnJlbW92ZSh0aGlzKTtcblxuICAgIGZvciAoaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB0aGlzLl9kZXN0cm95RGF0YXNldE1ldGEoaSk7XG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZURlc3Ryb3knKTtcbiAgICBjb25zdCB7Y2FudmFzLCBjdHh9ID0gdGhpcztcblxuICAgIHRoaXMuX3N0b3AoKTtcbiAgICB0aGlzLmNvbmZpZy5jbGVhckNhY2hlKCk7XG5cbiAgICBpZiAoY2FudmFzKSB7XG4gICAgICB0aGlzLnVuYmluZEV2ZW50cygpO1xuICAgICAgY2xlYXJDYW52YXMoY2FudmFzLCBjdHgpO1xuICAgICAgdGhpcy5wbGF0Zm9ybS5yZWxlYXNlQ29udGV4dChjdHgpO1xuICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgICAgdGhpcy5jdHggPSBudWxsO1xuICAgIH1cblxuICAgIGRlbGV0ZSBpbnN0YW5jZXNbdGhpcy5pZF07XG5cbiAgICB0aGlzLm5vdGlmeVBsdWdpbnMoJ2FmdGVyRGVzdHJveScpO1xuICB9XG5cbiAgdG9CYXNlNjRJbWFnZSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzLnRvRGF0YVVSTCguLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLmJpbmRVc2VyRXZlbnRzKCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXNwb25zaXZlKSB7XG4gICAgICB0aGlzLmJpbmRSZXNwb25zaXZlRXZlbnRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXR0YWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYmluZFVzZXJFdmVudHMoKSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcblxuICAgIGNvbnN0IF9hZGQgPSAodHlwZSwgbGlzdGVuZXIpID0+IHtcbiAgICAgIHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgfTtcblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGUsIHgsIHkpID0+IHtcbiAgICAgIGUub2Zmc2V0WCA9IHg7XG4gICAgICBlLm9mZnNldFkgPSB5O1xuICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyKGUpO1xuICAgIH07XG5cbiAgICBlYWNoKHRoaXMub3B0aW9ucy5ldmVudHMsICh0eXBlKSA9PiBfYWRkKHR5cGUsIGxpc3RlbmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGJpbmRSZXNwb25zaXZlRXZlbnRzKCkge1xuICAgIGlmICghdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycykge1xuICAgICAgdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5wbGF0Zm9ybTtcblxuICAgIGNvbnN0IF9hZGQgPSAodHlwZSwgbGlzdGVuZXIpID0+IHtcbiAgICAgIHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgbGlzdGVuZXJzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgfTtcbiAgICBjb25zdCBfcmVtb3ZlID0gKHR5cGUsIGxpc3RlbmVyKSA9PiB7XG4gICAgICBpZiAobGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgIHBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgICAgICBkZWxldGUgbGlzdGVuZXJzW3R5cGVdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBsaXN0ZW5lciA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgdGhpcy5yZXNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBkZXRhY2hlZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICBjb25zdCBhdHRhY2hlZCA9ICgpID0+IHtcbiAgICAgIF9yZW1vdmUoJ2F0dGFjaCcsIGF0dGFjaGVkKTtcblxuICAgICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICBfYWRkKCdyZXNpemUnLCBsaXN0ZW5lcik7XG4gICAgICBfYWRkKCdkZXRhY2gnLCBkZXRhY2hlZCk7XG4gICAgfTtcblxuICAgIGRldGFjaGVkID0gKCkgPT4ge1xuICAgICAgdGhpcy5hdHRhY2hlZCA9IGZhbHNlO1xuXG4gICAgICBfcmVtb3ZlKCdyZXNpemUnLCBsaXN0ZW5lcik7XG5cbiAgICAgIC8vIFN0b3AgYW5pbWF0aW5nIGFuZCByZW1vdmUgbWV0YXNldHMsIHNvIHdoZW4gcmUtYXR0YWNoZWQsIHRoZSBhbmltYXRpb25zIHN0YXJ0IGZyb20gYmVnaW5uaW5nLlxuICAgICAgdGhpcy5fc3RvcCgpO1xuICAgICAgdGhpcy5fcmVzaXplKDAsIDApO1xuXG4gICAgICBfYWRkKCdhdHRhY2gnLCBhdHRhY2hlZCk7XG4gICAgfTtcblxuICAgIGlmIChwbGF0Zm9ybS5pc0F0dGFjaGVkKHRoaXMuY2FudmFzKSkge1xuICAgICAgYXR0YWNoZWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV0YWNoZWQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIHVuYmluZEV2ZW50cygpIHtcbiAgICBlYWNoKHRoaXMuX2xpc3RlbmVycywgKGxpc3RlbmVyLCB0eXBlKSA9PiB7XG4gICAgICB0aGlzLnBsYXRmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG4gICAgZWFjaCh0aGlzLl9yZXNwb25zaXZlTGlzdGVuZXJzLCAobGlzdGVuZXIsIHR5cGUpID0+IHtcbiAgICAgIHRoaXMucGxhdGZvcm0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgdGhpcy5fcmVzcG9uc2l2ZUxpc3RlbmVycyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZUhvdmVyU3R5bGUoaXRlbXMsIG1vZGUsIGVuYWJsZWQpIHtcbiAgICBjb25zdCBwcmVmaXggPSBlbmFibGVkID8gJ3NldCcgOiAncmVtb3ZlJztcbiAgICBsZXQgbWV0YSwgaXRlbSwgaSwgaWxlbjtcblxuICAgIGlmIChtb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgIG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGl0ZW1zWzBdLmRhdGFzZXRJbmRleCk7XG4gICAgICBtZXRhLmNvbnRyb2xsZXJbJ18nICsgcHJlZml4ICsgJ0RhdGFzZXRIb3ZlclN0eWxlJ10oKTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBpdGVtID0gaXRlbXNbaV07XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gaXRlbSAmJiB0aGlzLmdldERhdGFzZXRNZXRhKGl0ZW0uZGF0YXNldEluZGV4KS5jb250cm9sbGVyO1xuICAgICAgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlcltwcmVmaXggKyAnSG92ZXJTdHlsZSddKGl0ZW0uZWxlbWVudCwgaXRlbS5kYXRhc2V0SW5kZXgsIGl0ZW0uaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBHZXQgYWN0aXZlIChob3ZlcmVkKSBlbGVtZW50c1xuXHQgKiBAcmV0dXJucyBhcnJheVxuXHQgKi9cbiAgZ2V0QWN0aXZlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBTZXQgYWN0aXZlIChob3ZlcmVkKSBlbGVtZW50c1xuXHQgKiBAcGFyYW0ge2FycmF5fSBhY3RpdmVFbGVtZW50cyBOZXcgYWN0aXZlIGRhdGEgcG9pbnRzXG5cdCAqL1xuICBzZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlRWxlbWVudHMubWFwKCh7ZGF0YXNldEluZGV4LCBpbmRleH0pID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG4gICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhc2V0IGZvdW5kIGF0IGluZGV4ICcgKyBkYXRhc2V0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhc2V0SW5kZXgsXG4gICAgICAgIGVsZW1lbnQ6IG1ldGEuZGF0YVtpbmRleF0sXG4gICAgICAgIGluZGV4LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBjaGFuZ2VkID0gIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG5cbiAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpcy5fYWN0aXZlID0gYWN0aXZlO1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHVzZSB0aGUgcHJldmlvdXMgbW91c2UgZXZlbnQgdG8gb3ZlcnJpZGUgdGhlIGFjdGl2ZSBlbGVtZW50cyBpbiB1cGRhdGUuXG4gICAgICB0aGlzLl9sYXN0RXZlbnQgPSBudWxsO1xuICAgICAgdGhpcy5fdXBkYXRlSG92ZXJTdHlsZXMoYWN0aXZlLCBsYXN0QWN0aXZlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQ2FsbHMgZW5hYmxlZCBwbHVnaW5zIG9uIHRoZSBzcGVjaWZpZWQgaG9vayBhbmQgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cblx0ICogVGhpcyBtZXRob2QgaW1tZWRpYXRlbHkgcmV0dXJucyBhcyBzb29uIGFzIGEgcGx1Z2luIGV4cGxpY2l0bHkgcmV0dXJucyBmYWxzZS4gVGhlXG5cdCAqIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkLCBmb3IgaW5zdGFuY2UsIHRvIGludGVycnVwdCB0aGUgY3VycmVudCBhY3Rpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBob29rIC0gVGhlIG5hbWUgb2YgdGhlIHBsdWdpbiBtZXRob2QgdG8gY2FsbCAoZS5nLiAnYmVmb3JlVXBkYXRlJykuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnc10gLSBFeHRyYSBhcmd1bWVudHMgdG8gYXBwbHkgdG8gdGhlIGhvb2sgY2FsbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoJy4vY29yZS5wbHVnaW5zLmpzJykuZmlsdGVyQ2FsbGJhY2t9IFtmaWx0ZXJdIC0gRmlsdGVyaW5nIGZ1bmN0aW9uIGZvciBsaW1pdGluZyB3aGljaCBwbHVnaW5zIGFyZSBub3RpZmllZFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gZmFsc2UgaWYgYW55IG9mIHRoZSBwbHVnaW5zIHJldHVybiBmYWxzZSwgZWxzZSByZXR1cm5zIHRydWUuXG5cdCAqL1xuICBub3RpZnlQbHVnaW5zKGhvb2ssIGFyZ3MsIGZpbHRlcikge1xuICAgIHJldHVybiB0aGlzLl9wbHVnaW5zLm5vdGlmeSh0aGlzLCBob29rLCBhcmdzLCBmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcGx1Z2luIHdpdGggdGhlIHNwZWNpZmljIElEIGlzIHJlZ2lzdGVyZWQgYW5kIGVuYWJsZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBsdWdpbklkIC0gVGhlIElEIG9mIHRoZSBwbHVnaW4gb2Ygd2hpY2ggdG8gY2hlY2sgaWYgaXQgaXMgZW5hYmxlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUGx1Z2luRW5hYmxlZChwbHVnaW5JZCkge1xuICAgIHJldHVybiB0aGlzLl9wbHVnaW5zLl9jYWNoZS5maWx0ZXIocCA9PiBwLnBsdWdpbi5pZCA9PT0gcGx1Z2luSWQpLmxlbmd0aCA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3VwZGF0ZUhvdmVyU3R5bGVzKGFjdGl2ZSwgbGFzdEFjdGl2ZSwgcmVwbGF5KSB7XG4gICAgY29uc3QgaG92ZXJPcHRpb25zID0gdGhpcy5vcHRpb25zLmhvdmVyO1xuICAgIGNvbnN0IGRpZmYgPSAoYSwgYikgPT4gYS5maWx0ZXIoeCA9PiAhYi5zb21lKHkgPT4geC5kYXRhc2V0SW5kZXggPT09IHkuZGF0YXNldEluZGV4ICYmIHguaW5kZXggPT09IHkuaW5kZXgpKTtcbiAgICBjb25zdCBkZWFjdGl2YXRlZCA9IGRpZmYobGFzdEFjdGl2ZSwgYWN0aXZlKTtcbiAgICBjb25zdCBhY3RpdmF0ZWQgPSByZXBsYXkgPyBhY3RpdmUgOiBkaWZmKGFjdGl2ZSwgbGFzdEFjdGl2ZSk7XG5cbiAgICBpZiAoZGVhY3RpdmF0ZWQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnVwZGF0ZUhvdmVyU3R5bGUoZGVhY3RpdmF0ZWQsIGhvdmVyT3B0aW9ucy5tb2RlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRlZC5sZW5ndGggJiYgaG92ZXJPcHRpb25zLm1vZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlSG92ZXJTdHlsZShhY3RpdmF0ZWQsIGhvdmVyT3B0aW9ucy5tb2RlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9ldmVudEhhbmRsZXIoZSwgcmVwbGF5KSB7XG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIGV2ZW50OiBlLFxuICAgICAgcmVwbGF5LFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGluQ2hhcnRBcmVhOiB0aGlzLmlzUG9pbnRJbkFyZWEoZSlcbiAgICB9O1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gKHBsdWdpbikgPT4gKHBsdWdpbi5vcHRpb25zLmV2ZW50cyB8fCB0aGlzLm9wdGlvbnMuZXZlbnRzKS5pbmNsdWRlcyhlLm5hdGl2ZS50eXBlKTtcblxuICAgIGlmICh0aGlzLm5vdGlmeVBsdWdpbnMoJ2JlZm9yZUV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9oYW5kbGVFdmVudChlLCByZXBsYXksIGFyZ3MuaW5DaGFydEFyZWEpO1xuXG4gICAgYXJncy5jYW5jZWxhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5ub3RpZnlQbHVnaW5zKCdhZnRlckV2ZW50JywgYXJncywgZXZlbnRGaWx0ZXIpO1xuXG4gICAgaWYgKGNoYW5nZWQgfHwgYXJncy5jaGFuZ2VkKSB7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgdGhlIGV2ZW50IHRvIGhhbmRsZVxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXBsYXldIC0gdHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHJlcGxheWVkIGJ5IGB1cGRhdGVgXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luQ2hhcnRBcmVhXSAtIHRydWUgaWYgdGhlIGV2ZW50IGlzIGluc2lkZSBjaGFydEFyZWFcblx0ICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgY2hhcnQgbmVlZHMgdG8gcmUtcmVuZGVyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfaGFuZGxlRXZlbnQoZSwgcmVwbGF5LCBpbkNoYXJ0QXJlYSkge1xuICAgIGNvbnN0IHtfYWN0aXZlOiBsYXN0QWN0aXZlID0gW10sIG9wdGlvbnN9ID0gdGhpcztcblxuICAgIC8vIElmIHRoZSBldmVudCBpcyByZXBsYXllZCBmcm9tIGB1cGRhdGVgLCB3ZSBzaG91bGQgZXZhbHVhdGUgd2l0aCB0aGUgZmluYWwgcG9zaXRpb25zLlxuICAgIC8vXG4gICAgLy8gVGhlIGByZXBsYXlgOlxuICAgIC8vIEl0J3MgdGhlIGxhc3QgZXZlbnQgKGV4Y2x1ZGluZyBjbGljaykgdGhhdCBoYXMgb2NjdXJyZWQgYmVmb3JlIGB1cGRhdGVgLlxuICAgIC8vIFNvIG1vdXNlIGhhcyBub3QgbW92ZWQuIEl0J3MgYWxzbyBvdmVyIHRoZSBjaGFydCwgYmVjYXVzZSB0aGVyZSBpcyBhIGByZXBsYXlgLlxuICAgIC8vXG4gICAgLy8gVGhlIHdoeTpcbiAgICAvLyBJZiBhbmltYXRpb25zIGFyZSBhY3RpdmUsIHRoZSBlbGVtZW50cyBoYXZlbid0IG1vdmVkIHlldCBjb21wYXJlZCB0byBzdGF0ZSBiZWZvcmUgdXBkYXRlLlxuICAgIC8vIEJ1dCBpZiB0aGV5IHdpbGwsIHdlIGFyZSBhY3RpdmF0aW5nIHRoZSBlbGVtZW50cyB0aGF0IHdvdWxkIGJlIGFjdGl2ZSwgaWYgdGhpcyBjaGVja1xuICAgIC8vIHdhcyBkb25lIGFmdGVyIHRoZSBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkLiA9PiBcImZpbmFsIHBvc2l0aW9uc1wiLlxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFuaW1hdGlvbnMsIHRoZSBcImZpbmFsXCIgYW5kIFwiY3VycmVudFwiIHBvc2l0aW9ucyBhcmUgZXF1YWwuXG4gICAgLy8gVGhpcyBpcyBkb25lIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGV2YWx1YXRlIHRoZSBhY3RpdmUgZWxlbWVudHMgZWFjaCBhbmltYXRpb24gZnJhbWVcbiAgICAvLyAtIGl0IHdvdWxkIGJlIGV4cGVuc2l2ZS5cbiAgICBjb25zdCB1c2VGaW5hbFBvc2l0aW9uID0gcmVwbGF5O1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIGluQ2hhcnRBcmVhLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBjb25zdCBpc0NsaWNrID0gX2lzQ2xpY2tFdmVudChlKTtcbiAgICBjb25zdCBsYXN0RXZlbnQgPSBkZXRlcm1pbmVMYXN0RXZlbnQoZSwgdGhpcy5fbGFzdEV2ZW50LCBpbkNoYXJ0QXJlYSwgaXNDbGljayk7XG5cbiAgICBpZiAoaW5DaGFydEFyZWEpIHtcbiAgICAgIC8vIFNldCBfbGFzdEV2ZW50IHRvIG51bGwgd2hpbGUgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIGV2ZW50IGhhbmRsZXJzLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyByZWN1cnNpb24gaWYgdGhlIGhhbmRsZXIgY2FsbHMgY2hhcnQudXBkYXRlKClcbiAgICAgIHRoaXMuX2xhc3RFdmVudCA9IG51bGw7XG5cbiAgICAgIC8vIEludm9rZSBvbkhvdmVyIGhvb2tcbiAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zLm9uSG92ZXIsIFtlLCBhY3RpdmUsIHRoaXNdLCB0aGlzKTtcblxuICAgICAgaWYgKGlzQ2xpY2spIHtcbiAgICAgICAgY2FsbENhbGxiYWNrKG9wdGlvbnMub25DbGljaywgW2UsIGFjdGl2ZSwgdGhpc10sIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoYW5nZWQgPSAhX2VsZW1lbnRzRXF1YWwoYWN0aXZlLCBsYXN0QWN0aXZlKTtcbiAgICBpZiAoY2hhbmdlZCB8fCByZXBsYXkpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGFjdGl2ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZUhvdmVyU3R5bGVzKGFjdGl2ZSwgbGFzdEFjdGl2ZSwgcmVwbGF5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0RXZlbnQgPSBsYXN0RXZlbnQ7XG5cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBUaGUgZXZlbnRcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL3R5cGVzL2luZGV4LmpzJykuQWN0aXZlRWxlbWVudFtdfSBsYXN0QWN0aXZlIC0gUHJldmlvdXNseSBhY3RpdmUgZWxlbWVudHNcbiAgICogQHBhcmFtIHtib29sZWFufSBpbkNoYXJ0QXJlYSAtIElzIHRoZSBlbnZlbnQgaW5zaWRlIGNoYXJ0QXJlYVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZUZpbmFsUG9zaXRpb24gLSBTaG91bGQgdGhlIGV2YWx1YXRpb24gYmUgZG9uZSB3aXRoIGN1cnJlbnQgb3IgZmluYWwgKGFmdGVyIGFuaW1hdGlvbikgZWxlbWVudCBwb3NpdGlvbnNcbiAgICogQHJldHVybnMge2ltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5BY3RpdmVFbGVtZW50W119IC0gVGhlIGFjdGl2ZSBlbGVtZW50c1xuICAgKiBAcHJhdmF0ZVxuICAgKi9cbiAgX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIGluQ2hhcnRBcmVhLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghaW5DaGFydEFyZWEpIHtcbiAgICAgIC8vIExldCB1c2VyIGNvbnRyb2wgdGhlIGFjdGl2ZSBlbGVtZW50cyBvdXRzaWRlIGNoYXJ0QXJlYS4gRWcuIHVzaW5nIExlZ2VuZC5cbiAgICAgIHJldHVybiBsYXN0QWN0aXZlO1xuICAgIH1cblxuICAgIGNvbnN0IGhvdmVyT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5ob3ZlcjtcbiAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlKGUsIGhvdmVyT3B0aW9ucy5tb2RlLCBob3Zlck9wdGlvbnMsIHVzZUZpbmFsUG9zaXRpb24pO1xuICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbmZ1bmN0aW9uIGludmFsaWRhdGVQbHVnaW5zKCkge1xuICByZXR1cm4gZWFjaChDaGFydC5pbnN0YW5jZXMsIChjaGFydCkgPT4gY2hhcnQuX3BsdWdpbnMuaW52YWxpZGF0ZSgpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hhcnQ7XG4iLCAiaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHtfYW5nbGVCZXR3ZWVuLCBnZXRBbmdsZUZyb21Qb2ludCwgVEFVLCBIQUxGX1BJLCB2YWx1ZU9yRGVmYXVsdH0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG5pbXBvcnQge1BJLCBfaXNCZXR3ZWVuLCBfbGltaXRWYWx1ZX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuaW1wb3J0IHtfcmVhZFZhbHVlVG9Qcm9wc30gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm9wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUge0FyY09wdGlvbnMsIFBvaW50fSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cblxuZnVuY3Rpb24gY2xpcEFyYyhjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgZWxlbWVudDogQXJjRWxlbWVudCwgZW5kQW5nbGU6IG51bWJlcikge1xuICBjb25zdCB7c3RhcnRBbmdsZSwgcGl4ZWxNYXJnaW4sIHgsIHksIG91dGVyUmFkaXVzLCBpbm5lclJhZGl1c30gPSBlbGVtZW50O1xuICBsZXQgYW5nbGVNYXJnaW4gPSBwaXhlbE1hcmdpbiAvIG91dGVyUmFkaXVzO1xuXG4gIC8vIERyYXcgYW4gaW5uZXIgYm9yZGVyIGJ5IGNsaXBwaW5nIHRoZSBhcmMgYW5kIGRyYXdpbmcgYSBkb3VibGUtd2lkdGggYm9yZGVyXG4gIC8vIEVubGFyZ2UgdGhlIGNsaXBwaW5nIGFyYyBieSAwLjMzIHBpeGVscyB0byBlbGltaW5hdGUgZ2xpdGNoZXMgYmV0d2VlbiBib3JkZXJzXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgY3R4LmFyYyh4LCB5LCBvdXRlclJhZGl1cywgc3RhcnRBbmdsZSAtIGFuZ2xlTWFyZ2luLCBlbmRBbmdsZSArIGFuZ2xlTWFyZ2luKTtcbiAgaWYgKGlubmVyUmFkaXVzID4gcGl4ZWxNYXJnaW4pIHtcbiAgICBhbmdsZU1hcmdpbiA9IHBpeGVsTWFyZ2luIC8gaW5uZXJSYWRpdXM7XG4gICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgZW5kQW5nbGUgKyBhbmdsZU1hcmdpbiwgc3RhcnRBbmdsZSAtIGFuZ2xlTWFyZ2luLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBjdHguYXJjKHgsIHksIHBpeGVsTWFyZ2luLCBlbmRBbmdsZSArIEhBTEZfUEksIHN0YXJ0QW5nbGUgLSBIQUxGX1BJKTtcbiAgfVxuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5jbGlwKCk7XG59XG5cbmZ1bmN0aW9uIHRvUmFkaXVzQ29ybmVycyh2YWx1ZSkge1xuICByZXR1cm4gX3JlYWRWYWx1ZVRvUHJvcHModmFsdWUsIFsnb3V0ZXJTdGFydCcsICdvdXRlckVuZCcsICdpbm5lclN0YXJ0JywgJ2lubmVyRW5kJ10pO1xufVxuXG4vKipcbiAqIFBhcnNlIGJvcmRlciByYWRpdXMgZnJvbSB0aGUgcHJvdmlkZWQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBwYXJzZUJvcmRlclJhZGl1cyhhcmM6IEFyY0VsZW1lbnQsIGlubmVyUmFkaXVzOiBudW1iZXIsIG91dGVyUmFkaXVzOiBudW1iZXIsIGFuZ2xlRGVsdGE6IG51bWJlcikge1xuICBjb25zdCBvID0gdG9SYWRpdXNDb3JuZXJzKGFyYy5vcHRpb25zLmJvcmRlclJhZGl1cyk7XG4gIGNvbnN0IGhhbGZUaGlja25lc3MgPSAob3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cykgLyAyO1xuICBjb25zdCBpbm5lckxpbWl0ID0gTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgYW5nbGVEZWx0YSAqIGlubmVyUmFkaXVzIC8gMik7XG5cbiAgLy8gT3V0ZXIgbGltaXRzIGFyZSBjb21wbGljYXRlZC4gV2Ugd2FudCB0byBjb21wdXRlIHRoZSBhdmFpbGFibGUgYW5ndWxhciBkaXN0YW5jZSBhdFxuICAvLyBhIHJhZGl1cyBvZiBvdXRlclJhZGl1cyAtIGJvcmRlclJhZGl1cyBiZWNhdXNlIGZvciBzbWFsbCBhbmd1bGFyIGRpc3RhbmNlcywgdGhpcyB0ZXJtIGxpbWl0cy5cbiAgLy8gV2UgY29tcHV0ZSBhdCByID0gb3V0ZXJSYWRpdXMgLSBib3JkZXJSYWRpdXMgYmVjYXVzZSB0aGlzIGNpcmNsZSBkZWZpbmVzIHRoZSBjZW50ZXIgb2YgdGhlIGJvcmRlciBjb3JuZXJzLlxuICAvL1xuICAvLyBJZiB0aGUgYm9yZGVyUmFkaXVzIGlzIGxhcmdlLCB0aGF0IHZhbHVlIGNhbiBiZWNvbWUgbmVnYXRpdmUuXG4gIC8vIFRoaXMgY2F1c2VzIHRoZSBvdXRlciBib3JkZXJzIHRvIGxvc2UgdGhlaXIgcmFkaXVzIGVudGlyZWx5LCB3aGljaCBpcyByYXRoZXIgdW5leHBlY3RlZC4gVG8gc29sdmUgdGhhdCwgaWYgYm9yZGVyUmFkaXVzID4gb3V0ZXJSYWRpdXNcbiAgLy8gd2Uga25vdyB0aGF0IHRoZSB0aGlja25lc3MgdGVybSB3aWxsIGRvbWluYXRlIGFuZCBjb21wdXRlIHRoZSBsaW1pdHMgYXQgdGhhdCBwb2ludFxuICBjb25zdCBjb21wdXRlT3V0ZXJMaW1pdCA9ICh2YWwpID0+IHtcbiAgICBjb25zdCBvdXRlckFyY0xpbWl0ID0gKG91dGVyUmFkaXVzIC0gTWF0aC5taW4oaGFsZlRoaWNrbmVzcywgdmFsKSkgKiBhbmdsZURlbHRhIC8gMjtcbiAgICByZXR1cm4gX2xpbWl0VmFsdWUodmFsLCAwLCBNYXRoLm1pbihoYWxmVGhpY2tuZXNzLCBvdXRlckFyY0xpbWl0KSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBvdXRlclN0YXJ0OiBjb21wdXRlT3V0ZXJMaW1pdChvLm91dGVyU3RhcnQpLFxuICAgIG91dGVyRW5kOiBjb21wdXRlT3V0ZXJMaW1pdChvLm91dGVyRW5kKSxcbiAgICBpbm5lclN0YXJ0OiBfbGltaXRWYWx1ZShvLmlubmVyU3RhcnQsIDAsIGlubmVyTGltaXQpLFxuICAgIGlubmVyRW5kOiBfbGltaXRWYWx1ZShvLmlubmVyRW5kLCAwLCBpbm5lckxpbWl0KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IChyLCDwnZyDKSB0byAoeCwgeSlcbiAqL1xuZnVuY3Rpb24gclRoZXRhVG9YWShyOiBudW1iZXIsIHRoZXRhOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gIHJldHVybiB7XG4gICAgeDogeCArIHIgKiBNYXRoLmNvcyh0aGV0YSksXG4gICAgeTogeSArIHIgKiBNYXRoLnNpbih0aGV0YSksXG4gIH07XG59XG5cblxuLyoqXG4gKiBQYXRoIHRoZSBhcmMsIHJlc3BlY3RpbmcgYm9yZGVyIHJhZGl1cyBieSBzZXBhcmF0aW5nIGludG8gbGVmdCBhbmQgcmlnaHQgaGFsdmVzLlxuICpcbiAqICAgU3RhcnQgICAgICBFbmRcbiAqXG4gKiAgICAxLS0tPmEtLS0+MiAgICBPdXRlclxuICogICAvICAgICAgICAgICBcXFxuICogICA4ICAgICAgICAgICAzXG4gKiAgIHwgICAgICAgICAgIHxcbiAqICAgfCAgICAgICAgICAgfFxuICogICA3ICAgICAgICAgICA0XG4gKiAgIFxcICAgICAgICAgICAvXG4gKiAgICA2PC0tLWI8LS0tNSAgICBJbm5lclxuICovXG5mdW5jdGlvbiBwYXRoQXJjKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgZWxlbWVudDogQXJjRWxlbWVudCxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHNwYWNpbmc6IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4gIGNpcmN1bGFyOiBib29sZWFuLFxuKSB7XG4gIGNvbnN0IHt4LCB5LCBzdGFydEFuZ2xlOiBzdGFydCwgcGl4ZWxNYXJnaW4sIGlubmVyUmFkaXVzOiBpbm5lclJ9ID0gZWxlbWVudDtcblxuICBjb25zdCBvdXRlclJhZGl1cyA9IE1hdGgubWF4KGVsZW1lbnQub3V0ZXJSYWRpdXMgKyBzcGFjaW5nICsgb2Zmc2V0IC0gcGl4ZWxNYXJnaW4sIDApO1xuICBjb25zdCBpbm5lclJhZGl1cyA9IGlubmVyUiA+IDAgPyBpbm5lclIgKyBzcGFjaW5nICsgb2Zmc2V0ICsgcGl4ZWxNYXJnaW4gOiAwO1xuXG4gIGxldCBzcGFjaW5nT2Zmc2V0ID0gMDtcbiAgY29uc3QgYWxwaGEgPSBlbmQgLSBzdGFydDtcblxuICBpZiAoc3BhY2luZykge1xuICAgIC8vIFdoZW4gc3BhY2luZyBpcyBwcmVzZW50LCBpdCBpcyB0aGUgc2FtZSBmb3IgYWxsIGl0ZW1zXG4gICAgLy8gU28gd2UgYWRqdXN0IHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIG9mIHRoZSBhcmMgc3VjaCB0aGF0XG4gICAgLy8gdGhlIGRpc3RhbmNlIGlzIHRoZSBzYW1lIGFzIGl0IHdvdWxkIGJlIHdpdGhvdXQgdGhlIHNwYWNpbmdcbiAgICBjb25zdCBub1NwYWNpbmdJbm5lclJhZGl1cyA9IGlubmVyUiA+IDAgPyBpbm5lclIgLSBzcGFjaW5nIDogMDtcbiAgICBjb25zdCBub1NwYWNpbmdPdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzID4gMCA/IG91dGVyUmFkaXVzIC0gc3BhY2luZyA6IDA7XG4gICAgY29uc3QgYXZOb2dTcGFjaW5nUmFkaXVzID0gKG5vU3BhY2luZ0lubmVyUmFkaXVzICsgbm9TcGFjaW5nT3V0ZXJSYWRpdXMpIC8gMjtcbiAgICBjb25zdCBhZGp1c3RlZEFuZ2xlID0gYXZOb2dTcGFjaW5nUmFkaXVzICE9PSAwID8gKGFscGhhICogYXZOb2dTcGFjaW5nUmFkaXVzKSAvIChhdk5vZ1NwYWNpbmdSYWRpdXMgKyBzcGFjaW5nKSA6IGFscGhhO1xuICAgIHNwYWNpbmdPZmZzZXQgPSAoYWxwaGEgLSBhZGp1c3RlZEFuZ2xlKSAvIDI7XG4gIH1cblxuICBjb25zdCBiZXRhID0gTWF0aC5tYXgoMC4wMDEsIGFscGhhICogb3V0ZXJSYWRpdXMgLSBvZmZzZXQgLyBQSSkgLyBvdXRlclJhZGl1cztcbiAgY29uc3QgYW5nbGVPZmZzZXQgPSAoYWxwaGEgLSBiZXRhKSAvIDI7XG4gIGNvbnN0IHN0YXJ0QW5nbGUgPSBzdGFydCArIGFuZ2xlT2Zmc2V0ICsgc3BhY2luZ09mZnNldDtcbiAgY29uc3QgZW5kQW5nbGUgPSBlbmQgLSBhbmdsZU9mZnNldCAtIHNwYWNpbmdPZmZzZXQ7XG4gIGNvbnN0IHtvdXRlclN0YXJ0LCBvdXRlckVuZCwgaW5uZXJTdGFydCwgaW5uZXJFbmR9ID0gcGFyc2VCb3JkZXJSYWRpdXMoZWxlbWVudCwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCBlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpO1xuXG4gIGNvbnN0IG91dGVyU3RhcnRBZGp1c3RlZFJhZGl1cyA9IG91dGVyUmFkaXVzIC0gb3V0ZXJTdGFydDtcbiAgY29uc3Qgb3V0ZXJFbmRBZGp1c3RlZFJhZGl1cyA9IG91dGVyUmFkaXVzIC0gb3V0ZXJFbmQ7XG4gIGNvbnN0IG91dGVyU3RhcnRBZGp1c3RlZEFuZ2xlID0gc3RhcnRBbmdsZSArIG91dGVyU3RhcnQgLyBvdXRlclN0YXJ0QWRqdXN0ZWRSYWRpdXM7XG4gIGNvbnN0IG91dGVyRW5kQWRqdXN0ZWRBbmdsZSA9IGVuZEFuZ2xlIC0gb3V0ZXJFbmQgLyBvdXRlckVuZEFkanVzdGVkUmFkaXVzO1xuXG4gIGNvbnN0IGlubmVyU3RhcnRBZGp1c3RlZFJhZGl1cyA9IGlubmVyUmFkaXVzICsgaW5uZXJTdGFydDtcbiAgY29uc3QgaW5uZXJFbmRBZGp1c3RlZFJhZGl1cyA9IGlubmVyUmFkaXVzICsgaW5uZXJFbmQ7XG4gIGNvbnN0IGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlID0gc3RhcnRBbmdsZSArIGlubmVyU3RhcnQgLyBpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXM7XG4gIGNvbnN0IGlubmVyRW5kQWRqdXN0ZWRBbmdsZSA9IGVuZEFuZ2xlIC0gaW5uZXJFbmQgLyBpbm5lckVuZEFkanVzdGVkUmFkaXVzO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcblxuICBpZiAoY2lyY3VsYXIpIHtcbiAgICAvLyBUaGUgZmlyc3QgYXJjIHNlZ21lbnRzIGZyb20gcG9pbnQgMSB0byBwb2ludCBhIHRvIHBvaW50IDJcbiAgICBjb25zdCBvdXRlck1pZEFkanVzdGVkQW5nbGUgPSAob3V0ZXJTdGFydEFkanVzdGVkQW5nbGUgKyBvdXRlckVuZEFkanVzdGVkQW5nbGUpIC8gMjtcbiAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzLCBvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSwgb3V0ZXJNaWRBZGp1c3RlZEFuZ2xlKTtcbiAgICBjdHguYXJjKHgsIHksIG91dGVyUmFkaXVzLCBvdXRlck1pZEFkanVzdGVkQW5nbGUsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSk7XG5cbiAgICAvLyBUaGUgY29ybmVyIHNlZ21lbnQgZnJvbSBwb2ludCAyIHRvIHBvaW50IDNcbiAgICBpZiAob3V0ZXJFbmQgPiAwKSB7XG4gICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShvdXRlckVuZEFkanVzdGVkUmFkaXVzLCBvdXRlckVuZEFkanVzdGVkQW5nbGUsIHgsIHkpO1xuICAgICAgY3R4LmFyYyhwQ2VudGVyLngsIHBDZW50ZXIueSwgb3V0ZXJFbmQsIG91dGVyRW5kQWRqdXN0ZWRBbmdsZSwgZW5kQW5nbGUgKyBIQUxGX1BJKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgbGluZSBmcm9tIHBvaW50IDMgdG8gcG9pbnQgNFxuICAgIGNvbnN0IHA0ID0gclRoZXRhVG9YWShpbm5lckVuZEFkanVzdGVkUmFkaXVzLCBlbmRBbmdsZSwgeCwgeSk7XG4gICAgY3R4LmxpbmVUbyhwNC54LCBwNC55KTtcblxuICAgIC8vIFRoZSBjb3JuZXIgc2VnbWVudCBmcm9tIHBvaW50IDQgdG8gcG9pbnQgNVxuICAgIGlmIChpbm5lckVuZCA+IDApIHtcbiAgICAgIGNvbnN0IHBDZW50ZXIgPSByVGhldGFUb1hZKGlubmVyRW5kQWRqdXN0ZWRSYWRpdXMsIGlubmVyRW5kQWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBpbm5lckVuZCwgZW5kQW5nbGUgKyBIQUxGX1BJLCBpbm5lckVuZEFkanVzdGVkQW5nbGUgKyBNYXRoLlBJKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgaW5uZXIgYXJjIGZyb20gcG9pbnQgNSB0byBwb2ludCBiIHRvIHBvaW50IDZcbiAgICBjb25zdCBpbm5lck1pZEFkanVzdGVkQW5nbGUgPSAoKGVuZEFuZ2xlIC0gKGlubmVyRW5kIC8gaW5uZXJSYWRpdXMpKSArIChzdGFydEFuZ2xlICsgKGlubmVyU3RhcnQgLyBpbm5lclJhZGl1cykpKSAvIDI7XG4gICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgZW5kQW5nbGUgLSAoaW5uZXJFbmQgLyBpbm5lclJhZGl1cyksIGlubmVyTWlkQWRqdXN0ZWRBbmdsZSwgdHJ1ZSk7XG4gICAgY3R4LmFyYyh4LCB5LCBpbm5lclJhZGl1cywgaW5uZXJNaWRBZGp1c3RlZEFuZ2xlLCBzdGFydEFuZ2xlICsgKGlubmVyU3RhcnQgLyBpbm5lclJhZGl1cyksIHRydWUpO1xuXG4gICAgLy8gVGhlIGNvcm5lciBzZWdtZW50IGZyb20gcG9pbnQgNiB0byBwb2ludCA3XG4gICAgaWYgKGlubmVyU3RhcnQgPiAwKSB7XG4gICAgICBjb25zdCBwQ2VudGVyID0gclRoZXRhVG9YWShpbm5lclN0YXJ0QWRqdXN0ZWRSYWRpdXMsIGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlLCB4LCB5KTtcbiAgICAgIGN0eC5hcmMocENlbnRlci54LCBwQ2VudGVyLnksIGlubmVyU3RhcnQsIGlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlICsgTWF0aC5QSSwgc3RhcnRBbmdsZSAtIEhBTEZfUEkpO1xuICAgIH1cblxuICAgIC8vIFRoZSBsaW5lIGZyb20gcG9pbnQgNyB0byBwb2ludCA4XG4gICAgY29uc3QgcDggPSByVGhldGFUb1hZKG91dGVyU3RhcnRBZGp1c3RlZFJhZGl1cywgc3RhcnRBbmdsZSwgeCwgeSk7XG4gICAgY3R4LmxpbmVUbyhwOC54LCBwOC55KTtcblxuICAgIC8vIFRoZSBjb3JuZXIgc2VnbWVudCBmcm9tIHBvaW50IDggdG8gcG9pbnQgMVxuICAgIGlmIChvdXRlclN0YXJ0ID4gMCkge1xuICAgICAgY29uc3QgcENlbnRlciA9IHJUaGV0YVRvWFkob3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzLCBvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSwgeCwgeSk7XG4gICAgICBjdHguYXJjKHBDZW50ZXIueCwgcENlbnRlci55LCBvdXRlclN0YXJ0LCBzdGFydEFuZ2xlIC0gSEFMRl9QSSwgb3V0ZXJTdGFydEFkanVzdGVkQW5nbGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjdHgubW92ZVRvKHgsIHkpO1xuXG4gICAgY29uc3Qgb3V0ZXJTdGFydFggPSBNYXRoLmNvcyhvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHg7XG4gICAgY29uc3Qgb3V0ZXJTdGFydFkgPSBNYXRoLnNpbihvdXRlclN0YXJ0QWRqdXN0ZWRBbmdsZSkgKiBvdXRlclJhZGl1cyArIHk7XG4gICAgY3R4LmxpbmVUbyhvdXRlclN0YXJ0WCwgb3V0ZXJTdGFydFkpO1xuXG4gICAgY29uc3Qgb3V0ZXJFbmRYID0gTWF0aC5jb3Mob3V0ZXJFbmRBZGp1c3RlZEFuZ2xlKSAqIG91dGVyUmFkaXVzICsgeDtcbiAgICBjb25zdCBvdXRlckVuZFkgPSBNYXRoLnNpbihvdXRlckVuZEFkanVzdGVkQW5nbGUpICogb3V0ZXJSYWRpdXMgKyB5O1xuICAgIGN0eC5saW5lVG8ob3V0ZXJFbmRYLCBvdXRlckVuZFkpO1xuICB9XG5cbiAgY3R4LmNsb3NlUGF0aCgpO1xufVxuXG5mdW5jdGlvbiBkcmF3QXJjKFxuICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgZWxlbWVudDogQXJjRWxlbWVudCxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIHNwYWNpbmc6IG51bWJlcixcbiAgY2lyY3VsYXI6IGJvb2xlYW4sXG4pIHtcbiAgY29uc3Qge2Z1bGxDaXJjbGVzLCBzdGFydEFuZ2xlLCBjaXJjdW1mZXJlbmNlfSA9IGVsZW1lbnQ7XG4gIGxldCBlbmRBbmdsZSA9IGVsZW1lbnQuZW5kQW5nbGU7XG4gIGlmIChmdWxsQ2lyY2xlcykge1xuICAgIHBhdGhBcmMoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGVuZEFuZ2xlLCBjaXJjdWxhcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsQ2lyY2xlczsgKytpKSB7XG4gICAgICBjdHguZmlsbCgpO1xuICAgIH1cbiAgICBpZiAoIWlzTmFOKGNpcmN1bWZlcmVuY2UpKSB7XG4gICAgICBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyAoY2lyY3VtZmVyZW5jZSAlIFRBVSB8fCBUQVUpO1xuICAgIH1cbiAgfVxuICBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmRBbmdsZSwgY2lyY3VsYXIpO1xuICBjdHguZmlsbCgpO1xuICByZXR1cm4gZW5kQW5nbGU7XG59XG5cbmZ1bmN0aW9uIGRyYXdCb3JkZXIoXG4gIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICBlbGVtZW50OiBBcmNFbGVtZW50LFxuICBvZmZzZXQ6IG51bWJlcixcbiAgc3BhY2luZzogbnVtYmVyLFxuICBjaXJjdWxhcjogYm9vbGVhbixcbikge1xuICBjb25zdCB7ZnVsbENpcmNsZXMsIHN0YXJ0QW5nbGUsIGNpcmN1bWZlcmVuY2UsIG9wdGlvbnN9ID0gZWxlbWVudDtcbiAgY29uc3Qge2JvcmRlcldpZHRoLCBib3JkZXJKb2luU3R5bGV9ID0gb3B0aW9ucztcbiAgY29uc3QgaW5uZXIgPSBvcHRpb25zLmJvcmRlckFsaWduID09PSAnaW5uZXInO1xuXG4gIGlmICghYm9yZGVyV2lkdGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5uZXIpIHtcbiAgICBjdHgubGluZVdpZHRoID0gYm9yZGVyV2lkdGggKiAyO1xuICAgIGN0eC5saW5lSm9pbiA9IGJvcmRlckpvaW5TdHlsZSB8fCAncm91bmQnO1xuICB9IGVsc2Uge1xuICAgIGN0eC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICBjdHgubGluZUpvaW4gPSBib3JkZXJKb2luU3R5bGUgfHwgJ2JldmVsJztcbiAgfVxuXG4gIGxldCBlbmRBbmdsZSA9IGVsZW1lbnQuZW5kQW5nbGU7XG4gIGlmIChmdWxsQ2lyY2xlcykge1xuICAgIHBhdGhBcmMoY3R4LCBlbGVtZW50LCBvZmZzZXQsIHNwYWNpbmcsIGVuZEFuZ2xlLCBjaXJjdWxhcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsQ2lyY2xlczsgKytpKSB7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxuICAgIGlmICghaXNOYU4oY2lyY3VtZmVyZW5jZSkpIHtcbiAgICAgIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIChjaXJjdW1mZXJlbmNlICUgVEFVIHx8IFRBVSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlubmVyKSB7XG4gICAgY2xpcEFyYyhjdHgsIGVsZW1lbnQsIGVuZEFuZ2xlKTtcbiAgfVxuXG4gIGlmICghZnVsbENpcmNsZXMpIHtcbiAgICBwYXRoQXJjKGN0eCwgZWxlbWVudCwgb2Zmc2V0LCBzcGFjaW5nLCBlbmRBbmdsZSwgY2lyY3VsYXIpO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyY1Byb3BzIGV4dGVuZHMgUG9pbnQge1xuICBzdGFydEFuZ2xlOiBudW1iZXI7XG4gIGVuZEFuZ2xlOiBudW1iZXI7XG4gIGlubmVyUmFkaXVzOiBudW1iZXI7XG4gIG91dGVyUmFkaXVzOiBudW1iZXI7XG4gIGNpcmN1bWZlcmVuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJjRWxlbWVudCBleHRlbmRzIEVsZW1lbnQ8QXJjUHJvcHMsIEFyY09wdGlvbnM+IHtcblxuICBzdGF0aWMgaWQgPSAnYXJjJztcblxuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgYm9yZGVyQWxpZ246ICdjZW50ZXInLFxuICAgIGJvcmRlckNvbG9yOiAnI2ZmZicsXG4gICAgYm9yZGVySm9pblN0eWxlOiB1bmRlZmluZWQsXG4gICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgIGJvcmRlcldpZHRoOiAyLFxuICAgIG9mZnNldDogMCxcbiAgICBzcGFjaW5nOiAwLFxuICAgIGFuZ2xlOiB1bmRlZmluZWQsXG4gICAgY2lyY3VsYXI6IHRydWUsXG4gIH07XG5cbiAgc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJ1xuICB9O1xuXG4gIGNpcmN1bWZlcmVuY2U6IG51bWJlcjtcbiAgZW5kQW5nbGU6IG51bWJlcjtcbiAgZnVsbENpcmNsZXM6IG51bWJlcjtcbiAgaW5uZXJSYWRpdXM6IG51bWJlcjtcbiAgb3V0ZXJSYWRpdXM6IG51bWJlcjtcbiAgcGl4ZWxNYXJnaW46IG51bWJlcjtcbiAgc3RhcnRBbmdsZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaXJjdW1mZXJlbmNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhcnRBbmdsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZEFuZ2xlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaW5uZXJSYWRpdXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5vdXRlclJhZGl1cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBpeGVsTWFyZ2luID0gMDtcbiAgICB0aGlzLmZ1bGxDaXJjbGVzID0gMDtcblxuICAgIGlmIChjZmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICB9XG4gIH1cblxuICBpblJhbmdlKGNoYXJ0WDogbnVtYmVyLCBjaGFydFk6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbjogYm9vbGVhbikge1xuICAgIGNvbnN0IHBvaW50ID0gdGhpcy5nZXRQcm9wcyhbJ3gnLCAneSddLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgICBjb25zdCB7YW5nbGUsIGRpc3RhbmNlfSA9IGdldEFuZ2xlRnJvbVBvaW50KHBvaW50LCB7eDogY2hhcnRYLCB5OiBjaGFydFl9KTtcbiAgICBjb25zdCB7c3RhcnRBbmdsZSwgZW5kQW5nbGUsIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgY2lyY3VtZmVyZW5jZX0gPSB0aGlzLmdldFByb3BzKFtcbiAgICAgICdzdGFydEFuZ2xlJyxcbiAgICAgICdlbmRBbmdsZScsXG4gICAgICAnaW5uZXJSYWRpdXMnLFxuICAgICAgJ291dGVyUmFkaXVzJyxcbiAgICAgICdjaXJjdW1mZXJlbmNlJ1xuICAgIF0sIHVzZUZpbmFsUG9zaXRpb24pO1xuICAgIGNvbnN0IHJBZGp1c3QgPSB0aGlzLm9wdGlvbnMuc3BhY2luZyAvIDI7XG4gICAgY29uc3QgX2NpcmN1bWZlcmVuY2UgPSB2YWx1ZU9yRGVmYXVsdChjaXJjdW1mZXJlbmNlLCBlbmRBbmdsZSAtIHN0YXJ0QW5nbGUpO1xuICAgIGNvbnN0IGJldHdlZW5BbmdsZXMgPSBfY2lyY3VtZmVyZW5jZSA+PSBUQVUgfHwgX2FuZ2xlQmV0d2VlbihhbmdsZSwgc3RhcnRBbmdsZSwgZW5kQW5nbGUpO1xuICAgIGNvbnN0IHdpdGhpblJhZGl1cyA9IF9pc0JldHdlZW4oZGlzdGFuY2UsIGlubmVyUmFkaXVzICsgckFkanVzdCwgb3V0ZXJSYWRpdXMgKyByQWRqdXN0KTtcblxuICAgIHJldHVybiAoYmV0d2VlbkFuZ2xlcyAmJiB3aXRoaW5SYWRpdXMpO1xuICB9XG5cbiAgZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbjogYm9vbGVhbikge1xuICAgIGNvbnN0IHt4LCB5LCBzdGFydEFuZ2xlLCBlbmRBbmdsZSwgaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzfSA9IHRoaXMuZ2V0UHJvcHMoW1xuICAgICAgJ3gnLFxuICAgICAgJ3knLFxuICAgICAgJ3N0YXJ0QW5nbGUnLFxuICAgICAgJ2VuZEFuZ2xlJyxcbiAgICAgICdpbm5lclJhZGl1cycsXG4gICAgICAnb3V0ZXJSYWRpdXMnXG4gICAgXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgY29uc3Qge29mZnNldCwgc3BhY2luZ30gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgaGFsZkFuZ2xlID0gKHN0YXJ0QW5nbGUgKyBlbmRBbmdsZSkgLyAyO1xuICAgIGNvbnN0IGhhbGZSYWRpdXMgPSAoaW5uZXJSYWRpdXMgKyBvdXRlclJhZGl1cyArIHNwYWNpbmcgKyBvZmZzZXQpIC8gMjtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCArIE1hdGguY29zKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzLFxuICAgICAgeTogeSArIE1hdGguc2luKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzXG4gICAgfTtcbiAgfVxuXG4gIHRvb2x0aXBQb3NpdGlvbih1c2VGaW5hbFBvc2l0aW9uOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VudGVyUG9pbnQodXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBkcmF3KGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XG4gICAgY29uc3Qge29wdGlvbnMsIGNpcmN1bWZlcmVuY2V9ID0gdGhpcztcbiAgICBjb25zdCBvZmZzZXQgPSAob3B0aW9ucy5vZmZzZXQgfHwgMCkgLyA0O1xuICAgIGNvbnN0IHNwYWNpbmcgPSAob3B0aW9ucy5zcGFjaW5nIHx8IDApIC8gMjtcbiAgICBjb25zdCBjaXJjdWxhciA9IG9wdGlvbnMuY2lyY3VsYXI7XG4gICAgdGhpcy5waXhlbE1hcmdpbiA9IChvcHRpb25zLmJvcmRlckFsaWduID09PSAnaW5uZXInKSA/IDAuMzMgOiAwO1xuICAgIHRoaXMuZnVsbENpcmNsZXMgPSBjaXJjdW1mZXJlbmNlID4gVEFVID8gTWF0aC5mbG9vcihjaXJjdW1mZXJlbmNlIC8gVEFVKSA6IDA7XG5cbiAgICBpZiAoY2lyY3VtZmVyZW5jZSA9PT0gMCB8fCB0aGlzLmlubmVyUmFkaXVzIDwgMCB8fCB0aGlzLm91dGVyUmFkaXVzIDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN0eC5zYXZlKCk7XG5cbiAgICBjb25zdCBoYWxmQW5nbGUgPSAodGhpcy5zdGFydEFuZ2xlICsgdGhpcy5lbmRBbmdsZSkgLyAyO1xuICAgIGN0eC50cmFuc2xhdGUoTWF0aC5jb3MoaGFsZkFuZ2xlKSAqIG9mZnNldCwgTWF0aC5zaW4oaGFsZkFuZ2xlKSAqIG9mZnNldCk7XG4gICAgY29uc3QgZml4ID0gMSAtIE1hdGguc2luKE1hdGgubWluKFBJLCBjaXJjdW1mZXJlbmNlIHx8IDApKTtcbiAgICBjb25zdCByYWRpdXNPZmZzZXQgPSBvZmZzZXQgKiBmaXg7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcblxuICAgIGRyYXdBcmMoY3R4LCB0aGlzLCByYWRpdXNPZmZzZXQsIHNwYWNpbmcsIGNpcmN1bGFyKTtcbiAgICBkcmF3Qm9yZGVyKGN0eCwgdGhpcywgcmFkaXVzT2Zmc2V0LCBzcGFjaW5nLCBjaXJjdWxhcik7XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG59XG4iLCAiaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHtfYmV6aWVySW50ZXJwb2xhdGlvbiwgX3BvaW50SW5MaW5lLCBfc3RlcHBlZEludGVycG9sYXRpb259IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5pbnRlcnBvbGF0aW9uLmpzJztcbmltcG9ydCB7X2NvbXB1dGVTZWdtZW50cywgX2JvdW5kU2VnbWVudHN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5zZWdtZW50LmpzJztcbmltcG9ydCB7X3N0ZXBwZWRMaW5lVG8sIF9iZXppZXJDdXJ2ZVRvfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLmpzJztcbmltcG9ydCB7X3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jdXJ2ZS5qcyc7XG5pbXBvcnQge3ZhbHVlT3JEZWZhdWx0fSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi9lbGVtZW50LnBvaW50LmpzJykuZGVmYXVsdCB9IFBvaW50RWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIHNldFN0eWxlKGN0eCwgb3B0aW9ucywgc3R5bGUgPSBvcHRpb25zKSB7XG4gIGN0eC5saW5lQ2FwID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyQ2FwU3R5bGUsIG9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUpO1xuICBjdHguc2V0TGluZURhc2godmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyRGFzaCwgb3B0aW9ucy5ib3JkZXJEYXNoKSk7XG4gIGN0eC5saW5lRGFzaE9mZnNldCA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckRhc2hPZmZzZXQsIG9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCk7XG4gIGN0eC5saW5lSm9pbiA9IHZhbHVlT3JEZWZhdWx0KHN0eWxlLmJvcmRlckpvaW5TdHlsZSwgb3B0aW9ucy5ib3JkZXJKb2luU3R5bGUpO1xuICBjdHgubGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQoc3R5bGUuYm9yZGVyV2lkdGgsIG9wdGlvbnMuYm9yZGVyV2lkdGgpO1xuICBjdHguc3Ryb2tlU3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChzdHlsZS5ib3JkZXJDb2xvciwgb3B0aW9ucy5ib3JkZXJDb2xvcik7XG59XG5cbmZ1bmN0aW9uIGxpbmVUbyhjdHgsIHByZXZpb3VzLCB0YXJnZXQpIHtcbiAgY3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lTWV0aG9kKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc3RlcHBlZCkge1xuICAgIHJldHVybiBfc3RlcHBlZExpbmVUbztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRlbnNpb24gfHwgb3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlID09PSAnbW9ub3RvbmUnKSB7XG4gICAgcmV0dXJuIF9iZXppZXJDdXJ2ZVRvO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVUbztcbn1cblxuZnVuY3Rpb24gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMgPSB7fSkge1xuICBjb25zdCBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG4gIGNvbnN0IHtzdGFydDogcGFyYW1zU3RhcnQgPSAwLCBlbmQ6IHBhcmFtc0VuZCA9IGNvdW50IC0gMX0gPSBwYXJhbXM7XG4gIGNvbnN0IHtzdGFydDogc2VnbWVudFN0YXJ0LCBlbmQ6IHNlZ21lbnRFbmR9ID0gc2VnbWVudDtcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heChwYXJhbXNTdGFydCwgc2VnbWVudFN0YXJ0KTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4ocGFyYW1zRW5kLCBzZWdtZW50RW5kKTtcbiAgY29uc3Qgb3V0c2lkZSA9IHBhcmFtc1N0YXJ0IDwgc2VnbWVudFN0YXJ0ICYmIHBhcmFtc0VuZCA8IHNlZ21lbnRTdGFydCB8fCBwYXJhbXNTdGFydCA+IHNlZ21lbnRFbmQgJiYgcGFyYW1zRW5kID4gc2VnbWVudEVuZDtcblxuICByZXR1cm4ge1xuICAgIGNvdW50LFxuICAgIHN0YXJ0LFxuICAgIGxvb3A6IHNlZ21lbnQubG9vcCxcbiAgICBpbGVuOiBlbmQgPCBzdGFydCAmJiAhb3V0c2lkZSA/IGNvdW50ICsgZW5kIC0gc3RhcnQgOiBlbmQgLSBzdGFydFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBwYXRoIGZyb20gcG9pbnRzLCBncm91cGluZyBieSB0cnVuY2F0ZWQgeC1jb29yZGluYXRlXG4gKiBQb2ludHMgbmVlZCB0byBiZSBpbiBvcmRlciBieSB4LWNvb3JkaW5hdGUgZm9yIHRoaXMgdG8gd29yayBlZmZpY2llbnRseVxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8UGF0aDJEfSBjdHggLSBDb250ZXh0XG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gc2VnbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQuc3RhcnQgLSBzdGFydCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LmVuZCAtIGVuZCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VnbWVudC5sb29wIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgaXMgYSBsb29wXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5tb3ZlIC0gbW92ZSB0byBzdGFydGluZyBwb2ludCAodnMgbGluZSB0byBpdClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLnJldmVyc2UgLSBwYXRoIHRoZSBzZWdtZW50IGZyb20gZW5kIHRvIHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnN0YXJ0IC0gbGltaXQgc2VnbWVudCB0byBwb2ludHMgc3RhcnRpbmcgZnJvbSBgc3RhcnRgIGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLmVuZCAtIGxpbWl0IHNlZ21lbnQgdG8gcG9pbnRzIGVuZGluZyBhdCBgc3RhcnRgICsgYGNvdW50YCBpbmRleFxuICovXG5mdW5jdGlvbiBwYXRoU2VnbWVudChjdHgsIGxpbmUsIHNlZ21lbnQsIHBhcmFtcykge1xuICBjb25zdCB7cG9pbnRzLCBvcHRpb25zfSA9IGxpbmU7XG4gIGNvbnN0IHtjb3VudCwgc3RhcnQsIGxvb3AsIGlsZW59ID0gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMpO1xuICBjb25zdCBsaW5lTWV0aG9kID0gZ2V0TGluZU1ldGhvZChvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQge21vdmUgPSB0cnVlLCByZXZlcnNlfSA9IHBhcmFtcyB8fCB7fTtcbiAgbGV0IGksIHBvaW50LCBwcmV2O1xuXG4gIGZvciAoaSA9IDA7IGkgPD0gaWxlbjsgKytpKSB7XG4gICAgcG9pbnQgPSBwb2ludHNbKHN0YXJ0ICsgKHJldmVyc2UgPyBpbGVuIC0gaSA6IGkpKSAlIGNvdW50XTtcblxuICAgIGlmIChwb2ludC5za2lwKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIHNraXBwZWQgcG9pbnQgaW5zaWRlIGEgc2VnbWVudCwgc3BhbkdhcHMgbXVzdCBiZSB0cnVlXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKG1vdmUpIHtcbiAgICAgIGN0eC5tb3ZlVG8ocG9pbnQueCwgcG9pbnQueSk7XG4gICAgICBtb3ZlID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVNZXRob2QoY3R4LCBwcmV2LCBwb2ludCwgcmV2ZXJzZSwgb3B0aW9ucy5zdGVwcGVkKTtcbiAgICB9XG5cbiAgICBwcmV2ID0gcG9pbnQ7XG4gIH1cblxuICBpZiAobG9vcCkge1xuICAgIHBvaW50ID0gcG9pbnRzWyhzdGFydCArIChyZXZlcnNlID8gaWxlbiA6IDApKSAlIGNvdW50XTtcbiAgICBsaW5lTWV0aG9kKGN0eCwgcHJldiwgcG9pbnQsIHJldmVyc2UsIG9wdGlvbnMuc3RlcHBlZCk7XG4gIH1cblxuICByZXR1cm4gISFsb29wO1xufVxuXG4vKipcbiAqIENyZWF0ZSBwYXRoIGZyb20gcG9pbnRzLCBncm91cGluZyBieSB0cnVuY2F0ZWQgeC1jb29yZGluYXRlXG4gKiBQb2ludHMgbmVlZCB0byBiZSBpbiBvcmRlciBieSB4LWNvb3JkaW5hdGUgZm9yIHRoaXMgdG8gd29yayBlZmZpY2llbnRseVxuICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR8UGF0aDJEfSBjdHggLSBDb250ZXh0XG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKiBAcGFyYW0ge29iamVjdH0gc2VnbWVudFxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQuc3RhcnQgLSBzdGFydCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LmVuZCAtIGVuZCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VnbWVudC5sb29wIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgaXMgYSBsb29wXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5tb3ZlIC0gbW92ZSB0byBzdGFydGluZyBwb2ludCAodnMgbGluZSB0byBpdClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLnJldmVyc2UgLSBwYXRoIHRoZSBzZWdtZW50IGZyb20gZW5kIHRvIHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnN0YXJ0IC0gbGltaXQgc2VnbWVudCB0byBwb2ludHMgc3RhcnRpbmcgZnJvbSBgc3RhcnRgIGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLmVuZCAtIGxpbWl0IHNlZ21lbnQgdG8gcG9pbnRzIGVuZGluZyBhdCBgc3RhcnRgICsgYGNvdW50YCBpbmRleFxuICovXG5mdW5jdGlvbiBmYXN0UGF0aFNlZ21lbnQoY3R4LCBsaW5lLCBzZWdtZW50LCBwYXJhbXMpIHtcbiAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IHtjb3VudCwgc3RhcnQsIGlsZW59ID0gcGF0aFZhcnMocG9pbnRzLCBzZWdtZW50LCBwYXJhbXMpO1xuICBjb25zdCB7bW92ZSA9IHRydWUsIHJldmVyc2V9ID0gcGFyYW1zIHx8IHt9O1xuICBsZXQgYXZnWCA9IDA7XG4gIGxldCBjb3VudFggPSAwO1xuICBsZXQgaSwgcG9pbnQsIHByZXZYLCBtaW5ZLCBtYXhZLCBsYXN0WTtcblxuICBjb25zdCBwb2ludEluZGV4ID0gKGluZGV4KSA9PiAoc3RhcnQgKyAocmV2ZXJzZSA/IGlsZW4gLSBpbmRleCA6IGluZGV4KSkgJSBjb3VudDtcbiAgY29uc3QgZHJhd1ggPSAoKSA9PiB7XG4gICAgaWYgKG1pblkgIT09IG1heFkpIHtcbiAgICAgIC8vIERyYXcgbGluZSB0byBtYXhZIGFuZCBtaW5ZLCB1c2luZyB0aGUgYXZlcmFnZSB4LWNvb3JkaW5hdGVcbiAgICAgIGN0eC5saW5lVG8oYXZnWCwgbWF4WSk7XG4gICAgICBjdHgubGluZVRvKGF2Z1gsIG1pblkpO1xuICAgICAgLy8gTGluZSB0byB5LXZhbHVlIG9mIGxhc3QgcG9pbnQgaW4gZ3JvdXAuIFNvIHRoZSBsaW5lIGNvbnRpbnVlc1xuICAgICAgLy8gZnJvbSBjb3JyZWN0IHBvc2l0aW9uLiBOb3QgdXNpbmcgbW92ZSwgdG8gaGF2ZSBzb2xpZCBwYXRoLlxuICAgICAgY3R4LmxpbmVUbyhhdmdYLCBsYXN0WSk7XG4gICAgfVxuICB9O1xuXG4gIGlmIChtb3ZlKSB7XG4gICAgcG9pbnQgPSBwb2ludHNbcG9pbnRJbmRleCgwKV07XG4gICAgY3R4Lm1vdmVUbyhwb2ludC54LCBwb2ludC55KTtcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPD0gaWxlbjsgKytpKSB7XG4gICAgcG9pbnQgPSBwb2ludHNbcG9pbnRJbmRleChpKV07XG5cbiAgICBpZiAocG9pbnQuc2tpcCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBza2lwcGVkIHBvaW50IGluc2lkZSBhIHNlZ21lbnQsIHNwYW5HYXBzIG11c3QgYmUgdHJ1ZVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgeCA9IHBvaW50Lng7XG4gICAgY29uc3QgeSA9IHBvaW50Lnk7XG4gICAgY29uc3QgdHJ1bmNYID0geCB8IDA7IC8vIHRydW5jYXRlZCB4LWNvb3JkaW5hdGVcblxuICAgIGlmICh0cnVuY1ggPT09IHByZXZYKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgYG1pbllgIC8gYG1heFlgIGFuZCBgYXZnWGAgd2hpbGUgd2Ugc3RheSB3aXRoaW4gc2FtZSB4LXBvc2l0aW9uXG4gICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgbWluWSA9IHk7XG4gICAgICB9IGVsc2UgaWYgKHkgPiBtYXhZKSB7XG4gICAgICAgIG1heFkgPSB5O1xuICAgICAgfVxuICAgICAgLy8gRm9yIGZpcnN0IHBvaW50IGluIGdyb3VwLCBjb3VudFggaXMgYDBgLCBzbyBhdmVyYWdlIHdpbGwgYmUgYHhgIC8gMS5cbiAgICAgIGF2Z1ggPSAoY291bnRYICogYXZnWCArIHgpIC8gKytjb3VudFg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyYXdYKCk7XG4gICAgICAvLyBEcmF3IGxpbmUgdG8gbmV4dCB4LXBvc2l0aW9uLCB1c2luZyB0aGUgZmlyc3QgKG9yIG9ubHkpXG4gICAgICAvLyB5LXZhbHVlIGluIHRoYXQgZ3JvdXBcbiAgICAgIGN0eC5saW5lVG8oeCwgeSk7XG5cbiAgICAgIHByZXZYID0gdHJ1bmNYO1xuICAgICAgY291bnRYID0gMDtcbiAgICAgIG1pblkgPSBtYXhZID0geTtcbiAgICB9XG4gICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCB5LXZhbHVlIGluIGdyb3VwXG4gICAgbGFzdFkgPSB5O1xuICB9XG4gIGRyYXdYKCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtMaW5lRWxlbWVudH0gbGluZSAtIHRoZSBsaW5lXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfZ2V0U2VnbWVudE1ldGhvZChsaW5lKSB7XG4gIGNvbnN0IG9wdHMgPSBsaW5lLm9wdGlvbnM7XG4gIGNvbnN0IGJvcmRlckRhc2ggPSBvcHRzLmJvcmRlckRhc2ggJiYgb3B0cy5ib3JkZXJEYXNoLmxlbmd0aDtcbiAgY29uc3QgdXNlRmFzdFBhdGggPSAhbGluZS5fZGVjaW1hdGVkICYmICFsaW5lLl9sb29wICYmICFvcHRzLnRlbnNpb24gJiYgb3B0cy5jdWJpY0ludGVycG9sYXRpb25Nb2RlICE9PSAnbW9ub3RvbmUnICYmICFvcHRzLnN0ZXBwZWQgJiYgIWJvcmRlckRhc2g7XG4gIHJldHVybiB1c2VGYXN0UGF0aCA/IGZhc3RQYXRoU2VnbWVudCA6IHBhdGhTZWdtZW50O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9nZXRJbnRlcnBvbGF0aW9uTWV0aG9kKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc3RlcHBlZCkge1xuICAgIHJldHVybiBfc3RlcHBlZEludGVycG9sYXRpb247XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZW5zaW9uIHx8IG9wdGlvbnMuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ21vbm90b25lJykge1xuICAgIHJldHVybiBfYmV6aWVySW50ZXJwb2xhdGlvbjtcbiAgfVxuXG4gIHJldHVybiBfcG9pbnRJbkxpbmU7XG59XG5cbmZ1bmN0aW9uIHN0cm9rZVBhdGhXaXRoQ2FjaGUoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgbGV0IHBhdGggPSBsaW5lLl9wYXRoO1xuICBpZiAoIXBhdGgpIHtcbiAgICBwYXRoID0gbGluZS5fcGF0aCA9IG5ldyBQYXRoMkQoKTtcbiAgICBpZiAobGluZS5wYXRoKHBhdGgsIHN0YXJ0LCBjb3VudCkpIHtcbiAgICAgIHBhdGguY2xvc2VQYXRoKCk7XG4gICAgfVxuICB9XG4gIHNldFN0eWxlKGN0eCwgbGluZS5vcHRpb25zKTtcbiAgY3R4LnN0cm9rZShwYXRoKTtcbn1cblxuZnVuY3Rpb24gc3Ryb2tlUGF0aERpcmVjdChjdHgsIGxpbmUsIHN0YXJ0LCBjb3VudCkge1xuICBjb25zdCB7c2VnbWVudHMsIG9wdGlvbnN9ID0gbGluZTtcbiAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKGxpbmUpO1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIHNldFN0eWxlKGN0eCwgb3B0aW9ucywgc2VnbWVudC5zdHlsZSk7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGlmIChzZWdtZW50TWV0aG9kKGN0eCwgbGluZSwgc2VnbWVudCwge3N0YXJ0LCBlbmQ6IHN0YXJ0ICsgY291bnQgLSAxfSkpIHtcbiAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59XG5cbmNvbnN0IHVzZVBhdGgyRCA9IHR5cGVvZiBQYXRoMkQgPT09ICdmdW5jdGlvbic7XG5cbmZ1bmN0aW9uIGRyYXcoY3R4LCBsaW5lLCBzdGFydCwgY291bnQpIHtcbiAgaWYgKHVzZVBhdGgyRCAmJiAhbGluZS5vcHRpb25zLnNlZ21lbnQpIHtcbiAgICBzdHJva2VQYXRoV2l0aENhY2hlKGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KTtcbiAgfSBlbHNlIHtcbiAgICBzdHJva2VQYXRoRGlyZWN0KGN0eCwgbGluZSwgc3RhcnQsIGNvdW50KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIHN0YXRpYyBpZCA9ICdsaW5lJztcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0cyA9IHtcbiAgICBib3JkZXJDYXBTdHlsZTogJ2J1dHQnLFxuICAgIGJvcmRlckRhc2g6IFtdLFxuICAgIGJvcmRlckRhc2hPZmZzZXQ6IDAsXG4gICAgYm9yZGVySm9pblN0eWxlOiAnbWl0ZXInLFxuICAgIGJvcmRlcldpZHRoOiAzLFxuICAgIGNhcEJlemllclBvaW50czogdHJ1ZSxcbiAgICBjdWJpY0ludGVycG9sYXRpb25Nb2RlOiAnZGVmYXVsdCcsXG4gICAgZmlsbDogZmFsc2UsXG4gICAgc3BhbkdhcHM6IGZhbHNlLFxuICAgIHN0ZXBwZWQ6IGZhbHNlLFxuICAgIHRlbnNpb246IDAsXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgIGJvcmRlckNvbG9yOiAnYm9yZGVyQ29sb3InXG4gIH07XG5cblxuICBzdGF0aWMgZGVzY3JpcHRvcnMgPSB7XG4gICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgX2luZGV4YWJsZTogKG5hbWUpID0+IG5hbWUgIT09ICdib3JkZXJEYXNoJyAmJiBuYW1lICE9PSAnZmlsbCcsXG4gIH07XG5cblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5hbmltYXRlZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NoYXJ0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2xvb3AgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZnVsbExvb3AgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wb2ludHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2VnbWVudHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZGVjaW1hdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2RhdGFzZXRJbmRleCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChjZmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250cm9sUG9pbnRzKGNoYXJ0QXJlYSwgaW5kZXhBeGlzKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoKG9wdGlvbnMudGVuc2lvbiB8fCBvcHRpb25zLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPT09ICdtb25vdG9uZScpICYmICFvcHRpb25zLnN0ZXBwZWQgJiYgIXRoaXMuX3BvaW50c1VwZGF0ZWQpIHtcbiAgICAgIGNvbnN0IGxvb3AgPSBvcHRpb25zLnNwYW5HYXBzID8gdGhpcy5fbG9vcCA6IHRoaXMuX2Z1bGxMb29wO1xuICAgICAgX3VwZGF0ZUJlemllckNvbnRyb2xQb2ludHModGhpcy5fcG9pbnRzLCBvcHRpb25zLCBjaGFydEFyZWEsIGxvb3AsIGluZGV4QXhpcyk7XG4gICAgICB0aGlzLl9wb2ludHNVcGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXQgcG9pbnRzKHBvaW50cykge1xuICAgIHRoaXMuX3BvaW50cyA9IHBvaW50cztcbiAgICBkZWxldGUgdGhpcy5fc2VnbWVudHM7XG4gICAgZGVsZXRlIHRoaXMuX3BhdGg7XG4gICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgZ2V0IHNlZ21lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWdtZW50cyB8fCAodGhpcy5fc2VnbWVudHMgPSBfY29tcHV0ZVNlZ21lbnRzKHRoaXMsIHRoaXMub3B0aW9ucy5zZWdtZW50KSk7XG4gIH1cblxuICAvKipcblx0ICogRmlyc3Qgbm9uLXNraXBwZWQgcG9pbnQgb24gdGhpcyBsaW5lXG5cdCAqIEByZXR1cm5zIHtQb2ludEVsZW1lbnR8dW5kZWZpbmVkfVxuXHQgKi9cbiAgZmlyc3QoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggJiYgcG9pbnRzW3NlZ21lbnRzWzBdLnN0YXJ0XTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBMYXN0IG5vbi1za2lwcGVkIHBvaW50IG9uIHRoaXMgbGluZVxuXHQgKiBAcmV0dXJucyB7UG9pbnRFbGVtZW50fHVuZGVmaW5lZH1cblx0ICovXG4gIGxhc3QoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzO1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzO1xuICAgIGNvbnN0IGNvdW50ID0gc2VnbWVudHMubGVuZ3RoO1xuICAgIHJldHVybiBjb3VudCAmJiBwb2ludHNbc2VnbWVudHNbY291bnQgLSAxXS5lbmRdO1xuICB9XG5cbiAgLyoqXG5cdCAqIEludGVycG9sYXRlIGEgcG9pbnQgaW4gdGhpcyBsaW5lIGF0IHRoZSBzYW1lIHZhbHVlIG9uIGBwcm9wZXJ0eWAgYXNcblx0ICogdGhlIHJlZmVyZW5jZSBgcG9pbnRgIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSB7UG9pbnRFbGVtZW50fSBwb2ludCAtIHRoZSByZWZlcmVuY2UgcG9pbnRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gdGhlIHByb3BlcnR5IHRvIG1hdGNoIG9uXG5cdCAqIEByZXR1cm5zIHtQb2ludEVsZW1lbnR8dW5kZWZpbmVkfVxuXHQgKi9cbiAgaW50ZXJwb2xhdGUocG9pbnQsIHByb3BlcnR5KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB2YWx1ZSA9IHBvaW50W3Byb3BlcnR5XTtcbiAgICBjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcbiAgICBjb25zdCBzZWdtZW50cyA9IF9ib3VuZFNlZ21lbnRzKHRoaXMsIHtwcm9wZXJ0eSwgc3RhcnQ6IHZhbHVlLCBlbmQ6IHZhbHVlfSk7XG5cbiAgICBpZiAoIXNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IF9pbnRlcnBvbGF0ZSA9IF9nZXRJbnRlcnBvbGF0aW9uTWV0aG9kKG9wdGlvbnMpO1xuICAgIGxldCBpLCBpbGVuO1xuICAgIGZvciAoaSA9IDAsIGlsZW4gPSBzZWdtZW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGNvbnN0IHtzdGFydCwgZW5kfSA9IHNlZ21lbnRzW2ldO1xuICAgICAgY29uc3QgcDEgPSBwb2ludHNbc3RhcnRdO1xuICAgICAgY29uc3QgcDIgPSBwb2ludHNbZW5kXTtcbiAgICAgIGlmIChwMSA9PT0gcDIpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocDEpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHQgPSBNYXRoLmFicygodmFsdWUgLSBwMVtwcm9wZXJ0eV0pIC8gKHAyW3Byb3BlcnR5XSAtIHAxW3Byb3BlcnR5XSkpO1xuICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gX2ludGVycG9sYXRlKHAxLCBwMiwgdCwgb3B0aW9ucy5zdGVwcGVkKTtcbiAgICAgIGludGVycG9sYXRlZFtwcm9wZXJ0eV0gPSBwb2ludFtwcm9wZXJ0eV07XG4gICAgICByZXN1bHQucHVzaChpbnRlcnBvbGF0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PT0gMSA/IHJlc3VsdFswXSA6IHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBBcHBlbmQgYSBzZWdtZW50IG9mIHRoaXMgbGluZSB0byBjdXJyZW50IHBhdGguXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHhcblx0ICogQHBhcmFtIHtvYmplY3R9IHNlZ21lbnRcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQuc3RhcnQgLSBzdGFydCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiBcdCAqIEBwYXJhbSB7bnVtYmVyfSBzZWdtZW50LmVuZCAtIGVuZCBpbmRleCBvZiB0aGUgc2VnbWVudCwgcmVmZXJyaW5nIHRoZSBwb2ludHMgYXJyYXlcbiBcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VnbWVudC5sb29wIC0gaW5kaWNhdGVzIHRoYXQgdGhlIHNlZ21lbnQgaXMgYSBsb29wXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcblx0ICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMubW92ZSAtIG1vdmUgdG8gc3RhcnRpbmcgcG9pbnQgKHZzIGxpbmUgdG8gaXQpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gcGFyYW1zLnJldmVyc2UgLSBwYXRoIHRoZSBzZWdtZW50IGZyb20gZW5kIHRvIHN0YXJ0XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMuc3RhcnQgLSBsaW1pdCBzZWdtZW50IHRvIHBvaW50cyBzdGFydGluZyBmcm9tIGBzdGFydGAgaW5kZXhcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5lbmQgLSBsaW1pdCBzZWdtZW50IHRvIHBvaW50cyBlbmRpbmcgYXQgYHN0YXJ0YCArIGBjb3VudGAgaW5kZXhcblx0ICogQHJldHVybnMge3VuZGVmaW5lZHxib29sZWFufSAtIHRydWUgaWYgdGhlIHNlZ21lbnQgaXMgYSBmdWxsIGxvb3AgKHBhdGggc2hvdWxkIGJlIGNsb3NlZClcblx0ICovXG4gIHBhdGhTZWdtZW50KGN0eCwgc2VnbWVudCwgcGFyYW1zKSB7XG4gICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKHRoaXMpO1xuICAgIHJldHVybiBzZWdtZW50TWV0aG9kKGN0eCwgdGhpcywgc2VnbWVudCwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBBcHBlbmQgYWxsIHNlZ21lbnRzIG9mIHRoaXMgbGluZSB0byBjdXJyZW50IHBhdGguXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfFBhdGgyRH0gY3R4XG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRdXG5cdCAqIEByZXR1cm5zIHt1bmRlZmluZWR8Ym9vbGVhbn0gLSB0cnVlIGlmIGxpbmUgaXMgYSBmdWxsIGxvb3AgKHBhdGggc2hvdWxkIGJlIGNsb3NlZClcblx0ICovXG4gIHBhdGgoY3R4LCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMuc2VnbWVudHM7XG4gICAgY29uc3Qgc2VnbWVudE1ldGhvZCA9IF9nZXRTZWdtZW50TWV0aG9kKHRoaXMpO1xuICAgIGxldCBsb29wID0gdGhpcy5fbG9vcDtcblxuICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICBjb3VudCA9IGNvdW50IHx8ICh0aGlzLnBvaW50cy5sZW5ndGggLSBzdGFydCk7XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICAgIGxvb3AgJj0gc2VnbWVudE1ldGhvZChjdHgsIHRoaXMsIHNlZ21lbnQsIHtzdGFydCwgZW5kOiBzdGFydCArIGNvdW50IC0gMX0pO1xuICAgIH1cbiAgICByZXR1cm4gISFsb29wO1xuICB9XG5cbiAgLyoqXG5cdCAqIERyYXdcblx0ICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eFxuXHQgKiBAcGFyYW0ge29iamVjdH0gY2hhcnRBcmVhXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnRdXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbY291bnRdXG5cdCAqL1xuICBkcmF3KGN0eCwgY2hhcnRBcmVhLCBzdGFydCwgY291bnQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHBvaW50cyA9IHRoaXMucG9pbnRzIHx8IFtdO1xuXG4gICAgaWYgKHBvaW50cy5sZW5ndGggJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCkge1xuICAgICAgY3R4LnNhdmUoKTtcblxuICAgICAgZHJhdyhjdHgsIHRoaXMsIHN0YXJ0LCBjb3VudCk7XG5cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgIC8vIFdoZW4gbGluZSBpcyBhbmltYXRlZCwgdGhlIGNvbnRyb2wgcG9pbnRzIGFuZCBwYXRoIGFyZSBub3QgY2FjaGVkLlxuICAgICAgdGhpcy5fcG9pbnRzVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcGF0aCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgRWxlbWVudCBmcm9tICcuLi9jb3JlL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQge2RyYXdQb2ludCwgX2lzUG9pbnRJbkFyZWF9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDYXJ0ZXNpYW5QYXJzZWREYXRhLFxuICBDaGFydEFyZWEsXG4gIFBvaW50LFxuICBQb2ludEhvdmVyT3B0aW9ucyxcbiAgUG9pbnRPcHRpb25zLFxufSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cbmZ1bmN0aW9uIGluUmFuZ2UoZWw6IFBvaW50RWxlbWVudCwgcG9zOiBudW1iZXIsIGF4aXM6ICd4JyB8ICd5JywgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGVsLm9wdGlvbnM7XG4gIGNvbnN0IHtbYXhpc106IHZhbHVlfSA9IGVsLmdldFByb3BzKFtheGlzXSwgdXNlRmluYWxQb3NpdGlvbik7XG5cbiAgcmV0dXJuIChNYXRoLmFicyhwb3MgLSB2YWx1ZSkgPCBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaGl0UmFkaXVzKTtcbn1cblxuZXhwb3J0IHR5cGUgUG9pbnRQcm9wcyA9IFBvaW50XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50RWxlbWVudCBleHRlbmRzIEVsZW1lbnQ8UG9pbnRQcm9wcywgUG9pbnRPcHRpb25zICYgUG9pbnRIb3Zlck9wdGlvbnM+IHtcblxuICBzdGF0aWMgaWQgPSAncG9pbnQnO1xuXG4gIHBhcnNlZDogQ2FydGVzaWFuUGFyc2VkRGF0YTtcbiAgc2tpcD86IGJvb2xlYW47XG4gIHN0b3A/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIGJvcmRlcldpZHRoOiAxLFxuICAgIGhpdFJhZGl1czogMSxcbiAgICBob3ZlckJvcmRlcldpZHRoOiAxLFxuICAgIGhvdmVyUmFkaXVzOiA0LFxuICAgIHBvaW50U3R5bGU6ICdjaXJjbGUnLFxuICAgIHJhZGl1czogMyxcbiAgICByb3RhdGlvbjogMFxuICB9O1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRSb3V0ZXMgPSB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnYmFja2dyb3VuZENvbG9yJyxcbiAgICBib3JkZXJDb2xvcjogJ2JvcmRlckNvbG9yJ1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXJzZWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5za2lwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RvcCA9IHVuZGVmaW5lZDtcblxuICAgIGlmIChjZmcpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgY2ZnKTtcbiAgICB9XG4gIH1cblxuICBpblJhbmdlKG1vdXNlWDogbnVtYmVyLCBtb3VzZVk6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuZ2V0UHJvcHMoWyd4JywgJ3knXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgcmV0dXJuICgoTWF0aC5wb3cobW91c2VYIC0geCwgMikgKyBNYXRoLnBvdyhtb3VzZVkgLSB5LCAyKSkgPCBNYXRoLnBvdyhvcHRpb25zLmhpdFJhZGl1cyArIG9wdGlvbnMucmFkaXVzLCAyKSk7XG4gIH1cblxuICBpblhSYW5nZShtb3VzZVg6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaW5SYW5nZSh0aGlzLCBtb3VzZVgsICd4JywgdXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBpbllSYW5nZShtb3VzZVk6IG51bWJlciwgdXNlRmluYWxQb3NpdGlvbj86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaW5SYW5nZSh0aGlzLCBtb3VzZVksICd5JywgdXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMuZ2V0UHJvcHMoWyd4JywgJ3knXSwgdXNlRmluYWxQb3NpdGlvbik7XG4gICAgcmV0dXJuIHt4LCB5fTtcbiAgfVxuXG4gIHNpemUob3B0aW9ucz86IFBhcnRpYWw8UG9pbnRPcHRpb25zICYgUG9pbnRIb3Zlck9wdGlvbnM+KSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5vcHRpb25zIHx8IHt9O1xuICAgIGxldCByYWRpdXMgPSBvcHRpb25zLnJhZGl1cyB8fCAwO1xuICAgIHJhZGl1cyA9IE1hdGgubWF4KHJhZGl1cywgcmFkaXVzICYmIG9wdGlvbnMuaG92ZXJSYWRpdXMgfHwgMCk7XG4gICAgY29uc3QgYm9yZGVyV2lkdGggPSByYWRpdXMgJiYgb3B0aW9ucy5ib3JkZXJXaWR0aCB8fCAwO1xuICAgIHJldHVybiAocmFkaXVzICsgYm9yZGVyV2lkdGgpICogMjtcbiAgfVxuXG4gIGRyYXcoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFyZWE6IENoYXJ0QXJlYSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAodGhpcy5za2lwIHx8IG9wdGlvbnMucmFkaXVzIDwgMC4xIHx8ICFfaXNQb2ludEluQXJlYSh0aGlzLCBhcmVhLCB0aGlzLnNpemUob3B0aW9ucykgLyAyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdGlvbnMuYm9yZGVyQ29sb3I7XG4gICAgY3R4LmxpbmVXaWR0aCA9IG9wdGlvbnMuYm9yZGVyV2lkdGg7XG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgIGRyYXdQb2ludChjdHgsIG9wdGlvbnMsIHRoaXMueCwgdGhpcy55KTtcbiAgfVxuXG4gIGdldFJhbmdlKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMgfHwge307XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGYWxsYmFja3Mgc2hvdWxkIG5ldmVyIGJlIGhpdCBpbiBwcmFjdGljZVxuICAgIHJldHVybiBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaGl0UmFkaXVzO1xuICB9XG59XG4iLCAiaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHtpc09iamVjdCwgX2lzQmV0d2VlbiwgX2xpbWl0VmFsdWV9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHthZGRSb3VuZGVkUmVjdFBhdGh9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHt0b1RSQkwsIHRvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuLyoqIEB0eXBlZGVmIHt7IHg6IG51bWJlciwgeTogbnVtYmVyLCBiYXNlOiBudW1iZXIsIGhvcml6b250YWw6IGJvb2xlYW4sIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH19IEJhclByb3BzICovXG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgYm91bmRzIG9mIHRoZSBiYXIgcmVnYXJkbGVzcyBvZiB0aGUgb3JpZW50YXRpb25cbiAqIEBwYXJhbSB7QmFyRWxlbWVudH0gYmFyIHRoZSBiYXJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VzZUZpbmFsUG9zaXRpb25dXG4gKiBAcmV0dXJuIHtvYmplY3R9IGJvdW5kcyBvZiB0aGUgYmFyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRCYXJCb3VuZHMoYmFyLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gIGNvbnN0IHt4LCB5LCBiYXNlLCB3aWR0aCwgaGVpZ2h0fSA9IC8qKiBAdHlwZSB7QmFyUHJvcHN9ICovIChiYXIuZ2V0UHJvcHMoWyd4JywgJ3knLCAnYmFzZScsICd3aWR0aCcsICdoZWlnaHQnXSwgdXNlRmluYWxQb3NpdGlvbikpO1xuXG4gIGxldCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIGhhbGY7XG5cbiAgaWYgKGJhci5ob3Jpem9udGFsKSB7XG4gICAgaGFsZiA9IGhlaWdodCAvIDI7XG4gICAgbGVmdCA9IE1hdGgubWluKHgsIGJhc2UpO1xuICAgIHJpZ2h0ID0gTWF0aC5tYXgoeCwgYmFzZSk7XG4gICAgdG9wID0geSAtIGhhbGY7XG4gICAgYm90dG9tID0geSArIGhhbGY7XG4gIH0gZWxzZSB7XG4gICAgaGFsZiA9IHdpZHRoIC8gMjtcbiAgICBsZWZ0ID0geCAtIGhhbGY7XG4gICAgcmlnaHQgPSB4ICsgaGFsZjtcbiAgICB0b3AgPSBNYXRoLm1pbih5LCBiYXNlKTtcbiAgICBib3R0b20gPSBNYXRoLm1heCh5LCBiYXNlKTtcbiAgfVxuXG4gIHJldHVybiB7bGVmdCwgdG9wLCByaWdodCwgYm90dG9tfTtcbn1cblxuZnVuY3Rpb24gc2tpcE9yTGltaXQoc2tpcCwgdmFsdWUsIG1pbiwgbWF4KSB7XG4gIHJldHVybiBza2lwID8gMCA6IF9saW1pdFZhbHVlKHZhbHVlLCBtaW4sIG1heCk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyV2lkdGgoYmFyLCBtYXhXLCBtYXhIKSB7XG4gIGNvbnN0IHZhbHVlID0gYmFyLm9wdGlvbnMuYm9yZGVyV2lkdGg7XG4gIGNvbnN0IHNraXAgPSBiYXIuYm9yZGVyU2tpcHBlZDtcbiAgY29uc3QgbyA9IHRvVFJCTCh2YWx1ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICB0OiBza2lwT3JMaW1pdChza2lwLnRvcCwgby50b3AsIDAsIG1heEgpLFxuICAgIHI6IHNraXBPckxpbWl0KHNraXAucmlnaHQsIG8ucmlnaHQsIDAsIG1heFcpLFxuICAgIGI6IHNraXBPckxpbWl0KHNraXAuYm90dG9tLCBvLmJvdHRvbSwgMCwgbWF4SCksXG4gICAgbDogc2tpcE9yTGltaXQoc2tpcC5sZWZ0LCBvLmxlZnQsIDAsIG1heFcpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlQm9yZGVyUmFkaXVzKGJhciwgbWF4VywgbWF4SCkge1xuICBjb25zdCB7ZW5hYmxlQm9yZGVyUmFkaXVzfSA9IGJhci5nZXRQcm9wcyhbJ2VuYWJsZUJvcmRlclJhZGl1cyddKTtcbiAgY29uc3QgdmFsdWUgPSBiYXIub3B0aW9ucy5ib3JkZXJSYWRpdXM7XG4gIGNvbnN0IG8gPSB0b1RSQkxDb3JuZXJzKHZhbHVlKTtcbiAgY29uc3QgbWF4UiA9IE1hdGgubWluKG1heFcsIG1heEgpO1xuICBjb25zdCBza2lwID0gYmFyLmJvcmRlclNraXBwZWQ7XG5cbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCwgYXNzdW1lIHRoZSB1c2VyIGtub3dzIHdoYXQgdGhleSBhcmUgZG9pbmdcbiAgLy8gYW5kIGFwcGx5IGFzIGRpcmVjdGVkLlxuICBjb25zdCBlbmFibGVCb3JkZXIgPSBlbmFibGVCb3JkZXJSYWRpdXMgfHwgaXNPYmplY3QodmFsdWUpO1xuXG4gIHJldHVybiB7XG4gICAgdG9wTGVmdDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLnRvcCB8fCBza2lwLmxlZnQsIG8udG9wTGVmdCwgMCwgbWF4UiksXG4gICAgdG9wUmlnaHQ6IHNraXBPckxpbWl0KCFlbmFibGVCb3JkZXIgfHwgc2tpcC50b3AgfHwgc2tpcC5yaWdodCwgby50b3BSaWdodCwgMCwgbWF4UiksXG4gICAgYm90dG9tTGVmdDogc2tpcE9yTGltaXQoIWVuYWJsZUJvcmRlciB8fCBza2lwLmJvdHRvbSB8fCBza2lwLmxlZnQsIG8uYm90dG9tTGVmdCwgMCwgbWF4UiksXG4gICAgYm90dG9tUmlnaHQ6IHNraXBPckxpbWl0KCFlbmFibGVCb3JkZXIgfHwgc2tpcC5ib3R0b20gfHwgc2tpcC5yaWdodCwgby5ib3R0b21SaWdodCwgMCwgbWF4UilcbiAgfTtcbn1cblxuZnVuY3Rpb24gYm91bmRpbmdSZWN0cyhiYXIpIHtcbiAgY29uc3QgYm91bmRzID0gZ2V0QmFyQm91bmRzKGJhcik7XG4gIGNvbnN0IHdpZHRoID0gYm91bmRzLnJpZ2h0IC0gYm91bmRzLmxlZnQ7XG4gIGNvbnN0IGhlaWdodCA9IGJvdW5kcy5ib3R0b20gLSBib3VuZHMudG9wO1xuICBjb25zdCBib3JkZXIgPSBwYXJzZUJvcmRlcldpZHRoKGJhciwgd2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcbiAgY29uc3QgcmFkaXVzID0gcGFyc2VCb3JkZXJSYWRpdXMoYmFyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuXG4gIHJldHVybiB7XG4gICAgb3V0ZXI6IHtcbiAgICAgIHg6IGJvdW5kcy5sZWZ0LFxuICAgICAgeTogYm91bmRzLnRvcCxcbiAgICAgIHc6IHdpZHRoLFxuICAgICAgaDogaGVpZ2h0LFxuICAgICAgcmFkaXVzXG4gICAgfSxcbiAgICBpbm5lcjoge1xuICAgICAgeDogYm91bmRzLmxlZnQgKyBib3JkZXIubCxcbiAgICAgIHk6IGJvdW5kcy50b3AgKyBib3JkZXIudCxcbiAgICAgIHc6IHdpZHRoIC0gYm9yZGVyLmwgLSBib3JkZXIucixcbiAgICAgIGg6IGhlaWdodCAtIGJvcmRlci50IC0gYm9yZGVyLmIsXG4gICAgICByYWRpdXM6IHtcbiAgICAgICAgdG9wTGVmdDogTWF0aC5tYXgoMCwgcmFkaXVzLnRvcExlZnQgLSBNYXRoLm1heChib3JkZXIudCwgYm9yZGVyLmwpKSxcbiAgICAgICAgdG9wUmlnaHQ6IE1hdGgubWF4KDAsIHJhZGl1cy50b3BSaWdodCAtIE1hdGgubWF4KGJvcmRlci50LCBib3JkZXIucikpLFxuICAgICAgICBib3R0b21MZWZ0OiBNYXRoLm1heCgwLCByYWRpdXMuYm90dG9tTGVmdCAtIE1hdGgubWF4KGJvcmRlci5iLCBib3JkZXIubCkpLFxuICAgICAgICBib3R0b21SaWdodDogTWF0aC5tYXgoMCwgcmFkaXVzLmJvdHRvbVJpZ2h0IC0gTWF0aC5tYXgoYm9yZGVyLmIsIGJvcmRlci5yKSksXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpblJhbmdlKGJhciwgeCwgeSwgdXNlRmluYWxQb3NpdGlvbikge1xuICBjb25zdCBza2lwWCA9IHggPT09IG51bGw7XG4gIGNvbnN0IHNraXBZID0geSA9PT0gbnVsbDtcbiAgY29uc3Qgc2tpcEJvdGggPSBza2lwWCAmJiBza2lwWTtcbiAgY29uc3QgYm91bmRzID0gYmFyICYmICFza2lwQm90aCAmJiBnZXRCYXJCb3VuZHMoYmFyLCB1c2VGaW5hbFBvc2l0aW9uKTtcblxuICByZXR1cm4gYm91bmRzXG5cdFx0JiYgKHNraXBYIHx8IF9pc0JldHdlZW4oeCwgYm91bmRzLmxlZnQsIGJvdW5kcy5yaWdodCkpXG5cdFx0JiYgKHNraXBZIHx8IF9pc0JldHdlZW4oeSwgYm91bmRzLnRvcCwgYm91bmRzLmJvdHRvbSkpO1xufVxuXG5mdW5jdGlvbiBoYXNSYWRpdXMocmFkaXVzKSB7XG4gIHJldHVybiByYWRpdXMudG9wTGVmdCB8fCByYWRpdXMudG9wUmlnaHQgfHwgcmFkaXVzLmJvdHRvbUxlZnQgfHwgcmFkaXVzLmJvdHRvbVJpZ2h0O1xufVxuXG4vKipcbiAqIEFkZCBhIHBhdGggb2YgYSByZWN0YW5nbGUgdG8gdGhlIGN1cnJlbnQgc3ViLXBhdGhcbiAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggQ29udGV4dFxuICogQHBhcmFtIHsqfSByZWN0IEJvdW5kaW5nIHJlY3RcbiAqL1xuZnVuY3Rpb24gYWRkTm9ybWFsUmVjdFBhdGgoY3R4LCByZWN0KSB7XG4gIGN0eC5yZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LncsIHJlY3QuaCk7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZWN0KHJlY3QsIGFtb3VudCwgcmVmUmVjdCA9IHt9KSB7XG4gIGNvbnN0IHggPSByZWN0LnggIT09IHJlZlJlY3QueCA/IC1hbW91bnQgOiAwO1xuICBjb25zdCB5ID0gcmVjdC55ICE9PSByZWZSZWN0LnkgPyAtYW1vdW50IDogMDtcbiAgY29uc3QgdyA9IChyZWN0LnggKyByZWN0LncgIT09IHJlZlJlY3QueCArIHJlZlJlY3QudyA/IGFtb3VudCA6IDApIC0geDtcbiAgY29uc3QgaCA9IChyZWN0LnkgKyByZWN0LmggIT09IHJlZlJlY3QueSArIHJlZlJlY3QuaCA/IGFtb3VudCA6IDApIC0geTtcbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LnggKyB4LFxuICAgIHk6IHJlY3QueSArIHksXG4gICAgdzogcmVjdC53ICsgdyxcbiAgICBoOiByZWN0LmggKyBoLFxuICAgIHJhZGl1czogcmVjdC5yYWRpdXNcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFyRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIHN0YXRpYyBpZCA9ICdiYXInO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIGJvcmRlclNraXBwZWQ6ICdzdGFydCcsXG4gICAgYm9yZGVyV2lkdGg6IDAsXG4gICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgIGluZmxhdGVBbW91bnQ6ICdhdXRvJyxcbiAgICBwb2ludFN0eWxlOiB1bmRlZmluZWRcbiAgfTtcblxuICAvKipcbiAgICogQHR5cGUge2FueX1cbiAgICovXG4gIHN0YXRpYyBkZWZhdWx0Um91dGVzID0ge1xuICAgIGJhY2tncm91bmRDb2xvcjogJ2JhY2tncm91bmRDb2xvcicsXG4gICAgYm9yZGVyQ29sb3I6ICdib3JkZXJDb2xvcidcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaG9yaXpvbnRhbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJhc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53aWR0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluZmxhdGVBbW91bnQgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoY2ZnKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNmZyk7XG4gICAgfVxuICB9XG5cbiAgZHJhdyhjdHgpIHtcbiAgICBjb25zdCB7aW5mbGF0ZUFtb3VudCwgb3B0aW9uczoge2JvcmRlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3J9fSA9IHRoaXM7XG4gICAgY29uc3Qge2lubmVyLCBvdXRlcn0gPSBib3VuZGluZ1JlY3RzKHRoaXMpO1xuICAgIGNvbnN0IGFkZFJlY3RQYXRoID0gaGFzUmFkaXVzKG91dGVyLnJhZGl1cykgPyBhZGRSb3VuZGVkUmVjdFBhdGggOiBhZGROb3JtYWxSZWN0UGF0aDtcblxuICAgIGN0eC5zYXZlKCk7XG5cbiAgICBpZiAob3V0ZXIudyAhPT0gaW5uZXIudyB8fCBvdXRlci5oICE9PSBpbm5lci5oKSB7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBhZGRSZWN0UGF0aChjdHgsIGluZmxhdGVSZWN0KG91dGVyLCBpbmZsYXRlQW1vdW50LCBpbm5lcikpO1xuICAgICAgY3R4LmNsaXAoKTtcbiAgICAgIGFkZFJlY3RQYXRoKGN0eCwgaW5mbGF0ZVJlY3QoaW5uZXIsIC1pbmZsYXRlQW1vdW50LCBvdXRlcikpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGJvcmRlckNvbG9yO1xuICAgICAgY3R4LmZpbGwoJ2V2ZW5vZGQnKTtcbiAgICB9XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgYWRkUmVjdFBhdGgoY3R4LCBpbmZsYXRlUmVjdChpbm5lciwgaW5mbGF0ZUFtb3VudCkpO1xuICAgIGN0eC5maWxsU3R5bGUgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgY3R4LmZpbGwoKTtcblxuICAgIGN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICBpblJhbmdlKG1vdXNlWCwgbW91c2VZLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIGluUmFuZ2UodGhpcywgbW91c2VYLCBtb3VzZVksIHVzZUZpbmFsUG9zaXRpb24pO1xuICB9XG5cbiAgaW5YUmFuZ2UobW91c2VYLCB1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgcmV0dXJuIGluUmFuZ2UodGhpcywgbW91c2VYLCBudWxsLCB1c2VGaW5hbFBvc2l0aW9uKTtcbiAgfVxuXG4gIGluWVJhbmdlKG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbikge1xuICAgIHJldHVybiBpblJhbmdlKHRoaXMsIG51bGwsIG1vdXNlWSwgdXNlRmluYWxQb3NpdGlvbik7XG4gIH1cblxuICBnZXRDZW50ZXJQb2ludCh1c2VGaW5hbFBvc2l0aW9uKSB7XG4gICAgY29uc3Qge3gsIHksIGJhc2UsIGhvcml6b250YWx9ID0gLyoqIEB0eXBlIHtCYXJQcm9wc30gKi8gKHRoaXMuZ2V0UHJvcHMoWyd4JywgJ3knLCAnYmFzZScsICdob3Jpem9udGFsJ10sIHVzZUZpbmFsUG9zaXRpb24pKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogaG9yaXpvbnRhbCA/ICh4ICsgYmFzZSkgLyAyIDogeCxcbiAgICAgIHk6IGhvcml6b250YWwgPyB5IDogKHkgKyBiYXNlKSAvIDJcbiAgICB9O1xuICB9XG5cbiAgZ2V0UmFuZ2UoYXhpcykge1xuICAgIHJldHVybiBheGlzID09PSAneCcgPyB0aGlzLndpZHRoIC8gMiA6IHRoaXMuaGVpZ2h0IC8gMjtcbiAgfVxufVxuIiwgImltcG9ydCB7RG91Z2hudXRDb250cm9sbGVyLCBQb2xhckFyZWFDb250cm9sbGVyfSBmcm9tICcuLi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2hhcnQsIENoYXJ0RGF0YXNldH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yc1BsdWdpbk9wdGlvbnMge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgZm9yY2VPdmVycmlkZT86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDb2xvcnNEZXNjcmlwdG9yIHtcbiAgYmFja2dyb3VuZENvbG9yPzogdW5rbm93bjtcbiAgYm9yZGVyQ29sb3I/OiB1bmtub3duO1xufVxuXG5jb25zdCBCT1JERVJfQ09MT1JTID0gW1xuICAncmdiKDU0LCAxNjIsIDIzNSknLCAvLyBibHVlXG4gICdyZ2IoMjU1LCA5OSwgMTMyKScsIC8vIHJlZFxuICAncmdiKDI1NSwgMTU5LCA2NCknLCAvLyBvcmFuZ2VcbiAgJ3JnYigyNTUsIDIwNSwgODYpJywgLy8geWVsbG93XG4gICdyZ2IoNzUsIDE5MiwgMTkyKScsIC8vIGdyZWVuXG4gICdyZ2IoMTUzLCAxMDIsIDI1NSknLCAvLyBwdXJwbGVcbiAgJ3JnYigyMDEsIDIwMywgMjA3KScgLy8gZ3JleVxuXTtcblxuLy8gQm9yZGVyIGNvbG9ycyB3aXRoIDUwJSB0cmFuc3BhcmVuY3lcbmNvbnN0IEJBQ0tHUk9VTkRfQ09MT1JTID0gLyogI19fUFVSRV9fICovIEJPUkRFUl9DT0xPUlMubWFwKGNvbG9yID0+IGNvbG9yLnJlcGxhY2UoJ3JnYignLCAncmdiYSgnKS5yZXBsYWNlKCcpJywgJywgMC41KScpKTtcblxuZnVuY3Rpb24gZ2V0Qm9yZGVyQ29sb3IoaTogbnVtYmVyKSB7XG4gIHJldHVybiBCT1JERVJfQ09MT1JTW2kgJSBCT1JERVJfQ09MT1JTLmxlbmd0aF07XG59XG5cbmZ1bmN0aW9uIGdldEJhY2tncm91bmRDb2xvcihpOiBudW1iZXIpIHtcbiAgcmV0dXJuIEJBQ0tHUk9VTkRfQ09MT1JTW2kgJSBCQUNLR1JPVU5EX0NPTE9SUy5sZW5ndGhdO1xufVxuXG5mdW5jdGlvbiBjb2xvcml6ZURlZmF1bHREYXRhc2V0KGRhdGFzZXQ6IENoYXJ0RGF0YXNldCwgaTogbnVtYmVyKSB7XG4gIGRhdGFzZXQuYm9yZGVyQ29sb3IgPSBnZXRCb3JkZXJDb2xvcihpKTtcbiAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBnZXRCYWNrZ3JvdW5kQ29sb3IoaSk7XG5cbiAgcmV0dXJuICsraTtcbn1cblxuZnVuY3Rpb24gY29sb3JpemVEb3VnaG51dERhdGFzZXQoZGF0YXNldDogQ2hhcnREYXRhc2V0LCBpOiBudW1iZXIpIHtcbiAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmRhdGEubWFwKCgpID0+IGdldEJvcmRlckNvbG9yKGkrKykpO1xuXG4gIHJldHVybiBpO1xufVxuXG5mdW5jdGlvbiBjb2xvcml6ZVBvbGFyQXJlYURhdGFzZXQoZGF0YXNldDogQ2hhcnREYXRhc2V0LCBpOiBudW1iZXIpIHtcbiAgZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IgPSBkYXRhc2V0LmRhdGEubWFwKCgpID0+IGdldEJhY2tncm91bmRDb2xvcihpKyspKTtcblxuICByZXR1cm4gaTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29sb3JpemVyKGNoYXJ0OiBDaGFydCkge1xuICBsZXQgaSA9IDA7XG5cbiAgcmV0dXJuIChkYXRhc2V0OiBDaGFydERhdGFzZXQsIGRhdGFzZXRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuY29udHJvbGxlcjtcblxuICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgRG91Z2hudXRDb250cm9sbGVyKSB7XG4gICAgICBpID0gY29sb3JpemVEb3VnaG51dERhdGFzZXQoZGF0YXNldCwgaSk7XG4gICAgfSBlbHNlIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgUG9sYXJBcmVhQ29udHJvbGxlcikge1xuICAgICAgaSA9IGNvbG9yaXplUG9sYXJBcmVhRGF0YXNldChkYXRhc2V0LCBpKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xsZXIpIHtcbiAgICAgIGkgPSBjb2xvcml6ZURlZmF1bHREYXRhc2V0KGRhdGFzZXQsIGkpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNDb2xvcnNEZWZpbml0aW9ucyhcbiAgZGVzY3JpcHRvcnM6IENvbG9yc0Rlc2NyaXB0b3JbXSB8IFJlY29yZDxzdHJpbmcsIENvbG9yc0Rlc2NyaXB0b3I+XG4pIHtcbiAgbGV0IGs6IG51bWJlciB8IHN0cmluZztcblxuICBmb3IgKGsgaW4gZGVzY3JpcHRvcnMpIHtcbiAgICBpZiAoZGVzY3JpcHRvcnNba10uYm9yZGVyQ29sb3IgfHwgZGVzY3JpcHRvcnNba10uYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQ29sb3JzRGVmaW5pdGlvbihcbiAgZGVzY3JpcHRvcjogQ29sb3JzRGVzY3JpcHRvclxuKSB7XG4gIHJldHVybiBkZXNjcmlwdG9yICYmIChkZXNjcmlwdG9yLmJvcmRlckNvbG9yIHx8IGRlc2NyaXB0b3IuYmFja2dyb3VuZENvbG9yKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2NvbG9ycycsXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGZvcmNlT3ZlcnJpZGU6IGZhbHNlXG4gIH0gYXMgQ29sb3JzUGx1Z2luT3B0aW9ucyxcblxuICBiZWZvcmVMYXlvdXQoY2hhcnQ6IENoYXJ0LCBfYXJncywgb3B0aW9uczogQ29sb3JzUGx1Z2luT3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZGF0YToge2RhdGFzZXRzfSxcbiAgICAgIG9wdGlvbnM6IGNoYXJ0T3B0aW9uc1xuICAgIH0gPSBjaGFydC5jb25maWc7XG4gICAgY29uc3Qge2VsZW1lbnRzfSA9IGNoYXJ0T3B0aW9ucztcblxuICAgIGlmICghb3B0aW9ucy5mb3JjZU92ZXJyaWRlICYmIChjb250YWluc0NvbG9yc0RlZmluaXRpb25zKGRhdGFzZXRzKSB8fCBjb250YWluc0NvbG9yc0RlZmluaXRpb24oY2hhcnRPcHRpb25zKSB8fCAoZWxlbWVudHMgJiYgY29udGFpbnNDb2xvcnNEZWZpbml0aW9ucyhlbGVtZW50cykpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yaXplciA9IGdldENvbG9yaXplcihjaGFydCk7XG5cbiAgICBkYXRhc2V0cy5mb3JFYWNoKGNvbG9yaXplcik7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtfbGltaXRWYWx1ZSwgX2xvb2t1cEJ5S2V5LCBpc051bGxPclVuZGVmLCByZXNvbHZlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuZnVuY3Rpb24gbHR0YkRlY2ltYXRpb24oZGF0YSwgc3RhcnQsIGNvdW50LCBhdmFpbGFibGVXaWR0aCwgb3B0aW9ucykge1xuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIExhcmdlc3QgVHJpYW5nbGUgVGhyZWUgQnVja2V0cyBhbGdvcml0aG0uXG4gICAqXG4gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGJ5IFN2ZWlubiBTdGVpbmFyc3NvblxuICAgKiBpbiBodHRwczovL2dpdGh1Yi5jb20vc3ZlaW5uLXN0ZWluYXJzc29uL2Zsb3QtZG93bnNhbXBsZS9ibG9iL21hc3Rlci9qcXVlcnkuZmxvdC5kb3duc2FtcGxlLmpzXG4gICAqXG4gICAqIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBpcyBNSVQgbGljZW5zZWQuXG4gICAqL1xuICBjb25zdCBzYW1wbGVzID0gb3B0aW9ucy5zYW1wbGVzIHx8IGF2YWlsYWJsZVdpZHRoO1xuICAvLyBUaGVyZSBhcmUgbGVzcyBwb2ludHMgdGhhbiB0aGUgdGhyZXNob2xkLCByZXR1cm5pbmcgdGhlIHdob2xlIGFycmF5XG4gIGlmIChzYW1wbGVzID49IGNvdW50KSB7XG4gICAgcmV0dXJuIGRhdGEuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgY291bnQpO1xuICB9XG5cbiAgY29uc3QgZGVjaW1hdGVkID0gW107XG5cbiAgY29uc3QgYnVja2V0V2lkdGggPSAoY291bnQgLSAyKSAvIChzYW1wbGVzIC0gMik7XG4gIGxldCBzYW1wbGVkSW5kZXggPSAwO1xuICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0ICsgY291bnQgLSAxO1xuICAvLyBTdGFydGluZyBmcm9tIG9mZnNldFxuICBsZXQgYSA9IHN0YXJ0O1xuICBsZXQgaSwgbWF4QXJlYVBvaW50LCBtYXhBcmVhLCBhcmVhLCBuZXh0QTtcblxuICBkZWNpbWF0ZWRbc2FtcGxlZEluZGV4KytdID0gZGF0YVthXTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlcyAtIDI7IGkrKykge1xuICAgIGxldCBhdmdYID0gMDtcbiAgICBsZXQgYXZnWSA9IDA7XG4gICAgbGV0IGo7XG5cbiAgICAvLyBBZGRpbmcgb2Zmc2V0XG4gICAgY29uc3QgYXZnUmFuZ2VTdGFydCA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIGJ1Y2tldFdpZHRoKSArIDEgKyBzdGFydDtcbiAgICBjb25zdCBhdmdSYW5nZUVuZCA9IE1hdGgubWluKE1hdGguZmxvb3IoKGkgKyAyKSAqIGJ1Y2tldFdpZHRoKSArIDEsIGNvdW50KSArIHN0YXJ0O1xuICAgIGNvbnN0IGF2Z1JhbmdlTGVuZ3RoID0gYXZnUmFuZ2VFbmQgLSBhdmdSYW5nZVN0YXJ0O1xuXG4gICAgZm9yIChqID0gYXZnUmFuZ2VTdGFydDsgaiA8IGF2Z1JhbmdlRW5kOyBqKyspIHtcbiAgICAgIGF2Z1ggKz0gZGF0YVtqXS54O1xuICAgICAgYXZnWSArPSBkYXRhW2pdLnk7XG4gICAgfVxuXG4gICAgYXZnWCAvPSBhdmdSYW5nZUxlbmd0aDtcbiAgICBhdmdZIC89IGF2Z1JhbmdlTGVuZ3RoO1xuXG4gICAgLy8gQWRkaW5nIG9mZnNldFxuICAgIGNvbnN0IHJhbmdlT2ZmcyA9IE1hdGguZmxvb3IoaSAqIGJ1Y2tldFdpZHRoKSArIDEgKyBzdGFydDtcbiAgICBjb25zdCByYW5nZVRvID0gTWF0aC5taW4oTWF0aC5mbG9vcigoaSArIDEpICogYnVja2V0V2lkdGgpICsgMSwgY291bnQpICsgc3RhcnQ7XG4gICAgY29uc3Qge3g6IHBvaW50QXgsIHk6IHBvaW50QXl9ID0gZGF0YVthXTtcblxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIGNoYW5nZWQgZnJvbSB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHdoaWNoIGluaXRpYWxpemVzIHRoZXNlXG4gICAgLy8gdmFsdWVzIHRvIDEuIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRoYXQgaWYgdGhlIGFyZWEgaXMgc21hbGwsIG5leHRBXG4gICAgLy8gd291bGQgbmV2ZXIgYmUgc2V0IGFuZCB0aHVzIGEgY3Jhc2ggd291bGQgb2NjdXIgaW4gdGhlIG5leHQgbG9vcCBhcyBgYWAgd291bGQgYmVjb21lXG4gICAgLy8gYHVuZGVmaW5lZGAuIFNpbmNlIHRoZSBhcmVhIGlzIGFsd2F5cyBwb3NpdGl2ZSwgYnV0IGNvdWxkIGJlIDAgaW4gdGhlIGNhc2Ugb2YgYSBmbGF0IHRyYWNlLFxuICAgIC8vIGluaXRpYWxpemluZyB3aXRoIGEgbmVnYXRpdmUgbnVtYmVyIGlzIHRoZSBjb3JyZWN0IHNvbHV0aW9uLlxuICAgIG1heEFyZWEgPSBhcmVhID0gLTE7XG5cbiAgICBmb3IgKGogPSByYW5nZU9mZnM7IGogPCByYW5nZVRvOyBqKyspIHtcbiAgICAgIGFyZWEgPSAwLjUgKiBNYXRoLmFicyhcbiAgICAgICAgKHBvaW50QXggLSBhdmdYKSAqIChkYXRhW2pdLnkgLSBwb2ludEF5KSAtXG4gICAgICAgIChwb2ludEF4IC0gZGF0YVtqXS54KSAqIChhdmdZIC0gcG9pbnRBeSlcbiAgICAgICk7XG5cbiAgICAgIGlmIChhcmVhID4gbWF4QXJlYSkge1xuICAgICAgICBtYXhBcmVhID0gYXJlYTtcbiAgICAgICAgbWF4QXJlYVBvaW50ID0gZGF0YVtqXTtcbiAgICAgICAgbmV4dEEgPSBqO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlY2ltYXRlZFtzYW1wbGVkSW5kZXgrK10gPSBtYXhBcmVhUG9pbnQ7XG4gICAgYSA9IG5leHRBO1xuICB9XG5cbiAgLy8gSW5jbHVkZSB0aGUgbGFzdCBwb2ludFxuICBkZWNpbWF0ZWRbc2FtcGxlZEluZGV4KytdID0gZGF0YVtlbmRJbmRleF07XG5cbiAgcmV0dXJuIGRlY2ltYXRlZDtcbn1cblxuZnVuY3Rpb24gbWluTWF4RGVjaW1hdGlvbihkYXRhLCBzdGFydCwgY291bnQsIGF2YWlsYWJsZVdpZHRoKSB7XG4gIGxldCBhdmdYID0gMDtcbiAgbGV0IGNvdW50WCA9IDA7XG4gIGxldCBpLCBwb2ludCwgeCwgeSwgcHJldlgsIG1pbkluZGV4LCBtYXhJbmRleCwgc3RhcnRJbmRleCwgbWluWSwgbWF4WTtcbiAgY29uc3QgZGVjaW1hdGVkID0gW107XG4gIGNvbnN0IGVuZEluZGV4ID0gc3RhcnQgKyBjb3VudCAtIDE7XG5cbiAgY29uc3QgeE1pbiA9IGRhdGFbc3RhcnRdLng7XG4gIGNvbnN0IHhNYXggPSBkYXRhW2VuZEluZGV4XS54O1xuICBjb25zdCBkeCA9IHhNYXggLSB4TWluO1xuXG4gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7XG4gICAgcG9pbnQgPSBkYXRhW2ldO1xuICAgIHggPSAocG9pbnQueCAtIHhNaW4pIC8gZHggKiBhdmFpbGFibGVXaWR0aDtcbiAgICB5ID0gcG9pbnQueTtcbiAgICBjb25zdCB0cnVuY1ggPSB4IHwgMDtcblxuICAgIGlmICh0cnVuY1ggPT09IHByZXZYKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgYG1pbllgIC8gYG1heFlgIGFuZCBgYXZnWGAgd2hpbGUgd2Ugc3RheSB3aXRoaW4gc2FtZSB4LXBvc2l0aW9uXG4gICAgICBpZiAoeSA8IG1pblkpIHtcbiAgICAgICAgbWluWSA9IHk7XG4gICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoeSA+IG1heFkpIHtcbiAgICAgICAgbWF4WSA9IHk7XG4gICAgICAgIG1heEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBmaXJzdCBwb2ludCBpbiBncm91cCwgY291bnRYIGlzIGAwYCwgc28gYXZlcmFnZSB3aWxsIGJlIGB4YCAvIDEuXG4gICAgICAvLyBVc2UgcG9pbnQueCBoZXJlIGJlY2F1c2Ugd2UncmUgY29tcHV0aW5nIHRoZSBhdmVyYWdlIGRhdGEgYHhgIHZhbHVlXG4gICAgICBhdmdYID0gKGNvdW50WCAqIGF2Z1ggKyBwb2ludC54KSAvICsrY291bnRYO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQdXNoIHVwIHRvIDQgcG9pbnRzLCAzIGZvciB0aGUgbGFzdCBpbnRlcnZhbCBhbmQgdGhlIGZpcnN0IHBvaW50IGZvciB0aGlzIGludGVydmFsXG4gICAgICBjb25zdCBsYXN0SW5kZXggPSBpIC0gMTtcblxuICAgICAgaWYgKCFpc051bGxPclVuZGVmKG1pbkluZGV4KSAmJiAhaXNOdWxsT3JVbmRlZihtYXhJbmRleCkpIHtcbiAgICAgICAgLy8gVGhlIGludGVydmFsIGlzIGRlZmluZWQgYnkgNCBwb2ludHM6IHN0YXJ0LCBtaW4sIG1heCwgZW5kLlxuICAgICAgICAvLyBUaGUgc3RhcnRpbmcgcG9pbnQgaXMgYWxyZWFkeSBjb25zaWRlcmVkIGF0IHRoaXMgcG9pbnQsIHNvIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoaWNoXG4gICAgICAgIC8vIG9mIHRoZSBvdGhlciBwb2ludHMgdG8gYWRkLiBXZSBuZWVkIHRvIHNvcnQgdGhlc2UgcG9pbnRzIHRvIGVuc3VyZSB0aGUgZGVjaW1hdGVkIGRhdGFcbiAgICAgICAgLy8gaXMgc3RpbGwgc29ydGVkIGFuZCB0aGVuIGVuc3VyZSB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcy5cbiAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXgxID0gTWF0aC5taW4obWluSW5kZXgsIG1heEluZGV4KTtcbiAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSW5kZXgyID0gTWF0aC5tYXgobWluSW5kZXgsIG1heEluZGV4KTtcblxuICAgICAgICBpZiAoaW50ZXJtZWRpYXRlSW5kZXgxICE9PSBzdGFydEluZGV4ICYmIGludGVybWVkaWF0ZUluZGV4MSAhPT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgZGVjaW1hdGVkLnB1c2goe1xuICAgICAgICAgICAgLi4uZGF0YVtpbnRlcm1lZGlhdGVJbmRleDFdLFxuICAgICAgICAgICAgeDogYXZnWCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJtZWRpYXRlSW5kZXgyICE9PSBzdGFydEluZGV4ICYmIGludGVybWVkaWF0ZUluZGV4MiAhPT0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgZGVjaW1hdGVkLnB1c2goe1xuICAgICAgICAgICAgLi4uZGF0YVtpbnRlcm1lZGlhdGVJbmRleDJdLFxuICAgICAgICAgICAgeDogYXZnWFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxhc3RJbmRleCA9PT0gc3RhcnRJbmRleCB3aWxsIG9jY3VyIHdoZW4gYSByYW5nZSBoYXMgb25seSAxIHBvaW50IHdoaWNoIGNvdWxkXG4gICAgICAvLyBoYXBwZW4gd2l0aCB2ZXJ5IHVuZXZlbiBkYXRhXG4gICAgICBpZiAoaSA+IDAgJiYgbGFzdEluZGV4ICE9PSBzdGFydEluZGV4KSB7XG4gICAgICAgIC8vIExhc3QgcG9pbnQgaW4gdGhlIHByZXZpb3VzIGludGVydmFsXG4gICAgICAgIGRlY2ltYXRlZC5wdXNoKGRhdGFbbGFzdEluZGV4XSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IG9mIHRoZSBuZXcgaW50ZXJ2YWxcbiAgICAgIGRlY2ltYXRlZC5wdXNoKHBvaW50KTtcbiAgICAgIHByZXZYID0gdHJ1bmNYO1xuICAgICAgY291bnRYID0gMDtcbiAgICAgIG1pblkgPSBtYXhZID0geTtcbiAgICAgIG1pbkluZGV4ID0gbWF4SW5kZXggPSBzdGFydEluZGV4ID0gaTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVjaW1hdGVkO1xufVxuXG5mdW5jdGlvbiBjbGVhbkRlY2ltYXRlZERhdGFzZXQoZGF0YXNldCkge1xuICBpZiAoZGF0YXNldC5fZGVjaW1hdGVkKSB7XG4gICAgY29uc3QgZGF0YSA9IGRhdGFzZXQuX2RhdGE7XG4gICAgZGVsZXRlIGRhdGFzZXQuX2RlY2ltYXRlZDtcbiAgICBkZWxldGUgZGF0YXNldC5fZGF0YTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YXNldCwgJ2RhdGEnLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZGF0YSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhbkRlY2ltYXRlZERhdGEoY2hhcnQpIHtcbiAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0KSA9PiB7XG4gICAgY2xlYW5EZWNpbWF0ZWREYXRhc2V0KGRhdGFzZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50c1NpbXBsaWZpZWQobWV0YSwgcG9pbnRzKSB7XG4gIGNvbnN0IHBvaW50Q291bnQgPSBwb2ludHMubGVuZ3RoO1xuXG4gIGxldCBzdGFydCA9IDA7XG4gIGxldCBjb3VudDtcblxuICBjb25zdCB7aVNjYWxlfSA9IG1ldGE7XG4gIGNvbnN0IHttaW4sIG1heCwgbWluRGVmaW5lZCwgbWF4RGVmaW5lZH0gPSBpU2NhbGUuZ2V0VXNlckJvdW5kcygpO1xuXG4gIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgc3RhcnQgPSBfbGltaXRWYWx1ZShfbG9va3VwQnlLZXkocG9pbnRzLCBpU2NhbGUuYXhpcywgbWluKS5sbywgMCwgcG9pbnRDb3VudCAtIDEpO1xuICB9XG4gIGlmIChtYXhEZWZpbmVkKSB7XG4gICAgY291bnQgPSBfbGltaXRWYWx1ZShfbG9va3VwQnlLZXkocG9pbnRzLCBpU2NhbGUuYXhpcywgbWF4KS5oaSArIDEsIHN0YXJ0LCBwb2ludENvdW50KSAtIHN0YXJ0O1xuICB9IGVsc2Uge1xuICAgIGNvdW50ID0gcG9pbnRDb3VudCAtIHN0YXJ0O1xuICB9XG5cbiAgcmV0dXJuIHtzdGFydCwgY291bnR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAnZGVjaW1hdGlvbicsXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBhbGdvcml0aG06ICdtaW4tbWF4JyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgfSxcblxuICBiZWZvcmVFbGVtZW50c1VwZGF0ZTogKGNoYXJ0LCBhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKCFvcHRpb25zLmVuYWJsZWQpIHtcbiAgICAgIC8vIFRoZSBkZWNpbWF0aW9uIHBsdWdpbiBtYXkgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZW5hYmxlZC4gTmVlZCB0byByZW1vdmUgb2xkIGBkYXRhc2V0Ll9kYXRhYCBoYW5kbGVyc1xuICAgICAgY2xlYW5EZWNpbWF0ZWREYXRhKGNoYXJ0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBc3N1bWUgdGhlIGVudGlyZSBjaGFydCBpcyBhdmFpbGFibGUgdG8gc2hvdyBhIGZldyBtb3JlIHBvaW50cyB0aGFuIG5lZWRlZFxuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gY2hhcnQud2lkdGg7XG5cbiAgICBjaGFydC5kYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkgPT4ge1xuICAgICAgY29uc3Qge19kYXRhLCBpbmRleEF4aXN9ID0gZGF0YXNldDtcbiAgICAgIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuICAgICAgY29uc3QgZGF0YSA9IF9kYXRhIHx8IGRhdGFzZXQuZGF0YTtcblxuICAgICAgaWYgKHJlc29sdmUoW2luZGV4QXhpcywgY2hhcnQub3B0aW9ucy5pbmRleEF4aXNdKSA9PT0gJ3knKSB7XG4gICAgICAgIC8vIERlY2ltYXRpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIGxpbmVzIHRoYXQgaGF2ZSBhbiBYIGluZGV4QXhpc1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghbWV0YS5jb250cm9sbGVyLnN1cHBvcnRzRGVjaW1hdGlvbikge1xuICAgICAgICAvLyBPbmx5IGxpbmUgZGF0YXNldHMgYXJlIHN1cHBvcnRlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHhBeGlzID0gY2hhcnQuc2NhbGVzW21ldGEueEF4aXNJRF07XG4gICAgICBpZiAoeEF4aXMudHlwZSAhPT0gJ2xpbmVhcicgJiYgeEF4aXMudHlwZSAhPT0gJ3RpbWUnKSB7XG4gICAgICAgIC8vIE9ubHkgbGluZWFyIGludGVycG9sYXRpb24gaXMgc3VwcG9ydGVkXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXJ0Lm9wdGlvbnMucGFyc2luZykge1xuICAgICAgICAvLyBQbHVnaW4gb25seSBzdXBwb3J0cyBkYXRhIHRoYXQgZG9lcyBub3QgbmVlZCBwYXJzaW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHtzdGFydCwgY291bnR9ID0gZ2V0U3RhcnRBbmRDb3VudE9mVmlzaWJsZVBvaW50c1NpbXBsaWZpZWQobWV0YSwgZGF0YSk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSBvcHRpb25zLnRocmVzaG9sZCB8fCA0ICogYXZhaWxhYmxlV2lkdGg7XG4gICAgICBpZiAoY291bnQgPD0gdGhyZXNob2xkKSB7XG4gICAgICAgIC8vIE5vIGRlY2ltYXRpb24gaXMgcmVxdWlyZWQgdW50aWwgd2UgYXJlIGFib3ZlIHRoaXMgdGhyZXNob2xkXG4gICAgICAgIGNsZWFuRGVjaW1hdGVkRGF0YXNldChkYXRhc2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOdWxsT3JVbmRlZihfZGF0YSkpIHtcbiAgICAgICAgLy8gRmlyc3QgdGltZSB3ZSBhcmUgc2VlaW5nIHRoaXMgZGF0YXNldFxuICAgICAgICAvLyBXZSBvdmVycmlkZSB0aGUgJ2RhdGEnIHByb3BlcnR5IHdpdGggYSBzZXR0ZXIgdGhhdCBzdG9yZXMgdGhlXG4gICAgICAgIC8vIHJhdyBkYXRhIGluIF9kYXRhLCBidXQgcmVhZHMgdGhlIGRlY2ltYXRlZCBkYXRhIGZyb20gX2RlY2ltYXRlZFxuICAgICAgICBkYXRhc2V0Ll9kYXRhID0gZGF0YTtcbiAgICAgICAgZGVsZXRlIGRhdGFzZXQuZGF0YTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGFzZXQsICdkYXRhJywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVjaW1hdGVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhID0gZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBQb2ludCB0aGUgY2hhcnQgdG8gdGhlIGRlY2ltYXRlZCBkYXRhXG4gICAgICBsZXQgZGVjaW1hdGVkO1xuICAgICAgc3dpdGNoIChvcHRpb25zLmFsZ29yaXRobSkge1xuICAgICAgY2FzZSAnbHR0Yic6XG4gICAgICAgIGRlY2ltYXRlZCA9IGx0dGJEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbi1tYXgnOlxuICAgICAgICBkZWNpbWF0ZWQgPSBtaW5NYXhEZWNpbWF0aW9uKGRhdGEsIHN0YXJ0LCBjb3VudCwgYXZhaWxhYmxlV2lkdGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVjaW1hdGlvbiBhbGdvcml0aG0gJyR7b3B0aW9ucy5hbGdvcml0aG19J2ApO1xuICAgICAgfVxuXG4gICAgICBkYXRhc2V0Ll9kZWNpbWF0ZWQgPSBkZWNpbWF0ZWQ7XG4gICAgfSk7XG4gIH0sXG5cbiAgZGVzdHJveShjaGFydCkge1xuICAgIGNsZWFuRGVjaW1hdGVkRGF0YShjaGFydCk7XG4gIH1cbn07XG4iLCAiaW1wb3J0IHtfYm91bmRTZWdtZW50LCBfYm91bmRTZWdtZW50cywgX25vcm1hbGl6ZUFuZ2xlfSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIF9zZWdtZW50cyhsaW5lLCB0YXJnZXQsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgY29uc3QgcG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IHRwb2ludHMgPSB0YXJnZXQucG9pbnRzO1xuICBjb25zdCBwYXJ0cyA9IFtdO1xuXG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cykge1xuICAgIGxldCB7c3RhcnQsIGVuZH0gPSBzZWdtZW50O1xuICAgIGVuZCA9IF9maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBwb2ludHMpO1xuXG4gICAgY29uc3QgYm91bmRzID0gX2dldEJvdW5kcyhwcm9wZXJ0eSwgcG9pbnRzW3N0YXJ0XSwgcG9pbnRzW2VuZF0sIHNlZ21lbnQubG9vcCk7XG5cbiAgICBpZiAoIXRhcmdldC5zZWdtZW50cykge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBib3VuZGFyeSBub3Qgc3VwcG9ydGluZyBgc2VnbWVudHNgIChzaW1wbGVBcmMpXG4gICAgICAvLyBCb3VuZHMgYXJlIHByb3ZpZGVkIGFzIGB0YXJnZXRgIGZvciBwYXJ0aWFsIGNpcmNsZSwgb3IgdW5kZWZpbmVkIGZvciBmdWxsIGNpcmNsZVxuICAgICAgcGFydHMucHVzaCh7XG4gICAgICAgIHNvdXJjZTogc2VnbWVudCxcbiAgICAgICAgdGFyZ2V0OiBib3VuZHMsXG4gICAgICAgIHN0YXJ0OiBwb2ludHNbc3RhcnRdLFxuICAgICAgICBlbmQ6IHBvaW50c1tlbmRdXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBhbGwgc2VnbWVudHMgZnJvbSBgdGFyZ2V0YCB0aGF0IGludGVyc2VjdCB0aGUgYm91bmRzIG9mIGN1cnJlbnQgc2VnbWVudCBvZiBgbGluZWBcbiAgICBjb25zdCB0YXJnZXRTZWdtZW50cyA9IF9ib3VuZFNlZ21lbnRzKHRhcmdldCwgYm91bmRzKTtcblxuICAgIGZvciAoY29uc3QgdGd0IG9mIHRhcmdldFNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBzdWJCb3VuZHMgPSBfZ2V0Qm91bmRzKHByb3BlcnR5LCB0cG9pbnRzW3RndC5zdGFydF0sIHRwb2ludHNbdGd0LmVuZF0sIHRndC5sb29wKTtcbiAgICAgIGNvbnN0IGZpbGxTb3VyY2VzID0gX2JvdW5kU2VnbWVudChzZWdtZW50LCBwb2ludHMsIHN1YkJvdW5kcyk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsbFNvdXJjZSBvZiBmaWxsU291cmNlcykge1xuICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICBzb3VyY2U6IGZpbGxTb3VyY2UsXG4gICAgICAgICAgdGFyZ2V0OiB0Z3QsXG4gICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgIFtwcm9wZXJ0eV06IF9nZXRFZGdlKGJvdW5kcywgc3ViQm91bmRzLCAnc3RhcnQnLCBNYXRoLm1heClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgW3Byb3BlcnR5XTogX2dldEVkZ2UoYm91bmRzLCBzdWJCb3VuZHMsICdlbmQnLCBNYXRoLm1pbilcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0Qm91bmRzKHByb3BlcnR5LCBmaXJzdCwgbGFzdCwgbG9vcCkge1xuICBpZiAobG9vcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgc3RhcnQgPSBmaXJzdFtwcm9wZXJ0eV07XG4gIGxldCBlbmQgPSBsYXN0W3Byb3BlcnR5XTtcblxuICBpZiAocHJvcGVydHkgPT09ICdhbmdsZScpIHtcbiAgICBzdGFydCA9IF9ub3JtYWxpemVBbmdsZShzdGFydCk7XG4gICAgZW5kID0gX25vcm1hbGl6ZUFuZ2xlKGVuZCk7XG4gIH1cbiAgcmV0dXJuIHtwcm9wZXJ0eSwgc3RhcnQsIGVuZH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcG9pbnRzRnJvbVNlZ21lbnRzKGJvdW5kYXJ5LCBsaW5lKSB7XG4gIGNvbnN0IHt4ID0gbnVsbCwgeSA9IG51bGx9ID0gYm91bmRhcnkgfHwge307XG4gIGNvbnN0IGxpbmVQb2ludHMgPSBsaW5lLnBvaW50cztcbiAgY29uc3QgcG9pbnRzID0gW107XG4gIGxpbmUuc2VnbWVudHMuZm9yRWFjaCgoe3N0YXJ0LCBlbmR9KSA9PiB7XG4gICAgZW5kID0gX2ZpbmRTZWdtZW50RW5kKHN0YXJ0LCBlbmQsIGxpbmVQb2ludHMpO1xuICAgIGNvbnN0IGZpcnN0ID0gbGluZVBvaW50c1tzdGFydF07XG4gICAgY29uc3QgbGFzdCA9IGxpbmVQb2ludHNbZW5kXTtcbiAgICBpZiAoeSAhPT0gbnVsbCkge1xuICAgICAgcG9pbnRzLnB1c2goe3g6IGZpcnN0LngsIHl9KTtcbiAgICAgIHBvaW50cy5wdXNoKHt4OiBsYXN0LngsIHl9KTtcbiAgICB9IGVsc2UgaWYgKHggIT09IG51bGwpIHtcbiAgICAgIHBvaW50cy5wdXNoKHt4LCB5OiBmaXJzdC55fSk7XG4gICAgICBwb2ludHMucHVzaCh7eCwgeTogbGFzdC55fSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHBvaW50cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9maW5kU2VnbWVudEVuZChzdGFydCwgZW5kLCBwb2ludHMpIHtcbiAgZm9yICg7ZW5kID4gc3RhcnQ7IGVuZC0tKSB7XG4gICAgY29uc3QgcG9pbnQgPSBwb2ludHNbZW5kXTtcbiAgICBpZiAoIWlzTmFOKHBvaW50LngpICYmICFpc05hTihwb2ludC55KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbmQ7XG59XG5cbmZ1bmN0aW9uIF9nZXRFZGdlKGEsIGIsIHByb3AsIGZuKSB7XG4gIGlmIChhICYmIGIpIHtcbiAgICByZXR1cm4gZm4oYVtwcm9wXSwgYltwcm9wXSk7XG4gIH1cbiAgcmV0dXJuIGEgPyBhW3Byb3BdIDogYiA/IGJbcHJvcF0gOiAwO1xufVxuIiwgIi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2NvcmUvY29yZS5jb250cm9sbGVyLmpzJykuZGVmYXVsdCB9IENoYXJ0XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vY29yZS9jb3JlLnNjYWxlLmpzJykuZGVmYXVsdCB9IFNjYWxlXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvZWxlbWVudC5wb2ludC5qcycpLmRlZmF1bHQgfSBQb2ludEVsZW1lbnRcbiAqL1xuXG5pbXBvcnQge0xpbmVFbGVtZW50fSBmcm9tICcuLi8uLi9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQge2lzQXJyYXl9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHtfcG9pbnRzRnJvbVNlZ21lbnRzfSBmcm9tICcuL2ZpbGxlci5zZWdtZW50LmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge1BvaW50RWxlbWVudFtdIHwgeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfX0gYm91bmRhcnlcbiAqIEBwYXJhbSB7TGluZUVsZW1lbnR9IGxpbmVcbiAqIEByZXR1cm4ge0xpbmVFbGVtZW50P31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jcmVhdGVCb3VuZGFyeUxpbmUoYm91bmRhcnksIGxpbmUpIHtcbiAgbGV0IHBvaW50cyA9IFtdO1xuICBsZXQgX2xvb3AgPSBmYWxzZTtcblxuICBpZiAoaXNBcnJheShib3VuZGFyeSkpIHtcbiAgICBfbG9vcCA9IHRydWU7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHBvaW50cyA9IGJvdW5kYXJ5O1xuICB9IGVsc2Uge1xuICAgIHBvaW50cyA9IF9wb2ludHNGcm9tU2VnbWVudHMoYm91bmRhcnksIGxpbmUpO1xuICB9XG5cbiAgcmV0dXJuIHBvaW50cy5sZW5ndGggPyBuZXcgTGluZUVsZW1lbnQoe1xuICAgIHBvaW50cyxcbiAgICBvcHRpb25zOiB7dGVuc2lvbjogMH0sXG4gICAgX2xvb3AsXG4gICAgX2Z1bGxMb29wOiBfbG9vcFxuICB9KSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2hvdWxkQXBwbHlGaWxsKHNvdXJjZSkge1xuICByZXR1cm4gc291cmNlICYmIHNvdXJjZS5maWxsICE9PSBmYWxzZTtcbn1cbiIsICJpbXBvcnQge2lzT2JqZWN0LCBpc0Zpbml0ZSwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uLy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vY29yZS9jb3JlLnNjYWxlLmpzJykuZGVmYXVsdCB9IFNjYWxlXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvZWxlbWVudC5saW5lLmpzJykuZGVmYXVsdCB9IExpbmVFbGVtZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vLi4vdHlwZXMvaW5kZXguanMnKS5GaWxsVGFyZ2V0IH0gRmlsbFRhcmdldFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL3R5cGVzL2luZGV4LmpzJykuQ29tcGxleEZpbGxUYXJnZXQgfSBDb21wbGV4RmlsbFRhcmdldFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBfcmVzb2x2ZVRhcmdldChzb3VyY2VzLCBpbmRleCwgcHJvcGFnYXRlKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICBsZXQgZmlsbCA9IHNvdXJjZS5maWxsO1xuICBjb25zdCB2aXNpdGVkID0gW2luZGV4XTtcbiAgbGV0IHRhcmdldDtcblxuICBpZiAoIXByb3BhZ2F0ZSkge1xuICAgIHJldHVybiBmaWxsO1xuICB9XG5cbiAgd2hpbGUgKGZpbGwgIT09IGZhbHNlICYmIHZpc2l0ZWQuaW5kZXhPZihmaWxsKSA9PT0gLTEpIHtcbiAgICBpZiAoIWlzRmluaXRlKGZpbGwpKSB7XG4gICAgICByZXR1cm4gZmlsbDtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSBzb3VyY2VzW2ZpbGxdO1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC52aXNpYmxlKSB7XG4gICAgICByZXR1cm4gZmlsbDtcbiAgICB9XG5cbiAgICB2aXNpdGVkLnB1c2goZmlsbCk7XG4gICAgZmlsbCA9IHRhcmdldC5maWxsO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7TGluZUVsZW1lbnR9IGxpbmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZGVjb2RlRmlsbChsaW5lLCBpbmRleCwgY291bnQpIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB7dmFsdWU6IG51bWJlcn19ICovXG4gIGNvbnN0IGZpbGwgPSBwYXJzZUZpbGxPcHRpb24obGluZSk7XG5cbiAgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgcmV0dXJuIGlzTmFOKGZpbGwudmFsdWUpID8gZmFsc2UgOiBmaWxsO1xuICB9XG5cbiAgbGV0IHRhcmdldCA9IHBhcnNlRmxvYXQoZmlsbCk7XG5cbiAgaWYgKGlzRmluaXRlKHRhcmdldCkgJiYgTWF0aC5mbG9vcih0YXJnZXQpID09PSB0YXJnZXQpIHtcbiAgICByZXR1cm4gZGVjb2RlVGFyZ2V0SW5kZXgoZmlsbFswXSwgaW5kZXgsIHRhcmdldCwgY291bnQpO1xuICB9XG5cbiAgcmV0dXJuIFsnb3JpZ2luJywgJ3N0YXJ0JywgJ2VuZCcsICdzdGFjaycsICdzaGFwZSddLmluZGV4T2YoZmlsbCkgPj0gMCAmJiBmaWxsO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVUYXJnZXRJbmRleChmaXJzdENoLCBpbmRleCwgdGFyZ2V0LCBjb3VudCkge1xuICBpZiAoZmlyc3RDaCA9PT0gJy0nIHx8IGZpcnN0Q2ggPT09ICcrJykge1xuICAgIHRhcmdldCA9IGluZGV4ICsgdGFyZ2V0O1xuICB9XG5cbiAgaWYgKHRhcmdldCA9PT0gaW5kZXggfHwgdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gY291bnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RmlsbFRhcmdldCB8IENvbXBsZXhGaWxsVGFyZ2V0fSBmaWxsXG4gKiBAcGFyYW0ge1NjYWxlfSBzY2FsZVxuICogQHJldHVybnMge251bWJlciB8IG51bGx9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0VGFyZ2V0UGl4ZWwoZmlsbCwgc2NhbGUpIHtcbiAgbGV0IHBpeGVsID0gbnVsbDtcbiAgaWYgKGZpbGwgPT09ICdzdGFydCcpIHtcbiAgICBwaXhlbCA9IHNjYWxlLmJvdHRvbTtcbiAgfSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuICAgIHBpeGVsID0gc2NhbGUudG9wO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHBpeGVsID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShmaWxsLnZhbHVlKTtcbiAgfSBlbHNlIGlmIChzY2FsZS5nZXRCYXNlUGl4ZWwpIHtcbiAgICBwaXhlbCA9IHNjYWxlLmdldEJhc2VQaXhlbCgpO1xuICB9XG4gIHJldHVybiBwaXhlbDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0ZpbGxUYXJnZXQgfCBDb21wbGV4RmlsbFRhcmdldH0gZmlsbFxuICogQHBhcmFtIHtTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFZhbHVlXG4gKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldFRhcmdldFZhbHVlKGZpbGwsIHNjYWxlLCBzdGFydFZhbHVlKSB7XG4gIGxldCB2YWx1ZTtcblxuICBpZiAoZmlsbCA9PT0gJ3N0YXJ0Jykge1xuICAgIHZhbHVlID0gc3RhcnRWYWx1ZTtcbiAgfSBlbHNlIGlmIChmaWxsID09PSAnZW5kJykge1xuICAgIHZhbHVlID0gc2NhbGUub3B0aW9ucy5yZXZlcnNlID8gc2NhbGUubWluIDogc2NhbGUubWF4O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpbGwpKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZhbHVlID0gZmlsbC52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IHNjYWxlLmdldEJhc2VWYWx1ZSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0xpbmVFbGVtZW50fSBsaW5lXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRmlsbE9wdGlvbihsaW5lKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBsaW5lLm9wdGlvbnM7XG4gIGNvbnN0IGZpbGxPcHRpb24gPSBvcHRpb25zLmZpbGw7XG4gIGxldCBmaWxsID0gdmFsdWVPckRlZmF1bHQoZmlsbE9wdGlvbiAmJiBmaWxsT3B0aW9uLnRhcmdldCwgZmlsbE9wdGlvbik7XG5cbiAgaWYgKGZpbGwgPT09IHVuZGVmaW5lZCkge1xuICAgIGZpbGwgPSAhIW9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgaWYgKGZpbGwgPT09IGZhbHNlIHx8IGZpbGwgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoZmlsbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnb3JpZ2luJztcbiAgfVxuICByZXR1cm4gZmlsbDtcbn1cbiIsICIvKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi8uLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2NvcmUvY29yZS5zY2FsZS5qcycpLmRlZmF1bHQgfSBTY2FsZVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL2VsZW1lbnQucG9pbnQuanMnKS5kZWZhdWx0IH0gUG9pbnRFbGVtZW50XG4gKi9cblxuaW1wb3J0IHtMaW5lRWxlbWVudH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHtfaXNCZXR3ZWVufSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCB7X2NyZWF0ZUJvdW5kYXJ5TGluZX0gZnJvbSAnLi9maWxsZXIuaGVscGVyLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3sgY2hhcnQ6IENoYXJ0OyBzY2FsZTogU2NhbGU7IGluZGV4OiBudW1iZXI7IGxpbmU6IExpbmVFbGVtZW50OyB9fSBzb3VyY2VcbiAqIEByZXR1cm4ge0xpbmVFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2J1aWxkU3RhY2tMaW5lKHNvdXJjZSkge1xuICBjb25zdCB7c2NhbGUsIGluZGV4LCBsaW5lfSA9IHNvdXJjZTtcbiAgY29uc3QgcG9pbnRzID0gW107XG4gIGNvbnN0IHNlZ21lbnRzID0gbGluZS5zZWdtZW50cztcbiAgY29uc3Qgc291cmNlUG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGNvbnN0IGxpbmVzQmVsb3cgPSBnZXRMaW5lc0JlbG93KHNjYWxlLCBpbmRleCk7XG4gIGxpbmVzQmVsb3cucHVzaChfY3JlYXRlQm91bmRhcnlMaW5lKHt4OiBudWxsLCB5OiBzY2FsZS5ib3R0b219LCBsaW5lKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICBmb3IgKGxldCBqID0gc2VnbWVudC5zdGFydDsgaiA8PSBzZWdtZW50LmVuZDsgaisrKSB7XG4gICAgICBhZGRQb2ludHNCZWxvdyhwb2ludHMsIHNvdXJjZVBvaW50c1tqXSwgbGluZXNCZWxvdyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgTGluZUVsZW1lbnQoe3BvaW50cywgb3B0aW9uczoge319KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1NjYWxlfSBzY2FsZVxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJuIHtMaW5lRWxlbWVudFtdfVxuICovXG5mdW5jdGlvbiBnZXRMaW5lc0JlbG93KHNjYWxlLCBpbmRleCkge1xuICBjb25zdCBiZWxvdyA9IFtdO1xuICBjb25zdCBtZXRhcyA9IHNjYWxlLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCdsaW5lJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1ldGEgPSBtZXRhc1tpXTtcbiAgICBpZiAobWV0YS5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoIW1ldGEuaGlkZGVuKSB7XG4gICAgICBiZWxvdy51bnNoaWZ0KG1ldGEuZGF0YXNldCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZWxvdztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1BvaW50RWxlbWVudFtdfSBwb2ludHNcbiAqIEBwYXJhbSB7UG9pbnRFbGVtZW50fSBzb3VyY2VQb2ludFxuICogQHBhcmFtIHtMaW5lRWxlbWVudFtdfSBsaW5lc0JlbG93XG4gKi9cbmZ1bmN0aW9uIGFkZFBvaW50c0JlbG93KHBvaW50cywgc291cmNlUG9pbnQsIGxpbmVzQmVsb3cpIHtcbiAgY29uc3QgcG9zdHBvbmVkID0gW107XG4gIGZvciAobGV0IGogPSAwOyBqIDwgbGluZXNCZWxvdy5sZW5ndGg7IGorKykge1xuICAgIGNvbnN0IGxpbmUgPSBsaW5lc0JlbG93W2pdO1xuICAgIGNvbnN0IHtmaXJzdCwgbGFzdCwgcG9pbnR9ID0gZmluZFBvaW50KGxpbmUsIHNvdXJjZVBvaW50LCAneCcpO1xuXG4gICAgaWYgKCFwb2ludCB8fCAoZmlyc3QgJiYgbGFzdCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIC8vIEZpcnN0IHBvaW50IG9mIGFuIHNlZ21lbnQgLT4gbmVlZCB0byBhZGQgYW5vdGhlciBwb2ludCBiZWZvcmUgdGhpcyxcbiAgICAgIC8vIGZyb20gbmV4dCBsaW5lIGJlbG93LlxuICAgICAgcG9zdHBvbmVkLnVuc2hpZnQocG9pbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb2ludHMucHVzaChwb2ludCk7XG4gICAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiBzZWdtZW50LCBubyBuZWVkIHRvIGFkZCBtb3JlIHBvaW50cy5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBvaW50cy5wdXNoKC4uLnBvc3Rwb25lZCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtMaW5lRWxlbWVudH0gbGluZVxuICogQHBhcmFtIHtQb2ludEVsZW1lbnR9IHNvdXJjZVBvaW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlcbiAqIEByZXR1cm5zIHt7cG9pbnQ/OiBQb2ludEVsZW1lbnQsIGZpcnN0PzogYm9vbGVhbiwgbGFzdD86IGJvb2xlYW59fVxuICovXG5mdW5jdGlvbiBmaW5kUG9pbnQobGluZSwgc291cmNlUG9pbnQsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHBvaW50ID0gbGluZS5pbnRlcnBvbGF0ZShzb3VyY2VQb2ludCwgcHJvcGVydHkpO1xuICBpZiAoIXBvaW50KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgcG9pbnRWYWx1ZSA9IHBvaW50W3Byb3BlcnR5XTtcbiAgY29uc3Qgc2VnbWVudHMgPSBsaW5lLnNlZ21lbnRzO1xuICBjb25zdCBsaW5lUG9pbnRzID0gbGluZS5wb2ludHM7XG4gIGxldCBmaXJzdCA9IGZhbHNlO1xuICBsZXQgbGFzdCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBsaW5lUG9pbnRzW3NlZ21lbnQuc3RhcnRdW3Byb3BlcnR5XTtcbiAgICBjb25zdCBsYXN0VmFsdWUgPSBsaW5lUG9pbnRzW3NlZ21lbnQuZW5kXVtwcm9wZXJ0eV07XG4gICAgaWYgKF9pc0JldHdlZW4ocG9pbnRWYWx1ZSwgZmlyc3RWYWx1ZSwgbGFzdFZhbHVlKSkge1xuICAgICAgZmlyc3QgPSBwb2ludFZhbHVlID09PSBmaXJzdFZhbHVlO1xuICAgICAgbGFzdCA9IHBvaW50VmFsdWUgPT09IGxhc3RWYWx1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge2ZpcnN0LCBsYXN0LCBwb2ludH07XG59XG4iLCAiaW1wb3J0IHtUQVV9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG4vLyBUT0RPOiB1c2UgZWxlbWVudHMuQXJjRWxlbWVudCBpbnN0ZWFkXG5leHBvcnQgY2xhc3Mgc2ltcGxlQXJjIHtcbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIHRoaXMueCA9IG9wdHMueDtcbiAgICB0aGlzLnkgPSBvcHRzLnk7XG4gICAgdGhpcy5yYWRpdXMgPSBvcHRzLnJhZGl1cztcbiAgfVxuXG4gIHBhdGhTZWdtZW50KGN0eCwgYm91bmRzLCBvcHRzKSB7XG4gICAgY29uc3Qge3gsIHksIHJhZGl1c30gPSB0aGlzO1xuICAgIGJvdW5kcyA9IGJvdW5kcyB8fCB7c3RhcnQ6IDAsIGVuZDogVEFVfTtcbiAgICBjdHguYXJjKHgsIHksIHJhZGl1cywgYm91bmRzLmVuZCwgYm91bmRzLnN0YXJ0LCB0cnVlKTtcbiAgICByZXR1cm4gIW9wdHMuYm91bmRzO1xuICB9XG5cbiAgaW50ZXJwb2xhdGUocG9pbnQpIHtcbiAgICBjb25zdCB7eCwgeSwgcmFkaXVzfSA9IHRoaXM7XG4gICAgY29uc3QgYW5nbGUgPSBwb2ludC5hbmdsZTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogeCArIE1hdGguY29zKGFuZ2xlKSAqIHJhZGl1cyxcbiAgICAgIHk6IHkgKyBNYXRoLnNpbihhbmdsZSkgKiByYWRpdXMsXG4gICAgICBhbmdsZVxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQge2lzRmluaXRlfSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LmpzJztcbmltcG9ydCB7X2NyZWF0ZUJvdW5kYXJ5TGluZX0gZnJvbSAnLi9maWxsZXIuaGVscGVyLmpzJztcbmltcG9ydCB7X2dldFRhcmdldFBpeGVsLCBfZ2V0VGFyZ2V0VmFsdWV9IGZyb20gJy4vZmlsbGVyLm9wdGlvbnMuanMnO1xuaW1wb3J0IHtfYnVpbGRTdGFja0xpbmV9IGZyb20gJy4vZmlsbGVyLnRhcmdldC5zdGFjay5qcyc7XG5pbXBvcnQge3NpbXBsZUFyY30gZnJvbSAnLi9zaW1wbGVBcmMuanMnO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi8uLi9jb3JlL2NvcmUuY29udHJvbGxlci5qcycpLmRlZmF1bHQgfSBDaGFydFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2NvcmUvY29yZS5zY2FsZS5qcycpLmRlZmF1bHQgfSBTY2FsZVxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL2VsZW1lbnQucG9pbnQuanMnKS5kZWZhdWx0IH0gUG9pbnRFbGVtZW50XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRUYXJnZXQoc291cmNlKSB7XG4gIGNvbnN0IHtjaGFydCwgZmlsbCwgbGluZX0gPSBzb3VyY2U7XG5cbiAgaWYgKGlzRmluaXRlKGZpbGwpKSB7XG4gICAgcmV0dXJuIGdldExpbmVCeUluZGV4KGNoYXJ0LCBmaWxsKTtcbiAgfVxuXG4gIGlmIChmaWxsID09PSAnc3RhY2snKSB7XG4gICAgcmV0dXJuIF9idWlsZFN0YWNrTGluZShzb3VyY2UpO1xuICB9XG5cbiAgaWYgKGZpbGwgPT09ICdzaGFwZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kYXJ5ID0gY29tcHV0ZUJvdW5kYXJ5KHNvdXJjZSk7XG5cbiAgaWYgKGJvdW5kYXJ5IGluc3RhbmNlb2Ygc2ltcGxlQXJjKSB7XG4gICAgcmV0dXJuIGJvdW5kYXJ5O1xuICB9XG5cbiAgcmV0dXJuIF9jcmVhdGVCb3VuZGFyeUxpbmUoYm91bmRhcnksIGxpbmUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuZnVuY3Rpb24gZ2V0TGluZUJ5SW5kZXgoY2hhcnQsIGluZGV4KSB7XG4gIGNvbnN0IG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpbmRleCk7XG4gIGNvbnN0IHZpc2libGUgPSBtZXRhICYmIGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaW5kZXgpO1xuICByZXR1cm4gdmlzaWJsZSA/IG1ldGEuZGF0YXNldCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVCb3VuZGFyeShzb3VyY2UpIHtcbiAgY29uc3Qgc2NhbGUgPSBzb3VyY2Uuc2NhbGUgfHwge307XG5cbiAgaWYgKHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSkge1xuICAgIHJldHVybiBjb21wdXRlQ2lyY3VsYXJCb3VuZGFyeShzb3VyY2UpO1xuICB9XG4gIHJldHVybiBjb21wdXRlTGluZWFyQm91bmRhcnkoc291cmNlKTtcbn1cblxuXG5mdW5jdGlvbiBjb21wdXRlTGluZWFyQm91bmRhcnkoc291cmNlKSB7XG4gIGNvbnN0IHtzY2FsZSA9IHt9LCBmaWxsfSA9IHNvdXJjZTtcbiAgY29uc3QgcGl4ZWwgPSBfZ2V0VGFyZ2V0UGl4ZWwoZmlsbCwgc2NhbGUpO1xuXG4gIGlmIChpc0Zpbml0ZShwaXhlbCkpIHtcbiAgICBjb25zdCBob3Jpem9udGFsID0gc2NhbGUuaXNIb3Jpem9udGFsKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogaG9yaXpvbnRhbCA/IHBpeGVsIDogbnVsbCxcbiAgICAgIHk6IGhvcml6b250YWwgPyBudWxsIDogcGl4ZWxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVDaXJjdWxhckJvdW5kYXJ5KHNvdXJjZSkge1xuICBjb25zdCB7c2NhbGUsIGZpbGx9ID0gc291cmNlO1xuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcbiAgY29uc3QgbGVuZ3RoID0gc2NhbGUuZ2V0TGFiZWxzKCkubGVuZ3RoO1xuICBjb25zdCBzdGFydCA9IG9wdGlvbnMucmV2ZXJzZSA/IHNjYWxlLm1heCA6IHNjYWxlLm1pbjtcbiAgY29uc3QgdmFsdWUgPSBfZ2V0VGFyZ2V0VmFsdWUoZmlsbCwgc2NhbGUsIHN0YXJ0KTtcbiAgY29uc3QgdGFyZ2V0ID0gW107XG5cbiAgaWYgKG9wdGlvbnMuZ3JpZC5jaXJjdWxhcikge1xuICAgIGNvbnN0IGNlbnRlciA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSgwLCBzdGFydCk7XG4gICAgcmV0dXJuIG5ldyBzaW1wbGVBcmMoe1xuICAgICAgeDogY2VudGVyLngsXG4gICAgICB5OiBjZW50ZXIueSxcbiAgICAgIHJhZGl1czogc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodmFsdWUpXG4gICAgfSk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdGFyZ2V0LnB1c2goc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGksIHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuIiwgImltcG9ydCB7Y2xpcEFyZWEsIHVuY2xpcEFyZWF9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5kZXguanMnO1xuaW1wb3J0IHtfZmluZFNlZ21lbnRFbmQsIF9nZXRCb3VuZHMsIF9zZWdtZW50c30gZnJvbSAnLi9maWxsZXIuc2VnbWVudC5qcyc7XG5pbXBvcnQge19nZXRUYXJnZXR9IGZyb20gJy4vZmlsbGVyLnRhcmdldC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZHJhd2ZpbGwoY3R4LCBzb3VyY2UsIGFyZWEpIHtcbiAgY29uc3QgdGFyZ2V0ID0gX2dldFRhcmdldChzb3VyY2UpO1xuICBjb25zdCB7bGluZSwgc2NhbGUsIGF4aXN9ID0gc291cmNlO1xuICBjb25zdCBsaW5lT3B0cyA9IGxpbmUub3B0aW9ucztcbiAgY29uc3QgZmlsbE9wdGlvbiA9IGxpbmVPcHRzLmZpbGw7XG4gIGNvbnN0IGNvbG9yID0gbGluZU9wdHMuYmFja2dyb3VuZENvbG9yO1xuICBjb25zdCB7YWJvdmUgPSBjb2xvciwgYmVsb3cgPSBjb2xvcn0gPSBmaWxsT3B0aW9uIHx8IHt9O1xuICBpZiAodGFyZ2V0ICYmIGxpbmUucG9pbnRzLmxlbmd0aCkge1xuICAgIGNsaXBBcmVhKGN0eCwgYXJlYSk7XG4gICAgZG9GaWxsKGN0eCwge2xpbmUsIHRhcmdldCwgYWJvdmUsIGJlbG93LCBhcmVhLCBzY2FsZSwgYXhpc30pO1xuICAgIHVuY2xpcEFyZWEoY3R4KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkb0ZpbGwoY3R4LCBjZmcpIHtcbiAgY29uc3Qge2xpbmUsIHRhcmdldCwgYWJvdmUsIGJlbG93LCBhcmVhLCBzY2FsZX0gPSBjZmc7XG4gIGNvbnN0IHByb3BlcnR5ID0gbGluZS5fbG9vcCA/ICdhbmdsZScgOiBjZmcuYXhpcztcblxuICBjdHguc2F2ZSgpO1xuXG4gIGlmIChwcm9wZXJ0eSA9PT0gJ3gnICYmIGJlbG93ICE9PSBhYm92ZSkge1xuICAgIGNsaXBWZXJ0aWNhbChjdHgsIHRhcmdldCwgYXJlYS50b3ApO1xuICAgIGZpbGwoY3R4LCB7bGluZSwgdGFyZ2V0LCBjb2xvcjogYWJvdmUsIHNjYWxlLCBwcm9wZXJ0eX0pO1xuICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgY3R4LnNhdmUoKTtcbiAgICBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGFyZWEuYm90dG9tKTtcbiAgfVxuICBmaWxsKGN0eCwge2xpbmUsIHRhcmdldCwgY29sb3I6IGJlbG93LCBzY2FsZSwgcHJvcGVydHl9KTtcblxuICBjdHgucmVzdG9yZSgpO1xufVxuXG5mdW5jdGlvbiBjbGlwVmVydGljYWwoY3R4LCB0YXJnZXQsIGNsaXBZKSB7XG4gIGNvbnN0IHtzZWdtZW50cywgcG9pbnRzfSA9IHRhcmdldDtcbiAgbGV0IGZpcnN0ID0gdHJ1ZTtcbiAgbGV0IGxpbmVMb29wID0gZmFsc2U7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBzZWdtZW50O1xuICAgIGNvbnN0IGZpcnN0UG9pbnQgPSBwb2ludHNbc3RhcnRdO1xuICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1tfZmluZFNlZ21lbnRFbmQoc3RhcnQsIGVuZCwgcG9pbnRzKV07XG4gICAgaWYgKGZpcnN0KSB7XG4gICAgICBjdHgubW92ZVRvKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55KTtcbiAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN0eC5saW5lVG8oZmlyc3RQb2ludC54LCBjbGlwWSk7XG4gICAgICBjdHgubGluZVRvKGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55KTtcbiAgICB9XG4gICAgbGluZUxvb3AgPSAhIXRhcmdldC5wYXRoU2VnbWVudChjdHgsIHNlZ21lbnQsIHttb3ZlOiBsaW5lTG9vcH0pO1xuICAgIGlmIChsaW5lTG9vcCkge1xuICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHgubGluZVRvKGxhc3RQb2ludC54LCBjbGlwWSk7XG4gICAgfVxuICB9XG5cbiAgY3R4LmxpbmVUbyh0YXJnZXQuZmlyc3QoKS54LCBjbGlwWSk7XG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmNsaXAoKTtcbn1cblxuZnVuY3Rpb24gZmlsbChjdHgsIGNmZykge1xuICBjb25zdCB7bGluZSwgdGFyZ2V0LCBwcm9wZXJ0eSwgY29sb3IsIHNjYWxlfSA9IGNmZztcbiAgY29uc3Qgc2VnbWVudHMgPSBfc2VnbWVudHMobGluZSwgdGFyZ2V0LCBwcm9wZXJ0eSk7XG5cbiAgZm9yIChjb25zdCB7c291cmNlOiBzcmMsIHRhcmdldDogdGd0LCBzdGFydCwgZW5kfSBvZiBzZWdtZW50cykge1xuICAgIGNvbnN0IHtzdHlsZToge2JhY2tncm91bmRDb2xvciA9IGNvbG9yfSA9IHt9fSA9IHNyYztcbiAgICBjb25zdCBub3RTaGFwZSA9IHRhcmdldCAhPT0gdHJ1ZTtcblxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tncm91bmRDb2xvcjtcblxuICAgIGNsaXBCb3VuZHMoY3R4LCBzY2FsZSwgbm90U2hhcGUgJiYgX2dldEJvdW5kcyhwcm9wZXJ0eSwgc3RhcnQsIGVuZCkpO1xuXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gICAgY29uc3QgbGluZUxvb3AgPSAhIWxpbmUucGF0aFNlZ21lbnQoY3R4LCBzcmMpO1xuXG4gICAgbGV0IGxvb3A7XG4gICAgaWYgKG5vdFNoYXBlKSB7XG4gICAgICBpZiAobGluZUxvb3ApIHtcbiAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZXJwb2xhdGVkTGluZVRvKGN0eCwgdGFyZ2V0LCBlbmQsIHByb3BlcnR5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0TG9vcCA9ICEhdGFyZ2V0LnBhdGhTZWdtZW50KGN0eCwgdGd0LCB7bW92ZTogbGluZUxvb3AsIHJldmVyc2U6IHRydWV9KTtcbiAgICAgIGxvb3AgPSBsaW5lTG9vcCAmJiB0YXJnZXRMb29wO1xuICAgICAgaWYgKCFsb29wKSB7XG4gICAgICAgIGludGVycG9sYXRlZExpbmVUbyhjdHgsIHRhcmdldCwgc3RhcnQsIHByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LmZpbGwobG9vcCA/ICdldmVub2RkJyA6ICdub256ZXJvJyk7XG5cbiAgICBjdHgucmVzdG9yZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBCb3VuZHMoY3R4LCBzY2FsZSwgYm91bmRzKSB7XG4gIGNvbnN0IHt0b3AsIGJvdHRvbX0gPSBzY2FsZS5jaGFydC5jaGFydEFyZWE7XG4gIGNvbnN0IHtwcm9wZXJ0eSwgc3RhcnQsIGVuZH0gPSBib3VuZHMgfHwge307XG4gIGlmIChwcm9wZXJ0eSA9PT0gJ3gnKSB7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN0eC5yZWN0KHN0YXJ0LCB0b3AsIGVuZCAtIHN0YXJ0LCBib3R0b20gLSB0b3ApO1xuICAgIGN0eC5jbGlwKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVkTGluZVRvKGN0eCwgdGFyZ2V0LCBwb2ludCwgcHJvcGVydHkpIHtcbiAgY29uc3QgaW50ZXJwb2xhdGVkUG9pbnQgPSB0YXJnZXQuaW50ZXJwb2xhdGUocG9pbnQsIHByb3BlcnR5KTtcbiAgaWYgKGludGVycG9sYXRlZFBvaW50KSB7XG4gICAgY3R4LmxpbmVUbyhpbnRlcnBvbGF0ZWRQb2ludC54LCBpbnRlcnBvbGF0ZWRQb2ludC55KTtcbiAgfVxufVxuXG4iLCAiLyoqXG4gKiBQbHVnaW4gYmFzZWQgb24gZGlzY3Vzc2lvbiBmcm9tIHRoZSBmb2xsb3dpbmcgQ2hhcnQuanMgaXNzdWVzOlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjM4MCNpc3N1ZWNvbW1lbnQtMjc5OTYxNTY5XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yNDQwI2lzc3VlY29tbWVudC0yNTY0NjE4OTdcbiAqL1xuXG5pbXBvcnQgTGluZUVsZW1lbnQgZnJvbSAnLi4vLi4vZWxlbWVudHMvZWxlbWVudC5saW5lLmpzJztcbmltcG9ydCB7X2RyYXdmaWxsfSBmcm9tICcuL2ZpbGxlci5kcmF3aW5nLmpzJztcbmltcG9ydCB7X3Nob3VsZEFwcGx5RmlsbH0gZnJvbSAnLi9maWxsZXIuaGVscGVyLmpzJztcbmltcG9ydCB7X2RlY29kZUZpbGwsIF9yZXNvbHZlVGFyZ2V0fSBmcm9tICcuL2ZpbGxlci5vcHRpb25zLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ2ZpbGxlcicsXG5cbiAgYWZ0ZXJEYXRhc2V0c1VwZGF0ZShjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBjb3VudCA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3Qgc291cmNlcyA9IFtdO1xuICAgIGxldCBtZXRhLCBpLCBsaW5lLCBzb3VyY2U7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuICAgICAgbGluZSA9IG1ldGEuZGF0YXNldDtcbiAgICAgIHNvdXJjZSA9IG51bGw7XG5cbiAgICAgIGlmIChsaW5lICYmIGxpbmUub3B0aW9ucyAmJiBsaW5lIGluc3RhbmNlb2YgTGluZUVsZW1lbnQpIHtcbiAgICAgICAgc291cmNlID0ge1xuICAgICAgICAgIHZpc2libGU6IGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgZmlsbDogX2RlY29kZUZpbGwobGluZSwgaSwgY291bnQpLFxuICAgICAgICAgIGNoYXJ0LFxuICAgICAgICAgIGF4aXM6IG1ldGEuY29udHJvbGxlci5vcHRpb25zLmluZGV4QXhpcyxcbiAgICAgICAgICBzY2FsZTogbWV0YS52U2NhbGUsXG4gICAgICAgICAgbGluZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbWV0YS4kZmlsbGVyID0gc291cmNlO1xuICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICBpZiAoIXNvdXJjZSB8fCBzb3VyY2UuZmlsbCA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHNvdXJjZS5maWxsID0gX3Jlc29sdmVUYXJnZXQoc291cmNlcywgaSwgb3B0aW9ucy5wcm9wYWdhdGUpO1xuICAgIH1cbiAgfSxcblxuICBiZWZvcmVEcmF3KGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IGRyYXcgPSBvcHRpb25zLmRyYXdUaW1lID09PSAnYmVmb3JlRHJhdyc7XG4gICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgY29uc3QgYXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcbiAgICBmb3IgKGxldCBpID0gbWV0YXNldHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IG1ldGFzZXRzW2ldLiRmaWxsZXI7XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgc291cmNlLmxpbmUudXBkYXRlQ29udHJvbFBvaW50cyhhcmVhLCBzb3VyY2UuYXhpcyk7XG4gICAgICBpZiAoZHJhdyAmJiBzb3VyY2UuZmlsbCkge1xuICAgICAgICBfZHJhd2ZpbGwoY2hhcnQuY3R4LCBzb3VyY2UsIGFyZWEpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBiZWZvcmVEYXRhc2V0c0RyYXcoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuZHJhd1RpbWUgIT09ICdiZWZvcmVEYXRhc2V0c0RyYXcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXNldHMgPSBjaGFydC5nZXRTb3J0ZWRWaXNpYmxlRGF0YXNldE1ldGFzKCk7XG4gICAgZm9yIChsZXQgaSA9IG1ldGFzZXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBtZXRhc2V0c1tpXS4kZmlsbGVyO1xuXG4gICAgICBpZiAoX3Nob3VsZEFwcGx5RmlsbChzb3VyY2UpKSB7XG4gICAgICAgIF9kcmF3ZmlsbChjaGFydC5jdHgsIHNvdXJjZSwgY2hhcnQuY2hhcnRBcmVhKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlRGF0YXNldERyYXcoY2hhcnQsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzb3VyY2UgPSBhcmdzLm1ldGEuJGZpbGxlcjtcblxuICAgIGlmICghX3Nob3VsZEFwcGx5RmlsbChzb3VyY2UpIHx8IG9wdGlvbnMuZHJhd1RpbWUgIT09ICdiZWZvcmVEYXRhc2V0RHJhdycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfZHJhd2ZpbGwoY2hhcnQuY3R4LCBzb3VyY2UsIGNoYXJ0LmNoYXJ0QXJlYSk7XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBwcm9wYWdhdGU6IHRydWUsXG4gICAgZHJhd1RpbWU6ICdiZWZvcmVEYXRhc2V0RHJhdydcbiAgfVxufTtcbiIsICJpbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vY29yZS9jb3JlLmRlZmF1bHRzLmpzJztcbmltcG9ydCBFbGVtZW50IGZyb20gJy4uL2NvcmUvY29yZS5lbGVtZW50LmpzJztcbmltcG9ydCBsYXlvdXRzIGZyb20gJy4uL2NvcmUvY29yZS5sYXlvdXRzLmpzJztcbmltcG9ydCB7YWRkUm91bmRlZFJlY3RQYXRoLCBkcmF3UG9pbnRMZWdlbmQsIHJlbmRlclRleHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHtcbiAgX2lzQmV0d2VlbixcbiAgY2FsbGJhY2sgYXMgY2FsbCxcbiAgY2xpcEFyZWEsXG4gIGdldFJ0bEFkYXB0ZXIsXG4gIG92ZXJyaWRlVGV4dERpcmVjdGlvbixcbiAgcmVzdG9yZVRleHREaXJlY3Rpb24sXG4gIHRvRm9udCxcbiAgdG9QYWRkaW5nLFxuICB1bmNsaXBBcmVhLFxuICB2YWx1ZU9yRGVmYXVsdCxcbn0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG5pbXBvcnQge19hbGlnblN0YXJ0RW5kLCBfdGV4dFgsIF90b0xlZnRSaWdodENlbnRlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmV4dHJhcy5qcyc7XG5pbXBvcnQge3RvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5DaGFydEV2ZW50IH0gQ2hhcnRFdmVudFxuICovXG5cbmNvbnN0IGdldEJveFNpemUgPSAobGFiZWxPcHRzLCBmb250U2l6ZSkgPT4ge1xuICBsZXQge2JveEhlaWdodCA9IGZvbnRTaXplLCBib3hXaWR0aCA9IGZvbnRTaXplfSA9IGxhYmVsT3B0cztcblxuICBpZiAobGFiZWxPcHRzLnVzZVBvaW50U3R5bGUpIHtcbiAgICBib3hIZWlnaHQgPSBNYXRoLm1pbihib3hIZWlnaHQsIGZvbnRTaXplKTtcbiAgICBib3hXaWR0aCA9IGxhYmVsT3B0cy5wb2ludFN0eWxlV2lkdGggfHwgTWF0aC5taW4oYm94V2lkdGgsIGZvbnRTaXplKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYm94V2lkdGgsXG4gICAgYm94SGVpZ2h0LFxuICAgIGl0ZW1IZWlnaHQ6IE1hdGgubWF4KGZvbnRTaXplLCBib3hIZWlnaHQpXG4gIH07XG59O1xuXG5jb25zdCBpdGVtc0VxdWFsID0gKGEsIGIpID0+IGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCAmJiBhLmRhdGFzZXRJbmRleCA9PT0gYi5kYXRhc2V0SW5kZXggJiYgYS5pbmRleCA9PT0gYi5pbmRleDtcblxuZXhwb3J0IGNsYXNzIExlZ2VuZCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3sgY3R4OiBhbnk7IG9wdGlvbnM6IGFueTsgY2hhcnQ6IGFueTsgfX0gY29uZmlnXG5cdCAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWRkZWQgPSBmYWxzZTtcblxuICAgIC8vIENvbnRhaW5zIGhpdCBib3hlcyBmb3IgZWFjaCBkYXRhc2V0IChpbiBkYXRhc2V0IG9yZGVyKVxuICAgIHRoaXMubGVnZW5kSGl0Qm94ZXMgPSBbXTtcblxuICAgIC8qKlxuIFx0XHQgKiBAcHJpdmF0ZVxuIFx0XHQgKi9cbiAgICB0aGlzLl9ob3ZlcmVkSXRlbSA9IG51bGw7XG5cbiAgICAvLyBBcmUgd2UgaW4gZG91Z2hudXQgbW9kZSB3aGljaCBoYXMgYSBkaWZmZXJlbnQgZGF0YSB0eXBlXG4gICAgdGhpcy5kb3VnaG51dE1vZGUgPSBmYWxzZTtcblxuICAgIHRoaXMuY2hhcnQgPSBjb25maWcuY2hhcnQ7XG4gICAgdGhpcy5vcHRpb25zID0gY29uZmlnLm9wdGlvbnM7XG4gICAgdGhpcy5jdHggPSBjb25maWcuY3R4O1xuICAgIHRoaXMubGVnZW5kSXRlbXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb2x1bW5TaXplcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxpbmVXaWR0aHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXhIZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxlZnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX21hcmdpbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZ1bGxTaXplID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlKG1heFdpZHRoLCBtYXhIZWlnaHQsIG1hcmdpbnMpIHtcbiAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgdGhpcy5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG4gICAgdGhpcy5fbWFyZ2lucyA9IG1hcmdpbnM7XG5cbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmJ1aWxkTGFiZWxzKCk7XG4gICAgdGhpcy5maXQoKTtcbiAgfVxuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoO1xuICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5fbWFyZ2lucy5sZWZ0O1xuICAgICAgdGhpcy5yaWdodCA9IHRoaXMud2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5tYXhIZWlnaHQ7XG4gICAgICB0aGlzLnRvcCA9IHRoaXMuX21hcmdpbnMudG9wO1xuICAgICAgdGhpcy5ib3R0b20gPSB0aGlzLmhlaWdodDtcbiAgICB9XG4gIH1cblxuICBidWlsZExhYmVscygpIHtcbiAgICBjb25zdCBsYWJlbE9wdHMgPSB0aGlzLm9wdGlvbnMubGFiZWxzIHx8IHt9O1xuICAgIGxldCBsZWdlbmRJdGVtcyA9IGNhbGwobGFiZWxPcHRzLmdlbmVyYXRlTGFiZWxzLCBbdGhpcy5jaGFydF0sIHRoaXMpIHx8IFtdO1xuXG4gICAgaWYgKGxhYmVsT3B0cy5maWx0ZXIpIHtcbiAgICAgIGxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXMuZmlsdGVyKChpdGVtKSA9PiBsYWJlbE9wdHMuZmlsdGVyKGl0ZW0sIHRoaXMuY2hhcnQuZGF0YSkpO1xuICAgIH1cblxuICAgIGlmIChsYWJlbE9wdHMuc29ydCkge1xuICAgICAgbGVnZW5kSXRlbXMgPSBsZWdlbmRJdGVtcy5zb3J0KChhLCBiKSA9PiBsYWJlbE9wdHMuc29ydChhLCBiLCB0aGlzLmNoYXJ0LmRhdGEpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJldmVyc2UpIHtcbiAgICAgIGxlZ2VuZEl0ZW1zLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXM7XG4gIH1cblxuICBmaXQoKSB7XG4gICAgY29uc3Qge29wdGlvbnMsIGN0eH0gPSB0aGlzO1xuXG4gICAgLy8gVGhlIGxlZ2VuZCBtYXkgbm90IGJlIGRpc3BsYXllZCBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMgaW5jbHVkaW5nXG4gICAgLy8gdGhlIGZhY3QgdGhhdCB0aGUgZGVmYXVsdHMgZ290IHNldCB0byBgZmFsc2VgLlxuICAgIC8vIFdoZW4gdGhlIGxlZ2VuZCBpcyBub3QgZGlzcGxheWVkLCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyB0aGF0IHRoZSBvcHRpb25zXG4gICAgLy8gYXJlIGNvcnJlY3RseSBmb3JtYXR0ZWQgc28gd2UgbmVlZCB0byBiYWlsIG91dCBhcyBlYXJseSBhcyBwb3NzaWJsZS5cbiAgICBpZiAoIW9wdGlvbnMuZGlzcGxheSkge1xuICAgICAgdGhpcy53aWR0aCA9IHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYWJlbE9wdHMgPSBvcHRpb25zLmxhYmVscztcbiAgICBjb25zdCBsYWJlbEZvbnQgPSB0b0ZvbnQobGFiZWxPcHRzLmZvbnQpO1xuICAgIGNvbnN0IGZvbnRTaXplID0gbGFiZWxGb250LnNpemU7XG4gICAgY29uc3QgdGl0bGVIZWlnaHQgPSB0aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtcbiAgICBjb25zdCB7Ym94V2lkdGgsIGl0ZW1IZWlnaHR9ID0gZ2V0Qm94U2l6ZShsYWJlbE9wdHMsIGZvbnRTaXplKTtcblxuICAgIGxldCB3aWR0aCwgaGVpZ2h0O1xuXG4gICAgY3R4LmZvbnQgPSBsYWJlbEZvbnQuc3RyaW5nO1xuXG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHdpZHRoID0gdGhpcy5tYXhXaWR0aDsgLy8gZmlsbCBhbGwgdGhlIHdpZHRoXG4gICAgICBoZWlnaHQgPSB0aGlzLl9maXRSb3dzKHRpdGxlSGVpZ2h0LCBmb250U2l6ZSwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpICsgMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlaWdodCA9IHRoaXMubWF4SGVpZ2h0OyAvLyBmaWxsIGFsbCB0aGUgaGVpZ2h0XG4gICAgICB3aWR0aCA9IHRoaXMuX2ZpdENvbHModGl0bGVIZWlnaHQsIGxhYmVsRm9udCwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpICsgMTA7XG4gICAgfVxuXG4gICAgdGhpcy53aWR0aCA9IE1hdGgubWluKHdpZHRoLCBvcHRpb25zLm1heFdpZHRoIHx8IHRoaXMubWF4V2lkdGgpO1xuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5taW4oaGVpZ2h0LCBvcHRpb25zLm1heEhlaWdodCB8fCB0aGlzLm1heEhlaWdodCk7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9maXRSb3dzKHRpdGxlSGVpZ2h0LCBmb250U2l6ZSwgYm94V2lkdGgsIGl0ZW1IZWlnaHQpIHtcbiAgICBjb25zdCB7Y3R4LCBtYXhXaWR0aCwgb3B0aW9uczoge2xhYmVsczoge3BhZGRpbmd9fX0gPSB0aGlzO1xuICAgIGNvbnN0IGhpdGJveGVzID0gdGhpcy5sZWdlbmRIaXRCb3hlcyA9IFtdO1xuICAgIC8vIFdpZHRoIG9mIGVhY2ggbGluZSBvZiBsZWdlbmQgYm94ZXMuIExhYmVscyB3cmFwIG9udG8gbXVsdGlwbGUgbGluZXMgd2hlbiB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZml0IG9uIG9uZVxuICAgIGNvbnN0IGxpbmVXaWR0aHMgPSB0aGlzLmxpbmVXaWR0aHMgPSBbMF07XG4gICAgY29uc3QgbGluZUhlaWdodCA9IGl0ZW1IZWlnaHQgKyBwYWRkaW5nO1xuICAgIGxldCB0b3RhbEhlaWdodCA9IHRpdGxlSGVpZ2h0O1xuXG4gICAgY3R4LnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG5cbiAgICBsZXQgcm93ID0gLTE7XG4gICAgbGV0IHRvcCA9IC1saW5lSGVpZ2h0O1xuICAgIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgobGVnZW5kSXRlbSwgaSkgPT4ge1xuICAgICAgY29uc3QgaXRlbVdpZHRoID0gYm94V2lkdGggKyAoZm9udFNpemUgLyAyKSArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xuXG4gICAgICBpZiAoaSA9PT0gMCB8fCBsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKyBpdGVtV2lkdGggKyAyICogcGFkZGluZyA+IG1heFdpZHRoKSB7XG4gICAgICAgIHRvdGFsSGVpZ2h0ICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgIGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGggLSAoaSA+IDAgPyAwIDogMSldID0gMDtcbiAgICAgICAgdG9wICs9IGxpbmVIZWlnaHQ7XG4gICAgICAgIHJvdysrO1xuICAgICAgfVxuXG4gICAgICBoaXRib3hlc1tpXSA9IHtsZWZ0OiAwLCB0b3AsIHJvdywgd2lkdGg6IGl0ZW1XaWR0aCwgaGVpZ2h0OiBpdGVtSGVpZ2h0fTtcblxuICAgICAgbGluZVdpZHRoc1tsaW5lV2lkdGhzLmxlbmd0aCAtIDFdICs9IGl0ZW1XaWR0aCArIHBhZGRpbmc7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdG90YWxIZWlnaHQ7XG4gIH1cblxuICBfZml0Q29scyh0aXRsZUhlaWdodCwgbGFiZWxGb250LCBib3hXaWR0aCwgX2l0ZW1IZWlnaHQpIHtcbiAgICBjb25zdCB7Y3R4LCBtYXhIZWlnaHQsIG9wdGlvbnM6IHtsYWJlbHM6IHtwYWRkaW5nfX19ID0gdGhpcztcbiAgICBjb25zdCBoaXRib3hlcyA9IHRoaXMubGVnZW5kSGl0Qm94ZXMgPSBbXTtcbiAgICBjb25zdCBjb2x1bW5TaXplcyA9IHRoaXMuY29sdW1uU2l6ZXMgPSBbXTtcbiAgICBjb25zdCBoZWlnaHRMaW1pdCA9IG1heEhlaWdodCAtIHRpdGxlSGVpZ2h0O1xuXG4gICAgbGV0IHRvdGFsV2lkdGggPSBwYWRkaW5nO1xuICAgIGxldCBjdXJyZW50Q29sV2lkdGggPSAwO1xuICAgIGxldCBjdXJyZW50Q29sSGVpZ2h0ID0gMDtcblxuICAgIGxldCBsZWZ0ID0gMDtcbiAgICBsZXQgY29sID0gMDtcblxuICAgIHRoaXMubGVnZW5kSXRlbXMuZm9yRWFjaCgobGVnZW5kSXRlbSwgaSkgPT4ge1xuICAgICAgY29uc3Qge2l0ZW1XaWR0aCwgaXRlbUhlaWdodH0gPSBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KTtcblxuICAgICAgLy8gSWYgdG9vIHRhbGwsIGdvIHRvIG5ldyBjb2x1bW5cbiAgICAgIGlmIChpID4gMCAmJiBjdXJyZW50Q29sSGVpZ2h0ICsgaXRlbUhlaWdodCArIDIgKiBwYWRkaW5nID4gaGVpZ2h0TGltaXQpIHtcbiAgICAgICAgdG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGggKyBwYWRkaW5nO1xuICAgICAgICBjb2x1bW5TaXplcy5wdXNoKHt3aWR0aDogY3VycmVudENvbFdpZHRoLCBoZWlnaHQ6IGN1cnJlbnRDb2xIZWlnaHR9KTsgLy8gcHJldmlvdXMgY29sdW1uIHNpemVcbiAgICAgICAgbGVmdCArPSBjdXJyZW50Q29sV2lkdGggKyBwYWRkaW5nO1xuICAgICAgICBjb2wrKztcbiAgICAgICAgY3VycmVudENvbFdpZHRoID0gY3VycmVudENvbEhlaWdodCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBoaXRib3ggd2lkdGggYW5kIGhlaWdodCBoZXJlLiBGaW5hbCBwb3NpdGlvbiB3aWxsIGJlIHVwZGF0ZWQgaW4gYGRyYXdgXG4gICAgICBoaXRib3hlc1tpXSA9IHtsZWZ0LCB0b3A6IGN1cnJlbnRDb2xIZWlnaHQsIGNvbCwgd2lkdGg6IGl0ZW1XaWR0aCwgaGVpZ2h0OiBpdGVtSGVpZ2h0fTtcblxuICAgICAgLy8gR2V0IG1heCB3aWR0aFxuICAgICAgY3VycmVudENvbFdpZHRoID0gTWF0aC5tYXgoY3VycmVudENvbFdpZHRoLCBpdGVtV2lkdGgpO1xuICAgICAgY3VycmVudENvbEhlaWdodCArPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICB9KTtcblxuICAgIHRvdGFsV2lkdGggKz0gY3VycmVudENvbFdpZHRoO1xuICAgIGNvbHVtblNpemVzLnB1c2goe3dpZHRoOiBjdXJyZW50Q29sV2lkdGgsIGhlaWdodDogY3VycmVudENvbEhlaWdodH0pOyAvLyBwcmV2aW91cyBjb2x1bW4gc2l6ZVxuXG4gICAgcmV0dXJuIHRvdGFsV2lkdGg7XG4gIH1cblxuICBhZGp1c3RIaXRCb3hlcygpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRpdGxlSGVpZ2h0ID0gdGhpcy5fY29tcHV0ZVRpdGxlSGVpZ2h0KCk7XG4gICAgY29uc3Qge2xlZ2VuZEhpdEJveGVzOiBoaXRib3hlcywgb3B0aW9uczoge2FsaWduLCBsYWJlbHM6IHtwYWRkaW5nfSwgcnRsfX0gPSB0aGlzO1xuICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIocnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG4gICAgICBsZXQgcm93ID0gMDtcbiAgICAgIGxldCBsZWZ0ID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSB0aGlzLmxpbmVXaWR0aHNbcm93XSk7XG4gICAgICBmb3IgKGNvbnN0IGhpdGJveCBvZiBoaXRib3hlcykge1xuICAgICAgICBpZiAocm93ICE9PSBoaXRib3gucm93KSB7XG4gICAgICAgICAgcm93ID0gaGl0Ym94LnJvdztcbiAgICAgICAgICBsZWZ0ID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIHRoaXMubGVmdCArIHBhZGRpbmcsIHRoaXMucmlnaHQgLSB0aGlzLmxpbmVXaWR0aHNbcm93XSk7XG4gICAgICAgIH1cbiAgICAgICAgaGl0Ym94LnRvcCArPSB0aGlzLnRvcCArIHRpdGxlSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgICAgaGl0Ym94LmxlZnQgPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueChsZWZ0KSwgaGl0Ym94LndpZHRoKTtcbiAgICAgICAgbGVmdCArPSBoaXRib3gud2lkdGggKyBwYWRkaW5nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY29sID0gMDtcbiAgICAgIGxldCB0b3AgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgdGhpcy50b3AgKyB0aXRsZUhlaWdodCArIHBhZGRpbmcsIHRoaXMuYm90dG9tIC0gdGhpcy5jb2x1bW5TaXplc1tjb2xdLmhlaWdodCk7XG4gICAgICBmb3IgKGNvbnN0IGhpdGJveCBvZiBoaXRib3hlcykge1xuICAgICAgICBpZiAoaGl0Ym94LmNvbCAhPT0gY29sKSB7XG4gICAgICAgICAgY29sID0gaGl0Ym94LmNvbDtcbiAgICAgICAgICB0b3AgPSBfYWxpZ25TdGFydEVuZChhbGlnbiwgdGhpcy50b3AgKyB0aXRsZUhlaWdodCArIHBhZGRpbmcsIHRoaXMuYm90dG9tIC0gdGhpcy5jb2x1bW5TaXplc1tjb2xdLmhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaGl0Ym94LnRvcCA9IHRvcDtcbiAgICAgICAgaGl0Ym94LmxlZnQgKz0gdGhpcy5sZWZ0ICsgcGFkZGluZztcbiAgICAgICAgaGl0Ym94LmxlZnQgPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueChoaXRib3gubGVmdCksIGhpdGJveC53aWR0aCk7XG4gICAgICAgIHRvcCArPSBoaXRib3guaGVpZ2h0ICsgcGFkZGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0hvcml6b250YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3RvcCcgfHwgdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJztcbiAgfVxuXG4gIGRyYXcoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNwbGF5KSB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgIGNsaXBBcmVhKGN0eCwgdGhpcyk7XG5cbiAgICAgIHRoaXMuX2RyYXcoKTtcblxuICAgICAgdW5jbGlwQXJlYShjdHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2RyYXcoKSB7XG4gICAgY29uc3Qge29wdGlvbnM6IG9wdHMsIGNvbHVtblNpemVzLCBsaW5lV2lkdGhzLCBjdHh9ID0gdGhpcztcbiAgICBjb25zdCB7YWxpZ24sIGxhYmVsczogbGFiZWxPcHRzfSA9IG9wdHM7XG4gICAgY29uc3QgZGVmYXVsdENvbG9yID0gZGVmYXVsdHMuY29sb3I7XG4gICAgY29uc3QgcnRsSGVscGVyID0gZ2V0UnRsQWRhcHRlcihvcHRzLnJ0bCwgdGhpcy5sZWZ0LCB0aGlzLndpZHRoKTtcbiAgICBjb25zdCBsYWJlbEZvbnQgPSB0b0ZvbnQobGFiZWxPcHRzLmZvbnQpO1xuICAgIGNvbnN0IHtwYWRkaW5nfSA9IGxhYmVsT3B0cztcbiAgICBjb25zdCBmb250U2l6ZSA9IGxhYmVsRm9udC5zaXplO1xuICAgIGNvbnN0IGhhbGZGb250U2l6ZSA9IGZvbnRTaXplIC8gMjtcbiAgICBsZXQgY3Vyc29yO1xuXG4gICAgdGhpcy5kcmF3VGl0bGUoKTtcblxuICAgIC8vIENhbnZhcyBzZXR1cFxuICAgIGN0eC50ZXh0QWxpZ24gPSBydGxIZWxwZXIudGV4dEFsaWduKCdsZWZ0Jyk7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGN0eC5saW5lV2lkdGggPSAwLjU7XG4gICAgY3R4LmZvbnQgPSBsYWJlbEZvbnQuc3RyaW5nO1xuXG4gICAgY29uc3Qge2JveFdpZHRoLCBib3hIZWlnaHQsIGl0ZW1IZWlnaHR9ID0gZ2V0Qm94U2l6ZShsYWJlbE9wdHMsIGZvbnRTaXplKTtcblxuICAgIC8vIGN1cnJlbnQgcG9zaXRpb25cbiAgICBjb25zdCBkcmF3TGVnZW5kQm94ID0gZnVuY3Rpb24oeCwgeSwgbGVnZW5kSXRlbSkge1xuICAgICAgaWYgKGlzTmFOKGJveFdpZHRoKSB8fCBib3hXaWR0aCA8PSAwIHx8IGlzTmFOKGJveEhlaWdodCkgfHwgYm94SGVpZ2h0IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgY3R4IGZvciB0aGUgYm94XG4gICAgICBjdHguc2F2ZSgpO1xuXG4gICAgICBjb25zdCBsaW5lV2lkdGggPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVXaWR0aCwgMSk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5maWxsU3R5bGUsIGRlZmF1bHRDb2xvcik7XG4gICAgICBjdHgubGluZUNhcCA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZUNhcCwgJ2J1dHQnKTtcbiAgICAgIGN0eC5saW5lRGFzaE9mZnNldCA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZURhc2hPZmZzZXQsIDApO1xuICAgICAgY3R4LmxpbmVKb2luID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lSm9pbiwgJ21pdGVyJyk7XG4gICAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5zdHJva2VTdHlsZSwgZGVmYXVsdENvbG9yKTtcblxuICAgICAgY3R4LnNldExpbmVEYXNoKHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZURhc2gsIFtdKSk7XG5cbiAgICAgIGlmIChsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB4IGFuZCB5IGZvciBkcmF3UG9pbnQoKSBiZWNhdXNlIGl0cyBleHBlY3RpbmdcbiAgICAgICAgLy8geCBhbmQgeSB0byBiZSBjZW50ZXIgb2YgZmlndXJlIChpbnN0ZWFkIG9mIHRvcCBsZWZ0KVxuICAgICAgICBjb25zdCBkcmF3T3B0aW9ucyA9IHtcbiAgICAgICAgICByYWRpdXM6IGJveEhlaWdodCAqIE1hdGguU1FSVDIgLyAyLFxuICAgICAgICAgIHBvaW50U3R5bGU6IGxlZ2VuZEl0ZW0ucG9pbnRTdHlsZSxcbiAgICAgICAgICByb3RhdGlvbjogbGVnZW5kSXRlbS5yb3RhdGlvbixcbiAgICAgICAgICBib3JkZXJXaWR0aDogbGluZVdpZHRoXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNlbnRlclggPSBydGxIZWxwZXIueFBsdXMoeCwgYm94V2lkdGggLyAyKTtcbiAgICAgICAgY29uc3QgY2VudGVyWSA9IHkgKyBoYWxmRm9udFNpemU7XG5cbiAgICAgICAgLy8gRHJhdyBwb2ludFN0eWxlIGFzIGxlZ2VuZCBzeW1ib2xcbiAgICAgICAgZHJhd1BvaW50TGVnZW5kKGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclksIGxhYmVsT3B0cy5wb2ludFN0eWxlV2lkdGggJiYgYm94V2lkdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHJhdyBib3ggYXMgbGVnZW5kIHN5bWJvbFxuICAgICAgICAvLyBBZGp1c3QgcG9zaXRpb24gd2hlbiBib3hIZWlnaHQgPCBmb250U2l6ZSAod2FudCBpdCBjZW50ZXJlZClcbiAgICAgICAgY29uc3QgeUJveFRvcCA9IHkgKyBNYXRoLm1heCgoZm9udFNpemUgLSBib3hIZWlnaHQpIC8gMiwgMCk7XG4gICAgICAgIGNvbnN0IHhCb3hMZWZ0ID0gcnRsSGVscGVyLmxlZnRGb3JMdHIoeCwgYm94V2lkdGgpO1xuICAgICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxlZ2VuZEl0ZW0uYm9yZGVyUmFkaXVzKTtcblxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXMoYm9yZGVyUmFkaXVzKS5zb21lKHYgPT4gdiAhPT0gMCkpIHtcbiAgICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgICB4OiB4Qm94TGVmdCxcbiAgICAgICAgICAgIHk6IHlCb3hUb3AsXG4gICAgICAgICAgICB3OiBib3hXaWR0aCxcbiAgICAgICAgICAgIGg6IGJveEhlaWdodCxcbiAgICAgICAgICAgIHJhZGl1czogYm9yZGVyUmFkaXVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN0eC5yZWN0KHhCb3hMZWZ0LCB5Qm94VG9wLCBib3hXaWR0aCwgYm94SGVpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgIGlmIChsaW5lV2lkdGggIT09IDApIHtcbiAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZmlsbFRleHQgPSBmdW5jdGlvbih4LCB5LCBsZWdlbmRJdGVtKSB7XG4gICAgICByZW5kZXJUZXh0KGN0eCwgbGVnZW5kSXRlbS50ZXh0LCB4LCB5ICsgKGl0ZW1IZWlnaHQgLyAyKSwgbGFiZWxGb250LCB7XG4gICAgICAgIHN0cmlrZXRocm91Z2g6IGxlZ2VuZEl0ZW0uaGlkZGVuLFxuICAgICAgICB0ZXh0QWxpZ246IHJ0bEhlbHBlci50ZXh0QWxpZ24obGVnZW5kSXRlbS50ZXh0QWxpZ24pXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9yaXpvbnRhbFxuICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7XG4gICAgY29uc3QgdGl0bGVIZWlnaHQgPSB0aGlzLl9jb21wdXRlVGl0bGVIZWlnaHQoKTtcbiAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICBjdXJzb3IgPSB7XG4gICAgICAgIHg6IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gbGluZVdpZHRoc1swXSksXG4gICAgICAgIHk6IHRoaXMudG9wICsgcGFkZGluZyArIHRpdGxlSGVpZ2h0LFxuICAgICAgICBsaW5lOiAwXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJzb3IgPSB7XG4gICAgICAgIHg6IHRoaXMubGVmdCArIHBhZGRpbmcsXG4gICAgICAgIHk6IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLnRvcCArIHRpdGxlSGVpZ2h0ICsgcGFkZGluZywgdGhpcy5ib3R0b20gLSBjb2x1bW5TaXplc1swXS5oZWlnaHQpLFxuICAgICAgICBsaW5lOiAwXG4gICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlVGV4dERpcmVjdGlvbih0aGlzLmN0eCwgb3B0cy50ZXh0RGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtSGVpZ2h0ICsgcGFkZGluZztcbiAgICB0aGlzLmxlZ2VuZEl0ZW1zLmZvckVhY2goKGxlZ2VuZEl0ZW0sIGkpID0+IHtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGxlZ2VuZEl0ZW0uZm9udENvbG9yOyAvLyBmb3Igc3RyaWtldGhyb3VnaCBlZmZlY3RcbiAgICAgIGN0eC5maWxsU3R5bGUgPSBsZWdlbmRJdGVtLmZvbnRDb2xvcjsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXG5cbiAgICAgIGNvbnN0IHRleHRXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xuICAgICAgY29uc3QgdGV4dEFsaWduID0gcnRsSGVscGVyLnRleHRBbGlnbihsZWdlbmRJdGVtLnRleHRBbGlnbiB8fCAobGVnZW5kSXRlbS50ZXh0QWxpZ24gPSBsYWJlbE9wdHMudGV4dEFsaWduKSk7XG4gICAgICBjb25zdCB3aWR0aCA9IGJveFdpZHRoICsgaGFsZkZvbnRTaXplICsgdGV4dFdpZHRoO1xuICAgICAgbGV0IHggPSBjdXJzb3IueDtcbiAgICAgIGxldCB5ID0gY3Vyc29yLnk7XG5cbiAgICAgIHJ0bEhlbHBlci5zZXRXaWR0aCh0aGlzLndpZHRoKTtcblxuICAgICAgaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgICAgICBpZiAoaSA+IDAgJiYgeCArIHdpZHRoICsgcGFkZGluZyA+IHRoaXMucmlnaHQpIHtcbiAgICAgICAgICB5ID0gY3Vyc29yLnkgKz0gbGluZUhlaWdodDtcbiAgICAgICAgICBjdXJzb3IubGluZSsrO1xuICAgICAgICAgIHggPSBjdXJzb3IueCA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLmxlZnQgKyBwYWRkaW5nLCB0aGlzLnJpZ2h0IC0gbGluZVdpZHRoc1tjdXJzb3IubGluZV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGkgPiAwICYmIHkgKyBsaW5lSGVpZ2h0ID4gdGhpcy5ib3R0b20pIHtcbiAgICAgICAgeCA9IGN1cnNvci54ID0geCArIGNvbHVtblNpemVzW2N1cnNvci5saW5lXS53aWR0aCArIHBhZGRpbmc7XG4gICAgICAgIGN1cnNvci5saW5lKys7XG4gICAgICAgIHkgPSBjdXJzb3IueSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0aGlzLnRvcCArIHRpdGxlSGVpZ2h0ICsgcGFkZGluZywgdGhpcy5ib3R0b20gLSBjb2x1bW5TaXplc1tjdXJzb3IubGluZV0uaGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVhbFggPSBydGxIZWxwZXIueCh4KTtcblxuICAgICAgZHJhd0xlZ2VuZEJveChyZWFsWCwgeSwgbGVnZW5kSXRlbSk7XG5cbiAgICAgIHggPSBfdGV4dFgodGV4dEFsaWduLCB4ICsgYm94V2lkdGggKyBoYWxmRm9udFNpemUsIGlzSG9yaXpvbnRhbCA/IHggKyB3aWR0aCA6IHRoaXMucmlnaHQsIG9wdHMucnRsKTtcblxuICAgICAgLy8gRmlsbCB0aGUgYWN0dWFsIGxhYmVsXG4gICAgICBmaWxsVGV4dChydGxIZWxwZXIueCh4KSwgeSwgbGVnZW5kSXRlbSk7XG5cbiAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgY3Vyc29yLnggKz0gd2lkdGggKyBwYWRkaW5nO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGVnZW5kSXRlbS50ZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBmb250TGluZUhlaWdodCA9IGxhYmVsRm9udC5saW5lSGVpZ2h0O1xuICAgICAgICBjdXJzb3IueSArPSBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnNvci55ICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN0b3JlVGV4dERpcmVjdGlvbih0aGlzLmN0eCwgb3B0cy50ZXh0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3VGl0bGUoKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0aXRsZU9wdHMgPSBvcHRzLnRpdGxlO1xuICAgIGNvbnN0IHRpdGxlRm9udCA9IHRvRm9udCh0aXRsZU9wdHMuZm9udCk7XG4gICAgY29uc3QgdGl0bGVQYWRkaW5nID0gdG9QYWRkaW5nKHRpdGxlT3B0cy5wYWRkaW5nKTtcblxuICAgIGlmICghdGl0bGVPcHRzLmRpc3BsYXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdHMucnRsLCB0aGlzLmxlZnQsIHRoaXMud2lkdGgpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGl0bGVPcHRzLnBvc2l0aW9uO1xuICAgIGNvbnN0IGhhbGZGb250U2l6ZSA9IHRpdGxlRm9udC5zaXplIC8gMjtcbiAgICBjb25zdCB0b3BQYWRkaW5nUGx1c0hhbGZGb250U2l6ZSA9IHRpdGxlUGFkZGluZy50b3AgKyBoYWxmRm9udFNpemU7XG4gICAgbGV0IHk7XG5cbiAgICAvLyBUaGVzZSBkZWZhdWx0cyBhcmUgdXNlZCB3aGVuIHRoZSBsZWdlbmQgaXMgdmVydGljYWwuXG4gICAgLy8gV2hlbiBob3Jpem9udGFsLCB0aGV5IGFyZSBjb21wdXRlZCBiZWxvdy5cbiAgICBsZXQgbGVmdCA9IHRoaXMubGVmdDtcbiAgICBsZXQgbWF4V2lkdGggPSB0aGlzLndpZHRoO1xuXG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIC8vIE1vdmUgbGVmdCAvIHJpZ2h0IHNvIHRoYXQgdGhlIHRpdGxlIGlzIGFib3ZlIHRoZSBsZWdlbmQgbGluZXNcbiAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5saW5lV2lkdGhzKTtcbiAgICAgIHkgPSB0aGlzLnRvcCArIHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplO1xuICAgICAgbGVmdCA9IF9hbGlnblN0YXJ0RW5kKG9wdHMuYWxpZ24sIGxlZnQsIHRoaXMucmlnaHQgLSBtYXhXaWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE1vdmUgZG93biBzbyB0aGF0IHRoZSB0aXRsZSBpcyBhYm92ZSB0aGUgbGVnZW5kIHN0YWNrIGluIGV2ZXJ5IGFsaWdubWVudFxuICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gdGhpcy5jb2x1bW5TaXplcy5yZWR1Y2UoKGFjYywgc2l6ZSkgPT4gTWF0aC5tYXgoYWNjLCBzaXplLmhlaWdodCksIDApO1xuICAgICAgeSA9IHRvcFBhZGRpbmdQbHVzSGFsZkZvbnRTaXplICsgX2FsaWduU3RhcnRFbmQob3B0cy5hbGlnbiwgdGhpcy50b3AsIHRoaXMuYm90dG9tIC0gbWF4SGVpZ2h0IC0gb3B0cy5sYWJlbHMucGFkZGluZyAtIHRoaXMuX2NvbXB1dGVUaXRsZUhlaWdodCgpKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGlubmVyIGxlZ2VuZCBib3gsIGNvbXB1dGUgdGhlIGNvcnJlY3RcbiAgICAvLyBYIGNvb3JkaW5hdGUgZnJvbSB0aGUgdGl0bGUgYWxpZ25tZW50XG4gICAgY29uc3QgeCA9IF9hbGlnblN0YXJ0RW5kKHBvc2l0aW9uLCBsZWZ0LCBsZWZ0ICsgbWF4V2lkdGgpO1xuXG4gICAgLy8gQ2FudmFzIHNldHVwXG4gICAgY3R4LnRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24oX3RvTGVmdFJpZ2h0Q2VudGVyKHBvc2l0aW9uKSk7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IHRpdGxlT3B0cy5jb2xvcjtcbiAgICBjdHguZmlsbFN0eWxlID0gdGl0bGVPcHRzLmNvbG9yO1xuICAgIGN0eC5mb250ID0gdGl0bGVGb250LnN0cmluZztcblxuICAgIHJlbmRlclRleHQoY3R4LCB0aXRsZU9wdHMudGV4dCwgeCwgeSwgdGl0bGVGb250KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2NvbXB1dGVUaXRsZUhlaWdodCgpIHtcbiAgICBjb25zdCB0aXRsZU9wdHMgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgY29uc3QgdGl0bGVGb250ID0gdG9Gb250KHRpdGxlT3B0cy5mb250KTtcbiAgICBjb25zdCB0aXRsZVBhZGRpbmcgPSB0b1BhZGRpbmcodGl0bGVPcHRzLnBhZGRpbmcpO1xuICAgIHJldHVybiB0aXRsZU9wdHMuZGlzcGxheSA/IHRpdGxlRm9udC5saW5lSGVpZ2h0ICsgdGl0bGVQYWRkaW5nLmhlaWdodCA6IDA7XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRMZWdlbmRJdGVtQXQoeCwgeSkge1xuICAgIGxldCBpLCBoaXRCb3gsIGxoO1xuXG4gICAgaWYgKF9pc0JldHdlZW4oeCwgdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KVxuICAgICAgJiYgX2lzQmV0d2Vlbih5LCB0aGlzLnRvcCwgdGhpcy5ib3R0b20pKSB7XG4gICAgICAvLyBTZWUgaWYgd2UgYXJlIHRvdWNoaW5nIG9uZSBvZiB0aGUgZGF0YXNldCBib3hlc1xuICAgICAgbGggPSB0aGlzLmxlZ2VuZEhpdEJveGVzO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGxoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGhpdEJveCA9IGxoW2ldO1xuXG4gICAgICAgIGlmIChfaXNCZXR3ZWVuKHgsIGhpdEJveC5sZWZ0LCBoaXRCb3gubGVmdCArIGhpdEJveC53aWR0aClcbiAgICAgICAgICAmJiBfaXNCZXR3ZWVuKHksIGhpdEJveC50b3AsIGhpdEJveC50b3AgKyBoaXRCb3guaGVpZ2h0KSkge1xuICAgICAgICAgIC8vIFRvdWNoaW5nIGFuIGVsZW1lbnRcbiAgICAgICAgICByZXR1cm4gdGhpcy5sZWdlbmRJdGVtc1tpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqL1xuICBoYW5kbGVFdmVudChlKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoIWlzTGlzdGVuZWQoZS50eXBlLCBvcHRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoYXJ0IGV2ZW50IGFscmVhZHkgaGFzIHJlbGF0aXZlIHBvc2l0aW9uIGluIGl0XG4gICAgY29uc3QgaG92ZXJlZEl0ZW0gPSB0aGlzLl9nZXRMZWdlbmRJdGVtQXQoZS54LCBlLnkpO1xuXG4gICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlbW92ZScgfHwgZS50eXBlID09PSAnbW91c2VvdXQnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX2hvdmVyZWRJdGVtO1xuICAgICAgY29uc3Qgc2FtZUl0ZW0gPSBpdGVtc0VxdWFsKHByZXZpb3VzLCBob3ZlcmVkSXRlbSk7XG4gICAgICBpZiAocHJldmlvdXMgJiYgIXNhbWVJdGVtKSB7XG4gICAgICAgIGNhbGwob3B0cy5vbkxlYXZlLCBbZSwgcHJldmlvdXMsIHRoaXNdLCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJlZEl0ZW0gPSBob3ZlcmVkSXRlbTtcblxuICAgICAgaWYgKGhvdmVyZWRJdGVtICYmICFzYW1lSXRlbSkge1xuICAgICAgICBjYWxsKG9wdHMub25Ib3ZlciwgW2UsIGhvdmVyZWRJdGVtLCB0aGlzXSwgdGhpcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChob3ZlcmVkSXRlbSkge1xuICAgICAgY2FsbChvcHRzLm9uQ2xpY2ssIFtlLCBob3ZlcmVkSXRlbSwgdGhpc10sIHRoaXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVJdGVtU2l6ZShib3hXaWR0aCwgbGFiZWxGb250LCBjdHgsIGxlZ2VuZEl0ZW0sIF9pdGVtSGVpZ2h0KSB7XG4gIGNvbnN0IGl0ZW1XaWR0aCA9IGNhbGN1bGF0ZUl0ZW1XaWR0aChsZWdlbmRJdGVtLCBib3hXaWR0aCwgbGFiZWxGb250LCBjdHgpO1xuICBjb25zdCBpdGVtSGVpZ2h0ID0gY2FsY3VsYXRlSXRlbUhlaWdodChfaXRlbUhlaWdodCwgbGVnZW5kSXRlbSwgbGFiZWxGb250LmxpbmVIZWlnaHQpO1xuICByZXR1cm4ge2l0ZW1XaWR0aCwgaXRlbUhlaWdodH07XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUl0ZW1XaWR0aChsZWdlbmRJdGVtLCBib3hXaWR0aCwgbGFiZWxGb250LCBjdHgpIHtcbiAgbGV0IGxlZ2VuZEl0ZW1UZXh0ID0gbGVnZW5kSXRlbS50ZXh0O1xuICBpZiAobGVnZW5kSXRlbVRleHQgJiYgdHlwZW9mIGxlZ2VuZEl0ZW1UZXh0ICE9PSAnc3RyaW5nJykge1xuICAgIGxlZ2VuZEl0ZW1UZXh0ID0gbGVnZW5kSXRlbVRleHQucmVkdWNlKChhLCBiKSA9PiBhLmxlbmd0aCA+IGIubGVuZ3RoID8gYSA6IGIpO1xuICB9XG4gIHJldHVybiBib3hXaWR0aCArIChsYWJlbEZvbnQuc2l6ZSAvIDIpICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW1UZXh0KS53aWR0aDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlSXRlbUhlaWdodChfaXRlbUhlaWdodCwgbGVnZW5kSXRlbSwgZm9udExpbmVIZWlnaHQpIHtcbiAgbGV0IGl0ZW1IZWlnaHQgPSBfaXRlbUhlaWdodDtcbiAgaWYgKHR5cGVvZiBsZWdlbmRJdGVtLnRleHQgIT09ICdzdHJpbmcnKSB7XG4gICAgaXRlbUhlaWdodCA9IGNhbGN1bGF0ZUxlZ2VuZEl0ZW1IZWlnaHQobGVnZW5kSXRlbSwgZm9udExpbmVIZWlnaHQpO1xuICB9XG4gIHJldHVybiBpdGVtSGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0KGxlZ2VuZEl0ZW0sIGZvbnRMaW5lSGVpZ2h0KSB7XG4gIGNvbnN0IGxhYmVsSGVpZ2h0ID0gbGVnZW5kSXRlbS50ZXh0ID8gbGVnZW5kSXRlbS50ZXh0Lmxlbmd0aCArIDAuNSA6IDA7XG4gIHJldHVybiBmb250TGluZUhlaWdodCAqIGxhYmVsSGVpZ2h0O1xufVxuXG5mdW5jdGlvbiBpc0xpc3RlbmVkKHR5cGUsIG9wdHMpIHtcbiAgaWYgKCh0eXBlID09PSAnbW91c2Vtb3ZlJyB8fCB0eXBlID09PSAnbW91c2VvdXQnKSAmJiAob3B0cy5vbkhvdmVyIHx8IG9wdHMub25MZWF2ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAob3B0cy5vbkNsaWNrICYmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT09ICdtb3VzZXVwJykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaWQ6ICdsZWdlbmQnLFxuXG4gIC8qKlxuXHQgKiBGb3IgdGVzdHNcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9lbGVtZW50OiBMZWdlbmQsXG5cbiAgc3RhcnQoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kID0gbmV3IExlZ2VuZCh7Y3R4OiBjaGFydC5jdHgsIG9wdGlvbnMsIGNoYXJ0fSk7XG4gICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgb3B0aW9ucyk7XG4gICAgbGF5b3V0cy5hZGRCb3goY2hhcnQsIGxlZ2VuZCk7XG4gIH0sXG5cbiAgc3RvcChjaGFydCkge1xuICAgIGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCBjaGFydC5sZWdlbmQpO1xuICAgIGRlbGV0ZSBjaGFydC5sZWdlbmQ7XG4gIH0sXG5cbiAgLy8gRHVyaW5nIHRoZSBiZWZvcmVVcGRhdGUgc3RlcCwgdGhlIGxheW91dCBjb25maWd1cmF0aW9uIG5lZWRzIHRvIHJ1blxuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBpZiB0aGUgbGVnZW5kIHBvc2l0aW9uIGNoYW5nZXMgKHZpYSBhbiBvcHRpb24gdXBkYXRlKVxuICAvLyB0aGUgbGF5b3V0IHN5c3RlbSByZXNwZWN0cyB0aGUgY2hhbmdlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzc1MjdcbiAgYmVmb3JlVXBkYXRlKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IGxlZ2VuZCA9IGNoYXJ0LmxlZ2VuZDtcbiAgICBsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgbGVnZW5kLCBvcHRpb25zKTtcbiAgICBsZWdlbmQub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0sXG5cbiAgLy8gVGhlIGxhYmVscyBuZWVkIHRvIGJlIGJ1aWx0IGFmdGVyIGRhdGFzZXRzIGFyZSB1cGRhdGVkIHRvIGVuc3VyZSB0aGF0IGNvbG9yc1xuICAvLyBhbmQgb3RoZXIgc3R5bGluZyBhcmUgY29ycmVjdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy82OTY4XG4gIGFmdGVyVXBkYXRlKGNoYXJ0KSB7XG4gICAgY29uc3QgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xuICAgIGxlZ2VuZC5idWlsZExhYmVscygpO1xuICAgIGxlZ2VuZC5hZGp1c3RIaXRCb3hlcygpO1xuICB9LFxuXG5cbiAgYWZ0ZXJFdmVudChjaGFydCwgYXJncykge1xuICAgIGlmICghYXJncy5yZXBsYXkpIHtcbiAgICAgIGNoYXJ0LmxlZ2VuZC5oYW5kbGVFdmVudChhcmdzLmV2ZW50KTtcbiAgICB9XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBkaXNwbGF5OiB0cnVlLFxuICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgZnVsbFNpemU6IHRydWUsXG4gICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgd2VpZ2h0OiAxMDAwLFxuXG4gICAgLy8gYSBjYWxsYmFjayB0aGF0IHdpbGwgaGFuZGxlXG4gICAgb25DbGljayhlLCBsZWdlbmRJdGVtLCBsZWdlbmQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGVnZW5kSXRlbS5kYXRhc2V0SW5kZXg7XG4gICAgICBjb25zdCBjaSA9IGxlZ2VuZC5jaGFydDtcbiAgICAgIGlmIChjaS5pc0RhdGFzZXRWaXNpYmxlKGluZGV4KSkge1xuICAgICAgICBjaS5oaWRlKGluZGV4KTtcbiAgICAgICAgbGVnZW5kSXRlbS5oaWRkZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2kuc2hvdyhpbmRleCk7XG4gICAgICAgIGxlZ2VuZEl0ZW0uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXI6IG51bGwsXG4gICAgb25MZWF2ZTogbnVsbCxcblxuICAgIGxhYmVsczoge1xuICAgICAgY29sb3I6IChjdHgpID0+IGN0eC5jaGFydC5vcHRpb25zLmNvbG9yLFxuICAgICAgYm94V2lkdGg6IDQwLFxuICAgICAgcGFkZGluZzogMTAsXG4gICAgICAvLyBHZW5lcmF0ZXMgbGFiZWxzIHNob3duIGluIHRoZSBsZWdlbmRcbiAgICAgIC8vIFZhbGlkIHByb3BlcnRpZXMgdG8gcmV0dXJuOlxuICAgICAgLy8gdGV4dCA6IHRleHQgdG8gZGlzcGxheVxuICAgICAgLy8gZmlsbFN0eWxlIDogZmlsbCBvZiBjb2xvdXJlZCBib3hcbiAgICAgIC8vIHN0cm9rZVN0eWxlOiBzdHJva2Ugb2YgY29sb3VyZWQgYm94XG4gICAgICAvLyBoaWRkZW4gOiBpZiB0aGlzIGxlZ2VuZCBpdGVtIHJlZmVycyB0byBhIGhpZGRlbiBpdGVtXG4gICAgICAvLyBsaW5lQ2FwIDogY2FwIHN0eWxlIGZvciBsaW5lXG4gICAgICAvLyBsaW5lRGFzaFxuICAgICAgLy8gbGluZURhc2hPZmZzZXQgOlxuICAgICAgLy8gbGluZUpvaW4gOlxuICAgICAgLy8gbGluZVdpZHRoIDpcbiAgICAgIGdlbmVyYXRlTGFiZWxzKGNoYXJ0KSB7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRzID0gY2hhcnQuZGF0YS5kYXRhc2V0cztcbiAgICAgICAgY29uc3Qge2xhYmVsczoge3VzZVBvaW50U3R5bGUsIHBvaW50U3R5bGUsIHRleHRBbGlnbiwgY29sb3IsIHVzZUJvcmRlclJhZGl1cywgYm9yZGVyUmFkaXVzfX0gPSBjaGFydC5sZWdlbmQub3B0aW9ucztcblxuICAgICAgICByZXR1cm4gY2hhcnQuX2dldFNvcnRlZERhdGFzZXRNZXRhcygpLm1hcCgobWV0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0eWxlID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKHVzZVBvaW50U3R5bGUgPyAwIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJXaWR0aCA9IHRvUGFkZGluZyhzdHlsZS5ib3JkZXJXaWR0aCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dDogZGF0YXNldHNbbWV0YS5pbmRleF0ubGFiZWwsXG4gICAgICAgICAgICBmaWxsU3R5bGU6IHN0eWxlLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGZvbnRDb2xvcjogY29sb3IsXG4gICAgICAgICAgICBoaWRkZW46ICFtZXRhLnZpc2libGUsXG4gICAgICAgICAgICBsaW5lQ2FwOiBzdHlsZS5ib3JkZXJDYXBTdHlsZSxcbiAgICAgICAgICAgIGxpbmVEYXNoOiBzdHlsZS5ib3JkZXJEYXNoLFxuICAgICAgICAgICAgbGluZURhc2hPZmZzZXQ6IHN0eWxlLmJvcmRlckRhc2hPZmZzZXQsXG4gICAgICAgICAgICBsaW5lSm9pbjogc3R5bGUuYm9yZGVySm9pblN0eWxlLFxuICAgICAgICAgICAgbGluZVdpZHRoOiAoYm9yZGVyV2lkdGgud2lkdGggKyBib3JkZXJXaWR0aC5oZWlnaHQpIC8gNCxcbiAgICAgICAgICAgIHN0cm9rZVN0eWxlOiBzdHlsZS5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIHBvaW50U3R5bGU6IHBvaW50U3R5bGUgfHwgc3R5bGUucG9pbnRTdHlsZSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiBzdHlsZS5yb3RhdGlvbixcbiAgICAgICAgICAgIHRleHRBbGlnbjogdGV4dEFsaWduIHx8IHN0eWxlLnRleHRBbGlnbixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogdXNlQm9yZGVyUmFkaXVzICYmIChib3JkZXJSYWRpdXMgfHwgc3R5bGUuYm9yZGVyUmFkaXVzKSxcblxuICAgICAgICAgICAgLy8gQmVsb3cgaXMgZXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgZGF0YXNldHNcbiAgICAgICAgICAgIGRhdGFzZXRJbmRleDogbWV0YS5pbmRleFxuICAgICAgICAgIH07XG4gICAgICAgIH0sIHRoaXMpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICB0aXRsZToge1xuICAgICAgY29sb3I6IChjdHgpID0+IGN0eC5jaGFydC5vcHRpb25zLmNvbG9yLFxuICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICB0ZXh0OiAnJyxcbiAgICB9XG4gIH0sXG5cbiAgZGVzY3JpcHRvcnM6IHtcbiAgICBfc2NyaXB0YWJsZTogKG5hbWUpID0+ICFuYW1lLnN0YXJ0c1dpdGgoJ29uJyksXG4gICAgbGFiZWxzOiB7XG4gICAgICBfc2NyaXB0YWJsZTogKG5hbWUpID0+ICFbJ2dlbmVyYXRlTGFiZWxzJywgJ2ZpbHRlcicsICdzb3J0J10uaW5jbHVkZXMobmFtZSksXG4gICAgfVxuICB9LFxufTtcbiIsICJpbXBvcnQgRWxlbWVudCBmcm9tICcuLi9jb3JlL2NvcmUuZWxlbWVudC5qcyc7XG5pbXBvcnQgbGF5b3V0cyBmcm9tICcuLi9jb3JlL2NvcmUubGF5b3V0cy5qcyc7XG5pbXBvcnQge1BJLCBpc0FycmF5LCB0b1BhZGRpbmcsIHRvRm9udH0gZnJvbSAnLi4vaGVscGVycy9pbmRleC5qcyc7XG5pbXBvcnQge190b0xlZnRSaWdodENlbnRlciwgX2FsaWduU3RhcnRFbmR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5leHRyYXMuanMnO1xuaW1wb3J0IHtyZW5kZXJUZXh0fSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY2FudmFzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRpdGxlIGV4dGVuZHMgRWxlbWVudCB7XG4gIC8qKlxuXHQgKiBAcGFyYW0ge3sgY3R4OiBhbnk7IG9wdGlvbnM6IGFueTsgY2hhcnQ6IGFueTsgfX0gY29uZmlnXG5cdCAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jaGFydCA9IGNvbmZpZy5jaGFydDtcbiAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcbiAgICB0aGlzLmN0eCA9IGNvbmZpZy5jdHg7XG4gICAgdGhpcy5fcGFkZGluZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRvcCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxlZnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGVpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53ZWlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mdWxsU2l6ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZShtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcblxuICAgIHRoaXMubGVmdCA9IDA7XG4gICAgdGhpcy50b3AgPSAwO1xuXG4gICAgaWYgKCFvcHRzLmRpc3BsYXkpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLmhlaWdodCA9IHRoaXMucmlnaHQgPSB0aGlzLmJvdHRvbSA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53aWR0aCA9IHRoaXMucmlnaHQgPSBtYXhXaWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuYm90dG9tID0gbWF4SGVpZ2h0O1xuXG4gICAgY29uc3QgbGluZUNvdW50ID0gaXNBcnJheShvcHRzLnRleHQpID8gb3B0cy50ZXh0Lmxlbmd0aCA6IDE7XG4gICAgdGhpcy5fcGFkZGluZyA9IHRvUGFkZGluZyhvcHRzLnBhZGRpbmcpO1xuICAgIGNvbnN0IHRleHRTaXplID0gbGluZUNvdW50ICogdG9Gb250KG9wdHMuZm9udCkubGluZUhlaWdodCArIHRoaXMuX3BhZGRpbmcuaGVpZ2h0O1xuXG4gICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGV4dFNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud2lkdGggPSB0ZXh0U2l6ZTtcbiAgICB9XG4gIH1cblxuICBpc0hvcml6b250YWwoKSB7XG4gICAgY29uc3QgcG9zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xuICAgIHJldHVybiBwb3MgPT09ICd0b3AnIHx8IHBvcyA9PT0gJ2JvdHRvbSc7XG4gIH1cblxuICBfZHJhd0FyZ3Mob2Zmc2V0KSB7XG4gICAgY29uc3Qge3RvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgb3B0aW9uc30gPSB0aGlzO1xuICAgIGNvbnN0IGFsaWduID0gb3B0aW9ucy5hbGlnbjtcbiAgICBsZXQgcm90YXRpb24gPSAwO1xuICAgIGxldCBtYXhXaWR0aCwgdGl0bGVYLCB0aXRsZVk7XG5cbiAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgdGl0bGVYID0gX2FsaWduU3RhcnRFbmQoYWxpZ24sIGxlZnQsIHJpZ2h0KTtcbiAgICAgIHRpdGxlWSA9IHRvcCArIG9mZnNldDtcbiAgICAgIG1heFdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHRpdGxlWCA9IGxlZnQgKyBvZmZzZXQ7XG4gICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCBib3R0b20sIHRvcCk7XG4gICAgICAgIHJvdGF0aW9uID0gUEkgKiAtMC41O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVYID0gcmlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIHRpdGxlWSA9IF9hbGlnblN0YXJ0RW5kKGFsaWduLCB0b3AsIGJvdHRvbSk7XG4gICAgICAgIHJvdGF0aW9uID0gUEkgKiAwLjU7XG4gICAgICB9XG4gICAgICBtYXhXaWR0aCA9IGJvdHRvbSAtIHRvcDtcbiAgICB9XG4gICAgcmV0dXJuIHt0aXRsZVgsIHRpdGxlWSwgbWF4V2lkdGgsIHJvdGF0aW9ufTtcbiAgfVxuXG4gIGRyYXcoKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jdHg7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmICghb3B0cy5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9udE9wdHMgPSB0b0ZvbnQob3B0cy5mb250KTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZm9udE9wdHMubGluZUhlaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMiArIHRoaXMuX3BhZGRpbmcudG9wO1xuICAgIGNvbnN0IHt0aXRsZVgsIHRpdGxlWSwgbWF4V2lkdGgsIHJvdGF0aW9ufSA9IHRoaXMuX2RyYXdBcmdzKG9mZnNldCk7XG5cbiAgICByZW5kZXJUZXh0KGN0eCwgb3B0cy50ZXh0LCAwLCAwLCBmb250T3B0cywge1xuICAgICAgY29sb3I6IG9wdHMuY29sb3IsXG4gICAgICBtYXhXaWR0aCxcbiAgICAgIHJvdGF0aW9uLFxuICAgICAgdGV4dEFsaWduOiBfdG9MZWZ0UmlnaHRDZW50ZXIob3B0cy5hbGlnbiksXG4gICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnLFxuICAgICAgdHJhbnNsYXRpb246IFt0aXRsZVgsIHRpdGxlWV0sXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlVGl0bGUoY2hhcnQsIHRpdGxlT3B0cykge1xuICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgY3R4OiBjaGFydC5jdHgsXG4gICAgb3B0aW9uczogdGl0bGVPcHRzLFxuICAgIGNoYXJ0XG4gIH0pO1xuXG4gIGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCB0aXRsZSwgdGl0bGVPcHRzKTtcbiAgbGF5b3V0cy5hZGRCb3goY2hhcnQsIHRpdGxlKTtcbiAgY2hhcnQudGl0bGVCbG9jayA9IHRpdGxlO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAndGl0bGUnLFxuXG4gIC8qKlxuXHQgKiBGb3IgdGVzdHNcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9lbGVtZW50OiBUaXRsZSxcblxuICBzdGFydChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICBjcmVhdGVUaXRsZShjaGFydCwgb3B0aW9ucyk7XG4gIH0sXG5cbiAgc3RvcChjaGFydCkge1xuICAgIGNvbnN0IHRpdGxlQmxvY2sgPSBjaGFydC50aXRsZUJsb2NrO1xuICAgIGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCB0aXRsZUJsb2NrKTtcbiAgICBkZWxldGUgY2hhcnQudGl0bGVCbG9jaztcbiAgfSxcblxuICBiZWZvcmVVcGRhdGUoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGl0bGUgPSBjaGFydC50aXRsZUJsb2NrO1xuICAgIGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCB0aXRsZSwgb3B0aW9ucyk7XG4gICAgdGl0bGUub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgZGlzcGxheTogZmFsc2UsXG4gICAgZm9udDoge1xuICAgICAgd2VpZ2h0OiAnYm9sZCcsXG4gICAgfSxcbiAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICBwYWRkaW5nOiAxMCxcbiAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgdGV4dDogJycsXG4gICAgd2VpZ2h0OiAyMDAwICAgICAgICAgLy8gYnkgZGVmYXVsdCBncmVhdGVyIHRoYW4gbGVnZW5kICgxMDAwKSB0byBiZSBhYm92ZVxuICB9LFxuXG4gIGRlZmF1bHRSb3V0ZXM6IHtcbiAgICBjb2xvcjogJ2NvbG9yJ1xuICB9LFxuXG4gIGRlc2NyaXB0b3JzOiB7XG4gICAgX3NjcmlwdGFibGU6IHRydWUsXG4gICAgX2luZGV4YWJsZTogZmFsc2UsXG4gIH0sXG59O1xuIiwgImltcG9ydCB7VGl0bGV9IGZyb20gJy4vcGx1Z2luLnRpdGxlLmpzJztcbmltcG9ydCBsYXlvdXRzIGZyb20gJy4uL2NvcmUvY29yZS5sYXlvdXRzLmpzJztcblxuY29uc3QgbWFwID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpZDogJ3N1YnRpdGxlJyxcblxuICBzdGFydChjaGFydCwgX2FyZ3MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB0aXRsZSA9IG5ldyBUaXRsZSh7XG4gICAgICBjdHg6IGNoYXJ0LmN0eCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBjaGFydFxuICAgIH0pO1xuXG4gICAgbGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlLCBvcHRpb25zKTtcbiAgICBsYXlvdXRzLmFkZEJveChjaGFydCwgdGl0bGUpO1xuICAgIG1hcC5zZXQoY2hhcnQsIHRpdGxlKTtcbiAgfSxcblxuICBzdG9wKGNoYXJ0KSB7XG4gICAgbGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIG1hcC5nZXQoY2hhcnQpKTtcbiAgICBtYXAuZGVsZXRlKGNoYXJ0KTtcbiAgfSxcblxuICBiZWZvcmVVcGRhdGUoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGl0bGUgPSBtYXAuZ2V0KGNoYXJ0KTtcbiAgICBsYXlvdXRzLmNvbmZpZ3VyZShjaGFydCwgdGl0bGUsIG9wdGlvbnMpO1xuICAgIHRpdGxlLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9LFxuXG4gIGRlZmF1bHRzOiB7XG4gICAgYWxpZ246ICdjZW50ZXInLFxuICAgIGRpc3BsYXk6IGZhbHNlLFxuICAgIGZvbnQ6IHtcbiAgICAgIHdlaWdodDogJ25vcm1hbCcsXG4gICAgfSxcbiAgICBmdWxsU2l6ZTogdHJ1ZSxcbiAgICBwYWRkaW5nOiAwLFxuICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICB0ZXh0OiAnJyxcbiAgICB3ZWlnaHQ6IDE1MDAgICAgICAgICAvLyBieSBkZWZhdWx0IGdyZWF0ZXIgdGhhbiBsZWdlbmQgKDEwMDApIGFuZCBzbWFsbGVyIHRoYW4gdGl0bGUgKDIwMDApXG4gIH0sXG5cbiAgZGVmYXVsdFJvdXRlczoge1xuICAgIGNvbG9yOiAnY29sb3InXG4gIH0sXG5cbiAgZGVzY3JpcHRvcnM6IHtcbiAgICBfc2NyaXB0YWJsZTogdHJ1ZSxcbiAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgfSxcbn07XG4iLCAiaW1wb3J0IEFuaW1hdGlvbnMgZnJvbSAnLi4vY29yZS9jb3JlLmFuaW1hdGlvbnMuanMnO1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vY29yZS9jb3JlLmVsZW1lbnQuanMnO1xuaW1wb3J0IHthZGRSb3VuZGVkUmVjdFBhdGh9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHtlYWNoLCBub29wLCBpc051bGxPclVuZGVmLCBpc0FycmF5LCBfZWxlbWVudHNFcXVhbCwgaXNPYmplY3R9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7dG9Gb250LCB0b1BhZGRpbmcsIHRvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcbmltcG9ydCB7Z2V0UnRsQWRhcHRlciwgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uLCByZXN0b3JlVGV4dERpcmVjdGlvbn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLnJ0bC5qcyc7XG5pbXBvcnQge2Rpc3RhbmNlQmV0d2VlblBvaW50cywgX2xpbWl0VmFsdWV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCB7Y3JlYXRlQ29udGV4dCwgZHJhd1BvaW50fSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vcGxhdGZvcm0vcGxhdGZvcm0uYmFzZS5qcycpLkNoYXJ0IH0gQ2hhcnRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KCcuLi90eXBlcy9pbmRleC5qcycpLkNoYXJ0RXZlbnQgfSBDaGFydEV2ZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydCgnLi4vdHlwZXMvaW5kZXguanMnKS5BY3RpdmVFbGVtZW50IH0gQWN0aXZlRWxlbWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5pbnRlcmFjdGlvbi5qcycpLkludGVyYWN0aW9uSXRlbSB9IEludGVyYWN0aW9uSXRlbVxuICovXG5cbmNvbnN0IHBvc2l0aW9uZXJzID0ge1xuICAvKipcblx0ICogQXZlcmFnZSBtb2RlIHBsYWNlcyB0aGUgdG9vbHRpcCBhdCB0aGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgc2hvd25cblx0ICovXG4gIGF2ZXJhZ2UoaXRlbXMpIHtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpLCBsZW47XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBsZXQgY291bnQgPSAwO1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIGNvbnN0IGVsID0gaXRlbXNbaV0uZWxlbWVudDtcbiAgICAgIGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IGVsLnRvb2x0aXBQb3NpdGlvbigpO1xuICAgICAgICB4ICs9IHBvcy54O1xuICAgICAgICB5ICs9IHBvcy55O1xuICAgICAgICArK2NvdW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4OiB4IC8gY291bnQsXG4gICAgICB5OiB5IC8gY291bnRcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuXHQgKiBHZXRzIHRoZSB0b29sdGlwIHBvc2l0aW9uIG5lYXJlc3Qgb2YgdGhlIGl0ZW0gbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb25cblx0ICovXG4gIG5lYXJlc3QoaXRlbXMsIGV2ZW50UG9zaXRpb24pIHtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCB4ID0gZXZlbnRQb3NpdGlvbi54O1xuICAgIGxldCB5ID0gZXZlbnRQb3NpdGlvbi55O1xuICAgIGxldCBtaW5EaXN0YW5jZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBsZXQgaSwgbGVuLCBuZWFyZXN0RWxlbWVudDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjb25zdCBlbCA9IGl0ZW1zW2ldLmVsZW1lbnQ7XG4gICAgICBpZiAoZWwgJiYgZWwuaGFzVmFsdWUoKSkge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBlbC5nZXRDZW50ZXJQb2ludCgpO1xuICAgICAgICBjb25zdCBkID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGV2ZW50UG9zaXRpb24sIGNlbnRlcik7XG5cbiAgICAgICAgaWYgKGQgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICAgIG1pbkRpc3RhbmNlID0gZDtcbiAgICAgICAgICBuZWFyZXN0RWxlbWVudCA9IGVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5lYXJlc3RFbGVtZW50KSB7XG4gICAgICBjb25zdCB0cCA9IG5lYXJlc3RFbGVtZW50LnRvb2x0aXBQb3NpdGlvbigpO1xuICAgICAgeCA9IHRwLng7XG4gICAgICB5ID0gdHAueTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICB9XG59O1xuXG4vLyBIZWxwZXIgdG8gcHVzaCBvciBjb25jYXQgYmFzZWQgb24gaWYgdGhlIDJuZCBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb3Igbm90XG5mdW5jdGlvbiBwdXNoT3JDb25jYXQoYmFzZSwgdG9QdXNoKSB7XG4gIGlmICh0b1B1c2gpIHtcbiAgICBpZiAoaXNBcnJheSh0b1B1c2gpKSB7XG4gICAgICAvLyBiYXNlID0gYmFzZS5jb25jYXQodG9QdXNoKTtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGJhc2UsIHRvUHVzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2UucHVzaCh0b1B1c2gpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYXNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYXJyYXkgb2Ygc3RyaW5ncyBzcGxpdCBieSBuZXdsaW5lXG4gKiBAcGFyYW0geyp9IHN0ciAtIFRoZSB2YWx1ZSB0byBzcGxpdCBieSBuZXdsaW5lLlxuICogQHJldHVybnMge3N0cmluZ3xzdHJpbmdbXX0gdmFsdWUgaWYgbmV3bGluZSBwcmVzZW50IC0gUmV0dXJuZWQgZnJvbSBTdHJpbmcgc3BsaXQoKSBtZXRob2RcbiAqIEBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBzcGxpdE5ld2xpbmVzKHN0cikge1xuICBpZiAoKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IHN0ciBpbnN0YW5jZW9mIFN0cmluZykgJiYgc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICByZXR1cm4gc3RyLnNwbGl0KCdcXG4nKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5cbi8qKlxuICogUHJpdmF0ZSBoZWxwZXIgdG8gY3JlYXRlIGEgdG9vbHRpcCBpdGVtIG1vZGVsXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydFxuICogQHBhcmFtIHtBY3RpdmVFbGVtZW50fSBpdGVtIC0ge2VsZW1lbnQsIGluZGV4LCBkYXRhc2V0SW5kZXh9IHRvIGNyZWF0ZSB0aGUgdG9vbHRpcCBpdGVtIGZvclxuICogQHJldHVybiBuZXcgdG9vbHRpcCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVRvb2x0aXBJdGVtKGNoYXJ0LCBpdGVtKSB7XG4gIGNvbnN0IHtlbGVtZW50LCBkYXRhc2V0SW5kZXgsIGluZGV4fSA9IGl0ZW07XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXI7XG4gIGNvbnN0IHtsYWJlbCwgdmFsdWV9ID0gY29udHJvbGxlci5nZXRMYWJlbEFuZFZhbHVlKGluZGV4KTtcblxuICByZXR1cm4ge1xuICAgIGNoYXJ0LFxuICAgIGxhYmVsLFxuICAgIHBhcnNlZDogY29udHJvbGxlci5nZXRQYXJzZWQoaW5kZXgpLFxuICAgIHJhdzogY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdLFxuICAgIGZvcm1hdHRlZFZhbHVlOiB2YWx1ZSxcbiAgICBkYXRhc2V0OiBjb250cm9sbGVyLmdldERhdGFzZXQoKSxcbiAgICBkYXRhSW5kZXg6IGluZGV4LFxuICAgIGRhdGFzZXRJbmRleCxcbiAgICBlbGVtZW50XG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaXplIG9mIHRoZSB0b29sdGlwXG4gKi9cbmZ1bmN0aW9uIGdldFRvb2x0aXBTaXplKHRvb2x0aXAsIG9wdGlvbnMpIHtcbiAgY29uc3QgY3R4ID0gdG9vbHRpcC5jaGFydC5jdHg7XG4gIGNvbnN0IHtib2R5LCBmb290ZXIsIHRpdGxlfSA9IHRvb2x0aXA7XG4gIGNvbnN0IHtib3hXaWR0aCwgYm94SGVpZ2h0fSA9IG9wdGlvbnM7XG4gIGNvbnN0IGJvZHlGb250ID0gdG9Gb250KG9wdGlvbnMuYm9keUZvbnQpO1xuICBjb25zdCB0aXRsZUZvbnQgPSB0b0ZvbnQob3B0aW9ucy50aXRsZUZvbnQpO1xuICBjb25zdCBmb290ZXJGb250ID0gdG9Gb250KG9wdGlvbnMuZm9vdGVyRm9udCk7XG4gIGNvbnN0IHRpdGxlTGluZUNvdW50ID0gdGl0bGUubGVuZ3RoO1xuICBjb25zdCBmb290ZXJMaW5lQ291bnQgPSBmb290ZXIubGVuZ3RoO1xuICBjb25zdCBib2R5TGluZUl0ZW1Db3VudCA9IGJvZHkubGVuZ3RoO1xuXG4gIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcob3B0aW9ucy5wYWRkaW5nKTtcbiAgbGV0IGhlaWdodCA9IHBhZGRpbmcuaGVpZ2h0O1xuICBsZXQgd2lkdGggPSAwO1xuXG4gIC8vIENvdW50IG9mIGFsbCBsaW5lcyBpbiB0aGUgYm9keVxuICBsZXQgY29tYmluZWRCb2R5TGVuZ3RoID0gYm9keS5yZWR1Y2UoKGNvdW50LCBib2R5SXRlbSkgPT4gY291bnQgKyBib2R5SXRlbS5iZWZvcmUubGVuZ3RoICsgYm9keUl0ZW0ubGluZXMubGVuZ3RoICsgYm9keUl0ZW0uYWZ0ZXIubGVuZ3RoLCAwKTtcbiAgY29tYmluZWRCb2R5TGVuZ3RoICs9IHRvb2x0aXAuYmVmb3JlQm9keS5sZW5ndGggKyB0b29sdGlwLmFmdGVyQm9keS5sZW5ndGg7XG5cbiAgaWYgKHRpdGxlTGluZUNvdW50KSB7XG4gICAgaGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ICogdGl0bGVGb250LmxpbmVIZWlnaHRcblx0XHRcdCsgKHRpdGxlTGluZUNvdW50IC0gMSkgKiBvcHRpb25zLnRpdGxlU3BhY2luZ1xuXHRcdFx0KyBvcHRpb25zLnRpdGxlTWFyZ2luQm90dG9tO1xuICB9XG4gIGlmIChjb21iaW5lZEJvZHlMZW5ndGgpIHtcbiAgICAvLyBCb2R5IGxpbmVzIG1heSBpbmNsdWRlIHNvbWUgZXh0cmEgaGVpZ2h0IGRlcGVuZGluZyBvbiBib3hIZWlnaHRcbiAgICBjb25zdCBib2R5TGluZUhlaWdodCA9IG9wdGlvbnMuZGlzcGxheUNvbG9ycyA/IE1hdGgubWF4KGJveEhlaWdodCwgYm9keUZvbnQubGluZUhlaWdodCkgOiBib2R5Rm9udC5saW5lSGVpZ2h0O1xuICAgIGhlaWdodCArPSBib2R5TGluZUl0ZW1Db3VudCAqIGJvZHlMaW5lSGVpZ2h0XG5cdFx0XHQrIChjb21iaW5lZEJvZHlMZW5ndGggLSBib2R5TGluZUl0ZW1Db3VudCkgKiBib2R5Rm9udC5saW5lSGVpZ2h0XG5cdFx0XHQrIChjb21iaW5lZEJvZHlMZW5ndGggLSAxKSAqIG9wdGlvbnMuYm9keVNwYWNpbmc7XG4gIH1cbiAgaWYgKGZvb3RlckxpbmVDb3VudCkge1xuICAgIGhlaWdodCArPSBvcHRpb25zLmZvb3Rlck1hcmdpblRvcFxuXHRcdFx0KyBmb290ZXJMaW5lQ291bnQgKiBmb290ZXJGb250LmxpbmVIZWlnaHRcblx0XHRcdCsgKGZvb3RlckxpbmVDb3VudCAtIDEpICogb3B0aW9ucy5mb290ZXJTcGFjaW5nO1xuICB9XG5cbiAgLy8gVGl0bGUgd2lkdGhcbiAgbGV0IHdpZHRoUGFkZGluZyA9IDA7XG4gIGNvbnN0IG1heExpbmVXaWR0aCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdHgubWVhc3VyZVRleHQobGluZSkud2lkdGggKyB3aWR0aFBhZGRpbmcpO1xuICB9O1xuXG4gIGN0eC5zYXZlKCk7XG5cbiAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuICBlYWNoKHRvb2x0aXAudGl0bGUsIG1heExpbmVXaWR0aCk7XG5cbiAgLy8gQm9keSB3aWR0aFxuICBjdHguZm9udCA9IGJvZHlGb250LnN0cmluZztcbiAgZWFjaCh0b29sdGlwLmJlZm9yZUJvZHkuY29uY2F0KHRvb2x0aXAuYWZ0ZXJCb2R5KSwgbWF4TGluZVdpZHRoKTtcblxuICAvLyBCb2R5IGxpbmVzIG1heSBpbmNsdWRlIHNvbWUgZXh0cmEgd2lkdGggZHVlIHRvIHRoZSBjb2xvciBib3hcbiAgd2lkdGhQYWRkaW5nID0gb3B0aW9ucy5kaXNwbGF5Q29sb3JzID8gKGJveFdpZHRoICsgMiArIG9wdGlvbnMuYm94UGFkZGluZykgOiAwO1xuICBlYWNoKGJvZHksIChib2R5SXRlbSkgPT4ge1xuICAgIGVhY2goYm9keUl0ZW0uYmVmb3JlLCBtYXhMaW5lV2lkdGgpO1xuICAgIGVhY2goYm9keUl0ZW0ubGluZXMsIG1heExpbmVXaWR0aCk7XG4gICAgZWFjaChib2R5SXRlbS5hZnRlciwgbWF4TGluZVdpZHRoKTtcbiAgfSk7XG5cbiAgLy8gUmVzZXQgYmFjayB0byAwXG4gIHdpZHRoUGFkZGluZyA9IDA7XG5cbiAgLy8gRm9vdGVyIHdpZHRoXG4gIGN0eC5mb250ID0gZm9vdGVyRm9udC5zdHJpbmc7XG4gIGVhY2godG9vbHRpcC5mb290ZXIsIG1heExpbmVXaWR0aCk7XG5cbiAgY3R4LnJlc3RvcmUoKTtcblxuICAvLyBBZGQgcGFkZGluZ1xuICB3aWR0aCArPSBwYWRkaW5nLndpZHRoO1xuXG4gIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSkge1xuICBjb25zdCB7eSwgaGVpZ2h0fSA9IHNpemU7XG5cbiAgaWYgKHkgPCBoZWlnaHQgLyAyKSB7XG4gICAgcmV0dXJuICd0b3AnO1xuICB9IGVsc2UgaWYgKHkgPiAoY2hhcnQuaGVpZ2h0IC0gaGVpZ2h0IC8gMikpIHtcbiAgICByZXR1cm4gJ2JvdHRvbSc7XG4gIH1cbiAgcmV0dXJuICdjZW50ZXInO1xufVxuXG5mdW5jdGlvbiBkb2VzTm90Rml0V2l0aEFsaWduKHhBbGlnbiwgY2hhcnQsIG9wdGlvbnMsIHNpemUpIHtcbiAgY29uc3Qge3gsIHdpZHRofSA9IHNpemU7XG4gIGNvbnN0IGNhcmV0ID0gb3B0aW9ucy5jYXJldFNpemUgKyBvcHRpb25zLmNhcmV0UGFkZGluZztcbiAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnICYmIHggKyB3aWR0aCArIGNhcmV0ID4gY2hhcnQud2lkdGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh4QWxpZ24gPT09ICdyaWdodCcgJiYgeCAtIHdpZHRoIC0gY2FyZXQgPCAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lWEFsaWduKGNoYXJ0LCBvcHRpb25zLCBzaXplLCB5QWxpZ24pIHtcbiAgY29uc3Qge3gsIHdpZHRofSA9IHNpemU7XG4gIGNvbnN0IHt3aWR0aDogY2hhcnRXaWR0aCwgY2hhcnRBcmVhOiB7bGVmdCwgcmlnaHR9fSA9IGNoYXJ0O1xuICBsZXQgeEFsaWduID0gJ2NlbnRlcic7XG5cbiAgaWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICB4QWxpZ24gPSB4IDw9IChsZWZ0ICsgcmlnaHQpIC8gMiA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gIH0gZWxzZSBpZiAoeCA8PSB3aWR0aCAvIDIpIHtcbiAgICB4QWxpZ24gPSAnbGVmdCc7XG4gIH0gZWxzZSBpZiAoeCA+PSBjaGFydFdpZHRoIC0gd2lkdGggLyAyKSB7XG4gICAgeEFsaWduID0gJ3JpZ2h0JztcbiAgfVxuXG4gIGlmIChkb2VzTm90Rml0V2l0aEFsaWduKHhBbGlnbiwgY2hhcnQsIG9wdGlvbnMsIHNpemUpKSB7XG4gICAgeEFsaWduID0gJ2NlbnRlcic7XG4gIH1cblxuICByZXR1cm4geEFsaWduO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIGFsaWdubWVudCBvZiBhIHRvb2x0aXAgZ2l2ZW4gdGhlIHNpemVcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQWxpZ25tZW50KGNoYXJ0LCBvcHRpb25zLCBzaXplKSB7XG4gIGNvbnN0IHlBbGlnbiA9IHNpemUueUFsaWduIHx8IG9wdGlvbnMueUFsaWduIHx8IGRldGVybWluZVlBbGlnbihjaGFydCwgc2l6ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICB4QWxpZ246IHNpemUueEFsaWduIHx8IG9wdGlvbnMueEFsaWduIHx8IGRldGVybWluZVhBbGlnbihjaGFydCwgb3B0aW9ucywgc2l6ZSwgeUFsaWduKSxcbiAgICB5QWxpZ25cbiAgfTtcbn1cblxuZnVuY3Rpb24gYWxpZ25YKHNpemUsIHhBbGlnbikge1xuICBsZXQge3gsIHdpZHRofSA9IHNpemU7XG4gIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICB4IC09IHdpZHRoO1xuICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ2NlbnRlcicpIHtcbiAgICB4IC09ICh3aWR0aCAvIDIpO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiBhbGlnblkoc2l6ZSwgeUFsaWduLCBwYWRkaW5nQW5kU2l6ZSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gIGxldCB7eSwgaGVpZ2h0fSA9IHNpemU7XG4gIGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XG4gICAgeSArPSBwYWRkaW5nQW5kU2l6ZTtcbiAgfSBlbHNlIGlmICh5QWxpZ24gPT09ICdib3R0b20nKSB7XG4gICAgeSAtPSBoZWlnaHQgKyBwYWRkaW5nQW5kU2l6ZTtcbiAgfSBlbHNlIHtcbiAgICB5IC09IChoZWlnaHQgLyAyKTtcbiAgfVxuICByZXR1cm4geTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IHRoZSBsb2NhdGlvbiBhIHRvb2x0aXAgbmVlZHMgdG8gYmUgcGxhY2VkIGF0IGdpdmVuIHRoZSBpbml0aWFsIHBvc2l0aW9uICh2aWEgdGhlIHZtKSBhbmQgdGhlIHNpemUgYW5kIGFsaWdubWVudFxuICovXG5mdW5jdGlvbiBnZXRCYWNrZ3JvdW5kUG9pbnQob3B0aW9ucywgc2l6ZSwgYWxpZ25tZW50LCBjaGFydCkge1xuICBjb25zdCB7Y2FyZXRTaXplLCBjYXJldFBhZGRpbmcsIGNvcm5lclJhZGl1c30gPSBvcHRpb25zO1xuICBjb25zdCB7eEFsaWduLCB5QWxpZ259ID0gYWxpZ25tZW50O1xuICBjb25zdCBwYWRkaW5nQW5kU2l6ZSA9IGNhcmV0U2l6ZSArIGNhcmV0UGFkZGluZztcbiAgY29uc3Qge3RvcExlZnQsIHRvcFJpZ2h0LCBib3R0b21MZWZ0LCBib3R0b21SaWdodH0gPSB0b1RSQkxDb3JuZXJzKGNvcm5lclJhZGl1cyk7XG5cbiAgbGV0IHggPSBhbGlnblgoc2l6ZSwgeEFsaWduKTtcbiAgY29uc3QgeSA9IGFsaWduWShzaXplLCB5QWxpZ24sIHBhZGRpbmdBbmRTaXplKTtcblxuICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgeCArPSBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgeCAtPSBwYWRkaW5nQW5kU2l6ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcbiAgICB4IC09IE1hdGgubWF4KHRvcExlZnQsIGJvdHRvbUxlZnQpICsgY2FyZXRTaXplO1xuICB9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgIHggKz0gTWF0aC5tYXgodG9wUmlnaHQsIGJvdHRvbVJpZ2h0KSArIGNhcmV0U2l6ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogX2xpbWl0VmFsdWUoeCwgMCwgY2hhcnQud2lkdGggLSBzaXplLndpZHRoKSxcbiAgICB5OiBfbGltaXRWYWx1ZSh5LCAwLCBjaGFydC5oZWlnaHQgLSBzaXplLmhlaWdodClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25lZFgodG9vbHRpcCwgYWxpZ24sIG9wdGlvbnMpIHtcbiAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuXG4gIHJldHVybiBhbGlnbiA9PT0gJ2NlbnRlcidcbiAgICA/IHRvb2x0aXAueCArIHRvb2x0aXAud2lkdGggLyAyXG4gICAgOiBhbGlnbiA9PT0gJ3JpZ2h0J1xuICAgICAgPyB0b29sdGlwLnggKyB0b29sdGlwLndpZHRoIC0gcGFkZGluZy5yaWdodFxuICAgICAgOiB0b29sdGlwLnggKyBwYWRkaW5nLmxlZnQ7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGJ1aWxkIGJlZm9yZSBhbmQgYWZ0ZXIgYm9keSBsaW5lc1xuICovXG5mdW5jdGlvbiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyhjYWxsYmFjaykge1xuICByZXR1cm4gcHVzaE9yQ29uY2F0KFtdLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRvb2x0aXBDb250ZXh0KHBhcmVudCwgdG9vbHRpcCwgdG9vbHRpcEl0ZW1zKSB7XG4gIHJldHVybiBjcmVhdGVDb250ZXh0KHBhcmVudCwge1xuICAgIHRvb2x0aXAsXG4gICAgdG9vbHRpcEl0ZW1zLFxuICAgIHR5cGU6ICd0b29sdGlwJ1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb3ZlcnJpZGVDYWxsYmFja3MoY2FsbGJhY2tzLCBjb250ZXh0KSB7XG4gIGNvbnN0IG92ZXJyaWRlID0gY29udGV4dCAmJiBjb250ZXh0LmRhdGFzZXQgJiYgY29udGV4dC5kYXRhc2V0LnRvb2x0aXAgJiYgY29udGV4dC5kYXRhc2V0LnRvb2x0aXAuY2FsbGJhY2tzO1xuICByZXR1cm4gb3ZlcnJpZGUgPyBjYWxsYmFja3Mub3ZlcnJpZGUob3ZlcnJpZGUpIDogY2FsbGJhY2tzO1xufVxuXG5jb25zdCBkZWZhdWx0Q2FsbGJhY2tzID0ge1xuICAvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcbiAgYmVmb3JlVGl0bGU6IG5vb3AsXG4gIHRpdGxlKHRvb2x0aXBJdGVtcykge1xuICAgIGlmICh0b29sdGlwSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRvb2x0aXBJdGVtc1swXTtcbiAgICAgIGNvbnN0IGxhYmVscyA9IGl0ZW0uY2hhcnQuZGF0YS5sYWJlbHM7XG4gICAgICBjb25zdCBsYWJlbENvdW50ID0gbGFiZWxzID8gbGFiZWxzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmICh0aGlzICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubW9kZSA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmRhdGFzZXQubGFiZWwgfHwgJyc7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0ubGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0ubGFiZWw7XG4gICAgICB9IGVsc2UgaWYgKGxhYmVsQ291bnQgPiAwICYmIGl0ZW0uZGF0YUluZGV4IDwgbGFiZWxDb3VudCkge1xuICAgICAgICByZXR1cm4gbGFiZWxzW2l0ZW0uZGF0YUluZGV4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH0sXG4gIGFmdGVyVGl0bGU6IG5vb3AsXG5cbiAgLy8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXG4gIGJlZm9yZUJvZHk6IG5vb3AsXG5cbiAgLy8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcbiAgYmVmb3JlTGFiZWw6IG5vb3AsXG4gIGxhYmVsKHRvb2x0aXBJdGVtKSB7XG4gICAgaWYgKHRoaXMgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5tb2RlID09PSAnZGF0YXNldCcpIHtcbiAgICAgIHJldHVybiB0b29sdGlwSXRlbS5sYWJlbCArICc6ICcgKyB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZSB8fCB0b29sdGlwSXRlbS5mb3JtYXR0ZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgbGFiZWwgPSB0b29sdGlwSXRlbS5kYXRhc2V0LmxhYmVsIHx8ICcnO1xuXG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBsYWJlbCArPSAnOiAnO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRvb2x0aXBJdGVtLmZvcm1hdHRlZFZhbHVlO1xuICAgIGlmICghaXNOdWxsT3JVbmRlZih2YWx1ZSkpIHtcbiAgICAgIGxhYmVsICs9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWw7XG4gIH0sXG4gIGxhYmVsQ29sb3IodG9vbHRpcEl0ZW0pIHtcbiAgICBjb25zdCBtZXRhID0gdG9vbHRpcEl0ZW0uY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcbiAgICBjb25zdCBvcHRpb25zID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKHRvb2x0aXBJdGVtLmRhdGFJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcbiAgICAgIGJvcmRlcldpZHRoOiBvcHRpb25zLmJvcmRlcldpZHRoLFxuICAgICAgYm9yZGVyRGFzaDogb3B0aW9ucy5ib3JkZXJEYXNoLFxuICAgICAgYm9yZGVyRGFzaE9mZnNldDogb3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0LFxuICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgIH07XG4gIH0sXG4gIGxhYmVsVGV4dENvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYm9keUNvbG9yO1xuICB9LFxuICBsYWJlbFBvaW50U3R5bGUodG9vbHRpcEl0ZW0pIHtcbiAgICBjb25zdCBtZXRhID0gdG9vbHRpcEl0ZW0uY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcbiAgICBjb25zdCBvcHRpb25zID0gbWV0YS5jb250cm9sbGVyLmdldFN0eWxlKHRvb2x0aXBJdGVtLmRhdGFJbmRleCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvaW50U3R5bGU6IG9wdGlvbnMucG9pbnRTdHlsZSxcbiAgICAgIHJvdGF0aW9uOiBvcHRpb25zLnJvdGF0aW9uLFxuICAgIH07XG4gIH0sXG4gIGFmdGVyTGFiZWw6IG5vb3AsXG5cbiAgLy8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXG4gIGFmdGVyQm9keTogbm9vcCxcblxuICAvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcbiAgYmVmb3JlRm9vdGVyOiBub29wLFxuICBmb290ZXI6IG5vb3AsXG4gIGFmdGVyRm9vdGVyOiBub29wXG59O1xuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayBmcm9tIG9iamVjdCB3aXRoIGNvbnRleHQgYW5kIGFyZ3VtZW50cy5cbiAqIElmIGNhbGxiYWNrIHJldHVybnMgYHVuZGVmaW5lZGAsIHRoZW4gd2lsbCBiZSBpbnZva2VkIGRlZmF1bHQgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1JlY29yZDxrZXlvZiB0eXBlb2YgZGVmYXVsdENhbGxiYWNrcywgRnVuY3Rpb24+fSBjYWxsYmFja3NcbiAqIEBwYXJhbSB7a2V5b2YgdHlwZW9mIGRlZmF1bHRDYWxsYmFja3N9IG5hbWVcbiAqIEBwYXJhbSB7Kn0gY3R4XG4gKiBAcGFyYW0geyp9IGFyZ1xuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCBuYW1lLCBjdHgsIGFyZykge1xuICBjb25zdCByZXN1bHQgPSBjYWxsYmFja3NbbmFtZV0uY2FsbChjdHgsIGFyZyk7XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRDYWxsYmFja3NbbmFtZV0uY2FsbChjdHgsIGFyZyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY2xhc3MgVG9vbHRpcCBleHRlbmRzIEVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAbmFtZXNwYWNlIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnNcbiAgICovXG4gIHN0YXRpYyBwb3NpdGlvbmVycyA9IHBvc2l0aW9uZXJzO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9wYWNpdHkgPSAwO1xuICAgIHRoaXMuX2FjdGl2ZSA9IFtdO1xuICAgIHRoaXMuX2V2ZW50UG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2l6ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jYWNoZWRBbmltYXRpb25zID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Rvb2x0aXBJdGVtcyA9IFtdO1xuICAgIHRoaXMuJGFuaW1hdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4kY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNoYXJ0ID0gY29uZmlnLmNoYXJ0O1xuICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZy5vcHRpb25zO1xuICAgIHRoaXMuZGF0YVBvaW50cyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRpdGxlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYmVmb3JlQm9keSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvZHkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hZnRlckJvZHkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5mb290ZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54QWxpZ24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy55QWxpZ24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy54ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMueSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhlaWdodCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLndpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FyZXRYID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FyZXRZID0gdW5kZWZpbmVkO1xuICAgIC8vIFRPRE86IFY0LCBtYWtlIHRoaXMgcHJpdmF0ZSwgcmVuYW1lIHRvIGBfbGFiZWxTdHlsZXNgLCBhbmQgY29tYmluZSB3aXRoIGBsYWJlbFBvaW50U3R5bGVzYFxuICAgIC8vIGFuZCBgbGFiZWxUZXh0Q29sb3JzYCB0byBjcmVhdGUgYSBzaW5nbGUgdmFyaWFibGVcbiAgICB0aGlzLmxhYmVsQ29sb3JzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGFiZWxQb2ludFN0eWxlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxhYmVsVGV4dENvbG9ycyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluaXRpYWxpemUob3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fY2FjaGVkQW5pbWF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfcmVzb2x2ZUFuaW1hdGlvbnMoKSB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5fY2FjaGVkQW5pbWF0aW9ucztcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLmNoYXJ0O1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuc2V0Q29udGV4dCh0aGlzLmdldENvbnRleHQoKSk7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMuZW5hYmxlZCAmJiBjaGFydC5vcHRpb25zLmFuaW1hdGlvbiAmJiBvcHRpb25zLmFuaW1hdGlvbnM7XG4gICAgY29uc3QgYW5pbWF0aW9ucyA9IG5ldyBBbmltYXRpb25zKHRoaXMuY2hhcnQsIG9wdHMpO1xuICAgIGlmIChvcHRzLl9jYWNoZWFibGUpIHtcbiAgICAgIHRoaXMuX2NhY2hlZEFuaW1hdGlvbnMgPSBPYmplY3QuZnJlZXplKGFuaW1hdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmltYXRpb25zO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRleHQgfHxcblx0XHRcdCh0aGlzLiRjb250ZXh0ID0gY3JlYXRlVG9vbHRpcENvbnRleHQodGhpcy5jaGFydC5nZXRDb250ZXh0KCksIHRoaXMsIHRoaXMuX3Rvb2x0aXBJdGVtcykpO1xuICB9XG5cbiAgZ2V0VGl0bGUoY29udGV4dCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHtjYWxsYmFja3N9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGJlZm9yZVRpdGxlID0gaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soY2FsbGJhY2tzLCAnYmVmb3JlVGl0bGUnLCB0aGlzLCBjb250ZXh0KTtcbiAgICBjb25zdCB0aXRsZSA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ3RpdGxlJywgdGhpcywgY29udGV4dCk7XG4gICAgY29uc3QgYWZ0ZXJUaXRsZSA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2FmdGVyVGl0bGUnLCB0aGlzLCBjb250ZXh0KTtcblxuICAgIGxldCBsaW5lcyA9IFtdO1xuICAgIGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGJlZm9yZVRpdGxlKSk7XG4gICAgbGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXModGl0bGUpKTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlclRpdGxlKSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBnZXRCZWZvcmVCb2R5KHRvb2x0aXBJdGVtcywgb3B0aW9ucykge1xuICAgIHJldHVybiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyhcbiAgICAgIGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKG9wdGlvbnMuY2FsbGJhY2tzLCAnYmVmb3JlQm9keScsIHRoaXMsIHRvb2x0aXBJdGVtcylcbiAgICApO1xuICB9XG5cbiAgZ2V0Qm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7Y2FsbGJhY2tzfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYm9keUl0ZW1zID0gW107XG5cbiAgICBlYWNoKHRvb2x0aXBJdGVtcywgKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlJdGVtID0ge1xuICAgICAgICBiZWZvcmU6IFtdLFxuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGFmdGVyOiBbXVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNjb3BlZCA9IG92ZXJyaWRlQ2FsbGJhY2tzKGNhbGxiYWNrcywgY29udGV4dCk7XG4gICAgICBwdXNoT3JDb25jYXQoYm9keUl0ZW0uYmVmb3JlLCBzcGxpdE5ld2xpbmVzKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2JlZm9yZUxhYmVsJywgdGhpcywgY29udGV4dCkpKTtcbiAgICAgIHB1c2hPckNvbmNhdChib2R5SXRlbS5saW5lcywgaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWwnLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgICBwdXNoT3JDb25jYXQoYm9keUl0ZW0uYWZ0ZXIsIHNwbGl0TmV3bGluZXMoaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnYWZ0ZXJMYWJlbCcsIHRoaXMsIGNvbnRleHQpKSk7XG5cbiAgICAgIGJvZHlJdGVtcy5wdXNoKGJvZHlJdGVtKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBib2R5SXRlbXM7XG4gIH1cblxuICBnZXRBZnRlckJvZHkodG9vbHRpcEl0ZW1zLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGdldEJlZm9yZUFmdGVyQm9keUxpbmVzKFxuICAgICAgaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2sob3B0aW9ucy5jYWxsYmFja3MsICdhZnRlckJvZHknLCB0aGlzLCB0b29sdGlwSXRlbXMpXG4gICAgKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgZm9vdGVyIGFuZCBiZWZvcmVGb290ZXIgYW5kIGFmdGVyRm9vdGVyIGxpbmVzXG4gIGdldEZvb3Rlcih0b29sdGlwSXRlbXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7Y2FsbGJhY2tzfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBiZWZvcmVGb290ZXIgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdiZWZvcmVGb290ZXInLCB0aGlzLCB0b29sdGlwSXRlbXMpO1xuICAgIGNvbnN0IGZvb3RlciA9IGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKGNhbGxiYWNrcywgJ2Zvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG4gICAgY29uc3QgYWZ0ZXJGb290ZXIgPSBpbnZva2VDYWxsYmFja1dpdGhGYWxsYmFjayhjYWxsYmFja3MsICdhZnRlckZvb3RlcicsIHRoaXMsIHRvb2x0aXBJdGVtcyk7XG5cbiAgICBsZXQgbGluZXMgPSBbXTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhiZWZvcmVGb290ZXIpKTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhmb290ZXIpKTtcbiAgICBsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlckZvb3RlcikpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfY3JlYXRlSXRlbXMob3B0aW9ucykge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jaGFydC5kYXRhO1xuICAgIGNvbnN0IGxhYmVsQ29sb3JzID0gW107XG4gICAgY29uc3QgbGFiZWxQb2ludFN0eWxlcyA9IFtdO1xuICAgIGNvbnN0IGxhYmVsVGV4dENvbG9ycyA9IFtdO1xuICAgIGxldCB0b29sdGlwSXRlbXMgPSBbXTtcbiAgICBsZXQgaSwgbGVuO1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gYWN0aXZlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0b29sdGlwSXRlbXMucHVzaChjcmVhdGVUb29sdGlwSXRlbSh0aGlzLmNoYXJ0LCBhY3RpdmVbaV0pKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIGZpbHRlciBmdW5jdGlvbiwgdXNlIGl0IHRvIG1vZGlmeSB0aGUgdG9vbHRpcCBpdGVtc1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikge1xuICAgICAgdG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLmZpbHRlcigoZWxlbWVudCwgaW5kZXgsIGFycmF5KSA9PiBvcHRpb25zLmZpbHRlcihlbGVtZW50LCBpbmRleCwgYXJyYXksIGRhdGEpKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIHNvcnRpbmcgZnVuY3Rpb24sIHVzZSBpdCB0byBtb2RpZnkgdGhlIHRvb2x0aXAgaXRlbXNcbiAgICBpZiAob3B0aW9ucy5pdGVtU29ydCkge1xuICAgICAgdG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLnNvcnQoKGEsIGIpID0+IG9wdGlvbnMuaXRlbVNvcnQoYSwgYiwgZGF0YSkpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBjb2xvcnMgZm9yIGJveGVzXG4gICAgZWFjaCh0b29sdGlwSXRlbXMsIChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBzY29wZWQgPSBvdmVycmlkZUNhbGxiYWNrcyhvcHRpb25zLmNhbGxiYWNrcywgY29udGV4dCk7XG4gICAgICBsYWJlbENvbG9ycy5wdXNoKGludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrKHNjb3BlZCwgJ2xhYmVsQ29sb3InLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgICBsYWJlbFBvaW50U3R5bGVzLnB1c2goaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWxQb2ludFN0eWxlJywgdGhpcywgY29udGV4dCkpO1xuICAgICAgbGFiZWxUZXh0Q29sb3JzLnB1c2goaW52b2tlQ2FsbGJhY2tXaXRoRmFsbGJhY2soc2NvcGVkLCAnbGFiZWxUZXh0Q29sb3InLCB0aGlzLCBjb250ZXh0KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmxhYmVsQ29sb3JzID0gbGFiZWxDb2xvcnM7XG4gICAgdGhpcy5sYWJlbFBvaW50U3R5bGVzID0gbGFiZWxQb2ludFN0eWxlcztcbiAgICB0aGlzLmxhYmVsVGV4dENvbG9ycyA9IGxhYmVsVGV4dENvbG9ycztcbiAgICB0aGlzLmRhdGFQb2ludHMgPSB0b29sdGlwSXRlbXM7XG4gICAgcmV0dXJuIHRvb2x0aXBJdGVtcztcbiAgfVxuXG4gIHVwZGF0ZShjaGFuZ2VkLCByZXBsYXkpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KCkpO1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZTtcbiAgICBsZXQgcHJvcGVydGllcztcbiAgICBsZXQgdG9vbHRpcEl0ZW1zID0gW107XG5cbiAgICBpZiAoIWFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLm9wYWNpdHkgIT09IDApIHtcbiAgICAgICAgcHJvcGVydGllcyA9IHtcbiAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zaXRpb25lcnNbb3B0aW9ucy5wb3NpdGlvbl0uY2FsbCh0aGlzLCBhY3RpdmUsIHRoaXMuX2V2ZW50UG9zaXRpb24pO1xuICAgICAgdG9vbHRpcEl0ZW1zID0gdGhpcy5fY3JlYXRlSXRlbXMob3B0aW9ucyk7XG5cbiAgICAgIHRoaXMudGl0bGUgPSB0aGlzLmdldFRpdGxlKHRvb2x0aXBJdGVtcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLmJlZm9yZUJvZHkgPSB0aGlzLmdldEJlZm9yZUJvZHkodG9vbHRpcEl0ZW1zLCBvcHRpb25zKTtcbiAgICAgIHRoaXMuYm9keSA9IHRoaXMuZ2V0Qm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5hZnRlckJvZHkgPSB0aGlzLmdldEFmdGVyQm9keSh0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuICAgICAgdGhpcy5mb290ZXIgPSB0aGlzLmdldEZvb3Rlcih0b29sdGlwSXRlbXMsIG9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBzaXplID0gdGhpcy5fc2l6ZSA9IGdldFRvb2x0aXBTaXplKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgY29uc3QgcG9zaXRpb25BbmRTaXplID0gT2JqZWN0LmFzc2lnbih7fSwgcG9zaXRpb24sIHNpemUpO1xuICAgICAgY29uc3QgYWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KHRoaXMuY2hhcnQsIG9wdGlvbnMsIHBvc2l0aW9uQW5kU2l6ZSk7XG4gICAgICBjb25zdCBiYWNrZ3JvdW5kUG9pbnQgPSBnZXRCYWNrZ3JvdW5kUG9pbnQob3B0aW9ucywgcG9zaXRpb25BbmRTaXplLCBhbGlnbm1lbnQsIHRoaXMuY2hhcnQpO1xuXG4gICAgICB0aGlzLnhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG4gICAgICB0aGlzLnlBbGlnbiA9IGFsaWdubWVudC55QWxpZ247XG5cbiAgICAgIHByb3BlcnRpZXMgPSB7XG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHg6IGJhY2tncm91bmRQb2ludC54LFxuICAgICAgICB5OiBiYWNrZ3JvdW5kUG9pbnQueSxcbiAgICAgICAgd2lkdGg6IHNpemUud2lkdGgsXG4gICAgICAgIGhlaWdodDogc2l6ZS5oZWlnaHQsXG4gICAgICAgIGNhcmV0WDogcG9zaXRpb24ueCxcbiAgICAgICAgY2FyZXRZOiBwb3NpdGlvbi55XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuX3Rvb2x0aXBJdGVtcyA9IHRvb2x0aXBJdGVtcztcbiAgICB0aGlzLiRjb250ZXh0ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuX3Jlc29sdmVBbmltYXRpb25zKCkudXBkYXRlKHRoaXMsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VkICYmIG9wdGlvbnMuZXh0ZXJuYWwpIHtcbiAgICAgIG9wdGlvbnMuZXh0ZXJuYWwuY2FsbCh0aGlzLCB7Y2hhcnQ6IHRoaXMuY2hhcnQsIHRvb2x0aXA6IHRoaXMsIHJlcGxheX0pO1xuICAgIH1cbiAgfVxuXG4gIGRyYXdDYXJldCh0b29sdGlwUG9pbnQsIGN0eCwgc2l6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSB0aGlzLmdldENhcmV0UG9zaXRpb24odG9vbHRpcFBvaW50LCBzaXplLCBvcHRpb25zKTtcblxuICAgIGN0eC5saW5lVG8oY2FyZXRQb3NpdGlvbi54MSwgY2FyZXRQb3NpdGlvbi55MSk7XG4gICAgY3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcbiAgICBjdHgubGluZVRvKGNhcmV0UG9zaXRpb24ueDMsIGNhcmV0UG9zaXRpb24ueTMpO1xuICB9XG5cbiAgZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7eEFsaWduLCB5QWxpZ259ID0gdGhpcztcbiAgICBjb25zdCB7Y2FyZXRTaXplLCBjb3JuZXJSYWRpdXN9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7dG9wTGVmdCwgdG9wUmlnaHQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0fSA9IHRvVFJCTENvcm5lcnMoY29ybmVyUmFkaXVzKTtcbiAgICBjb25zdCB7eDogcHRYLCB5OiBwdFl9ID0gdG9vbHRpcFBvaW50O1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHNpemU7XG4gICAgbGV0IHgxLCB4MiwgeDMsIHkxLCB5MiwgeTM7XG5cbiAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuICAgICAgeTIgPSBwdFkgKyAoaGVpZ2h0IC8gMik7XG5cbiAgICAgIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICB4MSA9IHB0WDtcbiAgICAgICAgeDIgPSB4MSAtIGNhcmV0U2l6ZTtcblxuICAgICAgICAvLyBMZWZ0IGRyYXdzIGJvdHRvbSAtPiB0b3AsIHRoaXMgeTEgaXMgb24gdGhlIGJvdHRvbVxuICAgICAgICB5MSA9IHkyICsgY2FyZXRTaXplO1xuICAgICAgICB5MyA9IHkyIC0gY2FyZXRTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDEgPSBwdFggKyB3aWR0aDtcbiAgICAgICAgeDIgPSB4MSArIGNhcmV0U2l6ZTtcblxuICAgICAgICAvLyBSaWdodCBkcmF3cyB0b3AgLT4gYm90dG9tLCB0aHVzIHkxIGlzIG9uIHRoZSB0b3BcbiAgICAgICAgeTEgPSB5MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgeTMgPSB5MiArIGNhcmV0U2l6ZTtcbiAgICAgIH1cblxuICAgICAgeDMgPSB4MTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIHgyID0gcHRYICsgTWF0aC5tYXgodG9wTGVmdCwgYm90dG9tTGVmdCkgKyAoY2FyZXRTaXplKTtcbiAgICAgIH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICAgIHgyID0gcHRYICsgd2lkdGggLSBNYXRoLm1heCh0b3BSaWdodCwgYm90dG9tUmlnaHQpIC0gY2FyZXRTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDIgPSB0aGlzLmNhcmV0WDtcbiAgICAgIH1cblxuICAgICAgaWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgeTEgPSBwdFk7XG4gICAgICAgIHkyID0geTEgLSBjYXJldFNpemU7XG5cbiAgICAgICAgLy8gVG9wIGRyYXdzIGxlZnQgLT4gcmlnaHQsIHRodXMgeDEgaXMgb24gdGhlIGxlZnRcbiAgICAgICAgeDEgPSB4MiAtIGNhcmV0U2l6ZTtcbiAgICAgICAgeDMgPSB4MiArIGNhcmV0U2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkxID0gcHRZICsgaGVpZ2h0O1xuICAgICAgICB5MiA9IHkxICsgY2FyZXRTaXplO1xuXG4gICAgICAgIC8vIEJvdHRvbSBkcmF3cyByaWdodCAtPiBsZWZ0LCB0aHVzIHgxIGlzIG9uIHRoZSByaWdodFxuICAgICAgICB4MSA9IHgyICsgY2FyZXRTaXplO1xuICAgICAgICB4MyA9IHgyIC0gY2FyZXRTaXplO1xuICAgICAgfVxuICAgICAgeTMgPSB5MTtcbiAgICB9XG4gICAgcmV0dXJuIHt4MSwgeDIsIHgzLCB5MSwgeTIsIHkzfTtcbiAgfVxuXG4gIGRyYXdUaXRsZShwdCwgY3R4LCBvcHRpb25zKSB7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgIGNvbnN0IGxlbmd0aCA9IHRpdGxlLmxlbmd0aDtcbiAgICBsZXQgdGl0bGVGb250LCB0aXRsZVNwYWNpbmcsIGk7XG5cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuXG4gICAgICBwdC54ID0gZ2V0QWxpZ25lZFgodGhpcywgb3B0aW9ucy50aXRsZUFsaWduLCBvcHRpb25zKTtcblxuICAgICAgY3R4LnRleHRBbGlnbiA9IHJ0bEhlbHBlci50ZXh0QWxpZ24ob3B0aW9ucy50aXRsZUFsaWduKTtcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuICAgICAgdGl0bGVGb250ID0gdG9Gb250KG9wdGlvbnMudGl0bGVGb250KTtcbiAgICAgIHRpdGxlU3BhY2luZyA9IG9wdGlvbnMudGl0bGVTcGFjaW5nO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy50aXRsZUNvbG9yO1xuICAgICAgY3R4LmZvbnQgPSB0aXRsZUZvbnQuc3RyaW5nO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY3R4LmZpbGxUZXh0KHRpdGxlW2ldLCBydGxIZWxwZXIueChwdC54KSwgcHQueSArIHRpdGxlRm9udC5saW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIHB0LnkgKz0gdGl0bGVGb250LmxpbmVIZWlnaHQgKyB0aXRsZVNwYWNpbmc7IC8vIExpbmUgSGVpZ2h0IGFuZCBzcGFjaW5nXG5cbiAgICAgICAgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBwdC55ICs9IG9wdGlvbnMudGl0bGVNYXJnaW5Cb3R0b20gLSB0aXRsZVNwYWNpbmc7IC8vIElmIExhc3QsIGFkZCBtYXJnaW4sIHJlbW92ZSBzcGFjaW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9kcmF3Q29sb3JCb3goY3R4LCBwdCwgaSwgcnRsSGVscGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QgbGFiZWxDb2xvcnMgPSB0aGlzLmxhYmVsQ29sb3JzW2ldO1xuICAgIGNvbnN0IGxhYmVsUG9pbnRTdHlsZSA9IHRoaXMubGFiZWxQb2ludFN0eWxlc1tpXTtcbiAgICBjb25zdCB7Ym94SGVpZ2h0LCBib3hXaWR0aCwgYm94UGFkZGluZ30gPSBvcHRpb25zO1xuICAgIGNvbnN0IGJvZHlGb250ID0gdG9Gb250KG9wdGlvbnMuYm9keUZvbnQpO1xuICAgIGNvbnN0IGNvbG9yWCA9IGdldEFsaWduZWRYKHRoaXMsICdsZWZ0Jywgb3B0aW9ucyk7XG4gICAgY29uc3QgcnRsQ29sb3JYID0gcnRsSGVscGVyLngoY29sb3JYKTtcbiAgICBjb25zdCB5T2ZmU2V0ID0gYm94SGVpZ2h0IDwgYm9keUZvbnQubGluZUhlaWdodCA/IChib2R5Rm9udC5saW5lSGVpZ2h0IC0gYm94SGVpZ2h0KSAvIDIgOiAwO1xuICAgIGNvbnN0IGNvbG9yWSA9IHB0LnkgKyB5T2ZmU2V0O1xuXG4gICAgaWYgKG9wdGlvbnMudXNlUG9pbnRTdHlsZSkge1xuICAgICAgY29uc3QgZHJhd09wdGlvbnMgPSB7XG4gICAgICAgIHJhZGl1czogTWF0aC5taW4oYm94V2lkdGgsIGJveEhlaWdodCkgLyAyLCAvLyBmaXQgdGhlIGNpcmNsZSBpbiB0aGUgYm94XG4gICAgICAgIHBvaW50U3R5bGU6IGxhYmVsUG9pbnRTdHlsZS5wb2ludFN0eWxlLFxuICAgICAgICByb3RhdGlvbjogbGFiZWxQb2ludFN0eWxlLnJvdGF0aW9uLFxuICAgICAgICBib3JkZXJXaWR0aDogMVxuICAgICAgfTtcbiAgICAgIC8vIFJlY2FsY3VsYXRlIHggYW5kIHkgZm9yIGRyYXdQb2ludCgpIGJlY2F1c2UgaXRzIGV4cGVjdGluZ1xuICAgICAgLy8geCBhbmQgeSB0byBiZSBjZW50ZXIgb2YgZmlndXJlIChpbnN0ZWFkIG9mIHRvcCBsZWZ0KVxuICAgICAgY29uc3QgY2VudGVyWCA9IHJ0bEhlbHBlci5sZWZ0Rm9yTHRyKHJ0bENvbG9yWCwgYm94V2lkdGgpICsgYm94V2lkdGggLyAyO1xuICAgICAgY29uc3QgY2VudGVyWSA9IGNvbG9yWSArIGJveEhlaWdodCAvIDI7XG5cbiAgICAgIC8vIEZpbGwgdGhlIHBvaW50IHdpdGggd2hpdGUgc28gdGhhdCBjb2xvdXJzIG1lcmdlIG5pY2VseSBpZiB0aGUgb3BhY2l0eSBpcyA8IDFcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdGlvbnMubXVsdGlLZXlCYWNrZ3JvdW5kO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMubXVsdGlLZXlCYWNrZ3JvdW5kO1xuICAgICAgZHJhd1BvaW50KGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclkpO1xuXG4gICAgICAvLyBEcmF3IHRoZSBwb2ludFxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGFiZWxDb2xvcnMuYm9yZGVyQ29sb3I7XG4gICAgICBjdHguZmlsbFN0eWxlID0gbGFiZWxDb2xvcnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgZHJhd1BvaW50KGN0eCwgZHJhd09wdGlvbnMsIGNlbnRlclgsIGNlbnRlclkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCb3JkZXJcbiAgICAgIGN0eC5saW5lV2lkdGggPSBpc09iamVjdChsYWJlbENvbG9ycy5ib3JkZXJXaWR0aCkgPyBNYXRoLm1heCguLi5PYmplY3QudmFsdWVzKGxhYmVsQ29sb3JzLmJvcmRlcldpZHRoKSkgOiAobGFiZWxDb2xvcnMuYm9yZGVyV2lkdGggfHwgMSk7IC8vIFRPRE8sIHY0IHJlbW92ZSBmYWxsYmFja1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gbGFiZWxDb2xvcnMuYm9yZGVyQ29sb3I7XG4gICAgICBjdHguc2V0TGluZURhc2gobGFiZWxDb2xvcnMuYm9yZGVyRGFzaCB8fCBbXSk7XG4gICAgICBjdHgubGluZURhc2hPZmZzZXQgPSBsYWJlbENvbG9ycy5ib3JkZXJEYXNoT2Zmc2V0IHx8IDA7XG5cbiAgICAgIC8vIEZpbGwgYSB3aGl0ZSByZWN0IHNvIHRoYXQgY29sb3VycyBtZXJnZSBuaWNlbHkgaWYgdGhlIG9wYWNpdHkgaXMgPCAxXG4gICAgICBjb25zdCBvdXRlclggPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxDb2xvclgsIGJveFdpZHRoIC0gYm94UGFkZGluZyk7XG4gICAgICBjb25zdCBpbm5lclggPSBydGxIZWxwZXIubGVmdEZvckx0cihydGxIZWxwZXIueFBsdXMocnRsQ29sb3JYLCAxKSwgYm94V2lkdGggLSBib3hQYWRkaW5nIC0gMik7XG4gICAgICBjb25zdCBib3JkZXJSYWRpdXMgPSB0b1RSQkxDb3JuZXJzKGxhYmVsQ29sb3JzLmJvcmRlclJhZGl1cyk7XG5cbiAgICAgIGlmIChPYmplY3QudmFsdWVzKGJvcmRlclJhZGl1cykuc29tZSh2ID0+IHYgIT09IDApKSB7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMubXVsdGlLZXlCYWNrZ3JvdW5kO1xuICAgICAgICBhZGRSb3VuZGVkUmVjdFBhdGgoY3R4LCB7XG4gICAgICAgICAgeDogb3V0ZXJYLFxuICAgICAgICAgIHk6IGNvbG9yWSxcbiAgICAgICAgICB3OiBib3hXaWR0aCxcbiAgICAgICAgICBoOiBib3hIZWlnaHQsXG4gICAgICAgICAgcmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgICAgIH0pO1xuICAgICAgICBjdHguZmlsbCgpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgICAgLy8gSW5uZXIgc3F1YXJlXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBsYWJlbENvbG9ycy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgYWRkUm91bmRlZFJlY3RQYXRoKGN0eCwge1xuICAgICAgICAgIHg6IGlubmVyWCxcbiAgICAgICAgICB5OiBjb2xvclkgKyAxLFxuICAgICAgICAgIHc6IGJveFdpZHRoIC0gMixcbiAgICAgICAgICBoOiBib3hIZWlnaHQgLSAyLFxuICAgICAgICAgIHJhZGl1czogYm9yZGVyUmFkaXVzLFxuICAgICAgICB9KTtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCByZWN0XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBvcHRpb25zLm11bHRpS2V5QmFja2dyb3VuZDtcbiAgICAgICAgY3R4LmZpbGxSZWN0KG91dGVyWCwgY29sb3JZLCBib3hXaWR0aCwgYm94SGVpZ2h0KTtcbiAgICAgICAgY3R4LnN0cm9rZVJlY3Qob3V0ZXJYLCBjb2xvclksIGJveFdpZHRoLCBib3hIZWlnaHQpO1xuICAgICAgICAvLyBJbm5lciBzcXVhcmVcbiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGxhYmVsQ29sb3JzLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgY3R4LmZpbGxSZWN0KGlubmVyWCwgY29sb3JZICsgMSwgYm94V2lkdGggLSAyLCBib3hIZWlnaHQgLSAyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIGZpbGxTdHlsZVxuICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLmxhYmVsVGV4dENvbG9yc1tpXTtcbiAgfVxuXG4gIGRyYXdCb2R5KHB0LCBjdHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7Ym9keX0gPSB0aGlzO1xuICAgIGNvbnN0IHtib2R5U3BhY2luZywgYm9keUFsaWduLCBkaXNwbGF5Q29sb3JzLCBib3hIZWlnaHQsIGJveFdpZHRoLCBib3hQYWRkaW5nfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYm9keUZvbnQgPSB0b0ZvbnQob3B0aW9ucy5ib2R5Rm9udCk7XG4gICAgbGV0IGJvZHlMaW5lSGVpZ2h0ID0gYm9keUZvbnQubGluZUhlaWdodDtcbiAgICBsZXQgeExpbmVQYWRkaW5nID0gMDtcblxuICAgIGNvbnN0IHJ0bEhlbHBlciA9IGdldFJ0bEFkYXB0ZXIob3B0aW9ucy5ydGwsIHRoaXMueCwgdGhpcy53aWR0aCk7XG5cbiAgICBjb25zdCBmaWxsTGluZU9mVGV4dCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIGN0eC5maWxsVGV4dChsaW5lLCBydGxIZWxwZXIueChwdC54ICsgeExpbmVQYWRkaW5nKSwgcHQueSArIGJvZHlMaW5lSGVpZ2h0IC8gMik7XG4gICAgICBwdC55ICs9IGJvZHlMaW5lSGVpZ2h0ICsgYm9keVNwYWNpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uID0gcnRsSGVscGVyLnRleHRBbGlnbihib2R5QWxpZ24pO1xuICAgIGxldCBib2R5SXRlbSwgdGV4dENvbG9yLCBsaW5lcywgaSwgaiwgaWxlbiwgamxlbjtcblxuICAgIGN0eC50ZXh0QWxpZ24gPSBib2R5QWxpZ247XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGN0eC5mb250ID0gYm9keUZvbnQuc3RyaW5nO1xuXG4gICAgcHQueCA9IGdldEFsaWduZWRYKHRoaXMsIGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uLCBvcHRpb25zKTtcblxuICAgIC8vIEJlZm9yZSBib2R5IGxpbmVzXG4gICAgY3R4LmZpbGxTdHlsZSA9IG9wdGlvbnMuYm9keUNvbG9yO1xuICAgIGVhY2godGhpcy5iZWZvcmVCb2R5LCBmaWxsTGluZU9mVGV4dCk7XG5cbiAgICB4TGluZVBhZGRpbmcgPSBkaXNwbGF5Q29sb3JzICYmIGJvZHlBbGlnbkZvckNhbGN1bGF0aW9uICE9PSAncmlnaHQnXG4gICAgICA/IGJvZHlBbGlnbiA9PT0gJ2NlbnRlcicgPyAoYm94V2lkdGggLyAyICsgYm94UGFkZGluZykgOiAoYm94V2lkdGggKyAyICsgYm94UGFkZGluZylcbiAgICAgIDogMDtcblxuICAgIC8vIERyYXcgYm9keSBsaW5lcyBub3dcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gYm9keS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGJvZHlJdGVtID0gYm9keVtpXTtcbiAgICAgIHRleHRDb2xvciA9IHRoaXMubGFiZWxUZXh0Q29sb3JzW2ldO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gdGV4dENvbG9yO1xuICAgICAgZWFjaChib2R5SXRlbS5iZWZvcmUsIGZpbGxMaW5lT2ZUZXh0KTtcblxuICAgICAgbGluZXMgPSBib2R5SXRlbS5saW5lcztcbiAgICAgIC8vIERyYXcgTGVnZW5kLWxpa2UgYm94ZXMgaWYgbmVlZGVkXG4gICAgICBpZiAoZGlzcGxheUNvbG9ycyAmJiBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fZHJhd0NvbG9yQm94KGN0eCwgcHQsIGksIHJ0bEhlbHBlciwgb3B0aW9ucyk7XG4gICAgICAgIGJvZHlMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoYm9keUZvbnQubGluZUhlaWdodCwgYm94SGVpZ2h0KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChqID0gMCwgamxlbiA9IGxpbmVzLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuICAgICAgICBmaWxsTGluZU9mVGV4dChsaW5lc1tqXSk7XG4gICAgICAgIC8vIFJlc2V0IGZvciBhbnkgbGluZXMgdGhhdCBkb24ndCBpbmNsdWRlIGNvbG9yYm94XG4gICAgICAgIGJvZHlMaW5lSGVpZ2h0ID0gYm9keUZvbnQubGluZUhlaWdodDtcbiAgICAgIH1cblxuICAgICAgZWFjaChib2R5SXRlbS5hZnRlciwgZmlsbExpbmVPZlRleHQpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGJhY2sgdG8gMCBmb3IgYWZ0ZXIgYm9keVxuICAgIHhMaW5lUGFkZGluZyA9IDA7XG4gICAgYm9keUxpbmVIZWlnaHQgPSBib2R5Rm9udC5saW5lSGVpZ2h0O1xuXG4gICAgLy8gQWZ0ZXIgYm9keSBsaW5lc1xuICAgIGVhY2godGhpcy5hZnRlckJvZHksIGZpbGxMaW5lT2ZUZXh0KTtcbiAgICBwdC55IC09IGJvZHlTcGFjaW5nOyAvLyBSZW1vdmUgbGFzdCBib2R5IHNwYWNpbmdcbiAgfVxuXG4gIGRyYXdGb290ZXIocHQsIGN0eCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZvb3RlciA9IHRoaXMuZm9vdGVyO1xuICAgIGNvbnN0IGxlbmd0aCA9IGZvb3Rlci5sZW5ndGg7XG4gICAgbGV0IGZvb3RlckZvbnQsIGk7XG5cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBjb25zdCBydGxIZWxwZXIgPSBnZXRSdGxBZGFwdGVyKG9wdGlvbnMucnRsLCB0aGlzLngsIHRoaXMud2lkdGgpO1xuXG4gICAgICBwdC54ID0gZ2V0QWxpZ25lZFgodGhpcywgb3B0aW9ucy5mb290ZXJBbGlnbiwgb3B0aW9ucyk7XG4gICAgICBwdC55ICs9IG9wdGlvbnMuZm9vdGVyTWFyZ2luVG9wO1xuXG4gICAgICBjdHgudGV4dEFsaWduID0gcnRsSGVscGVyLnRleHRBbGlnbihvcHRpb25zLmZvb3RlckFsaWduKTtcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblxuICAgICAgZm9vdGVyRm9udCA9IHRvRm9udChvcHRpb25zLmZvb3RlckZvbnQpO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5mb290ZXJDb2xvcjtcbiAgICAgIGN0eC5mb250ID0gZm9vdGVyRm9udC5zdHJpbmc7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICBjdHguZmlsbFRleHQoZm9vdGVyW2ldLCBydGxIZWxwZXIueChwdC54KSwgcHQueSArIGZvb3RlckZvbnQubGluZUhlaWdodCAvIDIpO1xuICAgICAgICBwdC55ICs9IGZvb3RlckZvbnQubGluZUhlaWdodCArIG9wdGlvbnMuZm9vdGVyU3BhY2luZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkcmF3QmFja2dyb3VuZChwdCwgY3R4LCB0b29sdGlwU2l6ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHt4QWxpZ24sIHlBbGlnbn0gPSB0aGlzO1xuICAgIGNvbnN0IHt4LCB5fSA9IHB0O1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHRvb2x0aXBTaXplO1xuICAgIGNvbnN0IHt0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHR9ID0gdG9UUkJMQ29ybmVycyhvcHRpb25zLmNvcm5lclJhZGl1cyk7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gb3B0aW9ucy5ib3JkZXJDb2xvcjtcbiAgICBjdHgubGluZVdpZHRoID0gb3B0aW9ucy5ib3JkZXJXaWR0aDtcblxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKHggKyB0b3BMZWZ0LCB5KTtcbiAgICBpZiAoeUFsaWduID09PSAndG9wJykge1xuICAgICAgdGhpcy5kcmF3Q2FyZXQocHQsIGN0eCwgdG9vbHRpcFNpemUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjdHgubGluZVRvKHggKyB3aWR0aCAtIHRvcFJpZ2h0LCB5KTtcbiAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHksIHggKyB3aWR0aCwgeSArIHRvcFJpZ2h0KTtcbiAgICBpZiAoeUFsaWduID09PSAnY2VudGVyJyAmJiB4QWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSBib3R0b21SaWdodCk7XG4gICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSBib3R0b21SaWdodCwgeSArIGhlaWdodCk7XG4gICAgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIHRoaXMuZHJhd0NhcmV0KHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY3R4LmxpbmVUbyh4ICsgYm90dG9tTGVmdCwgeSArIGhlaWdodCk7XG4gICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIGJvdHRvbUxlZnQpO1xuICAgIGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG4gICAgICB0aGlzLmRyYXdDYXJldChwdCwgY3R4LCB0b29sdGlwU2l6ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGN0eC5saW5lVG8oeCwgeSArIHRvcExlZnQpO1xuICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHksIHggKyB0b3BMZWZ0LCB5KTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG5cbiAgICBjdHguZmlsbCgpO1xuXG4gICAgaWYgKG9wdGlvbnMuYm9yZGVyV2lkdGggPiAwKSB7XG4gICAgICBjdHguc3Ryb2tlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIFVwZGF0ZSB4L3kgYW5pbWF0aW9uIHRhcmdldHMgd2hlbiBfYWN0aXZlIGVsZW1lbnRzIGFyZSBhbmltYXRpbmcgdG9vXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfdXBkYXRlQW5pbWF0aW9uVGFyZ2V0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBjaGFydCA9IHRoaXMuY2hhcnQ7XG4gICAgY29uc3QgYW5pbXMgPSB0aGlzLiRhbmltYXRpb25zO1xuICAgIGNvbnN0IGFuaW1YID0gYW5pbXMgJiYgYW5pbXMueDtcbiAgICBjb25zdCBhbmltWSA9IGFuaW1zICYmIGFuaW1zLnk7XG4gICAgaWYgKGFuaW1YIHx8IGFuaW1ZKSB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdGlvbnMucG9zaXRpb25dLmNhbGwodGhpcywgdGhpcy5fYWN0aXZlLCB0aGlzLl9ldmVudFBvc2l0aW9uKTtcbiAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuX3NpemUgPSBnZXRUb29sdGlwU2l6ZSh0aGlzLCBvcHRpb25zKTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uQW5kU2l6ZSA9IE9iamVjdC5hc3NpZ24oe30sIHBvc2l0aW9uLCB0aGlzLl9zaXplKTtcbiAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRldGVybWluZUFsaWdubWVudChjaGFydCwgb3B0aW9ucywgcG9zaXRpb25BbmRTaXplKTtcbiAgICAgIGNvbnN0IHBvaW50ID0gZ2V0QmFja2dyb3VuZFBvaW50KG9wdGlvbnMsIHBvc2l0aW9uQW5kU2l6ZSwgYWxpZ25tZW50LCBjaGFydCk7XG4gICAgICBpZiAoYW5pbVguX3RvICE9PSBwb2ludC54IHx8IGFuaW1ZLl90byAhPT0gcG9pbnQueSkge1xuICAgICAgICB0aGlzLnhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG4gICAgICAgIHRoaXMueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcbiAgICAgICAgdGhpcy53aWR0aCA9IHNpemUud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY2FyZXRYID0gcG9zaXRpb24ueDtcbiAgICAgICAgdGhpcy5jYXJldFkgPSBwb3NpdGlvbi55O1xuICAgICAgICB0aGlzLl9yZXNvbHZlQW5pbWF0aW9ucygpLnVwZGF0ZSh0aGlzLCBwb2ludCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgdG9vbHRpcCB3aWxsIGRyYXcgYW55dGhpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHRvb2x0aXAgd2lsbCByZW5kZXJcbiAgICovXG4gIF93aWxsUmVuZGVyKCkge1xuICAgIHJldHVybiAhIXRoaXMub3BhY2l0eTtcbiAgfVxuXG4gIGRyYXcoY3R4KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy5zZXRDb250ZXh0KHRoaXMuZ2V0Q29udGV4dCgpKTtcbiAgICBsZXQgb3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblxuICAgIGlmICghb3BhY2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUFuaW1hdGlvblRhcmdldChvcHRpb25zKTtcblxuICAgIGNvbnN0IHRvb2x0aXBTaXplID0ge1xuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0XG4gICAgfTtcbiAgICBjb25zdCBwdCA9IHtcbiAgICAgIHg6IHRoaXMueCxcbiAgICAgIHk6IHRoaXMueVxuICAgIH07XG5cbiAgICAvLyBJRTExL0VkZ2UgZG9lcyBub3QgbGlrZSB2ZXJ5IHNtYWxsIG9wYWNpdGllcywgc28gc25hcCB0byAwXG4gICAgb3BhY2l0eSA9IE1hdGguYWJzKG9wYWNpdHkpIDwgMWUtMyA/IDAgOiBvcGFjaXR5O1xuXG4gICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRpb25zLnBhZGRpbmcpO1xuXG4gICAgLy8gVHJ1dGh5L2ZhbHNleSB2YWx1ZSBmb3IgZW1wdHkgdG9vbHRpcFxuICAgIGNvbnN0IGhhc1Rvb2x0aXBDb250ZW50ID0gdGhpcy50aXRsZS5sZW5ndGggfHwgdGhpcy5iZWZvcmVCb2R5Lmxlbmd0aCB8fCB0aGlzLmJvZHkubGVuZ3RoIHx8IHRoaXMuYWZ0ZXJCb2R5Lmxlbmd0aCB8fCB0aGlzLmZvb3Rlci5sZW5ndGg7XG5cbiAgICBpZiAob3B0aW9ucy5lbmFibGVkICYmIGhhc1Rvb2x0aXBDb250ZW50KSB7XG4gICAgICBjdHguc2F2ZSgpO1xuICAgICAgY3R4Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgLy8gRHJhdyBCYWNrZ3JvdW5kXG4gICAgICB0aGlzLmRyYXdCYWNrZ3JvdW5kKHB0LCBjdHgsIHRvb2x0aXBTaXplLCBvcHRpb25zKTtcblxuICAgICAgb3ZlcnJpZGVUZXh0RGlyZWN0aW9uKGN0eCwgb3B0aW9ucy50ZXh0RGlyZWN0aW9uKTtcblxuICAgICAgcHQueSArPSBwYWRkaW5nLnRvcDtcblxuICAgICAgLy8gVGl0bGVzXG4gICAgICB0aGlzLmRyYXdUaXRsZShwdCwgY3R4LCBvcHRpb25zKTtcblxuICAgICAgLy8gQm9keVxuICAgICAgdGhpcy5kcmF3Qm9keShwdCwgY3R4LCBvcHRpb25zKTtcblxuICAgICAgLy8gRm9vdGVyXG4gICAgICB0aGlzLmRyYXdGb290ZXIocHQsIGN0eCwgb3B0aW9ucyk7XG5cbiAgICAgIHJlc3RvcmVUZXh0RGlyZWN0aW9uKGN0eCwgb3B0aW9ucy50ZXh0RGlyZWN0aW9uKTtcblxuICAgICAgY3R4LnJlc3RvcmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogR2V0IGFjdGl2ZSBlbGVtZW50cyBpbiB0aGUgdG9vbHRpcFxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIGFjdGl2ZSBpbiB0aGUgdG9vbHRpcFxuXHQgKi9cbiAgZ2V0QWN0aXZlRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBTZXQgYWN0aXZlIGVsZW1lbnRzIGluIHRoZSB0b29sdGlwXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGFjdGl2ZUVsZW1lbnRzIEFycmF5IG9mIGFjdGl2ZSBkYXRhc2V0SW5kZXgvaW5kZXggcGFpcnMuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBldmVudFBvc2l0aW9uIFN5bnRoZXRpYyBldmVudCBwb3NpdGlvbiB1c2VkIGluIHBvc2l0aW9uaW5nXG5cdCAqL1xuICBzZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50cywgZXZlbnRQb3NpdGlvbikge1xuICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmU7XG4gICAgY29uc3QgYWN0aXZlID0gYWN0aXZlRWxlbWVudHMubWFwKCh7ZGF0YXNldEluZGV4LCBpbmRleH0pID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cbiAgICAgIGlmICghbWV0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIGEgZGF0YXNldCBhdCBpbmRleCAnICsgZGF0YXNldEluZGV4KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YXNldEluZGV4LFxuICAgICAgICBlbGVtZW50OiBtZXRhLmRhdGFbaW5kZXhdLFxuICAgICAgICBpbmRleCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29uc3QgY2hhbmdlZCA9ICFfZWxlbWVudHNFcXVhbChsYXN0QWN0aXZlLCBhY3RpdmUpO1xuICAgIGNvbnN0IHBvc2l0aW9uQ2hhbmdlZCA9IHRoaXMuX3Bvc2l0aW9uQ2hhbmdlZChhY3RpdmUsIGV2ZW50UG9zaXRpb24pO1xuXG4gICAgaWYgKGNoYW5nZWQgfHwgcG9zaXRpb25DaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBhY3RpdmU7XG4gICAgICB0aGlzLl9ldmVudFBvc2l0aW9uID0gZXZlbnRQb3NpdGlvbjtcbiAgICAgIHRoaXMuX2lnbm9yZVJlcGxheUV2ZW50cyA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcblx0ICogSGFuZGxlIGFuIGV2ZW50XG5cdCAqIEBwYXJhbSB7Q2hhcnRFdmVudH0gZSAtIFRoZSBldmVudCB0byBoYW5kbGVcblx0ICogQHBhcmFtIHtib29sZWFufSBbcmVwbGF5XSAtIFRoaXMgaXMgYSByZXBsYXllZCBldmVudCAoZnJvbSB1cGRhdGUpXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luQ2hhcnRBcmVhXSAtIFRoZSBldmVudCBpcyBpbnNpZGUgY2hhcnRBcmVhXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSB0b29sdGlwIGNoYW5nZWRcblx0ICovXG4gIGhhbmRsZUV2ZW50KGUsIHJlcGxheSwgaW5DaGFydEFyZWEgPSB0cnVlKSB7XG4gICAgaWYgKHJlcGxheSAmJiB0aGlzLl9pZ25vcmVSZXBsYXlFdmVudHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5faWdub3JlUmVwbGF5RXZlbnRzID0gZmFsc2U7XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGxhc3RBY3RpdmUgPSB0aGlzLl9hY3RpdmUgfHwgW107XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5fZ2V0QWN0aXZlRWxlbWVudHMoZSwgbGFzdEFjdGl2ZSwgcmVwbGF5LCBpbkNoYXJ0QXJlYSk7XG5cbiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpdGVtcyBzaG93biwgYnV0IHRoZSB0b29sdGlwIHBvc2l0aW9uIGlzIG5lYXJlc3QgbW9kZVxuICAgIC8vIGFuIHVwZGF0ZSBtYXkgbmVlZCB0byBiZSBtYWRlIGJlY2F1c2Ugb3VyIHBvc2l0aW9uIG1heSBoYXZlIGNoYW5nZWQgZXZlbiB0aG91Z2hcbiAgICAvLyB0aGUgaXRlbXMgYXJlIHRoZSBzYW1lIGFzIGJlZm9yZS5cbiAgICBjb25zdCBwb3NpdGlvbkNoYW5nZWQgPSB0aGlzLl9wb3NpdGlvbkNoYW5nZWQoYWN0aXZlLCBlKTtcblxuICAgIC8vIFJlbWVtYmVyIExhc3QgQWN0aXZlc1xuICAgIGNvbnN0IGNoYW5nZWQgPSByZXBsYXkgfHwgIV9lbGVtZW50c0VxdWFsKGFjdGl2ZSwgbGFzdEFjdGl2ZSkgfHwgcG9zaXRpb25DaGFuZ2VkO1xuXG4gICAgLy8gT25seSBoYW5kbGUgdGFyZ2V0IGV2ZW50IG9uIHRvb2x0aXAgY2hhbmdlXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZSA9IGFjdGl2ZTtcblxuICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlZCB8fCBvcHRpb25zLmV4dGVybmFsKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50UG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogZS54LFxuICAgICAgICAgIHk6IGUueVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudXBkYXRlKHRydWUsIHJlcGxheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICAvKipcblx0ICogSGVscGVyIGZvciBkZXRlcm1pbmluZyB0aGUgYWN0aXZlIGVsZW1lbnRzIGZvciBldmVudFxuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqIEBwYXJhbSB7SW50ZXJhY3Rpb25JdGVtW119IGxhc3RBY3RpdmUgLSBQcmV2aW91c2x5IGFjdGl2ZSBlbGVtZW50c1xuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXBsYXldIC0gVGhpcyBpcyBhIHJlcGxheWVkIGV2ZW50IChmcm9tIHVwZGF0ZSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbaW5DaGFydEFyZWFdIC0gVGhlIGV2ZW50IGlzIGluc2lkZSBjaGFydEFyZWFcblx0ICogQHJldHVybnMge0ludGVyYWN0aW9uSXRlbVtdfSAtIEFjdGl2ZSBlbGVtZW50c1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldEFjdGl2ZUVsZW1lbnRzKGUsIGxhc3RBY3RpdmUsIHJlcGxheSwgaW5DaGFydEFyZWEpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghaW5DaGFydEFyZWEpIHtcbiAgICAgIC8vIExldCB1c2VyIGNvbnRyb2wgdGhlIGFjdGl2ZSBlbGVtZW50cyBvdXRzaWRlIGNoYXJ0QXJlYS4gRWcuIHVzaW5nIExlZ2VuZC5cbiAgICAgIHJldHVybiBsYXN0QWN0aXZlO1xuICAgIH1cblxuICAgIC8vIEZpbmQgQWN0aXZlIEVsZW1lbnRzIGZvciB0b29sdGlwc1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuY2hhcnQuZ2V0RWxlbWVudHNBdEV2ZW50Rm9yTW9kZShlLCBvcHRpb25zLm1vZGUsIG9wdGlvbnMsIHJlcGxheSk7XG5cbiAgICBpZiAob3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICBhY3RpdmUucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3RpdmU7XG4gIH1cblxuICAvKipcblx0ICogRGV0ZXJtaW5lIGlmIHRoZSBhY3RpdmUgZWxlbWVudHMgKyBldmVudCBjb21iaW5hdGlvbiBjaGFuZ2VzIHRoZVxuXHQgKiB0b29sdGlwIHBvc2l0aW9uXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGFjdGl2ZSAtIEFjdGl2ZSBlbGVtZW50c1xuXHQgKiBAcGFyYW0ge0NoYXJ0RXZlbnR9IGUgLSBFdmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgcG9zaXRpb24gY2hhbmdlXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwb3NpdGlvbiBoYXMgY2hhbmdlZFxuXHQgKi9cbiAgX3Bvc2l0aW9uQ2hhbmdlZChhY3RpdmUsIGUpIHtcbiAgICBjb25zdCB7Y2FyZXRYLCBjYXJldFksIG9wdGlvbnN9ID0gdGhpcztcbiAgICBjb25zdCBwb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdGlvbnMucG9zaXRpb25dLmNhbGwodGhpcywgYWN0aXZlLCBlKTtcbiAgICByZXR1cm4gcG9zaXRpb24gIT09IGZhbHNlICYmIChjYXJldFggIT09IHBvc2l0aW9uLnggfHwgY2FyZXRZICE9PSBwb3NpdGlvbi55KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlkOiAndG9vbHRpcCcsXG4gIF9lbGVtZW50OiBUb29sdGlwLFxuICBwb3NpdGlvbmVycyxcblxuICBhZnRlckluaXQoY2hhcnQsIF9hcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGNoYXJ0LnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh7Y2hhcnQsIG9wdGlvbnN9KTtcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlVXBkYXRlKGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGlmIChjaGFydC50b29sdGlwKSB7XG4gICAgICBjaGFydC50b29sdGlwLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIHJlc2V0KGNoYXJ0LCBfYXJncywgb3B0aW9ucykge1xuICAgIGlmIChjaGFydC50b29sdGlwKSB7XG4gICAgICBjaGFydC50b29sdGlwLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgfVxuICB9LFxuXG4gIGFmdGVyRHJhdyhjaGFydCkge1xuICAgIGNvbnN0IHRvb2x0aXAgPSBjaGFydC50b29sdGlwO1xuXG4gICAgaWYgKHRvb2x0aXAgJiYgdG9vbHRpcC5fd2lsbFJlbmRlcigpKSB7XG4gICAgICBjb25zdCBhcmdzID0ge1xuICAgICAgICB0b29sdGlwXG4gICAgICB9O1xuXG4gICAgICBpZiAoY2hhcnQubm90aWZ5UGx1Z2lucygnYmVmb3JlVG9vbHRpcERyYXcnLCB7Li4uYXJncywgY2FuY2VsYWJsZTogdHJ1ZX0pID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRvb2x0aXAuZHJhdyhjaGFydC5jdHgpO1xuXG4gICAgICBjaGFydC5ub3RpZnlQbHVnaW5zKCdhZnRlclRvb2x0aXBEcmF3JywgYXJncyk7XG4gICAgfVxuICB9LFxuXG4gIGFmdGVyRXZlbnQoY2hhcnQsIGFyZ3MpIHtcbiAgICBpZiAoY2hhcnQudG9vbHRpcCkge1xuICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIHJlcGxheWVkIGZyb20gYHVwZGF0ZWAsIHdlIHNob3VsZCBldmFsdWF0ZSB3aXRoIHRoZSBmaW5hbCBwb3NpdGlvbnMuXG4gICAgICBjb25zdCB1c2VGaW5hbFBvc2l0aW9uID0gYXJncy5yZXBsYXk7XG4gICAgICBpZiAoY2hhcnQudG9vbHRpcC5oYW5kbGVFdmVudChhcmdzLmV2ZW50LCB1c2VGaW5hbFBvc2l0aW9uLCBhcmdzLmluQ2hhcnRBcmVhKSkge1xuICAgICAgICAvLyBub3RpZnkgY2hhcnQgYWJvdXQgdGhlIGNoYW5nZSwgc28gaXQgd2lsbCByZW5kZXJcbiAgICAgICAgYXJncy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVmYXVsdHM6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGV4dGVybmFsOiBudWxsLFxuICAgIHBvc2l0aW9uOiAnYXZlcmFnZScsXG4gICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjgpJyxcbiAgICB0aXRsZUNvbG9yOiAnI2ZmZicsXG4gICAgdGl0bGVGb250OiB7XG4gICAgICB3ZWlnaHQ6ICdib2xkJyxcbiAgICB9LFxuICAgIHRpdGxlU3BhY2luZzogMixcbiAgICB0aXRsZU1hcmdpbkJvdHRvbTogNixcbiAgICB0aXRsZUFsaWduOiAnbGVmdCcsXG4gICAgYm9keUNvbG9yOiAnI2ZmZicsXG4gICAgYm9keVNwYWNpbmc6IDIsXG4gICAgYm9keUZvbnQ6IHtcbiAgICB9LFxuICAgIGJvZHlBbGlnbjogJ2xlZnQnLFxuICAgIGZvb3RlckNvbG9yOiAnI2ZmZicsXG4gICAgZm9vdGVyU3BhY2luZzogMixcbiAgICBmb290ZXJNYXJnaW5Ub3A6IDYsXG4gICAgZm9vdGVyRm9udDoge1xuICAgICAgd2VpZ2h0OiAnYm9sZCcsXG4gICAgfSxcbiAgICBmb290ZXJBbGlnbjogJ2xlZnQnLFxuICAgIHBhZGRpbmc6IDYsXG4gICAgY2FyZXRQYWRkaW5nOiAyLFxuICAgIGNhcmV0U2l6ZTogNSxcbiAgICBjb3JuZXJSYWRpdXM6IDYsXG4gICAgYm94SGVpZ2h0OiAoY3R4LCBvcHRzKSA9PiBvcHRzLmJvZHlGb250LnNpemUsXG4gICAgYm94V2lkdGg6IChjdHgsIG9wdHMpID0+IG9wdHMuYm9keUZvbnQuc2l6ZSxcbiAgICBtdWx0aUtleUJhY2tncm91bmQ6ICcjZmZmJyxcbiAgICBkaXNwbGF5Q29sb3JzOiB0cnVlLFxuICAgIGJveFBhZGRpbmc6IDAsXG4gICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsMCwwLDApJyxcbiAgICBib3JkZXJXaWR0aDogMCxcbiAgICBhbmltYXRpb246IHtcbiAgICAgIGR1cmF0aW9uOiA0MDAsXG4gICAgICBlYXNpbmc6ICdlYXNlT3V0UXVhcnQnLFxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgbnVtYmVyczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgcHJvcGVydGllczogWyd4JywgJ3knLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2NhcmV0WCcsICdjYXJldFknXSxcbiAgICAgIH0sXG4gICAgICBvcGFjaXR5OiB7XG4gICAgICAgIGVhc2luZzogJ2xpbmVhcicsXG4gICAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICAgIH1cbiAgICB9LFxuICAgIGNhbGxiYWNrczogZGVmYXVsdENhbGxiYWNrc1xuICB9LFxuXG4gIGRlZmF1bHRSb3V0ZXM6IHtcbiAgICBib2R5Rm9udDogJ2ZvbnQnLFxuICAgIGZvb3RlckZvbnQ6ICdmb250JyxcbiAgICB0aXRsZUZvbnQ6ICdmb250J1xuICB9LFxuXG4gIGRlc2NyaXB0b3JzOiB7XG4gICAgX3NjcmlwdGFibGU6IChuYW1lKSA9PiBuYW1lICE9PSAnZmlsdGVyJyAmJiBuYW1lICE9PSAnaXRlbVNvcnQnICYmIG5hbWUgIT09ICdleHRlcm5hbCcsXG4gICAgX2luZGV4YWJsZTogZmFsc2UsXG4gICAgY2FsbGJhY2tzOiB7XG4gICAgICBfc2NyaXB0YWJsZTogZmFsc2UsXG4gICAgICBfaW5kZXhhYmxlOiBmYWxzZSxcbiAgICB9LFxuICAgIGFuaW1hdGlvbjoge1xuICAgICAgX2ZhbGxiYWNrOiBmYWxzZVxuICAgIH0sXG4gICAgYW5pbWF0aW9uczoge1xuICAgICAgX2ZhbGxiYWNrOiAnYW5pbWF0aW9uJ1xuICAgIH1cbiAgfSxcblxuICAvLyBSZXNvbHZlIGFkZGl0aW9uYWxseSBmcm9tIGBpbnRlcmFjdGlvbmAgb3B0aW9ucyBhbmQgZGVmYXVsdHMuXG4gIGFkZGl0aW9uYWxPcHRpb25TY29wZXM6IFsnaW50ZXJhY3Rpb24nXVxufTtcbiIsICJpbXBvcnQgU2NhbGUgZnJvbSAnLi4vY29yZS9jb3JlLnNjYWxlLmpzJztcbmltcG9ydCB7aXNOdWxsT3JVbmRlZiwgdmFsdWVPckRlZmF1bHQsIF9saW1pdFZhbHVlfSBmcm9tICcuLi9oZWxwZXJzL2luZGV4LmpzJztcblxuY29uc3QgYWRkSWZTdHJpbmcgPSAobGFiZWxzLCByYXcsIGluZGV4LCBhZGRlZExhYmVscykgPT4ge1xuICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICBpbmRleCA9IGxhYmVscy5wdXNoKHJhdykgLSAxO1xuICAgIGFkZGVkTGFiZWxzLnVuc2hpZnQoe2luZGV4LCBsYWJlbDogcmF3fSk7XG4gIH0gZWxzZSBpZiAoaXNOYU4ocmF3KSkge1xuICAgIGluZGV4ID0gbnVsbDtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59O1xuXG5mdW5jdGlvbiBmaW5kT3JBZGRMYWJlbChsYWJlbHMsIHJhdywgaW5kZXgsIGFkZGVkTGFiZWxzKSB7XG4gIGNvbnN0IGZpcnN0ID0gbGFiZWxzLmluZGV4T2YocmF3KTtcbiAgaWYgKGZpcnN0ID09PSAtMSkge1xuICAgIHJldHVybiBhZGRJZlN0cmluZyhsYWJlbHMsIHJhdywgaW5kZXgsIGFkZGVkTGFiZWxzKTtcbiAgfVxuICBjb25zdCBsYXN0ID0gbGFiZWxzLmxhc3RJbmRleE9mKHJhdyk7XG4gIHJldHVybiBmaXJzdCAhPT0gbGFzdCA/IGluZGV4IDogZmlyc3Q7XG59XG5cbmNvbnN0IHZhbGlkSW5kZXggPSAoaW5kZXgsIG1heCkgPT4gaW5kZXggPT09IG51bGwgPyBudWxsIDogX2xpbWl0VmFsdWUoTWF0aC5yb3VuZChpbmRleCksIDAsIG1heCk7XG5cbmZ1bmN0aW9uIF9nZXRMYWJlbEZvclZhbHVlKHZhbHVlKSB7XG4gIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG5cbiAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPCBsYWJlbHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGxhYmVsc1t2YWx1ZV07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeVNjYWxlIGV4dGVuZHMgU2NhbGUge1xuXG4gIHN0YXRpYyBpZCA9ICdjYXRlZ29yeSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgdGlja3M6IHtcbiAgICAgIGNhbGxiYWNrOiBfZ2V0TGFiZWxGb3JWYWx1ZVxuICAgIH1cbiAgfTtcblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcihjZmcpO1xuXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92YWx1ZVJhbmdlID0gMDtcbiAgICB0aGlzLl9hZGRlZExhYmVscyA9IFtdO1xuICB9XG5cbiAgaW5pdChzY2FsZU9wdGlvbnMpIHtcbiAgICBjb25zdCBhZGRlZCA9IHRoaXMuX2FkZGVkTGFiZWxzO1xuICAgIGlmIChhZGRlZC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgICBmb3IgKGNvbnN0IHtpbmRleCwgbGFiZWx9IG9mIGFkZGVkKSB7XG4gICAgICAgIGlmIChsYWJlbHNbaW5kZXhdID09PSBsYWJlbCkge1xuICAgICAgICAgIGxhYmVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9hZGRlZExhYmVscyA9IFtdO1xuICAgIH1cbiAgICBzdXBlci5pbml0KHNjYWxlT3B0aW9ucyk7XG4gIH1cblxuICBwYXJzZShyYXcsIGluZGV4KSB7XG4gICAgaWYgKGlzTnVsbE9yVW5kZWYocmF3KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgaW5kZXggPSBpc0Zpbml0ZShpbmRleCkgJiYgbGFiZWxzW2luZGV4XSA9PT0gcmF3ID8gaW5kZXhcbiAgICAgIDogZmluZE9yQWRkTGFiZWwobGFiZWxzLCByYXcsIHZhbHVlT3JEZWZhdWx0KGluZGV4LCByYXcpLCB0aGlzLl9hZGRlZExhYmVscyk7XG4gICAgcmV0dXJuIHZhbGlkSW5kZXgoaW5kZXgsIGxhYmVscy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgY29uc3Qge21pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IHttaW4sIG1heH0gPSB0aGlzLmdldE1pbk1heCh0cnVlKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICBpZiAoIW1pbkRlZmluZWQpIHtcbiAgICAgICAgbWluID0gMDtcbiAgICAgIH1cbiAgICAgIGlmICghbWF4RGVmaW5lZCkge1xuICAgICAgICBtYXggPSB0aGlzLmdldExhYmVscygpLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH1cblxuICBidWlsZFRpY2tzKCkge1xuICAgIGNvbnN0IG1pbiA9IHRoaXMubWluO1xuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4O1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub3B0aW9ucy5vZmZzZXQ7XG4gICAgY29uc3QgdGlja3MgPSBbXTtcbiAgICBsZXQgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcblxuICAgIC8vIElmIHdlIGFyZSB2aWV3aW5nIHNvbWUgc3Vic2V0IG9mIGxhYmVscywgc2xpY2UgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgbGFiZWxzID0gKG1pbiA9PT0gMCAmJiBtYXggPT09IGxhYmVscy5sZW5ndGggLSAxKSA/IGxhYmVscyA6IGxhYmVscy5zbGljZShtaW4sIG1heCArIDEpO1xuXG4gICAgdGhpcy5fdmFsdWVSYW5nZSA9IE1hdGgubWF4KGxhYmVscy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpLCAxKTtcbiAgICB0aGlzLl9zdGFydFZhbHVlID0gdGhpcy5taW4gLSAob2Zmc2V0ID8gMC41IDogMCk7XG5cbiAgICBmb3IgKGxldCB2YWx1ZSA9IG1pbjsgdmFsdWUgPD0gbWF4OyB2YWx1ZSsrKSB7XG4gICAgICB0aWNrcy5wdXNoKHt2YWx1ZX0pO1xuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICBnZXRMYWJlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIF9nZXRMYWJlbEZvclZhbHVlLmNhbGwodGhpcywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGNvbmZpZ3VyZSgpIHtcbiAgICBzdXBlci5jb25maWd1cmUoKTtcblxuICAgIGlmICghdGhpcy5pc0hvcml6b250YWwoKSkge1xuICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHZlcnRpY2FsIGNhdGVnb3J5IHNjYWxlIHJldmVyc2UgaXMgaW52ZXJ0ZWQuXG4gICAgICB0aGlzLl9yZXZlcnNlUGl4ZWxzID0gIXRoaXMuX3JldmVyc2VQaXhlbHM7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlZCB0byBnZXQgZGF0YSB2YWx1ZSBsb2NhdGlvbnMuIFZhbHVlIGNhbiBlaXRoZXIgYmUgYW4gaW5kZXggb3IgYSBudW1lcmljYWwgdmFsdWVcbiAgZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMucGFyc2UodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IE5hTiA6IHRoaXMuZ2V0UGl4ZWxGb3JEZWNpbWFsKCh2YWx1ZSAtIHRoaXMuX3N0YXJ0VmFsdWUpIC8gdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cblxuICAvLyBNdXN0IG92ZXJyaWRlIGJhc2UgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBpdCBjYWxscyBnZXRQaXhlbEZvclZhbHVlXG4gIC8vIGFuZCBjYXRlZ29yeSBzY2FsZSBjYW4gaGF2ZSBkdXBsaWNhdGUgdmFsdWVzXG4gIGdldFBpeGVsRm9yVGljayhpbmRleCkge1xuICAgIGNvbnN0IHRpY2tzID0gdGhpcy50aWNrcztcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlja3MubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGlja3NbaW5kZXhdLnZhbHVlKTtcbiAgfVxuXG4gIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLl9zdGFydFZhbHVlICsgdGhpcy5nZXREZWNpbWFsRm9yUGl4ZWwocGl4ZWwpICogdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cblxuICBnZXRCYXNlUGl4ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYm90dG9tO1xuICB9XG59XG4iLCAiaW1wb3J0IHtpc051bGxPclVuZGVmfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29yZS5qcyc7XG5pbXBvcnQge2FsbW9zdEVxdWFscywgYWxtb3N0V2hvbGUsIG5pY2VOdW0sIF9kZWNpbWFsUGxhY2VzLCBfc2V0TWluQW5kTWF4QnlLZXksIHNpZ24sIHRvUmFkaWFuc30gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLm1hdGguanMnO1xuaW1wb3J0IFNjYWxlIGZyb20gJy4uL2NvcmUvY29yZS5zY2FsZS5qcyc7XG5pbXBvcnQge2Zvcm1hdE51bWJlcn0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmludGwuanMnO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxpbmVhciB0aWNrcyBmb3IgYW4gYXhpc1xuICogMS4gSWYgZ2VuZXJhdGlvbk9wdGlvbnMubWluLCBnZW5lcmF0aW9uT3B0aW9ucy5tYXgsIGFuZCBnZW5lcmF0aW9uT3B0aW9ucy5zdGVwIGFyZSBkZWZpbmVkOlxuICogICAgaWYgKG1heCAtIG1pbikgLyBzdGVwIGlzIGFuIGludGVnZXIsIHRpY2tzIGFyZSBnZW5lcmF0ZWQgYXMgW21pbiwgbWluICsgc3RlcCwgLi4uLCBtYXhdXG4gKiAgICBOb3RlIHRoYXQgdGhlIGdlbmVyYXRpb25PcHRpb25zLm1heENvdW50IHNldHRpbmcgaXMgcmVzcGVjdGVkIGluIHRoaXMgc2NlbmFyaW9cbiAqXG4gKiAyLiBJZiBnZW5lcmF0aW9uT3B0aW9ucy5taW4sIGdlbmVyYXRpb25PcHRpb25zLm1heCwgYW5kIGdlbmVyYXRpb25PcHRpb25zLmNvdW50IGlzIGRlZmluZWRcbiAqICAgIHNwYWNpbmcgPSAobWF4IC0gbWluKSAvIGNvdW50XG4gKiAgICBUaWNrcyBhcmUgZ2VuZXJhdGVkIGFzIFttaW4sIG1pbiArIHNwYWNpbmcsIC4uLiwgbWF4XVxuICpcbiAqIDMuIElmIGdlbmVyYXRpb25PcHRpb25zLmNvdW50IGlzIGRlZmluZWRcbiAqICAgIHNwYWNpbmcgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gY291bnRcbiAqXG4gKiA0LiBDb21wdXRlIG9wdGltYWwgc3BhY2luZyBvZiB0aWNrcyB1c2luZyBuaWNlTnVtIGFsZ29yaXRobVxuICpcbiAqIEBwYXJhbSBnZW5lcmF0aW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0aWNrc1xuICogQHBhcmFtIGRhdGFSYW5nZSB0aGUgcmFuZ2Ugb2YgdGhlIGRhdGFcbiAqIEByZXR1cm5zIHtvYmplY3RbXX0gYXJyYXkgb2YgdGljayBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVGlja3MoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xuICBjb25zdCB0aWNrcyA9IFtdO1xuICAvLyBUbyBnZXQgYSBcIm5pY2VcIiB2YWx1ZSBmb3IgdGhlIHRpY2sgc3BhY2luZywgd2Ugd2lsbCB1c2UgdGhlIGFwcHJvcHJpYXRlbHkgbmFtZWRcbiAgLy8gXCJuaWNlIG51bWJlclwiIGFsZ29yaXRobS4gU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg1MDY4ODEvbmljZS1sYWJlbC1hbGdvcml0aG0tZm9yLWNoYXJ0cy13aXRoLW1pbmltdW0tdGlja3NcbiAgLy8gZm9yIGRldGFpbHMuXG5cbiAgY29uc3QgTUlOX1NQQUNJTkcgPSAxZS0xNDtcbiAgY29uc3Qge2JvdW5kcywgc3RlcCwgbWluLCBtYXgsIHByZWNpc2lvbiwgY291bnQsIG1heFRpY2tzLCBtYXhEaWdpdHMsIGluY2x1ZGVCb3VuZHN9ID0gZ2VuZXJhdGlvbk9wdGlvbnM7XG4gIGNvbnN0IHVuaXQgPSBzdGVwIHx8IDE7XG4gIGNvbnN0IG1heFNwYWNlcyA9IG1heFRpY2tzIC0gMTtcbiAgY29uc3Qge21pbjogcm1pbiwgbWF4OiBybWF4fSA9IGRhdGFSYW5nZTtcbiAgY29uc3QgbWluRGVmaW5lZCA9ICFpc051bGxPclVuZGVmKG1pbik7XG4gIGNvbnN0IG1heERlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihtYXgpO1xuICBjb25zdCBjb3VudERlZmluZWQgPSAhaXNOdWxsT3JVbmRlZihjb3VudCk7XG4gIGNvbnN0IG1pblNwYWNpbmcgPSAocm1heCAtIHJtaW4pIC8gKG1heERpZ2l0cyArIDEpO1xuICBsZXQgc3BhY2luZyA9IG5pY2VOdW0oKHJtYXggLSBybWluKSAvIG1heFNwYWNlcyAvIHVuaXQpICogdW5pdDtcbiAgbGV0IGZhY3RvciwgbmljZU1pbiwgbmljZU1heCwgbnVtU3BhY2VzO1xuXG4gIC8vIEJleW9uZCBNSU5fU1BBQ0lORyBmbG9hdGluZyBwb2ludCBudW1iZXJzIGJlaW5nIHRvIGxvc2UgcHJlY2lzaW9uXG4gIC8vIHN1Y2ggdGhhdCB3ZSBjYW4ndCBkbyB0aGUgbWF0aCBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgdGlja3NcbiAgaWYgKHNwYWNpbmcgPCBNSU5fU1BBQ0lORyAmJiAhbWluRGVmaW5lZCAmJiAhbWF4RGVmaW5lZCkge1xuICAgIHJldHVybiBbe3ZhbHVlOiBybWlufSwge3ZhbHVlOiBybWF4fV07XG4gIH1cblxuICBudW1TcGFjZXMgPSBNYXRoLmNlaWwocm1heCAvIHNwYWNpbmcpIC0gTWF0aC5mbG9vcihybWluIC8gc3BhY2luZyk7XG4gIGlmIChudW1TcGFjZXMgPiBtYXhTcGFjZXMpIHtcbiAgICAvLyBJZiB0aGUgY2FsY3VsYXRlZCBudW0gb2Ygc3BhY2VzIGV4Y2VlZHMgbWF4TnVtU3BhY2VzLCByZWNhbGN1bGF0ZSBpdFxuICAgIHNwYWNpbmcgPSBuaWNlTnVtKG51bVNwYWNlcyAqIHNwYWNpbmcgLyBtYXhTcGFjZXMgLyB1bml0KSAqIHVuaXQ7XG4gIH1cblxuICBpZiAoIWlzTnVsbE9yVW5kZWYocHJlY2lzaW9uKSkge1xuICAgIC8vIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhIHByZWNpc2lvbiwgcm91bmQgdG8gdGhhdCBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAgICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcbiAgICBzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcgKiBmYWN0b3IpIC8gZmFjdG9yO1xuICB9XG5cbiAgaWYgKGJvdW5kcyA9PT0gJ3RpY2tzJykge1xuICAgIG5pY2VNaW4gPSBNYXRoLmZsb29yKHJtaW4gLyBzcGFjaW5nKSAqIHNwYWNpbmc7XG4gICAgbmljZU1heCA9IE1hdGguY2VpbChybWF4IC8gc3BhY2luZykgKiBzcGFjaW5nO1xuICB9IGVsc2Uge1xuICAgIG5pY2VNaW4gPSBybWluO1xuICAgIG5pY2VNYXggPSBybWF4O1xuICB9XG5cbiAgaWYgKG1pbkRlZmluZWQgJiYgbWF4RGVmaW5lZCAmJiBzdGVwICYmIGFsbW9zdFdob2xlKChtYXggLSBtaW4pIC8gc3RlcCwgc3BhY2luZyAvIDEwMDApKSB7XG4gICAgLy8gQ2FzZSAxOiBJZiBtaW4sIG1heCBhbmQgc3RlcFNpemUgYXJlIHNldCBhbmQgdGhleSBtYWtlIGFuIGV2ZW5seSBzcGFjZWQgc2NhbGUgdXNlIGl0LlxuICAgIC8vIHNwYWNpbmcgPSBzdGVwO1xuICAgIC8vIG51bVNwYWNlcyA9IChtYXggLSBtaW4pIC8gc3BhY2luZztcbiAgICAvLyBOb3RlIHRoYXQgd2Ugcm91bmQgaGVyZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYWxtb3N0V2hvbGUgdHJhbnNsYXRlZCBhbiBGUCBlcnJvclxuICAgIG51bVNwYWNlcyA9IE1hdGgucm91bmQoTWF0aC5taW4oKG1heCAtIG1pbikgLyBzcGFjaW5nLCBtYXhUaWNrcykpO1xuICAgIHNwYWNpbmcgPSAobWF4IC0gbWluKSAvIG51bVNwYWNlcztcbiAgICBuaWNlTWluID0gbWluO1xuICAgIG5pY2VNYXggPSBtYXg7XG4gIH0gZWxzZSBpZiAoY291bnREZWZpbmVkKSB7XG4gICAgLy8gQ2FzZXMgMiAmIDMsIHdlIGhhdmUgYSBjb3VudCBzcGVjaWZpZWQuIEhhbmRsZSBvcHRpb25hbCB1c2VyIGRlZmluZWQgZWRnZXMgdG8gdGhlIHJhbmdlLlxuICAgIC8vIFNvbWV0aW1lcyB0aGVzZSBhcmUgbm8tb3BzLCBidXQgaXQgbWFrZXMgdGhlIGNvZGUgYSBsb3QgY2xlYXJlclxuICAgIC8vIGFuZCB3aGVuIGEgdXNlciBkZWZpbmVkIHJhbmdlIGlzIHNwZWNpZmllZCwgd2Ugd2FudCB0aGUgY29ycmVjdCB0aWNrc1xuICAgIG5pY2VNaW4gPSBtaW5EZWZpbmVkID8gbWluIDogbmljZU1pbjtcbiAgICBuaWNlTWF4ID0gbWF4RGVmaW5lZCA/IG1heCA6IG5pY2VNYXg7XG4gICAgbnVtU3BhY2VzID0gY291bnQgLSAxO1xuICAgIHNwYWNpbmcgPSAobmljZU1heCAtIG5pY2VNaW4pIC8gbnVtU3BhY2VzO1xuICB9IGVsc2Uge1xuICAgIC8vIENhc2UgNFxuICAgIG51bVNwYWNlcyA9IChuaWNlTWF4IC0gbmljZU1pbikgLyBzcGFjaW5nO1xuXG4gICAgLy8gSWYgdmVyeSBjbG9zZSB0byBvdXIgcm91bmRlZCB2YWx1ZSwgdXNlIGl0LlxuICAgIGlmIChhbG1vc3RFcXVhbHMobnVtU3BhY2VzLCBNYXRoLnJvdW5kKG51bVNwYWNlcyksIHNwYWNpbmcgLyAxMDAwKSkge1xuICAgICAgbnVtU3BhY2VzID0gTWF0aC5yb3VuZChudW1TcGFjZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1TcGFjZXMgPSBNYXRoLmNlaWwobnVtU3BhY2VzKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgc3BhY2luZyB3aWxsIGhhdmUgY2hhbmdlZCBpbiBjYXNlcyAxLCAyLCBhbmQgMyBzbyB0aGUgZmFjdG9yIGNhbm5vdCBiZSBjb21wdXRlZFxuICAvLyB1bnRpbCB0aGlzIHBvaW50XG4gIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBNYXRoLm1heChcbiAgICBfZGVjaW1hbFBsYWNlcyhzcGFjaW5nKSxcbiAgICBfZGVjaW1hbFBsYWNlcyhuaWNlTWluKVxuICApO1xuICBmYWN0b3IgPSBNYXRoLnBvdygxMCwgaXNOdWxsT3JVbmRlZihwcmVjaXNpb24pID8gZGVjaW1hbFBsYWNlcyA6IHByZWNpc2lvbik7XG4gIG5pY2VNaW4gPSBNYXRoLnJvdW5kKG5pY2VNaW4gKiBmYWN0b3IpIC8gZmFjdG9yO1xuICBuaWNlTWF4ID0gTWF0aC5yb3VuZChuaWNlTWF4ICogZmFjdG9yKSAvIGZhY3RvcjtcblxuICBsZXQgaiA9IDA7XG4gIGlmIChtaW5EZWZpbmVkKSB7XG4gICAgaWYgKGluY2x1ZGVCb3VuZHMgJiYgbmljZU1pbiAhPT0gbWluKSB7XG4gICAgICB0aWNrcy5wdXNoKHt2YWx1ZTogbWlufSk7XG5cbiAgICAgIGlmIChuaWNlTWluIDwgbWluKSB7XG4gICAgICAgIGorKzsgLy8gU2tpcCBuaWNlTWluXG4gICAgICB9XG4gICAgICAvLyBJZiB0aGUgbmV4dCBuaWNlIHRpY2sgaXMgY2xvc2UgdG8gbWluLCBza2lwIGl0XG4gICAgICBpZiAoYWxtb3N0RXF1YWxzKE1hdGgucm91bmQoKG5pY2VNaW4gKyBqICogc3BhY2luZykgKiBmYWN0b3IpIC8gZmFjdG9yLCBtaW4sIHJlbGF0aXZlTGFiZWxTaXplKG1pbiwgbWluU3BhY2luZywgZ2VuZXJhdGlvbk9wdGlvbnMpKSkge1xuICAgICAgICBqKys7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuaWNlTWluIDwgbWluKSB7XG4gICAgICBqKys7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBudW1TcGFjZXM7ICsraikge1xuICAgIHRpY2tzLnB1c2goe3ZhbHVlOiBNYXRoLnJvdW5kKChuaWNlTWluICsgaiAqIHNwYWNpbmcpICogZmFjdG9yKSAvIGZhY3Rvcn0pO1xuICB9XG5cbiAgaWYgKG1heERlZmluZWQgJiYgaW5jbHVkZUJvdW5kcyAmJiBuaWNlTWF4ICE9PSBtYXgpIHtcbiAgICAvLyBJZiB0aGUgcHJldmlvdXMgdGljayBpcyB0b28gY2xvc2UgdG8gbWF4LCByZXBsYWNlIGl0IHdpdGggbWF4LCBlbHNlIGFkZCBtYXhcbiAgICBpZiAodGlja3MubGVuZ3RoICYmIGFsbW9zdEVxdWFscyh0aWNrc1t0aWNrcy5sZW5ndGggLSAxXS52YWx1ZSwgbWF4LCByZWxhdGl2ZUxhYmVsU2l6ZShtYXgsIG1pblNwYWNpbmcsIGdlbmVyYXRpb25PcHRpb25zKSkpIHtcbiAgICAgIHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlID0gbWF4O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aWNrcy5wdXNoKHt2YWx1ZTogbWF4fSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFtYXhEZWZpbmVkIHx8IG5pY2VNYXggPT09IG1heCkge1xuICAgIHRpY2tzLnB1c2goe3ZhbHVlOiBuaWNlTWF4fSk7XG4gIH1cblxuICByZXR1cm4gdGlja3M7XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZlTGFiZWxTaXplKHZhbHVlLCBtaW5TcGFjaW5nLCB7aG9yaXpvbnRhbCwgbWluUm90YXRpb259KSB7XG4gIGNvbnN0IHJhZCA9IHRvUmFkaWFucyhtaW5Sb3RhdGlvbik7XG4gIGNvbnN0IHJhdGlvID0gKGhvcml6b250YWwgPyBNYXRoLnNpbihyYWQpIDogTWF0aC5jb3MocmFkKSkgfHwgMC4wMDE7XG4gIGNvbnN0IGxlbmd0aCA9IDAuNzUgKiBtaW5TcGFjaW5nICogKCcnICsgdmFsdWUpLmxlbmd0aDtcbiAgcmV0dXJuIE1hdGgubWluKG1pblNwYWNpbmcgLyByYXRpbywgbGVuZ3RoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGluZWFyU2NhbGVCYXNlIGV4dGVuZHMgU2NhbGUge1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKGNmZyk7XG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuZW5kID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuX3N0YXJ0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fZW5kVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmFsdWVSYW5nZSA9IDA7XG4gIH1cblxuICBwYXJzZShyYXcsIGluZGV4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBpZiAoaXNOdWxsT3JVbmRlZihyYXcpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCh0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyB8fCByYXcgaW5zdGFuY2VvZiBOdW1iZXIpICYmICFpc0Zpbml0ZSgrcmF3KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuICtyYXc7XG4gIH1cblxuICBoYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCkge1xuICAgIGNvbnN0IHtiZWdpbkF0WmVyb30gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qge21pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IHttaW4sIG1heH0gPSB0aGlzO1xuXG4gICAgY29uc3Qgc2V0TWluID0gdiA9PiAobWluID0gbWluRGVmaW5lZCA/IG1pbiA6IHYpO1xuICAgIGNvbnN0IHNldE1heCA9IHYgPT4gKG1heCA9IG1heERlZmluZWQgPyBtYXggOiB2KTtcblxuICAgIGlmIChiZWdpbkF0WmVybykge1xuICAgICAgY29uc3QgbWluU2lnbiA9IHNpZ24obWluKTtcbiAgICAgIGNvbnN0IG1heFNpZ24gPSBzaWduKG1heCk7XG5cbiAgICAgIGlmIChtaW5TaWduIDwgMCAmJiBtYXhTaWduIDwgMCkge1xuICAgICAgICBzZXRNYXgoMCk7XG4gICAgICB9IGVsc2UgaWYgKG1pblNpZ24gPiAwICYmIG1heFNpZ24gPiAwKSB7XG4gICAgICAgIHNldE1pbigwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIGxldCBvZmZzZXQgPSBtYXggPT09IDAgPyAxIDogTWF0aC5hYnMobWF4ICogMC4wNSk7XG5cbiAgICAgIHNldE1heChtYXggKyBvZmZzZXQpO1xuXG4gICAgICBpZiAoIWJlZ2luQXRaZXJvKSB7XG4gICAgICAgIHNldE1pbihtaW4gLSBvZmZzZXQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgfVxuXG4gIGdldFRpY2tMaW1pdCgpIHtcbiAgICBjb25zdCB0aWNrT3B0cyA9IHRoaXMub3B0aW9ucy50aWNrcztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHttYXhUaWNrc0xpbWl0LCBzdGVwU2l6ZX0gPSB0aWNrT3B0cztcbiAgICBsZXQgbWF4VGlja3M7XG5cbiAgICBpZiAoc3RlcFNpemUpIHtcbiAgICAgIG1heFRpY2tzID0gTWF0aC5jZWlsKHRoaXMubWF4IC8gc3RlcFNpemUpIC0gTWF0aC5mbG9vcih0aGlzLm1pbiAvIHN0ZXBTaXplKSArIDE7XG4gICAgICBpZiAobWF4VGlja3MgPiAxMDAwKSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihgc2NhbGVzLiR7dGhpcy5pZH0udGlja3Muc3RlcFNpemU6ICR7c3RlcFNpemV9IHdvdWxkIHJlc3VsdCBnZW5lcmF0aW5nIHVwIHRvICR7bWF4VGlja3N9IHRpY2tzLiBMaW1pdGluZyB0byAxMDAwLmApO1xuICAgICAgICBtYXhUaWNrcyA9IDEwMDA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1heFRpY2tzID0gdGhpcy5jb21wdXRlVGlja0xpbWl0KCk7XG4gICAgICBtYXhUaWNrc0xpbWl0ID0gbWF4VGlja3NMaW1pdCB8fCAxMTtcbiAgICB9XG5cbiAgICBpZiAobWF4VGlja3NMaW1pdCkge1xuICAgICAgbWF4VGlja3MgPSBNYXRoLm1pbihtYXhUaWNrc0xpbWl0LCBtYXhUaWNrcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1heFRpY2tzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGNvbXB1dGVUaWNrTGltaXQoKSB7XG4gICAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgfVxuXG4gIGJ1aWxkVGlja3MoKSB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cbiAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdGhlIG1heCBudW1iZXIgb2YgdGlja3Mgd2UgY2FuIHN1cHBvcnQgaXQgaXMgYmFzZWQgb24gdGhlIHNpemUgb2ZcbiAgICAvLyB0aGUgYXhpcyBhcmVhLiBGb3Igbm93LCB3ZSBzYXkgdGhhdCB0aGUgbWluaW11bSB0aWNrIHNwYWNpbmcgaW4gcGl4ZWxzIG11c3QgYmUgNDBcbiAgICAvLyBXZSBhbHNvIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyB0byAxMSB3aGljaCBnaXZlcyBhIG5pY2UgMTAgc3F1YXJlcyBvblxuICAgIC8vIHRoZSBncmFwaC4gTWFrZSBzdXJlIHdlIGFsd2F5cyBoYXZlIGF0IGxlYXN0IDIgdGlja3NcbiAgICBsZXQgbWF4VGlja3MgPSB0aGlzLmdldFRpY2tMaW1pdCgpO1xuICAgIG1heFRpY2tzID0gTWF0aC5tYXgoMiwgbWF4VGlja3MpO1xuXG4gICAgY29uc3QgbnVtZXJpY0dlbmVyYXRvck9wdGlvbnMgPSB7XG4gICAgICBtYXhUaWNrcyxcbiAgICAgIGJvdW5kczogb3B0cy5ib3VuZHMsXG4gICAgICBtaW46IG9wdHMubWluLFxuICAgICAgbWF4OiBvcHRzLm1heCxcbiAgICAgIHByZWNpc2lvbjogdGlja09wdHMucHJlY2lzaW9uLFxuICAgICAgc3RlcDogdGlja09wdHMuc3RlcFNpemUsXG4gICAgICBjb3VudDogdGlja09wdHMuY291bnQsXG4gICAgICBtYXhEaWdpdHM6IHRoaXMuX21heERpZ2l0cygpLFxuICAgICAgaG9yaXpvbnRhbDogdGhpcy5pc0hvcml6b250YWwoKSxcbiAgICAgIG1pblJvdGF0aW9uOiB0aWNrT3B0cy5taW5Sb3RhdGlvbiB8fCAwLFxuICAgICAgaW5jbHVkZUJvdW5kczogdGlja09wdHMuaW5jbHVkZUJvdW5kcyAhPT0gZmFsc2VcbiAgICB9O1xuICAgIGNvbnN0IGRhdGFSYW5nZSA9IHRoaXMuX3JhbmdlIHx8IHRoaXM7XG4gICAgY29uc3QgdGlja3MgPSBnZW5lcmF0ZVRpY2tzKG51bWVyaWNHZW5lcmF0b3JPcHRpb25zLCBkYXRhUmFuZ2UpO1xuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG1heCBhbmQgbWluIGdpdmVuIHRoZSB0aWNrIHZhbHVlcyxcbiAgICAvLyBzaW5jZSB3ZSBwcm9iYWJseSBoYXZlIGV4cGFuZGVkIHRoZSByYW5nZSBvZiB0aGUgc2NhbGVcbiAgICBpZiAob3B0cy5ib3VuZHMgPT09ICd0aWNrcycpIHtcbiAgICAgIF9zZXRNaW5BbmRNYXhCeUtleSh0aWNrcywgdGhpcywgJ3ZhbHVlJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMucmV2ZXJzZSkge1xuICAgICAgdGlja3MucmV2ZXJzZSgpO1xuXG4gICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5tYXg7XG4gICAgICB0aGlzLmVuZCA9IHRoaXMubWluO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0ID0gdGhpcy5taW47XG4gICAgICB0aGlzLmVuZCA9IHRoaXMubWF4O1xuICAgIH1cblxuICAgIHJldHVybiB0aWNrcztcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBjb25maWd1cmUoKSB7XG4gICAgY29uc3QgdGlja3MgPSB0aGlzLnRpY2tzO1xuICAgIGxldCBzdGFydCA9IHRoaXMubWluO1xuICAgIGxldCBlbmQgPSB0aGlzLm1heDtcblxuICAgIHN1cGVyLmNvbmZpZ3VyZSgpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vZmZzZXQgJiYgdGlja3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSAoZW5kIC0gc3RhcnQpIC8gTWF0aC5tYXgodGlja3MubGVuZ3RoIC0gMSwgMSkgLyAyO1xuICAgICAgc3RhcnQgLT0gb2Zmc2V0O1xuICAgICAgZW5kICs9IG9mZnNldDtcbiAgICB9XG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IHN0YXJ0O1xuICAgIHRoaXMuX2VuZFZhbHVlID0gZW5kO1xuICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSBlbmQgLSBzdGFydDtcbiAgfVxuXG4gIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLCB0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KTtcbiAgfVxufVxuIiwgImltcG9ydCB7aXNGaW5pdGV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCBMaW5lYXJTY2FsZUJhc2UgZnJvbSAnLi9zY2FsZS5saW5lYXJiYXNlLmpzJztcbmltcG9ydCBUaWNrcyBmcm9tICcuLi9jb3JlL2NvcmUudGlja3MuanMnO1xuaW1wb3J0IHt0b1JhZGlhbnN9IGZyb20gJy4uL2hlbHBlcnMvaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaW5lYXJTY2FsZSBleHRlbmRzIExpbmVhclNjYWxlQmFzZSB7XG5cbiAgc3RhdGljIGlkID0gJ2xpbmVhcic7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgdGlja3M6IHtcbiAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLm51bWVyaWNcbiAgICB9XG4gIH07XG5cblxuICBkZXRlcm1pbmVEYXRhTGltaXRzKCkge1xuICAgIGNvbnN0IHttaW4sIG1heH0gPSB0aGlzLmdldE1pbk1heCh0cnVlKTtcblxuICAgIHRoaXMubWluID0gaXNGaW5pdGUobWluKSA/IG1pbiA6IDA7XG4gICAgdGhpcy5tYXggPSBpc0Zpbml0ZShtYXgpID8gbWF4IDogMTtcblxuICAgIC8vIENvbW1vbiBiYXNlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSBtaW4sIG1heCwgYmVnaW5BdFplcm9cbiAgICB0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyBiYXNlZCBvbiB0aGUgc2NhbGUgZGltZW5zaW9uXG5cdCAqIEBwcm90ZWN0ZWRcbiBcdCAqL1xuICBjb21wdXRlVGlja0xpbWl0KCkge1xuICAgIGNvbnN0IGhvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGhvcml6b250YWwgPyB0aGlzLndpZHRoIDogdGhpcy5oZWlnaHQ7XG4gICAgY29uc3QgbWluUm90YXRpb24gPSB0b1JhZGlhbnModGhpcy5vcHRpb25zLnRpY2tzLm1pblJvdGF0aW9uKTtcbiAgICBjb25zdCByYXRpbyA9IChob3Jpem9udGFsID8gTWF0aC5zaW4obWluUm90YXRpb24pIDogTWF0aC5jb3MobWluUm90YXRpb24pKSB8fCAwLjAwMTtcbiAgICBjb25zdCB0aWNrRm9udCA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCk7XG4gICAgcmV0dXJuIE1hdGguY2VpbChsZW5ndGggLyBNYXRoLm1pbig0MCwgdGlja0ZvbnQubGluZUhlaWdodCAvIHJhdGlvKSk7XG4gIH1cblxuICAvLyBVdGlsc1xuICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwoKHZhbHVlIC0gdGhpcy5fc3RhcnRWYWx1ZSkgLyB0aGlzLl92YWx1ZVJhbmdlKTtcbiAgfVxuXG4gIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRWYWx1ZSArIHRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKSAqIHRoaXMuX3ZhbHVlUmFuZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQge2Zpbml0ZU9yRGVmYXVsdCwgaXNGaW5pdGV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Zm9ybWF0TnVtYmVyfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuaW50bC5qcyc7XG5pbXBvcnQge19zZXRNaW5BbmRNYXhCeUtleSwgbG9nMTB9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCBTY2FsZSBmcm9tICcuLi9jb3JlL2NvcmUuc2NhbGUuanMnO1xuaW1wb3J0IExpbmVhclNjYWxlQmFzZSBmcm9tICcuL3NjYWxlLmxpbmVhcmJhc2UuanMnO1xuaW1wb3J0IFRpY2tzIGZyb20gJy4uL2NvcmUvY29yZS50aWNrcy5qcyc7XG5cbmNvbnN0IGxvZzEwRmxvb3IgPSB2ID0+IE1hdGguZmxvb3IobG9nMTAodikpO1xuY29uc3QgY2hhbmdlRXhwb25lbnQgPSAodiwgbSkgPT4gTWF0aC5wb3coMTAsIGxvZzEwRmxvb3IodikgKyBtKTtcblxuZnVuY3Rpb24gaXNNYWpvcih0aWNrVmFsKSB7XG4gIGNvbnN0IHJlbWFpbiA9IHRpY2tWYWwgLyAoTWF0aC5wb3coMTAsIGxvZzEwRmxvb3IodGlja1ZhbCkpKTtcbiAgcmV0dXJuIHJlbWFpbiA9PT0gMTtcbn1cblxuZnVuY3Rpb24gc3RlcHMobWluLCBtYXgsIHJhbmdlRXhwKSB7XG4gIGNvbnN0IHJhbmdlU3RlcCA9IE1hdGgucG93KDEwLCByYW5nZUV4cCk7XG4gIGNvbnN0IHN0YXJ0ID0gTWF0aC5mbG9vcihtaW4gLyByYW5nZVN0ZXApO1xuICBjb25zdCBlbmQgPSBNYXRoLmNlaWwobWF4IC8gcmFuZ2VTdGVwKTtcbiAgcmV0dXJuIGVuZCAtIHN0YXJ0O1xufVxuXG5mdW5jdGlvbiBzdGFydEV4cChtaW4sIG1heCkge1xuICBjb25zdCByYW5nZSA9IG1heCAtIG1pbjtcbiAgbGV0IHJhbmdlRXhwID0gbG9nMTBGbG9vcihyYW5nZSk7XG4gIHdoaWxlIChzdGVwcyhtaW4sIG1heCwgcmFuZ2VFeHApID4gMTApIHtcbiAgICByYW5nZUV4cCsrO1xuICB9XG4gIHdoaWxlIChzdGVwcyhtaW4sIG1heCwgcmFuZ2VFeHApIDwgMTApIHtcbiAgICByYW5nZUV4cC0tO1xuICB9XG4gIHJldHVybiBNYXRoLm1pbihyYW5nZUV4cCwgbG9nMTBGbG9vcihtaW4pKTtcbn1cblxuXG4vKipcbiAqIEdlbmVyYXRlIGEgc2V0IG9mIGxvZ2FyaXRobWljIHRpY2tzXG4gKiBAcGFyYW0gZ2VuZXJhdGlvbk9wdGlvbnMgdGhlIG9wdGlvbnMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGlja3NcbiAqIEBwYXJhbSBkYXRhUmFuZ2UgdGhlIHJhbmdlIG9mIHRoZSBkYXRhXG4gKiBAcmV0dXJucyB7b2JqZWN0W119IGFycmF5IG9mIHRpY2sgb2JqZWN0c1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCB7bWluLCBtYXh9KSB7XG4gIG1pbiA9IGZpbml0ZU9yRGVmYXVsdChnZW5lcmF0aW9uT3B0aW9ucy5taW4sIG1pbik7XG4gIGNvbnN0IHRpY2tzID0gW107XG4gIGNvbnN0IG1pbkV4cCA9IGxvZzEwRmxvb3IobWluKTtcbiAgbGV0IGV4cCA9IHN0YXJ0RXhwKG1pbiwgbWF4KTtcbiAgbGV0IHByZWNpc2lvbiA9IGV4cCA8IDAgPyBNYXRoLnBvdygxMCwgTWF0aC5hYnMoZXhwKSkgOiAxO1xuICBjb25zdCBzdGVwU2l6ZSA9IE1hdGgucG93KDEwLCBleHApO1xuICBjb25zdCBiYXNlID0gbWluRXhwID4gZXhwID8gTWF0aC5wb3coMTAsIG1pbkV4cCkgOiAwO1xuICBjb25zdCBzdGFydCA9IE1hdGgucm91bmQoKG1pbiAtIGJhc2UpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcbiAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5mbG9vcigobWluIC0gYmFzZSkgLyBzdGVwU2l6ZSAvIDEwKSAqIHN0ZXBTaXplICogMTA7XG4gIGxldCBzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IoKHN0YXJ0IC0gb2Zmc2V0KSAvIE1hdGgucG93KDEwLCBleHApKTtcbiAgbGV0IHZhbHVlID0gZmluaXRlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1pbiwgTWF0aC5yb3VuZCgoYmFzZSArIG9mZnNldCArIHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCkpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbik7XG4gIHdoaWxlICh2YWx1ZSA8IG1heCkge1xuICAgIHRpY2tzLnB1c2goe3ZhbHVlLCBtYWpvcjogaXNNYWpvcih2YWx1ZSksIHNpZ25pZmljYW5kfSk7XG4gICAgaWYgKHNpZ25pZmljYW5kID49IDEwKSB7XG4gICAgICBzaWduaWZpY2FuZCA9IHNpZ25pZmljYW5kIDwgMTUgPyAxNSA6IDIwO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWduaWZpY2FuZCsrO1xuICAgIH1cbiAgICBpZiAoc2lnbmlmaWNhbmQgPj0gMjApIHtcbiAgICAgIGV4cCsrO1xuICAgICAgc2lnbmlmaWNhbmQgPSAyO1xuICAgICAgcHJlY2lzaW9uID0gZXhwID49IDAgPyAxIDogcHJlY2lzaW9uO1xuICAgIH1cbiAgICB2YWx1ZSA9IE1hdGgucm91bmQoKGJhc2UgKyBvZmZzZXQgKyBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApKSAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG4gIH1cbiAgY29uc3QgbGFzdFRpY2sgPSBmaW5pdGVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWF4LCB2YWx1ZSk7XG4gIHRpY2tzLnB1c2goe3ZhbHVlOiBsYXN0VGljaywgbWFqb3I6IGlzTWFqb3IobGFzdFRpY2spLCBzaWduaWZpY2FuZH0pO1xuXG4gIHJldHVybiB0aWNrcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nYXJpdGhtaWNTY2FsZSBleHRlbmRzIFNjYWxlIHtcblxuICBzdGF0aWMgaWQgPSAnbG9nYXJpdGhtaWMnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIHRpY2tzOiB7XG4gICAgICBjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy5sb2dhcml0aG1pYyxcbiAgICAgIG1ham9yOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cblxuICBjb25zdHJ1Y3RvcihjZmcpIHtcbiAgICBzdXBlcihjZmcpO1xuXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5zdGFydCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLmVuZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLl9zdGFydFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZhbHVlUmFuZ2UgPSAwO1xuICB9XG5cbiAgcGFyc2UocmF3LCBpbmRleCkge1xuICAgIGNvbnN0IHZhbHVlID0gTGluZWFyU2NhbGVCYXNlLnByb3RvdHlwZS5wYXJzZS5hcHBseSh0aGlzLCBbcmF3LCBpbmRleF0pO1xuICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgdGhpcy5femVybyA9IHRydWU7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgY29uc3Qge21pbiwgbWF4fSA9IHRoaXMuZ2V0TWluTWF4KHRydWUpO1xuXG4gICAgdGhpcy5taW4gPSBpc0Zpbml0ZShtaW4pID8gTWF0aC5tYXgoMCwgbWluKSA6IG51bGw7XG4gICAgdGhpcy5tYXggPSBpc0Zpbml0ZShtYXgpID8gTWF0aC5tYXgoMCwgbWF4KSA6IG51bGw7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJlZ2luQXRaZXJvKSB7XG4gICAgICB0aGlzLl96ZXJvID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBkYXRhIGhhcyBgMGAgaW4gaXQgb3IgYGJlZ2luQXRaZXJvYCBpcyB0cnVlLCBtaW4gKG5vbiB6ZXJvKSB2YWx1ZSBpcyBhdCBib3R0b21cbiAgICAvLyBvZiBzY2FsZSwgYW5kIGl0IGRvZXMgbm90IGVxdWFsIHN1Z2dlc3RlZE1pbiwgbG93ZXIgdGhlIG1pbiBib3VuZCBieSBvbmUgZXhwLlxuICAgIGlmICh0aGlzLl96ZXJvICYmIHRoaXMubWluICE9PSB0aGlzLl9zdWdnZXN0ZWRNaW4gJiYgIWlzRmluaXRlKHRoaXMuX3VzZXJNaW4pKSB7XG4gICAgICB0aGlzLm1pbiA9IG1pbiA9PT0gY2hhbmdlRXhwb25lbnQodGhpcy5taW4sIDApID8gY2hhbmdlRXhwb25lbnQodGhpcy5taW4sIC0xKSA6IGNoYW5nZUV4cG9uZW50KHRoaXMubWluLCAwKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcbiAgfVxuXG4gIGhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKSB7XG4gICAgY29uc3Qge21pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG4gICAgbGV0IG1pbiA9IHRoaXMubWluO1xuICAgIGxldCBtYXggPSB0aGlzLm1heDtcblxuICAgIGNvbnN0IHNldE1pbiA9IHYgPT4gKG1pbiA9IG1pbkRlZmluZWQgPyBtaW4gOiB2KTtcbiAgICBjb25zdCBzZXRNYXggPSB2ID0+IChtYXggPSBtYXhEZWZpbmVkID8gbWF4IDogdik7XG5cbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIGlmIChtaW4gPD0gMCkgeyAvLyBpbmNsdWRlcyBudWxsXG4gICAgICAgIHNldE1pbigxKTtcbiAgICAgICAgc2V0TWF4KDEwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldE1pbihjaGFuZ2VFeHBvbmVudChtaW4sIC0xKSk7XG4gICAgICAgIHNldE1heChjaGFuZ2VFeHBvbmVudChtYXgsICsxKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtaW4gPD0gMCkge1xuICAgICAgc2V0TWluKGNoYW5nZUV4cG9uZW50KG1heCwgLTEpKTtcbiAgICB9XG4gICAgaWYgKG1heCA8PSAwKSB7XG5cbiAgICAgIHNldE1heChjaGFuZ2VFeHBvbmVudChtaW4sICsxKSk7XG4gICAgfVxuXG4gICAgdGhpcy5taW4gPSBtaW47XG4gICAgdGhpcy5tYXggPSBtYXg7XG4gIH1cblxuICBidWlsZFRpY2tzKCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBjb25zdCBnZW5lcmF0aW9uT3B0aW9ucyA9IHtcbiAgICAgIG1pbjogdGhpcy5fdXNlck1pbixcbiAgICAgIG1heDogdGhpcy5fdXNlck1heFxuICAgIH07XG4gICAgY29uc3QgdGlja3MgPSBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCB0aGlzKTtcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgdG8gdXBkYXRlIG91ciBtYXggYW5kIG1pbiBnaXZlbiB0aGUgdGljayB2YWx1ZXMsXG4gICAgLy8gc2luY2Ugd2UgcHJvYmFibHkgaGF2ZSBleHBhbmRlZCB0aGUgcmFuZ2Ugb2YgdGhlIHNjYWxlXG4gICAgaWYgKG9wdHMuYm91bmRzID09PSAndGlja3MnKSB7XG4gICAgICBfc2V0TWluQW5kTWF4QnlLZXkodGlja3MsIHRoaXMsICd2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmIChvcHRzLnJldmVyc2UpIHtcbiAgICAgIHRpY2tzLnJldmVyc2UoKTtcblxuICAgICAgdGhpcy5zdGFydCA9IHRoaXMubWF4O1xuICAgICAgdGhpcy5lbmQgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydCA9IHRoaXMubWluO1xuICAgICAgdGhpcy5lbmQgPSB0aGlzLm1heDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG4gIGdldExhYmVsRm9yVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAnMCdcbiAgICAgIDogZm9ybWF0TnVtYmVyKHZhbHVlLCB0aGlzLmNoYXJ0Lm9wdGlvbnMubG9jYWxlLCB0aGlzLm9wdGlvbnMudGlja3MuZm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBjb25maWd1cmUoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLm1pbjtcblxuICAgIHN1cGVyLmNvbmZpZ3VyZSgpO1xuXG4gICAgdGhpcy5fc3RhcnRWYWx1ZSA9IGxvZzEwKHN0YXJ0KTtcbiAgICB0aGlzLl92YWx1ZVJhbmdlID0gbG9nMTAodGhpcy5tYXgpIC0gbG9nMTAoc3RhcnQpO1xuICB9XG5cbiAgZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAwKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMubWluO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgaXNOYU4odmFsdWUpKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRQaXhlbEZvckRlY2ltYWwodmFsdWUgPT09IHRoaXMubWluXG4gICAgICA/IDBcbiAgICAgIDogKGxvZzEwKHZhbHVlKSAtIHRoaXMuX3N0YXJ0VmFsdWUpIC8gdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cblxuICBnZXRWYWx1ZUZvclBpeGVsKHBpeGVsKSB7XG4gICAgY29uc3QgZGVjaW1hbCA9IHRoaXMuZ2V0RGVjaW1hbEZvclBpeGVsKHBpeGVsKTtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXJ0VmFsdWUgKyBkZWNpbWFsICogdGhpcy5fdmFsdWVSYW5nZSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vY29yZS9jb3JlLmRlZmF1bHRzLmpzJztcbmltcG9ydCB7X2xvbmdlc3RUZXh0LCBhZGRSb3VuZGVkUmVjdFBhdGgsIHJlbmRlclRleHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jYW52YXMuanMnO1xuaW1wb3J0IHtIQUxGX1BJLCBUQVUsIHRvRGVncmVlcywgdG9SYWRpYW5zLCBfbm9ybWFsaXplQW5nbGUsIFBJfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMubWF0aC5qcyc7XG5pbXBvcnQgTGluZWFyU2NhbGVCYXNlIGZyb20gJy4vc2NhbGUubGluZWFyYmFzZS5qcyc7XG5pbXBvcnQgVGlja3MgZnJvbSAnLi4vY29yZS9jb3JlLnRpY2tzLmpzJztcbmltcG9ydCB7dmFsdWVPckRlZmF1bHQsIGlzQXJyYXksIGlzRmluaXRlLCBjYWxsYmFjayBhcyBjYWxsQ2FsbGJhY2ssIGlzTnVsbE9yVW5kZWZ9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7Y3JlYXRlQ29udGV4dCwgdG9Gb250LCB0b1BhZGRpbmcsIHRvVFJCTENvcm5lcnN9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5vcHRpb25zLmpzJztcblxuZnVuY3Rpb24gZ2V0VGlja0JhY2tkcm9wSGVpZ2h0KG9wdHMpIHtcbiAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXG4gIGlmICh0aWNrT3B0cy5kaXNwbGF5ICYmIG9wdHMuZGlzcGxheSkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSB0b1BhZGRpbmcodGlja09wdHMuYmFja2Ryb3BQYWRkaW5nKTtcbiAgICByZXR1cm4gdmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udCAmJiB0aWNrT3B0cy5mb250LnNpemUsIGRlZmF1bHRzLmZvbnQuc2l6ZSkgKyBwYWRkaW5nLmhlaWdodDtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gbWVhc3VyZUxhYmVsU2l6ZShjdHgsIGZvbnQsIGxhYmVsKSB7XG4gIGxhYmVsID0gaXNBcnJheShsYWJlbCkgPyBsYWJlbCA6IFtsYWJlbF07XG4gIHJldHVybiB7XG4gICAgdzogX2xvbmdlc3RUZXh0KGN0eCwgZm9udC5zdHJpbmcsIGxhYmVsKSxcbiAgICBoOiBsYWJlbC5sZW5ndGggKiBmb250LmxpbmVIZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb3MsIHNpemUsIG1pbiwgbWF4KSB7XG4gIGlmIChhbmdsZSA9PT0gbWluIHx8IGFuZ2xlID09PSBtYXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHBvcyAtIChzaXplIC8gMiksXG4gICAgICBlbmQ6IHBvcyArIChzaXplIC8gMilcbiAgICB9O1xuICB9IGVsc2UgaWYgKGFuZ2xlIDwgbWluIHx8IGFuZ2xlID4gbWF4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBwb3MgLSBzaXplLFxuICAgICAgZW5kOiBwb3NcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcG9zLFxuICAgIGVuZDogcG9zICsgc2l6ZVxuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBmaXQgYSByYWRpYWwgbGluZWFyIHNjYWxlIHdpdGggcG9pbnQgbGFiZWxzXG4gKi9cbmZ1bmN0aW9uIGZpdFdpdGhQb2ludExhYmVscyhzY2FsZSkge1xuXG4gIC8vIFJpZ2h0LCB0aGlzIGlzIHJlYWxseSBjb25mdXNpbmcgYW5kIHRoZXJlIGlzIGEgbG90IG9mIG1hdGhzIGdvaW5nIG9uIGhlcmVcbiAgLy8gVGhlIGdpc3Qgb2YgdGhlIHByb2JsZW0gaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbm5uaWNrLzY5NmNjOWM1NWY0YjBiZWI4ZmU5XG4gIC8vXG4gIC8vIFJlYWN0aW9uOiBodHRwczovL2RsLmRyb3Bib3h1c2VyY29udGVudC5jb20vdS8zNDYwMTM2My90b29tdWNoc2NpZW5jZS5naWZcbiAgLy9cbiAgLy8gU29sdXRpb246XG4gIC8vXG4gIC8vIFdlIGFzc3VtZSB0aGUgcmFkaXVzIG9mIHRoZSBwb2x5Z29uIGlzIGhhbGYgdGhlIHNpemUgb2YgdGhlIGNhbnZhcyBhdCBmaXJzdFxuICAvLyBhdCBlYWNoIGluZGV4IHdlIGNoZWNrIGlmIHRoZSB0ZXh0IG92ZXJsYXBzLlxuICAvL1xuICAvLyBXaGVyZSBpdCBkb2VzLCB3ZSBzdG9yZSB0aGF0IGFuZ2xlIGFuZCB0aGF0IGluZGV4LlxuICAvL1xuICAvLyBBZnRlciBmaW5kaW5nIHRoZSBsYXJnZXN0IGluZGV4IGFuZCBhbmdsZSB3ZSBjYWxjdWxhdGUgaG93IG11Y2ggd2UgbmVlZCB0byByZW1vdmVcbiAgLy8gZnJvbSB0aGUgc2hhcGUgcmFkaXVzIHRvIG1vdmUgdGhlIHBvaW50IGlud2FyZHMgYnkgdGhhdCB4LlxuICAvL1xuICAvLyBXZSBhdmVyYWdlIHRoZSBsZWZ0IGFuZCByaWdodCBkaXN0YW5jZXMgdG8gZ2V0IHRoZSBtYXhpbXVtIHNoYXBlIHJhZGl1cyB0aGF0IGNhbiBmaXQgaW4gdGhlIGJveFxuICAvLyBhbG9uZyB3aXRoIGxhYmVscy5cbiAgLy9cbiAgLy8gT25jZSB3ZSBoYXZlIHRoYXQsIHdlIGNhbiBmaW5kIHRoZSBjZW50cmUgcG9pbnQgZm9yIHRoZSBjaGFydCwgYnkgdGFraW5nIHRoZSB4IHRleHQgcHJvdHJ1c2lvblxuICAvLyBvbiBlYWNoIHNpZGUsIHJlbW92aW5nIHRoYXQgZnJvbSB0aGUgc2l6ZSwgaGFsdmluZyBpdCBhbmQgYWRkaW5nIHRoZSBsZWZ0IHggcHJvdHJ1c2lvbiB3aWR0aC5cbiAgLy9cbiAgLy8gVGhpcyB3aWxsIG1lYW4gd2UgaGF2ZSBhIHNoYXBlIGZpdHRlZCB0byB0aGUgY2FudmFzLCBhcyBsYXJnZSBhcyBpdCBjYW4gYmUgd2l0aCB0aGUgbGFiZWxzXG4gIC8vIGFuZCBwb3NpdGlvbiBpdCBpbiB0aGUgbW9zdCBzcGFjZSBlZmZpY2llbnQgbWFubmVyXG4gIC8vXG4gIC8vIGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzM0NjAxMzYzL3llYWhzY2llbmNlLmdpZlxuXG4gIC8vIEdldCBtYXhpbXVtIHJhZGl1cyBvZiB0aGUgcG9seWdvbi4gRWl0aGVyIGhhbGYgdGhlIGhlaWdodCAobWludXMgdGhlIHRleHQgd2lkdGgpIG9yIGhhbGYgdGhlIHdpZHRoLlxuICAvLyBVc2UgdGhpcyB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCArIGNoYW5nZS4gLSBNYWtlIHN1cmUgTC9SIHByb3RydXNpb24gaXMgYXQgbGVhc3QgMCB0byBzdG9wIGlzc3VlcyB3aXRoIGNlbnRyZSBwb2ludHNcbiAgY29uc3Qgb3JpZyA9IHtcbiAgICBsOiBzY2FsZS5sZWZ0ICsgc2NhbGUuX3BhZGRpbmcubGVmdCxcbiAgICByOiBzY2FsZS5yaWdodCAtIHNjYWxlLl9wYWRkaW5nLnJpZ2h0LFxuICAgIHQ6IHNjYWxlLnRvcCArIHNjYWxlLl9wYWRkaW5nLnRvcCxcbiAgICBiOiBzY2FsZS5ib3R0b20gLSBzY2FsZS5fcGFkZGluZy5ib3R0b21cbiAgfTtcbiAgY29uc3QgbGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3JpZyk7XG4gIGNvbnN0IGxhYmVsU2l6ZXMgPSBbXTtcbiAgY29uc3QgcGFkZGluZyA9IFtdO1xuICBjb25zdCB2YWx1ZUNvdW50ID0gc2NhbGUuX3BvaW50TGFiZWxzLmxlbmd0aDtcbiAgY29uc3QgcG9pbnRMYWJlbE9wdHMgPSBzY2FsZS5vcHRpb25zLnBvaW50TGFiZWxzO1xuICBjb25zdCBhZGRpdGlvbmFsQW5nbGUgPSBwb2ludExhYmVsT3B0cy5jZW50ZXJQb2ludExhYmVscyA/IFBJIC8gdmFsdWVDb3VudCA6IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHtcbiAgICBjb25zdCBvcHRzID0gcG9pbnRMYWJlbE9wdHMuc2V0Q29udGV4dChzY2FsZS5nZXRQb2ludExhYmVsQ29udGV4dChpKSk7XG4gICAgcGFkZGluZ1tpXSA9IG9wdHMucGFkZGluZztcbiAgICBjb25zdCBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCBzY2FsZS5kcmF3aW5nQXJlYSArIHBhZGRpbmdbaV0sIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgY29uc3QgcGxGb250ID0gdG9Gb250KG9wdHMuZm9udCk7XG4gICAgY29uc3QgdGV4dFNpemUgPSBtZWFzdXJlTGFiZWxTaXplKHNjYWxlLmN0eCwgcGxGb250LCBzY2FsZS5fcG9pbnRMYWJlbHNbaV0pO1xuICAgIGxhYmVsU2l6ZXNbaV0gPSB0ZXh0U2l6ZTtcblxuICAgIGNvbnN0IGFuZ2xlUmFkaWFucyA9IF9ub3JtYWxpemVBbmdsZShzY2FsZS5nZXRJbmRleEFuZ2xlKGkpICsgYWRkaXRpb25hbEFuZ2xlKTtcbiAgICBjb25zdCBhbmdsZSA9IE1hdGgucm91bmQodG9EZWdyZWVzKGFuZ2xlUmFkaWFucykpO1xuICAgIGNvbnN0IGhMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueCwgdGV4dFNpemUudywgMCwgMTgwKTtcbiAgICBjb25zdCB2TGltaXRzID0gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb2ludFBvc2l0aW9uLnksIHRleHRTaXplLmgsIDkwLCAyNzApO1xuICAgIHVwZGF0ZUxpbWl0cyhsaW1pdHMsIG9yaWcsIGFuZ2xlUmFkaWFucywgaExpbWl0cywgdkxpbWl0cyk7XG4gIH1cblxuICBzY2FsZS5zZXRDZW50ZXJQb2ludChcbiAgICBvcmlnLmwgLSBsaW1pdHMubCxcbiAgICBsaW1pdHMuciAtIG9yaWcucixcbiAgICBvcmlnLnQgLSBsaW1pdHMudCxcbiAgICBsaW1pdHMuYiAtIG9yaWcuYlxuICApO1xuXG4gIC8vIE5vdyB0aGF0IHRleHQgc2l6ZSBpcyBkZXRlcm1pbmVkLCBjb21wdXRlIHRoZSBmdWxsIHBvc2l0aW9uc1xuICBzY2FsZS5fcG9pbnRMYWJlbEl0ZW1zID0gYnVpbGRQb2ludExhYmVsSXRlbXMoc2NhbGUsIGxhYmVsU2l6ZXMsIHBhZGRpbmcpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW1pdHMobGltaXRzLCBvcmlnLCBhbmdsZSwgaExpbWl0cywgdkxpbWl0cykge1xuICBjb25zdCBzaW4gPSBNYXRoLmFicyhNYXRoLnNpbihhbmdsZSkpO1xuICBjb25zdCBjb3MgPSBNYXRoLmFicyhNYXRoLmNvcyhhbmdsZSkpO1xuICBsZXQgeCA9IDA7XG4gIGxldCB5ID0gMDtcbiAgaWYgKGhMaW1pdHMuc3RhcnQgPCBvcmlnLmwpIHtcbiAgICB4ID0gKG9yaWcubCAtIGhMaW1pdHMuc3RhcnQpIC8gc2luO1xuICAgIGxpbWl0cy5sID0gTWF0aC5taW4obGltaXRzLmwsIG9yaWcubCAtIHgpO1xuICB9IGVsc2UgaWYgKGhMaW1pdHMuZW5kID4gb3JpZy5yKSB7XG4gICAgeCA9IChoTGltaXRzLmVuZCAtIG9yaWcucikgLyBzaW47XG4gICAgbGltaXRzLnIgPSBNYXRoLm1heChsaW1pdHMuciwgb3JpZy5yICsgeCk7XG4gIH1cbiAgaWYgKHZMaW1pdHMuc3RhcnQgPCBvcmlnLnQpIHtcbiAgICB5ID0gKG9yaWcudCAtIHZMaW1pdHMuc3RhcnQpIC8gY29zO1xuICAgIGxpbWl0cy50ID0gTWF0aC5taW4obGltaXRzLnQsIG9yaWcudCAtIHkpO1xuICB9IGVsc2UgaWYgKHZMaW1pdHMuZW5kID4gb3JpZy5iKSB7XG4gICAgeSA9ICh2TGltaXRzLmVuZCAtIG9yaWcuYikgLyBjb3M7XG4gICAgbGltaXRzLmIgPSBNYXRoLm1heChsaW1pdHMuYiwgb3JpZy5iICsgeSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQb2ludExhYmVsSXRlbXMoc2NhbGUsIGxhYmVsU2l6ZXMsIHBhZGRpbmcpIHtcbiAgY29uc3QgaXRlbXMgPSBbXTtcbiAgY29uc3QgdmFsdWVDb3VudCA9IHNjYWxlLl9wb2ludExhYmVscy5sZW5ndGg7XG4gIGNvbnN0IG9wdHMgPSBzY2FsZS5vcHRpb25zO1xuICBjb25zdCBleHRyYSA9IGdldFRpY2tCYWNrZHJvcEhlaWdodChvcHRzKSAvIDI7XG4gIGNvbnN0IG91dGVyRGlzdGFuY2UgPSBzY2FsZS5kcmF3aW5nQXJlYTtcbiAgY29uc3QgYWRkaXRpb25hbEFuZ2xlID0gb3B0cy5wb2ludExhYmVscy5jZW50ZXJQb2ludExhYmVscyA/IFBJIC8gdmFsdWVDb3VudCA6IDA7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspIHtcbiAgICBjb25zdCBwb2ludExhYmVsUG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIG91dGVyRGlzdGFuY2UgKyBleHRyYSArIHBhZGRpbmdbaV0sIGFkZGl0aW9uYWxBbmdsZSk7XG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLnJvdW5kKHRvRGVncmVlcyhfbm9ybWFsaXplQW5nbGUocG9pbnRMYWJlbFBvc2l0aW9uLmFuZ2xlICsgSEFMRl9QSSkpKTtcbiAgICBjb25zdCBzaXplID0gbGFiZWxTaXplc1tpXTtcbiAgICBjb25zdCB5ID0geUZvckFuZ2xlKHBvaW50TGFiZWxQb3NpdGlvbi55LCBzaXplLmgsIGFuZ2xlKTtcbiAgICBjb25zdCB0ZXh0QWxpZ24gPSBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSk7XG4gICAgY29uc3QgbGVmdCA9IGxlZnRGb3JUZXh0QWxpZ24ocG9pbnRMYWJlbFBvc2l0aW9uLngsIHNpemUudywgdGV4dEFsaWduKTtcblxuICAgIGl0ZW1zLnB1c2goe1xuICAgICAgLy8gVGV4dCBwb3NpdGlvblxuICAgICAgeDogcG9pbnRMYWJlbFBvc2l0aW9uLngsXG4gICAgICB5LFxuXG4gICAgICAvLyBUZXh0IHJlbmRlcmluZyBkYXRhXG4gICAgICB0ZXh0QWxpZ24sXG5cbiAgICAgIC8vIEJvdW5kaW5nIGJveFxuICAgICAgbGVmdCxcbiAgICAgIHRvcDogeSxcbiAgICAgIHJpZ2h0OiBsZWZ0ICsgc2l6ZS53LFxuICAgICAgYm90dG9tOiB5ICsgc2l6ZS5oXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5mdW5jdGlvbiBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSkge1xuICBpZiAoYW5nbGUgPT09IDAgfHwgYW5nbGUgPT09IDE4MCkge1xuICAgIHJldHVybiAnY2VudGVyJztcbiAgfSBlbHNlIGlmIChhbmdsZSA8IDE4MCkge1xuICAgIHJldHVybiAnbGVmdCc7XG4gIH1cblxuICByZXR1cm4gJ3JpZ2h0Jztcbn1cblxuZnVuY3Rpb24gbGVmdEZvclRleHRBbGlnbih4LCB3LCBhbGlnbikge1xuICBpZiAoYWxpZ24gPT09ICdyaWdodCcpIHtcbiAgICB4IC09IHc7XG4gIH0gZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgeCAtPSAodyAvIDIpO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG5mdW5jdGlvbiB5Rm9yQW5nbGUoeSwgaCwgYW5nbGUpIHtcbiAgaWYgKGFuZ2xlID09PSA5MCB8fCBhbmdsZSA9PT0gMjcwKSB7XG4gICAgeSAtPSAoaCAvIDIpO1xuICB9IGVsc2UgaWYgKGFuZ2xlID4gMjcwIHx8IGFuZ2xlIDwgOTApIHtcbiAgICB5IC09IGg7XG4gIH1cbiAgcmV0dXJuIHk7XG59XG5cbmZ1bmN0aW9uIGRyYXdQb2ludExhYmVscyhzY2FsZSwgbGFiZWxDb3VudCkge1xuICBjb25zdCB7Y3R4LCBvcHRpb25zOiB7cG9pbnRMYWJlbHN9fSA9IHNjYWxlO1xuXG4gIGZvciAobGV0IGkgPSBsYWJlbENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBvcHRzQXRJbmRleCA9IHBvaW50TGFiZWxzLnNldENvbnRleHQoc2NhbGUuZ2V0UG9pbnRMYWJlbENvbnRleHQoaSkpO1xuICAgIGNvbnN0IHBsRm9udCA9IHRvRm9udChvcHRzQXRJbmRleC5mb250KTtcbiAgICBjb25zdCB7eCwgeSwgdGV4dEFsaWduLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b219ID0gc2NhbGUuX3BvaW50TGFiZWxJdGVtc1tpXTtcbiAgICBjb25zdCB7YmFja2Ryb3BDb2xvcn0gPSBvcHRzQXRJbmRleDtcblxuICAgIGlmICghaXNOdWxsT3JVbmRlZihiYWNrZHJvcENvbG9yKSkge1xuICAgICAgY29uc3QgYm9yZGVyUmFkaXVzID0gdG9UUkJMQ29ybmVycyhvcHRzQXRJbmRleC5ib3JkZXJSYWRpdXMpO1xuICAgICAgY29uc3QgcGFkZGluZyA9IHRvUGFkZGluZyhvcHRzQXRJbmRleC5iYWNrZHJvcFBhZGRpbmcpO1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGJhY2tkcm9wQ29sb3I7XG5cbiAgICAgIGNvbnN0IGJhY2tkcm9wTGVmdCA9IGxlZnQgLSBwYWRkaW5nLmxlZnQ7XG4gICAgICBjb25zdCBiYWNrZHJvcFRvcCA9IHRvcCAtIHBhZGRpbmcudG9wO1xuICAgICAgY29uc3QgYmFja2Ryb3BXaWR0aCA9IHJpZ2h0IC0gbGVmdCArIHBhZGRpbmcud2lkdGg7XG4gICAgICBjb25zdCBiYWNrZHJvcEhlaWdodCA9IGJvdHRvbSAtIHRvcCArIHBhZGRpbmcuaGVpZ2h0O1xuXG4gICAgICBpZiAoT2JqZWN0LnZhbHVlcyhib3JkZXJSYWRpdXMpLnNvbWUodiA9PiB2ICE9PSAwKSkge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGFkZFJvdW5kZWRSZWN0UGF0aChjdHgsIHtcbiAgICAgICAgICB4OiBiYWNrZHJvcExlZnQsXG4gICAgICAgICAgeTogYmFja2Ryb3BUb3AsXG4gICAgICAgICAgdzogYmFja2Ryb3BXaWR0aCxcbiAgICAgICAgICBoOiBiYWNrZHJvcEhlaWdodCxcbiAgICAgICAgICByYWRpdXM6IGJvcmRlclJhZGl1cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGN0eC5maWxsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHguZmlsbFJlY3QoYmFja2Ryb3BMZWZ0LCBiYWNrZHJvcFRvcCwgYmFja2Ryb3BXaWR0aCwgYmFja2Ryb3BIZWlnaHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlclRleHQoXG4gICAgICBjdHgsXG4gICAgICBzY2FsZS5fcG9pbnRMYWJlbHNbaV0sXG4gICAgICB4LFxuICAgICAgeSArIChwbEZvbnQubGluZUhlaWdodCAvIDIpLFxuICAgICAgcGxGb250LFxuICAgICAge1xuICAgICAgICBjb2xvcjogb3B0c0F0SW5kZXguY29sb3IsXG4gICAgICAgIHRleHRBbGlnbjogdGV4dEFsaWduLFxuICAgICAgICB0ZXh0QmFzZWxpbmU6ICdtaWRkbGUnXG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXRoUmFkaXVzTGluZShzY2FsZSwgcmFkaXVzLCBjaXJjdWxhciwgbGFiZWxDb3VudCkge1xuICBjb25zdCB7Y3R4fSA9IHNjYWxlO1xuICBpZiAoY2lyY3VsYXIpIHtcbiAgICAvLyBEcmF3IGNpcmN1bGFyIGFyY3MgYmV0d2VlbiB0aGUgcG9pbnRzXG4gICAgY3R4LmFyYyhzY2FsZS54Q2VudGVyLCBzY2FsZS55Q2VudGVyLCByYWRpdXMsIDAsIFRBVSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRHJhdyBzdHJhaWdodCBsaW5lcyBjb25uZWN0aW5nIGVhY2ggaW5kZXhcbiAgICBsZXQgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oMCwgcmFkaXVzKTtcbiAgICBjdHgubW92ZVRvKHBvaW50UG9zaXRpb24ueCwgcG9pbnRQb3NpdGlvbi55KTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XG4gICAgICBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCByYWRpdXMpO1xuICAgICAgY3R4LmxpbmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdSYWRpdXNMaW5lKHNjYWxlLCBncmlkTGluZU9wdHMsIHJhZGl1cywgbGFiZWxDb3VudCwgYm9yZGVyT3B0cykge1xuICBjb25zdCBjdHggPSBzY2FsZS5jdHg7XG4gIGNvbnN0IGNpcmN1bGFyID0gZ3JpZExpbmVPcHRzLmNpcmN1bGFyO1xuXG4gIGNvbnN0IHtjb2xvciwgbGluZVdpZHRofSA9IGdyaWRMaW5lT3B0cztcblxuICBpZiAoKCFjaXJjdWxhciAmJiAhbGFiZWxDb3VudCkgfHwgIWNvbG9yIHx8ICFsaW5lV2lkdGggfHwgcmFkaXVzIDwgMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGN0eC5zYXZlKCk7XG4gIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICBjdHguc2V0TGluZURhc2goYm9yZGVyT3B0cy5kYXNoKTtcbiAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gYm9yZGVyT3B0cy5kYXNoT2Zmc2V0O1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgcGF0aFJhZGl1c0xpbmUoc2NhbGUsIHJhZGl1cywgY2lyY3VsYXIsIGxhYmVsQ291bnQpO1xuICBjdHguY2xvc2VQYXRoKCk7XG4gIGN0eC5zdHJva2UoKTtcbiAgY3R4LnJlc3RvcmUoKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUG9pbnRMYWJlbENvbnRleHQocGFyZW50LCBpbmRleCwgbGFiZWwpIHtcbiAgcmV0dXJuIGNyZWF0ZUNvbnRleHQocGFyZW50LCB7XG4gICAgbGFiZWwsXG4gICAgaW5kZXgsXG4gICAgdHlwZTogJ3BvaW50TGFiZWwnXG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpYWxMaW5lYXJTY2FsZSBleHRlbmRzIExpbmVhclNjYWxlQmFzZSB7XG5cbiAgc3RhdGljIGlkID0gJ3JhZGlhbExpbmVhcic7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSB7XG4gICAgZGlzcGxheTogdHJ1ZSxcblxuICAgIC8vIEJvb2xlYW4gLSBXaGV0aGVyIHRvIGFuaW1hdGUgc2NhbGluZyB0aGUgY2hhcnQgZnJvbSB0aGUgY2VudHJlXG4gICAgYW5pbWF0ZTogdHJ1ZSxcbiAgICBwb3NpdGlvbjogJ2NoYXJ0QXJlYScsXG5cbiAgICBhbmdsZUxpbmVzOiB7XG4gICAgICBkaXNwbGF5OiB0cnVlLFxuICAgICAgbGluZVdpZHRoOiAxLFxuICAgICAgYm9yZGVyRGFzaDogW10sXG4gICAgICBib3JkZXJEYXNoT2Zmc2V0OiAwLjBcbiAgICB9LFxuXG4gICAgZ3JpZDoge1xuICAgICAgY2lyY3VsYXI6IGZhbHNlXG4gICAgfSxcblxuICAgIHN0YXJ0QW5nbGU6IDAsXG5cbiAgICAvLyBsYWJlbCBzZXR0aW5nc1xuICAgIHRpY2tzOiB7XG4gICAgICAvLyBCb29sZWFuIC0gU2hvdyBhIGJhY2tkcm9wIHRvIHRoZSBzY2FsZSBsYWJlbFxuICAgICAgc2hvd0xhYmVsQmFja2Ryb3A6IHRydWUsXG5cbiAgICAgIGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLm51bWVyaWNcbiAgICB9LFxuXG4gICAgcG9pbnRMYWJlbHM6IHtcbiAgICAgIGJhY2tkcm9wQ29sb3I6IHVuZGVmaW5lZCxcblxuICAgICAgLy8gTnVtYmVyIC0gVGhlIGJhY2tkcm9wIHBhZGRpbmcgYWJvdmUgJiBiZWxvdyB0aGUgbGFiZWwgaW4gcGl4ZWxzXG4gICAgICBiYWNrZHJvcFBhZGRpbmc6IDIsXG5cbiAgICAgIC8vIEJvb2xlYW4gLSBpZiB0cnVlLCBzaG93IHBvaW50IGxhYmVsc1xuICAgICAgZGlzcGxheTogdHJ1ZSxcblxuICAgICAgLy8gTnVtYmVyIC0gUG9pbnQgbGFiZWwgZm9udCBzaXplIGluIHBpeGVsc1xuICAgICAgZm9udDoge1xuICAgICAgICBzaXplOiAxMFxuICAgICAgfSxcblxuICAgICAgLy8gRnVuY3Rpb24gLSBVc2VkIHRvIGNvbnZlcnQgcG9pbnQgbGFiZWxzXG4gICAgICBjYWxsYmFjayhsYWJlbCkge1xuICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgICB9LFxuXG4gICAgICAvLyBOdW1iZXIgLSBBZGRpdGlvbmwgcGFkZGluZyBiZXR3ZWVuIHNjYWxlIGFuZCBwb2ludExhYmVsXG4gICAgICBwYWRkaW5nOiA1LFxuXG4gICAgICAvLyBCb29sZWFuIC0gaWYgdHJ1ZSwgY2VudGVyIHBvaW50IGxhYmVscyB0byBzbGljZXMgaW4gcG9sYXIgY2hhcnRcbiAgICAgIGNlbnRlclBvaW50TGFiZWxzOiBmYWxzZVxuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgZGVmYXVsdFJvdXRlcyA9IHtcbiAgICAnYW5nbGVMaW5lcy5jb2xvcic6ICdib3JkZXJDb2xvcicsXG4gICAgJ3BvaW50TGFiZWxzLmNvbG9yJzogJ2NvbG9yJyxcbiAgICAndGlja3MuY29sb3InOiAnY29sb3InXG4gIH07XG5cbiAgc3RhdGljIGRlc2NyaXB0b3JzID0ge1xuICAgIGFuZ2xlTGluZXM6IHtcbiAgICAgIF9mYWxsYmFjazogJ2dyaWQnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGNmZykge1xuICAgIHN1cGVyKGNmZyk7XG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnhDZW50ZXIgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy55Q2VudGVyID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuZHJhd2luZ0FyZWEgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLl9wb2ludExhYmVscyA9IFtdO1xuICAgIHRoaXMuX3BvaW50TGFiZWxJdGVtcyA9IFtdO1xuICB9XG5cbiAgc2V0RGltZW5zaW9ucygpIHtcbiAgICAvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxuICAgIGNvbnN0IHBhZGRpbmcgPSB0aGlzLl9wYWRkaW5nID0gdG9QYWRkaW5nKGdldFRpY2tCYWNrZHJvcEhlaWdodCh0aGlzLm9wdGlvbnMpIC8gMik7XG4gICAgY29uc3QgdyA9IHRoaXMud2lkdGggPSB0aGlzLm1heFdpZHRoIC0gcGFkZGluZy53aWR0aDtcbiAgICBjb25zdCBoID0gdGhpcy5oZWlnaHQgPSB0aGlzLm1heEhlaWdodCAtIHBhZGRpbmcuaGVpZ2h0O1xuICAgIHRoaXMueENlbnRlciA9IE1hdGguZmxvb3IodGhpcy5sZWZ0ICsgdyAvIDIgKyBwYWRkaW5nLmxlZnQpO1xuICAgIHRoaXMueUNlbnRlciA9IE1hdGguZmxvb3IodGhpcy50b3AgKyBoIC8gMiArIHBhZGRpbmcudG9wKTtcbiAgICB0aGlzLmRyYXdpbmdBcmVhID0gTWF0aC5mbG9vcihNYXRoLm1pbih3LCBoKSAvIDIpO1xuICB9XG5cbiAgZGV0ZXJtaW5lRGF0YUxpbWl0cygpIHtcbiAgICBjb25zdCB7bWluLCBtYXh9ID0gdGhpcy5nZXRNaW5NYXgoZmFsc2UpO1xuXG4gICAgdGhpcy5taW4gPSBpc0Zpbml0ZShtaW4pICYmICFpc05hTihtaW4pID8gbWluIDogMDtcbiAgICB0aGlzLm1heCA9IGlzRmluaXRlKG1heCkgJiYgIWlzTmFOKG1heCkgPyBtYXggOiAwO1xuXG4gICAgLy8gQ29tbW9uIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gaGFuZGxlIG1pbiwgbWF4LCBiZWdpbkF0WmVyb1xuICAgIHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG5cdCAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2tzIGJhc2VkIG9uIHRoZSBzY2FsZSBkaW1lbnNpb25cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgY29tcHV0ZVRpY2tMaW1pdCgpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuZHJhd2luZ0FyZWEgLyBnZXRUaWNrQmFja2Ryb3BIZWlnaHQodGhpcy5vcHRpb25zKSk7XG4gIH1cblxuICBnZW5lcmF0ZVRpY2tMYWJlbHModGlja3MpIHtcbiAgICBMaW5lYXJTY2FsZUJhc2UucHJvdG90eXBlLmdlbmVyYXRlVGlja0xhYmVscy5jYWxsKHRoaXMsIHRpY2tzKTtcblxuICAgIC8vIFBvaW50IGxhYmVsc1xuICAgIHRoaXMuX3BvaW50TGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKVxuICAgICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gY2FsbENhbGxiYWNrKHRoaXMub3B0aW9ucy5wb2ludExhYmVscy5jYWxsYmFjaywgW3ZhbHVlLCBpbmRleF0sIHRoaXMpO1xuICAgICAgICByZXR1cm4gbGFiZWwgfHwgbGFiZWwgPT09IDAgPyBsYWJlbCA6ICcnO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHYsIGkpID0+IHRoaXMuY2hhcnQuZ2V0RGF0YVZpc2liaWxpdHkoaSkpO1xuICB9XG5cbiAgZml0KCkge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpZiAob3B0cy5kaXNwbGF5ICYmIG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xuICAgICAgZml0V2l0aFBvaW50TGFiZWxzKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldENlbnRlclBvaW50KDAsIDAsIDAsIDApO1xuICAgIH1cbiAgfVxuXG4gIHNldENlbnRlclBvaW50KGxlZnRNb3ZlbWVudCwgcmlnaHRNb3ZlbWVudCwgdG9wTW92ZW1lbnQsIGJvdHRvbU1vdmVtZW50KSB7XG4gICAgdGhpcy54Q2VudGVyICs9IE1hdGguZmxvb3IoKGxlZnRNb3ZlbWVudCAtIHJpZ2h0TW92ZW1lbnQpIC8gMik7XG4gICAgdGhpcy55Q2VudGVyICs9IE1hdGguZmxvb3IoKHRvcE1vdmVtZW50IC0gYm90dG9tTW92ZW1lbnQpIC8gMik7XG4gICAgdGhpcy5kcmF3aW5nQXJlYSAtPSBNYXRoLm1pbih0aGlzLmRyYXdpbmdBcmVhIC8gMiwgTWF0aC5tYXgobGVmdE1vdmVtZW50LCByaWdodE1vdmVtZW50LCB0b3BNb3ZlbWVudCwgYm90dG9tTW92ZW1lbnQpKTtcbiAgfVxuXG4gIGdldEluZGV4QW5nbGUoaW5kZXgpIHtcbiAgICBjb25zdCBhbmdsZU11bHRpcGxpZXIgPSBUQVUgLyAodGhpcy5fcG9pbnRMYWJlbHMubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSB0aGlzLm9wdGlvbnMuc3RhcnRBbmdsZSB8fCAwO1xuXG4gICAgcmV0dXJuIF9ub3JtYWxpemVBbmdsZShpbmRleCAqIGFuZ2xlTXVsdGlwbGllciArIHRvUmFkaWFucyhzdGFydEFuZ2xlKSk7XG4gIH1cblxuICBnZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc051bGxPclVuZGVmKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG5cbiAgICAvLyBUYWtlIGludG8gYWNjb3VudCBoYWxmIGZvbnQgc2l6ZSArIHRoZSB5UGFkZGluZyBvZiB0aGUgdG9wIHZhbHVlXG4gICAgY29uc3Qgc2NhbGluZ0ZhY3RvciA9IHRoaXMuZHJhd2luZ0FyZWEgLyAodGhpcy5tYXggLSB0aGlzLm1pbik7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXZlcnNlKSB7XG4gICAgICByZXR1cm4gKHRoaXMubWF4IC0gdmFsdWUpICogc2NhbGluZ0ZhY3RvcjtcbiAgICB9XG4gICAgcmV0dXJuICh2YWx1ZSAtIHRoaXMubWluKSAqIHNjYWxpbmdGYWN0b3I7XG4gIH1cblxuICBnZXRWYWx1ZUZvckRpc3RhbmNlRnJvbUNlbnRlcihkaXN0YW5jZSkge1xuICAgIGlmIChpc051bGxPclVuZGVmKGRpc3RhbmNlKSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZWREaXN0YW5jZSA9IGRpc3RhbmNlIC8gKHRoaXMuZHJhd2luZ0FyZWEgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpO1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmV2ZXJzZSA/IHRoaXMubWF4IC0gc2NhbGVkRGlzdGFuY2UgOiB0aGlzLm1pbiArIHNjYWxlZERpc3RhbmNlO1xuICB9XG5cbiAgZ2V0UG9pbnRMYWJlbENvbnRleHQoaW5kZXgpIHtcbiAgICBjb25zdCBwb2ludExhYmVscyA9IHRoaXMuX3BvaW50TGFiZWxzIHx8IFtdO1xuXG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwb2ludExhYmVscy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBvaW50TGFiZWwgPSBwb2ludExhYmVsc1tpbmRleF07XG4gICAgICByZXR1cm4gY3JlYXRlUG9pbnRMYWJlbENvbnRleHQodGhpcy5nZXRDb250ZXh0KCksIGluZGV4LCBwb2ludExhYmVsKTtcbiAgICB9XG4gIH1cblxuICBnZXRQb2ludFBvc2l0aW9uKGluZGV4LCBkaXN0YW5jZUZyb21DZW50ZXIsIGFkZGl0aW9uYWxBbmdsZSA9IDApIHtcbiAgICBjb25zdCBhbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZShpbmRleCkgLSBIQUxGX1BJICsgYWRkaXRpb25hbEFuZ2xlO1xuICAgIHJldHVybiB7XG4gICAgICB4OiBNYXRoLmNvcyhhbmdsZSkgKiBkaXN0YW5jZUZyb21DZW50ZXIgKyB0aGlzLnhDZW50ZXIsXG4gICAgICB5OiBNYXRoLnNpbihhbmdsZSkgKiBkaXN0YW5jZUZyb21DZW50ZXIgKyB0aGlzLnlDZW50ZXIsXG4gICAgICBhbmdsZVxuICAgIH07XG4gIH1cblxuICBnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoaW5kZXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpbmRleCwgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0QmFzZVBvc2l0aW9uKGluZGV4KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlKGluZGV4IHx8IDAsIHRoaXMuZ2V0QmFzZVZhbHVlKCkpO1xuICB9XG5cbiAgZ2V0UG9pbnRMYWJlbFBvc2l0aW9uKGluZGV4KSB7XG4gICAgY29uc3Qge2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbX0gPSB0aGlzLl9wb2ludExhYmVsSXRlbXNbaW5kZXhdO1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgICAgcmlnaHQsXG4gICAgICBib3R0b20sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3QmFja2dyb3VuZCgpIHtcbiAgICBjb25zdCB7YmFja2dyb3VuZENvbG9yLCBncmlkOiB7Y2lyY3VsYXJ9fSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICBjb25zdCBjdHggPSB0aGlzLmN0eDtcbiAgICAgIGN0eC5zYXZlKCk7XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBwYXRoUmFkaXVzTGluZSh0aGlzLCB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKHRoaXMuX2VuZFZhbHVlKSwgY2lyY3VsYXIsIHRoaXMuX3BvaW50TGFiZWxzLmxlbmd0aCk7XG4gICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICBjdHguZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdHcmlkKCkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3Qge2FuZ2xlTGluZXMsIGdyaWQsIGJvcmRlcn0gPSBvcHRzO1xuICAgIGNvbnN0IGxhYmVsQ291bnQgPSB0aGlzLl9wb2ludExhYmVscy5sZW5ndGg7XG5cbiAgICBsZXQgaSwgb2Zmc2V0LCBwb3NpdGlvbjtcblxuICAgIGlmIChvcHRzLnBvaW50TGFiZWxzLmRpc3BsYXkpIHtcbiAgICAgIGRyYXdQb2ludExhYmVscyh0aGlzLCBsYWJlbENvdW50KTtcbiAgICB9XG5cbiAgICBpZiAoZ3JpZC5kaXNwbGF5KSB7XG4gICAgICB0aGlzLnRpY2tzLmZvckVhY2goKHRpY2ssIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCAhPT0gMCkge1xuICAgICAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGljay52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dChpbmRleCk7XG4gICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXggPSBncmlkLnNldENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgY29uc3Qgb3B0c0F0SW5kZXhCb3JkZXIgPSBib3JkZXIuc2V0Q29udGV4dChjb250ZXh0KTtcblxuICAgICAgICAgIGRyYXdSYWRpdXNMaW5lKHRoaXMsIG9wdHNBdEluZGV4LCBvZmZzZXQsIGxhYmVsQ291bnQsIG9wdHNBdEluZGV4Qm9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFuZ2xlTGluZXMuZGlzcGxheSkge1xuICAgICAgY3R4LnNhdmUoKTtcblxuICAgICAgZm9yIChpID0gbGFiZWxDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IG9wdHNBdEluZGV4ID0gYW5nbGVMaW5lcy5zZXRDb250ZXh0KHRoaXMuZ2V0UG9pbnRMYWJlbENvbnRleHQoaSkpO1xuICAgICAgICBjb25zdCB7Y29sb3IsIGxpbmVXaWR0aH0gPSBvcHRzQXRJbmRleDtcblxuICAgICAgICBpZiAoIWxpbmVXaWR0aCB8fCAhY29sb3IpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN0eC5saW5lV2lkdGggPSBsaW5lV2lkdGg7XG4gICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG4gICAgICAgIGN0eC5zZXRMaW5lRGFzaChvcHRzQXRJbmRleC5ib3JkZXJEYXNoKTtcbiAgICAgICAgY3R4LmxpbmVEYXNoT2Zmc2V0ID0gb3B0c0F0SW5kZXguYm9yZGVyRGFzaE9mZnNldDtcblxuICAgICAgICBvZmZzZXQgPSB0aGlzLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKG9wdHMudGlja3MucmV2ZXJzZSA/IHRoaXMubWluIDogdGhpcy5tYXgpO1xuICAgICAgICBwb3NpdGlvbiA9IHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpLCBvZmZzZXQpO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGN0eC5tb3ZlVG8odGhpcy54Q2VudGVyLCB0aGlzLnlDZW50ZXIpO1xuICAgICAgICBjdHgubGluZVRvKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICB9XG5cbiAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGRyYXdCb3JkZXIoKSB7fVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3TGFiZWxzKCkge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4O1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXG4gICAgaWYgKCF0aWNrT3B0cy5kaXNwbGF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRBbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZSgwKTtcbiAgICBsZXQgb2Zmc2V0LCB3aWR0aDtcblxuICAgIGN0eC5zYXZlKCk7XG4gICAgY3R4LnRyYW5zbGF0ZSh0aGlzLnhDZW50ZXIsIHRoaXMueUNlbnRlcik7XG4gICAgY3R4LnJvdGF0ZShzdGFydEFuZ2xlKTtcbiAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXG4gICAgdGhpcy50aWNrcy5mb3JFYWNoKCh0aWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ID09PSAwICYmICFvcHRzLnJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRzQXRJbmRleCA9IHRpY2tPcHRzLnNldENvbnRleHQodGhpcy5nZXRDb250ZXh0KGluZGV4KSk7XG4gICAgICBjb25zdCB0aWNrRm9udCA9IHRvRm9udChvcHRzQXRJbmRleC5mb250KTtcbiAgICAgIG9mZnNldCA9IHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodGhpcy50aWNrc1tpbmRleF0udmFsdWUpO1xuXG4gICAgICBpZiAob3B0c0F0SW5kZXguc2hvd0xhYmVsQmFja2Ryb3ApIHtcbiAgICAgICAgY3R4LmZvbnQgPSB0aWNrRm9udC5zdHJpbmc7XG4gICAgICAgIHdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KHRpY2subGFiZWwpLndpZHRoO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0c0F0SW5kZXguYmFja2Ryb3BDb2xvcjtcblxuICAgICAgICBjb25zdCBwYWRkaW5nID0gdG9QYWRkaW5nKG9wdHNBdEluZGV4LmJhY2tkcm9wUGFkZGluZyk7XG4gICAgICAgIGN0eC5maWxsUmVjdChcbiAgICAgICAgICAtd2lkdGggLyAyIC0gcGFkZGluZy5sZWZ0LFxuICAgICAgICAgIC1vZmZzZXQgLSB0aWNrRm9udC5zaXplIC8gMiAtIHBhZGRpbmcudG9wLFxuICAgICAgICAgIHdpZHRoICsgcGFkZGluZy53aWR0aCxcbiAgICAgICAgICB0aWNrRm9udC5zaXplICsgcGFkZGluZy5oZWlnaHRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyVGV4dChjdHgsIHRpY2subGFiZWwsIDAsIC1vZmZzZXQsIHRpY2tGb250LCB7XG4gICAgICAgIGNvbG9yOiBvcHRzQXRJbmRleC5jb2xvcixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBkcmF3VGl0bGUoKSB7fVxufVxuIiwgImltcG9ydCBhZGFwdGVycyBmcm9tICcuLi9jb3JlL2NvcmUuYWRhcHRlcnMuanMnO1xuaW1wb3J0IHtjYWxsYmFjayBhcyBjYWxsLCBpc0Zpbml0ZSwgaXNOdWxsT3JVbmRlZiwgbWVyZ2VJZiwgdmFsdWVPckRlZmF1bHR9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5jb3JlLmpzJztcbmltcG9ydCB7dG9SYWRpYW5zLCBpc051bWJlciwgX2xpbWl0VmFsdWV9IGZyb20gJy4uL2hlbHBlcnMvaGVscGVycy5tYXRoLmpzJztcbmltcG9ydCBTY2FsZSBmcm9tICcuLi9jb3JlL2NvcmUuc2NhbGUuanMnO1xuaW1wb3J0IHtfYXJyYXlVbmlxdWUsIF9maWx0ZXJCZXR3ZWVuLCBfbG9va3VwfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMuY29sbGVjdGlvbi5qcyc7XG5cbi8qKlxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5hZGFwdGVycy5qcycpLlRpbWVVbml0IH0gVW5pdFxuICogQHR5cGVkZWYge3tjb21tb246IGJvb2xlYW4sIHNpemU6IG51bWJlciwgc3RlcHM/OiBudW1iZXJ9fSBJbnRlcnZhbFxuICogQHR5cGVkZWYgeyBpbXBvcnQoJy4uL2NvcmUvY29yZS5hZGFwdGVycy5qcycpLkRhdGVBZGFwdGVyIH0gRGF0ZUFkYXB0ZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtPYmplY3Q8VW5pdCwgSW50ZXJ2YWw+fVxuICovXG5jb25zdCBJTlRFUlZBTFMgPSB7XG4gIG1pbGxpc2Vjb25kOiB7Y29tbW9uOiB0cnVlLCBzaXplOiAxLCBzdGVwczogMTAwMH0sXG4gIHNlY29uZDoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMTAwMCwgc3RlcHM6IDYwfSxcbiAgbWludXRlOiB7Y29tbW9uOiB0cnVlLCBzaXplOiA2MDAwMCwgc3RlcHM6IDYwfSxcbiAgaG91cjoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMzYwMDAwMCwgc3RlcHM6IDI0fSxcbiAgZGF5OiB7Y29tbW9uOiB0cnVlLCBzaXplOiA4NjQwMDAwMCwgc3RlcHM6IDMwfSxcbiAgd2Vlazoge2NvbW1vbjogZmFsc2UsIHNpemU6IDYwNDgwMDAwMCwgc3RlcHM6IDR9LFxuICBtb250aDoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMi42MjhlOSwgc3RlcHM6IDEyfSxcbiAgcXVhcnRlcjoge2NvbW1vbjogZmFsc2UsIHNpemU6IDcuODg0ZTksIHN0ZXBzOiA0fSxcbiAgeWVhcjoge2NvbW1vbjogdHJ1ZSwgc2l6ZTogMy4xNTRlMTB9XG59O1xuXG4vKipcbiAqIEB0eXBlIHtVbml0W119XG4gKi9cbmNvbnN0IFVOSVRTID0gLyoqIEB0eXBlIFVuaXRbXSAqLyAvKiAjX19QVVJFX18gKi8gKE9iamVjdC5rZXlzKElOVEVSVkFMUykpO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBhXG4gKiBAcGFyYW0ge251bWJlcn0gYlxuICovXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYikge1xuICByZXR1cm4gYSAtIGI7XG59XG5cbi8qKlxuICogQHBhcmFtIHtUaW1lU2NhbGV9IHNjYWxlXG4gKiBAcGFyYW0geyp9IGlucHV0XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlKHNjYWxlLCBpbnB1dCkge1xuICBpZiAoaXNOdWxsT3JVbmRlZihpbnB1dCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBzY2FsZS5fYWRhcHRlcjtcbiAgY29uc3Qge3BhcnNlciwgcm91bmQsIGlzb1dlZWtkYXl9ID0gc2NhbGUuX3BhcnNlT3B0cztcbiAgbGV0IHZhbHVlID0gaW5wdXQ7XG5cbiAgaWYgKHR5cGVvZiBwYXJzZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YWx1ZSA9IHBhcnNlcih2YWx1ZSk7XG4gIH1cblxuICAvLyBPbmx5IHBhcnNlIGlmIGl0cyBub3QgYSB0aW1lc3RhbXAgYWxyZWFkeVxuICBpZiAoIWlzRmluaXRlKHZhbHVlKSkge1xuICAgIHZhbHVlID0gdHlwZW9mIHBhcnNlciA9PT0gJ3N0cmluZydcbiAgICAgID8gYWRhcHRlci5wYXJzZSh2YWx1ZSwgLyoqIEB0eXBlIHtVbml0fSAqLyAocGFyc2VyKSlcbiAgICAgIDogYWRhcHRlci5wYXJzZSh2YWx1ZSk7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChyb3VuZCkge1xuICAgIHZhbHVlID0gcm91bmQgPT09ICd3ZWVrJyAmJiAoaXNOdW1iZXIoaXNvV2Vla2RheSkgfHwgaXNvV2Vla2RheSA9PT0gdHJ1ZSlcbiAgICAgID8gYWRhcHRlci5zdGFydE9mKHZhbHVlLCAnaXNvV2VlaycsIGlzb1dlZWtkYXkpXG4gICAgICA6IGFkYXB0ZXIuc3RhcnRPZih2YWx1ZSwgcm91bmQpO1xuICB9XG5cbiAgcmV0dXJuICt2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaWd1cmVzIG91dCB3aGF0IHVuaXQgcmVzdWx0cyBpbiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXV0by1nZW5lcmF0ZWQgdGlja3NcbiAqIEBwYXJhbSB7VW5pdH0gbWluVW5pdFxuICogQHBhcmFtIHtudW1iZXJ9IG1pblxuICogQHBhcmFtIHtudW1iZXJ9IG1heFxuICogQHBhcmFtIHtudW1iZXJ9IGNhcGFjaXR5XG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZVVuaXRGb3JBdXRvVGlja3MobWluVW5pdCwgbWluLCBtYXgsIGNhcGFjaXR5KSB7XG4gIGNvbnN0IGlsZW4gPSBVTklUUy5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGkgPCBpbGVuIC0gMTsgKytpKSB7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBJTlRFUlZBTFNbVU5JVFNbaV1dO1xuICAgIGNvbnN0IGZhY3RvciA9IGludGVydmFsLnN0ZXBzID8gaW50ZXJ2YWwuc3RlcHMgOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuICAgIGlmIChpbnRlcnZhbC5jb21tb24gJiYgTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKGZhY3RvciAqIGludGVydmFsLnNpemUpKSA8PSBjYXBhY2l0eSkge1xuICAgICAgcmV0dXJuIFVOSVRTW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBVTklUU1tpbGVuIC0gMV07XG59XG5cbi8qKlxuICogRmlndXJlcyBvdXQgd2hhdCB1bml0IHRvIGZvcm1hdCBhIHNldCBvZiB0aWNrcyB3aXRoXG4gKiBAcGFyYW0ge1RpbWVTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1UaWNrc1xuICogQHBhcmFtIHtVbml0fSBtaW5Vbml0XG4gKiBAcGFyYW0ge251bWJlcn0gbWluXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gKiBAcmV0dXJuIHtVbml0fVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVVbml0Rm9yRm9ybWF0dGluZyhzY2FsZSwgbnVtVGlja3MsIG1pblVuaXQsIG1pbiwgbWF4KSB7XG4gIGZvciAobGV0IGkgPSBVTklUUy5sZW5ndGggLSAxOyBpID49IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGktLSkge1xuICAgIGNvbnN0IHVuaXQgPSBVTklUU1tpXTtcbiAgICBpZiAoSU5URVJWQUxTW3VuaXRdLmNvbW1vbiAmJiBzY2FsZS5fYWRhcHRlci5kaWZmKG1heCwgbWluLCB1bml0KSA+PSBudW1UaWNrcyAtIDEpIHtcbiAgICAgIHJldHVybiB1bml0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBVTklUU1ttaW5Vbml0ID8gVU5JVFMuaW5kZXhPZihtaW5Vbml0KSA6IDBdO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7VW5pdH0gdW5pdFxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVNYWpvclVuaXQodW5pdCkge1xuICBmb3IgKGxldCBpID0gVU5JVFMuaW5kZXhPZih1bml0KSArIDEsIGlsZW4gPSBVTklUUy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICBpZiAoSU5URVJWQUxTW1VOSVRTW2ldXS5jb21tb24pIHtcbiAgICAgIHJldHVybiBVTklUU1tpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gdGlja3NcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lXG4gKiBAcGFyYW0ge251bWJlcltdfSBbdGltZXN0YW1wc10gLSBpZiBkZWZpbmVkLCBzbmFwIHRvIHRoZXNlIHRpbWVzdGFtcHNcbiAqL1xuZnVuY3Rpb24gYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcykge1xuICBpZiAoIXRpbWVzdGFtcHMpIHtcbiAgICB0aWNrc1t0aW1lXSA9IHRydWU7XG4gIH0gZWxzZSBpZiAodGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICBjb25zdCB7bG8sIGhpfSA9IF9sb29rdXAodGltZXN0YW1wcywgdGltZSk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGltZXN0YW1wc1tsb10gPj0gdGltZSA/IHRpbWVzdGFtcHNbbG9dIDogdGltZXN0YW1wc1toaV07XG4gICAgdGlja3NbdGltZXN0YW1wXSA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RpbWVTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7b2JqZWN0W119IHRpY2tzXG4gKiBAcGFyYW0ge29iamVjdH0gbWFwXG4gKiBAcGFyYW0ge1VuaXR9IG1ham9yVW5pdFxuICogQHJldHVybiB7b2JqZWN0W119XG4gKi9cbmZ1bmN0aW9uIHNldE1ham9yVGlja3Moc2NhbGUsIHRpY2tzLCBtYXAsIG1ham9yVW5pdCkge1xuICBjb25zdCBhZGFwdGVyID0gc2NhbGUuX2FkYXB0ZXI7XG4gIGNvbnN0IGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZih0aWNrc1swXS52YWx1ZSwgbWFqb3JVbml0KTtcbiAgY29uc3QgbGFzdCA9IHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdLnZhbHVlO1xuICBsZXQgbWFqb3IsIGluZGV4O1xuXG4gIGZvciAobWFqb3IgPSBmaXJzdDsgbWFqb3IgPD0gbGFzdDsgbWFqb3IgPSArYWRhcHRlci5hZGQobWFqb3IsIDEsIG1ham9yVW5pdCkpIHtcbiAgICBpbmRleCA9IG1hcFttYWpvcl07XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRpY2tzW2luZGV4XS5tYWpvciA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aWNrcztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1RpbWVTY2FsZX0gc2NhbGVcbiAqIEBwYXJhbSB7bnVtYmVyW119IHZhbHVlc1xuICogQHBhcmFtIHtVbml0fHVuZGVmaW5lZH0gW21ham9yVW5pdF1cbiAqIEByZXR1cm4ge29iamVjdFtdfVxuICovXG5mdW5jdGlvbiB0aWNrc0Zyb21UaW1lc3RhbXBzKHNjYWxlLCB2YWx1ZXMsIG1ham9yVW5pdCkge1xuICBjb25zdCB0aWNrcyA9IFtdO1xuICAvKiogQHR5cGUge09iamVjdDxudW1iZXIsb2JqZWN0Pn0gKi9cbiAgY29uc3QgbWFwID0ge307XG4gIGNvbnN0IGlsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICBsZXQgaSwgdmFsdWU7XG5cbiAgZm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xuICAgIHZhbHVlID0gdmFsdWVzW2ldO1xuICAgIG1hcFt2YWx1ZV0gPSBpO1xuXG4gICAgdGlja3MucHVzaCh7XG4gICAgICB2YWx1ZSxcbiAgICAgIG1ham9yOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgLy8gV2Ugc2V0IHRoZSBtYWpvciB0aWNrcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSBjYWxsaW5nIHN0YXJ0T2YgZm9yIGV2ZXJ5IHRpY2tcbiAgLy8gaXMgZXhwZW5zaXZlIHdoZW4gdGhlcmUgaXMgYSBsYXJnZSBudW1iZXIgb2YgdGlja3NcbiAgcmV0dXJuIChpbGVuID09PSAwIHx8ICFtYWpvclVuaXQpID8gdGlja3MgOiBzZXRNYWpvclRpY2tzKHNjYWxlLCB0aWNrcywgbWFwLCBtYWpvclVuaXQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lU2NhbGUgZXh0ZW5kcyBTY2FsZSB7XG5cbiAgc3RhdGljIGlkID0gJ3RpbWUnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7YW55fVxuICAgKi9cbiAgc3RhdGljIGRlZmF1bHRzID0ge1xuICAgIC8qKlxuICAgICAqIFNjYWxlIGJvdW5kYXJ5IHN0cmF0ZWd5IChieXBhc3NlZCBieSBtaW4vbWF4IHRpbWUgb3B0aW9ucylcbiAgICAgKiAtIGBkYXRhYDogbWFrZSBzdXJlIGRhdGEgYXJlIGZ1bGx5IHZpc2libGUsIHRpY2tzIG91dHNpZGUgYXJlIHJlbW92ZWRcbiAgICAgKiAtIGB0aWNrc2A6IG1ha2Ugc3VyZSB0aWNrcyBhcmUgZnVsbHkgdmlzaWJsZSwgZGF0YSBvdXRzaWRlIGFyZSB0cnVuY2F0ZWRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvNDU1NlxuICAgICAqIEBzaW5jZSAyLjcuMFxuICAgICAqL1xuICAgIGJvdW5kczogJ2RhdGEnLFxuXG4gICAgYWRhcHRlcnM6IHt9LFxuICAgIHRpbWU6IHtcbiAgICAgIHBhcnNlcjogZmFsc2UsIC8vIGZhbHNlID09IGEgcGF0dGVybiBzdHJpbmcgZnJvbSBvciBhIGN1c3RvbSBjYWxsYmFjayB0aGF0IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIHRpbWVzdGFtcFxuICAgICAgdW5pdDogZmFsc2UsIC8vIGZhbHNlID09IGF1dG9tYXRpYyBvciBvdmVycmlkZSB3aXRoIHdlZWssIG1vbnRoLCB5ZWFyLCBldGMuXG4gICAgICByb3VuZDogZmFsc2UsIC8vIG5vbmUsIG9yIG92ZXJyaWRlIHdpdGggd2VlaywgbW9udGgsIHllYXIsIGV0Yy5cbiAgICAgIGlzb1dlZWtkYXk6IGZhbHNlLCAvLyBvdmVycmlkZSB3ZWVrIHN0YXJ0IGRheVxuICAgICAgbWluVW5pdDogJ21pbGxpc2Vjb25kJyxcbiAgICAgIGRpc3BsYXlGb3JtYXRzOiB7fVxuICAgIH0sXG4gICAgdGlja3M6IHtcbiAgICAgIC8qKlxuICAgICAgICogVGlja3MgZ2VuZXJhdGlvbiBpbnB1dCB2YWx1ZXM6XG4gICAgICAgKiAtICdhdXRvJzogZ2VuZXJhdGVzIFwib3B0aW1hbFwiIHRpY2tzIGJhc2VkIG9uIHNjYWxlIHNpemUgYW5kIHRpbWUgb3B0aW9ucy5cbiAgICAgICAqIC0gJ2RhdGEnOiBnZW5lcmF0ZXMgdGlja3MgZnJvbSBkYXRhIChpbmNsdWRpbmcgbGFiZWxzIGZyb20gZGF0YSB7dHx4fHl9IG9iamVjdHMpLlxuICAgICAgICogLSAnbGFiZWxzJzogZ2VuZXJhdGVzIHRpY2tzIGZyb20gdXNlciBnaXZlbiBgZGF0YS5sYWJlbHNgIHZhbHVlcyBPTkxZLlxuICAgICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1MDdcbiAgICAgICAqIEBzaW5jZSAyLjcuMFxuICAgICAgICovXG4gICAgICBzb3VyY2U6ICdhdXRvJyxcblxuICAgICAgY2FsbGJhY2s6IGZhbHNlLFxuXG4gICAgICBtYWpvcjoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcblx0ICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG5cdCAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIC8qKiBAdHlwZSB7e2RhdGE6IG51bWJlcltdLCBsYWJlbHM6IG51bWJlcltdLCBhbGw6IG51bWJlcltdfX0gKi9cbiAgICB0aGlzLl9jYWNoZSA9IHtcbiAgICAgIGRhdGE6IFtdLFxuICAgICAgbGFiZWxzOiBbXSxcbiAgICAgIGFsbDogW11cbiAgICB9O1xuXG4gICAgLyoqIEB0eXBlIHtVbml0fSAqL1xuICAgIHRoaXMuX3VuaXQgPSAnZGF5JztcbiAgICAvKiogQHR5cGUge1VuaXQ9fSAqL1xuICAgIHRoaXMuX21ham9yVW5pdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vZmZzZXRzID0ge307XG4gICAgdGhpcy5fbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BhcnNlT3B0cyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGluaXQoc2NhbGVPcHRzLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCB0aW1lID0gc2NhbGVPcHRzLnRpbWUgfHwgKHNjYWxlT3B0cy50aW1lID0ge30pO1xuICAgIC8qKiBAdHlwZSB7RGF0ZUFkYXB0ZXJ9ICovXG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXIgPSBuZXcgYWRhcHRlcnMuX2RhdGUoc2NhbGVPcHRzLmFkYXB0ZXJzLmRhdGUpO1xuXG4gICAgYWRhcHRlci5pbml0KG9wdHMpO1xuXG4gICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eTogYmVmb3JlIGludHJvZHVjaW5nIGFkYXB0ZXIsIGBkaXNwbGF5Rm9ybWF0c2Agd2FzXG4gICAgLy8gc3VwcG9zZWQgdG8gY29udGFpbiAqYWxsKiB1bml0L3N0cmluZyBwYWlycyBidXQgdGhpcyBjYW4ndCBiZSByZXNvbHZlZFxuICAgIC8vIHdoZW4gbG9hZGluZyB0aGUgc2NhbGUgKGFkYXB0ZXJzIGFyZSBsb2FkZWQgYWZ0ZXJ3YXJkKSwgc28gbGV0J3MgcG9wdWxhdGVcbiAgICAvLyBtaXNzaW5nIGZvcm1hdHMgb24gdXBkYXRlXG4gICAgbWVyZ2VJZih0aW1lLmRpc3BsYXlGb3JtYXRzLCBhZGFwdGVyLmZvcm1hdHMoKSk7XG5cbiAgICB0aGlzLl9wYXJzZU9wdHMgPSB7XG4gICAgICBwYXJzZXI6IHRpbWUucGFyc2VyLFxuICAgICAgcm91bmQ6IHRpbWUucm91bmQsXG4gICAgICBpc29XZWVrZGF5OiB0aW1lLmlzb1dlZWtkYXlcbiAgICB9O1xuXG4gICAgc3VwZXIuaW5pdChzY2FsZU9wdHMpO1xuXG4gICAgdGhpcy5fbm9ybWFsaXplZCA9IG9wdHMubm9ybWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0geyp9IHJhd1xuXHQgKiBAcGFyYW0ge251bWJlcj99IFtpbmRleF1cblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cbiAgcGFyc2UocmF3LCBpbmRleCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlKHRoaXMsIHJhdyk7XG4gIH1cblxuICBiZWZvcmVMYXlvdXQoKSB7XG4gICAgc3VwZXIuYmVmb3JlTGF5b3V0KCk7XG4gICAgdGhpcy5fY2FjaGUgPSB7XG4gICAgICBkYXRhOiBbXSxcbiAgICAgIGxhYmVsczogW10sXG4gICAgICBhbGw6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGRldGVybWluZURhdGFMaW1pdHMoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5fYWRhcHRlcjtcbiAgICBjb25zdCB1bml0ID0gb3B0aW9ucy50aW1lLnVuaXQgfHwgJ2RheSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7bWluLCBtYXgsIG1pbkRlZmluZWQsIG1heERlZmluZWR9ID0gdGhpcy5nZXRVc2VyQm91bmRzKCk7XG5cbiAgICAvKipcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gYm91bmRzXG5cdFx0ICovXG4gICAgZnVuY3Rpb24gX2FwcGx5Qm91bmRzKGJvdW5kcykge1xuICAgICAgaWYgKCFtaW5EZWZpbmVkICYmICFpc05hTihib3VuZHMubWluKSkge1xuICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGJvdW5kcy5taW4pO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXhEZWZpbmVkICYmICFpc05hTihib3VuZHMubWF4KSkge1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGJvdW5kcy5tYXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgdXNlciBwcm92aWRlZCBgbWluYCBhbmQgYG1heGAgbGFiZWxzIC8gZGF0YSBib3VuZHMgY2FuIGJlIGlnbm9yZWRcbiAgICBpZiAoIW1pbkRlZmluZWQgfHwgIW1heERlZmluZWQpIHtcbiAgICAgIC8vIExhYmVscyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQsIHdoZW4gdXNlciBkaWQgbm90IGZvcmNlIGJvdW5kc1xuICAgICAgX2FwcGx5Qm91bmRzKHRoaXMuX2dldExhYmVsQm91bmRzKCkpO1xuXG4gICAgICAvLyBJZiBgYm91bmRzYCBpcyBgJ3RpY2tzJ2AgYW5kIGB0aWNrcy5zb3VyY2VgIGlzIGAnbGFiZWxzJ2AsXG4gICAgICAvLyBkYXRhIGJvdW5kcyBhcmUgaWdub3JlZCAoYW5kIGRvbid0IG5lZWQgdG8gYmUgZGV0ZXJtaW5lZClcbiAgICAgIGlmIChvcHRpb25zLmJvdW5kcyAhPT0gJ3RpY2tzJyB8fCBvcHRpb25zLnRpY2tzLnNvdXJjZSAhPT0gJ2xhYmVscycpIHtcbiAgICAgICAgX2FwcGx5Qm91bmRzKHRoaXMuZ2V0TWluTWF4KGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWluID0gaXNGaW5pdGUobWluKSAmJiAhaXNOYU4obWluKSA/IG1pbiA6ICthZGFwdGVyLnN0YXJ0T2YoRGF0ZS5ub3coKSwgdW5pdCk7XG4gICAgbWF4ID0gaXNGaW5pdGUobWF4KSAmJiAhaXNOYU4obWF4KSA/IG1heCA6ICthZGFwdGVyLmVuZE9mKERhdGUubm93KCksIHVuaXQpICsgMTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG1heCBpcyBzdHJpY3RseSBoaWdoZXIgdGhhbiBtaW4gKHJlcXVpcmVkIGJ5IHRoZSB0aW1lc2VyaWVzIGxvb2t1cCB0YWJsZSlcbiAgICB0aGlzLm1pbiA9IE1hdGgubWluKG1pbiwgbWF4IC0gMSk7XG4gICAgdGhpcy5tYXggPSBNYXRoLm1heChtaW4gKyAxLCBtYXgpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0TGFiZWxCb3VuZHMoKSB7XG4gICAgY29uc3QgYXJyID0gdGhpcy5nZXRMYWJlbFRpbWVzdGFtcHMoKTtcbiAgICBsZXQgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGxldCBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgICBpZiAoYXJyLmxlbmd0aCkge1xuICAgICAgbWluID0gYXJyWzBdO1xuICAgICAgbWF4ID0gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIHttaW4sIG1heH07XG4gIH1cblxuICAvKipcblx0ICogQHJldHVybiB7b2JqZWN0W119XG5cdCAqL1xuICBidWlsZFRpY2tzKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XG4gICAgY29uc3QgdGlja09wdHMgPSBvcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IHRpbWVzdGFtcHMgPSB0aWNrT3B0cy5zb3VyY2UgPT09ICdsYWJlbHMnID8gdGhpcy5nZXRMYWJlbFRpbWVzdGFtcHMoKSA6IHRoaXMuX2dlbmVyYXRlKCk7XG5cbiAgICBpZiAob3B0aW9ucy5ib3VuZHMgPT09ICd0aWNrcycgJiYgdGltZXN0YW1wcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWluID0gdGhpcy5fdXNlck1pbiB8fCB0aW1lc3RhbXBzWzBdO1xuICAgICAgdGhpcy5tYXggPSB0aGlzLl91c2VyTWF4IHx8IHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSB0aGlzLm1pbjtcbiAgICBjb25zdCBtYXggPSB0aGlzLm1heDtcblxuICAgIGNvbnN0IHRpY2tzID0gX2ZpbHRlckJldHdlZW4odGltZXN0YW1wcywgbWluLCBtYXgpO1xuXG4gICAgLy8gUFJJVkFURVxuICAgIC8vIGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nIHJlbGllcyBvbiB0aGUgbnVtYmVyIG9mIHRpY2tzIHNvIHdlIGRvbid0IHVzZSBpdCB3aGVuXG4gICAgLy8gYXV0b1NraXAgaXMgZW5hYmxlZCBiZWNhdXNlIHdlIGRvbid0IHlldCBrbm93IHdoYXQgdGhlIGZpbmFsIG51bWJlciBvZiB0aWNrcyB3aWxsIGJlXG4gICAgdGhpcy5fdW5pdCA9IHRpbWVPcHRzLnVuaXQgfHwgKHRpY2tPcHRzLmF1dG9Ta2lwXG4gICAgICA/IGRldGVybWluZVVuaXRGb3JBdXRvVGlja3ModGltZU9wdHMubWluVW5pdCwgdGhpcy5taW4sIHRoaXMubWF4LCB0aGlzLl9nZXRMYWJlbENhcGFjaXR5KG1pbikpXG4gICAgICA6IGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nKHRoaXMsIHRpY2tzLmxlbmd0aCwgdGltZU9wdHMubWluVW5pdCwgdGhpcy5taW4sIHRoaXMubWF4KSk7XG4gICAgdGhpcy5fbWFqb3JVbml0ID0gIXRpY2tPcHRzLm1ham9yLmVuYWJsZWQgfHwgdGhpcy5fdW5pdCA9PT0gJ3llYXInID8gdW5kZWZpbmVkXG4gICAgICA6IGRldGVybWluZU1ham9yVW5pdCh0aGlzLl91bml0KTtcbiAgICB0aGlzLmluaXRPZmZzZXRzKHRpbWVzdGFtcHMpO1xuXG4gICAgaWYgKG9wdGlvbnMucmV2ZXJzZSkge1xuICAgICAgdGlja3MucmV2ZXJzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWNrc0Zyb21UaW1lc3RhbXBzKHRoaXMsIHRpY2tzLCB0aGlzLl9tYWpvclVuaXQpO1xuICB9XG5cbiAgYWZ0ZXJBdXRvU2tpcCgpIHtcbiAgICAvLyBPZmZzZXRzIGZvciBiYXIgY2hhcnRzIG5lZWQgdG8gYmUgaGFuZGxlZCB3aXRoIHRoZSBhdXRvIHNraXBwZWRcbiAgICAvLyB0aWNrcy4gT25jZSB0aWNrcyBoYXZlIGJlZW4gc2tpcHBlZCwgd2UgcmUtY29tcHV0ZSB0aGUgb2Zmc2V0cy5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9mZnNldEFmdGVyQXV0b3NraXApIHtcbiAgICAgIHRoaXMuaW5pdE9mZnNldHModGhpcy50aWNrcy5tYXAodGljayA9PiArdGljay52YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgZnJvbSBlZGdlcyBpbiB0aGUgZm9ybSBvZiB7c3RhcnQsIGVuZH1cblx0ICogd2hlcmUgZWFjaCB2YWx1ZSBpcyBhIHJlbGF0aXZlIHdpZHRoIHRvIHRoZSBzY2FsZSBhbmQgcmFuZ2VzIGJldHdlZW4gMCBhbmQgMS5cblx0ICogVGhleSBhZGQgZXh0cmEgbWFyZ2lucyBvbiB0aGUgYm90aCBzaWRlcyBieSBzY2FsaW5nIGRvd24gdGhlIG9yaWdpbmFsIHNjYWxlLlxuXHQgKiBPZmZzZXRzIGFyZSBhZGRlZCB3aGVuIHRoZSBgb2Zmc2V0YCBvcHRpb24gaXMgdHJ1ZS5cblx0ICogQHBhcmFtIHtudW1iZXJbXX0gdGltZXN0YW1wc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBpbml0T2Zmc2V0cyh0aW1lc3RhbXBzID0gW10pIHtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBlbmQgPSAwO1xuICAgIGxldCBmaXJzdCwgbGFzdDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMub2Zmc2V0ICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XG4gICAgICBmaXJzdCA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbMF0pO1xuICAgICAgaWYgKHRpbWVzdGFtcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHN0YXJ0ID0gMSAtIGZpcnN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSAodGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodGltZXN0YW1wc1sxXSkgLSBmaXJzdCkgLyAyO1xuICAgICAgfVxuICAgICAgbGFzdCA9IHRoaXMuZ2V0RGVjaW1hbEZvclZhbHVlKHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSk7XG4gICAgICBpZiAodGltZXN0YW1wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZW5kID0gbGFzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZCA9IChsYXN0IC0gdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodGltZXN0YW1wc1t0aW1lc3RhbXBzLmxlbmd0aCAtIDJdKSkgLyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsaW1pdCA9IHRpbWVzdGFtcHMubGVuZ3RoIDwgMyA/IDAuNSA6IDAuMjU7XG4gICAgc3RhcnQgPSBfbGltaXRWYWx1ZShzdGFydCwgMCwgbGltaXQpO1xuICAgIGVuZCA9IF9saW1pdFZhbHVlKGVuZCwgMCwgbGltaXQpO1xuXG4gICAgdGhpcy5fb2Zmc2V0cyA9IHtzdGFydCwgZW5kLCBmYWN0b3I6IDEgLyAoc3RhcnQgKyAxICsgZW5kKX07XG4gIH1cblxuICAvKipcblx0ICogR2VuZXJhdGVzIGEgbWF4aW11bSBvZiBgY2FwYWNpdHlgIHRpbWVzdGFtcHMgYmV0d2VlbiBtaW4gYW5kIG1heCwgcm91bmRlZCB0byB0aGVcblx0ICogYG1pbm9yYCB1bml0IHVzaW5nIHRoZSBnaXZlbiBzY2FsZSB0aW1lIGBvcHRpb25zYC5cblx0ICogSW1wb3J0YW50OiB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIHRpY2tzIG91dHNpZGUgdGhlIG1pbiBhbmQgbWF4IHJhbmdlLCBpdCdzIHRoZVxuXHQgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBjb2RlIHRvIGNsYW1wIHZhbHVlcyBpZiBuZWVkZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2VuZXJhdGUoKSB7XG4gICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2FkYXB0ZXI7XG4gICAgY29uc3QgbWluID0gdGhpcy5taW47XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXg7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB0aW1lT3B0cyA9IG9wdGlvbnMudGltZTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbWlub3IgPSB0aW1lT3B0cy51bml0IHx8IGRldGVybWluZVVuaXRGb3JBdXRvVGlja3ModGltZU9wdHMubWluVW5pdCwgbWluLCBtYXgsIHRoaXMuX2dldExhYmVsQ2FwYWNpdHkobWluKSk7XG4gICAgY29uc3Qgc3RlcFNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLnRpY2tzLnN0ZXBTaXplLCAxKTtcbiAgICBjb25zdCB3ZWVrZGF5ID0gbWlub3IgPT09ICd3ZWVrJyA/IHRpbWVPcHRzLmlzb1dlZWtkYXkgOiBmYWxzZTtcbiAgICBjb25zdCBoYXNXZWVrZGF5ID0gaXNOdW1iZXIod2Vla2RheSkgfHwgd2Vla2RheSA9PT0gdHJ1ZTtcbiAgICBjb25zdCB0aWNrcyA9IHt9O1xuICAgIGxldCBmaXJzdCA9IG1pbjtcbiAgICBsZXQgdGltZSwgY291bnQ7XG5cbiAgICAvLyBGb3IgJ3dlZWsnIHVuaXQsIGhhbmRsZSB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgb3B0aW9uXG4gICAgaWYgKGhhc1dlZWtkYXkpIHtcbiAgICAgIGZpcnN0ID0gK2FkYXB0ZXIuc3RhcnRPZihmaXJzdCwgJ2lzb1dlZWsnLCB3ZWVrZGF5KTtcbiAgICB9XG5cbiAgICAvLyBBbGlnbiBmaXJzdCB0aWNrcyBvbiB1bml0XG4gICAgZmlyc3QgPSArYWRhcHRlci5zdGFydE9mKGZpcnN0LCBoYXNXZWVrZGF5ID8gJ2RheScgOiBtaW5vcik7XG5cbiAgICAvLyBQcmV2ZW50IGJyb3dzZXIgZnJvbSBmcmVlemluZyBpbiBjYXNlIHVzZXIgb3B0aW9ucyByZXF1ZXN0IG1pbGxpb25zIG9mIG1pbGxpc2Vjb25kc1xuICAgIGlmIChhZGFwdGVyLmRpZmYobWF4LCBtaW4sIG1pbm9yKSA+IDEwMDAwMCAqIHN0ZXBTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWluICsgJyBhbmQgJyArIG1heCArICcgYXJlIHRvbyBmYXIgYXBhcnQgd2l0aCBzdGVwU2l6ZSBvZiAnICsgc3RlcFNpemUgKyAnICcgKyBtaW5vcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wcyA9IG9wdGlvbnMudGlja3Muc291cmNlID09PSAnZGF0YScgJiYgdGhpcy5nZXREYXRhVGltZXN0YW1wcygpO1xuICAgIGZvciAodGltZSA9IGZpcnN0LCBjb3VudCA9IDA7IHRpbWUgPCBtYXg7IHRpbWUgPSArYWRhcHRlci5hZGQodGltZSwgc3RlcFNpemUsIG1pbm9yKSwgY291bnQrKykge1xuICAgICAgYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcyk7XG4gICAgfVxuXG4gICAgaWYgKHRpbWUgPT09IG1heCB8fCBvcHRpb25zLmJvdW5kcyA9PT0gJ3RpY2tzJyB8fCBjb3VudCA9PT0gMSkge1xuICAgICAgYWRkVGljayh0aWNrcywgdGltZSwgdGltZXN0YW1wcyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aWNrcykuc29ydCgoYSwgYikgPT4gYSAtIGIpLm1hcCh4ID0+ICt4KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cbiAgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLl9hZGFwdGVyO1xuICAgIGNvbnN0IHRpbWVPcHRzID0gdGhpcy5vcHRpb25zLnRpbWU7XG5cbiAgICBpZiAodGltZU9wdHMudG9vbHRpcEZvcm1hdCkge1xuICAgICAgcmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lT3B0cy50b29sdGlwRm9ybWF0KTtcbiAgICB9XG4gICAgcmV0dXJuIGFkYXB0ZXIuZm9ybWF0KHZhbHVlLCB0aW1lT3B0cy5kaXNwbGF5Rm9ybWF0cy5kYXRldGltZSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gZm9ybWF0XG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG4gIGZvcm1hdCh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCBmb3JtYXRzID0gb3B0aW9ucy50aW1lLmRpc3BsYXlGb3JtYXRzO1xuICAgIGNvbnN0IHVuaXQgPSB0aGlzLl91bml0O1xuICAgIGNvbnN0IGZtdCA9IGZvcm1hdCB8fCBmb3JtYXRzW3VuaXRdO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh2YWx1ZSwgZm10KTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgYW4gaW5kaXZpZHVhbCB0aWNrIG1hcmtcblx0ICogQHBhcmFtIHtudW1iZXJ9IHRpbWVcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IHRpY2tzXG5cdCAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gW2Zvcm1hdF1cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX3RpY2tGb3JtYXRGdW5jdGlvbih0aW1lLCBpbmRleCwgdGlja3MsIGZvcm1hdCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gb3B0aW9ucy50aWNrcy5jYWxsYmFjaztcblxuICAgIGlmIChmb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBjYWxsKGZvcm1hdHRlciwgW3RpbWUsIGluZGV4LCB0aWNrc10sIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdHMgPSBvcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHM7XG4gICAgY29uc3QgdW5pdCA9IHRoaXMuX3VuaXQ7XG4gICAgY29uc3QgbWFqb3JVbml0ID0gdGhpcy5fbWFqb3JVbml0O1xuICAgIGNvbnN0IG1pbm9yRm9ybWF0ID0gdW5pdCAmJiBmb3JtYXRzW3VuaXRdO1xuICAgIGNvbnN0IG1ham9yRm9ybWF0ID0gbWFqb3JVbml0ICYmIGZvcm1hdHNbbWFqb3JVbml0XTtcbiAgICBjb25zdCB0aWNrID0gdGlja3NbaW5kZXhdO1xuICAgIGNvbnN0IG1ham9yID0gbWFqb3JVbml0ICYmIG1ham9yRm9ybWF0ICYmIHRpY2sgJiYgdGljay5tYWpvcjtcblxuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyLmZvcm1hdCh0aW1lLCBmb3JtYXQgfHwgKG1ham9yID8gbWFqb3JGb3JtYXQgOiBtaW5vckZvcm1hdCkpO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IHRpY2tzXG5cdCAqL1xuICBnZW5lcmF0ZVRpY2tMYWJlbHModGlja3MpIHtcbiAgICBsZXQgaSwgaWxlbiwgdGljaztcblxuICAgIGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIHRpY2sgPSB0aWNrc1tpXTtcbiAgICAgIHRpY2subGFiZWwgPSB0aGlzLl90aWNrRm9ybWF0RnVuY3Rpb24odGljay52YWx1ZSwgaSwgdGlja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQylcblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cbiAgZ2V0RGVjaW1hbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gTmFOIDogKHZhbHVlIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXRQaXhlbEZvclZhbHVlKHZhbHVlKSB7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IHRoaXMuX29mZnNldHM7XG4gICAgY29uc3QgcG9zID0gdGhpcy5nZXREZWNpbWFsRm9yVmFsdWUodmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmdldFBpeGVsRm9yRGVjaW1hbCgob2Zmc2V0cy5zdGFydCArIHBvcykgKiBvZmZzZXRzLmZhY3Rvcik7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IHBpeGVsXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG4gIGdldFZhbHVlRm9yUGl4ZWwocGl4ZWwpIHtcbiAgICBjb25zdCBvZmZzZXRzID0gdGhpcy5fb2Zmc2V0cztcbiAgICBjb25zdCBwb3MgPSB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgLyBvZmZzZXRzLmZhY3RvciAtIG9mZnNldHMuZW5kO1xuICAgIHJldHVybiB0aGlzLm1pbiArIHBvcyAqICh0aGlzLm1heCAtIHRoaXMubWluKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcblx0ICogQHJldHVybiB7e3c6bnVtYmVyLCBoOm51bWJlcn19XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuICBfZ2V0TGFiZWxTaXplKGxhYmVsKSB7XG4gICAgY29uc3QgdGlja3NPcHRzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuICAgIGNvbnN0IHRpY2tMYWJlbFdpZHRoID0gdGhpcy5jdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoO1xuICAgIGNvbnN0IGFuZ2xlID0gdG9SYWRpYW5zKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aWNrc09wdHMubWF4Um90YXRpb24gOiB0aWNrc09wdHMubWluUm90YXRpb24pO1xuICAgIGNvbnN0IGNvc1JvdGF0aW9uID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgIGNvbnN0IHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGNvbnN0IHRpY2tGb250U2l6ZSA9IHRoaXMuX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMoMCkuc2l6ZTtcblxuICAgIHJldHVybiB7XG4gICAgICB3OiAodGlja0xhYmVsV2lkdGggKiBjb3NSb3RhdGlvbikgKyAodGlja0ZvbnRTaXplICogc2luUm90YXRpb24pLFxuICAgICAgaDogKHRpY2tMYWJlbFdpZHRoICogc2luUm90YXRpb24pICsgKHRpY2tGb250U2l6ZSAqIGNvc1JvdGF0aW9uKVxuICAgIH07XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJ9IGV4YW1wbGVUaW1lXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICogQHByaXZhdGVcblx0ICovXG4gIF9nZXRMYWJlbENhcGFjaXR5KGV4YW1wbGVUaW1lKSB7XG4gICAgY29uc3QgdGltZU9wdHMgPSB0aGlzLm9wdGlvbnMudGltZTtcbiAgICBjb25zdCBkaXNwbGF5Rm9ybWF0cyA9IHRpbWVPcHRzLmRpc3BsYXlGb3JtYXRzO1xuXG4gICAgLy8gcGljayB0aGUgbG9uZ2VzdCBmb3JtYXQgKG1pbGxpc2Vjb25kcykgZm9yIGd1ZXN0aW1hdGlvblxuICAgIGNvbnN0IGZvcm1hdCA9IGRpc3BsYXlGb3JtYXRzW3RpbWVPcHRzLnVuaXRdIHx8IGRpc3BsYXlGb3JtYXRzLm1pbGxpc2Vjb25kO1xuICAgIGNvbnN0IGV4YW1wbGVMYWJlbCA9IHRoaXMuX3RpY2tGb3JtYXRGdW5jdGlvbihleGFtcGxlVGltZSwgMCwgdGlja3NGcm9tVGltZXN0YW1wcyh0aGlzLCBbZXhhbXBsZVRpbWVdLCB0aGlzLl9tYWpvclVuaXQpLCBmb3JtYXQpO1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRMYWJlbFNpemUoZXhhbXBsZUxhYmVsKTtcbiAgICAvLyBzdWJ0cmFjdCAxIC0gaWYgb2Zmc2V0IHRoZW4gdGhlcmUncyBvbmUgbGVzcyBsYWJlbCB0aGFuIHRpY2tcbiAgICAvLyBpZiBub3Qgb2Zmc2V0IHRoZW4gb25lIGhhbGYgbGFiZWwgcGFkZGluZyBpcyBhZGRlZCB0byBlYWNoIGVuZCBsZWF2aW5nIHJvb20gZm9yIG9uZSBsZXNzIGxhYmVsXG4gICAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLmZsb29yKHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLndpZHRoIC8gc2l6ZS53IDogdGhpcy5oZWlnaHQgLyBzaXplLmgpIC0gMTtcbiAgICByZXR1cm4gY2FwYWNpdHkgPiAwID8gY2FwYWNpdHkgOiAxO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIGdldERhdGFUaW1lc3RhbXBzKCkge1xuICAgIGxldCB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUuZGF0YSB8fCBbXTtcbiAgICBsZXQgaSwgaWxlbjtcblxuICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YXMgPSB0aGlzLmdldE1hdGNoaW5nVmlzaWJsZU1ldGFzKCk7XG5cbiAgICBpZiAodGhpcy5fbm9ybWFsaXplZCAmJiBtZXRhcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAodGhpcy5fY2FjaGUuZGF0YSA9IG1ldGFzWzBdLmNvbnRyb2xsZXIuZ2V0QWxsUGFyc2VkVmFsdWVzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbWV0YXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICB0aW1lc3RhbXBzID0gdGltZXN0YW1wcy5jb25jYXQobWV0YXNbaV0uY29udHJvbGxlci5nZXRBbGxQYXJzZWRWYWx1ZXModGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5fY2FjaGUuZGF0YSA9IHRoaXMubm9ybWFsaXplKHRpbWVzdGFtcHMpKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBnZXRMYWJlbFRpbWVzdGFtcHMoKSB7XG4gICAgY29uc3QgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmxhYmVscyB8fCBbXTtcbiAgICBsZXQgaSwgaWxlbjtcblxuICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5nZXRMYWJlbHMoKTtcbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gbGFiZWxzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuICAgICAgdGltZXN0YW1wcy5wdXNoKHBhcnNlKHRoaXMsIGxhYmVsc1tpXSkpO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5fY2FjaGUubGFiZWxzID0gdGhpcy5fbm9ybWFsaXplZCA/IHRpbWVzdGFtcHMgOiB0aGlzLm5vcm1hbGl6ZSh0aW1lc3RhbXBzKSk7XG4gIH1cblxuICAvKipcblx0ICogQHBhcmFtIHtudW1iZXJbXX0gdmFsdWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG4gIG5vcm1hbGl6ZSh2YWx1ZXMpIHtcbiAgICAvLyBJdCBzZWVtcyB0byBiZSBzb21ld2hhdCBmYXN0ZXIgdG8gZG8gc29ydGluZyBmaXJzdFxuICAgIHJldHVybiBfYXJyYXlVbmlxdWUodmFsdWVzLnNvcnQoc29ydGVyKSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgVGltZVNjYWxlIGZyb20gJy4vc2NhbGUudGltZS5qcyc7XG5pbXBvcnQge19sb29rdXBCeUtleX0gZnJvbSAnLi4vaGVscGVycy9oZWxwZXJzLmNvbGxlY3Rpb24uanMnO1xuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGUgZ2l2ZW4gc291cmNlIGB2YWxgIHVzaW5nIHRoZSB0YWJsZS4gSWYgdmFsdWUgaXMgb3V0IG9mIGJvdW5kcywgdmFsdWVzXG4gKiBhdCBlZGdlcyBhcmUgdXNlZCBmb3IgdGhlIGludGVycG9sYXRpb24uXG4gKiBAcGFyYW0ge29iamVjdH0gdGFibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldmVyc2VdIGxvb2t1cCB0aW1lIGJhc2VkIG9uIHBvc2l0aW9uIGluc3RlYWQgb2YgdmljZSB2ZXJzYVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh0YWJsZSwgdmFsLCByZXZlcnNlKSB7XG4gIGxldCBsbyA9IDA7XG4gIGxldCBoaSA9IHRhYmxlLmxlbmd0aCAtIDE7XG4gIGxldCBwcmV2U291cmNlLCBuZXh0U291cmNlLCBwcmV2VGFyZ2V0LCBuZXh0VGFyZ2V0O1xuICBpZiAocmV2ZXJzZSkge1xuICAgIGlmICh2YWwgPj0gdGFibGVbbG9dLnBvcyAmJiB2YWwgPD0gdGFibGVbaGldLnBvcykge1xuICAgICAgKHtsbywgaGl9ID0gX2xvb2t1cEJ5S2V5KHRhYmxlLCAncG9zJywgdmFsKSk7XG4gICAgfVxuICAgICh7cG9zOiBwcmV2U291cmNlLCB0aW1lOiBwcmV2VGFyZ2V0fSA9IHRhYmxlW2xvXSk7XG4gICAgKHtwb3M6IG5leHRTb3VyY2UsIHRpbWU6IG5leHRUYXJnZXR9ID0gdGFibGVbaGldKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsID49IHRhYmxlW2xvXS50aW1lICYmIHZhbCA8PSB0YWJsZVtoaV0udGltZSkge1xuICAgICAgKHtsbywgaGl9ID0gX2xvb2t1cEJ5S2V5KHRhYmxlLCAndGltZScsIHZhbCkpO1xuICAgIH1cbiAgICAoe3RpbWU6IHByZXZTb3VyY2UsIHBvczogcHJldlRhcmdldH0gPSB0YWJsZVtsb10pO1xuICAgICh7dGltZTogbmV4dFNvdXJjZSwgcG9zOiBuZXh0VGFyZ2V0fSA9IHRhYmxlW2hpXSk7XG4gIH1cblxuICBjb25zdCBzcGFuID0gbmV4dFNvdXJjZSAtIHByZXZTb3VyY2U7XG4gIHJldHVybiBzcGFuID8gcHJldlRhcmdldCArIChuZXh0VGFyZ2V0IC0gcHJldlRhcmdldCkgKiAodmFsIC0gcHJldlNvdXJjZSkgLyBzcGFuIDogcHJldlRhcmdldDtcbn1cblxuY2xhc3MgVGltZVNlcmllc1NjYWxlIGV4dGVuZHMgVGltZVNjYWxlIHtcblxuICBzdGF0aWMgaWQgPSAndGltZXNlcmllcyc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHthbnl9XG4gICAqL1xuICBzdGF0aWMgZGVmYXVsdHMgPSBUaW1lU2NhbGUuZGVmYXVsdHM7XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuXHQgKi9cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAvKiogQHR5cGUge29iamVjdFtdfSAqL1xuICAgIHRoaXMuX3RhYmxlID0gW107XG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5fbWluUG9zID0gdW5kZWZpbmVkO1xuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIHRoaXMuX3RhYmxlUmFuZ2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cbiAgaW5pdE9mZnNldHMoKSB7XG4gICAgY29uc3QgdGltZXN0YW1wcyA9IHRoaXMuX2dldFRpbWVzdGFtcHNGb3JUYWJsZSgpO1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fdGFibGUgPSB0aGlzLmJ1aWxkTG9va3VwVGFibGUodGltZXN0YW1wcyk7XG4gICAgdGhpcy5fbWluUG9zID0gaW50ZXJwb2xhdGUodGFibGUsIHRoaXMubWluKTtcbiAgICB0aGlzLl90YWJsZVJhbmdlID0gaW50ZXJwb2xhdGUodGFibGUsIHRoaXMubWF4KSAtIHRoaXMuX21pblBvcztcbiAgICBzdXBlci5pbml0T2Zmc2V0cyh0aW1lc3RhbXBzKTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHt0aW1lLCBwb3N9IG9iamVjdHMgdXNlZCB0byBpbnRlcnBvbGF0ZSBhIHNwZWNpZmljIGB0aW1lYCBvciBwb3NpdGlvblxuXHQgKiAoYHBvc2ApIG9uIHRoZSBzY2FsZSwgYnkgc2VhcmNoaW5nIGVudHJpZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmVxdWVzdGVkIHZhbHVlLiBgcG9zYCBpc1xuXHQgKiBhIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxOiAwIGJlaW5nIHRoZSBzdGFydCBvZiB0aGUgc2NhbGUgKGxlZnQgb3IgdG9wKSBhbmQgMSB0aGUgb3RoZXJcblx0ICogZXh0cmVtaXR5IChsZWZ0ICsgd2lkdGggb3IgdG9wICsgaGVpZ2h0KS4gTm90ZSB0aGF0IGl0IHdvdWxkIGJlIG1vcmUgb3B0aW1pemVkIHRvIGRpcmVjdGx5XG5cdCAqIHN0b3JlIHByZS1jb21wdXRlZCBwaXhlbHMsIGJ1dCB0aGUgc2NhbGUgZGltZW5zaW9ucyBhcmUgbm90IGd1YXJhbnRlZWQgYXQgdGhlIHRpbWUgd2UgbmVlZFxuXHQgKiB0byBjcmVhdGUgdGhlIGxvb2t1cCB0YWJsZS4gVGhlIHRhYmxlIEFMV0FZUyBjb250YWlucyBhdCBsZWFzdCB0d28gaXRlbXM6IG1pbiBhbmQgbWF4LlxuXHQgKiBAcGFyYW0ge251bWJlcltdfSB0aW1lc3RhbXBzXG5cdCAqIEByZXR1cm4ge29iamVjdFtdfVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuICBidWlsZExvb2t1cFRhYmxlKHRpbWVzdGFtcHMpIHtcbiAgICBjb25zdCB7bWluLCBtYXh9ID0gdGhpcztcbiAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgIGNvbnN0IHRhYmxlID0gW107XG4gICAgbGV0IGksIGlsZW4sIHByZXYsIGN1cnIsIG5leHQ7XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gdGltZXN0YW1wcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcbiAgICAgIGN1cnIgPSB0aW1lc3RhbXBzW2ldO1xuICAgICAgaWYgKGN1cnIgPj0gbWluICYmIGN1cnIgPD0gbWF4KSB7XG4gICAgICAgIGl0ZW1zLnB1c2goY3Vycik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlcmUgaXMgbGVzcyB0aGF0IDIgdGltZXN0YW1wcyBiZXR3ZWVuIG1pbiBhbmQgbWF4LCB0aGUgc2NhbGUgaXMgZGVmaW5lZCBieSBtaW4gYW5kIG1heFxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge3RpbWU6IG1pbiwgcG9zOiAwfSxcbiAgICAgICAge3RpbWU6IG1heCwgcG9zOiAxfVxuICAgICAgXTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG4gICAgICBuZXh0ID0gaXRlbXNbaSArIDFdO1xuICAgICAgcHJldiA9IGl0ZW1zW2kgLSAxXTtcbiAgICAgIGN1cnIgPSBpdGVtc1tpXTtcblxuICAgICAgLy8gb25seSBhZGQgcG9pbnRzIHRoYXQgYnJlYWtzIHRoZSBzY2FsZSBsaW5lYXJpdHlcbiAgICAgIGlmIChNYXRoLnJvdW5kKChuZXh0ICsgcHJldikgLyAyKSAhPT0gY3Vycikge1xuICAgICAgICB0YWJsZS5wdXNoKHt0aW1lOiBjdXJyLCBwb3M6IGkgLyAoaWxlbiAtIDEpfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YWJsZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aW1lc3RhbXBzXG5cdCAqIEByZXR1cm4ge251bWJlcltdfVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cbiAgX2dldFRpbWVzdGFtcHNGb3JUYWJsZSgpIHtcbiAgICBsZXQgdGltZXN0YW1wcyA9IHRoaXMuX2NhY2hlLmFsbCB8fCBbXTtcblxuICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRpbWVzdGFtcHM7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGF0YVRpbWVzdGFtcHMoKTtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0TGFiZWxUaW1lc3RhbXBzKCk7XG4gICAgaWYgKGRhdGEubGVuZ3RoICYmIGxhYmVsLmxlbmd0aCkge1xuICAgICAgLy8gSWYgY29tYmluaW5nIGxhYmVscyBhbmQgZGF0YSAoZGF0YSBtaWdodCBub3QgY29udGFpbiBhbGwgbGFiZWxzKSxcbiAgICAgIC8vIHdlIG5lZWQgdG8gcmVjaGVjayB1bmlxdWVuZXNzIGFuZCBzb3J0XG4gICAgICB0aW1lc3RhbXBzID0gdGhpcy5ub3JtYWxpemUoZGF0YS5jb25jYXQobGFiZWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZXN0YW1wcyA9IGRhdGEubGVuZ3RoID8gZGF0YSA6IGxhYmVsO1xuICAgIH1cbiAgICB0aW1lc3RhbXBzID0gdGhpcy5fY2FjaGUuYWxsID0gdGltZXN0YW1wcztcblxuICAgIHJldHVybiB0aW1lc3RhbXBzO1xuICB9XG5cbiAgLyoqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuICBnZXREZWNpbWFsRm9yVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gKGludGVycG9sYXRlKHRoaXMuX3RhYmxlLCB2YWx1ZSkgLSB0aGlzLl9taW5Qb3MpIC8gdGhpcy5fdGFibGVSYW5nZTtcbiAgfVxuXG4gIC8qKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWxcblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cbiAgZ2V0VmFsdWVGb3JQaXhlbChwaXhlbCkge1xuICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLl9vZmZzZXRzO1xuICAgIGNvbnN0IGRlY2ltYWwgPSB0aGlzLmdldERlY2ltYWxGb3JQaXhlbChwaXhlbCkgLyBvZmZzZXRzLmZhY3RvciAtIG9mZnNldHMuZW5kO1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZSh0aGlzLl90YWJsZSwgZGVjaW1hbCAqIHRoaXMuX3RhYmxlUmFuZ2UgKyB0aGlzLl9taW5Qb3MsIHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWVTZXJpZXNTY2FsZTtcbiIsICJleHBvcnQgKiBmcm9tICcuL2NvbnRyb2xsZXJzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VsZW1lbnRzL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGxhdGZvcm0vaW5kZXguanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wbHVnaW5zL2luZGV4LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NhbGVzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgY29udHJvbGxlcnMgZnJvbSAnLi9jb250cm9sbGVycy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyBlbGVtZW50cyBmcm9tICcuL2VsZW1lbnRzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSAnLi9wbHVnaW5zL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHNjYWxlcyBmcm9tICcuL3NjYWxlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCB7XG4gIGNvbnRyb2xsZXJzLFxuICBlbGVtZW50cyxcbiAgcGx1Z2lucyxcbiAgc2NhbGVzLFxufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyYWJsZXMgPSBbXG4gIGNvbnRyb2xsZXJzLFxuICBlbGVtZW50cyxcbiAgcGx1Z2lucyxcbiAgc2NhbGVzLFxuXTtcbiIsICJpbXBvcnQgeyBJdGVtVmlldywgV29ya3NwYWNlTGVhZiwgTWVudSwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHR5cGUgU1JQbHVnaW4gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyBDT0xMQVBTRV9JQ09OIH0gZnJvbSBcInNyYy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJldmlld0RlY2sgfSBmcm9tIFwic3JjL3Jldmlldy1kZWNrXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcInNyYy9sYW5nL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNvbnN0IFJFVklFV19RVUVVRV9WSUVXX1RZUEUgPSBcInJldmlldy1xdWV1ZS1saXN0LXZpZXdcIjtcblxuZXhwb3J0IGNsYXNzIFJldmlld1F1ZXVlTGlzdFZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XG4gICAgcHJpdmF0ZSBwbHVnaW46IFNSUGx1Z2luO1xuXG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZiwgcGx1Z2luOiBTUlBsdWdpbikge1xuICAgICAgICBzdXBlcihsZWFmKTtcblxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbihcImZpbGUtb3BlblwiLCAoKSA9PiB0aGlzLnJlZHJhdygpKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbihcInJlbmFtZVwiLCAoKSA9PiB0aGlzLnJlZHJhdygpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZpZXdUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBSRVZJRVdfUVVFVUVfVklFV19UWVBFO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREaXNwbGF5VGV4dCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdChcIk5PVEVTX1JFVklFV19RVUVVRVwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SWNvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJTcGFjZWRSZXBJY29uXCI7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSGVhZGVyTWVudShtZW51OiBNZW51KTogdm9pZCB7XG4gICAgICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRUaXRsZSh0KFwiQ0xPU0VcIikpXG4gICAgICAgICAgICAgICAgLnNldEljb24oXCJjcm9zc1wiKVxuICAgICAgICAgICAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShSRVZJRVdfUVVFVUVfVklFV19UWVBFKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZHJhdygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWN0aXZlRmlsZTogVEZpbGUgfCBudWxsID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcblxuICAgICAgICBjb25zdCByb290RWw6IEhUTUxFbGVtZW50ID0gY3JlYXRlRGl2KFwibmF2LWZvbGRlciBtb2Qtcm9vdFwiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5FbDogSFRNTEVsZW1lbnQgPSByb290RWwuY3JlYXRlRGl2KFwibmF2LWZvbGRlci1jaGlsZHJlblwiKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRlY2tLZXkgaW4gdGhpcy5wbHVnaW4ucmV2aWV3RGVja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY2s6IFJldmlld0RlY2sgPSB0aGlzLnBsdWdpbi5yZXZpZXdEZWNrc1tkZWNrS2V5XTtcblxuICAgICAgICAgICAgY29uc3QgZGVja0NvbGxhcHNlZCA9ICFkZWNrLmFjdGl2ZUZvbGRlcnMuaGFzKGRlY2suZGVja05hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBkZWNrRm9sZGVyRWw6IEhUTUxFbGVtZW50ID0gdGhpcy5jcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5FbCxcbiAgICAgICAgICAgICAgICBkZWNrS2V5LFxuICAgICAgICAgICAgICAgIGRlY2tDb2xsYXBzZWQsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZGVja1xuICAgICAgICAgICAgKS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibmF2LWZvbGRlci1jaGlsZHJlblwiKVswXSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgICAgaWYgKGRlY2submV3Tm90ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vdGVzRm9sZGVyRWw6IEhUTUxFbGVtZW50ID0gdGhpcy5jcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgICAgICAgICAgICAgIGRlY2tGb2xkZXJFbCxcbiAgICAgICAgICAgICAgICAgICAgdChcIk5FV1wiKSxcbiAgICAgICAgICAgICAgICAgICAgIWRlY2suYWN0aXZlRm9sZGVycy5oYXModChcIk5FV1wiKSksXG4gICAgICAgICAgICAgICAgICAgIGRlY2tDb2xsYXBzZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlY2tcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZXdGaWxlIG9mIGRlY2submV3Tm90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUlzT3BlbiA9IGFjdGl2ZUZpbGUgJiYgbmV3RmlsZS5wYXRoID09PSBhY3RpdmVGaWxlLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlSXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLmFjdGl2ZUZvbGRlcnMuYWRkKGRlY2suZGVja05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjay5hY3RpdmVGb2xkZXJzLmFkZCh0KFwiTkVXXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRm9sZGVySWNvblRvRXhwYW5kZWQobmV3Tm90ZXNGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUZvbGRlckljb25Ub0V4cGFuZGVkKGRlY2tGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSaWdodFBhbmVGaWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm90ZXNGb2xkZXJFbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSXNPcGVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgIWRlY2suYWN0aXZlRm9sZGVycy5oYXModChcIk5FV1wiKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZWNrLnNjaGVkdWxlZE5vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJVbml4ID0gLTE7XG4gICAgICAgICAgICAgICAgbGV0IHNjaGVkRm9sZGVyRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhEYXlzVG9SZW5kZXI6IG51bWJlciA9IHRoaXMucGx1Z2luLmRhdGEuc2V0dGluZ3MubWF4TkRheXNOb3Rlc1Jldmlld1F1ZXVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzTm90ZSBvZiBkZWNrLnNjaGVkdWxlZE5vdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzTm90ZS5kdWVVbml4ICE9IGN1cnJVbml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuRGF5czogbnVtYmVyID0gTWF0aC5jZWlsKChzTm90ZS5kdWVVbml4IC0gbm93KSAvICgyNCAqIDM2MDAgKiAxMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuRGF5cyA+IG1heERheXNUb1JlbmRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkRheXMgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVGl0bGUgPSB0KFwiWUVTVEVSREFZXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuRGF5cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlID0gdChcIlRPREFZXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuRGF5cyA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlID0gdChcIlRPTU9SUk9XXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJUaXRsZSA9IG5ldyBEYXRlKHNOb3RlLmR1ZVVuaXgpLnRvRGF0ZVN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZEZvbGRlckVsID0gdGhpcy5jcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVja0ZvbGRlckVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZWNrLmFjdGl2ZUZvbGRlcnMuaGFzKGZvbGRlclRpdGxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNrQ29sbGFwc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyVW5peCA9IHNOb3RlLmR1ZVVuaXg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlSXNPcGVuID0gYWN0aXZlRmlsZSAmJiBzTm90ZS5ub3RlLnBhdGggPT09IGFjdGl2ZUZpbGUucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVJc09wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2suYWN0aXZlRm9sZGVycy5hZGQoZGVjay5kZWNrTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLmFjdGl2ZUZvbGRlcnMuYWRkKGZvbGRlclRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRm9sZGVySWNvblRvRXhwYW5kZWQoc2NoZWRGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUZvbGRlckljb25Ub0V4cGFuZGVkKGRlY2tGb2xkZXJFbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJpZ2h0UGFuZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZEZvbGRlckVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc05vdGUubm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJc09wZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAhZGVjay5hY3RpdmVGb2xkZXJzLmhhcyhmb2xkZXJUaXRsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50RWw6IEVsZW1lbnQgPSB0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzFdO1xuICAgICAgICBjb250ZW50RWwuZW1wdHkoKTtcbiAgICAgICAgY29udGVudEVsLmFwcGVuZENoaWxkKHJvb3RFbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVSaWdodFBhbmVGb2xkZXIoXG4gICAgICAgIHBhcmVudEVsOiBIVE1MRWxlbWVudCxcbiAgICAgICAgZm9sZGVyVGl0bGU6IHN0cmluZyxcbiAgICAgICAgY29sbGFwc2VkOiBib29sZWFuLFxuICAgICAgICBoaWRkZW46IGJvb2xlYW4sXG4gICAgICAgIGRlY2s6IFJldmlld0RlY2tcbiAgICApOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGZvbGRlckVsOiBIVE1MRGl2RWxlbWVudCA9IHBhcmVudEVsLmNyZWF0ZURpdihcIm5hdi1mb2xkZXJcIik7XG4gICAgICAgIGNvbnN0IGZvbGRlclRpdGxlRWw6IEhUTUxEaXZFbGVtZW50ID0gZm9sZGVyRWwuY3JlYXRlRGl2KFwibmF2LWZvbGRlci10aXRsZVwiKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5FbDogSFRNTERpdkVsZW1lbnQgPSBmb2xkZXJFbC5jcmVhdGVEaXYoXCJuYXYtZm9sZGVyLWNoaWxkcmVuXCIpO1xuICAgICAgICBjb25zdCBjb2xsYXBzZUljb25FbDogSFRNTERpdkVsZW1lbnQgPSBmb2xkZXJUaXRsZUVsLmNyZWF0ZURpdihcbiAgICAgICAgICAgIFwibmF2LWZvbGRlci1jb2xsYXBzZS1pbmRpY2F0b3IgY29sbGFwc2UtaWNvblwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29sbGFwc2VJY29uRWwuaW5uZXJIVE1MID0gQ09MTEFQU0VfSUNPTjtcbiAgICAgICAgaWYgKGNvbGxhcHNlZCkge1xuICAgICAgICAgICAgKGNvbGxhcHNlSWNvbkVsLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnRyYW5zZm9ybSA9IFwicm90YXRlKC05MGRlZylcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvbGRlclRpdGxlRWwuY3JlYXRlRGl2KFwibmF2LWZvbGRlci10aXRsZS1jb250ZW50XCIpLnNldFRleHQoZm9sZGVyVGl0bGUpO1xuXG4gICAgICAgIGlmIChoaWRkZW4pIHtcbiAgICAgICAgICAgIGZvbGRlckVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvbGRlclRpdGxlRWwub25DbGlja0V2ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW5FbC5jaGlsZE5vZGVzIGFzIE5vZGVMaXN0T2Y8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkLnN0eWxlLmRpc3BsYXkgPT09IFwiYmxvY2tcIiB8fCBjaGlsZC5zdHlsZS5kaXNwbGF5ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgKGNvbGxhcHNlSWNvbkVsLmNoaWxkTm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLnN0eWxlLnRyYW5zZm9ybSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcInJvdGF0ZSgtOTBkZWcpXCI7XG4gICAgICAgICAgICAgICAgICAgIGRlY2suYWN0aXZlRm9sZGVycy5kZWxldGUoZm9sZGVyVGl0bGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgICAgIChjb2xsYXBzZUljb25FbC5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50KS5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBkZWNrLmFjdGl2ZUZvbGRlcnMuYWRkKGZvbGRlclRpdGxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb2xkZXJFbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVJpZ2h0UGFuZUZpbGUoXG4gICAgICAgIGZvbGRlckVsOiBIVE1MRWxlbWVudCxcbiAgICAgICAgZmlsZTogVEZpbGUsXG4gICAgICAgIGZpbGVFbEFjdGl2ZTogYm9vbGVhbixcbiAgICAgICAgaGlkZGVuOiBib29sZWFuLFxuICAgICAgICBkZWNrOiBSZXZpZXdEZWNrLFxuICAgICAgICBwbHVnaW46IFNSUGx1Z2luXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5hdkZpbGVFbDogSFRNTEVsZW1lbnQgPSBmb2xkZXJFbFxuICAgICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJuYXYtZm9sZGVyLWNoaWxkcmVuXCIpWzBdXG4gICAgICAgICAgICAuY3JlYXRlRGl2KFwibmF2LWZpbGVcIik7XG4gICAgICAgIGlmIChoaWRkZW4pIHtcbiAgICAgICAgICAgIG5hdkZpbGVFbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYXZGaWxlVGl0bGU6IEhUTUxFbGVtZW50ID0gbmF2RmlsZUVsLmNyZWF0ZURpdihcIm5hdi1maWxlLXRpdGxlXCIpO1xuICAgICAgICBpZiAoZmlsZUVsQWN0aXZlKSB7XG4gICAgICAgICAgICBuYXZGaWxlVGl0bGUuYWRkQ2xhc3MoXCJpcy1hY3RpdmVcIik7XG4gICAgICAgIH1cblxuICAgICAgICBuYXZGaWxlVGl0bGUuY3JlYXRlRGl2KFwibmF2LWZpbGUtdGl0bGUtY29udGVudFwiKS5zZXRUZXh0KGZpbGUuYmFzZW5hbWUpO1xuICAgICAgICBuYXZGaWxlVGl0bGUuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwiY2xpY2tcIixcbiAgICAgICAgICAgIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcGx1Z2luLmxhc3RTZWxlY3RlZFJldmlld0RlY2sgPSBkZWNrLmRlY2tOYW1lO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWFmKCkub3BlbkZpbGUoZmlsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgbmF2RmlsZVRpdGxlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcImNvbnRleHRtZW51XCIsXG4gICAgICAgICAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVNZW51OiBNZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UudHJpZ2dlcihcImZpbGUtbWVudVwiLCBmaWxlTWVudSwgZmlsZSwgXCJteS1jb250ZXh0LW1lbnVcIiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgZmlsZU1lbnUuc2hvd0F0UG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICB4OiBldmVudC5wYWdlWCxcbiAgICAgICAgICAgICAgICAgICAgeTogZXZlbnQucGFnZVksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VGb2xkZXJJY29uVG9FeHBhbmRlZChmb2xkZXJFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29sbGFwc2VJY29uRWwgPSBmb2xkZXJFbC5maW5kKFwiZGl2Lm5hdi1mb2xkZXItY29sbGFwc2UtaW5kaWNhdG9yXCIpO1xuICAgICAgICAoY29sbGFwc2VJY29uRWwuY2hpbGROb2Rlc1swXSBhcyBIVE1MRWxlbWVudCkuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQXBwLCBGdXp6eVN1Z2dlc3RNb2RhbCwgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcblxuaW1wb3J0IHsgU2NoZWROb3RlIH0gZnJvbSBcInNyYy9tYWluXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcInNyYy9sYW5nL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFJldmlld0RlY2sge1xuICAgIHB1YmxpYyBkZWNrTmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBuZXdOb3RlczogVEZpbGVbXSA9IFtdO1xuICAgIHB1YmxpYyBzY2hlZHVsZWROb3RlczogU2NoZWROb3RlW10gPSBbXTtcbiAgICBwdWJsaWMgYWN0aXZlRm9sZGVyczogU2V0PHN0cmluZz47XG4gICAgcHVibGljIGR1ZU5vdGVzQ291bnQgPSAwO1xuXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGVja05hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmFjdGl2ZUZvbGRlcnMgPSBuZXcgU2V0KFt0aGlzLmRlY2tOYW1lLCB0KFwiVE9EQVlcIildKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc29ydE5vdGVzKHBhZ2VyYW5rczogUmVjb3JkPHN0cmluZywgbnVtYmVyPik6IHZvaWQge1xuICAgICAgICAvLyBzb3J0IG5ldyBub3RlcyBieSBpbXBvcnRhbmNlXG4gICAgICAgIHRoaXMubmV3Tm90ZXMgPSB0aGlzLm5ld05vdGVzLnNvcnQoXG4gICAgICAgICAgICAoYTogVEZpbGUsIGI6IFRGaWxlKSA9PiAocGFnZXJhbmtzW2IucGF0aF0gfHwgMCkgLSAocGFnZXJhbmtzW2EucGF0aF0gfHwgMClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBzb3J0IHNjaGVkdWxlZCBub3RlcyBieSBkYXRlICYgd2l0aGluIHRob3NlIGRheXMsIHNvcnQgdGhlbSBieSBpbXBvcnRhbmNlXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkTm90ZXMgPSB0aGlzLnNjaGVkdWxlZE5vdGVzLnNvcnQoKGE6IFNjaGVkTm90ZSwgYjogU2NoZWROb3RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhLmR1ZVVuaXggLSBiLmR1ZVVuaXg7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChwYWdlcmFua3NbYi5ub3RlLnBhdGhdIHx8IDApIC0gKHBhZ2VyYW5rc1thLm5vdGUucGF0aF0gfHwgMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldmlld0RlY2tTZWxlY3Rpb25Nb2RhbCBleHRlbmRzIEZ1enp5U3VnZ2VzdE1vZGFsPHN0cmluZz4ge1xuICAgIHB1YmxpYyBkZWNrS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgc3VibWl0Q2FsbGJhY2s6IChkZWNrS2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgZGVja0tleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHN1cGVyKGFwcCk7XG4gICAgICAgIHRoaXMuZGVja0tleXMgPSBkZWNrS2V5cztcbiAgICB9XG5cbiAgICBnZXRJdGVtcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY2tLZXlzO1xuICAgIH1cblxuICAgIGdldEl0ZW1UZXh0KGl0ZW06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIG9uQ2hvb3NlSXRlbShkZWNrS2V5OiBzdHJpbmcsIF86IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5zdWJtaXRDYWxsYmFjayhkZWNrS2V5KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgQ2FyZFR5cGUgfSBmcm9tIFwic3JjL3NjaGVkdWxpbmdcIjtcblxuLyoqXG4gKiBSZXR1cm5zIGZsYXNoY2FyZHMgZm91bmQgaW4gYHRleHRgXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBleHRyYWN0IGZsYXNoY2FyZHMgZnJvbVxuICogQHBhcmFtIHNpbmdsZWxpbmVDYXJkU2VwYXJhdG9yIC0gU2VwYXJhdG9yIGZvciBpbmxpbmUgYmFzaWMgY2FyZHNcbiAqIEBwYXJhbSBzaW5nbGVsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yIC0gU2VwYXJhdG9yIGZvciBpbmxpbmUgcmV2ZXJzZWQgY2FyZHNcbiAqIEBwYXJhbSBtdWx0aWxpbmVDYXJkU2VwYXJhdG9yIC0gU2VwYXJhdG9yIGZvciBtdWx0aWxpbmUgYmFzaWMgY2FyZHNcbiAqIEBwYXJhbSBtdWx0aWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IgLSBTZXBhcmF0b3IgZm9yIG11bHRpbGluZSBiYXNpYyBjYXJkXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBbQ2FyZFR5cGUsIGNhcmQgdGV4dCwgbGluZSBudW1iZXJdIHR1cGxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHNpbmdsZWxpbmVDYXJkU2VwYXJhdG9yOiBzdHJpbmcsXG4gICAgc2luZ2xlbGluZVJldmVyc2VkQ2FyZFNlcGFyYXRvcjogc3RyaW5nLFxuICAgIG11bHRpbGluZUNhcmRTZXBhcmF0b3I6IHN0cmluZyxcbiAgICBtdWx0aWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3I6IHN0cmluZyxcbiAgICBjb252ZXJ0SGlnaGxpZ2h0c1RvQ2xvemVzOiBib29sZWFuLFxuICAgIGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzOiBib29sZWFuLFxuICAgIGNvbnZlcnRDdXJseUJyYWNrZXRzVG9DbG96ZXM6IGJvb2xlYW5cbik6IFtDYXJkVHlwZSwgc3RyaW5nLCBudW1iZXJdW10ge1xuICAgIGxldCBjYXJkVGV4dCA9IFwiXCI7XG4gICAgY29uc3QgY2FyZHM6IFtDYXJkVHlwZSwgc3RyaW5nLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgY2FyZFR5cGU6IENhcmRUeXBlIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxpbmVObyA9IDA7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSB0ZXh0LnJlcGxhY2VBbGwoXCJcXHJcXG5cIiwgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobGluZXNbaV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoY2FyZFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXJkcy5wdXNoKFtjYXJkVHlwZSwgY2FyZFRleHQsIGxpbmVOb10pO1xuICAgICAgICAgICAgICAgIGNhcmRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FyZFRleHQgPSBcIlwiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZXNbaV0uc3RhcnRzV2l0aChcIjwhLS1cIikgJiYgIWxpbmVzW2ldLnN0YXJ0c1dpdGgoXCI8IS0tU1I6XCIpKSB7XG4gICAgICAgICAgICB3aGlsZSAoaSArIDEgPCBsaW5lcy5sZW5ndGggJiYgIWxpbmVzW2ldLmluY2x1ZGVzKFwiLS0+XCIpKSBpKys7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYXJkVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjYXJkVGV4dCArPSBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGNhcmRUZXh0ICs9IGxpbmVzW2ldO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGxpbmVzW2ldLmluY2x1ZGVzKHNpbmdsZWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IpIHx8XG4gICAgICAgICAgICBsaW5lc1tpXS5pbmNsdWRlcyhzaW5nbGVsaW5lQ2FyZFNlcGFyYXRvcilcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjYXJkVHlwZSA9IGxpbmVzW2ldLmluY2x1ZGVzKHNpbmdsZWxpbmVSZXZlcnNlZENhcmRTZXBhcmF0b3IpXG4gICAgICAgICAgICAgICAgPyBDYXJkVHlwZS5TaW5nbGVMaW5lUmV2ZXJzZWRcbiAgICAgICAgICAgICAgICA6IENhcmRUeXBlLlNpbmdsZUxpbmVCYXNpYztcbiAgICAgICAgICAgIGNhcmRUZXh0ID0gbGluZXNbaV07XG4gICAgICAgICAgICBsaW5lTm8gPSBpO1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgbGluZXMubGVuZ3RoICYmIGxpbmVzW2kgKyAxXS5zdGFydHNXaXRoKFwiPCEtLVNSOlwiKSkge1xuICAgICAgICAgICAgICAgIGNhcmRUZXh0ICs9IFwiXFxuXCIgKyBsaW5lc1tpICsgMV07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FyZHMucHVzaChbY2FyZFR5cGUsIGNhcmRUZXh0LCBsaW5lTm9dKTtcbiAgICAgICAgICAgIGNhcmRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgIGNhcmRUZXh0ID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGNhcmRUeXBlID09PSBudWxsICYmXG4gICAgICAgICAgICAoKGNvbnZlcnRIaWdobGlnaHRzVG9DbG96ZXMgJiYgLz09Lio/PT0vZ20udGVzdChsaW5lc1tpXSkpIHx8XG4gICAgICAgICAgICAgICAgKGNvbnZlcnRCb2xkVGV4dFRvQ2xvemVzICYmIC9cXCpcXCouKj9cXCpcXCovZ20udGVzdChsaW5lc1tpXSkpIHx8XG4gICAgICAgICAgICAgICAgKGNvbnZlcnRDdXJseUJyYWNrZXRzVG9DbG96ZXMgJiYgL3t7Lio/fX0vZ20udGVzdChsaW5lc1tpXSkpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNhcmRUeXBlID0gQ2FyZFR5cGUuQ2xvemU7XG4gICAgICAgICAgICBsaW5lTm8gPSBpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmVzW2ldID09PSBtdWx0aWxpbmVDYXJkU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBjYXJkVHlwZSA9IENhcmRUeXBlLk11bHRpTGluZUJhc2ljO1xuICAgICAgICAgICAgbGluZU5vID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lc1tpXSA9PT0gbXVsdGlsaW5lUmV2ZXJzZWRDYXJkU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBjYXJkVHlwZSA9IENhcmRUeXBlLk11bHRpTGluZVJldmVyc2VkO1xuICAgICAgICAgICAgbGluZU5vID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lc1tpXS5zdGFydHNXaXRoKFwiYGBgXCIpIHx8IGxpbmVzW2ldLnN0YXJ0c1dpdGgoXCJ+fn5cIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVCbG9ja0Nsb3NlID0gbGluZXNbaV0ubWF0Y2goL2ArfH4rLylbMF07XG4gICAgICAgICAgICB3aGlsZSAoaSArIDEgPCBsaW5lcy5sZW5ndGggJiYgIWxpbmVzW2kgKyAxXS5zdGFydHNXaXRoKGNvZGVCbG9ja0Nsb3NlKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBjYXJkVGV4dCArPSBcIlxcblwiICsgbGluZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXJkVGV4dCArPSBcIlxcblwiICsgY29kZUJsb2NrQ2xvc2U7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FyZFR5cGUgJiYgY2FyZFRleHQpIHtcbiAgICAgICAgY2FyZHMucHVzaChbY2FyZFR5cGUsIGNhcmRUZXh0LCBsaW5lTm9dKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FyZHM7XG59XG4iLCAiaW1wb3J0IHsgYWRkSWNvbiB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwSWNvbigpIHtcbiAgICBhZGRJY29uKFxuICAgICAgICBcIlNwYWNlZFJlcEljb25cIixcbiAgICAgICAgYDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBkPVwiTSA4OC45NjA5MzggMTcuMjU3ODEyIEwgNDcuNDU3MDMxIDE3LjI1NzgxMiBDIDQ1LjY3OTY4OCAxNy4yNTc4MTIgNDQuMjMwNDY5IDE4LjcwMzEyNSA0NC4yMzA0NjkgMjAuNDg0Mzc1IEwgNDQuMjMwNDY5IDg2LjU1ODU5NCBDIDQ0LjIzMDQ2OSA4OC4zMzU5MzggNDUuNjc5Njg4IDg5Ljc4NTE1NiA0Ny40NTcwMzEgODkuNzg1MTU2IEwgODguOTYwOTM4IDg5Ljc4NTE1NiBDIDkwLjczODI4MSA4OS43ODUxNTYgOTIuMTg3NSA4OC4zMzU5MzggOTIuMTg3NSA4Ni41NTg1OTQgTCA5Mi4xODc1IDIwLjQ4NDM3NSBDIDkyLjE4NzUgMTguNzAzMTI1IDkwLjczODI4MSAxNy4yNTc4MTIgODguOTYwOTM4IDE3LjI1NzgxMiBaIE0gODguMjgxMjUgODUuODc4OTA2IEwgNDguMTM2NzE5IDg1Ljg3ODkwNiBMIDQ4LjEzNjcxOSAyMS4xNjQwNjIgTCA4OC4yODEyNSAyMS4xNjQwNjIgWiBNIDg4LjI4MTI1IDg1Ljg3ODkwNiBcIi8+XG4gICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiAgZD1cIk0gODguOTYwOTM4IDkuNDQ1MzEyIEwgNjEuNjY3OTY5IDkuNDQ1MzEyIEMgNTkuOTI1NzgxIDMuODE2NDA2IDU0LjAxMTcxOSAwLjUxNTYyNSA0OC4yNjk1MzEgMi4wNTQ2ODggTCA4LjE4MzU5NCAxMi43OTY4NzUgQyAyLjMwNDY4OCAxNC4zNzEwOTQgLTEuMTk5MjE5IDIwLjQzNzUgMC4zNzg5MDYgMjYuMzE2NDA2IEwgMTcuNDc2NTYyIDkwLjE0MDYyNSBDIDE4Ljc5Njg3NSA5NS4wNjY0MDYgMjMuMjY5NTMxIDk4LjMyNDIxOSAyOC4xNDQ1MzEgOTguMzI0MjE5IEMgMjkuMDg1OTM4IDk4LjMyNDIxOSAzMC4wNDY4NzUgOTguMTk5MjE5IDMxIDk3Ljk0NTMxMiBMIDQwLjc2NTYyNSA5NS4zMjgxMjUgQyA0Mi42MjUgOTYuNzUgNDQuOTQxNDA2IDk3LjU5NzY1NiA0Ny40NTcwMzEgOTcuNTk3NjU2IEwgODguOTYwOTM4IDk3LjU5NzY1NiBDIDk1LjA0Njg3NSA5Ny41OTc2NTYgMTAwIDkyLjY0NDUzMSAxMDAgODYuNTU4NTk0IEwgMTAwIDIwLjQ4NDM3NSBDIDEwMCAxNC4zOTg0MzggOTUuMDQ2ODc1IDkuNDQ1MzEyIDg4Ljk2MDkzOCA5LjQ0NTMxMiBaIE0gMjkuOTg4MjgxIDk0LjE3MTg3NSBDIDI2LjE4NzUgOTUuMTkxNDA2IDIyLjI2OTUzMSA5Mi45MjU3ODEgMjEuMjUgODkuMTI4OTA2IEwgNC4xNTIzNDQgMjUuMzA0Njg4IEMgMy4xMzI4MTIgMjEuNTA3ODEyIDUuMzk0NTMxIDE3LjU4NTkzOCA5LjE5NTMxMiAxNi41NzAzMTIgTCA0OS4yODEyNSA1LjgyODEyNSBDIDUyLjU3ODEyNSA0Ljk0NTMxMiA1NS45NjA5MzggNi41MzEyNSA1Ny40NjQ4NDQgOS40NDUzMTIgTCA0Ny40NTcwMzEgOS40NDUzMTIgQyA0MS4zNzEwOTQgOS40NDUzMTIgMzYuNDE3OTY5IDE0LjM5ODQzOCAzNi40MTc5NjkgMjAuNDg0Mzc1IEwgMzYuNDE3OTY5IDg2LjU1ODU5NCBDIDM2LjQxNzk2OSA4OC41NTg1OTQgMzYuOTU3MDMxIDkwLjQzMzU5NCAzNy44OTA2MjUgOTIuMDU0Njg4IFogTSA5Ni4wOTM3NSA4Ni41NTg1OTQgQyA5Ni4wOTM3NSA5MC40OTIxODggOTIuODk0NTMxIDkzLjY5MTQwNiA4OC45NjA5MzggOTMuNjkxNDA2IEwgNDcuNDU3MDMxIDkzLjY5MTQwNiBDIDQzLjUyMzQzOCA5My42OTE0MDYgNDAuMzI0MjE5IDkwLjQ5MjE4OCA0MC4zMjQyMTkgODYuNTU4NTk0IEwgNDAuMzI0MjE5IDIwLjQ4NDM3NSBDIDQwLjMyNDIxOSAxNi41NTA3ODEgNDMuNTIzNDM4IDEzLjM1MTU2MiA0Ny40NTcwMzEgMTMuMzUxNTYyIEwgODguOTYwOTM4IDEzLjM1MTU2MiBDIDkyLjg5NDUzMSAxMy4zNTE1NjIgOTYuMDkzNzUgMTYuNTUwNzgxIDk2LjA5Mzc1IDIwLjQ4NDM3NSBaIE0gOTYuMDkzNzUgODYuNTU4NTk0IFwiLz5cbiAgICAgICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiICBkPVwiTSA1NC4xMDE1NjIgNTMuMDkzNzUgTCA2MC4wNzAzMTIgNTcuNDEwMTU2IEwgNTcuNzg5MDYyIDY0LjM3ODkwNiBDIDU2LjkwNjI1IDY3LjA3NDIxOSA1OS45OTYwOTQgNjkuMzIwMzEyIDYyLjI4NTE1NiA2Ny42NDg0MzggTCA2OC4yMTA5MzggNjMuMzI0MjE5IEwgNzQuMTMyODEyIDY3LjY0ODQzOCBDIDc2LjQyMTg3NSA2OS4zMjAzMTIgNzkuNTExNzE5IDY3LjA3NDIxOSA3OC42Mjg5MDYgNjQuMzc4OTA2IEwgNzYuMzQ3NjU2IDU3LjQxMDE1NiBMIDgyLjMyMDMxMiA1My4wOTM3NSBDIDg0LjYxMzI4MSA1MS40MzM1OTQgODMuNDQxNDA2IDQ3LjgwNDY4OCA4MC42MDU0NjkgNDcuODA0Njg4IEwgNzMuMjQyMTg4IDQ3LjgwNDY4OCBMIDcwLjk4ODI4MSA0MC44Mzk4NDQgQyA3MC4xMTcxODggMzguMTQ0NTMxIDY2LjMwMDc4MSAzOC4xNDQ1MzEgNjUuNDI5Njg4IDQwLjgzOTg0NCBMIDYzLjE3OTY4OCA0Ny44MDQ2ODggTCA1NS44MTI1IDQ3LjgwNDY4OCBDIDUyLjk4MDQ2OSA0Ny44MDQ2ODggNTEuODA0Njg4IDUxLjQzMzU5NCA1NC4xMDE1NjIgNTMuMDkzNzUgWiBNIDU0LjEwMTU2MiA1My4wOTM3NSBcIi8+XG4gICAgICAgIGBcbiAgICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQSxtREFBQUEsU0FBQTtBQUFBO0FBRUEsYUFBUyxPQUFPLFFBQVFDLFdBQVU7QUFDOUIsVUFBSyxPQUFPLFdBQVcsWUFBYyxPQUFPQSxjQUFhLFlBQWE7QUFDbEUsaUJBQVMsT0FBTyxRQUFRO0FBQ3BCLGNBQUksT0FBTyxlQUFlLEdBQUcsTUFBTSxNQUFNO0FBQ3JDLGdCQUFJQSxVQUFTLEtBQUssT0FBTyxHQUFHLENBQUMsTUFBTSxPQUFPO0FBQ3RDO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxJQUFBRCxRQUFPLFVBQVcsV0FBWTtBQUMxQixVQUFJLE9BQU87QUFBQSxRQUNQLE9BQU87QUFBQSxRQUNQLE9BQU8sQ0FBQztBQUFBLFFBQ1IsT0FBTyxDQUFDO0FBQUEsTUFDWjtBQUVBLFdBQUssT0FBTyxTQUFVLFFBQVEsUUFBUSxRQUFRO0FBQzFDLFlBQUssU0FBUyxNQUFNLE1BQU0sUUFBVSxXQUFXLE1BQU87QUFDbEQsbUJBQVM7QUFBQSxRQUNiO0FBRUEsaUJBQVMsV0FBVyxNQUFNO0FBRTFCLFlBQUksS0FBSyxNQUFNLGVBQWUsTUFBTSxNQUFNLE1BQU07QUFDNUMsZUFBSztBQUNMLGVBQUssTUFBTSxNQUFNLElBQUk7QUFBQSxZQUNqQixRQUFRO0FBQUEsWUFDUixVQUFVO0FBQUEsVUFDZDtBQUFBLFFBQ0o7QUFFQSxhQUFLLE1BQU0sTUFBTSxFQUFFLFlBQVk7QUFFL0IsWUFBSSxLQUFLLE1BQU0sZUFB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QUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsY0FBYztBQUFBLEVBQ2QsSUFBSTtBQUFBLEVBQ0osU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsYUFBYTtBQUFBLEVBQ2IsU0FBUztBQUFBLEVBQ1QsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsS0FBSztBQUFBLEVBQ0wsS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsS0FBSztBQUFBLEVBQ0wsU0FBUztBQUFBLEVBQ1QsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsV0FBVztBQUFBLEVBQ1gsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsS0FBSztBQUFBLEVBQ0wsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osS0FBSztBQUFBLEVBQ0wsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsS0FBSztBQUFBLEVBQ0wsVUFBVTtBQUFBLEVBQ1YsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QsVUFBVTtBQUFBLEVBQ1YsU0FBUztBQUFBLEVBQ1QsWUFBWTtBQUFBLEVBQ1osTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLEVBQ1gsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsWUFBWTtBQUFBLEVBQ1osV0FBVztBQUFBLEVBQ1gsU0FBUztBQUFBLEVBQ1QsTUFBTTtBQUFBLEVBQ04sS0FBSztBQUFBLEVBQ0wsTUFBTTtBQUFBLEVBQ04sU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsSUFBSTtBQUFBLEVBQ0osVUFBVTtB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LGVBQVcsR0FBRyxXQUFXO0FBQUEsRUFDN0I7QUFDQSxTQUFPLFFBQVEsTUFBTSxHQUFHLEVBQUU7QUFDOUI7IiwKICAibmFtZXMiOiBbIm1vZHVsZSIsICJjYWxsYmFjayIsICJhbHBoYSIsICJlc2MiLCAiU3RyaW5nIiwgInN0ciIsICJyZXBsYWNlIiwgIm1hcCIsICJzIiwgInNldElubmVySFRNTEF0dHIiLCAiRE9NQXR0cmlidXRlTmFtZXMiLCAic2FuaXRpemVkIiwgImgiLCAibmFtZSIsICJhdHRycyIsICJzdGFjayIsICJpIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAicHVzaCIsICJjaGlsZHJlbiIsICJyZXZlcnNlIiwgImVtcHR5VGFncyIsICJpbmRleE9mIiwgIl9faHRtbCIsICJjaGlsZCIsICJwb3AiLCAiaW1wb3J0X29ic2lkaWFuIiwgImltcG9ydF9vYnNpZGlhbiIsICJuYW1lcyIsICJjYWxsYmFjayIsICJhcHAiLCAiaW1wb3J0X29ic2lkaWFuIiwgImgxIiwgImgyIiwgImFwcCIsICJyZXNvbHZlIiwgImNhbGxiYWNrIiwgInZhbHVlIiwgImgiLCAibGluayIsICJkZWNrIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfdmh0bWwiLCAiaCIsICJoIiwgImludGVycG9sYXRlIiwgInQiLCAiY29sb3IiLCAibm9vcCIsICJ1aWQiLCAiaWQiLCAiaXNOdWxsT3JVbmRlZiIsICJ2YWx1ZSIsICJpc0FycmF5IiwgIkFycmF5IiwgInR5cGUiLCAiT2JqZWN0IiwgInByb3RvdHlwZSIsICJ0b1N0cmluZyIsICJjYWxsIiwgInNsaWNlIiwgImlzT2JqZWN0IiwgImlzTnVtYmVyRmluaXRlIiwgIk51bWJlciIsICJpc0Zpbml0ZSIsICJmaW5pdGVPckRlZmF1bHQiLCAiZGVmYXVsdFZhbHVlIiwgInZhbHVlT3JEZWZhdWx0IiwgInRvUGVyY2VudGFnZSIsICJkaW1lbnNpb24iLCAiZW5kc1dpdGgiLCAicGFyc2VGbG9hdCIsICJ0b0RpbWVuc2lvbiIsICJjYWxsYmFjayIsICJmbiIsICJhcmdzIiwgInRoaXNBcmciLCAiYXBwbHkiLCAiZWFjaCIsICJsb29wYWJsZSIsICJyZXZlcnNlIiwgImkiLCAibGVuIiwgImtleXMiLCAibGVuZ3RoIiwgIl9lbGVtZW50c0VxdWFsIiwgImEwIiwgImExIiwgImlsZW4iLCAidjAiLCAidjEiLCAiZGF0YXNldEluZGV4IiwgImluZGV4IiwgImNsb25lIiwgInNvdXJjZSIsICJtYXAiLCAidGFyZ2V0IiwgImNyZWF0ZSIsICJrbGVuIiwgImsiLCAiaXNWYWxpZEtleSIsICJrZXkiLCAiaW5kZXhPZiIsICJfbWVyZ2VyIiwgIm9wdGlvbnMiLCAidHZhbCIsICJzdmFsIiwgIm1lcmdlIiwgInNvdXJjZXMiLCAibWVyZ2VyIiwgImN1cnJlbnQiLCAibWVyZ2VJZiIsICJfbWVyZ2VySWYiLCAiaGFzT3duUHJvcGVydHkiLCAia2V5UmVzb2x2ZXJzIiwgInYiLCAieCIsICJvIiwgInkiLCAiX3NwbGl0S2V5IiwgImtleSIsICJwYXJ0cyIsICJzcGxpdCIsICJrZXlzIiwgInRtcCIsICJwYXJ0IiwgImVuZHNXaXRoIiwgInNsaWNlIiwgInB1c2giLCAiX2dldEtleVJlc29sdmVyIiwgIm9iaiIsICJrIiwgInJlc29sdmVPYmplY3RLZXkiLCAicmVzb2x2ZXIiLCAiX2NhcGl0YWxpemUiLCAic3RyIiwgImNoYXJBdCIsICJ0b1VwcGVyQ2FzZSIsICJkZWZpbmVkIiwgInZhbHVlIiwgImlzRnVuY3Rpb24iLCAic2V0c0VxdWFsIiwgImEiLCAiYiIsICJzaXplIiwgIml0ZW0iLCAiaGFzIiwgIl9pc0NsaWNrRXZlbnQiLCAiZSIsICJ0eXBlIiwgIlBJIiwgIk1hdGgiLCAiVEFVIiwgIlBJVEFVIiwgIklORklOSVRZIiwgIk51bWJlciIsICJQT1NJVElWRV9JTkZJTklUWSIsICJSQURfUEVSX0RFRyIsICJIQUxGX1BJIiwgIlFVQVJURVJfUEkiLCAiVFdPX1RISVJEU19QSSIsICJsb2cxMCIsICJzaWduIiwgImFsbW9zdEVxdWFscyIsICJlcHNpbG9uIiwgImFicyIsICJuaWNlTnVtIiwgInJhbmdlIiwgInJvdW5kZWRSYW5nZSIsICJyb3VuZCIsICJuaWNlUmFuZ2UiLCAicG93IiwgImZsb29yIiwgImZyYWN0aW9uIiwgIm5pY2VGcmFjdGlvbiIsICJfZmFjdG9yaXplIiwgInJlc3VsdCIsICJzcXJ0IiwgImkiLCAic29ydCIsICJwb3AiLCAiaXNOdW1iZXIiLCAibiIsICJpc05hTiIsICJwYXJzZUZsb2F0IiwgImlzRmluaXRlIiwgImFsbW9zdFdob2xlIiwgInJvdW5kZWQiLCAiX3NldE1pbkFuZE1heEJ5S2V5IiwgImFycmF5IiwgInRhcmdldCIsICJwcm9wZXJ0eSIsICJpbGVuIiwgImxlbmd0aCIsICJtaW4iLCAibWF4IiwgInRvUmFkaWFucyIsICJkZWdyZWVzIiwgInRvRGVncmVlcyIsICJyYWRpYW5zIiwgIl9kZWNpbWFsUGxhY2VzIiwgImlzRmluaXRlTnVtYmVyIiwgInAiLCAiZ2V0QW5nbGVGcm9tUG9pbnQiLCAiY2VudHJlUG9pbnQiLCAiYW5nbGVQb2ludCIsICJkaXN0YW5jZUZyb21YQ2VudGVyIiwgImRpc3RhbmNlRnJvbVlDZW50ZXIiLCAicmFkaWFsRGlzdGFuY2VGcm9tQ2VudGVyIiwgImFuZ2xlIiwgImF0YW4yIiwgImRpc3RhbmNlIiwgImRpc3RhbmNlQmV0d2VlblBvaW50cyIsICJwdDEiLCAicHQyIiwgIl9ub3JtYWxpemVBbmdsZSIsICJhIiwgIlRBVSIsICJfYW5nbGVCZXR3ZWVuIiwgImFuZ2xlIiwgInN0YXJ0IiwgImVuZCIsICJzYW1lQW5nbGVJc0Z1bGxDaXJjbGUiLCAicyIsICJlIiwgImFuZ2xlVG9TdGFydCIsICJhbmdsZVRvRW5kIiwgInN0YXJ0VG9BbmdsZSIsICJlbmRUb0FuZ2xlIiwgIl9saW1pdFZhbHVlIiwgInZhbHVlIiwgIm1pbiIsICJtYXgiLCAiTWF0aCIsICJfaW50MTZSYW5nZSIsICJfaXNCZXR3ZWVuIiwgImVwc2lsb24iLCAiX2xvb2t1cCIsICJ0YWJsZSIsICJjbXAiLCAiaW5kZXgiLCAiaGkiLCAibGVuZ3RoIiwgImxvIiwgIm1pZCIsICJfbG9va3VwQnlLZXkiLCAia2V5IiwgImxhc3QiLCAidGkiLCAiX3Jsb29rdXBCeUtleSIsICJfZmlsdGVyQmV0d2VlbiIsICJ2YWx1ZXMiLCAic2xpY2UiLCAiYXJyYXlFdmVudHMiLCAibGlzdGVuQXJyYXlFdmVudHMiLCAiYXJyYXkiLCAibGlzdGVuZXIiLCAiX2NoYXJ0anMiLCAibGlzdGVuZXJzIiwgInB1c2giLCAiT2JqZWN0IiwgImRlZmluZVByb3BlcnR5IiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgImZvckVhY2giLCAibWV0aG9kIiwgIl9jYXBpdGFsaXplIiwgImJhc2UiLCAiYXJncyIsICJyZXMiLCAiYXBwbHkiLCAib2JqZWN0IiwgInVubGlzdGVuQXJyYXlFdmVudHMiLCAic3R1YiIsICJpbmRleE9mIiwgInNwbGljZSIsICJfYXJyYXlVbmlxdWUiLCAiaXRlbXMiLCAic2V0IiwgIlNldCIsICJpIiwgImlsZW4iLCAiYWRkIiwgInNpemUiLCAiQXJyYXkiLCAiZnJvbSIsICJyZXF1ZXN0QW5pbUZyYW1lIiwgIndpbmRvdyIsICJjYWxsYmFjayIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAidGhyb3R0bGVkIiwgImZuIiwgInRoaXNBcmciLCAiYXJnc1RvVXNlIiwgInRpY2tpbmciLCAiYXJncyIsICJjYWxsIiwgImFwcGx5IiwgImRlYm91bmNlIiwgImRlbGF5IiwgInRpbWVvdXQiLCAiY2xlYXJUaW1lb3V0IiwgInNldFRpbWVvdXQiLCAiX3RvTGVmdFJpZ2h0Q2VudGVyIiwgImFsaWduIiwgIl9hbGlnblN0YXJ0RW5kIiwgInN0YXJ0IiwgImVuZCIsICJfdGV4dFgiLCAibGVmdCIsICJyaWdodCIsICJydGwiLCAiY2hlY2siLCAiYXRFZGdlIiwgInQiLCAiZWxhc3RpY0luIiwgInMiLCAicCIsICJNYXRoIiwgInBvdyIsICJzaW4iLCAiVEFVIiwgImVsYXN0aWNPdXQiLCAiZWZmZWN0cyIsICJsaW5lYXIiLCAiZWFzZUluUXVhZCIsICJlYXNlT3V0UXVhZCIsICJlYXNlSW5PdXRRdWFkIiwgImVhc2VJbkN1YmljIiwgImVhc2VPdXRDdWJpYyIsICJlYXNlSW5PdXRDdWJpYyIsICJlYXNlSW5RdWFydCIsICJlYXNlT3V0UXVhcnQiLCAiZWFzZUluT3V0UXVhcnQiLCAiZWFzZUluUXVpbnQiLCAiZWFzZU91dFF1aW50IiwgImVhc2VJbk91dFF1aW50IiwgImVhc2VJblNpbmUiLCAiY29zIiwgIkhBTEZfUEkiLCAiZWFzZU91dFNpbmUiLCAiZWFzZUluT3V0U2luZSIsICJQSSIsICJlYXNlSW5FeHBvIiwgImVhc2VPdXRFeHBvIiwgImVhc2VJbk91dEV4cG8iLCAiZWFzZUluQ2lyYyIsICJzcXJ0IiwgImVhc2VPdXRDaXJjIiwgImVhc2VJbk91dENpcmMiLCAiZWFzZUluRWxhc3RpYyIsICJlYXNlT3V0RWxhc3RpYyIsICJlYXNlSW5PdXRFbGFzdGljIiwgImVhc2VJbkJhY2siLCAiZWFzZU91dEJhY2siLCAiZWFzZUluT3V0QmFjayIsICJlYXNlSW5Cb3VuY2UiLCAiZWFzZU91dEJvdW5jZSIsICJtIiwgImQiLCAiZWFzZUluT3V0Qm91bmNlIiwgImlzUGF0dGVybk9yR3JhZGllbnQiLCAidmFsdWUiLCAidHlwZSIsICJ0b1N0cmluZyIsICJjb2xvciIsICJDb2xvciIsICJnZXRIb3ZlckNvbG9yIiwgInNhdHVyYXRlIiwgImRhcmtlbiIsICJoZXhTdHJpbmciLCAibnVtYmVycyIsICJjb2xvcnMiLCAiYXBwbHlBbmltYXRpb25zRGVmYXVsdHMiLCAiZGVmYXVsdHMiLCAic2V0IiwgImRlbGF5IiwgInVuZGVmaW5lZCIsICJkdXJhdGlvbiIsICJlYXNpbmciLCAiZm4iLCAiZnJvbSIsICJsb29wIiwgInRvIiwgImRlc2NyaWJlIiwgIl9mYWxsYmFjayIsICJfaW5kZXhhYmxlIiwgIl9zY3JpcHRhYmxlIiwgIm5hbWUiLCAicHJvcGVydGllcyIsICJhY3RpdmUiLCAiYW5pbWF0aW9uIiwgInJlc2l6ZSIsICJzaG93IiwgImFuaW1hdGlvbnMiLCAidmlzaWJsZSIsICJoaWRlIiwgInYiLCAiYXBwbHlMYXlvdXRzRGVmYXVsdHMiLCAiYXV0b1BhZGRpbmciLCAicGFkZGluZyIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiLCAiaW50bENhY2hlIiwgIk1hcCIsICJnZXROdW1iZXJGb3JtYXQiLCAibG9jYWxlIiwgIm9wdGlvbnMiLCAiY2FjaGVLZXkiLCAiSlNPTiIsICJzdHJpbmdpZnkiLCAiZm9ybWF0dGVyIiwgImdldCIsICJJbnRsIiwgIk51bWJlckZvcm1hdCIsICJmb3JtYXROdW1iZXIiLCAibnVtIiwgImZvcm1hdCIsICJmb3JtYXR0ZXJzIiwgInZhbHVlcyIsICJpc0FycmF5IiwgIm51bWVyaWMiLCAidGlja1ZhbHVlIiwgImluZGV4IiwgInRpY2tzIiwgImNoYXJ0IiwgIm5vdGF0aW9uIiwgImRlbHRhIiwgImxlbmd0aCIsICJtYXhUaWNrIiwgIm1heCIsICJhYnMiLCAiY2FsY3VsYXRlRGVsdGEiLCAibG9nRGVsdGEiLCAibG9nMTAiLCAibnVtRGVjaW1hbCIsICJtaW4iLCAiZmxvb3IiLCAibWluaW11bUZyYWN0aW9uRGlnaXRzIiwgIm1heGltdW1GcmFjdGlvbkRpZ2l0cyIsICJPYmplY3QiLCAiYXNzaWduIiwgImxvZ2FyaXRobWljIiwgInJlbWFpbiIsICJzaWduaWZpY2FuZCIsICJpbmNsdWRlcyIsICJjYWxsIiwgImFwcGx5U2NhbGVEZWZhdWx0cyIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJyZXZlcnNlIiwgImJlZ2luQXRaZXJvIiwgImJvdW5kcyIsICJncmFjZSIsICJncmlkIiwgImxpbmVXaWR0aCIsICJkcmF3T25DaGFydEFyZWEiLCAiZHJhd1RpY2tzIiwgInRpY2tMZW5ndGgiLCAidGlja1dpZHRoIiwgIl9jdHgiLCAidGlja0NvbG9yIiwgImJvcmRlciIsICJkYXNoIiwgImRhc2hPZmZzZXQiLCAid2lkdGgiLCAidGl0bGUiLCAidGV4dCIsICJtaW5Sb3RhdGlvbiIsICJtYXhSb3RhdGlvbiIsICJtaXJyb3IiLCAidGV4dFN0cm9rZVdpZHRoIiwgInRleHRTdHJva2VDb2xvciIsICJhdXRvU2tpcCIsICJhdXRvU2tpcFBhZGRpbmciLCAibGFiZWxPZmZzZXQiLCAiY2FsbGJhY2siLCAiVGlja3MiLCAibWlub3IiLCAibWFqb3IiLCAiYWxpZ24iLCAiY3Jvc3NBbGlnbiIsICJzaG93TGFiZWxCYWNrZHJvcCIsICJiYWNrZHJvcENvbG9yIiwgImJhY2tkcm9wUGFkZGluZyIsICJyb3V0ZSIsICJzdGFydHNXaXRoIiwgIm92ZXJyaWRlcyIsICJjcmVhdGUiLCAiZGVzY3JpcHRvcnMiLCAiZ2V0U2NvcGUiLCAibm9kZSIsICJrZXkiLCAia2V5cyIsICJzcGxpdCIsICJpIiwgIm4iLCAiayIsICJyb290IiwgInNjb3BlIiwgIm1lcmdlIiwgIkRlZmF1bHRzIiwgImNvbnN0cnVjdG9yIiwgIl9kZXNjcmlwdG9ycyIsICJfYXBwbGllcnMiLCAiYmFja2dyb3VuZENvbG9yIiwgImJvcmRlckNvbG9yIiwgImRhdGFzZXRzIiwgImRldmljZVBpeGVsUmF0aW8iLCAiY29udGV4dCIsICJwbGF0Zm9ybSIsICJnZXREZXZpY2VQaXhlbFJhdGlvIiwgImVsZW1lbnRzIiwgImV2ZW50cyIsICJmb250IiwgImZhbWlseSIsICJzaXplIiwgInN0eWxlIiwgImxpbmVIZWlnaHQiLCAid2VpZ2h0IiwgImhvdmVyIiwgImhvdmVyQmFja2dyb3VuZENvbG9yIiwgImN0eCIsICJob3ZlckJvcmRlckNvbG9yIiwgImhvdmVyQ29sb3IiLCAiaW5kZXhBeGlzIiwgImludGVyYWN0aW9uIiwgIm1vZGUiLCAiaW50ZXJzZWN0IiwgImluY2x1ZGVJbnZpc2libGUiLCAibWFpbnRhaW5Bc3BlY3RSYXRpbyIsICJvbkhvdmVyIiwgIm9uQ2xpY2siLCAicGFyc2luZyIsICJwbHVnaW5zIiwgInJlc3BvbnNpdmUiLCAic2NhbGUiLCAic2NhbGVzIiwgInNob3dMaW5lIiwgImRyYXdBY3RpdmVFbGVtZW50c09uVG9wIiwgImFwcGx5IiwgIm92ZXJyaWRlIiwgInRhcmdldFNjb3BlIiwgInRhcmdldE5hbWUiLCAic2NvcGVPYmplY3QiLCAidGFyZ2V0U2NvcGVPYmplY3QiLCAicHJpdmF0ZU5hbWUiLCAiZGVmaW5lUHJvcGVydGllcyIsICJ3cml0YWJsZSIsICJlbnVtZXJhYmxlIiwgImxvY2FsIiwgInRhcmdldCIsICJpc09iamVjdCIsICJ2YWx1ZU9yRGVmYXVsdCIsICJhcHBsaWVycyIsICJmb3JFYWNoIiwgInRvRm9udFN0cmluZyIsICJpc051bGxPclVuZGVmIiwgIl9tZWFzdXJlVGV4dCIsICJkYXRhIiwgImdjIiwgImxvbmdlc3QiLCAic3RyaW5nIiwgInRleHRXaWR0aCIsICJtZWFzdXJlVGV4dCIsICJwdXNoIiwgIl9sb25nZXN0VGV4dCIsICJhcnJheU9mVGhpbmdzIiwgImNhY2hlIiwgImdhcmJhZ2VDb2xsZWN0IiwgInNhdmUiLCAiaWxlbiIsICJqIiwgImpsZW4iLCAidGhpbmciLCAibmVzdGVkVGhpbmciLCAicmVzdG9yZSIsICJnY0xlbiIsICJzcGxpY2UiLCAiX2FsaWduUGl4ZWwiLCAicGl4ZWwiLCAiY3VycmVudERldmljZVBpeGVsUmF0aW8iLCAiaGFsZldpZHRoIiwgInJvdW5kIiwgImNsZWFyQ2FudmFzIiwgImNhbnZhcyIsICJnZXRDb250ZXh0IiwgInJlc2V0VHJhbnNmb3JtIiwgImNsZWFyUmVjdCIsICJoZWlnaHQiLCAiZHJhd1BvaW50IiwgIngiLCAieSIsICJkcmF3UG9pbnRMZWdlbmQiLCAidyIsICJ4T2Zmc2V0IiwgInlPZmZzZXQiLCAiY29ybmVyUmFkaXVzIiwgInhPZmZzZXRXIiwgInlPZmZzZXRXIiwgInBvaW50U3R5bGUiLCAicm90YXRpb24iLCAicmFkaXVzIiwgInJhZCIsICJSQURfUEVSX0RFRyIsICJ0cmFuc2xhdGUiLCAicm90YXRlIiwgImRyYXdJbWFnZSIsICJpc05hTiIsICJiZWdpblBhdGgiLCAiZWxsaXBzZSIsICJhcmMiLCAiY2xvc2VQYXRoIiwgIm1vdmVUbyIsICJUV09fVEhJUkRTX1BJIiwgImxpbmVUbyIsICJRVUFSVEVSX1BJIiwgIlNRUlQxXzIiLCAicmVjdCIsICJmaWxsIiwgImJvcmRlcldpZHRoIiwgInN0cm9rZSIsICJfaXNQb2ludEluQXJlYSIsICJwb2ludCIsICJhcmVhIiwgIm1hcmdpbiIsICJjbGlwQXJlYSIsICJjbGlwIiwgInVuY2xpcEFyZWEiLCAicmVuZGVyVGV4dCIsICJjdHgiLCAidGV4dCIsICJ4IiwgInkiLCAiZm9udCIsICJvcHRzIiwgImxpbmVzIiwgImlzQXJyYXkiLCAic3Ryb2tlIiwgInN0cm9rZVdpZHRoIiwgInN0cm9rZUNvbG9yIiwgImkiLCAibGluZSIsICJzYXZlIiwgInN0cmluZyIsICJzZXRSZW5kZXJPcHRzIiwgImxlbmd0aCIsICJiYWNrZHJvcCIsICJkcmF3QmFja2Ryb3AiLCAic3Ryb2tlU3R5bGUiLCAiaXNOdWxsT3JVbmRlZiIsICJsaW5lV2lkdGgiLCAic3Ryb2tlVGV4dCIsICJtYXhXaWR0aCIsICJmaWxsVGV4dCIsICJkZWNvcmF0ZVRleHQiLCAibGluZUhlaWdodCIsICJyZXN0b3JlIiwgInRyYW5zbGF0aW9uIiwgInRyYW5zbGF0ZSIsICJyb3RhdGlvbiIsICJyb3RhdGUiLCAiY29sb3IiLCAiZmlsbFN0eWxlIiwgInRleHRBbGlnbiIsICJ0ZXh0QmFzZWxpbmUiLCAic3RyaWtldGhyb3VnaCIsICJ1bmRlcmxpbmUiLCAibWV0cmljcyIsICJtZWFzdXJlVGV4dCIsICJsZWZ0IiwgImFjdHVhbEJvdW5kaW5nQm94TGVmdCIsICJyaWdodCIsICJhY3R1YWxCb3VuZGluZ0JveFJpZ2h0IiwgInRvcCIsICJhY3R1YWxCb3VuZGluZ0JveEFzY2VudCIsICJib3R0b20iLCAiYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50IiwgInlEZWNvcmF0aW9uIiwgImJlZ2luUGF0aCIsICJkZWNvcmF0aW9uV2lkdGgiLCAibW92ZVRvIiwgImxpbmVUbyIsICJvbGRDb2xvciIsICJmaWxsUmVjdCIsICJ3aWR0aCIsICJoZWlnaHQiLCAiYWRkUm91bmRlZFJlY3RQYXRoIiwgInJlY3QiLCAidyIsICJoIiwgInJhZGl1cyIsICJhcmMiLCAidG9wTGVmdCIsICJIQUxGX1BJIiwgIlBJIiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAidG9wUmlnaHQiLCAiTElORV9IRUlHSFQiLCAiRk9OVF9TVFlMRSIsICJ0b0xpbmVIZWlnaHQiLCAidmFsdWUiLCAic2l6ZSIsICJtYXRjaGVzIiwgIm1hdGNoIiwgIm51bWJlck9yWmVybyIsICJ2IiwgIl9yZWFkVmFsdWVUb1Byb3BzIiwgInByb3BzIiwgInJldCIsICJvYmpQcm9wcyIsICJpc09iamVjdCIsICJrZXlzIiwgIk9iamVjdCIsICJyZWFkIiwgInByb3AiLCAidmFsdWVPckRlZmF1bHQiLCAidG9UUkJMIiwgInRvVFJCTENvcm5lcnMiLCAidG9QYWRkaW5nIiwgIm9iaiIsICJ0b0ZvbnQiLCAib3B0aW9ucyIsICJmYWxsYmFjayIsICJkZWZhdWx0cyIsICJwYXJzZUludCIsICJzdHlsZSIsICJjb25zb2xlIiwgIndhcm4iLCAidW5kZWZpbmVkIiwgImZhbWlseSIsICJ3ZWlnaHQiLCAidG9Gb250U3RyaW5nIiwgInJlc29sdmUiLCAiaW5wdXRzIiwgImNvbnRleHQiLCAiaW5kZXgiLCAiaW5mbyIsICJjYWNoZWFibGUiLCAiaWxlbiIsICJfYWRkR3JhY2UiLCAibWlubWF4IiwgImdyYWNlIiwgImJlZ2luQXRaZXJvIiwgIm1pbiIsICJtYXgiLCAiY2hhbmdlIiwgInRvRGltZW5zaW9uIiwgImtlZXBaZXJvIiwgImFkZCIsICJNYXRoIiwgImFicyIsICJjcmVhdGVDb250ZXh0IiwgInBhcmVudENvbnRleHQiLCAiYXNzaWduIiwgImNyZWF0ZSIsICJfY3JlYXRlUmVzb2x2ZXIiLCAic2NvcGVzIiwgInByZWZpeGVzIiwgInJvb3RTY29wZXMiLCAiZ2V0VGFyZ2V0IiwgImRlZmluZWQiLCAiX3Jlc29sdmUiLCAiY2FjaGUiLCAiU3ltYm9sIiwgInRvU3RyaW5nVGFnIiwgIl9jYWNoZWFibGUiLCAiX3Njb3BlcyIsICJfcm9vdFNjb3BlcyIsICJfZmFsbGJhY2siLCAiX2dldFRhcmdldCIsICJvdmVycmlkZSIsICJzY29wZSIsICJQcm94eSIsICJkZWxldGVQcm9wZXJ0eSIsICJ0YXJnZXQiLCAiX2tleXMiLCAiZ2V0IiwgIl9jYWNoZWQiLCAiX3Jlc29sdmVXaXRoUHJlZml4ZXMiLCAiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwgIlJlZmxlY3QiLCAiZ2V0UHJvdG90eXBlT2YiLCAiaGFzIiwgImdldEtleXNGcm9tQWxsU2NvcGVzIiwgImluY2x1ZGVzIiwgIm93bktleXMiLCAic2V0IiwgInN0b3JhZ2UiLCAiX3N0b3JhZ2UiLCAiX2F0dGFjaENvbnRleHQiLCAicHJveHkiLCAic3ViUHJveHkiLCAiZGVzY3JpcHRvckRlZmF1bHRzIiwgIl9wcm94eSIsICJfY29udGV4dCIsICJfc3ViUHJveHkiLCAiX3N0YWNrIiwgIlNldCIsICJfZGVzY3JpcHRvcnMiLCAic2V0Q29udGV4dCIsICJyZWNlaXZlciIsICJfcmVzb2x2ZVdpdGhDb250ZXh0IiwgImFsbEtleXMiLCAiZW51bWVyYWJsZSIsICJjb25maWd1cmFibGUiLCAic2NyaXB0YWJsZSIsICJpbmRleGFibGUiLCAiX3NjcmlwdGFibGUiLCAiX2luZGV4YWJsZSIsICJfYWxsS2V5cyIsICJpc1NjcmlwdGFibGUiLCAiaXNGdW5jdGlvbiIsICJpc0luZGV4YWJsZSIsICJyZWFkS2V5IiwgInByZWZpeCIsICJuYW1lIiwgIl9jYXBpdGFsaXplIiwgIm5lZWRzU3ViUmVzb2x2ZXIiLCAiY29uc3RydWN0b3IiLCAicHJvdG90eXBlIiwgImhhc093blByb3BlcnR5IiwgImNhbGwiLCAiZGVzY3JpcHRvcnMiLCAiX3Jlc29sdmVTY3JpcHRhYmxlIiwgIl9yZXNvbHZlQXJyYXkiLCAiRXJyb3IiLCAiQXJyYXkiLCAiZnJvbSIsICJqb2luIiwgImRlbGV0ZSIsICJjcmVhdGVTdWJSZXNvbHZlciIsICJhcnIiLCAiZmlsdGVyIiwgInMiLCAiaXRlbSIsICJyZXNvbHZlciIsICJwdXNoIiwgInJlc29sdmVGYWxsYmFjayIsICJnZXRTY29wZSIsICJrZXkiLCAicGFyZW50IiwgInJlc29sdmVPYmplY3RLZXkiLCAiYWRkU2NvcGVzIiwgInBhcmVudFNjb3BlcyIsICJwYXJlbnRGYWxsYmFjayIsICJhbGxTY29wZXMiLCAiYWRkU2NvcGVzRnJvbUtleSIsICJzdWJHZXRUYXJnZXQiLCAicmVzb2x2ZUtleXNGcm9tQWxsU2NvcGVzIiwgImsiLCAic3RhcnRzV2l0aCIsICJFUFNJTE9OIiwgIk51bWJlciIsICJfaXNEb21TdXBwb3J0ZWQiLCAid2luZG93IiwgImRvY3VtZW50IiwgIl9nZXRQYXJlbnROb2RlIiwgImRvbU5vZGUiLCAicGFyZW50IiwgInBhcmVudE5vZGUiLCAidG9TdHJpbmciLCAiaG9zdCIsICJwYXJzZU1heFN0eWxlIiwgInN0eWxlVmFsdWUiLCAibm9kZSIsICJwYXJlbnRQcm9wZXJ0eSIsICJ2YWx1ZUluUGl4ZWxzIiwgInBhcnNlSW50IiwgImluZGV4T2YiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlbGVtZW50IiwgIm93bmVyRG9jdW1lbnQiLCAiZGVmYXVsdFZpZXciLCAiZ2V0U3R5bGUiLCAiZWwiLCAicHJvcGVydHkiLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJwb3NpdGlvbnMiLCAiZ2V0UG9zaXRpb25lZFN0eWxlIiwgInN0eWxlcyIsICJzdHlsZSIsICJzdWZmaXgiLCAicmVzdWx0IiwgImkiLCAicG9zIiwgInBhcnNlRmxvYXQiLCAid2lkdGgiLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAidG9wIiwgImJvdHRvbSIsICJ1c2VPZmZzZXRQb3MiLCAieCIsICJ5IiwgInRhcmdldCIsICJzaGFkb3dSb290IiwgImdldENhbnZhc1Bvc2l0aW9uIiwgImUiLCAiY2FudmFzIiwgInRvdWNoZXMiLCAic291cmNlIiwgImxlbmd0aCIsICJvZmZzZXRYIiwgIm9mZnNldFkiLCAiYm94IiwgInJlY3QiLCAiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwgImNsaWVudFgiLCAiY2xpZW50WSIsICJnZXRSZWxhdGl2ZVBvc2l0aW9uIiwgImV2ZW50IiwgImNoYXJ0IiwgImN1cnJlbnREZXZpY2VQaXhlbFJhdGlvIiwgImJvcmRlckJveCIsICJib3hTaXppbmciLCAicGFkZGluZ3MiLCAiYm9yZGVycyIsICJ4T2Zmc2V0IiwgInlPZmZzZXQiLCAiTWF0aCIsICJyb3VuZCIsICJnZXRDb250YWluZXJTaXplIiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJ1bmRlZmluZWQiLCAiY29udGFpbmVyIiwgImNsaWVudFdpZHRoIiwgImNsaWVudEhlaWdodCIsICJjb250YWluZXJTdHlsZSIsICJjb250YWluZXJCb3JkZXIiLCAiY29udGFpbmVyUGFkZGluZyIsICJJTkZJTklUWSIsICJyb3VuZDEiLCAidiIsICJnZXRNYXhpbXVtU2l6ZSIsICJiYldpZHRoIiwgImJiSGVpZ2h0IiwgImFzcGVjdFJhdGlvIiwgIm1hcmdpbnMiLCAiY29udGFpbmVyU2l6ZSIsICJtYXgiLCAibWluIiwgIm1haW50YWluSGVpZ2h0IiwgImZsb29yIiwgInJldGluYVNjYWxlIiwgImZvcmNlUmF0aW8iLCAiZm9yY2VTdHlsZSIsICJwaXhlbFJhdGlvIiwgImRldmljZUhlaWdodCIsICJkZXZpY2VXaWR0aCIsICJjdHgiLCAic2V0VHJhbnNmb3JtIiwgInN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAicGFzc2l2ZVN1cHBvcnRlZCIsICJvcHRpb25zIiwgInBhc3NpdmUiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgInJlYWRVc2VkU2l6ZSIsICJ2YWx1ZSIsICJtYXRjaGVzIiwgIm1hdGNoIiwgImdldFJpZ2h0VG9MZWZ0QWRhcHRlciIsICJyZWN0WCIsICJ3aWR0aCIsICJ4IiwgInNldFdpZHRoIiwgInciLCAidGV4dEFsaWduIiwgImFsaWduIiwgInhQbHVzIiwgInZhbHVlIiwgImxlZnRGb3JMdHIiLCAiaXRlbVdpZHRoIiwgImdldExlZnRUb1JpZ2h0QWRhcHRlciIsICJfaXRlbVdpZHRoIiwgImdldFJ0bEFkYXB0ZXIiLCAicnRsIiwgIm92ZXJyaWRlVGV4dERpcmVjdGlvbiIsICJjdHgiLCAiZGlyZWN0aW9uIiwgInN0eWxlIiwgIm9yaWdpbmFsIiwgImNhbnZhcyIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgImdldFByb3BlcnR5UHJpb3JpdHkiLCAic2V0UHJvcGVydHkiLCAicHJldlRleHREaXJlY3Rpb24iLCAicmVzdG9yZVRleHREaXJlY3Rpb24iLCAidW5kZWZpbmVkIiwgIkFuaW1hdG9yIiwgImNvbnN0cnVjdG9yIiwgIl9yZXF1ZXN0IiwgIl9jaGFydHMiLCAiTWFwIiwgIl9ydW5uaW5nIiwgIl9sYXN0RGF0ZSIsICJ1bmRlZmluZWQiLCAiX25vdGlmeSIsICJjaGFydCIsICJhbmltcyIsICJkYXRlIiwgInR5cGUiLCAiY2FsbGJhY2tzIiwgImxpc3RlbmVycyIsICJudW1TdGVwcyIsICJkdXJhdGlvbiIsICJmb3JFYWNoIiwgImZuIiwgImluaXRpYWwiLCAiY3VycmVudFN0ZXAiLCAiTWF0aCIsICJtaW4iLCAic3RhcnQiLCAiX3JlZnJlc2giLCAicmVxdWVzdEFuaW1GcmFtZSIsICJjYWxsIiwgIndpbmRvdyIsICJfdXBkYXRlIiwgIkRhdGUiLCAibm93IiwgInJlbWFpbmluZyIsICJydW5uaW5nIiwgIml0ZW1zIiwgImxlbmd0aCIsICJpIiwgImRyYXciLCAiaXRlbSIsICJfYWN0aXZlIiwgIl90b3RhbCIsICJ0aWNrIiwgInBvcCIsICJfZ2V0QW5pbXMiLCAiY2hhcnRzIiwgImdldCIsICJjb21wbGV0ZSIsICJwcm9ncmVzcyIsICJzZXQiLCAibGlzdGVuIiwgImV2ZW50IiwgImNiIiwgInB1c2giLCAiYWRkIiwgImhhcyIsICJyZWR1Y2UiLCAiYWNjIiwgImN1ciIsICJtYXgiLCAiX2R1cmF0aW9uIiwgInN0b3AiLCAiY2FuY2VsIiwgInJlbW92ZSIsICJkZWxldGUiLCAidHJhbnNwYXJlbnQiLCAiaW50ZXJwb2xhdG9ycyIsICJib29sZWFuIiwgImZyb20iLCAidG8iLCAiZmFjdG9yIiwgImNvbG9yIiwgImMwIiwgImhlbHBlcnNDb2xvciIsICJjMSIsICJ2YWxpZCIsICJtaXgiLCAiaGV4U3RyaW5nIiwgIm51bWJlciIsICJBbmltYXRpb24iLCAiY2ZnIiwgInRhcmdldCIsICJwcm9wIiwgImN1cnJlbnRWYWx1ZSIsICJyZXNvbHZlIiwgIl9mbiIsICJfZWFzaW5nIiwgImVmZmVjdHMiLCAiZWFzaW5nIiwgImxpbmVhciIsICJfc3RhcnQiLCAiZmxvb3IiLCAiZGVsYXkiLCAiX2xvb3AiLCAibG9vcCIsICJfdGFyZ2V0IiwgIl9wcm9wIiwgIl9mcm9tIiwgIl90byIsICJfcHJvbWlzZXMiLCAiYWN0aXZlIiwgInVwZGF0ZSIsICJlbGFwc2VkIiwgInJlbWFpbiIsICJ3YWl0IiwgInByb21pc2VzIiwgIlByb21pc2UiLCAicmVzIiwgInJlaiIsICJyZXNvbHZlZCIsICJtZXRob2QiLCAiQW5pbWF0aW9ucyIsICJjb25maWciLCAiX2NoYXJ0IiwgIl9wcm9wZXJ0aWVzIiwgImNvbmZpZ3VyZSIsICJpc09iamVjdCIsICJhbmltYXRpb25PcHRpb25zIiwgIk9iamVjdCIsICJrZXlzIiwgImRlZmF1bHRzIiwgImFuaW1hdGlvbiIsICJhbmltYXRlZFByb3BzIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAia2V5IiwgIm9wdGlvbiIsICJpc0FycmF5IiwgInByb3BlcnRpZXMiLCAiX2FuaW1hdGVPcHRpb25zIiwgInZhbHVlcyIsICJuZXdPcHRpb25zIiwgIm9wdGlvbnMiLCAicmVzb2x2ZVRhcmdldE9wdGlvbnMiLCAiYW5pbWF0aW9ucyIsICJfY3JlYXRlQW5pbWF0aW9ucyIsICIkc2hhcmVkIiwgImF3YWl0QWxsIiwgIiRhbmltYXRpb25zIiwgInRoZW4iLCAicHJvcHMiLCAiY2hhckF0IiwgInZhbHVlIiwgInNpemUiLCAiYXNzaWduIiwgImFuaW1hdG9yIiwgImFuaW0iLCAiYWxsIiwgInNjYWxlQ2xpcCIsICJzY2FsZSIsICJhbGxvd2VkT3ZlcmZsb3ciLCAib3B0cyIsICJyZXZlcnNlIiwgImVuZCIsICJkZWZhdWx0Q2xpcCIsICJ4U2NhbGUiLCAieVNjYWxlIiwgIngiLCAieSIsICJ0b3AiLCAicmlnaHQiLCAiYm90dG9tIiwgImxlZnQiLCAidG9DbGlwIiwgInQiLCAiciIsICJiIiwgImwiLCAiZGlzYWJsZWQiLCAiZ2V0U29ydGVkRGF0YXNldEluZGljZXMiLCAiZmlsdGVyVmlzaWJsZSIsICJtZXRhc2V0cyIsICJfZ2V0U29ydGVkRGF0YXNldE1ldGFzIiwgImlsZW4iLCAiaW5kZXgiLCAiYXBwbHlTdGFjayIsICJzdGFjayIsICJkc0luZGV4IiwgInNpbmdsZU1vZGUiLCAibW9kZSIsICJkYXRhc2V0SW5kZXgiLCAib3RoZXJWYWx1ZSIsICJpc0Zpbml0ZSIsICJzaWduIiwgImNvbnZlcnRPYmplY3REYXRhVG9BcnJheSIsICJkYXRhIiwgImFkYXRhIiwgIkFycmF5IiwgImlzU3RhY2tlZCIsICJtZXRhIiwgInN0YWNrZWQiLCAiZ2V0U3RhY2tLZXkiLCAiaW5kZXhTY2FsZSIsICJ2YWx1ZVNjYWxlIiwgImlkIiwgImdldFVzZXJCb3VuZHMiLCAibWluRGVmaW5lZCIsICJtYXhEZWZpbmVkIiwgIk51bWJlciIsICJORUdBVElWRV9JTkZJTklUWSIsICJQT1NJVElWRV9JTkZJTklUWSIsICJnZXRPckNyZWF0ZVN0YWNrIiwgInN0YWNrcyIsICJzdGFja0tleSIsICJpbmRleFZhbHVlIiwgInN1YlN0YWNrIiwgImdldExhc3RJbmRleEluU3RhY2siLCAidlNjYWxlIiwgInBvc2l0aXZlIiwgImdldE1hdGNoaW5nVmlzaWJsZU1ldGFzIiwgInVwZGF0ZVN0YWNrcyIsICJjb250cm9sbGVyIiwgInBhcnNlZCIsICJfY2FjaGVkTWV0YSIsICJfc3RhY2tzIiwgImlTY2FsZSIsICJpQXhpcyIsICJheGlzIiwgInZBeGlzIiwgIml0ZW1TdGFja3MiLCAiX3RvcCIsICJfYm90dG9tIiwgInZpc3VhbFZhbHVlcyIsICJfdmlzdWFsVmFsdWVzIiwgImdldEZpcnN0U2NhbGVJZCIsICJzY2FsZXMiLCAiZmlsdGVyIiwgInNoaWZ0IiwgImNyZWF0ZURhdGFzZXRDb250ZXh0IiwgInBhcmVudCIsICJjcmVhdGVDb250ZXh0IiwgImRhdGFzZXQiLCAiY3JlYXRlRGF0YUNvbnRleHQiLCAiZWxlbWVudCIsICJkYXRhSW5kZXgiLCAicmF3IiwgImNsZWFyU3RhY2tzIiwgIl9wYXJzZWQiLCAiaXNEaXJlY3RVcGRhdGVNb2RlIiwgImNsb25lSWZOb3RTaGFyZWQiLCAiY2FjaGVkIiwgInNoYXJlZCIsICJjcmVhdGVTdGFjayIsICJjYW5TdGFjayIsICJoaWRkZW4iLCAiX3N0YWNrZWQiLCAiRGF0YXNldENvbnRyb2xsZXIiLCAiX2N0eCIsICJjdHgiLCAiX2NhY2hlZERhdGFPcHRzIiwgImdldE1ldGEiLCAiX3R5cGUiLCAiX3BhcnNpbmciLCAiX2RhdGEiLCAiX29iamVjdERhdGEiLCAiX3NoYXJlZE9wdGlvbnMiLCAiX2RyYXdTdGFydCIsICJfZHJhd0NvdW50IiwgImVuYWJsZU9wdGlvblNoYXJpbmciLCAic3VwcG9ydHNEZWNpbWF0aW9uIiwgIiRjb250ZXh0IiwgIl9zeW5jTGlzdCIsICJkYXRhc2V0RWxlbWVudFR5cGUiLCAiZGF0YUVsZW1lbnRUeXBlIiwgImluaXRpYWxpemUiLCAibGlua1NjYWxlcyIsICJhZGRFbGVtZW50cyIsICJmaWxsIiwgImlzUGx1Z2luRW5hYmxlZCIsICJjb25zb2xlIiwgIndhcm4iLCAidXBkYXRlSW5kZXgiLCAiZ2V0RGF0YXNldCIsICJjaG9vc2VJZCIsICJ4aWQiLCAieEF4aXNJRCIsICJ2YWx1ZU9yRGVmYXVsdCIsICJ5aWQiLCAieUF4aXNJRCIsICJyaWQiLCAickF4aXNJRCIsICJpbmRleEF4aXMiLCAiaWlkIiwgImlBeGlzSUQiLCAidmlkIiwgInZBeGlzSUQiLCAiZ2V0U2NhbGVGb3JJZCIsICJyU2NhbGUiLCAiZGF0YXNldHMiLCAiZ2V0RGF0YXNldE1ldGEiLCAic2NhbGVJRCIsICJfZ2V0T3RoZXJTY2FsZSIsICJyZXNldCIsICJfZGVzdHJveSIsICJ1bmxpc3RlbkFycmF5RXZlbnRzIiwgIl9kYXRhQ2hlY2siLCAiaXNFeHRlbnNpYmxlIiwgImxpc3RlbkFycmF5RXZlbnRzIiwgImJ1aWxkT3JVcGRhdGVFbGVtZW50cyIsICJyZXNldE5ld0VsZW1lbnRzIiwgInN0YWNrQ2hhbmdlZCIsICJvbGRTdGFja2VkIiwgIl9yZXN5bmNFbGVtZW50cyIsICJzY29wZUtleXMiLCAiZGF0YXNldFNjb3BlS2V5cyIsICJzY29wZXMiLCAiZ2V0T3B0aW9uU2NvcGVzIiwgImNyZWF0ZVJlc29sdmVyIiwgImdldENvbnRleHQiLCAicGFyc2luZyIsICJwYXJzZSIsICJjb3VudCIsICJzb3J0ZWQiLCAiX3NvcnRlZCIsICJwcmV2IiwgInBhcnNlQXJyYXlEYXRhIiwgInBhcnNlT2JqZWN0RGF0YSIsICJwYXJzZVByaW1pdGl2ZURhdGEiLCAiaXNOb3RJbk9yZGVyQ29tcGFyZWRUb1ByZXYiLCAibGFiZWxzIiwgImdldExhYmVscyIsICJzaW5nbGVTY2FsZSIsICJ4QXhpc0tleSIsICJ5QXhpc0tleSIsICJyZXNvbHZlT2JqZWN0S2V5IiwgImdldFBhcnNlZCIsICJnZXREYXRhRWxlbWVudCIsICJ1cGRhdGVSYW5nZUZyb21QYXJzZWQiLCAicmFuZ2UiLCAicGFyc2VkVmFsdWUiLCAiTmFOIiwgImdldE1pbk1heCIsICJvdGhlclNjYWxlIiwgIm90aGVyTWluIiwgIm90aGVyTWF4IiwgIl9za2lwIiwgImdldEFsbFBhcnNlZFZhbHVlcyIsICJnZXRNYXhPdmVyZmxvdyIsICJnZXRMYWJlbEFuZFZhbHVlIiwgImxhYmVsIiwgImdldExhYmVsRm9yVmFsdWUiLCAiX2NsaXAiLCAiY2xpcCIsICJlbGVtZW50cyIsICJhcmVhIiwgImNoYXJ0QXJlYSIsICJkcmF3QWN0aXZlRWxlbWVudHNPblRvcCIsICJnZXRTdHlsZSIsICJyZXNvbHZlRGF0YXNldEVsZW1lbnRPcHRpb25zIiwgInJlc29sdmVEYXRhRWxlbWVudE9wdGlvbnMiLCAiY29udGV4dCIsICJfcmVzb2x2ZUVsZW1lbnRPcHRpb25zIiwgImVsZW1lbnRUeXBlIiwgImNhY2hlIiwgImNhY2hlS2V5IiwgInNoYXJpbmciLCAiZGVmaW5lZCIsICJkYXRhc2V0RWxlbWVudFNjb3BlS2V5cyIsICJwcmVmaXhlcyIsICJuYW1lcyIsICJyZXNvbHZlTmFtZWRPcHRpb25zIiwgImZyZWV6ZSIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAidHJhbnNpdGlvbiIsICJkYXRhc2V0QW5pbWF0aW9uU2NvcGVLZXlzIiwgIl9jYWNoZWFibGUiLCAiZ2V0U2hhcmVkT3B0aW9ucyIsICJpbmNsdWRlT3B0aW9ucyIsICJzaGFyZWRPcHRpb25zIiwgIl9hbmltYXRpb25zRGlzYWJsZWQiLCAiX2dldFNoYXJlZE9wdGlvbnMiLCAiZmlyc3RPcHRzIiwgInByZXZpb3VzbHlTaGFyZWRPcHRpb25zIiwgInVwZGF0ZVNoYXJlZE9wdGlvbnMiLCAidXBkYXRlRWxlbWVudCIsICJfc2V0U3R5bGUiLCAicmVtb3ZlSG92ZXJTdHlsZSIsICJzZXRIb3ZlclN0eWxlIiwgIl9yZW1vdmVEYXRhc2V0SG92ZXJTdHlsZSIsICJfc2V0RGF0YXNldEhvdmVyU3R5bGUiLCAiYXJnMSIsICJhcmcyIiwgIm51bU1ldGEiLCAibnVtRGF0YSIsICJfaW5zZXJ0RWxlbWVudHMiLCAiX3JlbW92ZUVsZW1lbnRzIiwgIm1vdmUiLCAiYXJyIiwgInVwZGF0ZUVsZW1lbnRzIiwgInJlbW92ZWQiLCAic3BsaWNlIiwgIl9zeW5jIiwgImFyZ3MiLCAiX2RhdGFDaGFuZ2VzIiwgIl9vbkRhdGFQdXNoIiwgImFyZ3VtZW50cyIsICJfb25EYXRhUG9wIiwgIl9vbkRhdGFTaGlmdCIsICJfb25EYXRhU3BsaWNlIiwgIm5ld0NvdW50IiwgIl9vbkRhdGFVbnNoaWZ0IiwgImdldEFsbFNjYWxlVmFsdWVzIiwgIl9jYWNoZSIsICIkYmFyIiwgInZpc2libGVNZXRhcyIsICJjb25jYXQiLCAiX2FycmF5VW5pcXVlIiwgInNvcnQiLCAiYSIsICJjb21wdXRlTWluU2FtcGxlU2l6ZSIsICJfbGVuZ3RoIiwgImN1cnIiLCAidXBkYXRlTWluQW5kUHJldiIsICJhYnMiLCAiZ2V0UGl4ZWxGb3JWYWx1ZSIsICJ0aWNrcyIsICJnZXRQaXhlbEZvclRpY2siLCAiY29tcHV0ZUZpdENhdGVnb3J5VHJhaXRzIiwgInJ1bGVyIiwgInN0YWNrQ291bnQiLCAidGhpY2tuZXNzIiwgImJhclRoaWNrbmVzcyIsICJyYXRpbyIsICJpc051bGxPclVuZGVmIiwgImNhdGVnb3J5UGVyY2VudGFnZSIsICJiYXJQZXJjZW50YWdlIiwgImNodW5rIiwgInBpeGVscyIsICJjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzIiwgIm5leHQiLCAicGVyY2VudCIsICJwYXJzZUZsb2F0QmFyIiwgImVudHJ5IiwgInN0YXJ0VmFsdWUiLCAiZW5kVmFsdWUiLCAiYmFyU3RhcnQiLCAiYmFyRW5kIiwgIl9jdXN0b20iLCAicGFyc2VWYWx1ZSIsICJwYXJzZUFycmF5T3JQcmltaXRpdmUiLCAiaXNGbG9hdEJhciIsICJjdXN0b20iLCAiYmFyU2lnbiIsICJhY3R1YWxCYXNlIiwgImlzSG9yaXpvbnRhbCIsICJib3JkZXJQcm9wcyIsICJob3Jpem9udGFsIiwgImJhc2UiLCAic2V0Qm9yZGVyU2tpcHBlZCIsICJlZGdlIiwgImJvcmRlclNraXBwZWQiLCAiZW5hYmxlQm9yZGVyUmFkaXVzIiwgInBhcnNlRWRnZSIsICJzd2FwIiwgInN0YXJ0RW5kIiwgIm9yaWciLCAidjEiLCAidjIiLCAidiIsICJzZXRJbmZsYXRlQW1vdW50IiwgImluZmxhdGVBbW91bnQiLCAiQmFyQ29udHJvbGxlciIsICJpQXhpc0tleSIsICJ2QXhpc0tleSIsICJvYmoiLCAiYmFycyIsICJnZXRCYXNlUGl4ZWwiLCAiX2dldFJ1bGVyIiwgInZwaXhlbHMiLCAiaGVhZCIsICJfY2FsY3VsYXRlQmFyVmFsdWVQaXhlbHMiLCAiaXBpeGVscyIsICJfY2FsY3VsYXRlQmFySW5kZXhQaXhlbHMiLCAiY2VudGVyIiwgImhlaWdodCIsICJ3aWR0aCIsICJfZ2V0U3RhY2tzIiwgImxhc3QiLCAiZ3JvdXBlZCIsICJza2lwTnVsbCIsICJ2YWwiLCAiaXNOYU4iLCAiaW5kZXhPZiIsICJfZ2V0U3RhY2tDb3VudCIsICJfZ2V0U3RhY2tJbmRleCIsICJuYW1lIiwgIl9zdGFydFBpeGVsIiwgIl9lbmRQaXhlbCIsICJiYXNlVmFsdWUiLCAibWluQmFyTGVuZ3RoIiwgImZsb2F0aW5nIiwgImdldERhdGFWaXNpYmlsaXR5IiwgInN0YXJ0UGl4ZWwiLCAiZ2V0UGl4ZWxGb3JEZWNpbWFsIiwgImVuZFBpeGVsIiwgImdldFZhbHVlRm9yUGl4ZWwiLCAiaGFsZkdyaWQiLCAiZ2V0TGluZVdpZHRoRm9yVmFsdWUiLCAibWF4QmFyVGhpY2tuZXNzIiwgIkluZmluaXR5IiwgInN0YWNrSW5kZXgiLCAicmVjdHMiLCAibnVtYmVycyIsICJvdmVycmlkZXMiLCAiX2luZGV4XyIsICJvZmZzZXQiLCAiZ3JpZCIsICJfdmFsdWVfIiwgImJlZ2luQXRaZXJvIiwgImdldFJhdGlvQW5kT2Zmc2V0IiwgInJvdGF0aW9uIiwgImNpcmN1bWZlcmVuY2UiLCAiY3V0b3V0IiwgInJhdGlvWCIsICJyYXRpb1kiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgIlRBVSIsICJzdGFydEFuZ2xlIiwgImVuZEFuZ2xlIiwgInN0YXJ0WCIsICJNYXRoIiwgImNvcyIsICJzdGFydFkiLCAic2luIiwgImVuZFgiLCAiZW5kWSIsICJjYWxjTWF4IiwgImFuZ2xlIiwgImEiLCAiYiIsICJfYW5nbGVCZXR3ZWVuIiwgIm1heCIsICJjYWxjTWluIiwgIm1pbiIsICJtYXhYIiwgIm1heFkiLCAiSEFMRl9QSSIsICJtaW5YIiwgIlBJIiwgIm1pblkiLCAiRG91Z2hudXRDb250cm9sbGVyIiwgIkRhdGFzZXRDb250cm9sbGVyIiwgImNvbnN0cnVjdG9yIiwgImNoYXJ0IiwgImRhdGFzZXRJbmRleCIsICJlbmFibGVPcHRpb25TaGFyaW5nIiwgImlubmVyUmFkaXVzIiwgInVuZGVmaW5lZCIsICJvdXRlclJhZGl1cyIsICJsaW5rU2NhbGVzIiwgInBhcnNlIiwgInN0YXJ0IiwgImNvdW50IiwgImRhdGEiLCAiZ2V0RGF0YXNldCIsICJtZXRhIiwgIl9jYWNoZWRNZXRhIiwgIl9wYXJzaW5nIiwgIl9wYXJzZWQiLCAiZ2V0dGVyIiwgImkiLCAiaXNPYmplY3QiLCAia2V5IiwgInJlc29sdmVPYmplY3RLZXkiLCAiaWxlbiIsICJfZ2V0Um90YXRpb24iLCAidG9SYWRpYW5zIiwgIm9wdGlvbnMiLCAiX2dldENpcmN1bWZlcmVuY2UiLCAiX2dldFJvdGF0aW9uRXh0ZW50cyIsICJkYXRhc2V0cyIsICJsZW5ndGgiLCAiaXNEYXRhc2V0VmlzaWJsZSIsICJnZXREYXRhc2V0TWV0YSIsICJ0eXBlIiwgIl90eXBlIiwgImNvbnRyb2xsZXIiLCAidXBkYXRlIiwgIm1vZGUiLCAiY2hhcnRBcmVhIiwgImFyY3MiLCAic3BhY2luZyIsICJnZXRNYXhCb3JkZXJXaWR0aCIsICJnZXRNYXhPZmZzZXQiLCAibWF4U2l6ZSIsICJ3aWR0aCIsICJoZWlnaHQiLCAidG9QZXJjZW50YWdlIiwgImNoYXJ0V2VpZ2h0IiwgIl9nZXRSaW5nV2VpZ2h0IiwgImluZGV4IiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJtYXhSYWRpdXMiLCAidG9EaW1lbnNpb24iLCAicmFkaXVzIiwgInJhZGl1c0xlbmd0aCIsICJfZ2V0VmlzaWJsZURhdGFzZXRXZWlnaHRUb3RhbCIsICJ0b3RhbCIsICJjYWxjdWxhdGVUb3RhbCIsICJfZ2V0UmluZ1dlaWdodE9mZnNldCIsICJ1cGRhdGVFbGVtZW50cyIsICJfY2lyY3VtZmVyZW5jZSIsICJyZXNldCIsICJvcHRzIiwgImFuaW1hdGlvbiIsICJhbmltYXRlUm90YXRlIiwgImdldERhdGFWaXNpYmlsaXR5IiwgImhpZGRlbiIsICJjYWxjdWxhdGVDaXJjdW1mZXJlbmNlIiwgImFuaW1hdGlvbk9wdHMiLCAiY2VudGVyWCIsICJsZWZ0IiwgInJpZ2h0IiwgImNlbnRlclkiLCAidG9wIiwgImJvdHRvbSIsICJhbmltYXRlU2NhbGUiLCAic2hhcmVkT3B0aW9ucyIsICJpbmNsdWRlT3B0aW9ucyIsICJfZ2V0U2hhcmVkT3B0aW9ucyIsICJhcmMiLCAicHJvcGVydGllcyIsICJ4IiwgInkiLCAicmVzb2x2ZURhdGFFbGVtZW50T3B0aW9ucyIsICJhY3RpdmUiLCAidXBkYXRlRWxlbWVudCIsICJtZXRhRGF0YSIsICJ2YWx1ZSIsICJpc05hTiIsICJhYnMiLCAiZ2V0TGFiZWxBbmRWYWx1ZSIsICJsYWJlbHMiLCAiZm9ybWF0TnVtYmVyIiwgImxvY2FsZSIsICJsYWJlbCIsICJib3JkZXJBbGlnbiIsICJib3JkZXJXaWR0aCIsICJob3ZlckJvcmRlcldpZHRoIiwgIm9mZnNldCIsICJob3Zlck9mZnNldCIsICJyaW5nV2VpZ2h0T2Zmc2V0IiwgInZhbHVlT3JEZWZhdWx0IiwgIndlaWdodCIsICJpZCIsICJkZWZhdWx0cyIsICJkYXRhc2V0RWxlbWVudFR5cGUiLCAiZGF0YUVsZW1lbnRUeXBlIiwgImFuaW1hdGlvbnMiLCAibnVtYmVycyIsICJpbmRleEF4aXMiLCAiZGVzY3JpcHRvcnMiLCAiX3NjcmlwdGFibGUiLCAibmFtZSIsICJfaW5kZXhhYmxlIiwgIm92ZXJyaWRlcyIsICJhc3BlY3RSYXRpbyIsICJwbHVnaW5zIiwgImxlZ2VuZCIsICJnZW5lcmF0ZUxhYmVscyIsICJwb2ludFN0eWxlIiwgImNvbG9yIiwgIm1hcCIsICJzdHlsZSIsICJnZXRTdHlsZSIsICJ0ZXh0IiwgImZpbGxTdHlsZSIsICJiYWNrZ3JvdW5kQ29sb3IiLCAic3Ryb2tlU3R5bGUiLCAiYm9yZGVyQ29sb3IiLCAiZm9udENvbG9yIiwgImxpbmVXaWR0aCIsICJvbkNsaWNrIiwgImUiLCAibGVnZW5kSXRlbSIsICJ0b2dnbGVEYXRhVmlzaWJpbGl0eSIsICJQaWVDb250cm9sbGVyIiwgIkRvdWdobnV0Q29udHJvbGxlciIsICJpZCIsICJkZWZhdWx0cyIsICJjdXRvdXQiLCAicm90YXRpb24iLCAiY2lyY3VtZmVyZW5jZSIsICJyYWRpdXMiLCAiYWJzdHJhY3QiLCAiRXJyb3IiLCAiRGF0ZUFkYXB0ZXJCYXNlIiwgIm92ZXJyaWRlIiwgIm1lbWJlcnMiLCAiT2JqZWN0IiwgImFzc2lnbiIsICJwcm90b3R5cGUiLCAiY29uc3RydWN0b3IiLCAib3B0aW9ucyIsICJpbml0IiwgImZvcm1hdHMiLCAicGFyc2UiLCAiZm9ybWF0IiwgImFkZCIsICJkaWZmIiwgInN0YXJ0T2YiLCAiZW5kT2YiLCAiX2RhdGUiLCAiYmluYXJ5U2VhcmNoIiwgIm1ldGFzZXQiLCAiYXhpcyIsICJ2YWx1ZSIsICJpbnRlcnNlY3QiLCAiY29udHJvbGxlciIsICJkYXRhIiwgIl9zb3J0ZWQiLCAiaVNjYWxlIiwgIl9jYWNoZWRNZXRhIiwgImxlbmd0aCIsICJsb29rdXBNZXRob2QiLCAiX3JldmVyc2VQaXhlbHMiLCAiX3Jsb29rdXBCeUtleSIsICJfbG9va3VwQnlLZXkiLCAiX3NoYXJlZE9wdGlvbnMiLCAiZWwiLCAicmFuZ2UiLCAiZ2V0UmFuZ2UiLCAic3RhcnQiLCAiZW5kIiwgImxvIiwgImhpIiwgImV2YWx1YXRlSW50ZXJhY3Rpb25JdGVtcyIsICJjaGFydCIsICJwb3NpdGlvbiIsICJoYW5kbGVyIiwgIm1ldGFzZXRzIiwgImdldFNvcnRlZFZpc2libGVEYXRhc2V0TWV0YXMiLCAiaSIsICJpbGVuIiwgImluZGV4IiwgImoiLCAiZWxlbWVudCIsICJza2lwIiwgImdldERpc3RhbmNlTWV0cmljRm9yQXhpcyIsICJ1c2VYIiwgImluZGV4T2YiLCAidXNlWSIsICJwdDEiLCAicHQyIiwgImRlbHRhWCIsICJNYXRoIiwgImFicyIsICJ4IiwgImRlbHRhWSIsICJ5IiwgInNxcnQiLCAicG93IiwgImdldEludGVyc2VjdEl0ZW1zIiwgInVzZUZpbmFsUG9zaXRpb24iLCAiaW5jbHVkZUludmlzaWJsZSIsICJpdGVtcyIsICJpc1BvaW50SW5BcmVhIiwgImV2YWx1YXRpb25GdW5jIiwgImRhdGFzZXRJbmRleCIsICJfaXNQb2ludEluQXJlYSIsICJjaGFydEFyZWEiLCAiaW5SYW5nZSIsICJwdXNoIiwgImdldE5lYXJlc3RSYWRpYWxJdGVtcyIsICJzdGFydEFuZ2xlIiwgImVuZEFuZ2xlIiwgImdldFByb3BzIiwgImFuZ2xlIiwgImdldEFuZ2xlRnJvbVBvaW50IiwgIl9hbmdsZUJldHdlZW4iLCAiZ2V0TmVhcmVzdENhcnRlc2lhbkl0ZW1zIiwgImRpc3RhbmNlTWV0cmljIiwgIm1pbkRpc3RhbmNlIiwgIk51bWJlciIsICJQT1NJVElWRV9JTkZJTklUWSIsICJjZW50ZXIiLCAiZ2V0Q2VudGVyUG9pbnQiLCAicG9pbnRJbkFyZWEiLCAiZGlzdGFuY2UiLCAiZ2V0TmVhcmVzdEl0ZW1zIiwgImdldEF4aXNJdGVtcyIsICJyYW5nZU1ldGhvZCIsICJpbnRlcnNlY3RzSXRlbSIsICJtb2RlcyIsICJlIiwgImdldFJlbGF0aXZlUG9zaXRpb24iLCAiZWxlbWVudHMiLCAiZm9yRWFjaCIsICJtZXRhIiwgImRhdGFzZXQiLCAiZ2V0RGF0YXNldE1ldGEiLCAicG9pbnQiLCAibmVhcmVzdCIsICJTVEFUSUNfUE9TSVRJT05TIiwgImZpbHRlckJ5UG9zaXRpb24iLCAiYXJyYXkiLCAiZmlsdGVyIiwgInYiLCAicG9zIiwgImZpbHRlckR5bmFtaWNQb3NpdGlvbkJ5QXhpcyIsICJib3giLCAic29ydEJ5V2VpZ2h0IiwgInJldmVyc2UiLCAic29ydCIsICJhIiwgImIiLCAidjAiLCAidjEiLCAid2VpZ2h0IiwgIndyYXBCb3hlcyIsICJib3hlcyIsICJsYXlvdXRCb3hlcyIsICJzdGFjayIsICJzdGFja1dlaWdodCIsICJob3Jpem9udGFsIiwgImlzSG9yaXpvbnRhbCIsICJidWlsZFN0YWNrcyIsICJsYXlvdXRzIiwgInN0YWNrcyIsICJ3cmFwIiwgImluY2x1ZGVzIiwgIl9zdGFjayIsICJjb3VudCIsICJwbGFjZWQiLCAic2l6ZSIsICJzZXRMYXlvdXREaW1zIiwgInBhcmFtcyIsICJ2Qm94TWF4V2lkdGgiLCAiaEJveE1heEhlaWdodCIsICJsYXlvdXQiLCAiZnVsbFNpemUiLCAiZmFjdG9yIiwgIndpZHRoIiwgImF2YWlsYWJsZVdpZHRoIiwgImhlaWdodCIsICJhdmFpbGFibGVIZWlnaHQiLCAiYnVpbGRMYXlvdXRCb3hlcyIsICJsZWZ0IiwgInJpZ2h0IiwgInRvcCIsICJib3R0b20iLCAiY2VudGVySG9yaXpvbnRhbCIsICJjZW50ZXJWZXJ0aWNhbCIsICJsZWZ0QW5kVG9wIiwgImNvbmNhdCIsICJyaWdodEFuZEJvdHRvbSIsICJ2ZXJ0aWNhbCIsICJnZXRDb21iaW5lZE1heCIsICJtYXhQYWRkaW5nIiwgIm1heCIsICJ1cGRhdGVNYXhQYWRkaW5nIiwgImJveFBhZGRpbmciLCAidXBkYXRlRGltcyIsICJpc09iamVjdCIsICJnZXRQYWRkaW5nIiwgIm5ld1dpZHRoIiwgIm91dGVyV2lkdGgiLCAibmV3SGVpZ2h0IiwgIm91dGVySGVpZ2h0IiwgIndpZHRoQ2hhbmdlZCIsICJ3IiwgImhlaWdodENoYW5nZWQiLCAiaCIsICJzYW1lIiwgIm90aGVyIiwgImhhbmRsZU1heFBhZGRpbmciLCAidXBkYXRlUG9zIiwgImNoYW5nZSIsICJnZXRNYXJnaW5zIiwgIm1hcmdpbkZvclBvc2l0aW9ucyIsICJwb3NpdGlvbnMiLCAibWFyZ2luIiwgImZpdEJveGVzIiwgInJlZml0Qm94ZXMiLCAicmVmaXQiLCAiY2hhbmdlZCIsICJ1cGRhdGUiLCAic2V0Qm94RGltcyIsICJwbGFjZUJveGVzIiwgInVzZXJQYWRkaW5nIiwgInBhZGRpbmciLCAiZGVmaW5lZCIsICJhZGRCb3giLCAiaXRlbSIsICJfbGF5ZXJzIiwgInoiLCAiZHJhdyIsICJyZW1vdmVCb3giLCAibGF5b3V0SXRlbSIsICJzcGxpY2UiLCAiY29uZmlndXJlIiwgIm1pblBhZGRpbmciLCAidG9QYWRkaW5nIiwgInZlcnRpY2FsQm94ZXMiLCAiaG9yaXpvbnRhbEJveGVzIiwgImVhY2giLCAiYmVmb3JlTGF5b3V0IiwgInZpc2libGVWZXJ0aWNhbEJveENvdW50IiwgInJlZHVjZSIsICJ0b3RhbCIsICJkaXNwbGF5IiwgImZyZWV6ZSIsICJCYXNlUGxhdGZvcm0iLCAiYWNxdWlyZUNvbnRleHQiLCAiY2FudmFzIiwgImFzcGVjdFJhdGlvIiwgInJlbGVhc2VDb250ZXh0IiwgImNvbnRleHQiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJ0eXBlIiwgImxpc3RlbmVyIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsICJnZXRNYXhpbXVtU2l6ZSIsICJmbG9vciIsICJpc0F0dGFjaGVkIiwgInVwZGF0ZUNvbmZpZyIsICJjb25maWciLCAiQmFzaWNQbGF0Zm9ybSIsICJnZXRDb250ZXh0IiwgImFuaW1hdGlvbiIsICJFWFBBTkRPX0tFWSIsICJFVkVOVF9UWVBFUyIsICJ0b3VjaHN0YXJ0IiwgInRvdWNobW92ZSIsICJ0b3VjaGVuZCIsICJwb2ludGVyZW50ZXIiLCAicG9pbnRlcmRvd24iLCAicG9pbnRlcm1vdmUiLCAicG9pbnRlcnVwIiwgInBvaW50ZXJsZWF2ZSIsICJwb2ludGVyb3V0IiwgImlzTnVsbE9yRW1wdHkiLCAiaW5pdENhbnZhcyIsICJzdHlsZSIsICJyZW5kZXJIZWlnaHQiLCAiZ2V0QXR0cmlidXRlIiwgInJlbmRlcldpZHRoIiwgImluaXRpYWwiLCAiYm94U2l6aW5nIiwgImRpc3BsYXlXaWR0aCIsICJyZWFkVXNlZFNpemUiLCAidW5kZWZpbmVkIiwgImRpc3BsYXlIZWlnaHQiLCAiZXZlbnRMaXN0ZW5lck9wdGlvbnMiLCAic3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyIsICJwYXNzaXZlIiwgImFkZExpc3RlbmVyIiwgIm5vZGUiLCAicmVtb3ZlTGlzdGVuZXIiLCAiZnJvbU5hdGl2ZUV2ZW50IiwgImV2ZW50IiwgIm5hdGl2ZSIsICJub2RlTGlzdENvbnRhaW5zIiwgIm5vZGVMaXN0IiwgImNvbnRhaW5zIiwgImNyZWF0ZUF0dGFjaE9ic2VydmVyIiwgIm9ic2VydmVyIiwgIk11dGF0aW9uT2JzZXJ2ZXIiLCAiZW50cmllcyIsICJ0cmlnZ2VyIiwgImVudHJ5IiwgImFkZGVkTm9kZXMiLCAicmVtb3ZlZE5vZGVzIiwgIm9ic2VydmUiLCAiZG9jdW1lbnQiLCAiY2hpbGRMaXN0IiwgInN1YnRyZWUiLCAiY3JlYXRlRGV0YWNoT2JzZXJ2ZXIiLCAiZHJwTGlzdGVuaW5nQ2hhcnRzIiwgIk1hcCIsICJvbGREZXZpY2VQaXhlbFJhdGlvIiwgIm9uV2luZG93UmVzaXplIiwgImRwciIsICJ3aW5kb3ciLCAiZGV2aWNlUGl4ZWxSYXRpbyIsICJyZXNpemUiLCAiY3VycmVudERldmljZVBpeGVsUmF0aW8iLCAibGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMiLCAic2V0IiwgInVubGlzdGVuRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZXMiLCAiZGVsZXRlIiwgImNyZWF0ZVJlc2l6ZU9ic2VydmVyIiwgImNvbnRhaW5lciIsICJfZ2V0UGFyZW50Tm9kZSIsICJ0aHJvdHRsZWQiLCAiY2xpZW50V2lkdGgiLCAiUmVzaXplT2JzZXJ2ZXIiLCAiY29udGVudFJlY3QiLCAicmVsZWFzZU9ic2VydmVyIiwgImRpc2Nvbm5lY3QiLCAiY3JlYXRlUHJveHlBbmRMaXN0ZW4iLCAicHJveHkiLCAiY3R4IiwgIkRvbVBsYXRmb3JtIiwgInByb3AiLCAiaXNOdWxsT3JVbmRlZiIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImtleXMiLCAia2V5IiwgInByb3hpZXMiLCAiJHByb3hpZXMiLCAiaGFuZGxlcnMiLCAiYXR0YWNoIiwgImRldGFjaCIsICJpc0Nvbm5lY3RlZCIsICJfZGV0ZWN0UGxhdGZvcm0iLCAiX2lzRG9tU3VwcG9ydGVkIiwgIk9mZnNjcmVlbkNhbnZhcyIsICJFbGVtZW50IiwgImFjdGl2ZSIsICJ0b29sdGlwUG9zaXRpb24iLCAiaGFzVmFsdWUiLCAiaXNOdW1iZXIiLCAicHJvcHMiLCAiZmluYWwiLCAiYW5pbXMiLCAiJGFuaW1hdGlvbnMiLCAicmV0IiwgIl90byIsICJkZWZhdWx0cyIsICJkZWZhdWx0Um91dGVzIiwgImF1dG9Ta2lwIiwgInNjYWxlIiwgInRpY2tzIiwgInRpY2tPcHRzIiwgImRldGVybWluZWRNYXhUaWNrcyIsICJkZXRlcm1pbmVNYXhUaWNrcyIsICJ0aWNrc0xpbWl0IiwgIm1pbiIsICJtYXhUaWNrc0xpbWl0IiwgIm1ham9ySW5kaWNlcyIsICJtYWpvciIsICJlbmFibGVkIiwgImdldE1ham9ySW5kaWNlcyIsICJudW1NYWpvckluZGljZXMiLCAiZmlyc3QiLCAibGFzdCIsICJuZXdUaWNrcyIsICJza2lwTWFqb3JzIiwgInNwYWNpbmciLCAiY2FsY3VsYXRlU3BhY2luZyIsICJhdmdNYWpvclNwYWNpbmciLCAicm91bmQiLCAib2Zmc2V0IiwgInRpY2tMZW5ndGgiLCAiX3RpY2tTaXplIiwgIm1heFNjYWxlIiwgIl9sZW5ndGgiLCAibWF4Q2hhcnQiLCAiX21heExlbmd0aCIsICJldmVuTWFqb3JTcGFjaW5nIiwgImdldEV2ZW5TcGFjaW5nIiwgImZhY3RvcnMiLCAiX2ZhY3Rvcml6ZSIsICJyZXN1bHQiLCAibmV4dCIsICJjZWlsIiwgIm1ham9yU3RhcnQiLCAibWFqb3JFbmQiLCAidmFsdWVPckRlZmF1bHQiLCAiYXJyIiwgImxlbiIsICJyZXZlcnNlQWxpZ24iLCAiYWxpZ24iLCAib2Zmc2V0RnJvbUVkZ2UiLCAiZWRnZSIsICJnZXRUaWNrc0xpbWl0IiwgInRpY2tzTGVuZ3RoIiwgInNhbXBsZSIsICJudW1JdGVtcyIsICJpbmNyZW1lbnQiLCAiZ2V0UGl4ZWxGb3JHcmlkTGluZSIsICJvZmZzZXRHcmlkTGluZXMiLCAidmFsaWRJbmRleCIsICJfc3RhcnRQaXhlbCIsICJfZW5kUGl4ZWwiLCAiZXBzaWxvbiIsICJsaW5lVmFsdWUiLCAiZ2V0UGl4ZWxGb3JUaWNrIiwgImdhcmJhZ2VDb2xsZWN0IiwgImNhY2hlcyIsICJjYWNoZSIsICJnYyIsICJnY0xlbiIsICJnZXRUaWNrTWFya0xlbmd0aCIsICJkcmF3VGlja3MiLCAiZ2V0VGl0bGVIZWlnaHQiLCAiZmFsbGJhY2siLCAiZm9udCIsICJ0b0ZvbnQiLCAibGluZXMiLCAiaXNBcnJheSIsICJ0ZXh0IiwgImxpbmVIZWlnaHQiLCAiY3JlYXRlU2NhbGVDb250ZXh0IiwgInBhcmVudCIsICJjcmVhdGVDb250ZXh0IiwgImNyZWF0ZVRpY2tDb250ZXh0IiwgInRpY2siLCAidGl0bGVBbGlnbiIsICJfdG9MZWZ0UmlnaHRDZW50ZXIiLCAidGl0bGVBcmdzIiwgInNjYWxlcyIsICJyb3RhdGlvbiIsICJtYXhXaWR0aCIsICJ0aXRsZVgiLCAidGl0bGVZIiwgIl9hbGlnblN0YXJ0RW5kIiwgInBvc2l0aW9uQXhpc0lEIiwgImdldFBpeGVsRm9yVmFsdWUiLCAiSEFMRl9QSSIsICJTY2FsZSIsICJjZmciLCAiaWQiLCAiX21hcmdpbnMiLCAibWF4SGVpZ2h0IiwgInBhZGRpbmdUb3AiLCAicGFkZGluZ0JvdHRvbSIsICJwYWRkaW5nTGVmdCIsICJwYWRkaW5nUmlnaHQiLCAibGFiZWxSb3RhdGlvbiIsICJfcmFuZ2UiLCAiX2dyaWRMaW5lSXRlbXMiLCAiX2xhYmVsSXRlbXMiLCAiX2xhYmVsU2l6ZXMiLCAiX2xvbmdlc3RUZXh0Q2FjaGUiLCAiX3VzZXJNYXgiLCAiX3VzZXJNaW4iLCAiX3N1Z2dlc3RlZE1heCIsICJfc3VnZ2VzdGVkTWluIiwgIl90aWNrc0xlbmd0aCIsICJfYm9yZGVyVmFsdWUiLCAiX2NhY2hlIiwgIl9kYXRhTGltaXRzQ2FjaGVkIiwgIiRjb250ZXh0IiwgInNldENvbnRleHQiLCAic3VnZ2VzdGVkTWluIiwgInN1Z2dlc3RlZE1heCIsICJyYXciLCAiZ2V0VXNlckJvdW5kcyIsICJmaW5pdGVPckRlZmF1bHQiLCAiTkVHQVRJVkVfSU5GSU5JVFkiLCAibWluRGVmaW5lZCIsICJpc0Zpbml0ZSIsICJtYXhEZWZpbmVkIiwgImdldE1pbk1heCIsICJjYW5TdGFjayIsICJtZXRhcyIsICJnZXRNYXRjaGluZ1Zpc2libGVNZXRhcyIsICJnZXRUaWNrcyIsICJnZXRMYWJlbHMiLCAibGFiZWxzIiwgInhMYWJlbHMiLCAieUxhYmVscyIsICJnZXRMYWJlbEl0ZW1zIiwgIl9jb21wdXRlTGFiZWxJdGVtcyIsICJiZWZvcmVVcGRhdGUiLCAiY2FsbCIsICJtYXJnaW5zIiwgImJlZ2luQXRaZXJvIiwgImdyYWNlIiwgInNhbXBsZVNpemUiLCAiYmVmb3JlU2V0RGltZW5zaW9ucyIsICJzZXREaW1lbnNpb25zIiwgImFmdGVyU2V0RGltZW5zaW9ucyIsICJiZWZvcmVEYXRhTGltaXRzIiwgImRldGVybWluZURhdGFMaW1pdHMiLCAiYWZ0ZXJEYXRhTGltaXRzIiwgIl9hZGRHcmFjZSIsICJiZWZvcmVCdWlsZFRpY2tzIiwgImJ1aWxkVGlja3MiLCAiYWZ0ZXJCdWlsZFRpY2tzIiwgInNhbXBsaW5nRW5hYmxlZCIsICJfY29udmVydFRpY2tzVG9MYWJlbHMiLCAiYmVmb3JlQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiIsICJjYWxjdWxhdGVMYWJlbFJvdGF0aW9uIiwgImFmdGVyQ2FsY3VsYXRlTGFiZWxSb3RhdGlvbiIsICJzb3VyY2UiLCAiYWZ0ZXJBdXRvU2tpcCIsICJiZWZvcmVGaXQiLCAiZml0IiwgImFmdGVyRml0IiwgImFmdGVyVXBkYXRlIiwgInJldmVyc2VQaXhlbHMiLCAic3RhcnRQaXhlbCIsICJlbmRQaXhlbCIsICJfYWxpZ25Ub1BpeGVscyIsICJhbGlnblRvUGl4ZWxzIiwgIl9jYWxsSG9va3MiLCAibmFtZSIsICJub3RpZnlQbHVnaW5zIiwgImJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbiIsICJnZW5lcmF0ZVRpY2tMYWJlbHMiLCAibGFiZWwiLCAiY2FsbGJhY2siLCAiYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24iLCAibnVtVGlja3MiLCAibWluUm90YXRpb24iLCAibWF4Um90YXRpb24iLCAidGlja1dpZHRoIiwgIm1heExhYmVsRGlhZ29uYWwiLCAiX2lzVmlzaWJsZSIsICJsYWJlbFNpemVzIiwgIl9nZXRMYWJlbFNpemVzIiwgIm1heExhYmVsV2lkdGgiLCAid2lkZXN0IiwgIm1heExhYmVsSGVpZ2h0IiwgImhpZ2hlc3QiLCAiX2xpbWl0VmFsdWUiLCAiZ3JpZCIsICJ0aXRsZSIsICJ0b0RlZ3JlZXMiLCAiYXNpbiIsICJtaW5TaXplIiwgInRpdGxlT3B0cyIsICJncmlkT3B0cyIsICJ0aXRsZUhlaWdodCIsICJ0aWNrUGFkZGluZyIsICJhbmdsZVJhZGlhbnMiLCAidG9SYWRpYW5zIiwgImNvcyIsICJzaW4iLCAibGFiZWxIZWlnaHQiLCAibWlycm9yIiwgImxhYmVsV2lkdGgiLCAiX2NhbGN1bGF0ZVBhZGRpbmciLCAiX2hhbmRsZU1hcmdpbnMiLCAiaXNSb3RhdGVkIiwgImxhYmVsc0JlbG93VGlja3MiLCAib2Zmc2V0TGVmdCIsICJvZmZzZXRSaWdodCIsICJpc0Z1bGxTaXplIiwgIl9jb21wdXRlTGFiZWxTaXplcyIsICJ3aWR0aHMiLCAiaGVpZ2h0cyIsICJ3aWRlc3RMYWJlbFNpemUiLCAiaGlnaGVzdExhYmVsU2l6ZSIsICJqbGVuIiwgInRpY2tGb250IiwgImZvbnRTdHJpbmciLCAibmVzdGVkTGFiZWwiLCAiX3Jlc29sdmVUaWNrRm9udE9wdGlvbnMiLCAic3RyaW5nIiwgIl9tZWFzdXJlVGV4dCIsICJ2YWx1ZUF0IiwgImlkeCIsICJnZXRMYWJlbEZvclZhbHVlIiwgIk5hTiIsICJnZXRWYWx1ZUZvclBpeGVsIiwgInBpeGVsIiwgImdldFBpeGVsRm9yRGVjaW1hbCIsICJkZWNpbWFsIiwgIl9pbnQxNlJhbmdlIiwgIl9hbGlnblBpeGVsIiwgImdldERlY2ltYWxGb3JQaXhlbCIsICJnZXRCYXNlUGl4ZWwiLCAiZ2V0QmFzZVZhbHVlIiwgIm9wdGlvblRpY2tzIiwgInJvdCIsICJhdXRvU2tpcFBhZGRpbmciLCAiX2NvbXB1dGVHcmlkTGluZUl0ZW1zIiwgImJvcmRlciIsICJ0bCIsICJib3JkZXJPcHRzIiwgImF4aXNXaWR0aCIsICJheGlzSGFsZldpZHRoIiwgImFsaWduQm9yZGVyVmFsdWUiLCAiYm9yZGVyVmFsdWUiLCAiYWxpZ25lZExpbmVWYWx1ZSIsICJ0eDEiLCAidHkxIiwgInR4MiIsICJ0eTIiLCAieDEiLCAieTEiLCAieDIiLCAieTIiLCAibGltaXQiLCAic3RlcCIsICJvcHRzQXRJbmRleCIsICJvcHRzQXRJbmRleEJvcmRlciIsICJsaW5lV2lkdGgiLCAibGluZUNvbG9yIiwgImNvbG9yIiwgImJvcmRlckRhc2giLCAiZGFzaCIsICJib3JkZXJEYXNoT2Zmc2V0IiwgImRhc2hPZmZzZXQiLCAidGlja0NvbG9yIiwgInRpY2tCb3JkZXJEYXNoIiwgInRpY2tCb3JkZXJEYXNoT2Zmc2V0IiwgImNyb3NzQWxpZ24iLCAidGlja0FuZFBhZGRpbmciLCAiaFRpY2tBbmRQYWRkaW5nIiwgInRleHRBbGlnbiIsICJsaW5lQ291bnQiLCAidGV4dE9mZnNldCIsICJ0ZXh0QmFzZWxpbmUiLCAiX2dldFhBeGlzTGFiZWxBbGlnbm1lbnQiLCAiX2dldFlBeGlzTGFiZWxBbGlnbm1lbnQiLCAibGFiZWxPZmZzZXQiLCAiaGFsZkNvdW50IiwgInN0cm9rZUNvbG9yIiwgInRleHRTdHJva2VDb2xvciIsICJzdHJva2VXaWR0aCIsICJ0ZXh0U3Ryb2tlV2lkdGgiLCAidGlja1RleHRBbGlnbiIsICJzaG93TGFiZWxCYWNrZHJvcCIsICJiYWNrZHJvcCIsICJsYWJlbFBhZGRpbmciLCAiYmFja2Ryb3BQYWRkaW5nIiwgImJhY2tkcm9wQ29sb3IiLCAidHJhbnNsYXRpb24iLCAiX2NvbXB1dGVMYWJlbEFyZWEiLCAiZHJhd0JhY2tncm91bmQiLCAiYmFja2dyb3VuZENvbG9yIiwgInNhdmUiLCAiZmlsbFN0eWxlIiwgImZpbGxSZWN0IiwgInJlc3RvcmUiLCAiZ2V0TGluZVdpZHRoRm9yVmFsdWUiLCAiZmluZEluZGV4IiwgInQiLCAib3B0cyIsICJkcmF3R3JpZCIsICJkcmF3TGluZSIsICJwMSIsICJwMiIsICJzdHJva2VTdHlsZSIsICJzZXRMaW5lRGFzaCIsICJsaW5lRGFzaE9mZnNldCIsICJiZWdpblBhdGgiLCAibW92ZVRvIiwgImxpbmVUbyIsICJzdHJva2UiLCAiZHJhd09uQ2hhcnRBcmVhIiwgImRyYXdCb3JkZXIiLCAibGFzdExpbmVXaWR0aCIsICJkcmF3TGFiZWxzIiwgImFyZWEiLCAiY2xpcEFyZWEiLCAicmVuZGVyVGV4dE9wdGlvbnMiLCAicmVuZGVyVGV4dCIsICJ1bmNsaXBBcmVhIiwgImRyYXdUaXRsZSIsICJ0eiIsICJneiIsICJieiIsICJheGlzSUQiLCAiX21heERpZ2l0cyIsICJmb250U2l6ZSIsICJUeXBlZFJlZ2lzdHJ5IiwgInNjb3BlIiwgImNyZWF0ZSIsICJpc0ZvclR5cGUiLCAiaXNQcm90b3R5cGVPZiIsICJyZWdpc3RlciIsICJwcm90byIsICJnZXRQcm90b3R5cGVPZiIsICJwYXJlbnRTY29wZSIsICJpc0lDaGFydENvbXBvbmVudCIsICJyZWdpc3RlckRlZmF1bHRzIiwgIm92ZXJyaWRlcyIsICJnZXQiLCAidW5yZWdpc3RlciIsICJpdGVtRGVmYXVsdHMiLCAibWVyZ2UiLCAicm91dGVEZWZhdWx0cyIsICJkZXNjcmlwdG9ycyIsICJkZXNjcmliZSIsICJyb3V0ZXMiLCAicHJvcGVydHkiLCAicHJvcGVydHlQYXJ0cyIsICJzcGxpdCIsICJzb3VyY2VOYW1lIiwgInBvcCIsICJzb3VyY2VTY29wZSIsICJqb2luIiwgInBhcnRzIiwgInRhcmdldE5hbWUiLCAidGFyZ2V0U2NvcGUiLCAicm91dGUiLCAiUmVnaXN0cnkiLCAiY29udHJvbGxlcnMiLCAiRGF0YXNldENvbnRyb2xsZXIiLCAicGx1Z2lucyIsICJfdHlwZWRSZWdpc3RyaWVzIiwgImFyZ3MiLCAiX2VhY2giLCAicmVtb3ZlIiwgImFkZENvbnRyb2xsZXJzIiwgImFkZEVsZW1lbnRzIiwgImFkZFBsdWdpbnMiLCAiYWRkU2NhbGVzIiwgImdldENvbnRyb2xsZXIiLCAiX2dldCIsICJnZXRFbGVtZW50IiwgImdldFBsdWdpbiIsICJnZXRTY2FsZSIsICJyZW1vdmVDb250cm9sbGVycyIsICJyZW1vdmVFbGVtZW50cyIsICJyZW1vdmVQbHVnaW5zIiwgInJlbW92ZVNjYWxlcyIsICJtZXRob2QiLCAidHlwZWRSZWdpc3RyeSIsICJhcmciLCAicmVnIiwgIl9nZXRSZWdpc3RyeUZvclR5cGUiLCAiX2V4ZWMiLCAiaXRlbVJlZyIsICJyZWdpc3RyeSIsICJjb21wb25lbnQiLCAiY2FtZWxNZXRob2QiLCAiX2NhcGl0YWxpemUiLCAiUGx1Z2luU2VydmljZSIsICJfaW5pdCIsICJub3RpZnkiLCAiaG9vayIsICJfY3JlYXRlRGVzY3JpcHRvcnMiLCAiX25vdGlmeSIsICJfZGVzY3JpcHRvcnMiLCAiZGVzY3JpcHRvciIsICJwbHVnaW4iLCAiY2FsbENhbGxiYWNrIiwgImNhbmNlbGFibGUiLCAiaW52YWxpZGF0ZSIsICJfb2xkQ2FjaGUiLCAiX25vdGlmeVN0YXRlQ2hhbmdlcyIsICJhbGwiLCAiYWxsUGx1Z2lucyIsICJjcmVhdGVEZXNjcmlwdG9ycyIsICJwcmV2aW91c0Rlc2NyaXB0b3JzIiwgInNvbWUiLCAibG9jYWxJZHMiLCAibG9jYWwiLCAiZ2V0T3B0cyIsICJwbHVnaW5PcHRzIiwgInBsdWdpblNjb3BlS2V5cyIsICJzY29wZXMiLCAiZ2V0T3B0aW9uU2NvcGVzIiwgImNyZWF0ZVJlc29sdmVyIiwgInNjcmlwdGFibGUiLCAiaW5kZXhhYmxlIiwgImFsbEtleXMiLCAiZ2V0SW5kZXhBeGlzIiwgImRhdGFzZXREZWZhdWx0cyIsICJkYXRhc2V0cyIsICJkYXRhc2V0T3B0aW9ucyIsICJpbmRleEF4aXMiLCAiZ2V0QXhpc0Zyb21EZWZhdWx0U2NhbGVJRCIsICJnZXREZWZhdWx0U2NhbGVJREZyb21BeGlzIiwgImF4aXNGcm9tUG9zaXRpb24iLCAiZGV0ZXJtaW5lQXhpcyIsICJzY2FsZU9wdGlvbnMiLCAidG9Mb3dlckNhc2UiLCAibWVyZ2VTY2FsZUNvbmZpZyIsICJjaGFydERlZmF1bHRzIiwgImNvbmZpZ1NjYWxlcyIsICJjaGFydEluZGV4QXhpcyIsICJzY2FsZUNvbmYiLCAiY29uc29sZSIsICJlcnJvciIsICJfcHJveHkiLCAid2FybiIsICJkZWZhdWx0SWQiLCAiZGVmYXVsdFNjYWxlT3B0aW9ucyIsICJtZXJnZUlmIiwgImRlZmF1bHRJRCIsICJpbml0T3B0aW9ucyIsICJpbml0RGF0YSIsICJpbml0Q29uZmlnIiwgImtleUNhY2hlIiwgImtleXNDYWNoZWQiLCAiU2V0IiwgImNhY2hlZEtleXMiLCAiY2FjaGVLZXkiLCAiZ2VuZXJhdGUiLCAiYWRkSWZGb3VuZCIsICJvYmoiLCAicmVzb2x2ZU9iamVjdEtleSIsICJDb25maWciLCAiX2NvbmZpZyIsICJfc2NvcGVDYWNoZSIsICJfcmVzb2x2ZXJDYWNoZSIsICJwbGF0Zm9ybSIsICJjbGVhckNhY2hlIiwgImNsZWFyIiwgImRhdGFzZXRTY29wZUtleXMiLCAiZGF0YXNldFR5cGUiLCAiZGF0YXNldEFuaW1hdGlvblNjb3BlS2V5cyIsICJ0cmFuc2l0aW9uIiwgImRhdGFzZXRFbGVtZW50U2NvcGVLZXlzIiwgImVsZW1lbnRUeXBlIiwgImFkZGl0aW9uYWxPcHRpb25TY29wZXMiLCAiX2NhY2hlZFNjb3BlcyIsICJtYWluU2NvcGUiLCAicmVzZXRDYWNoZSIsICJrZXlMaXN0cyIsICJjYWNoZWQiLCAiQXJyYXkiLCAiZnJvbSIsICJoYXMiLCAiY2hhcnRPcHRpb25TY29wZXMiLCAicmVzb2x2ZU5hbWVkT3B0aW9ucyIsICJuYW1lcyIsICJwcmVmaXhlcyIsICIkc2hhcmVkIiwgInJlc29sdmVyIiwgInN1YlByZWZpeGVzIiwgImdldFJlc29sdmVyIiwgIm5lZWRDb250ZXh0IiwgImlzRnVuY3Rpb24iLCAic3ViUmVzb2x2ZXIiLCAiX2F0dGFjaENvbnRleHQiLCAiZGVzY3JpcHRvckRlZmF1bHRzIiwgInJlc29sdmVyQ2FjaGUiLCAiX2NyZWF0ZVJlc29sdmVyIiwgInAiLCAiaGFzRnVuY3Rpb24iLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJhY2MiLCAiaXNTY3JpcHRhYmxlIiwgImlzSW5kZXhhYmxlIiwgIktOT1dOX1BPU0lUSU9OUyIsICJwb3NpdGlvbklzSG9yaXpvbnRhbCIsICJjb21wYXJlMkxldmVsIiwgImwxIiwgImwyIiwgIm9uQW5pbWF0aW9uc0NvbXBsZXRlIiwgImFuaW1hdGlvbk9wdGlvbnMiLCAib25Db21wbGV0ZSIsICJvbkFuaW1hdGlvblByb2dyZXNzIiwgIm9uUHJvZ3Jlc3MiLCAiZ2V0Q2FudmFzIiwgImdldEVsZW1lbnRCeUlkIiwgImluc3RhbmNlcyIsICJnZXRDaGFydCIsICJ2YWx1ZXMiLCAiYyIsICJtb3ZlTnVtZXJpY0tleXMiLCAibW92ZSIsICJpbnRLZXkiLCAiZGV0ZXJtaW5lTGFzdEV2ZW50IiwgImxhc3RFdmVudCIsICJpbkNoYXJ0QXJlYSIsICJpc0NsaWNrIiwgImdldERhdGFzZXRBcmVhIiwgInhTY2FsZSIsICJ5U2NhbGUiLCAiQ2hhcnQiLCAiaW52YWxpZGF0ZVBsdWdpbnMiLCAidXNlckNvbmZpZyIsICJpbml0aWFsQ2FudmFzIiwgImV4aXN0aW5nQ2hhcnQiLCAidWlkIiwgIl9vcHRpb25zIiwgIl9hc3BlY3RSYXRpbyIsICJfbWV0YXNldHMiLCAiX3N0YWNrcyIsICJfYWN0aXZlIiwgIl9sYXN0RXZlbnQiLCAiX2xpc3RlbmVycyIsICJfcmVzcG9uc2l2ZUxpc3RlbmVycyIsICJfc29ydGVkTWV0YXNldHMiLCAiX3BsdWdpbnMiLCAiX2hpZGRlbkluZGljZXMiLCAiYXR0YWNoZWQiLCAiX2FuaW1hdGlvbnNEaXNhYmxlZCIsICJfZG9SZXNpemUiLCAiZGVib3VuY2UiLCAibW9kZSIsICJyZXNpemVEZWxheSIsICJfZGF0YUNoYW5nZXMiLCAiYW5pbWF0b3IiLCAibGlzdGVuIiwgIl9pbml0aWFsaXplIiwgIm1haW50YWluQXNwZWN0UmF0aW8iLCAicmVzcG9uc2l2ZSIsICJyZXRpbmFTY2FsZSIsICJiaW5kRXZlbnRzIiwgImNsZWFyQ2FudmFzIiwgInN0b3AiLCAicnVubmluZyIsICJfcmVzaXplIiwgIl9yZXNpemVCZWZvcmVEcmF3IiwgIm5ld1NpemUiLCAibmV3UmF0aW8iLCAib25SZXNpemUiLCAicmVuZGVyIiwgImVuc3VyZVNjYWxlc0hhdmVJRHMiLCAic2NhbGVzT3B0aW9ucyIsICJheGlzT3B0aW9ucyIsICJidWlsZE9yVXBkYXRlU2NhbGVzIiwgInNjYWxlT3B0cyIsICJ1cGRhdGVkIiwgIm1hcCIsICJpc1JhZGlhbCIsICJkcG9zaXRpb24iLCAiZHR5cGUiLCAic2NhbGVUeXBlIiwgInNjYWxlQ2xhc3MiLCAiaGFzVXBkYXRlZCIsICJfdXBkYXRlTWV0YXNldHMiLCAibnVtRGF0YSIsICJudW1NZXRhIiwgIl9kZXN0cm95RGF0YXNldE1ldGEiLCAic2xpY2UiLCAiX3JlbW92ZVVucmVmZXJlbmNlZE1ldGFzZXRzIiwgIl9kYXRhc2V0IiwgImJ1aWxkT3JVcGRhdGVDb250cm9sbGVycyIsICJuZXdDb250cm9sbGVycyIsICJvcmRlciIsICJ2aXNpYmxlIiwgImlzRGF0YXNldFZpc2libGUiLCAidXBkYXRlSW5kZXgiLCAibGlua1NjYWxlcyIsICJDb250cm9sbGVyQ2xhc3MiLCAiZGF0YXNldEVsZW1lbnRUeXBlIiwgImRhdGFFbGVtZW50VHlwZSIsICJfcmVzZXRFbGVtZW50cyIsICJyZXNldCIsICJhbmltc0Rpc2FibGVkIiwgIl91cGRhdGVTY2FsZXMiLCAiX2NoZWNrRXZlbnRCaW5kaW5ncyIsICJfdXBkYXRlSGlkZGVuSW5kaWNlcyIsICJidWlsZE9yVXBkYXRlRWxlbWVudHMiLCAiZ2V0TWF4T3ZlcmZsb3ciLCAiX21pblBhZGRpbmciLCAiYXV0b1BhZGRpbmciLCAiX3VwZGF0ZUxheW91dCIsICJfdXBkYXRlRGF0YXNldHMiLCAiX2V2ZW50SGFuZGxlciIsICJfdXBkYXRlSG92ZXJTdHlsZXMiLCAiZXhpc3RpbmdFdmVudHMiLCAibmV3RXZlbnRzIiwgImV2ZW50cyIsICJzZXRzRXF1YWwiLCAidW5iaW5kRXZlbnRzIiwgImNoYW5nZXMiLCAiX2dldFVuaWZvcm1EYXRhQ2hhbmdlcyIsICJkYXRhc2V0Q291bnQiLCAibWFrZVNldCIsICJjaGFuZ2VTZXQiLCAibm9BcmVhIiwgIl9pZHgiLCAiX3VwZGF0ZURhdGFzZXQiLCAiX3VwZGF0ZSIsICJsYXllcnMiLCAiX2RyYXdEYXRhc2V0cyIsICJfZ2V0U29ydGVkRGF0YXNldE1ldGFzIiwgImZpbHRlclZpc2libGUiLCAiX2RyYXdEYXRhc2V0IiwgImNsaXAiLCAiX2NsaXAiLCAidXNlQ2xpcCIsICJkaXNhYmxlZCIsICJnZXRFbGVtZW50c0F0RXZlbnRGb3JNb2RlIiwgIkludGVyYWN0aW9uIiwgImhpZGRlbiIsICJ4QXhpc0lEIiwgInlBeGlzSUQiLCAiX3BhcnNlZCIsICJnZXRWaXNpYmxlRGF0YXNldENvdW50IiwgInNldERhdGFzZXRWaXNpYmlsaXR5IiwgInRvZ2dsZURhdGFWaXNpYmlsaXR5IiwgImdldERhdGFWaXNpYmlsaXR5IiwgIl91cGRhdGVWaXNpYmlsaXR5IiwgImRhdGFJbmRleCIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAiaGlkZSIsICJzaG93IiwgIl9kZXN0cm95IiwgIl9zdG9wIiwgImRlc3Ryb3kiLCAidG9CYXNlNjRJbWFnZSIsICJ0b0RhdGFVUkwiLCAiYmluZFVzZXJFdmVudHMiLCAiYmluZFJlc3BvbnNpdmVFdmVudHMiLCAibGlzdGVuZXJzIiwgIl9hZGQiLCAib2Zmc2V0WCIsICJvZmZzZXRZIiwgIl9yZW1vdmUiLCAiZGV0YWNoZWQiLCAidXBkYXRlSG92ZXJTdHlsZSIsICJwcmVmaXgiLCAiZ2V0QWN0aXZlRWxlbWVudHMiLCAic2V0QWN0aXZlRWxlbWVudHMiLCAiYWN0aXZlRWxlbWVudHMiLCAibGFzdEFjdGl2ZSIsICJfZWxlbWVudHNFcXVhbCIsICJpc1BsdWdpbkVuYWJsZWQiLCAicGx1Z2luSWQiLCAicmVwbGF5IiwgImhvdmVyT3B0aW9ucyIsICJob3ZlciIsICJkZWFjdGl2YXRlZCIsICJhY3RpdmF0ZWQiLCAiZXZlbnRGaWx0ZXIiLCAiX2hhbmRsZUV2ZW50IiwgIl9nZXRBY3RpdmVFbGVtZW50cyIsICJfaXNDbGlja0V2ZW50IiwgIm9uSG92ZXIiLCAib25DbGljayIsICJ2ZXJzaW9uIiwgImNsaXBBcmMiLCAicGl4ZWxNYXJnaW4iLCAib3V0ZXJSYWRpdXMiLCAiaW5uZXJSYWRpdXMiLCAiYW5nbGVNYXJnaW4iLCAiYXJjIiwgImNsb3NlUGF0aCIsICJ0b1JhZGl1c0Nvcm5lcnMiLCAiX3JlYWRWYWx1ZVRvUHJvcHMiLCAicGFyc2VCb3JkZXJSYWRpdXMiLCAiYW5nbGVEZWx0YSIsICJvIiwgImJvcmRlclJhZGl1cyIsICJoYWxmVGhpY2tuZXNzIiwgImlubmVyTGltaXQiLCAiY29tcHV0ZU91dGVyTGltaXQiLCAidmFsIiwgIm91dGVyQXJjTGltaXQiLCAib3V0ZXJTdGFydCIsICJvdXRlckVuZCIsICJpbm5lclN0YXJ0IiwgImlubmVyRW5kIiwgInJUaGV0YVRvWFkiLCAiciIsICJ0aGV0YSIsICJwYXRoQXJjIiwgImNpcmN1bGFyIiwgImlubmVyUiIsICJzcGFjaW5nT2Zmc2V0IiwgImFscGhhIiwgIm5vU3BhY2luZ0lubmVyUmFkaXVzIiwgIm5vU3BhY2luZ091dGVyUmFkaXVzIiwgImF2Tm9nU3BhY2luZ1JhZGl1cyIsICJhZGp1c3RlZEFuZ2xlIiwgImJldGEiLCAiUEkiLCAiYW5nbGVPZmZzZXQiLCAib3V0ZXJTdGFydEFkanVzdGVkUmFkaXVzIiwgIm91dGVyRW5kQWRqdXN0ZWRSYWRpdXMiLCAib3V0ZXJTdGFydEFkanVzdGVkQW5nbGUiLCAib3V0ZXJFbmRBZGp1c3RlZEFuZ2xlIiwgImlubmVyU3RhcnRBZGp1c3RlZFJhZGl1cyIsICJpbm5lckVuZEFkanVzdGVkUmFkaXVzIiwgImlubmVyU3RhcnRBZGp1c3RlZEFuZ2xlIiwgImlubmVyRW5kQWRqdXN0ZWRBbmdsZSIsICJvdXRlck1pZEFkanVzdGVkQW5nbGUiLCAicENlbnRlciIsICJwNCIsICJpbm5lck1pZEFkanVzdGVkQW5nbGUiLCAicDgiLCAib3V0ZXJTdGFydFgiLCAib3V0ZXJTdGFydFkiLCAib3V0ZXJFbmRYIiwgIm91dGVyRW5kWSIsICJkcmF3QXJjIiwgImZ1bGxDaXJjbGVzIiwgImNpcmN1bWZlcmVuY2UiLCAiZmlsbCIsICJpc05hTiIsICJUQVUiLCAiYm9yZGVyV2lkdGgiLCAiYm9yZGVySm9pblN0eWxlIiwgImlubmVyIiwgImJvcmRlckFsaWduIiwgImxpbmVKb2luIiwgIkFyY0VsZW1lbnQiLCAiY2hhcnRYIiwgImNoYXJ0WSIsICJyQWRqdXN0IiwgIl9jaXJjdW1mZXJlbmNlIiwgImJldHdlZW5BbmdsZXMiLCAid2l0aGluUmFkaXVzIiwgIl9pc0JldHdlZW4iLCAiaGFsZkFuZ2xlIiwgImhhbGZSYWRpdXMiLCAidHJhbnNsYXRlIiwgImZpeCIsICJyYWRpdXNPZmZzZXQiLCAiYm9yZGVyQ29sb3IiLCAiZ2V0QmFyQm91bmRzIiwgImJhciIsICJ1c2VGaW5hbFBvc2l0aW9uIiwgIngiLCAieSIsICJiYXNlIiwgIndpZHRoIiwgImhlaWdodCIsICJnZXRQcm9wcyIsICJsZWZ0IiwgInJpZ2h0IiwgInRvcCIsICJib3R0b20iLCAiaGFsZiIsICJob3Jpem9udGFsIiwgIk1hdGgiLCAibWluIiwgIm1heCIsICJza2lwT3JMaW1pdCIsICJza2lwIiwgInZhbHVlIiwgIl9saW1pdFZhbHVlIiwgInBhcnNlQm9yZGVyV2lkdGgiLCAibWF4VyIsICJtYXhIIiwgIm9wdGlvbnMiLCAiYm9yZGVyV2lkdGgiLCAiYm9yZGVyU2tpcHBlZCIsICJvIiwgInRvVFJCTCIsICJ0IiwgInIiLCAiYiIsICJsIiwgInBhcnNlQm9yZGVyUmFkaXVzIiwgImVuYWJsZUJvcmRlclJhZGl1cyIsICJib3JkZXJSYWRpdXMiLCAidG9UUkJMQ29ybmVycyIsICJtYXhSIiwgImVuYWJsZUJvcmRlciIsICJpc09iamVjdCIsICJ0b3BMZWZ0IiwgInRvcFJpZ2h0IiwgImJvdHRvbUxlZnQiLCAiYm90dG9tUmlnaHQiLCAiYm91bmRpbmdSZWN0cyIsICJib3VuZHMiLCAiYm9yZGVyIiwgInJhZGl1cyIsICJvdXRlciIsICJ3IiwgImgiLCAiaW5uZXIiLCAiaW5SYW5nZSIsICJza2lwWCIsICJza2lwWSIsICJza2lwQm90aCIsICJfaXNCZXR3ZWVuIiwgImhhc1JhZGl1cyIsICJhZGROb3JtYWxSZWN0UGF0aCIsICJjdHgiLCAicmVjdCIsICJpbmZsYXRlUmVjdCIsICJhbW91bnQiLCAicmVmUmVjdCIsICJCYXJFbGVtZW50IiwgIkVsZW1lbnQiLCAiY29uc3RydWN0b3IiLCAiY2ZnIiwgInVuZGVmaW5lZCIsICJpbmZsYXRlQW1vdW50IiwgIk9iamVjdCIsICJhc3NpZ24iLCAiZHJhdyIsICJib3JkZXJDb2xvciIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWRkUmVjdFBhdGgiLCAiYWRkUm91bmRlZFJlY3RQYXRoIiwgInNhdmUiLCAiYmVnaW5QYXRoIiwgImNsaXAiLCAiZmlsbFN0eWxlIiwgImZpbGwiLCAicmVzdG9yZSIsICJtb3VzZVgiLCAibW91c2VZIiwgImluWFJhbmdlIiwgImluWVJhbmdlIiwgImdldENlbnRlclBvaW50IiwgImdldFJhbmdlIiwgImF4aXMiLCAiaWQiLCAiZGVmYXVsdHMiLCAicG9pbnRTdHlsZSIsICJkZWZhdWx0Um91dGVzIiwgImdldEJveFNpemUiLCAibGFiZWxPcHRzIiwgImZvbnRTaXplIiwgImJveEhlaWdodCIsICJib3hXaWR0aCIsICJ1c2VQb2ludFN0eWxlIiwgIk1hdGgiLCAibWluIiwgInBvaW50U3R5bGVXaWR0aCIsICJpdGVtSGVpZ2h0IiwgIm1heCIsICJpdGVtc0VxdWFsIiwgImEiLCAiYiIsICJkYXRhc2V0SW5kZXgiLCAiaW5kZXgiLCAiTGVnZW5kIiwgIkVsZW1lbnQiLCAiY29uc3RydWN0b3IiLCAiY29uZmlnIiwgIl9hZGRlZCIsICJsZWdlbmRIaXRCb3hlcyIsICJfaG92ZXJlZEl0ZW0iLCAiZG91Z2hudXRNb2RlIiwgImNoYXJ0IiwgIm9wdGlvbnMiLCAiY3R4IiwgImxlZ2VuZEl0ZW1zIiwgInVuZGVmaW5lZCIsICJjb2x1bW5TaXplcyIsICJsaW5lV2lkdGhzIiwgIm1heEhlaWdodCIsICJtYXhXaWR0aCIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiwgIl9tYXJnaW5zIiwgInBvc2l0aW9uIiwgIndlaWdodCIsICJmdWxsU2l6ZSIsICJ1cGRhdGUiLCAibWFyZ2lucyIsICJzZXREaW1lbnNpb25zIiwgImJ1aWxkTGFiZWxzIiwgImZpdCIsICJpc0hvcml6b250YWwiLCAibGFiZWxzIiwgImNhbGwiLCAiZ2VuZXJhdGVMYWJlbHMiLCAiZmlsdGVyIiwgIml0ZW0iLCAiZGF0YSIsICJzb3J0IiwgInJldmVyc2UiLCAiZGlzcGxheSIsICJsYWJlbEZvbnQiLCAidG9Gb250IiwgImZvbnQiLCAic2l6ZSIsICJ0aXRsZUhlaWdodCIsICJfY29tcHV0ZVRpdGxlSGVpZ2h0IiwgInN0cmluZyIsICJfZml0Um93cyIsICJfZml0Q29scyIsICJwYWRkaW5nIiwgImhpdGJveGVzIiwgImxpbmVIZWlnaHQiLCAidG90YWxIZWlnaHQiLCAidGV4dEFsaWduIiwgInRleHRCYXNlbGluZSIsICJyb3ciLCAiZm9yRWFjaCIsICJsZWdlbmRJdGVtIiwgImkiLCAiaXRlbVdpZHRoIiwgIm1lYXN1cmVUZXh0IiwgInRleHQiLCAibGVuZ3RoIiwgIl9pdGVtSGVpZ2h0IiwgImhlaWdodExpbWl0IiwgInRvdGFsV2lkdGgiLCAiY3VycmVudENvbFdpZHRoIiwgImN1cnJlbnRDb2xIZWlnaHQiLCAiY29sIiwgImNhbGN1bGF0ZUl0ZW1TaXplIiwgInB1c2giLCAiYWRqdXN0SGl0Qm94ZXMiLCAiYWxpZ24iLCAicnRsIiwgInJ0bEhlbHBlciIsICJnZXRSdGxBZGFwdGVyIiwgIl9hbGlnblN0YXJ0RW5kIiwgImhpdGJveCIsICJsZWZ0Rm9yTHRyIiwgIngiLCAiZHJhdyIsICJjbGlwQXJlYSIsICJfZHJhdyIsICJ1bmNsaXBBcmVhIiwgIm9wdHMiLCAiZGVmYXVsdENvbG9yIiwgImRlZmF1bHRzIiwgImNvbG9yIiwgImhhbGZGb250U2l6ZSIsICJjdXJzb3IiLCAiZHJhd1RpdGxlIiwgImxpbmVXaWR0aCIsICJkcmF3TGVnZW5kQm94IiwgInkiLCAiaXNOYU4iLCAic2F2ZSIsICJ2YWx1ZU9yRGVmYXVsdCIsICJmaWxsU3R5bGUiLCAibGluZUNhcCIsICJsaW5lRGFzaE9mZnNldCIsICJsaW5lSm9pbiIsICJzdHJva2VTdHlsZSIsICJzZXRMaW5lRGFzaCIsICJsaW5lRGFzaCIsICJkcmF3T3B0aW9ucyIsICJyYWRpdXMiLCAiU1FSVDIiLCAicG9pbnRTdHlsZSIsICJyb3RhdGlvbiIsICJib3JkZXJXaWR0aCIsICJjZW50ZXJYIiwgInhQbHVzIiwgImNlbnRlclkiLCAiZHJhd1BvaW50TGVnZW5kIiwgInlCb3hUb3AiLCAieEJveExlZnQiLCAiYm9yZGVyUmFkaXVzIiwgInRvVFJCTENvcm5lcnMiLCAiYmVnaW5QYXRoIiwgIk9iamVjdCIsICJ2YWx1ZXMiLCAic29tZSIsICJ2IiwgImFkZFJvdW5kZWRSZWN0UGF0aCIsICJ3IiwgImgiLCAicmVjdCIsICJmaWxsIiwgInN0cm9rZSIsICJyZXN0b3JlIiwgImZpbGxUZXh0IiwgInJlbmRlclRleHQiLCAic3RyaWtldGhyb3VnaCIsICJoaWRkZW4iLCAibGluZSIsICJvdmVycmlkZVRleHREaXJlY3Rpb24iLCAidGV4dERpcmVjdGlvbiIsICJmb250Q29sb3IiLCAidGV4dFdpZHRoIiwgInNldFdpZHRoIiwgInJlYWxYIiwgIl90ZXh0WCIsICJmb250TGluZUhlaWdodCIsICJjYWxjdWxhdGVMZWdlbmRJdGVtSGVpZ2h0IiwgInJlc3RvcmVUZXh0RGlyZWN0aW9uIiwgInRpdGxlT3B0cyIsICJ0aXRsZSIsICJ0aXRsZUZvbnQiLCAidGl0bGVQYWRkaW5nIiwgInRvUGFkZGluZyIsICJ0b3BQYWRkaW5nUGx1c0hhbGZGb250U2l6ZSIsICJyZWR1Y2UiLCAiYWNjIiwgIl90b0xlZnRSaWdodENlbnRlciIsICJfZ2V0TGVnZW5kSXRlbUF0IiwgImhpdEJveCIsICJsaCIsICJfaXNCZXR3ZWVuIiwgImhhbmRsZUV2ZW50IiwgImUiLCAiaXNMaXN0ZW5lZCIsICJ0eXBlIiwgImhvdmVyZWRJdGVtIiwgInByZXZpb3VzIiwgInNhbWVJdGVtIiwgIm9uTGVhdmUiLCAib25Ib3ZlciIsICJvbkNsaWNrIiwgImNhbGN1bGF0ZUl0ZW1XaWR0aCIsICJjYWxjdWxhdGVJdGVtSGVpZ2h0IiwgImxlZ2VuZEl0ZW1UZXh0IiwgImxhYmVsSGVpZ2h0IiwgImlkIiwgIl9lbGVtZW50IiwgInN0YXJ0IiwgIl9hcmdzIiwgImxlZ2VuZCIsICJsYXlvdXRzIiwgImNvbmZpZ3VyZSIsICJhZGRCb3giLCAic3RvcCIsICJyZW1vdmVCb3giLCAiYmVmb3JlVXBkYXRlIiwgImFmdGVyVXBkYXRlIiwgImFmdGVyRXZlbnQiLCAiYXJncyIsICJyZXBsYXkiLCAiZXZlbnQiLCAiY2kiLCAiaXNEYXRhc2V0VmlzaWJsZSIsICJoaWRlIiwgInNob3ciLCAiZGF0YXNldHMiLCAidXNlQm9yZGVyUmFkaXVzIiwgIl9nZXRTb3J0ZWREYXRhc2V0TWV0YXMiLCAibWFwIiwgIm1ldGEiLCAic3R5bGUiLCAiY29udHJvbGxlciIsICJnZXRTdHlsZSIsICJsYWJlbCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAidmlzaWJsZSIsICJib3JkZXJDYXBTdHlsZSIsICJib3JkZXJEYXNoIiwgImJvcmRlckRhc2hPZmZzZXQiLCAiYm9yZGVySm9pblN0eWxlIiwgImJvcmRlckNvbG9yIiwgImRlc2NyaXB0b3JzIiwgIl9zY3JpcHRhYmxlIiwgIm5hbWUiLCAic3RhcnRzV2l0aCIsICJpbmNsdWRlcyIsICJUaXRsZSIsICJfcGFkZGluZyIsICJsaW5lQ291bnQiLCAiaXNBcnJheSIsICJ0ZXh0U2l6ZSIsICJwb3MiLCAiX2RyYXdBcmdzIiwgIm9mZnNldCIsICJ0aXRsZVgiLCAidGl0bGVZIiwgIlBJIiwgImZvbnRPcHRzIiwgInRyYW5zbGF0aW9uIiwgImNyZWF0ZVRpdGxlIiwgInRpdGxlQmxvY2siLCAiZGVmYXVsdFJvdXRlcyIsICJfaW5kZXhhYmxlIiwgIldlYWtNYXAiLCAic2V0IiwgImdldCIsICJkZWxldGUiLCAicG9zaXRpb25lcnMiLCAiYXZlcmFnZSIsICJpdGVtcyIsICJsZW4iLCAiY291bnQiLCAiZWwiLCAiZWxlbWVudCIsICJoYXNWYWx1ZSIsICJ0b29sdGlwUG9zaXRpb24iLCAibmVhcmVzdCIsICJldmVudFBvc2l0aW9uIiwgIm1pbkRpc3RhbmNlIiwgIk51bWJlciIsICJQT1NJVElWRV9JTkZJTklUWSIsICJuZWFyZXN0RWxlbWVudCIsICJjZW50ZXIiLCAiZ2V0Q2VudGVyUG9pbnQiLCAiZCIsICJkaXN0YW5jZUJldHdlZW5Qb2ludHMiLCAidHAiLCAicHVzaE9yQ29uY2F0IiwgImJhc2UiLCAidG9QdXNoIiwgIkFycmF5IiwgInByb3RvdHlwZSIsICJhcHBseSIsICJzcGxpdE5ld2xpbmVzIiwgInN0ciIsICJTdHJpbmciLCAiaW5kZXhPZiIsICJzcGxpdCIsICJjcmVhdGVUb29sdGlwSXRlbSIsICJnZXREYXRhc2V0TWV0YSIsICJ2YWx1ZSIsICJnZXRMYWJlbEFuZFZhbHVlIiwgInBhcnNlZCIsICJnZXRQYXJzZWQiLCAicmF3IiwgImZvcm1hdHRlZFZhbHVlIiwgImRhdGFzZXQiLCAiZ2V0RGF0YXNldCIsICJkYXRhSW5kZXgiLCAiZ2V0VG9vbHRpcFNpemUiLCAidG9vbHRpcCIsICJib2R5IiwgImZvb3RlciIsICJib2R5Rm9udCIsICJmb290ZXJGb250IiwgInRpdGxlTGluZUNvdW50IiwgImZvb3RlckxpbmVDb3VudCIsICJib2R5TGluZUl0ZW1Db3VudCIsICJjb21iaW5lZEJvZHlMZW5ndGgiLCAiYm9keUl0ZW0iLCAiYmVmb3JlIiwgImxpbmVzIiwgImFmdGVyIiwgImJlZm9yZUJvZHkiLCAiYWZ0ZXJCb2R5IiwgInRpdGxlU3BhY2luZyIsICJ0aXRsZU1hcmdpbkJvdHRvbSIsICJib2R5TGluZUhlaWdodCIsICJkaXNwbGF5Q29sb3JzIiwgImJvZHlTcGFjaW5nIiwgImZvb3Rlck1hcmdpblRvcCIsICJmb290ZXJTcGFjaW5nIiwgIndpZHRoUGFkZGluZyIsICJtYXhMaW5lV2lkdGgiLCAiZWFjaCIsICJjb25jYXQiLCAiYm94UGFkZGluZyIsICJkZXRlcm1pbmVZQWxpZ24iLCAiZG9lc05vdEZpdFdpdGhBbGlnbiIsICJ4QWxpZ24iLCAiY2FyZXQiLCAiY2FyZXRTaXplIiwgImNhcmV0UGFkZGluZyIsICJkZXRlcm1pbmVYQWxpZ24iLCAieUFsaWduIiwgImNoYXJ0V2lkdGgiLCAiY2hhcnRBcmVhIiwgImRldGVybWluZUFsaWdubWVudCIsICJhbGlnblgiLCAiYWxpZ25ZIiwgInBhZGRpbmdBbmRTaXplIiwgImdldEJhY2tncm91bmRQb2ludCIsICJhbGlnbm1lbnQiLCAiY29ybmVyUmFkaXVzIiwgInRvcExlZnQiLCAidG9wUmlnaHQiLCAiYm90dG9tTGVmdCIsICJib3R0b21SaWdodCIsICJfbGltaXRWYWx1ZSIsICJnZXRBbGlnbmVkWCIsICJnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyIsICJjYWxsYmFjayIsICJjcmVhdGVUb29sdGlwQ29udGV4dCIsICJwYXJlbnQiLCAidG9vbHRpcEl0ZW1zIiwgImNyZWF0ZUNvbnRleHQiLCAib3ZlcnJpZGVDYWxsYmFja3MiLCAiY2FsbGJhY2tzIiwgImNvbnRleHQiLCAib3ZlcnJpZGUiLCAiZGVmYXVsdENhbGxiYWNrcyIsICJiZWZvcmVUaXRsZSIsICJub29wIiwgImxhYmVsQ291bnQiLCAibW9kZSIsICJhZnRlclRpdGxlIiwgImJlZm9yZUxhYmVsIiwgInRvb2x0aXBJdGVtIiwgImlzTnVsbE9yVW5kZWYiLCAibGFiZWxDb2xvciIsICJsYWJlbFRleHRDb2xvciIsICJib2R5Q29sb3IiLCAibGFiZWxQb2ludFN0eWxlIiwgImFmdGVyTGFiZWwiLCAiYmVmb3JlRm9vdGVyIiwgImFmdGVyRm9vdGVyIiwgImludm9rZUNhbGxiYWNrV2l0aEZhbGxiYWNrIiwgImFyZyIsICJyZXN1bHQiLCAiVG9vbHRpcCIsICJvcGFjaXR5IiwgIl9hY3RpdmUiLCAiX2V2ZW50UG9zaXRpb24iLCAiX3NpemUiLCAiX2NhY2hlZEFuaW1hdGlvbnMiLCAiX3Rvb2x0aXBJdGVtcyIsICIkYW5pbWF0aW9ucyIsICIkY29udGV4dCIsICJkYXRhUG9pbnRzIiwgImNhcmV0WCIsICJjYXJldFkiLCAibGFiZWxDb2xvcnMiLCAibGFiZWxQb2ludFN0eWxlcyIsICJsYWJlbFRleHRDb2xvcnMiLCAiaW5pdGlhbGl6ZSIsICJfcmVzb2x2ZUFuaW1hdGlvbnMiLCAiY2FjaGVkIiwgInNldENvbnRleHQiLCAiZ2V0Q29udGV4dCIsICJlbmFibGVkIiwgImFuaW1hdGlvbiIsICJhbmltYXRpb25zIiwgIkFuaW1hdGlvbnMiLCAiX2NhY2hlYWJsZSIsICJmcmVlemUiLCAiZ2V0VGl0bGUiLCAiZ2V0QmVmb3JlQm9keSIsICJnZXRCb2R5IiwgImJvZHlJdGVtcyIsICJzY29wZWQiLCAiZ2V0QWZ0ZXJCb2R5IiwgImdldEZvb3RlciIsICJfY3JlYXRlSXRlbXMiLCAiYWN0aXZlIiwgImFycmF5IiwgIml0ZW1Tb3J0IiwgImNoYW5nZWQiLCAicHJvcGVydGllcyIsICJwb3NpdGlvbkFuZFNpemUiLCAiYXNzaWduIiwgImJhY2tncm91bmRQb2ludCIsICJleHRlcm5hbCIsICJkcmF3Q2FyZXQiLCAidG9vbHRpcFBvaW50IiwgImNhcmV0UG9zaXRpb24iLCAiZ2V0Q2FyZXRQb3NpdGlvbiIsICJsaW5lVG8iLCAieDEiLCAieTEiLCAieDIiLCAieTIiLCAieDMiLCAieTMiLCAicHRYIiwgInB0WSIsICJwdCIsICJ0aXRsZUFsaWduIiwgInRpdGxlQ29sb3IiLCAiX2RyYXdDb2xvckJveCIsICJjb2xvclgiLCAicnRsQ29sb3JYIiwgInlPZmZTZXQiLCAiY29sb3JZIiwgIm11bHRpS2V5QmFja2dyb3VuZCIsICJkcmF3UG9pbnQiLCAiaXNPYmplY3QiLCAib3V0ZXJYIiwgImlubmVyWCIsICJmaWxsUmVjdCIsICJzdHJva2VSZWN0IiwgImRyYXdCb2R5IiwgImJvZHlBbGlnbiIsICJ4TGluZVBhZGRpbmciLCAiZmlsbExpbmVPZlRleHQiLCAiYm9keUFsaWduRm9yQ2FsY3VsYXRpb24iLCAidGV4dENvbG9yIiwgImoiLCAiaWxlbiIsICJqbGVuIiwgImRyYXdGb290ZXIiLCAiZm9vdGVyQWxpZ24iLCAiZm9vdGVyQ29sb3IiLCAiZHJhd0JhY2tncm91bmQiLCAidG9vbHRpcFNpemUiLCAibW92ZVRvIiwgInF1YWRyYXRpY0N1cnZlVG8iLCAiY2xvc2VQYXRoIiwgIl91cGRhdGVBbmltYXRpb25UYXJnZXQiLCAiYW5pbXMiLCAiYW5pbVgiLCAiYW5pbVkiLCAicG9pbnQiLCAiX3RvIiwgIl93aWxsUmVuZGVyIiwgImFicyIsICJoYXNUb29sdGlwQ29udGVudCIsICJnbG9iYWxBbHBoYSIsICJnZXRBY3RpdmVFbGVtZW50cyIsICJzZXRBY3RpdmVFbGVtZW50cyIsICJhY3RpdmVFbGVtZW50cyIsICJsYXN0QWN0aXZlIiwgIkVycm9yIiwgIl9lbGVtZW50c0VxdWFsIiwgInBvc2l0aW9uQ2hhbmdlZCIsICJfcG9zaXRpb25DaGFuZ2VkIiwgIl9pZ25vcmVSZXBsYXlFdmVudHMiLCAiaW5DaGFydEFyZWEiLCAiX2dldEFjdGl2ZUVsZW1lbnRzIiwgImdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUiLCAiYWZ0ZXJJbml0IiwgInJlc2V0IiwgImFmdGVyRHJhdyIsICJub3RpZnlQbHVnaW5zIiwgImNhbmNlbGFibGUiLCAidXNlRmluYWxQb3NpdGlvbiIsICJkdXJhdGlvbiIsICJlYXNpbmciLCAibnVtYmVycyIsICJfZmFsbGJhY2siLCAiYWRkaXRpb25hbE9wdGlvblNjb3BlcyIsICJhZGRJZlN0cmluZyIsICJsYWJlbHMiLCAicmF3IiwgImluZGV4IiwgImFkZGVkTGFiZWxzIiwgInB1c2giLCAidW5zaGlmdCIsICJsYWJlbCIsICJpc05hTiIsICJmaW5kT3JBZGRMYWJlbCIsICJmaXJzdCIsICJpbmRleE9mIiwgImxhc3QiLCAibGFzdEluZGV4T2YiLCAidmFsaWRJbmRleCIsICJtYXgiLCAiX2xpbWl0VmFsdWUiLCAiTWF0aCIsICJyb3VuZCIsICJfZ2V0TGFiZWxGb3JWYWx1ZSIsICJ2YWx1ZSIsICJnZXRMYWJlbHMiLCAibGVuZ3RoIiwgIkNhdGVnb3J5U2NhbGUiLCAiU2NhbGUiLCAiY29uc3RydWN0b3IiLCAiY2ZnIiwgIl9zdGFydFZhbHVlIiwgInVuZGVmaW5lZCIsICJfdmFsdWVSYW5nZSIsICJfYWRkZWRMYWJlbHMiLCAiaW5pdCIsICJzY2FsZU9wdGlvbnMiLCAiYWRkZWQiLCAic3BsaWNlIiwgInBhcnNlIiwgImlzTnVsbE9yVW5kZWYiLCAiaXNGaW5pdGUiLCAidmFsdWVPckRlZmF1bHQiLCAiZGV0ZXJtaW5lRGF0YUxpbWl0cyIsICJtaW5EZWZpbmVkIiwgIm1heERlZmluZWQiLCAiZ2V0VXNlckJvdW5kcyIsICJtaW4iLCAiZ2V0TWluTWF4IiwgIm9wdGlvbnMiLCAiYm91bmRzIiwgImJ1aWxkVGlja3MiLCAib2Zmc2V0IiwgInRpY2tzIiwgInNsaWNlIiwgImdldExhYmVsRm9yVmFsdWUiLCAiY2FsbCIsICJjb25maWd1cmUiLCAiaXNIb3Jpem9udGFsIiwgIl9yZXZlcnNlUGl4ZWxzIiwgImdldFBpeGVsRm9yVmFsdWUiLCAiTmFOIiwgImdldFBpeGVsRm9yRGVjaW1hbCIsICJnZXRQaXhlbEZvclRpY2siLCAiZ2V0VmFsdWVGb3JQaXhlbCIsICJwaXhlbCIsICJnZXREZWNpbWFsRm9yUGl4ZWwiLCAiZ2V0QmFzZVBpeGVsIiwgImJvdHRvbSIsICJpZCIsICJkZWZhdWx0cyIsICJjYWxsYmFjayIsICJnZW5lcmF0ZVRpY2tzIiwgImdlbmVyYXRpb25PcHRpb25zIiwgImRhdGFSYW5nZSIsICJNSU5fU1BBQ0lORyIsICJzdGVwIiwgInByZWNpc2lvbiIsICJjb3VudCIsICJtYXhUaWNrcyIsICJtYXhEaWdpdHMiLCAiaW5jbHVkZUJvdW5kcyIsICJ1bml0IiwgIm1heFNwYWNlcyIsICJybWluIiwgInJtYXgiLCAiY291bnREZWZpbmVkIiwgIm1pblNwYWNpbmciLCAic3BhY2luZyIsICJuaWNlTnVtIiwgImZhY3RvciIsICJuaWNlTWluIiwgIm5pY2VNYXgiLCAibnVtU3BhY2VzIiwgImNlaWwiLCAiZmxvb3IiLCAicG93IiwgImFsbW9zdFdob2xlIiwgImFsbW9zdEVxdWFscyIsICJkZWNpbWFsUGxhY2VzIiwgIl9kZWNpbWFsUGxhY2VzIiwgImoiLCAicmVsYXRpdmVMYWJlbFNpemUiLCAiaG9yaXpvbnRhbCIsICJtaW5Sb3RhdGlvbiIsICJyYWQiLCAidG9SYWRpYW5zIiwgInJhdGlvIiwgInNpbiIsICJjb3MiLCAiTGluZWFyU2NhbGVCYXNlIiwgInN0YXJ0IiwgImVuZCIsICJfZW5kVmFsdWUiLCAiTnVtYmVyIiwgImhhbmRsZVRpY2tSYW5nZU9wdGlvbnMiLCAiYmVnaW5BdFplcm8iLCAic2V0TWluIiwgInYiLCAic2V0TWF4IiwgIm1pblNpZ24iLCAic2lnbiIsICJtYXhTaWduIiwgImFicyIsICJnZXRUaWNrTGltaXQiLCAidGlja09wdHMiLCAibWF4VGlja3NMaW1pdCIsICJzdGVwU2l6ZSIsICJjb25zb2xlIiwgIndhcm4iLCAiY29tcHV0ZVRpY2tMaW1pdCIsICJQT1NJVElWRV9JTkZJTklUWSIsICJvcHRzIiwgIm51bWVyaWNHZW5lcmF0b3JPcHRpb25zIiwgIl9tYXhEaWdpdHMiLCAiX3JhbmdlIiwgIl9zZXRNaW5BbmRNYXhCeUtleSIsICJyZXZlcnNlIiwgImZvcm1hdE51bWJlciIsICJjaGFydCIsICJsb2NhbGUiLCAiZm9ybWF0IiwgIkxpbmVhclNjYWxlIiwgIndpZHRoIiwgImhlaWdodCIsICJ0aWNrRm9udCIsICJfcmVzb2x2ZVRpY2tGb250T3B0aW9ucyIsICJsaW5lSGVpZ2h0IiwgIlRpY2tzIiwgImZvcm1hdHRlcnMiLCAibnVtZXJpYyIsICJsb2cxMEZsb29yIiwgImxvZzEwIiwgImNoYW5nZUV4cG9uZW50IiwgIm0iLCAiaXNNYWpvciIsICJ0aWNrVmFsIiwgInJlbWFpbiIsICJzdGVwcyIsICJyYW5nZUV4cCIsICJyYW5nZVN0ZXAiLCAic3RhcnRFeHAiLCAicmFuZ2UiLCAiZmluaXRlT3JEZWZhdWx0IiwgIm1pbkV4cCIsICJleHAiLCAiYmFzZSIsICJzaWduaWZpY2FuZCIsICJtYWpvciIsICJsYXN0VGljayIsICJMb2dhcml0aG1pY1NjYWxlIiwgInByb3RvdHlwZSIsICJhcHBseSIsICJfemVybyIsICJfc3VnZ2VzdGVkTWluIiwgIl91c2VyTWluIiwgIl91c2VyTWF4IiwgImRlY2ltYWwiLCAibG9nYXJpdGhtaWMiLCAiZW5hYmxlZCIsICJnZXRUaWNrQmFja2Ryb3BIZWlnaHQiLCAiZGlzcGxheSIsICJwYWRkaW5nIiwgInRvUGFkZGluZyIsICJiYWNrZHJvcFBhZGRpbmciLCAiZm9udCIsICJzaXplIiwgIm1lYXN1cmVMYWJlbFNpemUiLCAiY3R4IiwgImlzQXJyYXkiLCAidyIsICJfbG9uZ2VzdFRleHQiLCAic3RyaW5nIiwgImgiLCAiZGV0ZXJtaW5lTGltaXRzIiwgImFuZ2xlIiwgInBvcyIsICJmaXRXaXRoUG9pbnRMYWJlbHMiLCAic2NhbGUiLCAib3JpZyIsICJsIiwgImxlZnQiLCAiX3BhZGRpbmciLCAiciIsICJyaWdodCIsICJ0IiwgInRvcCIsICJiIiwgImxpbWl0cyIsICJPYmplY3QiLCAiYXNzaWduIiwgImxhYmVsU2l6ZXMiLCAidmFsdWVDb3VudCIsICJfcG9pbnRMYWJlbHMiLCAicG9pbnRMYWJlbE9wdHMiLCAicG9pbnRMYWJlbHMiLCAiYWRkaXRpb25hbEFuZ2xlIiwgImNlbnRlclBvaW50TGFiZWxzIiwgIlBJIiwgImkiLCAic2V0Q29udGV4dCIsICJnZXRQb2ludExhYmVsQ29udGV4dCIsICJwb2ludFBvc2l0aW9uIiwgImdldFBvaW50UG9zaXRpb24iLCAiZHJhd2luZ0FyZWEiLCAicGxGb250IiwgInRvRm9udCIsICJ0ZXh0U2l6ZSIsICJhbmdsZVJhZGlhbnMiLCAiX25vcm1hbGl6ZUFuZ2xlIiwgImdldEluZGV4QW5nbGUiLCAidG9EZWdyZWVzIiwgImhMaW1pdHMiLCAieCIsICJ2TGltaXRzIiwgInkiLCAidXBkYXRlTGltaXRzIiwgInNldENlbnRlclBvaW50IiwgIl9wb2ludExhYmVsSXRlbXMiLCAiYnVpbGRQb2ludExhYmVsSXRlbXMiLCAiaXRlbXMiLCAiZXh0cmEiLCAib3V0ZXJEaXN0YW5jZSIsICJwb2ludExhYmVsUG9zaXRpb24iLCAiSEFMRl9QSSIsICJ5Rm9yQW5nbGUiLCAidGV4dEFsaWduIiwgImdldFRleHRBbGlnbkZvckFuZ2xlIiwgImxlZnRGb3JUZXh0QWxpZ24iLCAiYWxpZ24iLCAiZHJhd1BvaW50TGFiZWxzIiwgImxhYmVsQ291bnQiLCAib3B0c0F0SW5kZXgiLCAiYmFja2Ryb3BDb2xvciIsICJib3JkZXJSYWRpdXMiLCAidG9UUkJMQ29ybmVycyIsICJmaWxsU3R5bGUiLCAiYmFja2Ryb3BMZWZ0IiwgImJhY2tkcm9wVG9wIiwgImJhY2tkcm9wV2lkdGgiLCAiYmFja2Ryb3BIZWlnaHQiLCAidmFsdWVzIiwgInNvbWUiLCAiYmVnaW5QYXRoIiwgImFkZFJvdW5kZWRSZWN0UGF0aCIsICJyYWRpdXMiLCAiZmlsbCIsICJmaWxsUmVjdCIsICJyZW5kZXJUZXh0IiwgImNvbG9yIiwgInRleHRCYXNlbGluZSIsICJwYXRoUmFkaXVzTGluZSIsICJjaXJjdWxhciIsICJhcmMiLCAieENlbnRlciIsICJ5Q2VudGVyIiwgIlRBVSIsICJtb3ZlVG8iLCAibGluZVRvIiwgImRyYXdSYWRpdXNMaW5lIiwgImdyaWRMaW5lT3B0cyIsICJib3JkZXJPcHRzIiwgImxpbmVXaWR0aCIsICJzYXZlIiwgInN0cm9rZVN0eWxlIiwgInNldExpbmVEYXNoIiwgImRhc2giLCAibGluZURhc2hPZmZzZXQiLCAiZGFzaE9mZnNldCIsICJjbG9zZVBhdGgiLCAic3Ryb2tlIiwgInJlc3RvcmUiLCAiY3JlYXRlUG9pbnRMYWJlbENvbnRleHQiLCAicGFyZW50IiwgImNyZWF0ZUNvbnRleHQiLCAidHlwZSIsICJSYWRpYWxMaW5lYXJTY2FsZSIsICJzZXREaW1lbnNpb25zIiwgIm1heFdpZHRoIiwgIm1heEhlaWdodCIsICJnZW5lcmF0ZVRpY2tMYWJlbHMiLCAibWFwIiwgImNhbGxDYWxsYmFjayIsICJmaWx0ZXIiLCAiZ2V0RGF0YVZpc2liaWxpdHkiLCAiZml0IiwgImxlZnRNb3ZlbWVudCIsICJyaWdodE1vdmVtZW50IiwgInRvcE1vdmVtZW50IiwgImJvdHRvbU1vdmVtZW50IiwgImFuZ2xlTXVsdGlwbGllciIsICJzdGFydEFuZ2xlIiwgImdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlIiwgInNjYWxpbmdGYWN0b3IiLCAiZ2V0VmFsdWVGb3JEaXN0YW5jZUZyb21DZW50ZXIiLCAiZGlzdGFuY2UiLCAic2NhbGVkRGlzdGFuY2UiLCAicG9pbnRMYWJlbCIsICJnZXRDb250ZXh0IiwgImRpc3RhbmNlRnJvbUNlbnRlciIsICJnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUiLCAiZ2V0QmFzZVBvc2l0aW9uIiwgImdldEJhc2VWYWx1ZSIsICJnZXRQb2ludExhYmVsUG9zaXRpb24iLCAiZHJhd0JhY2tncm91bmQiLCAiYmFja2dyb3VuZENvbG9yIiwgImdyaWQiLCAiZHJhd0dyaWQiLCAiYW5nbGVMaW5lcyIsICJib3JkZXIiLCAicG9zaXRpb24iLCAiZm9yRWFjaCIsICJ0aWNrIiwgImNvbnRleHQiLCAib3B0c0F0SW5kZXhCb3JkZXIiLCAiYm9yZGVyRGFzaCIsICJib3JkZXJEYXNoT2Zmc2V0IiwgImRyYXdCb3JkZXIiLCAiZHJhd0xhYmVscyIsICJ0cmFuc2xhdGUiLCAicm90YXRlIiwgInNob3dMYWJlbEJhY2tkcm9wIiwgIm1lYXN1cmVUZXh0IiwgImRyYXdUaXRsZSIsICJhbmltYXRlIiwgImRlZmF1bHRSb3V0ZXMiLCAiZGVzY3JpcHRvcnMiLCAiX2ZhbGxiYWNrIiwgIklOVEVSVkFMUyIsICJtaWxsaXNlY29uZCIsICJjb21tb24iLCAic2Vjb25kIiwgIm1pbnV0ZSIsICJob3VyIiwgImRheSIsICJ3ZWVrIiwgIm1vbnRoIiwgInF1YXJ0ZXIiLCAieWVhciIsICJVTklUUyIsICJrZXlzIiwgInNvcnRlciIsICJhIiwgImlucHV0IiwgImFkYXB0ZXIiLCAiX2FkYXB0ZXIiLCAicGFyc2VyIiwgImlzb1dlZWtkYXkiLCAiX3BhcnNlT3B0cyIsICJpc051bWJlciIsICJzdGFydE9mIiwgImRldGVybWluZVVuaXRGb3JBdXRvVGlja3MiLCAibWluVW5pdCIsICJjYXBhY2l0eSIsICJpbGVuIiwgImludGVydmFsIiwgIk1BWF9TQUZFX0lOVEVHRVIiLCAiZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmciLCAibnVtVGlja3MiLCAiZGlmZiIsICJkZXRlcm1pbmVNYWpvclVuaXQiLCAiYWRkVGljayIsICJ0aW1lIiwgInRpbWVzdGFtcHMiLCAibG8iLCAiaGkiLCAiX2xvb2t1cCIsICJ0aW1lc3RhbXAiLCAic2V0TWFqb3JUaWNrcyIsICJtYWpvclVuaXQiLCAiYWRkIiwgInRpY2tzRnJvbVRpbWVzdGFtcHMiLCAiVGltZVNjYWxlIiwgInByb3BzIiwgIl9jYWNoZSIsICJkYXRhIiwgImFsbCIsICJfdW5pdCIsICJfbWFqb3JVbml0IiwgIl9vZmZzZXRzIiwgIl9ub3JtYWxpemVkIiwgInNjYWxlT3B0cyIsICJhZGFwdGVycyIsICJfZGF0ZSIsICJkYXRlIiwgIm1lcmdlSWYiLCAiZGlzcGxheUZvcm1hdHMiLCAiZm9ybWF0cyIsICJub3JtYWxpemVkIiwgImJlZm9yZUxheW91dCIsICJfYXBwbHlCb3VuZHMiLCAiX2dldExhYmVsQm91bmRzIiwgInNvdXJjZSIsICJEYXRlIiwgIm5vdyIsICJlbmRPZiIsICJhcnIiLCAiZ2V0TGFiZWxUaW1lc3RhbXBzIiwgIk5FR0FUSVZFX0lORklOSVRZIiwgInRpbWVPcHRzIiwgIl9nZW5lcmF0ZSIsICJfZmlsdGVyQmV0d2VlbiIsICJhdXRvU2tpcCIsICJfZ2V0TGFiZWxDYXBhY2l0eSIsICJpbml0T2Zmc2V0cyIsICJhZnRlckF1dG9Ta2lwIiwgIm9mZnNldEFmdGVyQXV0b3NraXAiLCAiZ2V0RGVjaW1hbEZvclZhbHVlIiwgImxpbWl0IiwgIm1pbm9yIiwgIndlZWtkYXkiLCAiaGFzV2Vla2RheSIsICJFcnJvciIsICJnZXREYXRhVGltZXN0YW1wcyIsICJzb3J0IiwgInRvb2x0aXBGb3JtYXQiLCAiZGF0ZXRpbWUiLCAiZm10IiwgIl90aWNrRm9ybWF0RnVuY3Rpb24iLCAiZm9ybWF0dGVyIiwgIm1pbm9yRm9ybWF0IiwgIm1ham9yRm9ybWF0IiwgIm9mZnNldHMiLCAiX2dldExhYmVsU2l6ZSIsICJ0aWNrc09wdHMiLCAidGlja0xhYmVsV2lkdGgiLCAibWF4Um90YXRpb24iLCAiY29zUm90YXRpb24iLCAic2luUm90YXRpb24iLCAidGlja0ZvbnRTaXplIiwgImV4YW1wbGVUaW1lIiwgImV4YW1wbGVMYWJlbCIsICJtZXRhcyIsICJnZXRNYXRjaGluZ1Zpc2libGVNZXRhcyIsICJjb250cm9sbGVyIiwgImdldEFsbFBhcnNlZFZhbHVlcyIsICJjb25jYXQiLCAibm9ybWFsaXplIiwgIl9hcnJheVVuaXF1ZSIsICJpbnRlcnBvbGF0ZSIsICJ0YWJsZSIsICJ2YWwiLCAicHJldlNvdXJjZSIsICJuZXh0U291cmNlIiwgInByZXZUYXJnZXQiLCAibmV4dFRhcmdldCIsICJfbG9va3VwQnlLZXkiLCAic3BhbiIsICJUaW1lU2VyaWVzU2NhbGUiLCAiX3RhYmxlIiwgIl9taW5Qb3MiLCAiX3RhYmxlUmFuZ2UiLCAiX2dldFRpbWVzdGFtcHNGb3JUYWJsZSIsICJidWlsZExvb2t1cFRhYmxlIiwgInByZXYiLCAiY3VyciIsICJuZXh0IiwgImFwcCIsICJoIiwgImltcG9ydF9vYnNpZGlhbiIsICJpbXBvcnRfb2JzaWRpYW4iLCAibmFtZSIsICJhcHAiLCAicGFyc2UiLCAiaW1wb3J0X29ic2lkaWFuIiwgInJhbmsiLCAiZWFzZSIsICJwYXJzZSIsICJzaWJsaW5ncyJdCn0K diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 6c76945c..00000000 --- a/yarn.lock +++ /dev/null @@ -1,3388 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.21.0", "@babel/generator@^7.21.1", "@babel/generator@^7.7.2": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.21.0": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.7.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@esbuild/android-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" - integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== - -"@esbuild/android-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" - integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== - -"@esbuild/android-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" - integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== - -"@esbuild/darwin-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" - integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== - -"@esbuild/darwin-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" - integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== - -"@esbuild/freebsd-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" - integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== - -"@esbuild/freebsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" - integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== - -"@esbuild/linux-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" - integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== - -"@esbuild/linux-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" - integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== - -"@esbuild/linux-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" - integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== - -"@esbuild/linux-loong64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" - integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== - -"@esbuild/linux-mips64el@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" - integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== - -"@esbuild/linux-ppc64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" - integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== - -"@esbuild/linux-riscv64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" - integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== - -"@esbuild/linux-s390x@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" - integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== - -"@esbuild/linux-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" - integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== - -"@esbuild/netbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" - integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== - -"@esbuild/openbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" - integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== - -"@esbuild/sunos-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" - integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== - -"@esbuild/win32-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" - integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== - -"@esbuild/win32-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" - integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== - -"@esbuild/win32-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" - integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== - -"@eslint/eslintrc@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" - integrity sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.35.0": - version "8.35.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.35.0.tgz#b7569632b0b788a0ca0e438235154e45d42813a7" - integrity sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw== - -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/reporters" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.5.0" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-resolve-dependencies "^29.5.0" - jest-runner "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - jest-watcher "^29.5.0" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - jest-worker "^29.5.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@kurkle/color@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" - integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== - dependencies: - "@babel/types" "^7.3.0" - -"@types/codemirror@0.0.108": - version "0.0.108" - resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.108.tgz#e640422b666bf49251b384c390cdeb2362585bde" - integrity sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw== - dependencies: - "@types/tern" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.2.4": - version "29.4.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" - integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/jsdom@^20.0.0": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" - integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== - dependencies: - "@types/node" "*" - "@types/tough-cookie" "*" - parse5 "^7.0.0" - -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/node@*", "@types/node@^18.11.13": - version "18.15.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" - integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== - -"@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== - -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/tern@*": - version "0.23.4" - resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb" - integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg== - dependencies: - "@types/estree" "*" - -"@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== - -"@types/vhtml@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@types/vhtml/-/vhtml-2.2.4.tgz#761bce4b2aa63782b5b9a290c8e0c271b29f57cd" - integrity sha512-H7/C7RZuaoc45JRPKNTsyVwgCMNY9u20QKs1fz4pKKjwpnQe5Jo+YhFq5UQI+h5orsHg+3OZ2tJlUkxkIHUa2w== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.22" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" - integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.46.0": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e" - integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/type-utils" "5.54.1" - "@typescript-eslint/utils" "5.54.1" - debug "^4.3.4" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.46.0": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c" - integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg== - dependencies: - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz#6d864b4915741c608a58ce9912edf5a02bb58735" - integrity sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg== - dependencies: - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/visitor-keys" "5.54.1" - -"@typescript-eslint/type-utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748" - integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g== - dependencies: - "@typescript-eslint/typescript-estree" "5.54.1" - "@typescript-eslint/utils" "5.54.1" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c" - integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw== - -"@typescript-eslint/typescript-estree@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz#df7b6ae05fd8fef724a87afa7e2f57fa4a599be1" - integrity sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg== - dependencies: - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/visitor-keys" "5.54.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34" - integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.54.1" - "@typescript-eslint/types" "5.54.1" - "@typescript-eslint/typescript-estree" "5.54.1" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.54.1": - version "5.54.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz#d7a8a0f7181d6ac748f4d47b2306e0513b98bf8b" - integrity sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg== - dependencies: - "@typescript-eslint/types" "5.54.1" - eslint-visitor-keys "^3.3.0" - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -acorn-globals@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" - integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== - dependencies: - acorn "^8.1.0" - acorn-walk "^8.0.2" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.0.2: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.1.0, acorn@^8.8.0, acorn@^8.8.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001449: - version "1.0.30001464" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" - integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chart.js@^4.0.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.2.1.tgz#d2bd5c98e9a0ae35408975b638f40513b067ba1d" - integrity sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw== - dependencies: - "@kurkle/color" "^0.3.0" - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssom@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -data-urls@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== - dependencies: - abab "^2.0.6" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decimal.js@^10.4.2: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -domexception@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== - dependencies: - webidl-conversions "^7.0.0" - -electron-to-chromium@^1.4.284: - version "1.4.327" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.327.tgz#288b106518cfed0a60f7de8a0480432a9be45477" - integrity sha512-DIk2H4g/3ZhjgiABJjVdQvUdMlSABOsjeCm6gmUzIdKxAuFrGiJ8QXMm3i09grZdDBMC/d8MELMrdwYRC0+YHg== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -esbuild@~0.16.4: - version "0.16.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" - integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== - optionalDependencies: - "@esbuild/android-arm" "0.16.17" - "@esbuild/android-arm64" "0.16.17" - "@esbuild/android-x64" "0.16.17" - "@esbuild/darwin-arm64" "0.16.17" - "@esbuild/darwin-x64" "0.16.17" - "@esbuild/freebsd-arm64" "0.16.17" - "@esbuild/freebsd-x64" "0.16.17" - "@esbuild/linux-arm" "0.16.17" - "@esbuild/linux-arm64" "0.16.17" - "@esbuild/linux-ia32" "0.16.17" - "@esbuild/linux-loong64" "0.16.17" - "@esbuild/linux-mips64el" "0.16.17" - "@esbuild/linux-ppc64" "0.16.17" - "@esbuild/linux-riscv64" "0.16.17" - "@esbuild/linux-s390x" "0.16.17" - "@esbuild/linux-x64" "0.16.17" - "@esbuild/netbsd-x64" "0.16.17" - "@esbuild/openbsd-x64" "0.16.17" - "@esbuild/sunos-x64" "0.16.17" - "@esbuild/win32-arm64" "0.16.17" - "@esbuild/win32-ia32" "0.16.17" - "@esbuild/win32-x64" "0.16.17" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.29.0: - version "8.35.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.35.0.tgz#fffad7c7e326bae606f0e8f436a6158566d42323" - integrity sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw== - dependencies: - "@eslint/eslintrc" "^2.0.0" - "@eslint/js" "8.35.0" - "@humanwhocodes/config-array" "^0.11.8" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -html-encoding-sniffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== - dependencies: - whatwg-encoding "^2.0.0" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-jsdom@^29.3.1: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" - integrity sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/jsdom" "^20.0.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - jsdom "^20.0.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-expect-message@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/jest-expect-message/-/jest-expect-message-1.1.3.tgz#a3f6bd4503f5bd5d2e37b70d3126a2bdb215ec58" - integrity sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg== - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-util@^29.0.0, jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.3.1: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - -js-sdsl@^4.1.4: - version "4.3.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" - integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsdom@^20.0.0: - version "20.0.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" - integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== - dependencies: - abab "^2.0.6" - acorn "^8.8.1" - acorn-globals "^7.0.0" - cssom "^0.5.0" - cssstyle "^2.3.0" - data-urls "^3.0.2" - decimal.js "^10.4.2" - domexception "^4.0.0" - escodegen "^2.0.0" - form-data "^4.0.0" - html-encoding-sniffer "^3.0.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" - parse5 "^7.1.1" - saxes "^6.0.0" - symbol-tree "^3.2.4" - tough-cookie "^4.1.2" - w3c-xmlserializer "^4.0.0" - webidl-conversions "^7.0.0" - whatwg-encoding "^2.0.0" - whatwg-mimetype "^3.0.0" - whatwg-url "^11.0.0" - ws "^8.11.0" - xml-name-validator "^4.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -moment@2.29.4, moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nwsapi@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== - -obsidian@^0.16.3: - version "0.16.3" - resolved "https://registry.yarnpkg.com/obsidian/-/obsidian-0.16.3.tgz#137b7e91f949517a1bc817b1d7ef9b8aefb219bc" - integrity sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw== - dependencies: - "@types/codemirror" "0.0.108" - moment "2.29.4" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pagerank.js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pagerank.js/-/pagerank.js-1.0.2.tgz#8f0d8b2b68eb6fadde0aad780df045d226f77584" - integrity sha512-IinWDOC9kVC40s9jV4ifniiY9aJFa46r+GufsFVc6yTrCr1tHDQgVqsoYEPfCs9oJTTG8qzAePcJcCfvBGQBRw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^7.0.0, parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier@^2.8.1: - version "2.8.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" - integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== - -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pure-rand@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.0.tgz#701996ceefa253507923a0e864c17ab421c04a7c" - integrity sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.1.tgz#cee884cd4e3f355660e501fa3276b27d7ffe5a20" - integrity sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw== - -resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== - dependencies: - xmlchars "^2.2.0" - -semver@7.x, semver@^7.3.5, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== - dependencies: - punycode "^2.1.1" - -ts-jest@^29.0.3: - version "29.0.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" - integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -tslib@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typescript@4.9.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -vhtml@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vhtml/-/vhtml-2.2.0.tgz#369e6823ed6c32cbb9f6e33395bae7c65faa014c" - integrity sha512-TPXrXrxBOslRUVnlVkiAqhoXneiertIg86bdvzionrUYhEuiROvyPZNiiP6GIIJ2Q7oPNVyEtIx8gMAZZE9lCQ== - -w3c-xmlserializer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" - integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== - dependencies: - xml-name-validator "^4.0.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== - -whatwg-encoding@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== - dependencies: - iconv-lite "0.6.3" - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== - dependencies: - tr46 "^3.0.0" - webidl-conversions "^7.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^8.11.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" - integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== - -xml-name-validator@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==