oscar.plaisant@icloud.com 03ecc4a65b update
2023-10-23 23:30:51 +02:00

1089 lines
177 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
if you want to view the source visit the plugins github repository
*/
'use strict';
var obsidian = require('obsidian');
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
function getActiveView(app) {
const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView);
return activeView !== null && activeView !== void 0 ? activeView : undefined;
}
function isViewActive(app) {
const activeView = getActiveView(app);
if (activeView && activeView.file)
return true;
return false;
}
function getViewMetadata(app) {
const activeView = getActiveView(app);
if (activeView && activeView.file) {
const data = app.metadataCache.getFileCache(activeView.file) || {};
return data;
}
return undefined;
}
function getViewInfo(app) {
const activeView = getActiveView(app);
const data = getViewMetadata(app);
const editor = activeView ? activeView.editor : undefined;
if (activeView && data && editor) {
return {
activeView, data, editor
};
}
return undefined;
}
const roman_map = {
M: 1000,
CM: 900,
D: 500,
CD: 400,
C: 100,
XC: 90,
L: 50,
XL: 40,
X: 10,
IX: 9,
V: 5,
IV: 4,
I: 1
};
const allChars = Object.keys(roman_map);
const allNumerals = Object.values(roman_map);
const romanPattern =
/^(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))$/;
const romanize = (decimal) => {
if (
decimal <= 0 ||
typeof decimal !== 'number' ||
Math.floor(decimal) !== decimal
) {
throw new Error('requires an unsigned integer')
}
if (decimal >= 4000) {
throw new Error('requires max value of less than 3999 or less')
}
let roman = '';
for (let i = 0; i < allChars.length; i++) {
while (decimal >= allNumerals[i]) {
decimal -= allNumerals[i];
roman += allChars[i];
}
}
return roman
};
const deromanize = (romanStr) => {
if (typeof romanStr !== 'string') {
throw new Error('requires a string')
}
if (!romanPattern.test(romanStr)) {
throw new Error('requires valid roman numeral string')
}
let romanString = romanStr.toUpperCase();
let arabic = 0;
let iteration = romanString.length;
while (iteration--) {
let cumulative = roman_map[romanString[iteration]];
if (cumulative < roman_map[romanString[iteration + 1]]) {
arabic -= cumulative;
} else {
arabic += cumulative;
}
}
return arabic
};
var romans = {
deromanize,
romanize,
allChars,
allNumerals
};
// Validates the string using a regex to ensure is is a valid arabic numbering value
function isValidArabicNumberingValueString(s) {
const regex = /^[0-9]+$/;
return regex.test(s);
}
// Validates the string using a regex to ensure is is a valid alphabet numbering value
function isValidAlphabetNumberingValueString(s) {
const regex = /^[A-Z]$/;
return regex.test(s);
}
// Validates the string using a regex to ensure is is a valid roman numbering value
function isValidRomanNumberingValueString(s) {
const regex = /^[0IVXLCDM]+$/; // This includes zero for zeroth testing
return regex.test(s);
}
function printableNumberingToken(t) {
switch (t.style) {
case '1':
return t.value.toString();
case 'A':
return t.value;
case 'I':
return t.value;
}
}
function zerothNumberingTokenInStyle(style) {
switch (style) {
case '1':
return { style: '1', value: 0 };
case 'A':
return { style: 'A', value: 'Z' };
case 'I':
return { style: 'I', value: '0' };
}
}
function firstNumberingTokenInStyle(style) {
switch (style) {
case '1':
return { style: '1', value: 1 };
case 'A':
return { style: 'A', value: 'A' };
case 'I':
return { style: 'I', value: 'I' };
}
}
function nextNumberingToken(t) {
switch (t.style) {
case '1':
return { style: '1', value: t.value + 1 };
case 'A':
if (t.value === 'Z')
return { style: 'A', value: 'A' };
else
return { style: 'A', value: String.fromCharCode(t.value.charCodeAt(0) + 1) };
case 'I':
if (t.value === '0')
return { style: 'I', value: 'I' };
else
return { style: 'I', value: romans.romanize(romans.deromanize(t.value) + 1) };
}
}
function previousNumberingToken(t) {
switch (t.style) {
case '1':
return { style: '1', value: t.value - 1 };
case 'A':
if (t.value === 'A')
return { style: 'A', value: 'Z' };
else
return { style: 'A', value: String.fromCharCode(t.value.charCodeAt(0) - 1) };
case 'I':
if (t.value === 'I')
return { style: 'I', value: '0' };
else
return { style: 'I', value: romans.romanize(romans.deromanize(t.value) - 1) };
}
}
function makeNumberingString(numberingStack) {
let numberingString = '';
for (let i = 0; i < numberingStack.length; i++) {
if (i === 0) {
numberingString += ' ';
}
else {
numberingString += '.';
}
numberingString += printableNumberingToken(numberingStack[i]);
}
return numberingString;
}
function startAtOrZerothInStyle(startAtSettingString, style) {
if (startAtSettingString === '')
return zerothNumberingTokenInStyle(style);
let firstNumberingTokenFromSetting;
switch (style) {
case '1':
if (!isValidArabicNumberingValueString(startAtSettingString))
return zerothNumberingTokenInStyle(style);
firstNumberingTokenFromSetting = { style: '1', value: parseInt(startAtSettingString) };
break;
case 'A':
if (!isValidAlphabetNumberingValueString(startAtSettingString))
return zerothNumberingTokenInStyle(style);
firstNumberingTokenFromSetting = { style: 'A', value: startAtSettingString };
break;
case 'I':
if (!isValidRomanNumberingValueString(startAtSettingString))
return zerothNumberingTokenInStyle(style);
firstNumberingTokenFromSetting = { style: 'I', value: startAtSettingString };
break;
}
// Convert the first numbering token to a zeroth numbering token
return previousNumberingToken(firstNumberingTokenFromSetting);
}
const DEFAULT_SETTINGS = {
skipTopLevel: false,
firstLevel: 1,
maxLevel: 6,
styleLevel1: '1',
styleLevelOther: '1',
auto: false,
separator: '',
contents: '',
startAt: ''
};
function isValidNumberingStyleString(s) {
if (s === 'A' || s === '1' || s === 'I')
return true;
return false;
}
function isValidNumberingValueString(s) {
if (s === '' || isValidArabicNumberingValueString(s) || isValidAlphabetNumberingValueString(s) || isValidRomanNumberingValueString(s))
return true;
return false;
}
function isValidFlag(f) {
if (f === true || f === false)
return true;
return false;
}
function isValidFirstOrMaxLevel(x) {
if (typeof x === 'number' && x >= 1 && x <= 6)
return true;
return false;
}
function isValidSeparator(x) {
return typeof x === 'string' &&
(x === '' ||
x === ':' || x === ' :' ||
x === '.' || x === ' .' ||
x === '-' || x === ' -' ||
x === '—' || x === ' —' || /* em-dash */
x === ')' || x === ' )');
}
function isValidContents(x) {
if (typeof x === 'string' && (x === '' || x.startsWith('^')))
return true;
return false;
}
function doesContentsHaveValue(x) {
if (x.length > 2 && x.startsWith('^'))
return true;
return false;
}
function createSupportFlagsFromSettings(styleLevel1, styleLevelOther) {
return {
alphabet: styleLevel1 === 'A' || styleLevelOther === 'A',
roman: styleLevel1 === 'I' || styleLevelOther === 'I'
};
}
// Get the regex for the header string, based on the support flags. The generated regex is used to find the range of the header prefix.
// The regex is generated dynamically, because the regex is different depending on the support flags.
function getRegexForHeaderString(flags) {
if (flags.alphabet && flags.roman) {
// Regex to match the heading prefix, including the space after the hash(es), but not the heading text
return /^\s{0,4}#+( )?([0-9]+\.|[A-Z]\.|[IVXLCDM]+\.)*([0-9]+|[A-Z]|[IVXLCDM]+)?( )?[)—:.-]?( )+/g;
}
else if (!flags.alphabet && flags.roman) {
// Regex to match the heading prefix, including the space after the hash(es), but not the heading text
return /^\s{0,4}#+( )?([0-9]+\.|[IVXLCDM]+\.)*([0-9]+|[IVXLCDM]+)?( )?[)—:.-]?( )+/g;
}
else if (flags.alphabet && !flags.roman) {
// Regex to match the heading prefix, including the space after the hash(es), but not the heading text
return /^\s{0,4}#+( )?([0-9]+\.|[A-Z]\.)*([0-9]+|[A-Z])?( )?[)—:.-]?( )+/g;
}
else if (!flags.alphabet && !flags.roman) {
// Regex to match the heading prefix, including the space after the hash(es), but not the heading text
return /^\s{0,4}#+( )?([0-9]+\.)*([0-9]+)?( )?[)—:.-]?( )+/g;
}
throw new Error('Unexpected combination of support flags');
}
// Find the range of the heading prefix, including the space after any numbering, but not the heading text
function findRangeInHeaderString(lineText, lineNumber, flags) {
const regex = getRegexForHeaderString(flags);
if (!lineText)
return undefined;
const matches = lineText.match(regex);
if (matches && matches.length !== 1) {
// eslint-disable-next-line no-console
console.log("Unexpected heading format: '" + lineText + "'");
return undefined;
}
const match = matches ? matches[0] : '';
const from = {
line: lineNumber,
ch: 0
};
const to = {
line: lineNumber,
ch: match.length
};
return { from, to };
}
function updateSettingsFromFrontMatterFormatPart(part, settings) {
// Parse the separator
let partWithoutSeparator = part;
const potentialTwoCharSeparator = part.slice(-2);
if (isValidSeparator(potentialTwoCharSeparator)) {
settings.separator = potentialTwoCharSeparator;
partWithoutSeparator = part.slice(0, -2);
}
else {
const potentialOneCharSeparator = part.slice(-1);
if (isValidSeparator(potentialOneCharSeparator)) {
settings.separator = potentialOneCharSeparator;
partWithoutSeparator = part.slice(0, -1);
}
else {
settings.separator = '';
}
}
// Parse the numbering style
const descriptors = partWithoutSeparator.split('.');
let firstNumberedDescriptor = 0;
// Handle the case where the first descriptor is an underscore
if (descriptors.length > 1 && descriptors[0] === '_') {
// The first descriptor is an instruction to skip top levels, so skip them
settings.skipTopLevel = true;
firstNumberedDescriptor = 1;
}
else {
settings.skipTopLevel = false;
}
if (descriptors.length - firstNumberedDescriptor >= 2) {
const styleLevel1 = descriptors[firstNumberedDescriptor];
if (isValidNumberingStyleString(styleLevel1)) {
settings.styleLevel1 = styleLevel1;
}
const styleLevelOther = descriptors[firstNumberedDescriptor + 1];
if (isValidNumberingStyleString(styleLevelOther)) {
settings.styleLevelOther = styleLevelOther;
}
}
return settings;
}
const AUTO_PART_KEY = 'auto';
const FIRST_LEVEL_PART_KEY = 'first-level';
const MAX_LEVEL_PART_KEY = 'max';
const CONTENTS_PART_KEY = 'contents';
const START_AT_PART_KEY = 'start-at';
function parseCompactFrontMatterSettings(fm) {
const entry = obsidian.parseFrontMatterEntry(fm, 'number headings');
if (entry) {
const entryString = String(entry);
const parts = entryString.split(',');
let settings = Object.assign({}, DEFAULT_SETTINGS);
for (const part of parts) {
const trimmedPart = part.trim();
if (trimmedPart.length === 0)
continue;
if (trimmedPart === AUTO_PART_KEY) {
// Parse auto numbering part
settings.auto = true;
}
else if (trimmedPart.startsWith(FIRST_LEVEL_PART_KEY)) {
// Parse first level part
const nstring = trimmedPart.substring(FIRST_LEVEL_PART_KEY.length + 1);
const n = parseInt(nstring);
if (isValidFirstOrMaxLevel(n)) {
settings.firstLevel = n;
}
}
else if (trimmedPart.startsWith(MAX_LEVEL_PART_KEY)) {
// Parse max level part
const nstring = trimmedPart.substring(MAX_LEVEL_PART_KEY.length + 1);
const n = parseInt(nstring);
if (isValidFirstOrMaxLevel(n)) {
settings.maxLevel = n;
}
}
else if (trimmedPart.startsWith(START_AT_PART_KEY)) {
// Parse "start at" part
const value = trimmedPart.substring(START_AT_PART_KEY.length + 1);
if (isValidNumberingValueString(value)) {
settings.startAt = value;
}
}
else if (trimmedPart.startsWith(CONTENTS_PART_KEY)) {
if (trimmedPart.length <= CONTENTS_PART_KEY.length + 1)
continue;
// Parse contents heading part
const tocHeading = trimmedPart.substring(CONTENTS_PART_KEY.length + 1);
if (isValidContents(tocHeading)) {
settings.contents = tocHeading;
}
}
else {
// Parse formatting part
settings = updateSettingsFromFrontMatterFormatPart(trimmedPart, settings);
}
}
return settings;
}
return undefined;
}
const getFrontMatterSettingsOrAlternative = ({ frontmatter }, alternativeSettings) => {
var _a, _b, _c, _d, _e;
if (frontmatter !== undefined) {
const decompactedSettings = parseCompactFrontMatterSettings(frontmatter);
if (decompactedSettings !== undefined)
return decompactedSettings;
// NOTE: Everything below is for backwards compatibility only
const skipTopLevelEntry = (_a = obsidian.parseFrontMatterEntry(frontmatter, 'number-headings-skip-top-level')) !== null && _a !== void 0 ? _a : obsidian.parseFrontMatterEntry(frontmatter, 'header-numbering-skip-top-level');
const skipTopLevel = isValidFlag(skipTopLevelEntry) ? skipTopLevelEntry : alternativeSettings.skipTopLevel;
const maxLevelEntry = (_b = obsidian.parseFrontMatterEntry(frontmatter, 'number-headings-max-level')) !== null && _b !== void 0 ? _b : obsidian.parseFrontMatterEntry(frontmatter, 'header-numbering-max-level');
const maxLevel = isValidFirstOrMaxLevel(maxLevelEntry) ? maxLevelEntry : alternativeSettings.maxLevel;
const styleLevel1Entry = String((_c = obsidian.parseFrontMatterEntry(frontmatter, 'number-headings-style-level-1')) !== null && _c !== void 0 ? _c : obsidian.parseFrontMatterEntry(frontmatter, 'header-numbering-style-level-1'));
const styleLevel1 = isValidNumberingStyleString(styleLevel1Entry) ? styleLevel1Entry : alternativeSettings.styleLevel1;
const styleLevelOtherEntry = String((_d = obsidian.parseFrontMatterEntry(frontmatter, 'number-headings-style-level-other')) !== null && _d !== void 0 ? _d : obsidian.parseFrontMatterEntry(frontmatter, 'header-numbering-style-level-other'));
const styleLevelOther = isValidNumberingStyleString(styleLevelOtherEntry) ? styleLevelOtherEntry : alternativeSettings.styleLevelOther;
const autoEntry = (_e = obsidian.parseFrontMatterEntry(frontmatter, 'number-headings-auto')) !== null && _e !== void 0 ? _e : obsidian.parseFrontMatterEntry(frontmatter, 'header-numbering-auto');
const auto = isValidFlag(autoEntry) ? autoEntry : alternativeSettings.auto;
return Object.assign(Object.assign({}, alternativeSettings), { skipTopLevel, maxLevel, styleLevel1, styleLevelOther, auto });
}
else {
return alternativeSettings;
}
};
function settingsToCompactFrontMatterValue(settings) {
const autoPart = settings.auto ? 'auto, ' : '';
const firstLevelPart = `first-level ${settings.firstLevel}, `;
const maxPart = `max ${settings.maxLevel}, `;
const contentsPart = settings.contents && settings.contents.length > 0 ? `contents ${settings.contents}, ` : '';
const skipTopLevelString = settings.skipTopLevel ? '_.' : '';
const stylePart = `${skipTopLevelString}${settings.styleLevel1}.${settings.styleLevelOther}${settings.separator}`;
const startAtPart = settings.startAt !== '' ? `start-at ${settings.startAt}, ` : '';
return autoPart + firstLevelPart + maxPart + contentsPart + startAtPart + stylePart;
}
const saveSettingsToFrontMatter = (fileManager, file, settings) => {
fileManager.processFrontMatter(file, frontmatter => {
const v = settingsToCompactFrontMatterValue(settings);
frontmatter['number headings'] = v;
});
};
class NumberingDoneModal extends obsidian.Modal {
constructor(app, config) {
super(app);
this.config = config;
}
onOpen() {
const { contentEl, titleEl } = this;
titleEl.setText('Number Headings - Successfully Completed');
contentEl.createEl('div', { text: this.config.message });
contentEl.createEl('pre', { text: this.config.preformattedMessage });
contentEl.createEl('div', { text: "Do you want to save these settings in the document's front matter?", cls: 'number-headings-question' });
const containerForButtons = contentEl.createEl('div', { cls: 'number-headings-button-container' });
const noButton = containerForButtons.createEl('button', {});
noButton.setText('No');
noButton.onClickEvent((ev) => {
this.close();
return ev;
});
const yesButton = containerForButtons.createEl('button', {});
yesButton.setText('Yes, save settings in document');
yesButton.onClickEvent((ev) => {
this.config.saveSettingsCallback(false);
this.close();
return ev;
});
const yesAndAutoButton = containerForButtons.createEl('button', {});
yesAndAutoButton.setText('Yes, save settings in document, and automatically number');
yesAndAutoButton.onClickEvent((ev) => {
this.config.saveSettingsCallback(true);
this.close();
return ev;
});
}
onClose() {
const { contentEl, titleEl } = this;
contentEl.empty();
titleEl.empty();
}
}
function showNumberingDoneMessage(app, settings) {
const saveSettingsCallback = (shouldAddAutoFlag) => {
const tweakedSettings = Object.assign({}, settings);
if (shouldAddAutoFlag)
tweakedSettings.auto = true;
const file = app.workspace.getActiveFile();
if (file) {
saveSettingsToFrontMatter(app.fileManager, file, tweakedSettings);
}
};
const config = {
message: `Successfully updated all heading numbers in the document, using the settings below.
See settings panel to change how headings are numbered, or use front matter
(see settings panel).`,
preformattedMessage: `Skip top heading level: ${settings.skipTopLevel}
First heading level: ${settings.firstLevel}
Start numbering first heading at: ${settings.startAt}
Maximum heading level: ${settings.maxLevel}
Style for level 1 headings: ${settings.styleLevel1}
Style for lower level headings (below level 1): ${settings.styleLevelOther}
Separator: ${settings.separator}
Table of Contents Anchor: ${settings.contents}`,
saveSettingsCallback
};
const leaf = app.workspace.activeLeaf;
if (leaf) {
new NumberingDoneModal(app, config).open();
}
}
const TOC_LIST_ITEM_BULLET = '-';
function makeHeadingHashString(editor, heading) {
const regex = /^\s{0,4}#+/g;
const headingLineString = editor.getLine(heading.position.start.line);
if (!headingLineString)
return undefined;
const matches = headingLineString.match(regex);
if (!matches)
return undefined;
if (matches.length !== 1) {
// eslint-disable-next-line no-console
console.log("Unexpected heading format: '" + headingLineString + "'");
return undefined;
}
const match = matches[0];
return match.trimLeft();
}
function findHeadingPrefixRange(editor, heading, flags) {
const lineNumber = heading.position.start.line;
const lineText = editor.getLine(lineNumber);
return findRangeInHeaderString(lineText, lineNumber, flags);
}
function cleanHeadingTextForToc(htext) {
if (htext.contains('^')) {
const x = htext.split('^');
if (x.length > 1) {
return x[0].trim();
}
}
return htext.trim();
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function createTocEntry(h, settings, initialHeadingLevel) {
const text = h.heading;
const cleanText = cleanHeadingTextForToc(text);
let bulletIndent = '';
const startLevel = initialHeadingLevel;
for (let i = startLevel; i < h.level; i++) {
bulletIndent += '\t';
}
const entryLink = `[[#${text}|${cleanText}]]`;
return bulletIndent + TOC_LIST_ITEM_BULLET + ' ' + entryLink;
}
// Replace a range, but only if there is a change in text, to prevent poluting the undo stack
function replaceRangeEconomically(editor, changes, range, text) {
const previousText = editor.getRange(range.from, range.to);
if (previousText !== text) {
changes.push({
text: text,
from: range.from,
to: range.to
});
}
}
const updateHeadingNumbering = (viewInfo, settings) => {
var _a;
if (!viewInfo)
return;
const headings = (_a = viewInfo.data.headings) !== null && _a !== void 0 ? _a : [];
const editor = viewInfo.editor;
const supportFlags = createSupportFlagsFromSettings(settings.styleLevel1, settings.styleLevelOther);
let previousLevel = 1;
let numberingStack = [startAtOrZerothInStyle(settings.startAt, settings.styleLevel1)];
if (settings.firstLevel > 1) {
previousLevel = settings.firstLevel;
}
else if (settings.skipTopLevel) {
previousLevel = 2;
}
const changes = [];
for (const heading of headings) {
// Update the numbering stack based on the level and previous level
const level = heading.level;
// Handle skipped & ignored levels.
if ((settings.firstLevel > level) || (settings.skipTopLevel && level === 1)) {
// Resets the numbering when a level is skipped.
// Note: This leaves headings as they are, allowing people to have numbers at the start of
// ignored headings.
numberingStack = [startAtOrZerothInStyle(settings.startAt, settings.styleLevel1)];
if (settings.firstLevel > 1) {
previousLevel = settings.firstLevel;
}
else if (settings.skipTopLevel) {
previousLevel = 2;
}
continue;
}
// Adjust numbering stack
if (level === previousLevel) {
const x = numberingStack.pop();
if (x !== undefined) {
numberingStack.push(nextNumberingToken(x));
}
}
else if (level < previousLevel) {
for (let i = previousLevel; i > level; i--) {
numberingStack.pop();
}
const x = numberingStack.pop();
if (x !== undefined) {
numberingStack.push(nextNumberingToken(x));
}
}
else if (level > previousLevel) {
for (let i = previousLevel; i < level; i++) {
numberingStack.push(firstNumberingTokenInStyle(settings.styleLevelOther));
}
}
// Set the previous level to this level for the next iteration
previousLevel = level;
if (level > settings.maxLevel) {
// If we are above the max level, just don't number it
continue;
}
// Find the range to replace, and then do it
const prefixRange = findHeadingPrefixRange(editor, heading, supportFlags);
if (prefixRange === undefined)
return;
const headingHashString = makeHeadingHashString(editor, heading);
if (headingHashString === undefined)
return;
const prefixString = makeNumberingString(numberingStack);
replaceRangeEconomically(editor, changes, prefixRange, headingHashString + prefixString + settings.separator + ' ');
}
// Execute the transaction to make all the changes at once
if (changes.length > 0) {
// eslint-disable-next-line no-console
console.log('Number Headings Plugin: Applying headings numbering changes:', changes.length);
editor.transaction({
changes: changes
});
}
};
const updateTableOfContents = (viewInfo, settings) => {
var _a;
if (!viewInfo)
return;
const headings = (_a = viewInfo.data.headings) !== null && _a !== void 0 ? _a : [];
const editor = viewInfo.editor;
if (!doesContentsHaveValue(settings.contents))
return;
let tocHeading;
let tocBuilder = '\n';
const changes = [];
// In case headings start above level 1, we don't want to indent the bullets too much
let initialHeadingLevel = 1;
if (headings.length > 0) {
initialHeadingLevel = headings[0].level;
}
for (const heading of headings) {
// ORDERING: Important to find the TOC heading before skipping skipped headings, since that is for numbering
// Find the TOC heading
if (heading.heading.endsWith(settings.contents)) {
tocHeading = heading;
}
/* This code lets us skip TOC lines for skipped headings, but doesn't work well with first-level setting
if ((settings.skipTopLevel && heading.level === 1) || (heading.level > settings.maxLevel)) {
continue
}
*/
const tocEntry = createTocEntry(heading, settings, initialHeadingLevel);
tocBuilder += tocEntry + '\n';
}
// Insert the generated table of contents
if (tocHeading) {
const from = {
line: tocHeading.position.start.line + 1,
ch: 0
};
// Find the end of the TOC section
const startingLine = tocHeading.position.start.line + 1;
let endingLine = startingLine;
let foundList = false;
const lastLineInEditor = editor.lastLine();
for (;; endingLine++) {
const line = editor.getLine(endingLine);
if (line === undefined || endingLine > lastLineInEditor) {
// Reached end of file, insert at the start of the TOC section
endingLine = startingLine;
break;
}
const trimmedLineText = line.trimStart();
if (foundList) {
if (!trimmedLineText.startsWith(TOC_LIST_ITEM_BULLET))
break;
if (trimmedLineText.startsWith('#'))
break;
}
else {
if (trimmedLineText.startsWith(TOC_LIST_ITEM_BULLET)) {
foundList = true;
}
else if (trimmedLineText.startsWith('#')) {
// Reached the next heading without finding existing TOC list, insert at the start of the TOC section
endingLine = startingLine;
break;
}
else {
continue;
}
}
}
if (tocBuilder === '\n') {
tocBuilder = '';
}
const to = {
line: endingLine,
ch: 0
};
const range = { from, to };
replaceRangeEconomically(editor, changes, range, tocBuilder);
}
// Execute the transaction to make all the changes at once
if (changes.length > 0) {
// eslint-disable-next-line no-console
console.log('Number Headings Plugin: Applying table of contents changes:', changes.length);
editor.transaction({
changes: changes
});
}
};
const removeHeadingNumbering = (viewInfo) => {
var _a;
if (!viewInfo)
return;
const headings = (_a = viewInfo.data.headings) !== null && _a !== void 0 ? _a : [];
const editor = viewInfo.editor;
const changes = [];
for (const heading of headings) {
const prefixRange = findHeadingPrefixRange(editor, heading, { alphabet: true, roman: true });
if (prefixRange === undefined)
return;
const headingHashString = makeHeadingHashString(editor, heading);
if (headingHashString === undefined)
return;
replaceRangeEconomically(editor, changes, prefixRange, headingHashString + ' ');
}
if (changes.length > 0) {
editor.transaction({
changes: changes
});
}
};
class NumberHeadingsPluginSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl('h2', { text: 'Number Headings - Settings' });
containerEl.createEl('div', { text: 'To add numbering to your document, bring up the command window (on Mac, type CMD+P), and then type "Number Headings" to see a list of available commands.' });
containerEl.createEl('br', {});
containerEl.createEl('div', { text: 'If the document has front matter defined with the below settings, the project-wide settings defined on this screen will be ignored. You can define front matter like this:' });
containerEl.createEl('pre', {
text: ` ---
alias:
- Example Alias
tags:
- example-tag
number headings: first-level 1, start-at 2, max 6, 1.1, auto, contents ^toc
---`
});
containerEl.createEl('div', {
text: `
The 'number headings' front matter key is used to store numbering settings specific to the file. There are four possible options
in the value to the right of the colon, separated by commas.
`
});
const ul = containerEl.createEl('ul', {});
const li0 = ul.createEl('li', {});
li0.createEl('b', { text: 'Automatic numbering' });
li0.createEl('span', { text: ': If \'auto\' appears, the document will be automatically numbered.' });
const li1 = ul.createEl('li', {});
li1.createEl('b', { text: 'First level to number' });
li1.createEl('span', { text: ': If \'first-level 2\' appears, the numbering will start at the second level' });
const li2 = ul.createEl('li', {});
li2.createEl('b', { text: 'Start numbering first heading at' });
li2.createEl('span', { text: ': If \'start-at C\' appears, the numbering of the first level will start at C, instead of A' });
const li3 = ul.createEl('li', {});
li3.createEl('b', { text: 'Maximum level to number' });
li3.createEl('span', { text: ': If \'max 6\' appears, the headings above level 6 will be skipped.' });
const li4 = ul.createEl('li', {});
li4.createEl('b', { text: 'Table of contents anchor' });
li4.createEl('span', { text: ': If \'contents ^toc\' appears, the heading that ends with the anchor ^toc will have a table of contents inserted beneath it.' });
const li5 = ul.createEl('li', {});
li5.createEl('b', { text: 'Numbering style' });
li5.createEl('span', {
text: `:
A style text like '1.1', 'A.1', or '_.1.1' tells the plugin how to format the headings.
If a style string ends with '.' (a dot), ':' (a colon), '-' (a dash), '—' (an emdash), or ')' (a right parenthesis), the heading numbers will be separated from the heading title
with that symbol.`
});
const ul3 = li5.createEl('ul', {});
ul3.createEl('li', {
text: `
For example, '1.1' means both top level and other headings will be numbered starting from '1'.
`
});
ul3.createEl('li', {
text: `
For example, 'A.1' means top level headings will be numbered starting from 'A'.
`
});
ul3.createEl('li', {
text: `
For example, '_.A.1' means top level headings will NOT be numbered, but the next levels will be numbered with letters and numbers.
`
});
ul3.createEl('li', {
text: `
For example, '1.1:' means headings will look like '## 2.4: Example Heading'
`
});
ul3.createEl('li', {
text: `
For example, 'A.1-' means headings will look like '## B.5- Example Heading'
`
});
ul3.createEl('li', {
text: `
For example, 'I.A —' means headings will look like '## IV.A — Example Heading' (with Roman numerals)
`
});
new obsidian.Setting(containerEl)
.setName('Skip top heading level')
.setDesc('If selected, numbering will not be applied to the top heading level.')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.skipTopLevel)
.setTooltip('Skip top heading level')
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.skipTopLevel = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('First heading level')
.setDesc('First heading level to number.')
.addSlider(slider => slider
.setLimits(1, 6, 1)
.setValue(this.plugin.settings.firstLevel)
.setDynamicTooltip()
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.firstLevel = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Start numbering at')
.setDesc('Start numbering the first heading level from this value.')
.addText(text => text
.setValue(this.plugin.settings.startAt)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.startAt = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Maximum heading level')
.setDesc('Maximum heading level to number.')
.addSlider(slider => slider
.setLimits(1, 6, 1)
.setValue(this.plugin.settings.maxLevel)
.setDynamicTooltip()
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.maxLevel = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Style for level 1 headings')
.setDesc('Defines the numbering style for level one headings. Valid values are 1 (for numbers) or A (for capital letters) or I (for Roman numerals).')
.addText(text => text
.setValue(this.plugin.settings.styleLevel1)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.styleLevel1 = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Style for lower level headings (below level 1)')
.setDesc('Defines the numbering style for headings below level one. Valid values are 1 (for numbers) or A (for capital letters) or I (for Roman numerals).')
.addText(text => text
.setValue(this.plugin.settings.styleLevelOther)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.styleLevelOther = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Automatic numbering')
.setDesc('Turns on automatic numbering of documents.')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.auto)
.setTooltip('Turn on automatic numbering')
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.auto = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Separator style')
.setDesc('Defines the separator style between the heading number and the heading text. Valid values are : (colon) or . (dot) or - (dash) or — (emdash) or ) (a right parenthesis). You can also leave it blank for no separator, or have a space before the separator.')
.addText(text => text
.setValue(this.plugin.settings.separator)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.separator = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Table of Contents Anchor')
.setDesc('Anchor which labels the header where a table of contents should be inserted. The anchor should be added at the end of a header. For example, ^toc.')
.addText(text => text
.setValue(this.plugin.settings.contents)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.contents = value;
yield this.plugin.saveSettings();
})));
}
}
class NumberHeadingsPlugin extends obsidian.Plugin {
onload() {
return __awaiter(this, void 0, void 0, function* () {
// eslint-disable-next-line no-console
console.info('Loading Number Headings Plugin, version ' + this.manifest.version);
yield this.loadSettings();
this.addCommand({
id: 'number-headings-with-options',
name: 'Number all headings in document (and show options)',
checkCallback: (checking) => {
if (checking)
return isViewActive(this.app);
const viewInfo = getViewInfo(this.app);
if (viewInfo) {
const settings = getFrontMatterSettingsOrAlternative(viewInfo.data, this.settings);
updateHeadingNumbering(viewInfo, settings);
setTimeout(() => {
// HACK: This must happen after a timeout so that there is time for the editor transaction to complete
const postNumberingViewInfo = getViewInfo(this.app);
updateTableOfContents(postNumberingViewInfo, settings);
}, 3000);
showNumberingDoneMessage(this.app, settings);
}
return false;
}
});
this.addCommand({
id: 'number-headings',
name: 'Number all headings in document',
checkCallback: (checking) => {
if (checking)
return isViewActive(this.app);
const viewInfo = getViewInfo(this.app);
if (viewInfo) {
const settings = getFrontMatterSettingsOrAlternative(viewInfo.data, this.settings);
updateHeadingNumbering(viewInfo, settings);
setTimeout(() => {
// HACK: This must happen after a timeout so that there is time for the editor transaction to complete
const postNumberingViewInfo = getViewInfo(this.app);
updateTableOfContents(postNumberingViewInfo, settings);
}, 3000);
// NOTE: The line below is intentionally commented out, since this command is the same as
// the above command, except for this line
// showNumberingDoneMessage(this.app, settings, viewInfo)
}
return false;
}
});
this.addCommand({
id: 'remove-number-headings',
name: 'Remove numbering from all headings in document',
checkCallback: (checking) => {
if (checking)
return isViewActive(this.app);
const viewInfo = getViewInfo(this.app);
removeHeadingNumbering(viewInfo);
return true;
}
});
this.addCommand({
id: 'save-settings-to-front-matter',
name: 'Save settings to front matter',
checkCallback: (checking) => {
if (checking)
return isViewActive(this.app);
const viewInfo = getViewInfo(this.app);
const file = this.app.workspace.getActiveFile();
if (viewInfo && file) {
const settings = getFrontMatterSettingsOrAlternative(viewInfo.data, this.settings);
saveSettingsToFrontMatter(this.app.fileManager, file, settings);
}
return false;
}
});
this.addSettingTab(new NumberHeadingsPluginSettingTab(this.app, this));
this.registerInterval(window.setInterval(() => {
const viewInfo = getViewInfo(this.app);
if (viewInfo) {
const settings = getFrontMatterSettingsOrAlternative(viewInfo.data, this.settings);
if (settings.auto) {
updateHeadingNumbering(viewInfo, settings);
setTimeout(() => {
// HACK: This must happen after a timeout so that there is time for the editor transaction to complete
const postNumberingViewInfo = getViewInfo(this.app);
updateTableOfContents(postNumberingViewInfo, settings);
}, 3000);
// eslint-disable-next-line no-console
console.log('Number Headings Plugin: Automatically numbered document');
}
}
}, 10 * 1000));
});
}
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
});
}
}
module.exports = NumberHeadingsPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9hY3RpdmVWaWV3SGVscGVycy50cyIsIm5vZGVfbW9kdWxlcy9yb21hbnMvcm9tYW5zLmpzIiwic3JjL251bWJlcmluZ1Rva2Vucy50cyIsInNyYy9zZXR0aW5nc1R5cGVzLnRzIiwic3JjL3RleHRQcm9jZXNzaW5nLnRzIiwic3JjL2Zyb250TWF0dGVyLnRzIiwic3JjL21lc3NhZ2VzLnRzIiwic3JjL251bWJlcmluZy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XHJcbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xyXG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcclxuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XHJcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcclxuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XHJcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgZG9uZSA9IHRydWU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xyXG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XHJcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XHJcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XHJcbiAgICAgICAgdmFyIGRpc3Bvc2U7XHJcbiAgICAgICAgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xyXG4gICAgZnVuY3Rpb24gZmFpbChlKSB7XHJcbiAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xyXG4gICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xyXG4gICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbn07XHJcbiIsImltcG9ydCB7IEFwcCwgQ2FjaGVkTWV0YWRhdGEsIEVkaXRvciwgTWFya2Rvd25WaWV3IH0gZnJvbSAnb2JzaWRpYW4nXG5cbmZ1bmN0aW9uIGdldEFjdGl2ZVZpZXcgKGFwcDogQXBwKTogTWFya2Rvd25WaWV3IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWN0aXZlVmlldyA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXG4gIHJldHVybiBhY3RpdmVWaWV3ID8/IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWV3QWN0aXZlIChhcHA6IEFwcCk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmVWaWV3ID0gZ2V0QWN0aXZlVmlldyhhcHApXG4gIGlmIChhY3RpdmVWaWV3ICYmIGFjdGl2ZVZpZXcuZmlsZSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGdldFZpZXdNZXRhZGF0YSAoYXBwOiBBcHApOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZVZpZXcgPSBnZXRBY3RpdmVWaWV3KGFwcClcbiAgaWYgKGFjdGl2ZVZpZXcgJiYgYWN0aXZlVmlldy5maWxlKSB7XG4gICAgY29uc3QgZGF0YSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpbGVDYWNoZShhY3RpdmVWaWV3LmZpbGUpIHx8IHt9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlld0luZm8ge1xuICBhY3RpdmVWaWV3OiBNYXJrZG93blZpZXdcbiAgZGF0YTogQ2FjaGVkTWV0YWRhdGFcbiAgZWRpdG9yOiBFZGl0b3Jcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdJbmZvIChhcHA6IEFwcCk6IFZpZXdJbmZvIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYWN0aXZlVmlldyA9IGdldEFjdGl2ZVZpZXcoYXBwKVxuICBjb25zdCBkYXRhID0gZ2V0Vmlld01ldGFkYXRhKGFwcClcbiAgY29uc3QgZWRpdG9yID0gYWN0aXZlVmlldyA/IGFjdGl2ZVZpZXcuZWRpdG9yIDogdW5kZWZpbmVkXG5cbiAgaWYgKGFjdGl2ZVZpZXcgJiYgZGF0YSAmJiBlZGl0b3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlVmlldywgZGF0YSwgZWRpdG9yXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIiwiY29uc3Qgcm9tYW5fbWFwID0ge1xuICBNOiAxMDAwLFxuICBDTTogOTAwLFxuICBEOiA1MDAsXG4gIENEOiA0MDAsXG4gIEM6IDEwMCxcbiAgWEM6IDkwLFxuICBMOiA1MCxcbiAgWEw6IDQwLFxuICBYOiAxMCxcbiAgSVg6IDksXG4gIFY6IDUsXG4gIElWOiA0LFxuICBJOiAxXG59XG5cbmNvbnN0IGFsbENoYXJzID0gT2JqZWN0LmtleXMocm9tYW5fbWFwKVxuY29uc3QgYWxsTnVtZXJhbHMgPSBPYmplY3QudmFsdWVzKHJvbWFuX21hcClcbmNvbnN0IHJvbWFuUGF0dGVybiA9XG4gIC9eKE17MSw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WEx8TD9YezAsM30pKElYfElWfFY/SXswLDN9KXxNezAsNH0oQ018Qz9EfEQ/Q3sxLDN9KShYQ3xYTHxMP1h7MCwzfSkoSVh8SVZ8Vj9JezAsM30pfE17MCw0fShDTXxDRHxEP0N7MCwzfSkoWEN8WD9MfEw/WHsxLDN9KShJWHxJVnxWP0l7MCwzfSl8TXswLDR9KENNfENEfEQ/Q3swLDN9KShYQ3xYTHxMP1h7MCwzfSkoSVh8ST9WfFY/SXsxLDN9KSkkL1xuXG5jb25zdCByb21hbml6ZSA9IChkZWNpbWFsKSA9PiB7XG4gIGlmIChcbiAgICBkZWNpbWFsIDw9IDAgfHxcbiAgICB0eXBlb2YgZGVjaW1hbCAhPT0gJ251bWJlcicgfHxcbiAgICBNYXRoLmZsb29yKGRlY2ltYWwpICE9PSBkZWNpbWFsXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMgYW4gdW5zaWduZWQgaW50ZWdlcicpXG4gIH1cbiAgaWYgKGRlY2ltYWwgPj0gNDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMgbWF4IHZhbHVlIG9mIGxlc3MgdGhhbiAzOTk5IG9yIGxlc3MnKVxuICB9XG4gIGxldCByb21hbiA9ICcnXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICB3aGlsZSAoZGVjaW1hbCA+PSBhbGxOdW1lcmFsc1tpXSkge1xuICAgICAgZGVjaW1hbCAtPSBhbGxOdW1lcmFsc1tpXVxuICAgICAgcm9tYW4gKz0gYWxsQ2hhcnNbaV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJvbWFuXG59XG5cbmNvbnN0IGRlcm9tYW5pemUgPSAocm9tYW5TdHIpID0+IHtcbiAgaWYgKHR5cGVvZiByb21hblN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGEgc3RyaW5nJylcbiAgfVxuICBpZiAoIXJvbWFuUGF0dGVybi50ZXN0KHJvbWFuU3RyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMgdmFsaWQgcm9tYW4gbnVtZXJhbCBzdHJpbmcnKVxuICB9XG4gIGxldCByb21hblN0cmluZyA9IHJvbWFuU3RyLnRvVXBwZXJDYXNlKClcbiAgbGV0IGFyYWJpYyA9IDBcbiAgbGV0IGl0ZXJhdGlvbiA9IHJvbWFuU3RyaW5nLmxlbmd0aFxuICB3aGlsZSAoaXRlcmF0aW9uLS0pIHtcbiAgICBsZXQgY3VtdWxhdGl2ZSA9IHJvbWFuX21hcFtyb21hblN0cmluZ1tpdGVyYXRpb25dXVxuICAgIGlmIChjdW11bGF0aXZlIDwgcm9tYW5fbWFwW3JvbWFuU3RyaW5nW2l0ZXJhdGlvbiArIDFdXSkge1xuICAgICAgYXJhYmljIC09IGN1bXVsYXRpdmVcbiAgICB9IGVsc2Uge1xuICAgICAgYXJhYmljICs9IGN1bXVsYXRpdmVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFyYWJpY1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVyb21hbml6ZSxcbiAgcm9tYW5pemUsXG4gIGFsbENoYXJzLFxuICBhbGxOdW1lcmFsc1xufVxuIiwiaW1wb3J0IHsgZGVyb21hbml6ZSwgcm9tYW5pemUgfSBmcm9tICdyb21hbnMnXG5cbmV4cG9ydCB0eXBlIE51bWJlcmluZ1Rva2VuID0gTnVtYmVyaW5nVG9rZW5BcmFiaWMgfCBOdW1iZXJpbmdUb2tlbkFscGhhYmV0IHwgTnVtYmVyaW5nVG9rZW5Sb21hblxuZXhwb3J0IHR5cGUgTnVtYmVyaW5nVG9rZW5BcmFiaWMgPSB7XG4gIHN0eWxlOiAnMSdcbiAgdmFsdWU6IG51bWJlclxufVxuZXhwb3J0IHR5cGUgTnVtYmVyaW5nVG9rZW5BbHBoYWJldCA9IHtcbiAgc3R5bGU6ICdBJ1xuICB2YWx1ZTogc3RyaW5nXG59XG5leHBvcnQgdHlwZSBOdW1iZXJpbmdUb2tlblJvbWFuID0ge1xuICBzdHlsZTogJ0knXG4gIHZhbHVlOiBzdHJpbmdcbn1cbmV4cG9ydCB0eXBlIE51bWJlcmluZ1N0eWxlID0gJzEnIHwgJ0EnIHwgJ0knXG5leHBvcnQgdHlwZSBOdW1iZXJpbmdWYWx1ZSA9IG51bWJlciB8IHN0cmluZ1xuXG4vLyBWYWxpZGF0ZXMgdGhlIHN0cmluZyB1c2luZyBhIHJlZ2V4IHRvIGVuc3VyZSBpcyBpcyBhIHZhbGlkIGFyYWJpYyBudW1iZXJpbmcgdmFsdWVcbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQXJhYmljTnVtYmVyaW5nVmFsdWVTdHJpbmcgKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWdleCA9IC9eWzAtOV0rJC9cbiAgcmV0dXJuIHJlZ2V4LnRlc3Qocylcbn1cblxuLy8gVmFsaWRhdGVzIHRoZSBzdHJpbmcgdXNpbmcgYSByZWdleCB0byBlbnN1cmUgaXMgaXMgYSB2YWxpZCBhbHBoYWJldCBudW1iZXJpbmcgdmFsdWVcbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQWxwaGFiZXROdW1iZXJpbmdWYWx1ZVN0cmluZyAoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlZ2V4ID0gL15bQS1aXSQvXG4gIHJldHVybiByZWdleC50ZXN0KHMpXG59XG5cbi8vIFZhbGlkYXRlcyB0aGUgc3RyaW5nIHVzaW5nIGEgcmVnZXggdG8gZW5zdXJlIGlzIGlzIGEgdmFsaWQgcm9tYW4gbnVtYmVyaW5nIHZhbHVlXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJvbWFuTnVtYmVyaW5nVmFsdWVTdHJpbmcgKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWdleCA9IC9eWzBJVlhMQ0RNXSskLyAvLyBUaGlzIGluY2x1ZGVzIHplcm8gZm9yIHplcm90aCB0ZXN0aW5nXG4gIHJldHVybiByZWdleC50ZXN0KHMpXG59XG5cbmZ1bmN0aW9uIHByaW50YWJsZU51bWJlcmluZ1Rva2VuICh0OiBOdW1iZXJpbmdUb2tlbik6IHN0cmluZyB7XG4gIHN3aXRjaCAodC5zdHlsZSkge1xuICAgIGNhc2UgJzEnOlxuICAgICAgcmV0dXJuIHQudmFsdWUudG9TdHJpbmcoKVxuICAgIGNhc2UgJ0EnOlxuICAgICAgcmV0dXJuIHQudmFsdWVcbiAgICBjYXNlICdJJzpcbiAgICAgIHJldHVybiB0LnZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm90aE51bWJlcmluZ1Rva2VuSW5TdHlsZSAoc3R5bGU6IE51bWJlcmluZ1N0eWxlKTogTnVtYmVyaW5nVG9rZW4ge1xuICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgY2FzZSAnMSc6XG4gICAgICByZXR1cm4geyBzdHlsZTogJzEnLCB2YWx1ZTogMCB9XG4gICAgY2FzZSAnQSc6XG4gICAgICByZXR1cm4geyBzdHlsZTogJ0EnLCB2YWx1ZTogJ1onIH1cbiAgICBjYXNlICdJJzpcbiAgICAgIHJldHVybiB7IHN0eWxlOiAnSScsIHZhbHVlOiAnMCcgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdE51bWJlcmluZ1Rva2VuSW5TdHlsZSAoc3R5bGU6IE51bWJlcmluZ1N0eWxlKTogTnVtYmVyaW5nVG9rZW4ge1xuICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgY2FzZSAnMSc6XG4gICAgICByZXR1cm4geyBzdHlsZTogJzEnLCB2YWx1ZTogMSB9XG4gICAgY2FzZSAnQSc6XG4gICAgICByZXR1cm4geyBzdHlsZTogJ0EnLCB2YWx1ZTogJ0EnIH1cbiAgICBjYXNlICdJJzpcbiAgICAgIHJldHVybiB7IHN0eWxlOiAnSScsIHZhbHVlOiAnSScgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0TnVtYmVyaW5nVG9rZW4gKHQ6IE51bWJlcmluZ1Rva2VuKTogTnVtYmVyaW5nVG9rZW4ge1xuICBzd2l0Y2ggKHQuc3R5bGUpIHtcbiAgICBjYXNlICcxJzpcbiAgICAgIHJldHVybiB7IHN0eWxlOiAnMScsIHZhbHVlOiB0LnZhbHVlICsgMSB9XG4gICAgY2FzZSAnQSc6XG4gICAgICBpZiAodC52YWx1ZSA9PT0gJ1onKSByZXR1cm4geyBzdHlsZTogJ0EnLCB2YWx1ZTogJ0EnIH1cbiAgICAgIGVsc2UgcmV0dXJuIHsgc3R5bGU6ICdBJywgdmFsdWU6IFN0cmluZy5mcm9tQ2hhckNvZGUodC52YWx1ZS5jaGFyQ29kZUF0KDApICsgMSkgfVxuICAgIGNhc2UgJ0knOlxuICAgICAgaWYgKHQudmFsdWUgPT09ICcwJykgcmV0dXJuIHsgc3R5bGU6ICdJJywgdmFsdWU6ICdJJyB9XG4gICAgICBlbHNlIHJldHVybiB7IHN0eWxlOiAnSScsIHZhbHVlOiByb21hbml6ZShkZXJvbWFuaXplKHQudmFsdWUpICsgMSkgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV2aW91c051bWJlcmluZ1Rva2VuICh0OiBOdW1iZXJpbmdUb2tlbik6IE51bWJlcmluZ1Rva2VuIHtcbiAgc3dpdGNoICh0LnN0eWxlKSB7XG4gICAgY2FzZSAnMSc6XG4gICAgICByZXR1cm4geyBzdHlsZTogJzEnLCB2YWx1ZTogdC52YWx1ZSAtIDEgfVxuICAgIGNhc2UgJ0EnOlxuICAgICAgaWYgKHQudmFsdWUgPT09ICdBJykgcmV0dXJuIHsgc3R5bGU6ICdBJywgdmFsdWU6ICdaJyB9XG4gICAgICBlbHNlIHJldHVybiB7IHN0eWxlOiAnQScsIHZhbHVlOiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQudmFsdWUuY2hhckNvZGVBdCgwKSAtIDEpIH1cbiAgICBjYXNlICdJJzpcbiAgICAgIGlmICh0LnZhbHVlID09PSAnSScpIHJldHVybiB7IHN0eWxlOiAnSScsIHZhbHVlOiAnMCcgfVxuICAgICAgZWxzZSByZXR1cm4geyBzdHlsZTogJ0knLCB2YWx1ZTogcm9tYW5pemUoZGVyb21hbml6ZSh0LnZhbHVlKSAtIDEpIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZU51bWJlcmluZ1N0cmluZyAobnVtYmVyaW5nU3RhY2s6IE51bWJlcmluZ1Rva2VuW10pOiBzdHJpbmcge1xuICBsZXQgbnVtYmVyaW5nU3RyaW5nID0gJydcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcmluZ1N0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIG51bWJlcmluZ1N0cmluZyArPSAnICdcbiAgICB9IGVsc2Uge1xuICAgICAgbnVtYmVyaW5nU3RyaW5nICs9ICcuJ1xuICAgIH1cbiAgICBudW1iZXJpbmdTdHJpbmcgKz0gcHJpbnRhYmxlTnVtYmVyaW5nVG9rZW4obnVtYmVyaW5nU3RhY2tbaV0pXG4gIH1cblxuICByZXR1cm4gbnVtYmVyaW5nU3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEF0T3JaZXJvdGhJblN0eWxlIChzdGFydEF0U2V0dGluZ1N0cmluZzogc3RyaW5nLCBzdHlsZSA6IE51bWJlcmluZ1N0eWxlKTogTnVtYmVyaW5nVG9rZW4ge1xuICBpZiAoc3RhcnRBdFNldHRpbmdTdHJpbmcgPT09ICcnKSByZXR1cm4gemVyb3RoTnVtYmVyaW5nVG9rZW5JblN0eWxlKHN0eWxlKVxuXG4gIGxldCBmaXJzdE51bWJlcmluZ1Rva2VuRnJvbVNldHRpbmc6IE51bWJlcmluZ1Rva2VuXG5cbiAgc3dpdGNoIChzdHlsZSkge1xuICAgIGNhc2UgJzEnOlxuICAgICAgaWYgKCFpc1ZhbGlkQXJhYmljTnVtYmVyaW5nVmFsdWVTdHJpbmcoc3RhcnRBdFNldHRpbmdTdHJpbmcpKSByZXR1cm4gemVyb3RoTnVtYmVyaW5nVG9rZW5JblN0eWxlKHN0eWxlKVxuXG4gICAgICBmaXJzdE51bWJlcmluZ1Rva2VuRnJvbVNldHRpbmcgPSB7IHN0eWxlOiAnMScsIHZhbHVlOiBwYXJzZUludChzdGFydEF0U2V0dGluZ1N0cmluZykgfVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdBJzpcbiAgICAgIGlmICghaXNWYWxpZEFscGhhYmV0TnVtYmVyaW5nVmFsdWVTdHJpbmcoc3RhcnRBdFNldHRpbmdTdHJpbmcpKSByZXR1cm4gemVyb3RoTnVtYmVyaW5nVG9rZW5JblN0eWxlKHN0eWxlKVxuXG4gICAgICBmaXJzdE51bWJlcmluZ1Rva2VuRnJvbVNldHRpbmcgPSB7IHN0eWxlOiAnQScsIHZhbHVlOiBzdGFydEF0U2V0dGluZ1N0cmluZyB9XG4gICAgICBicmVha1xuICAgIGNhc2UgJ0knOlxuICAgICAgaWYgKCFpc1ZhbGlkUm9tYW5OdW1iZXJpbmdWYWx1ZVN0cmluZyhzdGFydEF0U2V0dGluZ1N0cmluZykpIHJldHVybiB6ZXJvdGhOdW1iZXJpbmdUb2tlbkluU3R5bGUoc3R5bGUpXG4gICAgICBmaXJzdE51bWJlcmluZ1Rva2VuRnJvbVNldHRpbmcgPSB7IHN0eWxlOiAnSScsIHZhbHVlOiBzdGFydEF0U2V0dGluZ1N0cmluZyB9XG4gICAgICBicmVha1xuICB9XG5cbiAgLy8gQ29udmVydCB0aGUgZmlyc3QgbnVtYmVyaW5nIHRva2VuIHRvIGEgemVyb3RoIG51bWJlcmluZyB0b2tlblxuICByZXR1cm4gcHJldmlvdXNOdW1iZXJpbmdUb2tlbihmaXJzdE51bWJlcmluZ1Rva2VuRnJvbVNldHRpbmcpXG59XG4iLCJpbXBvcnQgeyBpc1ZhbGlkQWxwaGFiZXROdW1iZXJpbmdWYWx1ZVN0cmluZywgaXNWYWxpZEFyYWJpY051bWJlcmluZ1ZhbHVlU3RyaW5nLCBpc1ZhbGlkUm9tYW5OdW1iZXJpbmdWYWx1ZVN0cmluZywgTnVtYmVyaW5nU3R5bGUgfSBmcm9tICcuL251bWJlcmluZ1Rva2VucydcblxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdzIHtcbiAgc2tpcFRvcExldmVsOiBib29sZWFuLFxuICBmaXJzdExldmVsOiBudW1iZXIsXG4gIG1heExldmVsOiBudW1iZXIsXG4gIHN0eWxlTGV2ZWwxOiBOdW1iZXJpbmdTdHlsZSxcbiAgc3R5bGVMZXZlbE90aGVyOiBOdW1iZXJpbmdTdHlsZSxcbiAgYXV0bzogYm9vbGVhbixcbiAgc2VwYXJhdG9yOiBzdHJpbmcsXG4gIGNvbnRlbnRzOiBzdHJpbmcsXG4gIHN0YXJ0QXQ6IHN0cmluZyxcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFJlYWRvbmx5PE51bWJlckhlYWRpbmdzUGx1Z2luU2V0dGluZ3M+ID0ge1xuICBza2lwVG9wTGV2ZWw6IGZhbHNlLFxuICBmaXJzdExldmVsOiAxLFxuICBtYXhMZXZlbDogNixcbiAgc3R5bGVMZXZlbDE6ICcxJyxcbiAgc3R5bGVMZXZlbE90aGVyOiAnMScsXG4gIGF1dG86IGZhbHNlLFxuICBzZXBhcmF0b3I6ICcnLFxuICBjb250ZW50czogJycsXG4gIHN0YXJ0QXQ6ICcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTnVtYmVyaW5nU3R5bGVTdHJpbmcgKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocyA9PT0gJ0EnIHx8IHMgPT09ICcxJyB8fCBzID09PSAnSScpIHJldHVybiB0cnVlXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE51bWJlcmluZ1ZhbHVlU3RyaW5nIChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHMgPT09ICcnIHx8IGlzVmFsaWRBcmFiaWNOdW1iZXJpbmdWYWx1ZVN0cmluZyhzKSB8fCBpc1ZhbGlkQWxwaGFiZXROdW1iZXJpbmdWYWx1ZVN0cmluZyhzKSB8fCBpc1ZhbGlkUm9tYW5OdW1iZXJpbmdWYWx1ZVN0cmluZyhzKSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRmxhZyAoZjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoZiA9PT0gdHJ1ZSB8fCBmID09PSBmYWxzZSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRmlyc3RPck1heExldmVsICh4OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCA+PSAxICYmIHggPD0gNikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU2VwYXJhdG9yICh4OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiZcbiAgICAoXG4gICAgICB4ID09PSAnJyB8fFxuICAgICAgeCA9PT0gJzonIHx8IHggPT09ICcgOicgfHxcbiAgICAgIHggPT09ICcuJyB8fCB4ID09PSAnIC4nIHx8XG4gICAgICB4ID09PSAnLScgfHwgeCA9PT0gJyAtJyB8fFxuICAgICAgeCA9PT0gJ+KAlCcgfHwgeCA9PT0gJyDigJQnIHx8IC8qIGVtLWRhc2ggKi9cbiAgICAgIHggPT09ICcpJyB8fCB4ID09PSAnICknXG4gICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZENvbnRlbnRzICh4OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgeCA9PT0gJ3N0cmluZycgJiYgKHggPT09ICcnIHx8IHguc3RhcnRzV2l0aCgnXicpKSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGVudHNIYXZlVmFsdWUgKHg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoeC5sZW5ndGggPiAyICYmIHguc3RhcnRzV2l0aCgnXicpKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gZmFsc2Vcbn1cbiIsImltcG9ydCB7IEVkaXRvclJhbmdlIH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgeyBOdW1iZXJpbmdTdHlsZSB9IGZyb20gJy4vbnVtYmVyaW5nVG9rZW5zJ1xuaW1wb3J0IHsgaXNWYWxpZE51bWJlcmluZ1N0eWxlU3RyaW5nLCBpc1ZhbGlkU2VwYXJhdG9yLCBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdzIH0gZnJvbSAnLi9zZXR0aW5nc1R5cGVzJ1xuXG5leHBvcnQgdHlwZSBTdXBwb3J0RmxhZ3MgPSB7XG4gIGFscGhhYmV0OiBib29sZWFuLFxuICByb21hbjogYm9vbGVhbixcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1cHBvcnRGbGFnc0Zyb21TZXR0aW5ncyAoc3R5bGVMZXZlbDE6IHN0cmluZywgc3R5bGVMZXZlbE90aGVyOiBzdHJpbmcpOiBTdXBwb3J0RmxhZ3Mge1xuICByZXR1cm4ge1xuICAgIGFscGhhYmV0OiBzdHlsZUxldmVsMSA9PT0gJ0EnIHx8IHN0eWxlTGV2ZWxPdGhlciA9PT0gJ0EnLFxuICAgIHJvbWFuOiBzdHlsZUxldmVsMSA9PT0gJ0knIHx8IHN0eWxlTGV2ZWxPdGhlciA9PT0gJ0knXG4gIH1cbn1cblxuLy8gR2V0IHRoZSByZWdleCBmb3IgdGhlIGhlYWRlciBzdHJpbmcsIGJhc2VkIG9uIHRoZSBzdXBwb3J0IGZsYWdzLiBUaGUgZ2VuZXJhdGVkIHJlZ2V4IGlzIHVzZWQgdG8gZmluZCB0aGUgcmFuZ2Ugb2YgdGhlIGhlYWRlciBwcmVmaXguXG4vLyBUaGUgcmVnZXggaXMgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5LCBiZWNhdXNlIHRoZSByZWdleCBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBzdXBwb3J0IGZsYWdzLlxuZnVuY3Rpb24gZ2V0UmVnZXhGb3JIZWFkZXJTdHJpbmcgKGZsYWdzOiBTdXBwb3J0RmxhZ3MpOiBSZWdFeHAge1xuICBpZiAoZmxhZ3MuYWxwaGFiZXQgJiYgZmxhZ3Mucm9tYW4pIHtcbiAgICAvLyBSZWdleCB0byBtYXRjaCB0aGUgaGVhZGluZyBwcmVmaXgsIGluY2x1ZGluZyB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGhhc2goZXMpLCBidXQgbm90IHRoZSBoZWFkaW5nIHRleHRcbiAgICByZXR1cm4gL15cXHN7MCw0fSMrKCApPyhbMC05XStcXC58W0EtWl1cXC58W0lWWExDRE1dK1xcLikqKFswLTldK3xbQS1aXXxbSVZYTENETV0rKT8oICk/WynigJQ6Li1dPyggKSsvZ1xuICB9IGVsc2UgaWYgKCFmbGFncy5hbHBoYWJldCAmJiBmbGFncy5yb21hbikge1xuICAgIC8vIFJlZ2V4IHRvIG1hdGNoIHRoZSBoZWFkaW5nIHByZWZpeCwgaW5jbHVkaW5nIHRoZSBzcGFjZSBhZnRlciB0aGUgaGFzaChlcyksIGJ1dCBub3QgdGhlIGhlYWRpbmcgdGV4dFxuICAgIHJldHVybiAvXlxcc3swLDR9IysoICk/KFswLTldK1xcLnxbSVZYTENETV0rXFwuKSooWzAtOV0rfFtJVlhMQ0RNXSspPyggKT9bKeKAlDouLV0/KCApKy9nXG4gIH0gZWxzZSBpZiAoZmxhZ3MuYWxwaGFiZXQgJiYgIWZsYWdzLnJvbWFuKSB7XG4gICAgLy8gUmVnZXggdG8gbWF0Y2ggdGhlIGhlYWRpbmcgcHJlZml4LCBpbmNsdWRpbmcgdGhlIHNwYWNlIGFmdGVyIHRoZSBoYXNoKGVzKSwgYnV0IG5vdCB0aGUgaGVhZGluZyB0ZXh0XG4gICAgcmV0dXJuIC9eXFxzezAsNH0jKyggKT8oWzAtOV0rXFwufFtBLVpdXFwuKSooWzAtOV0rfFtBLVpdKT8oICk/WynigJQ6Li1dPyggKSsvZ1xuICB9IGVsc2UgaWYgKCFmbGFncy5hbHBoYWJldCAmJiAhZmxhZ3Mucm9tYW4pIHtcbiAgICAvLyBSZWdleCB0byBtYXRjaCB0aGUgaGVhZGluZyBwcmVmaXgsIGluY2x1ZGluZyB0aGUgc3BhY2UgYWZ0ZXIgdGhlIGhhc2goZXMpLCBidXQgbm90IHRoZSBoZWFkaW5nIHRleHRcbiAgICByZXR1cm4gL15cXHN7MCw0fSMrKCApPyhbMC05XStcXC4pKihbMC05XSspPyggKT9bKeKAlDouLV0/KCApKy9nXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29tYmluYXRpb24gb2Ygc3VwcG9ydCBmbGFncycpXG59XG5cbi8vIEZpbmQgdGhlIHJhbmdlIG9mIHRoZSBoZWFkaW5nIHByZWZpeCwgaW5jbHVkaW5nIHRoZSBzcGFjZSBhZnRlciBhbnkgbnVtYmVyaW5nLCBidXQgbm90IHRoZSBoZWFkaW5nIHRleHRcbmV4cG9ydCBmdW5jdGlvbiBmaW5kUmFuZ2VJbkhlYWRlclN0cmluZyAobGluZVRleHQ6IHN0cmluZywgbGluZU51bWJlcjogbnVtYmVyLCBmbGFnczogU3VwcG9ydEZsYWdzKTogRWRpdG9yUmFuZ2UgfCB1bmRlZmluZWQge1xuICBjb25zdCByZWdleCA9IGdldFJlZ2V4Rm9ySGVhZGVyU3RyaW5nKGZsYWdzKVxuXG4gIGlmICghbGluZVRleHQpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBtYXRjaGVzID0gbGluZVRleHQubWF0Y2gocmVnZXgpXG5cbiAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBoZWFkaW5nIGZvcm1hdDogJ1wiICsgbGluZVRleHQgKyBcIidcIilcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IG1hdGNoZXMgPyBtYXRjaGVzWzBdIDogJydcblxuICBjb25zdCBmcm9tID0ge1xuICAgIGxpbmU6IGxpbmVOdW1iZXIsXG4gICAgY2g6IDBcbiAgfVxuICBjb25zdCB0byA9IHtcbiAgICBsaW5lOiBsaW5lTnVtYmVyLFxuICAgIGNoOiBtYXRjaC5sZW5ndGhcbiAgfVxuXG4gIHJldHVybiB7IGZyb20sIHRvIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNldHRpbmdzRnJvbUZyb250TWF0dGVyRm9ybWF0UGFydCAocGFydDogc3RyaW5nLCBzZXR0aW5nczogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncyk6IE51bWJlckhlYWRpbmdzUGx1Z2luU2V0dGluZ3Mge1xuICAvLyBQYXJzZSB0aGUgc2VwYXJhdG9yXG4gIGxldCBwYXJ0V2l0aG91dFNlcGFyYXRvciA9IHBhcnRcbiAgY29uc3QgcG90ZW50aWFsVHdvQ2hhclNlcGFyYXRvciA9IHBhcnQuc2xpY2UoLTIpXG4gIGlmIChpc1ZhbGlkU2VwYXJhdG9yKHBvdGVudGlhbFR3b0NoYXJTZXBhcmF0b3IpKSB7XG4gICAgc2V0dGluZ3Muc2VwYXJhdG9yID0gcG90ZW50aWFsVHdvQ2hhclNlcGFyYXRvclxuICAgIHBhcnRXaXRob3V0U2VwYXJhdG9yID0gcGFydC5zbGljZSgwLCAtMilcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwb3RlbnRpYWxPbmVDaGFyU2VwYXJhdG9yID0gcGFydC5zbGljZSgtMSlcbiAgICBpZiAoaXNWYWxpZFNlcGFyYXRvcihwb3RlbnRpYWxPbmVDaGFyU2VwYXJhdG9yKSkge1xuICAgICAgc2V0dGluZ3Muc2VwYXJhdG9yID0gcG90ZW50aWFsT25lQ2hhclNlcGFyYXRvclxuICAgICAgcGFydFdpdGhvdXRTZXBhcmF0b3IgPSBwYXJ0LnNsaWNlKDAsIC0xKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXR0aW5ncy5zZXBhcmF0b3IgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlIHRoZSBudW1iZXJpbmcgc3R5bGVcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBwYXJ0V2l0aG91dFNlcGFyYXRvci5zcGxpdCgnLicpXG4gIGxldCBmaXJzdE51bWJlcmVkRGVzY3JpcHRvciA9IDBcblxuICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGRlc2NyaXB0b3IgaXMgYW4gdW5kZXJzY29yZVxuICBpZiAoZGVzY3JpcHRvcnMubGVuZ3RoID4gMSAmJiBkZXNjcmlwdG9yc1swXSA9PT0gJ18nKSB7XG4gICAgLy8gVGhlIGZpcnN0IGRlc2NyaXB0b3IgaXMgYW4gaW5zdHJ1Y3Rpb24gdG8gc2tpcCB0b3AgbGV2ZWxzLCBzbyBza2lwIHRoZW1cbiAgICBzZXR0aW5ncy5za2lwVG9wTGV2ZWwgPSB0cnVlXG4gICAgZmlyc3ROdW1iZXJlZERlc2NyaXB0b3IgPSAxXG4gIH0gZWxzZSB7XG4gICAgc2V0dGluZ3Muc2tpcFRvcExldmVsID0gZmFsc2VcbiAgfVxuXG4gIGlmIChkZXNjcmlwdG9ycy5sZW5ndGggLSBmaXJzdE51bWJlcmVkRGVzY3JpcHRvciA+PSAyKSB7XG4gICAgY29uc3Qgc3R5bGVMZXZlbDEgPSBkZXNjcmlwdG9yc1tmaXJzdE51bWJlcmVkRGVzY3JpcHRvcl1cbiAgICBpZiAoaXNWYWxpZE51bWJlcmluZ1N0eWxlU3RyaW5nKHN0eWxlTGV2ZWwxKSkge1xuICAgICAgc2V0dGluZ3Muc3R5bGVMZXZlbDEgPSBzdHlsZUxldmVsMSBhcyBOdW1iZXJpbmdTdHlsZVxuICAgIH1cbiAgICBjb25zdCBzdHlsZUxldmVsT3RoZXIgPSBkZXNjcmlwdG9yc1tmaXJzdE51bWJlcmVkRGVzY3JpcHRvciArIDFdXG4gICAgaWYgKGlzVmFsaWROdW1iZXJpbmdTdHlsZVN0cmluZyhzdHlsZUxldmVsT3RoZXIpKSB7XG4gICAgICBzZXR0aW5ncy5zdHlsZUxldmVsT3RoZXIgPSBzdHlsZUxldmVsT3RoZXIgYXMgTnVtYmVyaW5nU3R5bGVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3Ncbn1cbiIsImltcG9ydCB7IENhY2hlZE1ldGFkYXRhLCBFZGl0b3IsIEZpbGVNYW5hZ2VyLCBGcm9udE1hdHRlckNhY2hlLCBURmlsZSwgcGFyc2VGcm9udE1hdHRlckVudHJ5IH0gZnJvbSAnb2JzaWRpYW4nXG5pbXBvcnQgeyBOdW1iZXJpbmdTdHlsZSB9IGZyb20gJy4vbnVtYmVyaW5nVG9rZW5zJ1xuaW1wb3J0IHsgREVGQVVMVF9TRVRUSU5HUywgTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncywgaXNWYWxpZENvbnRlbnRzLCBpc1ZhbGlkRmlyc3RPck1heExldmVsLCBpc1ZhbGlkRmxhZywgaXNWYWxpZE51bWJlcmluZ1N0eWxlU3RyaW5nLCBpc1ZhbGlkTnVtYmVyaW5nVmFsdWVTdHJpbmcgfSBmcm9tICcuL3NldHRpbmdzVHlwZXMnXG5pbXBvcnQgeyB1cGRhdGVTZXR0aW5nc0Zyb21Gcm9udE1hdHRlckZvcm1hdFBhcnQgfSBmcm9tICcuL3RleHRQcm9jZXNzaW5nJ1xuXG5jb25zdCBBVVRPX1BBUlRfS0VZID0gJ2F1dG8nXG5jb25zdCBGSVJTVF9MRVZFTF9QQVJUX0tFWSA9ICdmaXJzdC1sZXZlbCdcbmNvbnN0IE1BWF9MRVZFTF9QQVJUX0tFWSA9ICdtYXgnXG5jb25zdCBDT05URU5UU19QQVJUX0tFWSA9ICdjb250ZW50cydcbmNvbnN0IFNUQVJUX0FUX1BBUlRfS0VZID0gJ3N0YXJ0LWF0J1xuXG5mdW5jdGlvbiBwYXJzZUNvbXBhY3RGcm9udE1hdHRlclNldHRpbmdzKGZtOiBGcm9udE1hdHRlckNhY2hlKTogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJ5ID0gcGFyc2VGcm9udE1hdHRlckVudHJ5KGZtLCAnbnVtYmVyIGhlYWRpbmdzJylcbiAgaWYgKGVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlTdHJpbmcgPSBTdHJpbmcoZW50cnkpXG4gICAgY29uc3QgcGFydHMgPSBlbnRyeVN0cmluZy5zcGxpdCgnLCcpXG4gICAgbGV0IHNldHRpbmdzOiBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdzID0geyAuLi5ERUZBVUxUX1NFVFRJTkdTIH1cblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgY29uc3QgdHJpbW1lZFBhcnQgPSBwYXJ0LnRyaW0oKVxuICAgICAgaWYgKHRyaW1tZWRQYXJ0Lmxlbmd0aCA9PT0gMCkgY29udGludWVcblxuICAgICAgaWYgKHRyaW1tZWRQYXJ0ID09PSBBVVRPX1BBUlRfS0VZKSB7XG4gICAgICAgIC8vIFBhcnNlIGF1dG8gbnVtYmVyaW5nIHBhcnRcbiAgICAgICAgc2V0dGluZ3MuYXV0byA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZFBhcnQuc3RhcnRzV2l0aChGSVJTVF9MRVZFTF9QQVJUX0tFWSkpIHtcbiAgICAgICAgLy8gUGFyc2UgZmlyc3QgbGV2ZWwgcGFydFxuICAgICAgICBjb25zdCBuc3RyaW5nID0gdHJpbW1lZFBhcnQuc3Vic3RyaW5nKEZJUlNUX0xFVkVMX1BBUlRfS0VZLmxlbmd0aCArIDEpXG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChuc3RyaW5nKVxuICAgICAgICBpZiAoaXNWYWxpZEZpcnN0T3JNYXhMZXZlbChuKSkge1xuICAgICAgICAgIHNldHRpbmdzLmZpcnN0TGV2ZWwgPSBuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZFBhcnQuc3RhcnRzV2l0aChNQVhfTEVWRUxfUEFSVF9LRVkpKSB7XG4gICAgICAgIC8vIFBhcnNlIG1heCBsZXZlbCBwYXJ0XG4gICAgICAgIGNvbnN0IG5zdHJpbmcgPSB0cmltbWVkUGFydC5zdWJzdHJpbmcoTUFYX0xFVkVMX1BBUlRfS0VZLmxlbmd0aCArIDEpXG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChuc3RyaW5nKVxuICAgICAgICBpZiAoaXNWYWxpZEZpcnN0T3JNYXhMZXZlbChuKSkge1xuICAgICAgICAgIHNldHRpbmdzLm1heExldmVsID0gblxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRQYXJ0LnN0YXJ0c1dpdGgoU1RBUlRfQVRfUEFSVF9LRVkpKSB7XG4gICAgICAgIC8vIFBhcnNlIFwic3RhcnQgYXRcIiBwYXJ0XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHJpbW1lZFBhcnQuc3Vic3RyaW5nKFNUQVJUX0FUX1BBUlRfS0VZLmxlbmd0aCArIDEpXG4gICAgICAgIGlmIChpc1ZhbGlkTnVtYmVyaW5nVmFsdWVTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgc2V0dGluZ3Muc3RhcnRBdCA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHJpbW1lZFBhcnQuc3RhcnRzV2l0aChDT05URU5UU19QQVJUX0tFWSkpIHtcbiAgICAgICAgaWYgKHRyaW1tZWRQYXJ0Lmxlbmd0aCA8PSBDT05URU5UU19QQVJUX0tFWS5sZW5ndGggKyAxKSBjb250aW51ZVxuICAgICAgICAvLyBQYXJzZSBjb250ZW50cyBoZWFkaW5nIHBhcnRcbiAgICAgICAgY29uc3QgdG9jSGVhZGluZyA9IHRyaW1tZWRQYXJ0LnN1YnN0cmluZyhDT05URU5UU19QQVJUX0tFWS5sZW5ndGggKyAxKVxuICAgICAgICBpZiAoaXNWYWxpZENvbnRlbnRzKHRvY0hlYWRpbmcpKSB7XG4gICAgICAgICAgc2V0dGluZ3MuY29udGVudHMgPSB0b2NIZWFkaW5nXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFBhcnNlIGZvcm1hdHRpbmcgcGFydFxuICAgICAgICBzZXR0aW5ncyA9IHVwZGF0ZVNldHRpbmdzRnJvbUZyb250TWF0dGVyRm9ybWF0UGFydCh0cmltbWVkUGFydCwgc2V0dGluZ3MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBnZXRGcm9udE1hdHRlclNldHRpbmdzT3JBbHRlcm5hdGl2ZSA9IChcbiAgeyBmcm9udG1hdHRlciB9OiBDYWNoZWRNZXRhZGF0YSxcbiAgYWx0ZXJuYXRpdmVTZXR0aW5nczogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5nc1xuKTogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncyA9PiB7XG4gIGlmIChmcm9udG1hdHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVjb21wYWN0ZWRTZXR0aW5ncyA9IHBhcnNlQ29tcGFjdEZyb250TWF0dGVyU2V0dGluZ3MoZnJvbnRtYXR0ZXIpXG4gICAgaWYgKGRlY29tcGFjdGVkU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlY29tcGFjdGVkU2V0dGluZ3NcblxuICAgIC8vIE5PVEU6IEV2ZXJ5dGhpbmcgYmVsb3cgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHlcblxuICAgIGNvbnN0IHNraXBUb3BMZXZlbEVudHJ5ID0gcGFyc2VGcm9udE1hdHRlckVudHJ5KGZyb250bWF0dGVyLCAnbnVtYmVyLWhlYWRpbmdzLXNraXAtdG9wLWxldmVsJykgPz8gcGFyc2VGcm9udE1hdHRlckVudHJ5KGZyb250bWF0dGVyLCAnaGVhZGVyLW51bWJlcmluZy1za2lwLXRvcC1sZXZlbCcpXG4gICAgY29uc3Qgc2tpcFRvcExldmVsID0gaXNWYWxpZEZsYWcoc2tpcFRvcExldmVsRW50cnkpID8gc2tpcFRvcExldmVsRW50cnkgOiBhbHRlcm5hdGl2ZVNldHRpbmdzLnNraXBUb3BMZXZlbFxuXG4gICAgY29uc3QgbWF4TGV2ZWxFbnRyeSA9IHBhcnNlRnJvbnRNYXR0ZXJFbnRyeShmcm9udG1hdHRlciwgJ251bWJlci1oZWFkaW5ncy1tYXgtbGV2ZWwnKSA/PyBwYXJzZUZyb250TWF0dGVyRW50cnkoZnJvbnRtYXR0ZXIsICdoZWFkZXItbnVtYmVyaW5nLW1heC1sZXZlbCcpXG4gICAgY29uc3QgbWF4TGV2ZWwgPSBpc1ZhbGlkRmlyc3RPck1heExldmVsKG1heExldmVsRW50cnkpID8gbWF4TGV2ZWxFbnRyeSA6IGFsdGVybmF0aXZlU2V0dGluZ3MubWF4TGV2ZWxcblxuICAgIGNvbnN0IHN0eWxlTGV2ZWwxRW50cnkgPSBTdHJpbmcoXG4gICAgICBwYXJzZUZyb250TWF0dGVyRW50cnkoZnJvbnRtYXR0ZXIsICdudW1iZXItaGVhZGluZ3Mtc3R5bGUtbGV2ZWwtMScpID8/XG4gICAgICBwYXJzZUZyb250TWF0dGVyRW50cnkoZnJvbnRtYXR0ZXIsICdoZWFkZXItbnVtYmVyaW5nLXN0eWxlLWxldmVsLTEnKVxuICAgIClcbiAgICBjb25zdCBzdHlsZUxldmVsMTogTnVtYmVyaW5nU3R5bGUgPSBpc1ZhbGlkTnVtYmVyaW5nU3R5bGVTdHJpbmcoc3R5bGVMZXZlbDFFbnRyeSkgPyBzdHlsZUxldmVsMUVudHJ5IGFzIE51bWJlcmluZ1N0eWxlIDogYWx0ZXJuYXRpdmVTZXR0aW5ncy5zdHlsZUxldmVsMVxuXG4gICAgY29uc3Qgc3R5bGVMZXZlbE90aGVyRW50cnkgPSBTdHJpbmcoXG4gICAgICBwYXJzZUZyb250TWF0dGVyRW50cnkoZnJvbnRtYXR0ZXIsICdudW1iZXItaGVhZGluZ3Mtc3R5bGUtbGV2ZWwtb3RoZXInKSA/P1xuICAgICAgcGFyc2VGcm9udE1hdHRlckVudHJ5KGZyb250bWF0dGVyLCAnaGVhZGVyLW51bWJlcmluZy1zdHlsZS1sZXZlbC1vdGhlcicpXG4gICAgKVxuICAgIGNvbnN0IHN0eWxlTGV2ZWxPdGhlcjogTnVtYmVyaW5nU3R5bGUgPSBpc1ZhbGlkTnVtYmVyaW5nU3R5bGVTdHJpbmcoc3R5bGVMZXZlbE90aGVyRW50cnkpID8gc3R5bGVMZXZlbE90aGVyRW50cnkgYXMgTnVtYmVyaW5nU3R5bGUgOiBhbHRlcm5hdGl2ZVNldHRpbmdzLnN0eWxlTGV2ZWxPdGhlclxuXG4gICAgY29uc3QgYXV0b0VudHJ5ID0gcGFyc2VGcm9udE1hdHRlckVudHJ5KGZyb250bWF0dGVyLCAnbnVtYmVyLWhlYWRpbmdzLWF1dG8nKSA/PyBwYXJzZUZyb250TWF0dGVyRW50cnkoZnJvbnRtYXR0ZXIsICdoZWFkZXItbnVtYmVyaW5nLWF1dG8nKVxuICAgIGNvbnN0IGF1dG8gPSBpc1ZhbGlkRmxhZyhhdXRvRW50cnkpID8gYXV0b0VudHJ5IDogYWx0ZXJuYXRpdmVTZXR0aW5ncy5hdXRvXG5cbiAgICByZXR1cm4geyAuLi5hbHRlcm5hdGl2ZVNldHRpbmdzLCBza2lwVG9wTGV2ZWwsIG1heExldmVsLCBzdHlsZUxldmVsMSwgc3R5bGVMZXZlbE90aGVyLCBhdXRvIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWx0ZXJuYXRpdmVTZXR0aW5nc1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldHRpbmdzVG9Db21wYWN0RnJvbnRNYXR0ZXJWYWx1ZShzZXR0aW5nczogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncyk6IHN0cmluZyB7XG4gIGNvbnN0IGF1dG9QYXJ0ID0gc2V0dGluZ3MuYXV0byA/ICdhdXRvLCAnIDogJydcbiAgY29uc3QgZmlyc3RMZXZlbFBhcnQgPSBgZmlyc3QtbGV2ZWwgJHtzZXR0aW5ncy5maXJzdExldmVsfSwgYFxuICBjb25zdCBtYXhQYXJ0ID0gYG1heCAke3NldHRpbmdzLm1heExldmVsfSwgYFxuICBjb25zdCBjb250ZW50c1BhcnQgPSBzZXR0aW5ncy5jb250ZW50cyAmJiBzZXR0aW5ncy5jb250ZW50cy5sZW5ndGggPiAwID8gYGNvbnRlbnRzICR7c2V0dGluZ3MuY29udGVudHN9LCBgIDogJydcbiAgY29uc3Qgc2tpcFRvcExldmVsU3RyaW5nID0gc2V0dGluZ3Muc2tpcFRvcExldmVsID8gJ18uJyA6ICcnXG4gIGNvbnN0IHN0eWxlUGFydCA9IGAke3NraXBUb3BMZXZlbFN0cmluZ30ke3NldHRpbmdzLnN0eWxlTGV2ZWwxfS4ke3NldHRpbmdzLnN0eWxlTGV2ZWxPdGhlcn0ke3NldHRpbmdzLnNlcGFyYXRvcn1gXG4gIGNvbnN0IHN0YXJ0QXRQYXJ0ID0gc2V0dGluZ3Muc3RhcnRBdCAhPT0gJycgPyBgc3RhcnQtYXQgJHtzZXR0aW5ncy5zdGFydEF0fSwgYCA6ICcnXG4gIHJldHVybiBhdXRvUGFydCArIGZpcnN0TGV2ZWxQYXJ0ICsgbWF4UGFydCArIGNvbnRlbnRzUGFydCArIHN0YXJ0QXRQYXJ0ICsgc3R5bGVQYXJ0XG59XG5cbmV4cG9ydCBjb25zdCBzYXZlU2V0dGluZ3NUb0Zyb250TWF0dGVyID0gKFxuICBmaWxlTWFuYWdlcjogRmlsZU1hbmFnZXIsXG4gIGZpbGU6IFRGaWxlLFxuICBzZXR0aW5nczogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5nc1xuKTogdm9pZCA9PiB7XG4gIGZpbGVNYW5hZ2VyLnByb2Nlc3NGcm9udE1hdHRlcihmaWxlLCBmcm9udG1hdHRlciA9PiB7XG4gICAgY29uc3Qgdjogc3RyaW5nID0gc2V0dGluZ3NUb0NvbXBhY3RGcm9udE1hdHRlclZhbHVlKHNldHRpbmdzKVxuICAgIGZyb250bWF0dGVyWydudW1iZXIgaGVhZGluZ3MnXSA9IHZcbiAgfSlcbn1cbiIsImltcG9ydCB7IEFwcCwgTW9kYWwgfSBmcm9tICdvYnNpZGlhbidcbmltcG9ydCB7IFZpZXdJbmZvIH0gZnJvbSAnLi9hY3RpdmVWaWV3SGVscGVycydcbmltcG9ydCB7IHNhdmVTZXR0aW5nc1RvRnJvbnRNYXR0ZXIgfSBmcm9tICcuL2Zyb250TWF0dGVyJ1xuaW1wb3J0IHsgTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3NUeXBlcydcblxuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJpbmdEb25lQ29uZmlnIHtcbiAgbWVzc2FnZTogc3RyaW5nXG4gIHByZWZvcm1hdHRlZE1lc3NhZ2U6IHN0cmluZ1xuICBzYXZlU2V0dGluZ3NDYWxsYmFjazogKHNob3VsZEFkZEF1dG9GbGFnOiBib29sZWFuKSA9PiB2b2lkXG59XG5cbmNsYXNzIE51bWJlcmluZ0RvbmVNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgY29uZmlnOiBOdW1iZXJpbmdEb25lQ29uZmlnXG5cbiAgY29uc3RydWN0b3IoYXBwOiBBcHAsIGNvbmZpZzogTnVtYmVyaW5nRG9uZUNvbmZpZykge1xuICAgIHN1cGVyKGFwcClcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICB9XG5cbiAgb25PcGVuKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29udGVudEVsLCB0aXRsZUVsIH0gPSB0aGlzXG4gICAgdGl0bGVFbC5zZXRUZXh0KCdOdW1iZXIgSGVhZGluZ3MgLSBTdWNjZXNzZnVsbHkgQ29tcGxldGVkJylcblxuICAgIGNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2JywgeyB0ZXh0OiB0aGlzLmNvbmZpZy5tZXNzYWdlIH0pXG4gICAgY29udGVudEVsLmNyZWF0ZUVsKCdwcmUnLCB7IHRleHQ6IHRoaXMuY29uZmlnLnByZWZvcm1hdHRlZE1lc3NhZ2UgfSlcblxuICAgIGNvbnRlbnRFbC5jcmVhdGVFbCgnZGl2JywgeyB0ZXh0OiBcIkRvIHlvdSB3YW50IHRvIHNhdmUgdGhlc2Ugc2V0dGluZ3MgaW4gdGhlIGRvY3VtZW50J3MgZnJvbnQgbWF0dGVyP1wiLCBjbHM6ICdudW1iZXItaGVhZGluZ3MtcXVlc3Rpb24nIH0pXG5cbiAgICBjb25zdCBjb250YWluZXJGb3JCdXR0b25zID0gY29udGVudEVsLmNyZWF0ZUVsKCdkaXYnLCB7IGNsczogJ251bWJlci1oZWFkaW5ncy1idXR0b24tY29udGFpbmVyJyB9KVxuXG4gICAgY29uc3Qgbm9CdXR0b24gPSBjb250YWluZXJGb3JCdXR0b25zLmNyZWF0ZUVsKCdidXR0b24nLCB7fSlcbiAgICBub0J1dHRvbi5zZXRUZXh0KCdObycpXG4gICAgbm9CdXR0b24ub25DbGlja0V2ZW50KChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICByZXR1cm4gZXZcbiAgICB9KVxuXG4gICAgY29uc3QgeWVzQnV0dG9uID0gY29udGFpbmVyRm9yQnV0dG9ucy5jcmVhdGVFbCgnYnV0dG9uJywge30pXG4gICAgeWVzQnV0dG9uLnNldFRleHQoJ1llcywgc2F2ZSBzZXR0aW5ncyBpbiBkb2N1bWVudCcpXG4gICAgeWVzQnV0dG9uLm9uQ2xpY2tFdmVudCgoZXY6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuY29uZmlnLnNhdmVTZXR0aW5nc0NhbGxiYWNrKGZhbHNlKVxuICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICByZXR1cm4gZXZcbiAgICB9KVxuXG4gICAgY29uc3QgeWVzQW5kQXV0b0J1dHRvbiA9IGNvbnRhaW5lckZvckJ1dHRvbnMuY3JlYXRlRWwoJ2J1dHRvbicsIHt9KVxuICAgIHllc0FuZEF1dG9CdXR0b24uc2V0VGV4dCgnWWVzLCBzYXZlIHNldHRpbmdzIGluIGRvY3VtZW50LCBhbmQgYXV0b21hdGljYWxseSBudW1iZXInKVxuICAgIHllc0FuZEF1dG9CdXR0b24ub25DbGlja0V2ZW50KChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5jb25maWcuc2F2ZVNldHRpbmdzQ2FsbGJhY2sodHJ1ZSlcbiAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgcmV0dXJuIGV2XG4gICAgfSlcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIHRpdGxlRWwgfSA9IHRoaXNcbiAgICBjb250ZW50RWwuZW1wdHkoKVxuICAgIHRpdGxlRWwuZW1wdHkoKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG93TnVtYmVyaW5nRG9uZU1lc3NhZ2UoYXBwOiBBcHAsIHNldHRpbmdzOiBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdzKTogdm9pZCB7XG4gIGNvbnN0IHNhdmVTZXR0aW5nc0NhbGxiYWNrID0gKHNob3VsZEFkZEF1dG9GbGFnOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdHdlYWtlZFNldHRpbmdzID0geyAuLi5zZXR0aW5ncyB9XG4gICAgaWYgKHNob3VsZEFkZEF1dG9GbGFnKSB0d2Vha2VkU2V0dGluZ3MuYXV0byA9IHRydWVcbiAgICBjb25zdCBmaWxlID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClcbiAgICBpZiAoZmlsZSkge1xuICAgICAgc2F2ZVNldHRpbmdzVG9Gcm9udE1hdHRlcihhcHAuZmlsZU1hbmFnZXIsIGZpbGUsIHR3ZWFrZWRTZXR0aW5ncylcbiAgICB9XG4gIH1cbiAgY29uc3QgY29uZmlnOiBOdW1iZXJpbmdEb25lQ29uZmlnID0ge1xuICAgIG1lc3NhZ2U6IGBTdWNjZXNzZnVsbHkgdXBkYXRlZCBhbGwgaGVhZGluZyBudW1iZXJzIGluIHRoZSBkb2N1bWVudCwgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93LiBcbiAgICAgIFNlZSBzZXR0aW5ncyBwYW5lbCB0byBjaGFuZ2UgaG93IGhlYWRpbmdzIGFyZSBudW1iZXJlZCwgb3IgdXNlIGZyb250IG1hdHRlclxuICAgICAgKHNlZSBzZXR0aW5ncyBwYW5lbCkuYCxcbiAgICBwcmVmb3JtYXR0ZWRNZXNzYWdlOiBgU2tpcCB0b3AgaGVhZGluZyBsZXZlbDogJHtzZXR0aW5ncy5za2lwVG9wTGV2ZWx9XG5GaXJzdCBoZWFkaW5nIGxldmVsOiAke3NldHRpbmdzLmZpcnN0TGV2ZWx9XG5TdGFydCBudW1iZXJpbmcgZmlyc3QgaGVhZGluZyBhdDogJHtzZXR0aW5ncy5zdGFydEF0fVxuTWF4aW11bSBoZWFkaW5nIGxldmVsOiAke3NldHRpbmdzLm1heExldmVsfVxuU3R5bGUgZm9yIGxldmVsIDEgaGVhZGluZ3M6ICR7c2V0dGluZ3Muc3R5bGVMZXZlbDF9XG5TdHlsZSBmb3IgbG93ZXIgbGV2ZWwgaGVhZGluZ3MgKGJlbG93IGxldmVsIDEpOiAke3NldHRpbmdzLnN0eWxlTGV2ZWxPdGhlcn1cblNlcGFyYXRvcjogJHtzZXR0aW5ncy5zZXBhcmF0b3J9XG5UYWJsZSBvZiBDb250ZW50cyBBbmNob3I6ICR7c2V0dGluZ3MuY29udGVudHN9YCxcbiAgICBzYXZlU2V0dGluZ3NDYWxsYmFja1xuICB9XG5cbiAgY29uc3QgbGVhZiA9IGFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZlxuICBpZiAobGVhZikge1xuICAgIG5ldyBOdW1iZXJpbmdEb25lTW9kYWwoYXBwLCBjb25maWcpLm9wZW4oKVxuICB9XG59XG4iLCJpbXBvcnQgeyBFZGl0b3IsIEVkaXRvckNoYW5nZSwgRWRpdG9yUmFuZ2UsIEhlYWRpbmdDYWNoZSB9IGZyb20gJ29ic2lkaWFuJ1xuaW1wb3J0IHsgVmlld0luZm8gfSBmcm9tICcuL2FjdGl2ZVZpZXdIZWxwZXJzJ1xuaW1wb3J0IHsgZmlyc3ROdW1iZXJpbmdUb2tlbkluU3R5bGUsIG1ha2VOdW1iZXJpbmdTdHJpbmcsIG5leHROdW1iZXJpbmdUb2tlbiwgTnVtYmVyaW5nVG9rZW4sIHN0YXJ0QXRPclplcm90aEluU3R5bGUgfSBmcm9tICcuL251bWJlcmluZ1Rva2VucydcbmltcG9ydCB7IGRvZXNDb250ZW50c0hhdmVWYWx1ZSwgTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncyB9IGZyb20gJy4vc2V0dGluZ3NUeXBlcydcbmltcG9ydCB7IGNyZWF0ZVN1cHBvcnRGbGFnc0Zyb21TZXR0aW5ncywgZmluZFJhbmdlSW5IZWFkZXJTdHJpbmcsIFN1cHBvcnRGbGFncyB9IGZyb20gJy4vdGV4dFByb2Nlc3NpbmcnXG5cbmNvbnN0IFRPQ19MSVNUX0lURU1fQlVMTEVUID0gJy0nXG5cbmZ1bmN0aW9uIG1ha2VIZWFkaW5nSGFzaFN0cmluZyAoZWRpdG9yOiBFZGl0b3IsIGhlYWRpbmc6IEhlYWRpbmdDYWNoZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlZ2V4ID0gL15cXHN7MCw0fSMrL2dcbiAgY29uc3QgaGVhZGluZ0xpbmVTdHJpbmcgPSBlZGl0b3IuZ2V0TGluZShoZWFkaW5nLnBvc2l0aW9uLnN0YXJ0LmxpbmUpXG4gIGlmICghaGVhZGluZ0xpbmVTdHJpbmcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBtYXRjaGVzID0gaGVhZGluZ0xpbmVTdHJpbmcubWF0Y2gocmVnZXgpXG4gIGlmICghbWF0Y2hlcykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGlmIChtYXRjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coXCJVbmV4cGVjdGVkIGhlYWRpbmcgZm9ybWF0OiAnXCIgKyBoZWFkaW5nTGluZVN0cmluZyArIFwiJ1wiKVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gbWF0Y2hlc1swXVxuICByZXR1cm4gbWF0Y2gudHJpbUxlZnQoKVxufVxuXG5mdW5jdGlvbiBmaW5kSGVhZGluZ1ByZWZpeFJhbmdlIChlZGl0b3I6IEVkaXRvciwgaGVhZGluZzogSGVhZGluZ0NhY2hlLCBmbGFnczogU3VwcG9ydEZsYWdzKTogRWRpdG9yUmFuZ2UgfCB1bmRlZmluZWQge1xuICBjb25zdCBsaW5lTnVtYmVyID0gaGVhZGluZy5wb3NpdGlvbi5zdGFydC5saW5lXG4gIGNvbnN0IGxpbmVUZXh0ID0gZWRpdG9yLmdldExpbmUobGluZU51bWJlcilcbiAgcmV0dXJuIGZpbmRSYW5nZUluSGVhZGVyU3RyaW5nKGxpbmVUZXh0LCBsaW5lTnVtYmVyLCBmbGFncylcbn1cblxuZnVuY3Rpb24gY2xlYW5IZWFkaW5nVGV4dEZvclRvYyAoaHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChodGV4dC5jb250YWlucygnXicpKSB7XG4gICAgY29uc3QgeCA9IGh0ZXh0LnNwbGl0KCdeJylcbiAgICBpZiAoeC5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4geFswXS50cmltKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGh0ZXh0LnRyaW0oKVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBjcmVhdGVUb2NFbnRyeSAoaDogSGVhZGluZ0NhY2hlLCBzZXR0aW5nczogTnVtYmVySGVhZGluZ3NQbHVnaW5TZXR0aW5ncywgaW5pdGlhbEhlYWRpbmdMZXZlbDogbnVtYmVyKTpzdHJpbmcge1xuICBjb25zdCB0ZXh0ID0gaC5oZWFkaW5nXG4gIGNvbnN0IGNsZWFuVGV4dCA9IGNsZWFuSGVhZGluZ1RleHRGb3JUb2ModGV4dClcblxuICBsZXQgYnVsbGV0SW5kZW50ID0gJydcbiAgY29uc3Qgc3RhcnRMZXZlbCA9IGluaXRpYWxIZWFkaW5nTGV2ZWxcbiAgZm9yIChsZXQgaSA9IHN0YXJ0TGV2ZWw7IGkgPCBoLmxldmVsOyBpKyspIHtcbiAgICBidWxsZXRJbmRlbnQgKz0gJ1xcdCdcbiAgfVxuXG4gIGNvbnN0IGVudHJ5TGluayA9IGBbWyMke3RleHR9fCR7Y2xlYW5UZXh0fV1dYFxuXG4gIHJldHVybiBidWxsZXRJbmRlbnQgKyBUT0NfTElTVF9JVEVNX0JVTExFVCArICcgJyArIGVudHJ5TGlua1xufVxuXG4vLyBSZXBsYWNlIGEgcmFuZ2UsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRleHQsIHRvIHByZXZlbnQgcG9sdXRpbmcgdGhlIHVuZG8gc3RhY2tcbmZ1bmN0aW9uIHJlcGxhY2VSYW5nZUVjb25vbWljYWxseSAoZWRpdG9yOiBFZGl0b3IsIGNoYW5nZXM6IEVkaXRvckNoYW5nZVtdLCByYW5nZTogRWRpdG9yUmFuZ2UsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBwcmV2aW91c1RleHQgPSBlZGl0b3IuZ2V0UmFuZ2UocmFuZ2UuZnJvbSwgcmFuZ2UudG8pXG5cbiAgaWYgKHByZXZpb3VzVGV4dCAhPT0gdGV4dCkge1xuICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgZnJvbTogcmFuZ2UuZnJvbSxcbiAgICAgIHRvOiByYW5nZS50b1xuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUhlYWRpbmdOdW1iZXJpbmcgPSAoXG4gIHZpZXdJbmZvOiBWaWV3SW5mbyB8IHVuZGVmaW5lZCxcbiAgc2V0dGluZ3M6IE51bWJlckhlYWRpbmdzUGx1Z2luU2V0dGluZ3Ncbik6IHZvaWQgPT4ge1xuICBpZiAoIXZpZXdJbmZvKSByZXR1cm5cbiAgY29uc3QgaGVhZGluZ3MgPSB2aWV3SW5mby5kYXRhLmhlYWRpbmdzID8/IFtdXG4gIGNvbnN0IGVkaXRvciA9IHZpZXdJbmZvLmVkaXRvclxuICBjb25zdCBzdXBwb3J0RmxhZ3MgPSBjcmVhdGVTdXBwb3J0RmxhZ3NGcm9tU2V0dGluZ3Moc2V0dGluZ3Muc3R5bGVMZXZlbDEsIHNldHRpbmdzLnN0eWxlTGV2ZWxPdGhlcilcblxuICBsZXQgcHJldmlvdXNMZXZlbCA9IDFcblxuICBsZXQgbnVtYmVyaW5nU3RhY2s6IE51bWJlcmluZ1Rva2VuW10gPSBbc3RhcnRBdE9yWmVyb3RoSW5TdHlsZShzZXR0aW5ncy5zdGFydEF0LCBzZXR0aW5ncy5zdHlsZUxldmVsMSldXG5cbiAgaWYgKHNldHRpbmdzLmZpcnN0TGV2ZWwgPiAxKSB7XG4gICAgcHJldmlvdXNMZXZlbCA9IHNldHRpbmdzLmZpcnN0TGV2ZWxcbiAgfSBlbHNlIGlmIChzZXR0aW5ncy5za2lwVG9wTGV2ZWwpIHtcbiAgICBwcmV2aW91c0xldmVsID0gMlxuICB9XG5cbiAgY29uc3QgY2hhbmdlczogRWRpdG9yQ2hhbmdlW10gPSBbXVxuXG4gIGZvciAoY29uc3QgaGVhZGluZyBvZiBoZWFkaW5ncykge1xuICAgIC8vIFVwZGF0ZSB0aGUgbnVtYmVyaW5nIHN0YWNrIGJhc2VkIG9uIHRoZSBsZXZlbCBhbmQgcHJldmlvdXMgbGV2ZWxcblxuICAgIGNvbnN0IGxldmVsID0gaGVhZGluZy5sZXZlbFxuXG4gICAgLy8gSGFuZGxlIHNraXBwZWQgJiBpZ25vcmVkIGxldmVscy5cbiAgICBpZiAoKHNldHRpbmdzLmZpcnN0TGV2ZWwgPiBsZXZlbCkgfHwgKHNldHRpbmdzLnNraXBUb3BMZXZlbCAmJiBsZXZlbCA9PT0gMSkpIHtcbiAgICAgIC8vIFJlc2V0cyB0aGUgbnVtYmVyaW5nIHdoZW4gYSBsZXZlbCBpcyBza2lwcGVkLlxuICAgICAgLy8gTm90ZTogVGhpcyBsZWF2ZXMgaGVhZGluZ3MgYXMgdGhleSBhcmUsIGFsbG93aW5nIHBlb3BsZSB0byBoYXZlIG51bWJlcnMgYXQgdGhlIHN0YXJ0IG9mXG4gICAgICAvLyBpZ25vcmVkIGhlYWRpbmdzLlxuXG4gICAgICBudW1iZXJpbmdTdGFjayA9IFtzdGFydEF0T3JaZXJvdGhJblN0eWxlKHNldHRpbmdzLnN0YXJ0QXQsIHNldHRpbmdzLnN0eWxlTGV2ZWwxKV1cblxuICAgICAgaWYgKHNldHRpbmdzLmZpcnN0TGV2ZWwgPiAxKSB7XG4gICAgICAgIHByZXZpb3VzTGV2ZWwgPSBzZXR0aW5ncy5maXJzdExldmVsXG4gICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLnNraXBUb3BMZXZlbCkge1xuICAgICAgICBwcmV2aW91c0xldmVsID0gMlxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBBZGp1c3QgbnVtYmVyaW5nIHN0YWNrXG4gICAgaWYgKGxldmVsID09PSBwcmV2aW91c0xldmVsKSB7XG4gICAgICBjb25zdCB4ID0gbnVtYmVyaW5nU3RhY2sucG9wKClcbiAgICAgIGlmICh4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbnVtYmVyaW5nU3RhY2sucHVzaChuZXh0TnVtYmVyaW5nVG9rZW4oeCkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsZXZlbCA8IHByZXZpb3VzTGV2ZWwpIHtcbiAgICAgIGZvciAobGV0IGkgPSBwcmV2aW91c0xldmVsOyBpID4gbGV2ZWw7IGktLSkge1xuICAgICAgICBudW1iZXJpbmdTdGFjay5wb3AoKVxuICAgICAgfVxuICAgICAgY29uc3QgeCA9IG51bWJlcmluZ1N0YWNrLnBvcCgpXG4gICAgICBpZiAoeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG51bWJlcmluZ1N0YWNrLnB1c2gobmV4dE51bWJlcmluZ1Rva2VuKHgpKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobGV2ZWwgPiBwcmV2aW91c0xldmVsKSB7XG4gICAgICBmb3IgKGxldCBpID0gcHJldmlvdXNMZXZlbDsgaSA8IGxldmVsOyBpKyspIHtcbiAgICAgICAgbnVtYmVyaW5nU3RhY2sucHVzaChmaXJzdE51bWJlcmluZ1Rva2VuSW5TdHlsZShzZXR0aW5ncy5zdHlsZUxldmVsT3RoZXIpKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGUgcHJldmlvdXMgbGV2ZWwgdG8gdGhpcyBsZXZlbCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uXG4gICAgcHJldmlvdXNMZXZlbCA9IGxldmVsXG5cbiAgICBpZiAobGV2ZWwgPiBzZXR0aW5ncy5tYXhMZXZlbCkge1xuICAgICAgLy8gSWYgd2UgYXJlIGFib3ZlIHRoZSBtYXggbGV2ZWwsIGp1c3QgZG9uJ3QgbnVtYmVyIGl0XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHJhbmdlIHRvIHJlcGxhY2UsIGFuZCB0aGVuIGRvIGl0XG4gICAgY29uc3QgcHJlZml4UmFuZ2UgPSBmaW5kSGVhZGluZ1ByZWZpeFJhbmdlKGVkaXRvciwgaGVhZGluZywgc3VwcG9ydEZsYWdzKVxuICAgIGlmIChwcmVmaXhSYW5nZSA9PT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICBjb25zdCBoZWFkaW5nSGFzaFN0cmluZyA9IG1ha2VIZWFkaW5nSGFzaFN0cmluZyhlZGl0b3IsIGhlYWRpbmcpXG4gICAgaWYgKGhlYWRpbmdIYXNoU3RyaW5nID09PSB1bmRlZmluZWQpIHJldHVyblxuICAgIGNvbnN0IHByZWZpeFN0cmluZyA9IG1ha2VOdW1iZXJpbmdTdHJpbmcobnVtYmVyaW5nU3RhY2spXG4gICAgcmVwbGFjZVJhbmdlRWNvbm9taWNhbGx5KGVkaXRvciwgY2hhbmdlcywgcHJlZml4UmFuZ2UsIGhlYWRpbmdIYXNoU3RyaW5nICsgcHJlZml4U3RyaW5nICsgc2V0dGluZ3Muc2VwYXJhdG9yICsgJyAnKVxuICB9XG5cbiAgLy8gRXhlY3V0ZSB0aGUgdHJhbnNhY3Rpb24gdG8gbWFrZSBhbGwgdGhlIGNoYW5nZXMgYXQgb25jZVxuICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnTnVtYmVyIEhlYWRpbmdzIFBsdWdpbjogQXBwbHlpbmcgaGVhZGluZ3MgbnVtYmVyaW5nIGNoYW5nZXM6JywgY2hhbmdlcy5sZW5ndGgpXG4gICAgZWRpdG9yLnRyYW5zYWN0aW9uKHtcbiAgICAgIGNoYW5nZXM6IGNoYW5nZXNcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUYWJsZU9mQ29udGVudHMgPSAoXG4gIHZpZXdJbmZvOiBWaWV3SW5mbyB8IHVuZGVmaW5lZCxcbiAgc2V0dGluZ3M6IE51bWJlckhlYWRpbmdzUGx1Z2luU2V0dGluZ3Ncbik6IHZvaWQgPT4ge1xuICBpZiAoIXZpZXdJbmZvKSByZXR1cm5cbiAgY29uc3QgaGVhZGluZ3MgPSB2aWV3SW5mby5kYXRhLmhlYWRpbmdzID8/IFtdXG4gIGNvbnN0IGVkaXRvciA9IHZpZXdJbmZvLmVkaXRvclxuXG4gIGlmICghZG9lc0NvbnRlbnRzSGF2ZVZhbHVlKHNldHRpbmdzLmNvbnRlbnRzKSkgcmV0dXJuXG5cbiAgbGV0IHRvY0hlYWRpbmc6IEhlYWRpbmdDYWNoZSB8IHVuZGVmaW5lZFxuICBsZXQgdG9jQnVpbGRlciA9ICdcXG4nXG4gIGNvbnN0IGNoYW5nZXM6IEVkaXRvckNoYW5nZVtdID0gW11cblxuICAvLyBJbiBjYXNlIGhlYWRpbmdzIHN0YXJ0IGFib3ZlIGxldmVsIDEsIHdlIGRvbid0IHdhbnQgdG8gaW5kZW50IHRoZSBidWxsZXRzIHRvbyBtdWNoXG4gIGxldCBpbml0aWFsSGVhZGluZ0xldmVsID0gMVxuICBpZiAoaGVhZGluZ3MubGVuZ3RoID4gMCkge1xuICAgIGluaXRpYWxIZWFkaW5nTGV2ZWwgPSBoZWFkaW5nc1swXS5sZXZlbFxuICB9XG5cbiAgZm9yIChjb25zdCBoZWFkaW5nIG9mIGhlYWRpbmdzKSB7XG4gICAgLy8gT1JERVJJTkc6IEltcG9ydGFudCB0byBmaW5kIHRoZSBUT0MgaGVhZGluZyBiZWZvcmUgc2tpcHBpbmcgc2tpcHBlZCBoZWFkaW5ncywgc2luY2UgdGhhdCBpcyBmb3IgbnVtYmVyaW5nXG5cbiAgICAvLyBGaW5kIHRoZSBUT0MgaGVhZGluZ1xuICAgIGlmIChoZWFkaW5nLmhlYWRpbmcuZW5kc1dpdGgoc2V0dGluZ3MuY29udGVudHMpKSB7XG4gICAgICB0b2NIZWFkaW5nID0gaGVhZGluZ1xuICAgIH1cblxuICAgIC8qIFRoaXMgY29kZSBsZXRzIHVzIHNraXAgVE9DIGxpbmVzIGZvciBza2lwcGVkIGhlYWRpbmdzLCBidXQgZG9lc24ndCB3b3JrIHdlbGwgd2l0aCBmaXJzdC1sZXZlbCBzZXR0aW5nXG4gICAgaWYgKChzZXR0aW5ncy5za2lwVG9wTGV2ZWwgJiYgaGVhZGluZy5sZXZlbCA9PT0gMSkgfHwgKGhlYWRpbmcubGV2ZWwgPiBzZXR0aW5ncy5tYXhMZXZlbCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgICovXG5cbiAgICBjb25zdCB0b2NFbnRyeSA9IGNyZWF0ZVRvY0VudHJ5KGhlYWRpbmcsIHNldHRpbmdzLCBpbml0aWFsSGVhZGluZ0xldmVsKVxuICAgIHRvY0J1aWxkZXIgKz0gdG9jRW50cnkgKyAnXFxuJ1xuICB9XG5cbiAgLy8gSW5zZXJ0IHRoZSBnZW5lcmF0ZWQgdGFibGUgb2YgY29udGVudHNcbiAgaWYgKHRvY0hlYWRpbmcpIHtcbiAgICBjb25zdCBmcm9tID0ge1xuICAgICAgbGluZTogdG9jSGVhZGluZy5wb3NpdGlvbi5zdGFydC5saW5lICsgMSxcbiAgICAgIGNoOiAwXG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBUT0Mgc2VjdGlvblxuICAgIGNvbnN0IHN0YXJ0aW5nTGluZSA9IHRvY0hlYWRpbmcucG9zaXRpb24uc3RhcnQubGluZSArIDFcbiAgICBsZXQgZW5kaW5nTGluZSA9IHN0YXJ0aW5nTGluZVxuICAgIGxldCBmb3VuZExpc3QgPSBmYWxzZVxuICAgIGNvbnN0IGxhc3RMaW5lSW5FZGl0b3IgPSBlZGl0b3IubGFzdExpbmUoKVxuICAgIGZvciAoOyA7IGVuZGluZ0xpbmUrKykge1xuICAgICAgY29uc3QgbGluZSA9IGVkaXRvci5nZXRMaW5lKGVuZGluZ0xpbmUpXG4gICAgICBpZiAobGluZSA9PT0gdW5kZWZpbmVkIHx8IGVuZGluZ0xpbmUgPiBsYXN0TGluZUluRWRpdG9yKSB7XG4gICAgICAgIC8vIFJlYWNoZWQgZW5kIG9mIGZpbGUsIGluc2VydCBhdCB0aGUgc3RhcnQgb2YgdGhlIFRPQyBzZWN0aW9uXG4gICAgICAgIGVuZGluZ0xpbmUgPSBzdGFydGluZ0xpbmVcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lVGV4dCA9IGxpbmUudHJpbVN0YXJ0KClcbiAgICAgIGlmIChmb3VuZExpc3QpIHtcbiAgICAgICAgaWYgKCF0cmltbWVkTGluZVRleHQuc3RhcnRzV2l0aChUT0NfTElTVF9JVEVNX0JVTExFVCkpIGJyZWFrXG4gICAgICAgIGlmICh0cmltbWVkTGluZVRleHQuc3RhcnRzV2l0aCgnIycpKSBicmVha1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRyaW1tZWRMaW5lVGV4dC5zdGFydHNXaXRoKFRPQ19MSVNUX0lURU1fQlVMTEVUKSkge1xuICAgICAgICAgIGZvdW5kTGlzdCA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZVRleHQuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgICAgLy8gUmVhY2hlZCB0aGUgbmV4dCBoZWFkaW5nIHdpdGhvdXQgZmluZGluZyBleGlzdGluZyBUT0MgbGlzdCwgaW5zZXJ0IGF0IHRoZSBzdGFydCBvZiB0aGUgVE9DIHNlY3Rpb25cbiAgICAgICAgICBlbmRpbmdMaW5lID0gc3RhcnRpbmdMaW5lXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRvY0J1aWxkZXIgPT09ICdcXG4nKSB7XG4gICAgICB0b2NCdWlsZGVyID0gJydcbiAgICB9XG5cbiAgICBjb25zdCB0byA9IHtcbiAgICAgIGxpbmU6IGVuZGluZ0xpbmUsXG4gICAgICBjaDogMFxuICAgIH1cbiAgICBjb25zdCByYW5nZSA9IHsgZnJvbSwgdG8gfVxuICAgIHJlcGxhY2VSYW5nZUVjb25vbWljYWxseShlZGl0b3IsIGNoYW5nZXMsIHJhbmdlLCB0b2NCdWlsZGVyKVxuICB9XG5cbiAgLy8gRXhlY3V0ZSB0aGUgdHJhbnNhY3Rpb24gdG8gbWFrZSBhbGwgdGhlIGNoYW5nZXMgYXQgb25jZVxuICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnTnVtYmVyIEhlYWRpbmdzIFBsdWdpbjogQXBwbHlpbmcgdGFibGUgb2YgY29udGVudHMgY2hhbmdlczonLCBjaGFuZ2VzLmxlbmd0aClcbiAgICBlZGl0b3IudHJhbnNhY3Rpb24oe1xuICAgICAgY2hhbmdlczogY2hhbmdlc1xuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUhlYWRpbmdOdW1iZXJpbmcgPSAoXG4gIHZpZXdJbmZvOiBWaWV3SW5mbyB8IHVuZGVmaW5lZFxuKTogdm9pZCA9PiB7XG4gIGlmICghdmlld0luZm8pIHJldHVyblxuICBjb25zdCBoZWFkaW5ncyA9IHZpZXdJbmZvLmRhdGEuaGVhZGluZ3MgPz8gW11cbiAgY29uc3QgZWRpdG9yID0gdmlld0luZm8uZWRpdG9yXG5cbiAgY29uc3QgY2hhbmdlczogRWRpdG9yQ2hhbmdlW10gPSBbXVxuXG4gIGZvciAoY29uc3QgaGVhZGluZyBvZiBoZWFkaW5ncykge1xuICAgIGNvbnN0IHByZWZpeFJhbmdlID0gZmluZEhlYWRpbmdQcmVmaXhSYW5nZShlZGl0b3IsIGhlYWRpbmcsIHsgYWxwaGFiZXQ6IHRydWUsIHJvbWFuOiB0cnVlIH0pXG4gICAgaWYgKHByZWZpeFJhbmdlID09PSB1bmRlZmluZWQpIHJldHVyblxuICAgIGNvbnN0IGhlYWRpbmdIYXNoU3RyaW5nID0gbWFrZUhlYWRpbmdIYXNoU3RyaW5nKGVkaXRvciwgaGVhZGluZylcbiAgICBpZiAoaGVhZGluZ0hhc2hTdHJpbmcgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgcmVwbGFjZVJhbmdlRWNvbm9taWNhbGx5KGVkaXRvciwgY2hhbmdlcywgcHJlZml4UmFuZ2UsIGhlYWRpbmdIYXNoU3RyaW5nICsgJyAnKVxuICB9XG5cbiAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgIGVkaXRvci50cmFuc2FjdGlvbih7XG4gICAgICBjaGFuZ2VzOiBjaGFuZ2VzXG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXBwLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbidcclxuaW1wb3J0IHsgZ2V0Vmlld0luZm8sIGlzVmlld0FjdGl2ZSB9IGZyb20gJy4vYWN0aXZlVmlld0hlbHBlcnMnXHJcbmltcG9ydCB7IGdldEZyb250TWF0dGVyU2V0dGluZ3NPckFsdGVybmF0aXZlLCBzYXZlU2V0dGluZ3NUb0Zyb250TWF0dGVyIH0gZnJvbSAnLi9mcm9udE1hdHRlcidcclxuaW1wb3J0IHsgc2hvd051bWJlcmluZ0RvbmVNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdlcydcclxuaW1wb3J0IHsgcmVtb3ZlSGVhZGluZ051bWJlcmluZywgdXBkYXRlSGVhZGluZ051bWJlcmluZywgdXBkYXRlVGFibGVPZkNvbnRlbnRzIH0gZnJvbSAnLi9udW1iZXJpbmcnXHJcbmltcG9ydCB7IE51bWJlcmluZ1N0eWxlIH0gZnJvbSAnLi9udW1iZXJpbmdUb2tlbnMnXHJcbmltcG9ydCB7IERFRkFVTFRfU0VUVElOR1MsIE51bWJlckhlYWRpbmdzUGx1Z2luU2V0dGluZ3MgfSBmcm9tICcuL3NldHRpbmdzVHlwZXMnXHJcblxyXG5jbGFzcyBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuICBwbHVnaW46IE51bWJlckhlYWRpbmdzUGx1Z2luXHJcblxyXG4gIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IE51bWJlckhlYWRpbmdzUGx1Z2luKSB7XHJcbiAgICBzdXBlcihhcHAsIHBsdWdpbilcclxuICAgIHRoaXMucGx1Z2luID0gcGx1Z2luXHJcbiAgfVxyXG5cclxuICBkaXNwbGF5KCk6IHZvaWQge1xyXG4gICAgY29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpc1xyXG5cclxuICAgIGNvbnRhaW5lckVsLmVtcHR5KClcclxuXHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdOdW1iZXIgSGVhZGluZ3MgLSBTZXR0aW5ncycgfSlcclxuXHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnZGl2JywgeyB0ZXh0OiAnVG8gYWRkIG51bWJlcmluZyB0byB5b3VyIGRvY3VtZW50LCBicmluZyB1cCB0aGUgY29tbWFuZCB3aW5kb3cgKG9uIE1hYywgdHlwZSBDTUQrUCksIGFuZCB0aGVuIHR5cGUgXCJOdW1iZXIgSGVhZGluZ3NcIiB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy4nIH0pXHJcblxyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2JyJywge30pXHJcblxyXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2RpdicsIHsgdGV4dDogJ0lmIHRoZSBkb2N1bWVudCBoYXMgZnJvbnQgbWF0dGVyIGRlZmluZWQgd2l0aCB0aGUgYmVsb3cgc2V0dGluZ3MsIHRoZSBwcm9qZWN0LXdpZGUgc2V0dGluZ3MgZGVmaW5lZCBvbiB0aGlzIHNjcmVlbiB3aWxsIGJlIGlnbm9yZWQuIFlvdSBjYW4gZGVmaW5lIGZyb250IG1hdHRlciBsaWtlIHRoaXM6JyB9KVxyXG5cclxuICAgIGNvbnRhaW5lckVsLmNyZWF0ZUVsKCdwcmUnLCB7XHJcbiAgICAgIHRleHQ6IGAgICAgLS0tXHJcbiAgICBhbGlhczpcclxuICAgIC0gRXhhbXBsZSBBbGlhc1xyXG4gICAgdGFnczpcclxuICAgIC0gZXhhbXBsZS10YWdcclxuICAgIG51bWJlciBoZWFkaW5nczogZmlyc3QtbGV2ZWwgMSwgc3RhcnQtYXQgMiwgbWF4IDYsIDEuMSwgYXV0bywgY29udGVudHMgXnRvY1xyXG4gICAgLS0tYFxyXG4gICAgfSlcclxuXHJcbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnZGl2Jywge1xyXG4gICAgICB0ZXh0OiBgXHJcbiAgICAgIFRoZSAnbnVtYmVyIGhlYWRpbmdzJyBmcm9udCBtYXR0ZXIga2V5IGlzIHVzZWQgdG8gc3RvcmUgbnVtYmVyaW5nIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZSBmaWxlLiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvcHRpb25zXHJcbiAgICAgIGluIHRoZSB2YWx1ZSB0byB0aGUgcmlnaHQgb2YgdGhlIGNvbG9uLCBzZXBhcmF0ZWQgYnkgY29tbWFzLlxyXG4gICAgYFxyXG4gICAgfSlcclxuXHJcbiAgICBjb25zdCB1bCA9IGNvbnRhaW5lckVsLmNyZWF0ZUVsKCd1bCcsIHt9KVxyXG5cclxuICAgIGNvbnN0IGxpMCA9IHVsLmNyZWF0ZUVsKCdsaScsIHt9KVxyXG4gICAgbGkwLmNyZWF0ZUVsKCdiJywgeyB0ZXh0OiAnQXV0b21hdGljIG51bWJlcmluZycgfSlcclxuICAgIGxpMC5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogJzogSWYgXFwnYXV0b1xcJyBhcHBlYXJzLCB0aGUgZG9jdW1lbnQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IG51bWJlcmVkLicgfSlcclxuXHJcbiAgICBjb25zdCBsaTEgPSB1bC5jcmVhdGVFbCgnbGknLCB7fSlcclxuICAgIGxpMS5jcmVhdGVFbCgnYicsIHsgdGV4dDogJ0ZpcnN0IGxldmVsIHRvIG51bWJlcicgfSlcclxuICAgIGxpMS5jcmVhdGVFbCgnc3BhbicsIHsgdGV4dDogJzogSWYgXFwnZmlyc3QtbGV2ZWwgMlxcJyBhcHBlYXJzLCB0aGUgbnVtYmVyaW5nIHdpbGwgc3RhcnQgYXQgdGhlIHNlY29uZCBsZXZlbCcgfSlcclxuXHJcbiAgICBjb25zdCBsaTIgPSB1bC5jcmVhdGVFbCgnbGknLCB7fSlcclxuICAgIGxpMi5jcmVhdGVFbCgnYicsIHsgdGV4dDogJ1N0YXJ0IG51bWJlcmluZyBmaXJzdCBoZWFkaW5nIGF0JyB9KVxyXG4gICAgbGkyLmNyZWF0ZUVsKCdzcGFuJywgeyB0ZXh0OiAnOiBJZiBcXCdzdGFydC1hdCBDXFwnIGFwcGVhcnMsIHRoZSBudW1iZXJpbmcgb2YgdGhlIGZpcnN0IGxldmVsIHdpbGwgc3RhcnQgYXQgQywgaW5zdGVhZCBvZiBBJyB9KVxyXG5cclxuICAgIGNvbnN0IGxpMyA9IHVsLmNyZWF0ZUVsKCdsaScsIHt9KVxyXG4gICAgbGkzLmNyZWF0ZUVsKCdiJywgeyB0ZXh0OiAnTWF4aW11bSBsZXZlbCB0byBudW1iZXInIH0pXHJcbiAgICBsaTMuY3JlYXRlRWwoJ3NwYW4nLCB7IHRleHQ6ICc6IElmIFxcJ21heCA2XFwnIGFwcGVhcnMsIHRoZSBoZWFkaW5ncyBhYm92ZSBsZXZlbCA2IHdpbGwgYmUgc2tpcHBlZC4nIH0pXHJcblxyXG4gICAgY29uc3QgbGk0ID0gdWwuY3JlYXRlRWwoJ2xpJywge30pXHJcbiAgICBsaTQuY3JlYXRlRWwoJ2InLCB7IHRleHQ6ICdUYWJsZSBvZiBjb250ZW50cyBhbmNob3InIH0pXHJcbiAgICBsaTQuY3JlYXRlRWwoJ3NwYW4nLCB7IHRleHQ6ICc6IElmIFxcJ2NvbnRlbnRzIF50b2NcXCcgYXBwZWFycywgdGhlIGhlYWRpbmcgdGhhdCBlbmRzIHdpdGggdGhlIGFuY2hvciBedG9jIHdpbGwgaGF2ZSBhIHRhYmxlIG9mIGNvbnRlbnRzIGluc2VydGVkIGJlbmVhdGggaXQuJyB9KVxyXG5cclxuICAgIGNvbnN0IGxpNSA9IHVsLmNyZWF0ZUVsKCdsaScsIHt9KVxyXG4gICAgbGk1LmNyZWF0ZUVsKCdiJywgeyB0ZXh0OiAnTnVtYmVyaW5nIHN0eWxlJyB9KVxyXG4gICAgbGk1LmNyZWF0ZUVsKCdzcGFuJywge1xyXG4gICAgICB0ZXh0OiBgOlxyXG4gICAgICBBIHN0eWxlIHRleHQgbGlrZSAnMS4xJywgJ0EuMScsIG9yICdfLjEuMScgdGVsbHMgdGhlIHBsdWdpbiBob3cgdG8gZm9ybWF0IHRoZSBoZWFkaW5ncy5cclxuICAgICAgSWYgYSBzdHlsZSBzdHJpbmcgZW5kcyB3aXRoICcuJyAoYSBkb3QpLCAnOicgKGEgY29sb24pLCAnLScgKGEgZGFzaCksICfigJQnIChhbiBlbWRhc2gpLCBvciAnKScgKGEgcmlnaHQgcGFyZW50aGVzaXMpLCB0aGUgaGVhZGluZyBudW1iZXJzIHdpbGwgYmUgc2VwYXJhdGVkIGZyb20gdGhlIGhlYWRpbmcgdGl0bGVcclxuICAgICAgd2l0aCB0aGF0IHN5bWJvbC5gXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHVsMyA9IGxpNS5jcmVhdGVFbCgndWwnLCB7fSlcclxuICAgIHVsMy5jcmVhdGVFbCgnbGknLCB7XHJcbiAgICAgIHRleHQ6IGAgICAgICBcclxuICAgICAgRm9yIGV4YW1wbGUsICcxLjEnIG1lYW5zIGJvdGggdG9wIGxldmVsIGFuZCBvdGhlciBoZWFkaW5ncyB3aWxsIGJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gJzEnLlxyXG4gICAgYFxyXG4gICAgfSlcclxuICAgIHVsMy5jcmVhdGVFbCgnbGknLCB7XHJcbiAgICAgIHRleHQ6IGAgICAgICBcclxuICAgICAgRm9yIGV4YW1wbGUsICdBLjEnIG1lYW5zIHRvcCBsZXZlbCBoZWFkaW5ncyB3aWxsIGJlIG51bWJlcmVkIHN0YXJ0aW5nIGZyb20gJ0EnLlxyXG4gICAgYFxyXG4gICAgfSlcclxuICAgIHVsMy5jcmVhdGVFbCgnbGknLCB7XHJcbiAgICAgIHRleHQ6IGAgICAgICBcclxuICAgICAgRm9yIGV4YW1wbGUsICdfLkEuMScgbWVhbnMgdG9wIGxldmVsIGhlYWRpbmdzIHdpbGwgTk9UIGJlIG51bWJlcmVkLCBidXQgdGhlIG5leHQgbGV2ZWxzIHdpbGwgYmUgbnVtYmVyZWQgd2l0aCBsZXR0ZXJzIGFuZCBudW1iZXJzLlxyXG4gICAgYFxyXG4gICAgfSlcclxuICAgIHVsMy5jcmVhdGVFbCgnbGknLCB7XHJcbiAgICAgIHRleHQ6IGAgICAgICBcclxuICAgICAgRm9yIGV4YW1wbGUsICcxLjE6JyBtZWFucyBoZWFkaW5ncyB3aWxsIGxvb2sgbGlrZSAnIyMgMi40OiBFeGFtcGxlIEhlYWRpbmcnXHJcbiAgICBgXHJcbiAgICB9KVxyXG4gICAgdWwzLmNyZWF0ZUVsKCdsaScsIHtcclxuICAgICAgdGV4dDogYCAgICAgIFxyXG4gICAgICBGb3IgZXhhbXBsZSwgJ0EuMS0nIG1lYW5zIGhlYWRpbmdzIHdpbGwgbG9vayBsaWtlICcjIyBCLjUtIEV4YW1wbGUgSGVhZGluZydcclxuICAgIGBcclxuICAgIH0pXHJcbiAgICB1bDMuY3JlYXRlRWwoJ2xpJywge1xyXG4gICAgICB0ZXh0OiBgICAgICAgXHJcbiAgICAgIEZvciBleGFtcGxlLCAnSS5BIOKAlCcgbWVhbnMgaGVhZGluZ3Mgd2lsbCBsb29rIGxpa2UgJyMjIElWLkEg4oCUIEV4YW1wbGUgSGVhZGluZycgKHdpdGggUm9tYW4gbnVtZXJhbHMpXHJcbiAgICBgXHJcbiAgICB9KVxyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnU2tpcCB0b3AgaGVhZGluZyBsZXZlbCcpXHJcbiAgICAgIC5zZXREZXNjKCdJZiBzZWxlY3RlZCwgbnVtYmVyaW5nIHdpbGwgbm90IGJlIGFwcGxpZWQgdG8gdGhlIHRvcCBoZWFkaW5nIGxldmVsLicpXHJcbiAgICAgIC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZVxyXG4gICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5za2lwVG9wTGV2ZWwpXHJcbiAgICAgICAgLnNldFRvb2x0aXAoJ1NraXAgdG9wIGhlYWRpbmcgbGV2ZWwnKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnNraXBUb3BMZXZlbCA9IHZhbHVlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgIH0pKVxyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnRmlyc3QgaGVhZGluZyBsZXZlbCcpXHJcbiAgICAgIC5zZXREZXNjKCdGaXJzdCBoZWFkaW5nIGxldmVsIHRvIG51bWJlci4nKVxyXG4gICAgICAuYWRkU2xpZGVyKHNsaWRlciA9PiBzbGlkZXJcclxuICAgICAgICAuc2V0TGltaXRzKDEsIDYsIDEpXHJcbiAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZpcnN0TGV2ZWwpXHJcbiAgICAgICAgLnNldER5bmFtaWNUb29sdGlwKClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5maXJzdExldmVsID0gdmFsdWVcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgfSkpXHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKCdTdGFydCBudW1iZXJpbmcgYXQnKVxyXG4gICAgICAuc2V0RGVzYygnU3RhcnQgbnVtYmVyaW5nIHRoZSBmaXJzdCBoZWFkaW5nIGxldmVsIGZyb20gdGhpcyB2YWx1ZS4nKVxyXG4gICAgICAuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RhcnRBdClcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdGFydEF0ID0gdmFsdWVcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgfSkpXHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKCdNYXhpbXVtIGhlYWRpbmcgbGV2ZWwnKVxyXG4gICAgICAuc2V0RGVzYygnTWF4aW11bSBoZWFkaW5nIGxldmVsIHRvIG51bWJlci4nKVxyXG4gICAgICAuYWRkU2xpZGVyKHNsaWRlciA9PiBzbGlkZXJcclxuICAgICAgICAuc2V0TGltaXRzKDEsIDYsIDEpXHJcbiAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm1heExldmVsKVxyXG4gICAgICAgIC5zZXREeW5hbWljVG9vbHRpcCgpXHJcbiAgICAgICAgLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MubWF4TGV2ZWwgPSB2YWx1ZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKClcclxuICAgICAgICB9KSlcclxuXHJcbiAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuICAgICAgLnNldE5hbWUoJ1N0eWxlIGZvciBsZXZlbCAxIGhlYWRpbmdzJylcclxuICAgICAgLnNldERlc2MoJ0RlZmluZXMgdGhlIG51bWJlcmluZyBzdHlsZSBmb3IgbGV2ZWwgb25lIGhlYWRpbmdzLiBWYWxpZCB2YWx1ZXMgYXJlIDEgKGZvciBudW1iZXJzKSBvciBBIChmb3IgY2FwaXRhbCBsZXR0ZXJzKSBvciBJIChmb3IgUm9tYW4gbnVtZXJhbHMpLicpXHJcbiAgICAgIC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG4gICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdHlsZUxldmVsMSlcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdHlsZUxldmVsMSA9IHZhbHVlIGFzIE51bWJlcmluZ1N0eWxlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgIH0pKVxyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnU3R5bGUgZm9yIGxvd2VyIGxldmVsIGhlYWRpbmdzIChiZWxvdyBsZXZlbCAxKScpXHJcbiAgICAgIC5zZXREZXNjKCdEZWZpbmVzIHRoZSBudW1iZXJpbmcgc3R5bGUgZm9yIGhlYWRpbmdzIGJlbG93IGxldmVsIG9uZS4gVmFsaWQgdmFsdWVzIGFyZSAxIChmb3IgbnVtYmVycykgb3IgQSAoZm9yIGNhcGl0YWwgbGV0dGVycykgb3IgSSAoZm9yIFJvbWFuIG51bWVyYWxzKS4nKVxyXG4gICAgICAuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc3R5bGVMZXZlbE90aGVyKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnN0eWxlTGV2ZWxPdGhlciA9IHZhbHVlIGFzIE51bWJlcmluZ1N0eWxlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgIH0pKVxyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnQXV0b21hdGljIG51bWJlcmluZycpXHJcbiAgICAgIC5zZXREZXNjKCdUdXJucyBvbiBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGRvY3VtZW50cy4nKVxyXG4gICAgICAuYWRkVG9nZ2xlKHRvZ2dsZSA9PiB0b2dnbGVcclxuICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0bylcclxuICAgICAgICAuc2V0VG9vbHRpcCgnVHVybiBvbiBhdXRvbWF0aWMgbnVtYmVyaW5nJylcclxuICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvID0gdmFsdWVcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgfSkpXHJcblxyXG4gICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcbiAgICAgIC5zZXROYW1lKCdTZXBhcmF0b3Igc3R5bGUnKVxyXG4gICAgICAuc2V0RGVzYygnRGVmaW5lcyB0aGUgc2VwYXJhdG9yIHN0eWxlIGJldHdlZW4gdGhlIGhlYWRpbmcgbnVtYmVyIGFuZCB0aGUgaGVhZGluZyB0ZXh0LiBWYWxpZCB2YWx1ZXMgYXJlIDogKGNvbG9uKSBvciAuIChkb3QpIG9yIC0gKGRhc2gpIG9yIOKAlCAoZW1kYXNoKSBvciApIChhIHJpZ2h0IHBhcmVudGhlc2lzKS4gWW91IGNhbiBhbHNvIGxlYXZlIGl0IGJsYW5rIGZvciBubyBzZXBhcmF0b3IsIG9yIGhhdmUgYSBzcGFjZSBiZWZvcmUgdGhlIHNlcGFyYXRvci4nKVxyXG4gICAgICAuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2VwYXJhdG9yKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLnNlcGFyYXRvciA9IHZhbHVlXHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKVxyXG4gICAgICAgIH0pKVxyXG5cclxuICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG4gICAgICAuc2V0TmFtZSgnVGFibGUgb2YgQ29udGVudHMgQW5jaG9yJylcclxuICAgICAgLnNldERlc2MoJ0FuY2hvciB3aGljaCBsYWJlbHMgdGhlIGhlYWRlciB3aGVyZSBhIHRhYmxlIG9mIGNvbnRlbnRzIHNob3VsZCBiZSBpbnNlcnRlZC4gVGhlIGFuY2hvciBzaG91bGQgYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGhlYWRlci4gRm9yIGV4YW1wbGUsIF50b2MuJylcclxuICAgICAgLmFkZFRleHQodGV4dCA9PiB0ZXh0XHJcbiAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbnRlbnRzKVxyXG4gICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmNvbnRlbnRzID0gdmFsdWVcclxuICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpXHJcbiAgICAgICAgfSkpXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOdW1iZXJIZWFkaW5nc1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcbiAgc2V0dGluZ3MhOiBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdzXHJcblxyXG4gIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICBjb25zb2xlLmluZm8oJ0xvYWRpbmcgTnVtYmVyIEhlYWRpbmdzIFBsdWdpbiwgdmVyc2lvbiAnICsgdGhpcy5tYW5pZmVzdC52ZXJzaW9uKVxyXG5cclxuICAgIGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKClcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogJ251bWJlci1oZWFkaW5ncy13aXRoLW9wdGlvbnMnLFxyXG4gICAgICBuYW1lOiAnTnVtYmVyIGFsbCBoZWFkaW5ncyBpbiBkb2N1bWVudCAoYW5kIHNob3cgb3B0aW9ucyknLFxyXG4gICAgICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmc6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoY2hlY2tpbmcpIHJldHVybiBpc1ZpZXdBY3RpdmUodGhpcy5hcHApXHJcblxyXG4gICAgICAgIGNvbnN0IHZpZXdJbmZvID0gZ2V0Vmlld0luZm8odGhpcy5hcHApXHJcbiAgICAgICAgaWYgKHZpZXdJbmZvKSB7XHJcbiAgICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldEZyb250TWF0dGVyU2V0dGluZ3NPckFsdGVybmF0aXZlKHZpZXdJbmZvLmRhdGEsIHRoaXMuc2V0dGluZ3MpXHJcbiAgICAgICAgICB1cGRhdGVIZWFkaW5nTnVtYmVyaW5nKHZpZXdJbmZvLCBzZXR0aW5ncylcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBIQUNLOiBUaGlzIG11c3QgaGFwcGVuIGFmdGVyIGEgdGltZW91dCBzbyB0aGF0IHRoZXJlIGlzIHRpbWUgZm9yIHRoZSBlZGl0b3IgdHJhbnNhY3Rpb24gdG8gY29tcGxldGVcclxuICAgICAgICAgICAgY29uc3QgcG9zdE51bWJlcmluZ1ZpZXdJbmZvID0gZ2V0Vmlld0luZm8odGhpcy5hcHApXHJcbiAgICAgICAgICAgIHVwZGF0ZVRhYmxlT2ZDb250ZW50cyhwb3N0TnVtYmVyaW5nVmlld0luZm8sIHNldHRpbmdzKVxyXG4gICAgICAgICAgfSwgMzAwMClcclxuXHJcbiAgICAgICAgICBzaG93TnVtYmVyaW5nRG9uZU1lc3NhZ2UodGhpcy5hcHAsIHNldHRpbmdzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdudW1iZXItaGVhZGluZ3MnLFxyXG4gICAgICBuYW1lOiAnTnVtYmVyIGFsbCBoZWFkaW5ncyBpbiBkb2N1bWVudCcsXHJcbiAgICAgIGNoZWNrQ2FsbGJhY2s6IChjaGVja2luZzogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmIChjaGVja2luZykgcmV0dXJuIGlzVmlld0FjdGl2ZSh0aGlzLmFwcClcclxuXHJcbiAgICAgICAgY29uc3Qgdmlld0luZm8gPSBnZXRWaWV3SW5mbyh0aGlzLmFwcClcclxuICAgICAgICBpZiAodmlld0luZm8pIHtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0RnJvbnRNYXR0ZXJTZXR0aW5nc09yQWx0ZXJuYXRpdmUodmlld0luZm8uZGF0YSwgdGhpcy5zZXR0aW5ncylcclxuICAgICAgICAgIHVwZGF0ZUhlYWRpbmdOdW1iZXJpbmcodmlld0luZm8sIHNldHRpbmdzKVxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIEhBQ0s6IFRoaXMgbXVzdCBoYXBwZW4gYWZ0ZXIgYSB0aW1lb3V0IHNvIHRoYXQgdGhlcmUgaXMgdGltZSBmb3IgdGhlIGVkaXRvciB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZVxyXG4gICAgICAgICAgICBjb25zdCBwb3N0TnVtYmVyaW5nVmlld0luZm8gPSBnZXRWaWV3SW5mbyh0aGlzLmFwcClcclxuICAgICAgICAgICAgdXBkYXRlVGFibGVPZkNvbnRlbnRzKHBvc3ROdW1iZXJpbmdWaWV3SW5mbywgc2V0dGluZ3MpXHJcbiAgICAgICAgICB9LCAzMDAwKVxyXG5cclxuICAgICAgICAgIC8vIE5PVEU6IFRoZSBsaW5lIGJlbG93IGlzIGludGVudGlvbmFsbHkgY29tbWVudGVkIG91dCwgc2luY2UgdGhpcyBjb21tYW5kIGlzIHRoZSBzYW1lIGFzXHJcbiAgICAgICAgICAvLyAgICAgICB0aGUgYWJvdmUgY29tbWFuZCwgZXhjZXB0IGZvciB0aGlzIGxpbmVcclxuICAgICAgICAgIC8vIHNob3dOdW1iZXJpbmdEb25lTWVzc2FnZSh0aGlzLmFwcCwgc2V0dGluZ3MsIHZpZXdJbmZvKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5hZGRDb21tYW5kKHtcclxuICAgICAgaWQ6ICdyZW1vdmUtbnVtYmVyLWhlYWRpbmdzJyxcclxuICAgICAgbmFtZTogJ1JlbW92ZSBudW1iZXJpbmcgZnJvbSBhbGwgaGVhZGluZ3MgaW4gZG9jdW1lbnQnLFxyXG4gICAgICBjaGVja0NhbGxiYWNrOiAoY2hlY2tpbmc6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoY2hlY2tpbmcpIHJldHVybiBpc1ZpZXdBY3RpdmUodGhpcy5hcHApXHJcblxyXG4gICAgICAgIGNvbnN0IHZpZXdJbmZvID0gZ2V0Vmlld0luZm8odGhpcy5hcHApXHJcbiAgICAgICAgcmVtb3ZlSGVhZGluZ051bWJlcmluZyh2aWV3SW5mbylcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmFkZENvbW1hbmQoe1xyXG4gICAgICBpZDogJ3NhdmUtc2V0dGluZ3MtdG8tZnJvbnQtbWF0dGVyJyxcclxuICAgICAgbmFtZTogJ1NhdmUgc2V0dGluZ3MgdG8gZnJvbnQgbWF0dGVyJyxcclxuICAgICAgY2hlY2tDYWxsYmFjazogKGNoZWNraW5nOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGNoZWNraW5nKSByZXR1cm4gaXNWaWV3QWN0aXZlKHRoaXMuYXBwKVxyXG5cclxuICAgICAgICBjb25zdCB2aWV3SW5mbyA9IGdldFZpZXdJbmZvKHRoaXMuYXBwKVxyXG4gICAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpXHJcbiAgICAgICAgaWYgKHZpZXdJbmZvICYmIGZpbGUpIHtcclxuICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0RnJvbnRNYXR0ZXJTZXR0aW5nc09yQWx0ZXJuYXRpdmUodmlld0luZm8uZGF0YSwgdGhpcy5zZXR0aW5ncylcclxuICAgICAgICAgIHNhdmVTZXR0aW5nc1RvRnJvbnRNYXR0ZXIodGhpcy5hcHAuZmlsZU1hbmFnZXIsIGZpbGUsIHNldHRpbmdzKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBOdW1iZXJIZWFkaW5nc1BsdWdpblNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKVxyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJJbnRlcnZhbCh3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICBjb25zdCB2aWV3SW5mbyA9IGdldFZpZXdJbmZvKHRoaXMuYXBwKVxyXG4gICAgICBpZiAodmlld0luZm8pIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdldEZyb250TWF0dGVyU2V0dGluZ3NPckFsdGVybmF0aXZlKHZpZXdJbmZvLmRhdGEsIHRoaXMuc2V0dGluZ3MpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5ncy5hdXRvKSB7XHJcbiAgICAgICAgICB1cGRhdGVIZWFkaW5nTnVtYmVyaW5nKHZpZXdJbmZvLCBzZXR0aW5ncylcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBIQUNLOiBUaGlzIG11c3QgaGFwcGVuIGFmdGVyIGEgdGltZW91dCBzbyB0aGF0IHRoZXJlIGlzIHRpbWUgZm9yIHRoZSBlZGl0b3IgdHJhbnNhY3Rpb24gdG8gY29tcGxldGVcclxuICAgICAgICAgICAgY29uc3QgcG9zdE51bWJlcmluZ1ZpZXdJbmZvID0gZ2V0Vmlld0luZm8odGhpcy5hcHApXHJcbiAgICAgICAgICAgIHVwZGF0ZVRhYmxlT2ZDb250ZW50cyhwb3N0TnVtYmVyaW5nVmlld0luZm8sIHNldHRpbmdzKVxyXG4gICAgICAgICAgfSwgMzAwMClcclxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnTnVtYmVyIEhlYWRpbmdzIFBsdWdpbjogQXV0b21hdGljYWxseSBudW1iZXJlZCBkb2N1bWVudCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCAxMCAqIDEwMDApKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZFNldHRpbmdzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSlcclxuICB9XHJcblxyXG4gIGFzeW5jIHNhdmVTZXR0aW5ncygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncylcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbIk1hcmtkb3duVmlldyIsInJvbWFuaXplIiwiZGVyb21hbml6ZSIsInBhcnNlRnJvbnRNYXR0ZXJFbnRyeSIsIk1vZGFsIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciLCJQbHVnaW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFvR0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWdNRDtBQUN1QixPQUFPLGVBQWUsS0FBSyxVQUFVLEdBQUcsZUFBZSxHQUFHLFVBQVUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFDdkgsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMvQixJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDckY7O0FDNVRBLFNBQVMsYUFBYSxDQUFFLEdBQVEsRUFBQTtJQUM5QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUE7QUFDbEUsSUFBQSxPQUFPLFVBQVUsS0FBVixJQUFBLElBQUEsVUFBVSxjQUFWLFVBQVUsR0FBSSxTQUFTLENBQUE7QUFDaEMsQ0FBQztBQUVLLFNBQVUsWUFBWSxDQUFFLEdBQVEsRUFBQTtBQUNwQyxJQUFBLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFBLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJO0FBQUUsUUFBQSxPQUFPLElBQUksQ0FBQTtBQUM5QyxJQUFBLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFFLEdBQVEsRUFBQTtBQUNoQyxJQUFBLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFBLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7QUFDakMsUUFBQSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ2xFLFFBQUEsT0FBTyxJQUFJLENBQUE7QUFDWixLQUFBO0FBQ0QsSUFBQSxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBUUssU0FBVSxXQUFXLENBQUUsR0FBUSxFQUFBO0FBQ25DLElBQUEsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQUEsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2pDLElBQUEsTUFBTSxNQUFNLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO0FBRXpELElBQUEsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtRQUNoQyxPQUFPO1lBQ0wsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNO1NBQ3pCLENBQUE7QUFDRixLQUFBO0FBRUQsSUFBQSxPQUFPLFNBQVMsQ0FBQTtBQUNsQjs7QUN4Q0EsTUFBTSxTQUFTLEdBQUc7QUFDbEIsRUFBRSxDQUFDLEVBQUUsSUFBSTtBQUNULEVBQUUsRUFBRSxFQUFFLEdBQUc7QUFDVCxFQUFFLENBQUMsRUFBRSxHQUFHO0FBQ1IsRUFBRSxFQUFFLEVBQUUsR0FBRztBQUNULEVBQUUsQ0FBQyxFQUFFLEdBQUc7QUFDUixFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ1IsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNQLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDUixFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ1AsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNQLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDTixFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ1AsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNOLEVBQUM7QUFDRDtBQUNBLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDO0FBQ3ZDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFDO0FBQzVDLE1BQU0sWUFBWTtBQUNsQixFQUFFLHFPQUFvTztBQUN0TztBQUNBLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxLQUFLO0FBQzlCLEVBQUU7QUFDRixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtBQUMvQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssT0FBTztBQUNuQyxJQUFJO0FBQ0osSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDO0FBQ25ELEdBQUc7QUFDSCxFQUFFLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUN2QixJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUM7QUFDbkUsR0FBRztBQUNILEVBQUUsSUFBSSxLQUFLLEdBQUcsR0FBRTtBQUNoQixFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVDLElBQUksT0FBTyxPQUFPLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3RDLE1BQU0sT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUM7QUFDL0IsTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLENBQUMsRUFBQztBQUMxQixLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUUsT0FBTyxLQUFLO0FBQ2QsRUFBQztBQUNEO0FBQ0EsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFRLEtBQUs7QUFDakMsRUFBRSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtBQUNwQyxJQUFJLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUM7QUFDeEMsR0FBRztBQUNILEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDcEMsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDO0FBQzFELEdBQUc7QUFDSCxFQUFFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUU7QUFDMUMsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFDO0FBQ2hCLEVBQUUsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLE9BQU07QUFDcEMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFO0FBQ3RCLElBQUksSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBQztBQUN0RCxJQUFJLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUQsTUFBTSxNQUFNLElBQUksV0FBVTtBQUMxQixLQUFLLE1BQU07QUFDWCxNQUFNLE1BQU0sSUFBSSxXQUFVO0FBQzFCLEtBQUs7QUFDTCxHQUFHO0FBQ0gsRUFBRSxPQUFPLE1BQU07QUFDZixFQUFDO0FBQ0Q7QUFDQSxJQUFBLE1BQWMsR0FBRztBQUNqQixFQUFFLFVBQVU7QUFDWixFQUFFLFFBQVE7QUFDVixFQUFFLFFBQVE7QUFDVixFQUFFLFdBQVc7QUFDYjs7QUNsREE7QUFDTSxTQUFVLGlDQUFpQyxDQUFFLENBQVMsRUFBQTtJQUMxRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUE7QUFDeEIsSUFBQSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDdEIsQ0FBQztBQUVEO0FBQ00sU0FBVSxtQ0FBbUMsQ0FBRSxDQUFTLEVBQUE7SUFDNUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFBO0FBQ3ZCLElBQUEsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRDtBQUNNLFNBQVUsZ0NBQWdDLENBQUUsQ0FBUyxFQUFBO0FBQ3pELElBQUEsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFBO0FBQzdCLElBQUEsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFFLENBQWlCLEVBQUE7SUFDakQsUUFBUSxDQUFDLENBQUMsS0FBSztBQUNiLFFBQUEsS0FBSyxHQUFHO0FBQ04sWUFBQSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDM0IsUUFBQSxLQUFLLEdBQUc7WUFDTixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDaEIsUUFBQSxLQUFLLEdBQUc7WUFDTixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUE7QUFDakIsS0FBQTtBQUNILENBQUM7QUFFSyxTQUFVLDJCQUEyQixDQUFFLEtBQXFCLEVBQUE7QUFDaEUsSUFBQSxRQUFRLEtBQUs7QUFDWCxRQUFBLEtBQUssR0FBRztZQUNOLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQTtBQUNqQyxRQUFBLEtBQUssR0FBRztZQUNOLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUNuQyxRQUFBLEtBQUssR0FBRztZQUNOLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUNwQyxLQUFBO0FBQ0gsQ0FBQztBQUVLLFNBQVUsMEJBQTBCLENBQUUsS0FBcUIsRUFBQTtBQUMvRCxJQUFBLFFBQVEsS0FBSztBQUNYLFFBQUEsS0FBSyxHQUFHO1lBQ04sT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFBO0FBQ2pDLFFBQUEsS0FBSyxHQUFHO1lBQ04sT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFBO0FBQ25DLFFBQUEsS0FBSyxHQUFHO1lBQ04sT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFBO0FBQ3BDLEtBQUE7QUFDSCxDQUFDO0FBRUssU0FBVSxrQkFBa0IsQ0FBRSxDQUFpQixFQUFBO0lBQ25ELFFBQVEsQ0FBQyxDQUFDLEtBQUs7QUFDYixRQUFBLEtBQUssR0FBRztBQUNOLFlBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUE7QUFDM0MsUUFBQSxLQUFLLEdBQUc7QUFDTixZQUFBLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHO2dCQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTs7Z0JBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDbkYsUUFBQSxLQUFLLEdBQUc7QUFDTixZQUFBLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHO2dCQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQTs7QUFDakQsZ0JBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFQyxlQUFRLENBQUNDLGlCQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDdkUsS0FBQTtBQUNILENBQUM7QUFFSyxTQUFVLHNCQUFzQixDQUFFLENBQWlCLEVBQUE7SUFDdkQsUUFBUSxDQUFDLENBQUMsS0FBSztBQUNiLFFBQUEsS0FBSyxHQUFHO0FBQ04sWUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQTtBQUMzQyxRQUFBLEtBQUssR0FBRztBQUNOLFlBQUEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUc7Z0JBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFBOztnQkFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUNuRixRQUFBLEtBQUssR0FBRztBQUNOLFlBQUEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUc7Z0JBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFBOztBQUNqRCxnQkFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUVELGVBQVEsQ0FBQ0MsaUJBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUN2RSxLQUFBO0FBQ0gsQ0FBQztBQUVLLFNBQVUsbUJBQW1CLENBQUUsY0FBZ0MsRUFBQTtJQUNuRSxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUE7QUFFeEIsSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxlQUFlLElBQUksR0FBRyxDQUFBO0FBQ3ZCLFNBQUE7QUFBTSxhQUFBO1lBQ0wsZUFBZSxJQUFJLEdBQUcsQ0FBQTtBQUN2QixTQUFBO1FBQ0QsZUFBZSxJQUFJLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzlELEtBQUE7QUFFRCxJQUFBLE9BQU8sZUFBZSxDQUFBO0FBQ3hCLENBQUM7QUFFZSxTQUFBLHNCQUFzQixDQUFFLG9CQUE0QixFQUFFLEtBQXNCLEVBQUE7SUFDMUYsSUFBSSxvQkFBb0IsS0FBSyxFQUFFO0FBQUUsUUFBQSxPQUFPLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRTFFLElBQUEsSUFBSSw4QkFBOEMsQ0FBQTtBQUVsRCxJQUFBLFFBQVEsS0FBSztBQUNYLFFBQUEsS0FBSyxHQUFHO0FBQ04sWUFBQSxJQUFJLENBQUMsaUNBQWlDLENBQUMsb0JBQW9CLENBQUM7QUFBRSxnQkFBQSxPQUFPLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXZHLFlBQUEsOEJBQThCLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFBO1lBQ3RGLE1BQUs7QUFDUCxRQUFBLEtBQUssR0FBRztBQUNOLFlBQUEsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLG9CQUFvQixDQUFDO0FBQUUsZ0JBQUEsT0FBTywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUV6Ryw4QkFBOEIsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixFQUFFLENBQUE7WUFDNUUsTUFBSztBQUNQLFFBQUEsS0FBSyxHQUFHO0FBQ04sWUFBQSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsb0JBQW9CLENBQUM7QUFBRSxnQkFBQSxPQUFPLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3RHLDhCQUE4QixHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQTtZQUM1RSxNQUFLO0FBQ1IsS0FBQTs7QUFHRCxJQUFBLE9BQU8sc0JBQXNCLENBQUMsOEJBQThCLENBQUMsQ0FBQTtBQUMvRDs7QUN4SE8sTUFBTSxnQkFBZ0IsR0FBMkM7QUFDdEUsSUFBQSxZQUFZLEVBQUUsS0FBSztBQUNuQixJQUFBLFVBQVUsRUFBRSxDQUFDO0FBQ2IsSUFBQSxRQUFRLEVBQUUsQ0FBQztBQUNYLElBQUEsV0FBVyxFQUFFLEdBQUc7QUFDaEIsSUFBQSxlQUFlLEVBQUUsR0FBRztBQUNwQixJQUFBLElBQUksRUFBRSxLQUFLO0FBQ1gsSUFBQSxTQUFTLEVBQUUsRUFBRTtBQUNiLElBQUEsUUFBUSxFQUFFLEVBQUU7QUFDWixJQUFBLE9BQU8sRUFBRSxFQUFFO0NBQ1osQ0FBQTtBQUVLLFNBQVUsMkJBQTJCLENBQUUsQ0FBUyxFQUFBO0lBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHO0FBQUUsUUFBQSxPQUFPLElBQUksQ0FBQTtBQUNwRCxJQUFBLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVLLFNBQVUsMkJBQTJCLENBQUUsQ0FBUyxFQUFBO0FBQ3BELElBQUEsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxJQUFJLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztBQUFFLFFBQUEsT0FBTyxJQUFJLENBQUE7QUFDbEosSUFBQSxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFSyxTQUFVLFdBQVcsQ0FBRSxDQUFVLEVBQUE7QUFDckMsSUFBQSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUs7QUFBRSxRQUFBLE9BQU8sSUFBSSxDQUFBO0FBQzFDLElBQUEsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUssU0FBVSxzQkFBc0IsQ0FBRSxDQUFVLEVBQUE7SUFDaEQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUFFLFFBQUEsT0FBTyxJQUFJLENBQUE7QUFDMUQsSUFBQSxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFSyxTQUFVLGdCQUFnQixDQUFFLENBQVUsRUFBQTtJQUMxQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLFFBQVE7U0FFeEIsQ0FBQyxLQUFLLEVBQUU7QUFDUixZQUFBLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUk7QUFDdkIsWUFBQSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQ3ZCLFlBQUEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSTtBQUN2QixZQUFBLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUk7QUFDdkIsWUFBQSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQ3hCLENBQUE7QUFDTCxDQUFDO0FBRUssU0FBVSxlQUFlLENBQUUsQ0FBVSxFQUFBO0FBQ3pDLElBQUEsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQUUsUUFBQSxPQUFPLElBQUksQ0FBQTtBQUN6RSxJQUFBLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVLLFNBQVUscUJBQXFCLENBQUUsQ0FBUyxFQUFBO0lBQzlDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7QUFBRSxRQUFBLE9BQU8sSUFBSSxDQUFBO0FBQ2xELElBQUEsT0FBTyxLQUFLLENBQUE7QUFDZDs7QUN6RGdCLFNBQUEsOEJBQThCLENBQUUsV0FBbUIsRUFBRSxlQUF1QixFQUFBO0lBQzFGLE9BQU87QUFDTCxRQUFBLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRyxJQUFJLGVBQWUsS0FBSyxHQUFHO0FBQ3hELFFBQUEsS0FBSyxFQUFFLFdBQVcsS0FBSyxHQUFHLElBQUksZUFBZSxLQUFLLEdBQUc7S0FDdEQsQ0FBQTtBQUNILENBQUM7QUFFRDtBQUNBO0FBQ0EsU0FBUyx1QkFBdUIsQ0FBRSxLQUFtQixFQUFBO0FBQ25ELElBQUEsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7O0FBRWpDLFFBQUEsT0FBTywyRkFBMkYsQ0FBQTtBQUNuRyxLQUFBO1NBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTs7QUFFekMsUUFBQSxPQUFPLDZFQUE2RSxDQUFBO0FBQ3JGLEtBQUE7U0FBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFOztBQUV6QyxRQUFBLE9BQU8sbUVBQW1FLENBQUE7QUFDM0UsS0FBQTtTQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTs7QUFFMUMsUUFBQSxPQUFPLHFEQUFxRCxDQUFBO0FBQzdELEtBQUE7QUFFRCxJQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQTtBQUM1RCxDQUFDO0FBRUQ7U0FDZ0IsdUJBQXVCLENBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLEtBQW1CLEVBQUE7QUFDaEcsSUFBQSxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUU1QyxJQUFBLElBQUksQ0FBQyxRQUFRO0FBQUUsUUFBQSxPQUFPLFNBQVMsQ0FBQTtJQUUvQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXJDLElBQUEsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O1FBRW5DLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFBO0FBQzVELFFBQUEsT0FBTyxTQUFTLENBQUE7QUFDakIsS0FBQTtBQUVELElBQUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUE7QUFFdkMsSUFBQSxNQUFNLElBQUksR0FBRztBQUNYLFFBQUEsSUFBSSxFQUFFLFVBQVU7QUFDaEIsUUFBQSxFQUFFLEVBQUUsQ0FBQztLQUNOLENBQUE7QUFDRCxJQUFBLE1BQU0sRUFBRSxHQUFHO0FBQ1QsUUFBQSxJQUFJLEVBQUUsVUFBVTtRQUNoQixFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU07S0FDakIsQ0FBQTtBQUVELElBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQTtBQUNyQixDQUFDO0FBRWUsU0FBQSx1Q0FBdUMsQ0FBRSxJQUFZLEVBQUUsUUFBc0MsRUFBQTs7SUFFM0csSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFDL0IsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDaEQsSUFBQSxJQUFJLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLEVBQUU7QUFDL0MsUUFBQSxRQUFRLENBQUMsU0FBUyxHQUFHLHlCQUF5QixDQUFBO1FBQzlDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDekMsS0FBQTtBQUFNLFNBQUE7UUFDTCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNoRCxRQUFBLElBQUksZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsRUFBRTtBQUMvQyxZQUFBLFFBQVEsQ0FBQyxTQUFTLEdBQUcseUJBQXlCLENBQUE7WUFDOUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN6QyxTQUFBO0FBQU0sYUFBQTtBQUNMLFlBQUEsUUFBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7QUFDeEIsU0FBQTtBQUNGLEtBQUE7O0lBR0QsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ25ELElBQUksdUJBQXVCLEdBQUcsQ0FBQyxDQUFBOztBQUcvQixJQUFBLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTs7QUFFcEQsUUFBQSxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUM1Qix1QkFBdUIsR0FBRyxDQUFDLENBQUE7QUFDNUIsS0FBQTtBQUFNLFNBQUE7QUFDTCxRQUFBLFFBQVEsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFBO0FBQzlCLEtBQUE7QUFFRCxJQUFBLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyx1QkFBdUIsSUFBSSxDQUFDLEVBQUU7QUFDckQsUUFBQSxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtBQUN4RCxRQUFBLElBQUksMkJBQTJCLENBQUMsV0FBVyxDQUFDLEVBQUU7QUFDNUMsWUFBQSxRQUFRLENBQUMsV0FBVyxHQUFHLFdBQTZCLENBQUE7QUFDckQsU0FBQTtRQUNELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUNoRSxRQUFBLElBQUksMkJBQTJCLENBQUMsZUFBZSxDQUFDLEVBQUU7QUFDaEQsWUFBQSxRQUFRLENBQUMsZUFBZSxHQUFHLGVBQWlDLENBQUE7QUFDN0QsU0FBQTtBQUNGLEtBQUE7QUFFRCxJQUFBLE9BQU8sUUFBUSxDQUFBO0FBQ2pCOztBQ3JHQSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUE7QUFDNUIsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUE7QUFDMUMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUE7QUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUE7QUFFcEMsU0FBUywrQkFBK0IsQ0FBQyxFQUFvQixFQUFBO0lBQzNELE1BQU0sS0FBSyxHQUFHQyw4QkFBcUIsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtBQUMxRCxJQUFBLElBQUksS0FBSyxFQUFFO0FBQ1QsUUFBQSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNwQyxRQUFBLElBQUksUUFBUSxHQUFBLE1BQUEsQ0FBQSxNQUFBLENBQUEsRUFBQSxFQUFzQyxnQkFBZ0IsQ0FBRSxDQUFBO0FBRXBFLFFBQUEsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUU7QUFDeEIsWUFBQSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7QUFDL0IsWUFBQSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxTQUFRO1lBRXRDLElBQUksV0FBVyxLQUFLLGFBQWEsRUFBRTs7QUFFakMsZ0JBQUEsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7QUFDckIsYUFBQTtBQUFNLGlCQUFBLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFOztBQUV2RCxnQkFBQSxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUN0RSxnQkFBQSxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDM0IsZ0JBQUEsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM3QixvQkFBQSxRQUFRLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQTtBQUN4QixpQkFBQTtBQUNGLGFBQUE7QUFBTSxpQkFBQSxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsRUFBRTs7QUFFckQsZ0JBQUEsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDcEUsZ0JBQUEsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQzNCLGdCQUFBLElBQUksc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDN0Isb0JBQUEsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUE7QUFDdEIsaUJBQUE7QUFDRixhQUFBO0FBQU0saUJBQUEsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7O0FBRXBELGdCQUFBLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2pFLGdCQUFBLElBQUksMkJBQTJCLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDdEMsb0JBQUEsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7QUFDekIsaUJBQUE7QUFDRixhQUFBO0FBQU0saUJBQUEsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7Z0JBQ3BELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFBRSxTQUFROztBQUVoRSxnQkFBQSxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtBQUN0RSxnQkFBQSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMvQixvQkFBQSxRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQTtBQUMvQixpQkFBQTtBQUNGLGFBQUE7QUFBTSxpQkFBQTs7QUFFTCxnQkFBQSxRQUFRLEdBQUcsdUNBQXVDLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQzFFLGFBQUE7QUFDRixTQUFBO0FBRUQsUUFBQSxPQUFPLFFBQVEsQ0FBQTtBQUNoQixLQUFBO0FBRUQsSUFBQSxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRU0sTUFBTSxtQ0FBbUMsR0FBRyxDQUNqRCxFQUFFLFdBQVcsRUFBa0IsRUFDL0IsbUJBQWlELEtBQ2pCOztJQUNoQyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7QUFDN0IsUUFBQSxNQUFNLG1CQUFtQixHQUFHLCtCQUErQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3hFLElBQUksbUJBQW1CLEtBQUssU0FBUztBQUFFLFlBQUEsT0FBTyxtQkFBbUIsQ0FBQTs7QUFJakUsUUFBQSxNQUFNLGlCQUFpQixHQUFHLENBQUEsRUFBQSxHQUFBQSw4QkFBcUIsQ0FBQyxXQUFXLEVBQUUsZ0NBQWdDLENBQUMsTUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBSUEsOEJBQXFCLENBQUMsV0FBVyxFQUFFLGlDQUFpQyxDQUFDLENBQUE7QUFDdkssUUFBQSxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUMsR0FBRyxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUE7QUFFMUcsUUFBQSxNQUFNLGFBQWEsR0FBRyxDQUFBLEVBQUEsR0FBQUEsOEJBQXFCLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLE1BQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLEdBQUlBLDhCQUFxQixDQUFDLFdBQVcsRUFBRSw0QkFBNEIsQ0FBQyxDQUFBO0FBQ3pKLFFBQUEsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDLEdBQUcsYUFBYSxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQTtBQUVyRyxRQUFBLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUM3QixDQUFBLEVBQUEsR0FBQUEsOEJBQXFCLENBQUMsV0FBVyxFQUFFLCtCQUErQixDQUFDLE1BQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLEdBQ25FQSw4QkFBcUIsQ0FBQyxXQUFXLEVBQUUsZ0NBQWdDLENBQUMsQ0FDckUsQ0FBQTtBQUNELFFBQUEsTUFBTSxXQUFXLEdBQW1CLDJCQUEyQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsZ0JBQWtDLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFBO0FBRXhKLFFBQUEsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQ2pDLENBQUEsRUFBQSxHQUFBQSw4QkFBcUIsQ0FBQyxXQUFXLEVBQUUsbUNBQW1DLENBQUMsTUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsR0FDdkVBLDhCQUFxQixDQUFDLFdBQVcsRUFBRSxvQ0FBb0MsQ0FBQyxDQUN6RSxDQUFBO0FBQ0QsUUFBQSxNQUFNLGVBQWUsR0FBbUIsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxvQkFBc0MsR0FBRyxtQkFBbUIsQ0FBQyxlQUFlLENBQUE7QUFFeEssUUFBQSxNQUFNLFNBQVMsR0FBRyxDQUFBLEVBQUEsR0FBQUEsOEJBQXFCLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDLE1BQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLEdBQUlBLDhCQUFxQixDQUFDLFdBQVcsRUFBRSx1QkFBdUIsQ0FBQyxDQUFBO0FBQzNJLFFBQUEsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUE7UUFFMUUsT0FBWSxNQUFBLENBQUEsTUFBQSxDQUFBLE1BQUEsQ0FBQSxNQUFBLENBQUEsRUFBQSxFQUFBLG1CQUFtQixDQUFFLEVBQUEsRUFBQSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUEsQ0FBQTtBQUM5RixLQUFBO0FBQU0sU0FBQTtBQUNMLFFBQUEsT0FBTyxtQkFBbUIsQ0FBQTtBQUMzQixLQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBRUQsU0FBUyxpQ0FBaUMsQ0FBQyxRQUFzQyxFQUFBO0FBQy9FLElBQUEsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLEdBQUcsRUFBRSxDQUFBO0FBQzlDLElBQUEsTUFBTSxjQUFjLEdBQUcsQ0FBQSxZQUFBLEVBQWUsUUFBUSxDQUFDLFVBQVUsSUFBSSxDQUFBO0FBQzdELElBQUEsTUFBTSxPQUFPLEdBQUcsQ0FBQSxJQUFBLEVBQU8sUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFBO0lBQzVDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUEsU0FBQSxFQUFZLFFBQVEsQ0FBQyxRQUFRLENBQUEsRUFBQSxDQUFJLEdBQUcsRUFBRSxDQUFBO0FBQy9HLElBQUEsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFDNUQsSUFBQSxNQUFNLFNBQVMsR0FBRyxDQUFBLEVBQUcsa0JBQWtCLENBQUEsRUFBRyxRQUFRLENBQUMsV0FBVyxDQUFJLENBQUEsRUFBQSxRQUFRLENBQUMsZUFBZSxDQUFBLEVBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFBO0FBQ2pILElBQUEsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sS0FBSyxFQUFFLEdBQUcsQ0FBWSxTQUFBLEVBQUEsUUFBUSxDQUFDLE9BQU8sQ0FBQSxFQUFBLENBQUksR0FBRyxFQUFFLENBQUE7SUFDbkYsT0FBTyxRQUFRLEdBQUcsY0FBYyxHQUFHLE9BQU8sR0FBRyxZQUFZLEdBQUcsV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUNyRixDQUFDO0FBRU0sTUFBTSx5QkFBeUIsR0FBRyxDQUN2QyxXQUF3QixFQUN4QixJQUFXLEVBQ1gsUUFBc0MsS0FDOUI7QUFDUixJQUFBLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFHO0FBQ2pELFFBQUEsTUFBTSxDQUFDLEdBQVcsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDN0QsUUFBQSxXQUFXLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDcEMsS0FBQyxDQUFDLENBQUE7QUFDSixDQUFDOztBQzlHRCxNQUFNLGtCQUFtQixTQUFRQyxjQUFLLENBQUE7SUFHcEMsV0FBWSxDQUFBLEdBQVEsRUFBRSxNQUEyQixFQUFBO1FBQy9DLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNWLFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7S0FDckI7SUFFRCxNQUFNLEdBQUE7QUFDSixRQUFBLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFBO0FBQ25DLFFBQUEsT0FBTyxDQUFDLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO0FBRTNELFFBQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQ3hELFFBQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUE7QUFFcEUsUUFBQSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxvRUFBb0UsRUFBRSxHQUFHLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFBO0FBRTFJLFFBQUEsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxrQ0FBa0MsRUFBRSxDQUFDLENBQUE7UUFFbEcsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUMzRCxRQUFBLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDdEIsUUFBQSxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBYyxLQUFJO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtBQUNaLFlBQUEsT0FBTyxFQUFFLENBQUE7QUFDWCxTQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDNUQsUUFBQSxTQUFTLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7QUFDbkQsUUFBQSxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBYyxLQUFJO0FBQ3hDLFlBQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7QUFDWixZQUFBLE9BQU8sRUFBRSxDQUFBO0FBQ1gsU0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDbkUsUUFBQSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsMERBQTBELENBQUMsQ0FBQTtBQUNwRixRQUFBLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQWMsS0FBSTtBQUMvQyxZQUFBLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO0FBQ1osWUFBQSxPQUFPLEVBQUUsQ0FBQTtBQUNYLFNBQUMsQ0FBQyxDQUFBO0tBQ0g7SUFFRCxPQUFPLEdBQUE7QUFDTCxRQUFBLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ25DLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNqQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7S0FDaEI7QUFDRixDQUFBO0FBRWUsU0FBQSx3QkFBd0IsQ0FBQyxHQUFRLEVBQUUsUUFBc0MsRUFBQTtBQUN2RixJQUFBLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxpQkFBMEIsS0FBVTtBQUNoRSxRQUFBLE1BQU0sZUFBZSxHQUFBLE1BQUEsQ0FBQSxNQUFBLENBQUEsRUFBQSxFQUFRLFFBQVEsQ0FBRSxDQUFBO0FBQ3ZDLFFBQUEsSUFBSSxpQkFBaUI7QUFBRSxZQUFBLGVBQWUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFBO1FBQ2xELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUE7QUFDMUMsUUFBQSxJQUFJLElBQUksRUFBRTtZQUNSLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFBO0FBQ2xFLFNBQUE7QUFDSCxLQUFDLENBQUE7QUFDRCxJQUFBLE1BQU0sTUFBTSxHQUF3QjtBQUNsQyxRQUFBLE9BQU8sRUFBRSxDQUFBOztBQUVlLDJCQUFBLENBQUE7QUFDeEIsUUFBQSxtQkFBbUIsRUFBRSxDQUFBLHdCQUFBLEVBQTJCLFFBQVEsQ0FBQyxZQUFZLENBQUE7QUFDbEQscUJBQUEsRUFBQSxRQUFRLENBQUMsVUFBVSxDQUFBO0FBQ04sa0NBQUEsRUFBQSxRQUFRLENBQUMsT0FBTyxDQUFBO0FBQzNCLHVCQUFBLEVBQUEsUUFBUSxDQUFDLFFBQVEsQ0FBQTtBQUNaLDRCQUFBLEVBQUEsUUFBUSxDQUFDLFdBQVcsQ0FBQTtBQUNBLGdEQUFBLEVBQUEsUUFBUSxDQUFDLGVBQWUsQ0FBQTtBQUM3RCxXQUFBLEVBQUEsUUFBUSxDQUFDLFNBQVMsQ0FBQTs0QkFDSCxRQUFRLENBQUMsUUFBUSxDQUFFLENBQUE7UUFDM0Msb0JBQW9CO0tBQ3JCLENBQUE7QUFFRCxJQUFBLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFBO0FBQ3JDLElBQUEsSUFBSSxJQUFJLEVBQUU7UUFDUixJQUFJLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUMzQyxLQUFBO0FBQ0g7O0FDbkZBLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFBO0FBRWhDLFNBQVMscUJBQXFCLENBQUUsTUFBYyxFQUFFLE9BQXFCLEVBQUE7SUFDbkUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFBO0FBQzNCLElBQUEsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ3JFLElBQUEsSUFBSSxDQUFDLGlCQUFpQjtBQUFFLFFBQUEsT0FBTyxTQUFTLENBQUE7SUFFeEMsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzlDLElBQUEsSUFBSSxDQUFDLE9BQU87QUFBRSxRQUFBLE9BQU8sU0FBUyxDQUFBO0FBRTlCLElBQUEsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTs7UUFFeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsR0FBRyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQTtBQUNyRSxRQUFBLE9BQU8sU0FBUyxDQUFBO0FBQ2pCLEtBQUE7QUFFRCxJQUFBLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUN4QixJQUFBLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBO0FBQ3pCLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFFLE1BQWMsRUFBRSxPQUFxQixFQUFFLEtBQW1CLEVBQUE7SUFDekYsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDM0MsT0FBTyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO0FBQzdELENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFFLEtBQWEsRUFBQTtBQUM1QyxJQUFBLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN2QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLFFBQUEsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNoQixZQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ25CLFNBQUE7QUFDRixLQUFBO0FBQ0QsSUFBQSxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtBQUNyQixDQUFDO0FBRUQ7QUFDQSxTQUFTLGNBQWMsQ0FBRSxDQUFlLEVBQUUsUUFBc0MsRUFBRSxtQkFBMkIsRUFBQTtBQUMzRyxJQUFBLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUE7QUFDdEIsSUFBQSxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU5QyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUE7SUFDckIsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUE7QUFDdEMsSUFBQSxLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxZQUFZLElBQUksSUFBSSxDQUFBO0FBQ3JCLEtBQUE7QUFFRCxJQUFBLE1BQU0sU0FBUyxHQUFHLENBQUEsR0FBQSxFQUFNLElBQUksQ0FBSSxDQUFBLEVBQUEsU0FBUyxJQUFJLENBQUE7QUFFN0MsSUFBQSxPQUFPLFlBQVksR0FBRyxvQkFBb0IsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFBO0FBQzlELENBQUM7QUFFRDtBQUNBLFNBQVMsd0JBQXdCLENBQUUsTUFBYyxFQUFFLE9BQXVCLEVBQUUsS0FBa0IsRUFBRSxJQUFZLEVBQUE7QUFDMUcsSUFBQSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRTFELElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtRQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ1gsWUFBQSxJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDYixTQUFBLENBQUMsQ0FBQTtBQUNILEtBQUE7QUFDSCxDQUFDO0FBRU0sTUFBTSxzQkFBc0IsR0FBRyxDQUNwQyxRQUE4QixFQUM5QixRQUFzQyxLQUM5Qjs7QUFDUixJQUFBLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTTtJQUNyQixNQUFNLFFBQVEsR0FBRyxDQUFBLEVBQUEsR0FBQSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsTUFBSSxJQUFBLElBQUEsRUFBQSxLQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFFLENBQUE7QUFDN0MsSUFBQSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFBO0FBQzlCLElBQUEsTUFBTSxZQUFZLEdBQUcsOEJBQThCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7SUFFbkcsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFBO0FBRXJCLElBQUEsSUFBSSxjQUFjLEdBQXFCLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQTtBQUV2RyxJQUFBLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUU7QUFDM0IsUUFBQSxhQUFhLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQTtBQUNwQyxLQUFBO1NBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFO1FBQ2hDLGFBQWEsR0FBRyxDQUFDLENBQUE7QUFDbEIsS0FBQTtJQUVELE1BQU0sT0FBTyxHQUFtQixFQUFFLENBQUE7QUFFbEMsSUFBQSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRTs7QUFHOUIsUUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBOztBQUczQixRQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLEtBQUssTUFBTSxRQUFRLENBQUMsWUFBWSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTs7OztBQUszRSxZQUFBLGNBQWMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7QUFFakYsWUFBQSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO0FBQzNCLGdCQUFBLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFBO0FBQ3BDLGFBQUE7aUJBQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFO2dCQUNoQyxhQUFhLEdBQUcsQ0FBQyxDQUFBO0FBQ2xCLGFBQUE7WUFDRCxTQUFRO0FBQ1QsU0FBQTs7UUFHRCxJQUFJLEtBQUssS0FBSyxhQUFhLEVBQUU7QUFDM0IsWUFBQSxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDOUIsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNuQixjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDM0MsYUFBQTtBQUNGLFNBQUE7YUFBTSxJQUFJLEtBQUssR0FBRyxhQUFhLEVBQUU7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFBO0FBQ3JCLGFBQUE7QUFDRCxZQUFBLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUM5QixJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ25CLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMzQyxhQUFBO0FBQ0YsU0FBQTthQUFNLElBQUksS0FBSyxHQUFHLGFBQWEsRUFBRTtZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxjQUFjLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO0FBQzFFLGFBQUE7QUFDRixTQUFBOztRQUdELGFBQWEsR0FBRyxLQUFLLENBQUE7QUFFckIsUUFBQSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFOztZQUU3QixTQUFRO0FBQ1QsU0FBQTs7UUFHRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3pFLElBQUksV0FBVyxLQUFLLFNBQVM7WUFBRSxPQUFNO1FBQ3JDLE1BQU0saUJBQWlCLEdBQUcscUJBQXFCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ2hFLElBQUksaUJBQWlCLEtBQUssU0FBUztZQUFFLE9BQU07QUFDM0MsUUFBQSxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQTtBQUN4RCxRQUFBLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixHQUFHLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFBO0FBQ3BILEtBQUE7O0FBR0QsSUFBQSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztRQUV0QixPQUFPLENBQUMsR0FBRyxDQUFDLDhEQUE4RCxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMzRixNQUFNLENBQUMsV0FBVyxDQUFDO0FBQ2pCLFlBQUEsT0FBTyxFQUFFLE9BQU87QUFDakIsU0FBQSxDQUFDLENBQUE7QUFDSCxLQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBRU0sTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxRQUE4QixFQUM5QixRQUFzQyxLQUM5Qjs7QUFDUixJQUFBLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTTtJQUNyQixNQUFNLFFBQVEsR0FBRyxDQUFBLEVBQUEsR0FBQSxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsTUFBSSxJQUFBLElBQUEsRUFBQSxLQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQUEsR0FBQSxFQUFFLENBQUE7QUFDN0MsSUFBQSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFBO0FBRTlCLElBQUEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFNO0FBRXJELElBQUEsSUFBSSxVQUFvQyxDQUFBO0lBQ3hDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQTtJQUNyQixNQUFNLE9BQU8sR0FBbUIsRUFBRSxDQUFBOztJQUdsQyxJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtBQUMzQixJQUFBLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDdkIsUUFBQSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0FBQ3hDLEtBQUE7QUFFRCxJQUFBLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFOzs7UUFJOUIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDL0MsVUFBVSxHQUFHLE9BQU8sQ0FBQTtBQUNyQixTQUFBO0FBRUQ7Ozs7QUFJRTtRQUVGLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUE7QUFDdkUsUUFBQSxVQUFVLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQTtBQUM5QixLQUFBOztBQUdELElBQUEsSUFBSSxVQUFVLEVBQUU7QUFDZCxRQUFBLE1BQU0sSUFBSSxHQUFHO1lBQ1gsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ3hDLFlBQUEsRUFBRSxFQUFFLENBQUM7U0FDTixDQUFBOztRQUdELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUE7UUFDdkQsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFBO1FBQzdCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQTtBQUNyQixRQUFBLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQzFDLFFBQVMsVUFBVSxFQUFFLEVBQUU7WUFDckIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUN2QyxZQUFBLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLEVBQUU7O2dCQUV2RCxVQUFVLEdBQUcsWUFBWSxDQUFBO2dCQUN6QixNQUFLO0FBQ04sYUFBQTtBQUNELFlBQUEsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO0FBQ3hDLFlBQUEsSUFBSSxTQUFTLEVBQUU7QUFDYixnQkFBQSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQztvQkFBRSxNQUFLO0FBQzVELGdCQUFBLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7b0JBQUUsTUFBSztBQUMzQyxhQUFBO0FBQU0saUJBQUE7QUFDTCxnQkFBQSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsRUFBRTtvQkFDcEQsU0FBUyxHQUFHLElBQUksQ0FBQTtBQUNqQixpQkFBQTtBQUFNLHFCQUFBLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTs7b0JBRTFDLFVBQVUsR0FBRyxZQUFZLENBQUE7b0JBQ3pCLE1BQUs7QUFDTixpQkFBQTtBQUFNLHFCQUFBO29CQUNMLFNBQVE7QUFDVCxpQkFBQTtBQUNGLGFBQUE7QUFDRixTQUFBO1FBRUQsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLFVBQVUsR0FBRyxFQUFFLENBQUE7QUFDaEIsU0FBQTtBQUVELFFBQUEsTUFBTSxFQUFFLEdBQUc7QUFDVCxZQUFBLElBQUksRUFBRSxVQUFVO0FBQ2hCLFlBQUEsRUFBRSxFQUFFLENBQUM7U0FDTixDQUFBO0FBQ0QsUUFBQSxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQTtRQUMxQix3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQTtBQUM3RCxLQUFBOztBQUdELElBQUEsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs7UUFFdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2REFBNkQsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDMUYsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUNqQixZQUFBLE9BQU8sRUFBRSxPQUFPO0FBQ2pCLFNBQUEsQ0FBQyxDQUFBO0FBQ0gsS0FBQTtBQUNILENBQUMsQ0FBQTtBQUVNLE1BQU0sc0JBQXNCLEdBQUcsQ0FDcEMsUUFBOEIsS0FDdEI7O0FBQ1IsSUFBQSxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU07SUFDckIsTUFBTSxRQUFRLEdBQUcsQ0FBQSxFQUFBLEdBQUEsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLE1BQUksSUFBQSxJQUFBLEVBQUEsS0FBQSxLQUFBLENBQUEsR0FBQSxFQUFBLEdBQUEsRUFBRSxDQUFBO0FBQzdDLElBQUEsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQTtJQUU5QixNQUFNLE9BQU8sR0FBbUIsRUFBRSxDQUFBO0FBRWxDLElBQUEsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUU7QUFDOUIsUUFBQSxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM1RixJQUFJLFdBQVcsS0FBSyxTQUFTO1lBQUUsT0FBTTtRQUNyQyxNQUFNLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNoRSxJQUFJLGlCQUFpQixLQUFLLFNBQVM7WUFBRSxPQUFNO1FBQzNDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxDQUFBO0FBQ2hGLEtBQUE7QUFFRCxJQUFBLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUNqQixZQUFBLE9BQU8sRUFBRSxPQUFPO0FBQ2pCLFNBQUEsQ0FBQyxDQUFBO0FBQ0gsS0FBQTtBQUNILENBQUM7O0FDOVFELE1BQU0sOEJBQStCLFNBQVFDLHlCQUFnQixDQUFBO0lBRzNELFdBQVksQ0FBQSxHQUFRLEVBQUUsTUFBNEIsRUFBQTtBQUNoRCxRQUFBLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDbEIsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtLQUNyQjtJQUVELE9BQU8sR0FBQTtBQUNMLFFBQUEsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUU1QixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7UUFFbkIsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyxDQUFBO1FBRWxFLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLDJKQUEySixFQUFFLENBQUMsQ0FBQTtBQUVsTSxRQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRTlCLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLDRLQUE0SyxFQUFFLENBQUMsQ0FBQTtBQUVuTixRQUFBLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO0FBQzFCLFlBQUEsSUFBSSxFQUFFLENBQUE7Ozs7OztBQU1KLE9BQUEsQ0FBQTtBQUNILFNBQUEsQ0FBQyxDQUFBO0FBRUYsUUFBQSxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtBQUMxQixZQUFBLElBQUksRUFBRSxDQUFBOzs7QUFHUCxJQUFBLENBQUE7QUFDQSxTQUFBLENBQUMsQ0FBQTtRQUVGLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRXpDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2pDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQTtRQUNsRCxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxxRUFBcUUsRUFBRSxDQUFDLENBQUE7UUFFckcsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDakMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLDhFQUE4RSxFQUFFLENBQUMsQ0FBQTtRQUU5RyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNqQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxrQ0FBa0MsRUFBRSxDQUFDLENBQUE7UUFDL0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsNkZBQTZGLEVBQUUsQ0FBQyxDQUFBO1FBRTdILE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2pDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUMsQ0FBQTtRQUN0RCxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxxRUFBcUUsRUFBRSxDQUFDLENBQUE7UUFFckcsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDakMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLCtIQUErSCxFQUFFLENBQUMsQ0FBQTtRQUUvSixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNqQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUE7QUFDOUMsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtBQUNuQixZQUFBLElBQUksRUFBRSxDQUFBOzs7QUFHWSx1QkFBQSxDQUFBO0FBQ25CLFNBQUEsQ0FBQyxDQUFBO1FBRUYsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDbEMsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUNqQixZQUFBLElBQUksRUFBRSxDQUFBOztBQUVQLElBQUEsQ0FBQTtBQUNBLFNBQUEsQ0FBQyxDQUFBO0FBQ0YsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUNqQixZQUFBLElBQUksRUFBRSxDQUFBOztBQUVQLElBQUEsQ0FBQTtBQUNBLFNBQUEsQ0FBQyxDQUFBO0FBQ0YsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUNqQixZQUFBLElBQUksRUFBRSxDQUFBOztBQUVQLElBQUEsQ0FBQTtBQUNBLFNBQUEsQ0FBQyxDQUFBO0FBQ0YsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUNqQixZQUFBLElBQUksRUFBRSxDQUFBOztBQUVQLElBQUEsQ0FBQTtBQUNBLFNBQUEsQ0FBQyxDQUFBO0FBQ0YsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUNqQixZQUFBLElBQUksRUFBRSxDQUFBOztBQUVQLElBQUEsQ0FBQTtBQUNBLFNBQUEsQ0FBQyxDQUFBO0FBQ0YsUUFBQSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtBQUNqQixZQUFBLElBQUksRUFBRSxDQUFBOztBQUVQLElBQUEsQ0FBQTtBQUNBLFNBQUEsQ0FBQyxDQUFBO1FBRUYsSUFBSUMsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDckIsT0FBTyxDQUFDLHdCQUF3QixDQUFDO2FBQ2pDLE9BQU8sQ0FBQyxzRUFBc0UsQ0FBQztBQUMvRSxhQUFBLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTTthQUN4QixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO2FBQzNDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQztBQUNwQyxhQUFBLFFBQVEsQ0FBQyxDQUFPLEtBQUssS0FBSSxTQUFBLENBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLGFBQUE7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQTtBQUN6QyxZQUFBLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtTQUNqQyxDQUFBLENBQUMsQ0FBQyxDQUFBO1FBRVAsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDckIsT0FBTyxDQUFDLHFCQUFxQixDQUFDO2FBQzlCLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQztBQUN6QyxhQUFBLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTTtBQUN4QixhQUFBLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3pDLGFBQUEsaUJBQWlCLEVBQUU7QUFDbkIsYUFBQSxRQUFRLENBQUMsQ0FBTyxLQUFLLEtBQUksU0FBQSxDQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxhQUFBO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUE7QUFDdkMsWUFBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDakMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtRQUVQLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQzthQUM3QixPQUFPLENBQUMsMERBQTBELENBQUM7QUFDbkUsYUFBQSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7YUFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUN0QyxhQUFBLFFBQVEsQ0FBQyxDQUFPLEtBQUssS0FBSSxTQUFBLENBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLGFBQUE7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtBQUNwQyxZQUFBLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtTQUNqQyxDQUFBLENBQUMsQ0FBQyxDQUFBO1FBRVAsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDckIsT0FBTyxDQUFDLHVCQUF1QixDQUFDO2FBQ2hDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQztBQUMzQyxhQUFBLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTTtBQUN4QixhQUFBLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLGFBQUEsaUJBQWlCLEVBQUU7QUFDbkIsYUFBQSxRQUFRLENBQUMsQ0FBTyxLQUFLLEtBQUksU0FBQSxDQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxhQUFBO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7QUFDckMsWUFBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDakMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtRQUVQLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQzthQUNyQyxPQUFPLENBQUMsNElBQTRJLENBQUM7QUFDckosYUFBQSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7YUFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUMxQyxhQUFBLFFBQVEsQ0FBQyxDQUFPLEtBQUssS0FBSSxTQUFBLENBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLGFBQUE7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEtBQXVCLENBQUE7QUFDMUQsWUFBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDakMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtRQUVQLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxnREFBZ0QsQ0FBQzthQUN6RCxPQUFPLENBQUMsa0pBQWtKLENBQUM7QUFDM0osYUFBQSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7YUFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztBQUM5QyxhQUFBLFFBQVEsQ0FBQyxDQUFPLEtBQUssS0FBSSxTQUFBLENBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLGFBQUE7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLEtBQXVCLENBQUE7QUFDOUQsWUFBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDakMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtRQUVQLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQzthQUM5QixPQUFPLENBQUMsNENBQTRDLENBQUM7QUFDckQsYUFBQSxTQUFTLENBQUMsTUFBTSxJQUFJLE1BQU07YUFDeEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzthQUNuQyxVQUFVLENBQUMsNkJBQTZCLENBQUM7QUFDekMsYUFBQSxRQUFRLENBQUMsQ0FBTyxLQUFLLEtBQUksU0FBQSxDQUFBLElBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxLQUFBLENBQUEsRUFBQSxhQUFBO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUE7QUFDakMsWUFBQSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDakMsQ0FBQSxDQUFDLENBQUMsQ0FBQTtRQUVQLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3JCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzthQUMxQixPQUFPLENBQUMsOFBBQThQLENBQUM7QUFDdlEsYUFBQSxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7YUFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUN4QyxhQUFBLFFBQVEsQ0FBQyxDQUFPLEtBQUssS0FBSSxTQUFBLENBQUEsSUFBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLEtBQUEsQ0FBQSxFQUFBLGFBQUE7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtBQUN0QyxZQUFBLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtTQUNqQyxDQUFBLENBQUMsQ0FBQyxDQUFBO1FBRVAsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDckIsT0FBTyxDQUFDLDBCQUEwQixDQUFDO2FBQ25DLE9BQU8sQ0FBQyxvSkFBb0osQ0FBQztBQUM3SixhQUFBLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSTthQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLGFBQUEsUUFBUSxDQUFDLENBQU8sS0FBSyxLQUFJLFNBQUEsQ0FBQSxJQUFBLEVBQUEsS0FBQSxDQUFBLEVBQUEsS0FBQSxDQUFBLEVBQUEsYUFBQTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO0FBQ3JDLFlBQUEsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO1NBQ2pDLENBQUEsQ0FBQyxDQUFDLENBQUE7S0FDUjtBQUNGLENBQUE7QUFFb0IsTUFBQSxvQkFBcUIsU0FBUUMsZUFBTSxDQUFBO0lBR2hELE1BQU0sR0FBQTs7O1lBRVYsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBRWhGLFlBQUEsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7WUFFekIsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNkLGdCQUFBLEVBQUUsRUFBRSw4QkFBOEI7QUFDbEMsZ0JBQUEsSUFBSSxFQUFFLG9EQUFvRDtBQUMxRCxnQkFBQSxhQUFhLEVBQUUsQ0FBQyxRQUFpQixLQUFJO0FBQ25DLG9CQUFBLElBQUksUUFBUTtBQUFFLHdCQUFBLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFFM0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN0QyxvQkFBQSxJQUFJLFFBQVEsRUFBRTtBQUNaLHdCQUFBLE1BQU0sUUFBUSxHQUFHLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ2xGLHdCQUFBLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTt3QkFDMUMsVUFBVSxDQUFDLE1BQUs7OzRCQUVkLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNuRCw0QkFBQSxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQTt5QkFDdkQsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUVSLHdCQUFBLHdCQUF3QixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDN0MscUJBQUE7QUFFRCxvQkFBQSxPQUFPLEtBQUssQ0FBQTtpQkFDYjtBQUNGLGFBQUEsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNkLGdCQUFBLEVBQUUsRUFBRSxpQkFBaUI7QUFDckIsZ0JBQUEsSUFBSSxFQUFFLGlDQUFpQztBQUN2QyxnQkFBQSxhQUFhLEVBQUUsQ0FBQyxRQUFpQixLQUFJO0FBQ25DLG9CQUFBLElBQUksUUFBUTtBQUFFLHdCQUFBLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFFM0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN0QyxvQkFBQSxJQUFJLFFBQVEsRUFBRTtBQUNaLHdCQUFBLE1BQU0sUUFBUSxHQUFHLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ2xGLHdCQUFBLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTt3QkFDMUMsVUFBVSxDQUFDLE1BQUs7OzRCQUVkLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNuRCw0QkFBQSxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQTt5QkFDdkQsRUFBRSxJQUFJLENBQUMsQ0FBQTs7OztBQUtULHFCQUFBO0FBRUQsb0JBQUEsT0FBTyxLQUFLLENBQUE7aUJBQ2I7QUFDRixhQUFBLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDZCxnQkFBQSxFQUFFLEVBQUUsd0JBQXdCO0FBQzVCLGdCQUFBLElBQUksRUFBRSxnREFBZ0Q7QUFDdEQsZ0JBQUEsYUFBYSxFQUFFLENBQUMsUUFBaUIsS0FBSTtBQUNuQyxvQkFBQSxJQUFJLFFBQVE7QUFBRSx3QkFBQSxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBRTNDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBRWhDLG9CQUFBLE9BQU8sSUFBSSxDQUFBO2lCQUNaO0FBQ0YsYUFBQSxDQUFDLENBQUE7WUFFRixJQUFJLENBQUMsVUFBVSxDQUFDO0FBQ2QsZ0JBQUEsRUFBRSxFQUFFLCtCQUErQjtBQUNuQyxnQkFBQSxJQUFJLEVBQUUsK0JBQStCO0FBQ3JDLGdCQUFBLGFBQWEsRUFBRSxDQUFDLFFBQWlCLEtBQUk7QUFDbkMsb0JBQUEsSUFBSSxRQUFRO0FBQUUsd0JBQUEsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUUzQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUN0QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtvQkFDL0MsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0FBQ3BCLHdCQUFBLE1BQU0sUUFBUSxHQUFHLG1DQUFtQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO3dCQUNsRix5QkFBeUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDaEUscUJBQUE7QUFFRCxvQkFBQSxPQUFPLEtBQUssQ0FBQTtpQkFDYjtBQUNGLGFBQUEsQ0FBQyxDQUFBO0FBRUYsWUFBQSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksOEJBQThCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBRXRFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQUs7Z0JBQzVDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDdEMsZ0JBQUEsSUFBSSxRQUFRLEVBQUU7QUFDWixvQkFBQSxNQUFNLFFBQVEsR0FBRyxtQ0FBbUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFFbEYsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO0FBQ2pCLHdCQUFBLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTt3QkFDMUMsVUFBVSxDQUFDLE1BQUs7OzRCQUVkLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNuRCw0QkFBQSxxQkFBcUIsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQTt5QkFDdkQsRUFBRSxJQUFJLENBQUMsQ0FBQTs7QUFFUix3QkFBQSxPQUFPLENBQUMsR0FBRyxDQUFDLHlEQUF5RCxDQUFDLENBQUE7QUFDdkUscUJBQUE7QUFDRixpQkFBQTtBQUNILGFBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtTQUNmLENBQUEsQ0FBQTtBQUFBLEtBQUE7SUFFSyxZQUFZLEdBQUE7O0FBQ2hCLFlBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO1NBQzNFLENBQUEsQ0FBQTtBQUFBLEtBQUE7SUFFSyxZQUFZLEdBQUE7O1lBQ2hCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7U0FDbkMsQ0FBQSxDQUFBO0FBQUEsS0FBQTtBQUNGOzs7OyJ9