1726 lines
338 KiB
JavaScript
1726 lines
338 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');
|
|
var state = require('@codemirror/state');
|
|
var view = require('@codemirror/view');
|
|
|
|
/*! *****************************************************************************
|
|
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());
|
|
});
|
|
}
|
|
|
|
const DEFAULT_SETTINGS = {
|
|
moveIntoMath_toggle: true,
|
|
autoCloseMath_toggle: true,
|
|
autoCloseRound_toggle: true,
|
|
autoCloseSquare_toggle: true,
|
|
autoCloseCurly_toggle: true,
|
|
addAlignBlock_toggle: true,
|
|
addAlignBlock_parameter: "align*",
|
|
autoAlignSymbols: "= > < \\le \\ge \\neq \\approx",
|
|
addCasesBlock_toggle: true,
|
|
shiftEnter_toggle: false,
|
|
addMatrixBlock_toggle: true,
|
|
addMatrixBlock_parameter: "pmatrix",
|
|
autoFraction_toggle: true,
|
|
autoLargeBracket_toggle: true,
|
|
autoSumLimit_toggle: true,
|
|
autoEncloseSup_toggle: true,
|
|
autoEncloseSub_toggle: true,
|
|
encloseSelection_toggle: true,
|
|
customShorthand_toggle: true,
|
|
customShorthand_parameter: "bi:\\binom{#cursor}{#tab};\nsq:\\sqrt{};\nbb:\\mathbb{};\nbf:\\mathbf{};\nte:\\text{};\ninf:\\infty;\n" +
|
|
"cd:\\cdot;\nqu:\\quad;\nti:\\times;\n" +
|
|
"al:\\alpha;\nbe:\\beta;\nga:\\gamma;\nGa:\\Gamma;\n" +
|
|
"de:\\delta;\nDe:\\Delta;\nep:\\epsilon;\nze:\\zeta;\n" +
|
|
"et:\\eta;\nth:\\theta;\nTh:\\Theta;\nio:\\iota;\n" +
|
|
"ka:\\kappa;\nla:\\lambda;\nLa:\\Lambda;\nmu:\\mu;\n" +
|
|
"nu:\\nu;\nxi:\\xi;\nXi:\\Xi;\npi:\\pi;\nPi:\\Pi;\n" +
|
|
"rh:\\rho;\nsi:\\sigma;\nSi:\\Sigma;\nta:\\tau;\n" +
|
|
"up:\\upsilon;\nUp:\\Upsilon;\nph:\\phi;\nPh:\\Phi;\nch:\\chi;\n" +
|
|
"ps:\\psi;\nPs:\\Psi;\nom:\\omega;\nOm:\\Omega"
|
|
};
|
|
class QuickLatexPlugin extends obsidian.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.vimAllow_autoCloseMath = true;
|
|
this.makeExtensionThing = () => state.Prec.high(view.keymap.of([
|
|
{
|
|
key: '$',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (editor.getSelection().length > 0) {
|
|
// enclose selected text
|
|
if (this.settings.encloseSelection_toggle) {
|
|
const anchor = editor.getCursor("anchor");
|
|
const head = editor.getCursor("head");
|
|
editor.replaceSelection(`$${editor.getSelection()}$`);
|
|
if (anchor.line > head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
else if (anchor.line < head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch });
|
|
}
|
|
else {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
else {
|
|
// close math symbol
|
|
const position = editor.getCursor();
|
|
const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next2_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev_char != "$" && next_char == "$") {
|
|
if (next2_char == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
return true;
|
|
}
|
|
else {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
// auto close math
|
|
if (this.settings.autoCloseMath_toggle && this.vimAllow_autoCloseMath) {
|
|
editor.replaceSelection("$");
|
|
}
|
|
// move into math
|
|
if (this.settings.moveIntoMath_toggle) {
|
|
const position = editor.getCursor();
|
|
const t = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const t2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const t_2 = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
if (t == '$' && t2 != '$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
else if (t_2 == '$$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'Tab',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
// Tab shortcut for matrix block
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter + '}', "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter + '}', "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
let end_text = "";
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
end_text = end_matrix[i];
|
|
break;
|
|
}
|
|
}
|
|
const position = editor.getCursor();
|
|
const prev3_char = editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
if (state) {
|
|
if (prev3_char == ' & ') {
|
|
editor.replaceRange('', { line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
editor.setCursor({ line: position.line, ch: position.ch + end_text.length - 3 });
|
|
return true;
|
|
}
|
|
else {
|
|
editor.replaceSelection(' & ');
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// Tab shortcut for cases block
|
|
if (this.settings.addCasesBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
const position = editor.getCursor();
|
|
const prev3_char = editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
const next_line = editor.getLine(position.line + 1);
|
|
if (prev3_char == ' & ' && next_line == '\\end{cases}') {
|
|
editor.replaceRange('', { line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch });
|
|
editor.setCursor({ line: position.line + 1, ch: next_line.length });
|
|
return true;
|
|
}
|
|
else {
|
|
editor.replaceSelection(' & ');
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// Tab to go to next #tab
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const tab_position = current_line.indexOf("#tab", position.ch);
|
|
if (tab_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: tab_position }, { line: position.line, ch: tab_position + 4 });
|
|
editor.setCursor({ line: position.line, ch: tab_position });
|
|
return true;
|
|
}
|
|
}
|
|
// Tab out of $
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const next_2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const end_pos = editor.getLine(position.line).length;
|
|
const next_line = editor.getLine(position.line + 1);
|
|
if (next_2 == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
return true;
|
|
}
|
|
else if (position.ch == end_pos && next_line == "$$") {
|
|
editor.setCursor({ line: position.line + 1, ch: next_line.length });
|
|
return true;
|
|
}
|
|
else if (next_2[0] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
// Tab to next close bracket
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const following_text = editor.getRange({ line: position.line, ch: position.ch + 1 }, { line: position.line, ch: current_line.length });
|
|
const close_symbols = ['}', ']', ')', '$'];
|
|
for (let i = 0; i < following_text.length; i++) {
|
|
if (close_symbols.contains(following_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: position.ch + i + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// Tab out of align block
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const end_pos = editor.getLine(position.line).length;
|
|
const next_line = editor.getLine(position.line + 1);
|
|
if (position.ch == end_pos && next_line == '\\end{' + this.settings.addAlignBlock_parameter + '}') {
|
|
editor.setCursor({ line: position.line + 1, ch: next_line.length });
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'Shift-Tab',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const preceding_text = editor.getRange({ line: position.line, ch: 0 }, { line: position.line, ch: position.ch });
|
|
const close_symbols = ['}', ']', ')'];
|
|
for (let i = preceding_text.length; i >= 0; i--) {
|
|
if (close_symbols.contains(preceding_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: i });
|
|
return true;
|
|
}
|
|
else if (position.ch - i > 1 && preceding_text[i] == "$") {
|
|
editor.setCursor({ line: position.line, ch: i + 1 });
|
|
return true;
|
|
}
|
|
else if (preceding_text.slice(-2) == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 2 });
|
|
return true;
|
|
}
|
|
else if (preceding_text[-1] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'Space',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (!this.settings.autoFraction_toggle &&
|
|
!this.settings.autoLargeBracket_toggle &&
|
|
!this.settings.autoEncloseSup_toggle &&
|
|
!this.settings.autoEncloseSub_toggle &&
|
|
!this.settings.customShorthand_toggle)
|
|
return false;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const last_dollar = current_line.lastIndexOf('$', position.ch - 1);
|
|
// check for custom shorthand
|
|
if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.shorthand_array.length; i++) {
|
|
keyword_length = this.shorthand_array[i][0].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else if (keyword_length == position.ch) {
|
|
keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword[0].toLowerCase() == keyword[0].toUpperCase() ||
|
|
keyword[0] == "@") {
|
|
if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) &&
|
|
this.shorthand_array[i][1] != keyword) {
|
|
const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0;
|
|
const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor");
|
|
editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch });
|
|
if (set_cursor_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position + 7 });
|
|
editor.setCursor({ line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position });
|
|
}
|
|
else if (this.shorthand_array[i][1].slice(-2) == "{}") {
|
|
editor.setCursor({ line: position.line,
|
|
ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash });
|
|
}
|
|
else ;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// find last unbracketed subscript within last 10 characters and perform autoEncloseSub
|
|
// ignore expression that contain + - * / ^
|
|
const last_math = current_line.lastIndexOf('$', position.ch - 1);
|
|
if (this.settings.autoEncloseSub_toggle) {
|
|
let last_subscript = current_line.lastIndexOf('_', position.ch);
|
|
if (last_subscript != -1 && last_subscript > last_math) {
|
|
const letter_after_subscript = editor.getRange({ line: position.line, ch: last_subscript + 1 }, { line: position.line, ch: last_subscript + 2 });
|
|
if (letter_after_subscript != "{" &&
|
|
(position.ch - last_subscript) <= 10) {
|
|
editor.replaceSelection("}");
|
|
editor.replaceRange("{", { line: position.line, ch: last_subscript + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
// retrieve the last unbracketed superscript
|
|
let last_superscript = current_line.lastIndexOf('^', position.ch);
|
|
while (last_superscript != -1) {
|
|
const two_letters_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 3 });
|
|
if (two_letters_after_superscript[0] == '{' || two_letters_after_superscript == ' {') {
|
|
last_superscript = current_line.lastIndexOf('^', last_superscript - 1);
|
|
}
|
|
else if (last_superscript < last_math) {
|
|
last_superscript = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// retrieve the last divide symbol
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 2);
|
|
while (last_divide != -1) {
|
|
const around_divide = editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide + 2 });
|
|
if (around_divide[0] == ' ' && around_divide[2] == ' ') {
|
|
last_divide = current_line.lastIndexOf('^', last_divide - 1);
|
|
}
|
|
else if (last_divide < last_math) {
|
|
last_divide = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// perform autoEncloseSup
|
|
if (this.settings.autoEncloseSup_toggle) {
|
|
if (last_superscript > last_divide) {
|
|
// if any brackets from last sup to cursor still unclosed, dont do autoEncloseSup yet
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_superscript)[0])) {
|
|
return this.autoEncloseSup(editor, event, last_superscript);
|
|
}
|
|
}
|
|
}
|
|
// perform autoFraction
|
|
if (this.settings.autoFraction_toggle && !this.withinText(editor, last_divide)) {
|
|
if (last_divide > last_dollar) {
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
// if any brackets in denominator still unclosed, dont do autoFraction yet
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_divide)[0])) {
|
|
return this.autoFractionCM6(editor, last_superscript);
|
|
}
|
|
}
|
|
}
|
|
// perform autoLargeBracket
|
|
if (this.settings.autoLargeBracket_toggle) {
|
|
let symbol_before = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
if (symbol_before == ')' || symbol_before == ']') {
|
|
return this.autoLargeBracket(editor, event);
|
|
}
|
|
}
|
|
// perform autoAlign
|
|
if (this.autoAlign_array) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.autoAlign_array.length; i++) {
|
|
keyword_length = this.autoAlign_array[i].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword == this.autoAlign_array[i]) {
|
|
editor.replaceRange('&', { line: position.line, ch: position.ch - keyword_length });
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
key: 'Enter',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.settings.addAlignBlock_toggle && this.settings.shiftEnter_toggle == false) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
editor.replaceSelection('\\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
if (this.settings.addCasesBlock_toggle && this.settings.shiftEnter_toggle == false) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' \\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter + '}', "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter + '}', "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
break;
|
|
}
|
|
}
|
|
if (state) {
|
|
editor.replaceSelection(' \\\\ ');
|
|
return true;
|
|
}
|
|
}
|
|
// double enter for $$
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const prev2_Char = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
const next2_Char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev2_Char == "$$" && next2_Char == "$$") {
|
|
editor.replaceSelection('\n');
|
|
editor.setCursor(position);
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'Shift-Enter',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.settings.addAlignBlock_toggle && this.settings.shiftEnter_toggle == true) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
editor.replaceSelection('\\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
if (this.settings.addCasesBlock_toggle && this.settings.shiftEnter_toggle == true) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' \\\\\n');
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
},
|
|
{
|
|
key: '{',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseCurly_toggle) {
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('{}');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: '[',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseSquare_toggle) {
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('[]');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: '(',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('()');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: '}',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
const position = editor.getCursor();
|
|
const end = editor.getLine(position.line).length;
|
|
const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
if (!this.unclosed_bracket(editor, "{", "}", end, 0)[0] &&
|
|
!this.unclosed_bracket(editor, "{", "}", end, 0, false)[0] &&
|
|
next_sym == "}") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: ']',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
const position = editor.getCursor();
|
|
const end = editor.getLine(position.line).length;
|
|
const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
if (!this.unclosed_bracket(editor, "[", "]", end, 0)[0] &&
|
|
!this.unclosed_bracket(editor, "[", "]", end, 0, false)[0] &&
|
|
next_sym == "]") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: ')',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
const position = editor.getCursor();
|
|
const end = editor.getLine(position.line).length;
|
|
const next_sym = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
if (!this.unclosed_bracket(editor, "(", ")", end, 0)[0] &&
|
|
!this.unclosed_bracket(editor, "(", ")", end, 0, false)[0] &&
|
|
next_sym == ")") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
{
|
|
key: 'm',
|
|
run: () => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return false;
|
|
const editor = view.editor;
|
|
if (!this.withinMath(editor))
|
|
return false;
|
|
const position = editor.getCursor();
|
|
if (!this.settings.autoSumLimit_toggle)
|
|
return;
|
|
if (this.withinMath(editor)) {
|
|
if (editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch }) == '\\su') {
|
|
editor.replaceSelection('m\\limits');
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
},
|
|
]));
|
|
this.handleVimModeChange = (modeObj) => {
|
|
if (!modeObj || modeObj.mode === 'insert')
|
|
this.vimAllow_autoCloseMath = true;
|
|
else
|
|
this.vimAllow_autoCloseMath = false;
|
|
};
|
|
this.handleKeyDown = (cm, event) => {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
const editor = view.editor;
|
|
if (['$', ' ', 'Enter', 'Tab'].contains(event.key)) {
|
|
switch (event.key) {
|
|
case '$':
|
|
if (editor.getSelection().length > 0) {
|
|
if (this.settings.encloseSelection_toggle) {
|
|
const anchor = editor.getCursor("anchor");
|
|
const head = editor.getCursor("head");
|
|
editor.replaceSelection('$' + editor.getSelection() + '$');
|
|
if (anchor.line > head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
else if (anchor.line < head.line) {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch });
|
|
}
|
|
else {
|
|
editor.setSelection({ line: anchor.line, ch: anchor.ch + 1 }, { line: head.line, ch: head.ch + 1 });
|
|
}
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
else {
|
|
// close math symbol
|
|
const position = editor.getCursor();
|
|
const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next2_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev_char != "$" && next_char == "$") {
|
|
if (next2_char == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// perform autoCloseMath
|
|
if (this.settings.autoCloseMath_toggle && this.vimAllow_autoCloseMath) {
|
|
editor.replaceSelection("$");
|
|
}
|
|
// perform moveIntoMath
|
|
if (this.settings.moveIntoMath_toggle) {
|
|
const position = editor.getCursor();
|
|
const t = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const t2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const t_2 = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
if (t == '$' && t2 != '$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
else if (t_2 == '$$') {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
case ' ':
|
|
if (!this.settings.autoFraction_toggle &&
|
|
!this.settings.autoLargeBracket_toggle &&
|
|
!this.settings.autoEncloseSup_toggle &&
|
|
!this.settings.autoEncloseSub_toggle &&
|
|
!this.settings.customShorthand_toggle)
|
|
return;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const last_dollar = current_line.lastIndexOf('$', position.ch - 1);
|
|
// check for custom shorthand
|
|
if (this.settings.customShorthand_toggle && !this.withinText(editor, position.ch)) {
|
|
let keyword = "";
|
|
let keyword_length = 0;
|
|
for (let i = 0; i < this.shorthand_array.length; i++) {
|
|
keyword_length = this.shorthand_array[i][0].length;
|
|
if (keyword_length > position.ch) {
|
|
continue;
|
|
}
|
|
else if (keyword_length == position.ch) {
|
|
keyword = "@" + editor.getRange({ line: position.line, ch: position.ch - keyword_length }, { line: position.line, ch: position.ch });
|
|
}
|
|
else {
|
|
keyword = editor.getRange({ line: position.line, ch: position.ch - keyword_length - 1 }, { line: position.line, ch: position.ch });
|
|
}
|
|
if (keyword[0].toLowerCase() == keyword[0].toUpperCase() ||
|
|
keyword[0] == "@") {
|
|
if (this.shorthand_array[i][0] == keyword.slice(-keyword_length) &&
|
|
this.shorthand_array[i][1] != keyword) {
|
|
const replace_slash = (keyword[0] == "\\" && this.shorthand_array[i][1][0] == "\\") ? 1 : 0;
|
|
const set_cursor_position = this.shorthand_array[i][1].indexOf("#cursor");
|
|
editor.replaceRange(this.shorthand_array[i][1], { line: position.line, ch: position.ch - keyword_length - replace_slash }, { line: position.line, ch: position.ch });
|
|
if (set_cursor_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position }, { line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position + 7 });
|
|
editor.setCursor({ line: position.line, ch: position.ch - keyword_length - replace_slash + set_cursor_position });
|
|
}
|
|
else if (this.shorthand_array[i][1].slice(-2) == "{}") {
|
|
editor.setCursor({ line: position.line,
|
|
ch: position.ch + this.shorthand_array[i][1].length - keyword_length - 1 - replace_slash });
|
|
}
|
|
else ;
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// find last unbracketed subscript within last 10 characters and perform autoEncloseSub
|
|
// ignore expression that contain + - * / ^
|
|
const last_math = current_line.lastIndexOf('$', position.ch - 1);
|
|
if (this.settings.autoEncloseSub_toggle) {
|
|
let last_subscript = current_line.lastIndexOf('_', position.ch);
|
|
if (last_subscript != -1 && last_subscript > last_math) {
|
|
const letter_after_subscript = editor.getRange({ line: position.line, ch: last_subscript + 1 }, { line: position.line, ch: last_subscript + 2 });
|
|
if (letter_after_subscript != "{" &&
|
|
(position.ch - last_subscript) <= 10) {
|
|
editor.replaceRange("}", position);
|
|
editor.replaceRange("{", { line: position.line, ch: last_subscript + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// retrieve the last unbracketed superscript
|
|
let last_superscript = current_line.lastIndexOf('^', position.ch);
|
|
while (last_superscript != -1) {
|
|
const two_letters_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 3 });
|
|
if (two_letters_after_superscript[0] == '{' || two_letters_after_superscript == ' {') {
|
|
last_superscript = current_line.lastIndexOf('^', last_superscript - 1);
|
|
}
|
|
else if (last_superscript < last_math) {
|
|
last_superscript = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// retrieve the last divide symbol
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 2);
|
|
while (last_divide != -1) {
|
|
const around_divide = editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide + 2 });
|
|
if (around_divide[0] == ' ' && around_divide[2] == ' ') {
|
|
last_divide = current_line.lastIndexOf('^', last_divide - 1);
|
|
}
|
|
else if (last_divide < last_math) {
|
|
last_divide = -1;
|
|
break;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
// perform autoEncloseSup
|
|
if (this.settings.autoEncloseSup_toggle) {
|
|
if (last_superscript > last_divide) {
|
|
// if any brackets from last sup to cursor still unclosed, dont do autoEncloseSup yet
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_superscript)[0])) {
|
|
this.autoEncloseSup(editor, event, last_superscript);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// perform autoFraction
|
|
if (this.settings.autoFraction_toggle && !this.withinText(editor, last_divide)) {
|
|
if (last_divide > last_dollar) {
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
// if any brackets in denominator still unclosed, dont do autoFraction yet
|
|
if (!brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, last_divide)[0])) {
|
|
this.autoFraction(editor, event, last_superscript);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// perform autoLargeBracket
|
|
if (this.settings.autoLargeBracket_toggle) {
|
|
let symbol_before = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
if (symbol_before == ')' || symbol_before == ']') {
|
|
this.autoLargeBracket(editor, event);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 'Enter':
|
|
// perform Enter shortcut within matrix block
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter, "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter, "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!event.shiftKey) {
|
|
if (state) {
|
|
editor.replaceSelection(' \\\\ ');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
// perform Enter shortcut within align block
|
|
if (this.settings.addAlignBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{' + this.settings.addAlignBlock_parameter, '\\end{' + this.settings.addAlignBlock_parameter)) {
|
|
if (!event.shiftKey) {
|
|
editor.replaceSelection('\\\\\n&');
|
|
event.preventDefault();
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
// enter for cases block
|
|
if (this.settings.addCasesBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' \\\\\n');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// double enter for $$
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const prev2_Char = editor.getRange({ line: position.line, ch: position.ch - 2 }, { line: position.line, ch: position.ch });
|
|
const next2_Char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (prev2_Char == "$$" && next2_Char == "$$") {
|
|
editor.replaceSelection('\n');
|
|
editor.setCursor(position);
|
|
}
|
|
}
|
|
return;
|
|
case 'Tab':
|
|
// perform Tab shortcut within matrix block
|
|
if (this.settings.addMatrixBlock_toggle) {
|
|
const begin_matrix = ['\\begin{' + this.settings.addMatrixBlock_parameter, "\\begin{matrix}", "\\begin{bmatrix}", "\\begin{Bmatrix}", "\\begin{vmatrix}", "\\begin{Vmatrix}", "\\begin{smallmatrix}"];
|
|
const end_matrix = ['\\end{' + this.settings.addMatrixBlock_parameter, "\\end{matrix}", "\\end{bmatrix}", "\\end{Bmatrix}", "\\end{vmatrix}", "\\end{Vmatrix}", "\\end{smallmatrix}"];
|
|
let state = false;
|
|
for (let i = 0; i < begin_matrix.length; i++) {
|
|
if (this.withinAnyBrackets_document(editor, begin_matrix[i], end_matrix[i])) {
|
|
state = true;
|
|
break;
|
|
}
|
|
}
|
|
if (state) {
|
|
editor.replaceSelection(' & ');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// Tab shortcut for cases block
|
|
if (this.settings.addCasesBlock_toggle) {
|
|
if (this.withinAnyBrackets_document(editor, '\\begin{cases}', '\\end{cases}')) {
|
|
editor.replaceSelection(' & ');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
// Tab to go to next #tab
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
const tab_position = current_line.indexOf("#tab");
|
|
if (tab_position != -1) {
|
|
editor.replaceRange("", { line: position.line, ch: tab_position }, { line: position.line, ch: tab_position + 4 });
|
|
editor.setCursor({ line: position.line, ch: tab_position });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
// Tab to next close bracket
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
if (event.shiftKey) {
|
|
const close_symbols = ['}', ']', ')'];
|
|
const preceding_text = editor.getRange({ line: position.line, ch: 0 }, { line: position.line, ch: position.ch });
|
|
for (let i = preceding_text.length; i >= 0; i--) {
|
|
if (close_symbols.contains(preceding_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: i });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (position.ch - i > 1 && preceding_text[i] == "$") {
|
|
editor.setCursor({ line: position.line, ch: i + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (preceding_text.slice(-2) == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 2 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (preceding_text[-1] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch - 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
const close_symbols = ['}', ']', ')', '$'];
|
|
const following_text = editor.getRange({ line: position.line, ch: position.ch + 1 }, { line: position.line, ch: current_line.length });
|
|
for (let i = 0; i < following_text.length; i++) {
|
|
if (close_symbols.contains(following_text[i])) {
|
|
editor.setCursor({ line: position.line, ch: position.ch + i + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Tab out of $
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const next_2 = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
if (next_2 == "$$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 2 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
else if (next_2[0] == "$") {
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.handleKeyPress = (cm, event) => {
|
|
if (['{', '[', '(', 'm'].contains(event.key)) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
const editor = view.editor;
|
|
if (this.withinMath(editor)) {
|
|
const position = editor.getCursor();
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
const next_char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 1 });
|
|
const next_2char = editor.getRange({ line: position.line, ch: position.ch }, { line: position.line, ch: position.ch + 2 });
|
|
const followed_by_$spacetabnonedoubleslash = (['$', ' ', ' ', ''].contains(next_char) || next_2char == '\\\\');
|
|
switch (event.key) {
|
|
case '{':
|
|
if (this.settings.autoCloseCurly_toggle) {
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('{}');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
case '[':
|
|
if (this.settings.autoCloseSquare_toggle) {
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('[]');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
case '(':
|
|
if (this.settings.autoCloseRound_toggle) {
|
|
if (!this.withinAnyBrackets_inline(editor, brackets) && followed_by_$spacetabnonedoubleslash) {
|
|
editor.replaceSelection('()');
|
|
editor.setCursor({ line: position.line, ch: position.ch + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
return;
|
|
case 'm':
|
|
if (!this.settings.autoSumLimit_toggle)
|
|
return;
|
|
if (editor.getRange({ line: position.line, ch: position.ch - 3 }, { line: position.line, ch: position.ch }) == '\\su') {
|
|
editor.replaceSelection('m\\limits');
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
//main functions
|
|
this.autoEncloseSup = (editor, event, last_superscript) => {
|
|
// superscript bracketing
|
|
const position = editor.getCursor();
|
|
const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
if (last_superscript != -1 && letter_before_cursor != "^") {
|
|
const letter_after_superscript = editor.getRange({ line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 2 });
|
|
if (letter_after_superscript == '(' && letter_before_cursor == ')' && position.ch - last_superscript > 6) {
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('{', { line: position.line, ch: last_superscript + 1 }, { line: position.line, ch: last_superscript + 2 });
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
else if (letter_after_superscript == ' ') {
|
|
editor.replaceSelection('}');
|
|
editor.replaceRange('{', { line: position.line, ch: last_superscript + 2 });
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
else {
|
|
editor.replaceSelection('}');
|
|
editor.replaceRange('{', { line: position.line, ch: last_superscript + 1 });
|
|
event.preventDefault();
|
|
return true;
|
|
}
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
};
|
|
this.autoFraction = (editor, event, last_superscript) => {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 1);
|
|
// if cursor is preceeded by a close bracket, and the corresponding open bracket
|
|
// is found before "/", remove the brackets and enclose whole expression using \frac
|
|
const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
// if there are any brackets unclosed before divide symbol,
|
|
// include the open brackets into stop_symbols
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
let stop_brackets = [];
|
|
for (let i = 0; i < brackets.length; i++) {
|
|
if (letter_before_cursor == brackets[i][1]) {
|
|
const open_brackets = this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], position.ch - 1, 0)[1];
|
|
const pos_of_the_open_bracket = open_brackets[open_brackets.length - 1];
|
|
if (pos_of_the_open_bracket < last_divide) {
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide }, { line: position.line, ch: last_divide + 1 });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: pos_of_the_open_bracket }, { line: position.line, ch: pos_of_the_open_bracket + 1 });
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
}
|
|
stop_brackets.push(...this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], last_divide, 0)[1]);
|
|
}
|
|
let frac = 0;
|
|
// if numerator is enclosed by (), place frac in front of () and remove ()
|
|
let numerator_remove_bracket = 0;
|
|
if (editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide }) == ')') {
|
|
const numerator_open_bracket = this.unclosed_bracket(editor, '(', ')', last_divide - 1, 0)[1].slice(-1)[0];
|
|
frac = numerator_open_bracket - 1;
|
|
numerator_remove_bracket = 1;
|
|
}
|
|
else {
|
|
const stop_symbols = ['$', '=', '>', '<', ',', '/', ' '];
|
|
const symbol_positions = stop_symbols.map(e => current_line.lastIndexOf(e, last_divide - 1));
|
|
frac = Math.max(last_superscript, ...symbol_positions, ...stop_brackets);
|
|
}
|
|
// if denominator is enclosed by (), remove ()
|
|
const denominator = editor.getRange({ line: position.line, ch: last_divide + 1 }, { line: position.line, ch: position.ch });
|
|
let denominator_remove_bracket = 0;
|
|
if (denominator.slice(-1)[0] == ')') {
|
|
const denominator_open_bracket = this.unclosed_bracket(editor, '(', ')', position.ch - 1, 0)[1].slice(-1)[0];
|
|
if (denominator_open_bracket == last_divide + 1) {
|
|
denominator_remove_bracket = 1;
|
|
}
|
|
}
|
|
// perform \frac replace
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - denominator_remove_bracket }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide - numerator_remove_bracket }, { line: position.line, ch: last_divide + 1 + denominator_remove_bracket });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: frac + 1 }, { line: position.line, ch: frac + 1 + numerator_remove_bracket });
|
|
event.preventDefault();
|
|
return;
|
|
};
|
|
this.autoFractionCM6 = (editor, last_superscript) => {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
let last_divide = current_line.lastIndexOf('/', position.ch - 1);
|
|
// if cursor is preceeded by a close bracket, and the corresponding open bracket
|
|
// is found before "/", remove the brackets and enclose whole expression using \frac
|
|
const letter_before_cursor = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
// if there are any brackets unclosed before divide symbol,
|
|
// include the open brackets into stop_symbols
|
|
const brackets = [['(', ')'], ['{', '}'], ['[', ']']];
|
|
let stop_brackets = [];
|
|
for (let i = 0; i < brackets.length; i++) {
|
|
if (letter_before_cursor == brackets[i][1]) {
|
|
const open_brackets = this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], position.ch - 1, 0)[1];
|
|
const pos_of_the_open_bracket = open_brackets[open_brackets.length - 1];
|
|
if (pos_of_the_open_bracket < last_divide) {
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide }, { line: position.line, ch: last_divide + 1 });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: pos_of_the_open_bracket }, { line: position.line, ch: pos_of_the_open_bracket + 1 });
|
|
return true;
|
|
}
|
|
}
|
|
stop_brackets.push(...this.unclosed_bracket(editor, brackets[i][0], brackets[i][1], last_divide, 0)[1]);
|
|
}
|
|
let frac = 0;
|
|
// if numerator is enclosed by (), place frac in front of () and remove ()
|
|
let numerator_remove_bracket = 0;
|
|
if (editor.getRange({ line: position.line, ch: last_divide - 1 }, { line: position.line, ch: last_divide }) == ')') {
|
|
const numerator_open_bracket = this.unclosed_bracket(editor, '(', ')', last_divide - 1, 0)[1].slice(-1)[0];
|
|
frac = numerator_open_bracket - 1;
|
|
numerator_remove_bracket = 1;
|
|
}
|
|
else {
|
|
const stop_symbols = ['$', '=', '>', '<', ',', '/', ' '];
|
|
const symbol_positions = stop_symbols.map(e => current_line.lastIndexOf(e, last_divide - 1));
|
|
frac = Math.max(last_superscript, ...symbol_positions, ...stop_brackets);
|
|
}
|
|
// if denominator is enclosed by (), remove ()
|
|
const denominator = editor.getRange({ line: position.line, ch: last_divide + 1 }, { line: position.line, ch: position.ch });
|
|
let denominator_remove_bracket = 0;
|
|
if (denominator.slice(-1)[0] == ')') {
|
|
const denominator_open_bracket = this.unclosed_bracket(editor, '(', ')', position.ch - 1, 0)[1].slice(-1)[0];
|
|
if (denominator_open_bracket == last_divide + 1) {
|
|
denominator_remove_bracket = 1;
|
|
}
|
|
}
|
|
// perform \frac replace
|
|
editor.replaceRange('}', { line: position.line, ch: position.ch - denominator_remove_bracket }, { line: position.line, ch: position.ch });
|
|
editor.replaceRange('}{', { line: position.line, ch: last_divide - numerator_remove_bracket }, { line: position.line, ch: last_divide + 1 + denominator_remove_bracket });
|
|
editor.replaceRange('\\frac{', { line: position.line, ch: frac + 1 }, { line: position.line, ch: frac + 1 + numerator_remove_bracket });
|
|
const pos = editor.getCursor();
|
|
editor.setCursor({ line: pos.line, ch: pos.ch + 1 - denominator_remove_bracket });
|
|
return true;
|
|
};
|
|
this.autoLargeBracket = (editor, event) => {
|
|
const position = editor.getCursor();
|
|
let brackets = [['[', ']'], ['(', ')']];
|
|
const prev_char = editor.getRange({ line: position.line, ch: position.ch - 1 }, { line: position.line, ch: position.ch });
|
|
const current_brackets = brackets.filter(e => e[1] == prev_char)[0];
|
|
if (current_brackets.length == 0)
|
|
return;
|
|
const open_bracket = this.unclosed_bracket(editor, current_brackets[0], current_brackets[1], position.ch - 1, 0)[1].slice(-1)[0];
|
|
const text = editor.getRange({ line: position.line, ch: open_bracket }, { line: position.line, ch: position.ch });
|
|
const large_operators = ['\\sum', '\\int', '\\frac', '\\dfrac'];
|
|
let large_operators_locations = [];
|
|
for (let i = 0; i < large_operators.length; i++) {
|
|
let found = 0;
|
|
while (found != -1) {
|
|
found = text.indexOf(large_operators[i], found + 1);
|
|
if (found != -1) {
|
|
large_operators_locations.push(found + open_bracket);
|
|
}
|
|
}
|
|
}
|
|
const current_line = editor.getLine(position.line);
|
|
let retVal = false;
|
|
for (let i = 0; i < large_operators_locations.length; i++) {
|
|
let left_array = [];
|
|
let right_array = [];
|
|
for (let j = 0; j < brackets.length; j++) {
|
|
left_array.push(...this.unclosed_bracket(editor, brackets[j][0], brackets[j][1], large_operators_locations[i], 0)[1]);
|
|
right_array.push(...this.unclosed_bracket(editor, brackets[j][0], brackets[j][1], current_line.length, large_operators_locations[i], false)[1]);
|
|
}
|
|
for (let k = right_array.length - 1; k > -1; k--) {
|
|
// check if unclosed brackets already appended with \right
|
|
let check_right = editor.getRange({ line: position.line, ch: right_array[k] - 6 }, { line: position.line, ch: right_array[k] });
|
|
if (check_right != '\\right') {
|
|
editor.replaceRange('\\right', { line: position.line, ch: right_array[k] });
|
|
event.preventDefault();
|
|
retVal = true;
|
|
}
|
|
}
|
|
for (let l = left_array.length - 1; l > -1; l--) {
|
|
// check if unclosed brackets already appended with \left
|
|
let check_left = editor.getRange({ line: position.line, ch: left_array[l] - 5 }, { line: position.line, ch: left_array[l] });
|
|
if (check_left != '\\left') {
|
|
editor.replaceRange('\\left', { line: position.line, ch: left_array[l] });
|
|
event.preventDefault();
|
|
retVal = true;
|
|
}
|
|
}
|
|
}
|
|
return retVal;
|
|
};
|
|
//utility functions
|
|
this.unclosed_bracket = (editor, open_symbol, close_symbol, before, after, unclosed_open_symbol = true //false for unclosed_close_symbol
|
|
) => {
|
|
// determine if there are unclosed bracket within the range specified by before and after
|
|
const position = editor.getCursor();
|
|
const text = editor.getRange({ line: position.line, ch: after }, { line: position.line, ch: before });
|
|
let open_array = [];
|
|
let close_array = [];
|
|
for (let i = 0; i < text.length; i++) {
|
|
switch (text[i]) {
|
|
case open_symbol:
|
|
open_array.push(after + i);
|
|
break;
|
|
case close_symbol:
|
|
if (open_array.length > 0) {
|
|
open_array.pop();
|
|
}
|
|
else {
|
|
close_array.push(after + i);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (unclosed_open_symbol) {
|
|
return [open_array.length > 0, open_array];
|
|
}
|
|
else {
|
|
return [close_array.length > 0, close_array];
|
|
}
|
|
};
|
|
this.withinText = (editor, at_where) => {
|
|
// check if within text{}
|
|
const position = editor.getCursor();
|
|
const bracket_locations = this.unclosed_bracket(editor, '{', '}', at_where, 0)[1];
|
|
return bracket_locations.some(loc => editor.getRange({ line: position.line, ch: loc - 4 }, { line: position.line, ch: loc }) == "text");
|
|
};
|
|
this.withinMath = (editor) => {
|
|
// check if cursor within $$
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
let cursor_index = position.ch;
|
|
let from = 0;
|
|
let found = current_line.indexOf('$', from);
|
|
while (found != -1 && found < cursor_index) {
|
|
let next_char = editor.getRange({ line: position.line, ch: found + 1 }, { line: position.line, ch: found + 2 });
|
|
let prev_char = editor.getRange({ line: position.line, ch: found - 1 }, { line: position.line, ch: found });
|
|
if (next_char == '$' || prev_char == '$' || next_char == ' ') {
|
|
from = found + 1;
|
|
found = current_line.indexOf('$', from);
|
|
continue;
|
|
}
|
|
else {
|
|
from = found + 1;
|
|
let next_found = current_line.indexOf('$', from);
|
|
if (next_found == -1) {
|
|
return false;
|
|
}
|
|
else if (cursor_index > found && cursor_index <= next_found) {
|
|
return true;
|
|
}
|
|
else {
|
|
from = next_found + 1;
|
|
found = current_line.indexOf('$', from);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
const document_text = editor.getValue();
|
|
cursor_index = editor.posToOffset(position);
|
|
from = 0;
|
|
found = document_text.indexOf('$$', from);
|
|
let count = 0;
|
|
while (found != -1 && found < cursor_index) {
|
|
count += 1;
|
|
from = found + 2;
|
|
found = document_text.indexOf('$$', from);
|
|
}
|
|
return count % 2 == 1;
|
|
};
|
|
this.withinAnyBrackets_inline = (editor, brackets) => {
|
|
const position = editor.getCursor();
|
|
const current_line = editor.getLine(position.line);
|
|
return brackets.some(e => this.unclosed_bracket(editor, e[0], e[1], position.ch, 0)[0] &&
|
|
this.unclosed_bracket(editor, e[0], e[1], current_line.length, position.ch, false)[0]);
|
|
};
|
|
this.withinAnyBrackets_document = (editor, open_symbol, close_symbol) => {
|
|
const document_text = editor.getValue();
|
|
const cursorPos = editor.getCursor();
|
|
const cursor_index = editor.posToOffset(cursorPos);
|
|
// count open symbols
|
|
let from = 0;
|
|
let found = document_text.indexOf(open_symbol, from);
|
|
let count = 0;
|
|
while (found != -1 && found < cursor_index) {
|
|
count += 1;
|
|
from = found + 1;
|
|
found = document_text.indexOf(open_symbol, from);
|
|
}
|
|
const open_symbol_counts = count;
|
|
// count close symbols
|
|
from = 0;
|
|
found = document_text.indexOf(close_symbol, from);
|
|
count = 0;
|
|
while (found != -1 && found < cursor_index) {
|
|
count += 1;
|
|
from = found + 1;
|
|
found = document_text.indexOf(close_symbol, from);
|
|
}
|
|
const close_symbol_counts = count;
|
|
return open_symbol_counts > close_symbol_counts;
|
|
};
|
|
}
|
|
onload() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
console.log('loading Quick-Latex plugin');
|
|
this.registerEditorExtension(this.makeExtensionThing());
|
|
yield this.loadSettings();
|
|
// preprocess shorthand array
|
|
let shorthands = this.settings.customShorthand_parameter;
|
|
while (shorthands.slice(-1) == "\n") {
|
|
shorthands = shorthands.slice(0, -1);
|
|
}
|
|
if (shorthands.slice(-1) == ";") {
|
|
shorthands = shorthands.slice(0, -1);
|
|
}
|
|
if (shorthands.lastIndexOf(";\n") == -1) {
|
|
this.shorthand_array = shorthands.split(",").map(item => item.split(":").map(item => item.trim()));
|
|
}
|
|
else {
|
|
this.shorthand_array = shorthands.split(";\n").map(item => item.split(":"));
|
|
}
|
|
// preprocess autoAlign array
|
|
this.autoAlign_array = this.settings.autoAlignSymbols.split(" ");
|
|
this.app.workspace.onLayoutReady(() => {
|
|
this.registerCodeMirror((cm) => {
|
|
cm.on('vim-mode-change', this.handleVimModeChange);
|
|
cm.on('keydown', this.handleKeyDown);
|
|
cm.on('keypress', this.handleKeyPress);
|
|
});
|
|
this.addSettingTab(new QuickLatexSettingTab(this.app, this));
|
|
this.addCommand({
|
|
id: 'addAlignBlock',
|
|
name: 'Add Align Block',
|
|
hotkeys: [
|
|
{
|
|
modifiers: ['Alt', 'Shift'],
|
|
key: 'A',
|
|
},
|
|
],
|
|
editorCallback: (editor) => this.addAlignBlock(editor),
|
|
});
|
|
this.addCommand({
|
|
id: 'addMatrixBlock',
|
|
name: 'Add Matrix Block',
|
|
hotkeys: [
|
|
{
|
|
modifiers: ['Alt', 'Shift'],
|
|
key: 'M',
|
|
},
|
|
],
|
|
editorCallback: (editor) => this.addMatrixBlock(editor),
|
|
});
|
|
this.addCommand({
|
|
id: 'addCasesBlock',
|
|
name: 'Add Cases Block',
|
|
hotkeys: [
|
|
{
|
|
modifiers: ['Alt', 'Shift'],
|
|
key: 'C',
|
|
},
|
|
],
|
|
editorCallback: (editor) => this.addCasesBlock(editor),
|
|
});
|
|
});
|
|
});
|
|
}
|
|
addAlignBlock(editor) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
if (!this.settings.addAlignBlock_toggle)
|
|
return;
|
|
const selected_text = editor.getSelection();
|
|
editor.replaceSelection('\\begin{' + this.settings.addAlignBlock_parameter + '}\n' +
|
|
selected_text +
|
|
'\n\\end{' + this.settings.addAlignBlock_parameter + '}');
|
|
const position = editor.getCursor();
|
|
editor.setCursor({ line: position.line - 1, ch: editor.getLine(position.line - 1).length });
|
|
}
|
|
addMatrixBlock(editor) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
if (!this.settings.addMatrixBlock_toggle)
|
|
return;
|
|
editor.replaceSelection('\\begin{' + this.settings.addMatrixBlock_parameter + '}' +
|
|
'\\end{' + this.settings.addMatrixBlock_parameter + '}');
|
|
const position = editor.getCursor();
|
|
const retract_length = ('\\end{' + this.settings.addMatrixBlock_parameter + '}').length;
|
|
editor.setCursor({ line: position.line, ch: position.ch - retract_length });
|
|
}
|
|
addCasesBlock(editor) {
|
|
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
|
|
if (!view)
|
|
return;
|
|
if (!this.settings.addCasesBlock_toggle)
|
|
return;
|
|
const selected_text = editor.getSelection();
|
|
editor.replaceSelection('\\begin{cases}\n' +
|
|
selected_text +
|
|
'\n\\end{cases}');
|
|
const position = editor.getCursor();
|
|
editor.setCursor({ line: position.line - 1, ch: editor.getLine(position.line - 1).length });
|
|
}
|
|
// Settings load and save
|
|
loadSettings() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
|
});
|
|
}
|
|
;
|
|
onunload() {
|
|
console.log('unloading Quick-Latex plugin');
|
|
this.app.workspace.iterateCodeMirrors((cm) => {
|
|
cm.off('vim-mode-change', this.handleVimModeChange);
|
|
cm.off('keydown', this.handleKeyDown);
|
|
cm.off('keypress', this.handleKeyPress);
|
|
});
|
|
}
|
|
}
|
|
class QuickLatexSettingTab extends obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
containerEl.createEl('h2', { text: 'Quick Latex for Obsidian - Settings' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose $$ symbols')
|
|
.setDesc('Typing one $ symbol will automatically lose with another $ symbol ' +
|
|
'(best used with "Move cursor between $$ symbols" function')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseMath_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseMath_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Move cursor between $$ symbols')
|
|
.setDesc('Typing two consecutive $ symbols will automatically shift the cursor in between the $$ symbols')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.moveIntoMath_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.moveIntoMath_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Enclose selected expression with math symbol $$')
|
|
.setDesc('Select an expression and press "$" key will automatically ' +
|
|
'enclose the expression with the math symbols.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.encloseSelection_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.encloseSelection_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose {} curly brackets')
|
|
.setDesc('Typing "{" will automatically close with "}"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseCurly_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseCurly_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose [] square brackets')
|
|
.setDesc('Typing "[" will automatically close with "]"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseSquare_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseSquare_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autoclose () round brackets')
|
|
.setDesc('Typing "(" will automatically close with ")"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoCloseRound_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoCloseRound_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto append "\\limits" after "\\sum"')
|
|
.setDesc('Typing "\\sum" will automatically append "\\limits" to shorten the syntax' +
|
|
' for proper display of the limits for summation symbol.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoSumLimit_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoSumLimit_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto enlarge brackets that contains \\sum, \\int or \\frac')
|
|
.setDesc('Place cursor right after a () or [] bracketed expression that contains either ' +
|
|
'\\sum, \\int or \\frac and press the space key, the outermost brackets will be' +
|
|
' appended with \\left and \\right in order to display larger brackets to enclose these big expressions.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoLargeBracket_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoLargeBracket_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto enclose expression after superscipt with {}')
|
|
.setDesc('Typing expression after superscript "^" symbol follow by a "space" key ' +
|
|
'will automatically surround the expression with "{}"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoEncloseSup_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoEncloseSup_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Auto enclose expression after subscript with {}')
|
|
.setDesc('Typing expression after subscript "_" symbol follow by a "space" key ' +
|
|
'will automatically surround the expression with "{}". ' +
|
|
'Note: expression more than 10 characters long will be ignored.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoEncloseSub_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoEncloseSub_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Type "/" instead of \\frac{}{}')
|
|
.setDesc('Use "/" symbol for quickly typing fractions. eg. type "1/2" followed by a "space" key' +
|
|
' to transform to \\frac{1}{2}')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.autoFraction_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoFraction_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Shortcut for Align Block')
|
|
.setDesc('Use shortcut key to quickly insert \\begin{align*} \\end{align*} block. ' +
|
|
'Default: "Alt+Shift+A" (Mac: "Option+Shift+A")')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.addAlignBlock_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addAlignBlock_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Align Block Parameter')
|
|
.setDesc('Set the text parameter in \\begin{parameter} and \\end{parameter}.')
|
|
.addText((text) => text
|
|
.setPlaceholder('default: align*')
|
|
.setValue(this.plugin.settings.addAlignBlock_parameter)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addAlignBlock_parameter = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('【NEW!】Auto-align at these symbols')
|
|
.setDesc('When within the align block, the align symbol "&" will be automatically added before these symbols. (separate by spaces)')
|
|
.addText((text) => text
|
|
.setValue(this.plugin.settings.autoAlignSymbols)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.autoAlignSymbols = value;
|
|
this.plugin.autoAlign_array = value.split(" ");
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Shortcut for Cases Block')
|
|
.setDesc('Use shortcut key to quickly insert \\begin{cases} \\end{cases} block. ' +
|
|
'Default: "Alt+Shift+C" (Mac: "Option+Shift+C")')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.addCasesBlock_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addCasesBlock_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Use shift-enter for line break in align and cases block')
|
|
.setDesc('For align and cases block above, pressing enter automatically adds line break symbol "\\" or "&". Switch here to use shift-enter instead.')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.shiftEnter_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.shiftEnter_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Shortcut for Matrix Block')
|
|
.setDesc('Use shortcut key to quickly insert \\begin{pmatrix} \\end{pmatrix} block. ' +
|
|
'Default: "Alt+Shift+M" (Mac: "Option+Shift+M")')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.addMatrixBlock_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addMatrixBlock_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Matrix Block Parameter')
|
|
.setDesc('Set the text parameter in \\begin{parameter} and \\end{parameter}.')
|
|
.addText((text) => text
|
|
.setPlaceholder('default: pmatrix')
|
|
.setValue(this.plugin.settings.addMatrixBlock_parameter)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.addMatrixBlock_parameter = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Custom Shorthand')
|
|
.setDesc('Use custom shorthand (can be multiple letters) for common latex strings. ' +
|
|
'Eg, typing "al" followed by "space" key will replace with "\\alpha"')
|
|
.addToggle((toggle) => toggle
|
|
.setValue(this.plugin.settings.customShorthand_toggle)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.customShorthand_toggle = value;
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
this.display();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Custom Shorthand Parameter')
|
|
.setDesc('Separate the multi-letters shorthand and the snippet with ":" and ' +
|
|
'end each set of shorthand snippet pair by ";" and a newline. ' +
|
|
'For expressions that end with "{}", the cursor will automatically be placed within the bracket. ' +
|
|
'Alternatively, you can type "#cursor" within the snippet to set the cursor location after replacement. ' +
|
|
'You can also include "#tab" within the snippet for use cases such as multiple {}s (e.g. \\binom{#cursor}{#tab}). ' +
|
|
'Pressing tab key in such cases will jump the cursor to the next "#tab" keyword.' +
|
|
'Shorthands now support multiline snippets too! ' +
|
|
'(try uninstall then reinstalling the plugin to see the new set of shorthands.)')
|
|
.setClass("text-snippets-class")
|
|
.addTextArea((text) => text
|
|
.setValue(this.plugin.settings.customShorthand_parameter)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
this.plugin.settings.customShorthand_parameter = value;
|
|
while (value.slice(-1) == "\n") {
|
|
value = value.slice(0, -1);
|
|
}
|
|
if (value.slice(-1) == ";") {
|
|
value = value.slice(0, -1);
|
|
}
|
|
if (value.lastIndexOf(";\n") == -1) {
|
|
this.plugin.shorthand_array = value.split(",").map(item => item.split(":").map(item => item.trim()));
|
|
}
|
|
else {
|
|
this.plugin.shorthand_array = value.split(";\n").map(item => item.split(":"));
|
|
}
|
|
yield this.plugin.saveData(this.plugin.settings);
|
|
})));
|
|
}
|
|
;
|
|
}
|
|
|
|
module.exports = QuickLatexPlugin;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vR29vZ2xlIERyaXZlL015IERyaXZlL1dvcmtzcGFjZS9xdWlja19sYXRleF9vYnNpZGlhbi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwiLi4vLi4vLi4vLi4vLi4vR29vZ2xlIERyaXZlL015IERyaXZlL1dvcmtzcGFjZS9xdWlja19sYXRleF9vYnNpZGlhbi9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuXHRBcHAsXHJcblx0TWFya2Rvd25WaWV3LFxyXG5cdFBsdWdpbixcclxuXHRFZGl0b3IsXHJcblx0UGx1Z2luU2V0dGluZ1RhYixcclxuXHRTZXR0aW5nXHJcbn0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IHsgUHJlYywgRXh0ZW5zaW9uIH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xyXG5pbXBvcnQgeyBrZXltYXAgfSBmcm9tICdAY29kZW1pcnJvci92aWV3JztcclxuXHJcbmludGVyZmFjZSBRdWlja0xhdGV4U2V0dGluZ3Mge1xyXG5cdG1vdmVJbnRvTWF0aF90b2dnbGU6IGJvb2xlYW47XHJcblx0YXV0b0Nsb3NlTWF0aF90b2dnbGU6IGJvb2xlYW47XHJcblx0YXV0b0Nsb3NlUm91bmRfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9DbG9zZVNxdWFyZV90b2dnbGU6IGJvb2xlYW47XHJcblx0YXV0b0Nsb3NlQ3VybHlfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGFkZEFsaWduQmxvY2tfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGFkZEFsaWduQmxvY2tfcGFyYW1ldGVyOiBzdHJpbmc7XHJcblx0YXV0b0FsaWduU3ltYm9sczogc3RyaW5nO1xyXG5cdGFkZENhc2VzQmxvY2tfdG9nZ2xlOiBib29sZWFuO1xyXG5cdHNoaWZ0RW50ZXJfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGFkZE1hdHJpeEJsb2NrX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRhZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXI6IHN0cmluZztcclxuXHRhdXRvRnJhY3Rpb25fdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9MYXJnZUJyYWNrZXRfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9TdW1MaW1pdF90b2dnbGU6IGJvb2xlYW47XHJcblx0YXV0b0VuY2xvc2VTdXBfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGF1dG9FbmNsb3NlU3ViX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRlbmNsb3NlU2VsZWN0aW9uX3RvZ2dsZTogYm9vbGVhbjtcclxuXHRjdXN0b21TaG9ydGhhbmRfdG9nZ2xlOiBib29sZWFuO1xyXG5cdGN1c3RvbVNob3J0aGFuZF9wYXJhbWV0ZXI6IHN0cmluZ1xyXG59XHJcblxyXG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBRdWlja0xhdGV4U2V0dGluZ3MgPSB7XHJcblx0bW92ZUludG9NYXRoX3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvQ2xvc2VNYXRoX3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvQ2xvc2VSb3VuZF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZTogdHJ1ZSxcclxuXHRhdXRvQ2xvc2VDdXJseV90b2dnbGU6IHRydWUsXHJcblx0YWRkQWxpZ25CbG9ja190b2dnbGU6IHRydWUsXHJcblx0YWRkQWxpZ25CbG9ja19wYXJhbWV0ZXI6IFwiYWxpZ24qXCIsXHJcblx0YXV0b0FsaWduU3ltYm9sczogXCI9ID4gPCBcXFxcbGUgXFxcXGdlIFxcXFxuZXEgXFxcXGFwcHJveFwiLFxyXG5cdGFkZENhc2VzQmxvY2tfdG9nZ2xlOiB0cnVlLFxyXG5cdHNoaWZ0RW50ZXJfdG9nZ2xlOiBmYWxzZSxcclxuXHRhZGRNYXRyaXhCbG9ja190b2dnbGU6IHRydWUsXHJcblx0YWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyOiBcInBtYXRyaXhcIixcclxuXHRhdXRvRnJhY3Rpb25fdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9MYXJnZUJyYWNrZXRfdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9TdW1MaW1pdF90b2dnbGU6IHRydWUsXHJcblx0YXV0b0VuY2xvc2VTdXBfdG9nZ2xlOiB0cnVlLFxyXG5cdGF1dG9FbmNsb3NlU3ViX3RvZ2dsZTogdHJ1ZSxcclxuXHRlbmNsb3NlU2VsZWN0aW9uX3RvZ2dsZTogdHJ1ZSxcclxuXHRjdXN0b21TaG9ydGhhbmRfdG9nZ2xlOiB0cnVlLFxyXG5cdGN1c3RvbVNob3J0aGFuZF9wYXJhbWV0ZXI6IFwiYmk6XFxcXGJpbm9teyNjdXJzb3J9eyN0YWJ9O1xcbnNxOlxcXFxzcXJ0e307XFxuYmI6XFxcXG1hdGhiYnt9O1xcbmJmOlxcXFxtYXRoYmZ7fTtcXG50ZTpcXFxcdGV4dHt9O1xcbmluZjpcXFxcaW5mdHk7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJjZDpcXFxcY2RvdDtcXG5xdTpcXFxccXVhZDtcXG50aTpcXFxcdGltZXM7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJhbDpcXFxcYWxwaGE7XFxuYmU6XFxcXGJldGE7XFxuZ2E6XFxcXGdhbW1hO1xcbkdhOlxcXFxHYW1tYTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcImRlOlxcXFxkZWx0YTtcXG5EZTpcXFxcRGVsdGE7XFxuZXA6XFxcXGVwc2lsb247XFxuemU6XFxcXHpldGE7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJldDpcXFxcZXRhO1xcbnRoOlxcXFx0aGV0YTtcXG5UaDpcXFxcVGhldGE7XFxuaW86XFxcXGlvdGE7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJrYTpcXFxca2FwcGE7XFxubGE6XFxcXGxhbWJkYTtcXG5MYTpcXFxcTGFtYmRhO1xcbm11OlxcXFxtdTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcIm51OlxcXFxudTtcXG54aTpcXFxceGk7XFxuWGk6XFxcXFhpO1xcbnBpOlxcXFxwaTtcXG5QaTpcXFxcUGk7XFxuXCIrXHJcblx0XHRcdFx0XHRcdFx0XCJyaDpcXFxccmhvO1xcbnNpOlxcXFxzaWdtYTtcXG5TaTpcXFxcU2lnbWE7XFxudGE6XFxcXHRhdTtcXG5cIitcclxuXHRcdFx0XHRcdFx0XHRcInVwOlxcXFx1cHNpbG9uO1xcblVwOlxcXFxVcHNpbG9uO1xcbnBoOlxcXFxwaGk7XFxuUGg6XFxcXFBoaTtcXG5jaDpcXFxcY2hpO1xcblwiK1xyXG5cdFx0XHRcdFx0XHRcdFwicHM6XFxcXHBzaTtcXG5QczpcXFxcUHNpO1xcbm9tOlxcXFxvbWVnYTtcXG5PbTpcXFxcT21lZ2FcIlxyXG59XHJcbiBcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVpY2tMYXRleFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFF1aWNrTGF0ZXhTZXR0aW5ncztcclxuXHRzaG9ydGhhbmRfYXJyYXk6IHN0cmluZ1tdW107XHJcblx0YXV0b0FsaWduX2FycmF5OiBzdHJpbmdbXTtcclxuXHJcbiAgICBwcml2YXRlIHZpbUFsbG93X2F1dG9DbG9zZU1hdGg6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IG1ha2VFeHRlbnNpb25UaGluZyA9ICgpOkV4dGVuc2lvbiA9PiBQcmVjLmhpZ2goa2V5bWFwLm9mKFtcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnJCcsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblx0XHRcdFx0XHJcblx0XHRcdFx0aWYgKGVkaXRvci5nZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHQvLyBlbmNsb3NlIHNlbGVjdGVkIHRleHRcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmVuY2xvc2VTZWxlY3Rpb25fdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGFuY2hvciA9IGVkaXRvci5nZXRDdXJzb3IoXCJhbmNob3JcIilcclxuXHRcdFx0XHRcdFx0Y29uc3QgaGVhZCA9IGVkaXRvci5nZXRDdXJzb3IoXCJoZWFkXCIpXHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKGAkJHtlZGl0b3IuZ2V0U2VsZWN0aW9uKCl9JGApXHJcblx0XHRcdFx0XHRcdGlmIChhbmNob3IubGluZSA+IGhlYWQubGluZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oe2xpbmU6YW5jaG9yLmxpbmUsY2g6YW5jaG9yLmNofSx7bGluZTpoZWFkLmxpbmUsY2g6aGVhZC5jaCsxfSlcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhbmNob3IubGluZSA8IGhlYWQubGluZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRTZWxlY3Rpb24oe2xpbmU6YW5jaG9yLmxpbmUsY2g6YW5jaG9yLmNoKzF9LHtsaW5lOmhlYWQubGluZSxjaDpoZWFkLmNofSlcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHtsaW5lOmFuY2hvci5saW5lLGNoOmFuY2hvci5jaCsxfSx7bGluZTpoZWFkLmxpbmUsY2g6aGVhZC5jaCsxfSlcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIGNsb3NlIG1hdGggc3ltYm9sXHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0XHRcdFx0Y29uc3QgcHJldl9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoLTF9LFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0sXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRjb25zdCBuZXh0Ml9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSxcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdGlmIChwcmV2X2NoYXIgIT0gXCIkXCIgJiYgbmV4dF9jaGFyID09IFwiJFwiKXtcclxuXHRcdFx0XHRcdFx0aWYgKG5leHQyX2NoYXIgPT0gXCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzJ9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIGF1dG8gY2xvc2UgbWF0aFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlTWF0aF90b2dnbGUgJiYgdGhpcy52aW1BbGxvd19hdXRvQ2xvc2VNYXRoKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFwiJFwiKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIG1vdmUgaW50byBtYXRoXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5tb3ZlSW50b01hdGhfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IHQyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggKyAxIH0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IHRfMiA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDIgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KVxyXG5cdFx0XHRcdFx0XHRpZiAodCA9PSAnJCcgJiYgdDIgIT0gJyQnKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSlcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0XzIgPT0gJyQkJykge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0pXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnVGFiJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHJcblx0XHRcdFx0Ly8gVGFiIHNob3J0Y3V0IGZvciBtYXRyaXggYmxvY2tcclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGJlZ2luX21hdHJpeCA9IFsnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcisnfScsIFwiXFxcXGJlZ2lue21hdHJpeH1cIixcIlxcXFxiZWdpbntibWF0cml4fVwiLCBcIlxcXFxiZWdpbntCbWF0cml4fVwiLCBcIlxcXFxiZWdpbnt2bWF0cml4fVwiLCBcIlxcXFxiZWdpbntWbWF0cml4fVwiLCBcIlxcXFxiZWdpbntzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdGNvbnN0IGVuZF9tYXRyaXggPSBbJ1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyKyd9JywgXCJcXFxcZW5ke21hdHJpeH1cIixcIlxcXFxlbmR7Ym1hdHJpeH1cIiwgXCJcXFxcZW5ke0JtYXRyaXh9XCIsIFwiXFxcXGVuZHt2bWF0cml4fVwiLCBcIlxcXFxlbmR7Vm1hdHJpeH1cIiwgXCJcXFxcZW5ke3NtYWxsbWF0cml4fVwiXVxyXG5cdFx0XHRcdFx0bGV0IHN0YXRlID0gZmFsc2VcclxuXHRcdFx0XHRcdGxldCBlbmRfdGV4dCA9IFwiXCJcclxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmVnaW5fbWF0cml4Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KGVkaXRvciwgYmVnaW5fbWF0cml4W2ldLCBlbmRfbWF0cml4W2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRlbmRfdGV4dCA9IGVuZF9tYXRyaXhbaV1cclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IHByZXYzX2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtM30se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRpZiAoc3RhdGUpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHByZXYzX2NoYXIgPT0gJyAmICcpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKCcnLCB7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaC0zfSx7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaH0pXHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCtlbmRfdGV4dC5sZW5ndGgtM30pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignICYgJylcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBUYWIgc2hvcnRjdXQgZm9yIGNhc2VzIGJsb2NrXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkQ2FzZXNCbG9ja190b2dnbGUpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KGVkaXRvcixcclxuXHRcdFx0XHRcdCdcXFxcYmVnaW57Y2FzZXN9JyxcclxuXHRcdFx0XHRcdCdcXFxcZW5ke2Nhc2VzfSdcclxuXHRcdFx0XHRcdCkpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHByZXYzX2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtM30se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKzEpXHJcblx0XHRcdFx0XHRcdGlmIChwcmV2M19jaGFyID09ICcgJiAnICYmIG5leHRfbGluZSA9PSAnXFxcXGVuZHtjYXNlc30nKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSgnJywge2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtM30se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSsxLCBjaDpuZXh0X2xpbmUubGVuZ3RofSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgJiAnKVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdC8vIFRhYiB0byBnbyB0byBuZXh0ICN0YWJcclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0XHRjb25zdCB0YWJfcG9zaXRpb24gPSBjdXJyZW50X2xpbmUuaW5kZXhPZihcIiN0YWJcIiwgcG9zaXRpb24uY2gpO1xyXG5cdFx0XHRcdFx0aWYgKHRhYl9wb3NpdGlvbiE9LTEpe1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXCIsXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbn0sXHJcblx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbis0fSlcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDp0YWJfcG9zaXRpb259KVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gVGFiIG91dCBvZiAkXHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IG5leHRfMiA9IGVkaXRvci5nZXRSYW5nZSh7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaH0se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMn0pXHJcblx0XHRcdFx0XHRjb25zdCBlbmRfcG9zID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSkubGVuZ3RoO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV4dF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSsxKVxyXG5cdFx0XHRcdFx0aWYgKG5leHRfMiA9PSBcIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAocG9zaXRpb24uY2ggPT0gZW5kX3BvcyAmJiBuZXh0X2xpbmUgPT0gXCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSsxLCBjaDpuZXh0X2xpbmUubGVuZ3RofSlcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAobmV4dF8yWzBdID09IFwiJFwiKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBUYWIgdG8gbmV4dCBjbG9zZSBicmFja2V0XHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0XHRcdFx0Y29uc3QgZm9sbG93aW5nX3RleHQgPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6Y3VycmVudF9saW5lLmxlbmd0aH0pXHJcblx0XHRcdFx0XHRjb25zdCBjbG9zZV9zeW1ib2xzID0gWyd9JywgJ10nLCAnKScsICckJ10gXHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZvbGxvd2luZ190ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjbG9zZV9zeW1ib2xzLmNvbnRhaW5zKGZvbGxvd2luZ190ZXh0W2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2graSsxfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gVGFiIG91dCBvZiBhbGlnbiBibG9ja1xyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRjb25zdCBlbmRfcG9zID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSkubGVuZ3RoO1xyXG5cdFx0XHRcdFx0Y29uc3QgbmV4dF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSsxKVxyXG5cdFx0XHRcdFx0aWYgKHBvc2l0aW9uLmNoID09IGVuZF9wb3MgJiYgbmV4dF9saW5lID09ICdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyKyd9Jykge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUrMSwgY2g6bmV4dF9saW5lLmxlbmd0aH0pXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdTaGlmdC1UYWInLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0Y29uc3QgcHJlY2VkaW5nX3RleHQgPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6MH0se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0Y29uc3QgY2xvc2Vfc3ltYm9scyA9IFsnfScsICddJywgJyknXSBcclxuXHRcdFx0XHRcdGZvciAobGV0IGkgPSBwcmVjZWRpbmdfdGV4dC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjbG9zZV9zeW1ib2xzLmNvbnRhaW5zKHByZWNlZGluZ190ZXh0W2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6aX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwb3NpdGlvbi5jaC1pID4gMSAmJiBwcmVjZWRpbmdfdGV4dFtpXT09XCIkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmkrMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcmVjZWRpbmdfdGV4dC5zbGljZSgtMik9PVwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtMn0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWVcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcmVjZWRpbmdfdGV4dFstMV09PVwiJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaC0xfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZVx0XHJcblx0XHRcdFx0XHRcdH1cdFx0XHRcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICdTcGFjZScsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICghdGhpcy5zZXR0aW5ncy5hdXRvRnJhY3Rpb25fdG9nZ2xlICYmXHJcblx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5hdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlICYmXHJcblx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1Yl90b2dnbGUgJiZcclxuXHRcdFx0XHRcdCF0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUpIHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0XHRjb25zdCBsYXN0X2RvbGxhciA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignJCcsIHBvc2l0aW9uLmNoIC0gMSk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gY2hlY2sgZm9yIGN1c3RvbSBzaG9ydGhhbmRcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUgJiYgIXRoaXMud2l0aGluVGV4dChlZGl0b3IsIHBvc2l0aW9uLmNoKSkge1xyXG5cdFx0XHRcdFx0XHRsZXQga2V5d29yZDpzdHJpbmcgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRsZXQga2V5d29yZF9sZW5ndGg6bnVtYmVyID0gMDtcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDAgOyBpIDwgdGhpcy5zaG9ydGhhbmRfYXJyYXkubGVuZ3RoIDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdFx0a2V5d29yZF9sZW5ndGggPSB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVswXS5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBrZXl3b3JkX2xlbmd0aCA+IHBvc2l0aW9uLmNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBrZXl3b3JkX2xlbmd0aCA9PSBwb3NpdGlvbi5jaCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmQgPSBcIkBcIiArIGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5d29yZCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIDEgfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdGlmIChrZXl3b3JkWzBdLnRvTG93ZXJDYXNlKCkgPT0ga2V5d29yZFswXS50b1VwcGVyQ2FzZSgpIHx8IFxyXG5cdFx0XHRcdFx0XHRcdFx0a2V5d29yZFswXSA9PSBcIkBcIiApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVswXSA9PSBrZXl3b3JkLnNsaWNlKC0ga2V5d29yZF9sZW5ndGgpICYmIFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXSAhPSBrZXl3b3JkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJlcGxhY2Vfc2xhc2ggPSAoa2V5d29yZFswXT09XCJcXFxcXCIgJiYgdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV1bMF09PVwiXFxcXFwiKSA/IDEgOiAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzZXRfY3Vyc29yX3Bvc2l0aW9uID0gdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0uaW5kZXhPZihcIiNjdXJzb3JcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UodGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHNldF9jdXJzb3JfcG9zaXRpb24gIT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggKyBzZXRfY3Vyc29yX3Bvc2l0aW9ufSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gcmVwbGFjZV9zbGFzaCArIHNldF9jdXJzb3JfcG9zaXRpb24rN30pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggKyBzZXRfY3Vyc29yX3Bvc2l0aW9ufSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5zbGljZSgtMikgPT0gXCJ7fVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcihcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjaDogcG9zaXRpb24uY2ggKyB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5sZW5ndGggLSBrZXl3b3JkX2xlbmd0aCAtIDEgLSByZXBsYWNlX3NsYXNofVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvLyBmaW5kIGxhc3QgdW5icmFja2V0ZWQgc3Vic2NyaXB0IHdpdGhpbiBsYXN0IDEwIGNoYXJhY3RlcnMgYW5kIHBlcmZvcm0gYXV0b0VuY2xvc2VTdWJcclxuXHRcdFx0XHRcdC8vIGlnbm9yZSBleHByZXNzaW9uIHRoYXQgY29udGFpbiArIC0gKiAvIF5cclxuXHRcdFx0XHRcdGNvbnN0IGxhc3RfbWF0aCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignJCcsIHBvc2l0aW9uLmNoIC0gMSk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1Yl90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0bGV0IGxhc3Rfc3Vic2NyaXB0ID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCdfJywgcG9zaXRpb24uY2gpO1xyXG5cdFx0XHRcdFx0XHRpZiAobGFzdF9zdWJzY3JpcHQgIT0gLTEgJiYgbGFzdF9zdWJzY3JpcHQgPiBsYXN0X21hdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBsZXR0ZXJfYWZ0ZXJfc3Vic2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdWJzY3JpcHQgKyAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1YnNjcmlwdCArIDIgfSk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxldHRlcl9hZnRlcl9zdWJzY3JpcHQgIT0gXCJ7XCIgJiYgXHJcblx0XHRcdFx0XHRcdFx0XHQocG9zaXRpb24uY2ggLSBsYXN0X3N1YnNjcmlwdCkgPD0gMTAgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcIn1cIik7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwie1wiLCB7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpsYXN0X3N1YnNjcmlwdCsxfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRcdC8vIHJldHJpZXZlIHRoZSBsYXN0IHVuYnJhY2tldGVkIHN1cGVyc2NyaXB0XHJcblx0XHRcdFx0XHRsZXQgbGFzdF9zdXBlcnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXicsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0d2hpbGUgKGxhc3Rfc3VwZXJzY3JpcHQgIT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdHdvX2xldHRlcnNfYWZ0ZXJfc3VwZXJzY3JpcHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDEgfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMyB9KTtcclxuXHRcdFx0XHRcdFx0aWYgKHR3b19sZXR0ZXJzX2FmdGVyX3N1cGVyc2NyaXB0WzBdID09ICd7JyB8fCB0d29fbGV0dGVyc19hZnRlcl9zdXBlcnNjcmlwdCA9PSAnIHsnKSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdF9zdXBlcnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXicsIGxhc3Rfc3VwZXJzY3JpcHQgLSAxKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChsYXN0X3N1cGVyc2NyaXB0IDwgbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdF9zdXBlcnNjcmlwdCA9IC0xXHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyByZXRyaWV2ZSB0aGUgbGFzdCBkaXZpZGUgc3ltYm9sXHJcblx0XHRcdFx0XHRsZXQgbGFzdF9kaXZpZGUgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJy8nLCBwb3NpdGlvbi5jaCAtIDIpO1xyXG5cclxuXHRcdFx0XHRcdHdoaWxlIChsYXN0X2RpdmlkZSAhPSAtMSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhcm91bmRfZGl2aWRlID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMiB9KTtcclxuXHRcdFx0XHRcdFx0aWYgKGFyb3VuZF9kaXZpZGVbMF0gPT0gJyAnICYmIGFyb3VuZF9kaXZpZGVbMl0gPT0gJyAnKSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdF9kaXZpZGUgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBsYXN0X2RpdmlkZSAtIDEpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxhc3RfZGl2aWRlIDwgbGFzdF9tYXRoKSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdF9kaXZpZGUgPSAtMVxyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcbiBcclxuXHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0VuY2xvc2VTdXBcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3VwX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAobGFzdF9zdXBlcnNjcmlwdCA+IGxhc3RfZGl2aWRlKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gaWYgYW55IGJyYWNrZXRzIGZyb20gbGFzdCBzdXAgdG8gY3Vyc29yIHN0aWxsIHVuY2xvc2VkLCBkb250IGRvIGF1dG9FbmNsb3NlU3VwIHlldFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRcdGlmICghYnJhY2tldHMuc29tZShlID0+IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGVbMF0sIGVbMV0sIHBvc2l0aW9uLmNoLCBsYXN0X3N1cGVyc2NyaXB0KVswXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmF1dG9FbmNsb3NlU3VwKGVkaXRvciwgZXZlbnQsIGxhc3Rfc3VwZXJzY3JpcHQpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBhdXRvRnJhY3Rpb25cclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9GcmFjdGlvbl90b2dnbGUgJiYgIXRoaXMud2l0aGluVGV4dChlZGl0b3IsIGxhc3RfZGl2aWRlKSkge1xyXG5cdFx0XHRcdFx0XHRpZiAobGFzdF9kaXZpZGUgPiBsYXN0X2RvbGxhcikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGFueSBicmFja2V0cyBpbiBkZW5vbWluYXRvciBzdGlsbCB1bmNsb3NlZCwgZG9udCBkbyBhdXRvRnJhY3Rpb24geWV0XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFicmFja2V0cy5zb21lKGUgPT4gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgZVswXSwgZVsxXSwgcG9zaXRpb24uY2gsIGxhc3RfZGl2aWRlKVswXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmF1dG9GcmFjdGlvbkNNNihlZGl0b3IsIGxhc3Rfc3VwZXJzY3JpcHQpO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0xhcmdlQnJhY2tldFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0bGV0IHN5bWJvbF9iZWZvcmUgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0aWYgKHN5bWJvbF9iZWZvcmUgPT0gJyknIHx8IHN5bWJvbF9iZWZvcmUgPT0gJ10nKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXV0b0xhcmdlQnJhY2tldChlZGl0b3IsIGV2ZW50KTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9BbGlnblxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYXV0b0FsaWduX2FycmF5KSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyLFxyXG5cdFx0XHRcdFx0XHRcdCdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQga2V5d29yZDpzdHJpbmcgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdGxldCBrZXl3b3JkX2xlbmd0aDpudW1iZXIgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwIDsgaSA8IHRoaXMuYXV0b0FsaWduX2FycmF5Lmxlbmd0aCA7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0a2V5d29yZF9sZW5ndGggPSB0aGlzLmF1dG9BbGlnbl9hcnJheVtpXS5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGtleXdvcmRfbGVuZ3RoID4gcG9zaXRpb24uY2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChrZXl3b3JkID09IHRoaXMuYXV0b0FsaWduX2FycmF5W2ldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoJyYnLCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ0VudGVyJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfdG9nZ2xlICYmIHRoaXMuc2V0dGluZ3Muc2hpZnRFbnRlcl90b2dnbGU9PWZhbHNlKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcilcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignXFxcXFxcXFxcXG4nKVxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlICYmIHRoaXMuc2V0dGluZ3Muc2hpZnRFbnRlcl90b2dnbGU9PWZhbHNlKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGJlZ2lue2Nhc2VzfScsXHJcblx0XHRcdFx0XHRcdCdcXFxcZW5ke2Nhc2VzfSdcclxuXHRcdFx0XHRcdCkpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyBcXFxcXFxcXFxcbicpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRjb25zdCBiZWdpbl9tYXRyaXggPSBbJ1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIrJ30nLCBcIlxcXFxiZWdpbnttYXRyaXh9XCIsXCJcXFxcYmVnaW57Ym1hdHJpeH1cIiwgXCJcXFxcYmVnaW57Qm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57dm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57Vm1hdHJpeH1cIiwgXCJcXFxcYmVnaW57c21hbGxtYXRyaXh9XCJdXHJcblx0XHRcdFx0XHRjb25zdCBlbmRfbWF0cml4ID0gWydcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlcisnfScsIFwiXFxcXGVuZHttYXRyaXh9XCIsXCJcXFxcZW5ke2JtYXRyaXh9XCIsIFwiXFxcXGVuZHtCbWF0cml4fVwiLCBcIlxcXFxlbmR7dm1hdHJpeH1cIiwgXCJcXFxcZW5ke1ZtYXRyaXh9XCIsIFwiXFxcXGVuZHtzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdGxldCBzdGF0ZSA9IGZhbHNlXHJcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJlZ2luX21hdHJpeC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChlZGl0b3IsIGJlZ2luX21hdHJpeFtpXSwgZW5kX21hdHJpeFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlID0gdHJ1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChzdGF0ZSkge1xyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignIFxcXFxcXFxcICcpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBkb3VibGUgZW50ZXIgZm9yICQkXHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdGNvbnN0IHByZXYyX0NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMiB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KVxyXG5cdFx0XHRcdFx0Y29uc3QgbmV4dDJfQ2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggKyAyIH0pXHJcblx0XHRcdFx0XHRpZiAocHJldjJfQ2hhcj09XCIkJFwiJiZuZXh0Ml9DaGFyPT1cIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1xcbicpXHJcblx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IocG9zaXRpb24pXHJcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnU2hpZnQtRW50ZXInLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja190b2dnbGUgJiYgdGhpcy5zZXR0aW5ncy5zaGlmdEVudGVyX3RvZ2dsZT09dHJ1ZSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluQW55QnJhY2tldHNfZG9jdW1lbnQoXHJcblx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0J1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRBbGlnbkJsb2NrX3BhcmFtZXRlcixcclxuXHRcdFx0XHRcdFx0J1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja19wYXJhbWV0ZXIpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1xcXFxcXFxcXFxuJylcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSAmJiB0aGlzLnNldHRpbmdzLnNoaWZ0RW50ZXJfdG9nZ2xlPT10cnVlKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLFxyXG5cdFx0XHRcdFx0XHQnXFxcXGJlZ2lue2Nhc2VzfScsXHJcblx0XHRcdFx0XHRcdCdcXFxcZW5ke2Nhc2VzfSdcclxuXHRcdFx0XHRcdCkpIHtcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyBcXFxcXFxcXFxcbicpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ3snLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZUN1cmx5X3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzEgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfMmNoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsyIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2ggPSAoWyckJywnICcsJ1x0JywnJ10uY29udGFpbnMobmV4dF9jaGFyKSB8fCBuZXh0XzJjaGFyID09ICdcXFxcXFxcXCcpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCd7fScpO1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ1snLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVNxdWFyZV90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsxIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0XzJjaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2grMiB9KTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoID0gKFsnJCcsJyAnLCdcdCcsJyddLmNvbnRhaW5zKG5leHRfY2hhcikgfHwgbmV4dF8yY2hhciA9PSAnXFxcXFxcXFwnKTtcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLndpdGhpbkFueUJyYWNrZXRzX2lubGluZShlZGl0b3IsIGJyYWNrZXRzKSAmJiBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2gpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignW10nKTtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9KTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJygnLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzEgfSk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfMmNoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsyIH0pO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBmb2xsb3dlZF9ieV8kc3BhY2V0YWJub25lZG91Ymxlc2xhc2ggPSAoWyckJywnICcsJ1x0JywnJ10uY29udGFpbnMobmV4dF9jaGFyKSB8fCBuZXh0XzJjaGFyID09ICdcXFxcXFxcXCcpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcoKScpO1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ30nLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgZW5kID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSkubGVuZ3RoXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHRfc3ltID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdGlmICghdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJ7XCIsIFwifVwiLCBlbmQsIDApWzBdICYmXHJcblx0XHRcdFx0XHRcdCAhdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgXCJ7XCIsIFwifVwiLCBlbmQsIDAsIGZhbHNlKVswXSAmJlxyXG5cdFx0XHRcdFx0XHQgbmV4dF9zeW0gPT0gXCJ9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiAnXScsXHJcblx0XHRcdHJ1bjogKCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpXHJcblx0XHRcdFx0aWYgKCF2aWV3KSByZXR1cm4gZmFsc2VcclxuXHJcblx0XHRcdFx0Y29uc3QgZWRpdG9yICA9IHZpZXcuZWRpdG9yXHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlUm91bmRfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBlbmQgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKS5sZW5ndGhcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9zeW0gPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0se2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBcIltcIiwgXCJdXCIsIGVuZCwgMClbMF0gJiZcclxuXHRcdFx0XHRcdFx0ICF0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBcIltcIiwgXCJdXCIsIGVuZCwgMCwgZmFsc2UpWzBdICYmXHJcblx0XHRcdFx0XHRcdCBuZXh0X3N5bSA9PSBcIl1cIikge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6ICcpJyxcclxuXHRcdFx0cnVuOiAoKTogYm9vbGVhbiA9PiB7XHJcblx0XHRcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldylcclxuXHRcdFx0XHRpZiAoIXZpZXcpIHJldHVybiBmYWxzZVxyXG5cclxuXHRcdFx0XHRjb25zdCBlZGl0b3IgID0gdmlldy5lZGl0b3JcclxuXHJcblx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VSb3VuZF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGVuZCA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpLmxlbmd0aFxyXG5cdFx0XHRcdFx0XHRjb25zdCBuZXh0X3N5bSA9IGVkaXRvci5nZXRSYW5nZSh7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSx7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIFwiKFwiLCBcIilcIiwgZW5kLCAwKVswXSAmJlxyXG5cdFx0XHRcdFx0XHQgIXRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIFwiKFwiLCBcIilcIiwgZW5kLCAwLCBmYWxzZSlbMF0gJiZcclxuXHRcdFx0XHRcdFx0IG5leHRfc3ltID09IFwiKVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogJ20nLFxyXG5cdFx0XHRydW46ICgpOiBib29sZWFuID0+IHtcclxuXHRcdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KVxyXG5cdFx0XHRcdGlmICghdmlldykgcmV0dXJuIGZhbHNlXHJcblxyXG5cdFx0XHRcdGNvbnN0IGVkaXRvciAgPSB2aWV3LmVkaXRvclxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGlmICghdGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHJldHVybiBmYWxzZVxyXG5cdFx0XHRcdFxyXG5cdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cclxuXHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1N1bUxpbWl0X3RvZ2dsZSkgcmV0dXJuO1xyXG5cdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0aWYgKGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAzIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pID09ICdcXFxcc3UnKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCdtXFxcXGxpbWl0cycpXHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZVxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHRdKSk7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdGNvbnNvbGUubG9nKCdsb2FkaW5nIFF1aWNrLUxhdGV4IHBsdWdpbicpO1xyXG5cclxuXHRcdHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24odGhpcy5tYWtlRXh0ZW5zaW9uVGhpbmcoKSk7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHQvLyBwcmVwcm9jZXNzIHNob3J0aGFuZCBhcnJheVxyXG5cdFx0bGV0IHNob3J0aGFuZHMgPSB0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF9wYXJhbWV0ZXJcclxuXHRcdHdoaWxlKHNob3J0aGFuZHMuc2xpY2UoLTEpPT1cIlxcblwiKXtcclxuXHRcdFx0c2hvcnRoYW5kcyA9IHNob3J0aGFuZHMuc2xpY2UoMCwtMSlcclxuXHRcdH1cclxuXHRcdGlmKHNob3J0aGFuZHMuc2xpY2UoLTEpPT1cIjtcIil7XHJcblx0XHRcdHNob3J0aGFuZHMgPSBzaG9ydGhhbmRzLnNsaWNlKDAsLTEpXHJcblx0XHR9XHJcblx0XHRpZihzaG9ydGhhbmRzLmxhc3RJbmRleE9mKFwiO1xcblwiKT09LTEpe1xyXG5cdFx0XHR0aGlzLnNob3J0aGFuZF9hcnJheSA9IHNob3J0aGFuZHMuc3BsaXQoXCIsXCIpLm1hcChpdGVtPT5pdGVtLnNwbGl0KFwiOlwiKS5tYXAoaXRlbT0+aXRlbS50cmltKCkpKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2hvcnRoYW5kX2FycmF5ID0gc2hvcnRoYW5kcy5zcGxpdChcIjtcXG5cIikubWFwKGl0ZW09Pml0ZW0uc3BsaXQoXCI6XCIpKTtcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Ly8gcHJlcHJvY2VzcyBhdXRvQWxpZ24gYXJyYXlcclxuXHRcdHRoaXMuYXV0b0FsaWduX2FycmF5ID0gdGhpcy5zZXR0aW5ncy5hdXRvQWxpZ25TeW1ib2xzLnNwbGl0KFwiIFwiKTtcclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XHJcblx0XHRcdHRoaXMucmVnaXN0ZXJDb2RlTWlycm9yKChjbTogQ29kZU1pcnJvci5FZGl0b3IpID0+IHtcclxuXHRcdFx0XHRjbS5vbigndmltLW1vZGUtY2hhbmdlJywgdGhpcy5oYW5kbGVWaW1Nb2RlQ2hhbmdlKTtcclxuXHRcdFx0XHRjbS5vbigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XHJcblx0XHRcdFx0Y20ub24oJ2tleXByZXNzJywgdGhpcy5oYW5kbGVLZXlQcmVzcyk7XHJcblx0XHRcdFx0XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFF1aWNrTGF0ZXhTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRcdGlkOiAnYWRkQWxpZ25CbG9jaycsXHJcblx0XHRcdFx0bmFtZTogJ0FkZCBBbGlnbiBCbG9jaycsXHJcblx0XHRcdFx0aG90a2V5czogW1xyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRtb2RpZmllcnM6IFsnQWx0JywgJ1NoaWZ0J10sXHJcblx0XHRcdFx0XHRcdGtleTogJ0EnLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yKSA9PiB0aGlzLmFkZEFsaWduQmxvY2soZWRpdG9yKSxcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRcdGlkOiAnYWRkTWF0cml4QmxvY2snLFxyXG5cdFx0XHRcdG5hbWU6ICdBZGQgTWF0cml4IEJsb2NrJyxcclxuXHRcdFx0XHRob3RrZXlzOiBbXHJcblx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdG1vZGlmaWVyczogWydBbHQnLCAnU2hpZnQnXSxcclxuXHRcdFx0XHRcdFx0a2V5OiAnTScsXHJcblx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdF0sXHJcblx0XHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3IpID0+IHRoaXMuYWRkTWF0cml4QmxvY2soZWRpdG9yKSxcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRcdGlkOiAnYWRkQ2FzZXNCbG9jaycsXHJcblx0XHRcdFx0bmFtZTogJ0FkZCBDYXNlcyBCbG9jaycsXHJcblx0XHRcdFx0aG90a2V5czogW1xyXG5cdFx0XHRcdFx0e1xyXG5cdFx0XHRcdFx0XHRtb2RpZmllcnM6IFsnQWx0JywgJ1NoaWZ0J10sXHJcblx0XHRcdFx0XHRcdGtleTogJ0MnLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHRcdGVkaXRvckNhbGxiYWNrOiAoZWRpdG9yKSA9PiB0aGlzLmFkZENhc2VzQmxvY2soZWRpdG9yKSxcclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlVmltTW9kZUNoYW5nZSA9IChcclxuICAgICAgICBtb2RlT2JqOiBhbnlcclxuICAgICkgOiB2b2lkID0+IHtcclxuICAgICAgICBpZiAoIW1vZGVPYmogfHwgbW9kZU9iai5tb2RlID09PSAnaW5zZXJ0JylcclxuICAgICAgICAgICAgdGhpcy52aW1BbGxvd19hdXRvQ2xvc2VNYXRoID0gdHJ1ZTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMudmltQWxsb3dfYXV0b0Nsb3NlTWF0aCA9IGZhbHNlO1xyXG4gICAgfTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBoYW5kbGVLZXlEb3duID0gKFxyXG5cdFx0Y206IENvZGVNaXJyb3IuRWRpdG9yLFxyXG5cdFx0ZXZlbnQ6IEtleWJvYXJkRXZlbnQsXHJcblx0KTogdm9pZCA9PiB7XHJcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdGlmICghdmlldykgcmV0dXJuO1xyXG5cclxuXHRcdGNvbnN0IGVkaXRvciA9IHZpZXcuZWRpdG9yO1xyXG5cclxuXHRcdGlmIChbJyQnLCAnICcsICdFbnRlcicsICdUYWInXS5jb250YWlucyhldmVudC5rZXkpKSB7XHJcblx0XHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdFx0Y2FzZSAnJCc6XHJcblx0XHRcdFx0XHRpZiAoZWRpdG9yLmdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuZW5jbG9zZVNlbGVjdGlvbl90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBhbmNob3IgPSBlZGl0b3IuZ2V0Q3Vyc29yKFwiYW5jaG9yXCIpO1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGhlYWQgPSBlZGl0b3IuZ2V0Q3Vyc29yKFwiaGVhZFwiKTtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignJCcgKyBlZGl0b3IuZ2V0U2VsZWN0aW9uKCkgKyAnJCcpXHJcblx0XHRcdFx0XHRcdFx0aWYgKGFuY2hvci5saW5lID4gaGVhZC5saW5lKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHtsaW5lOmFuY2hvci5saW5lLGNoOmFuY2hvci5jaH0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2grMX0pXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhbmNob3IubGluZSA8IGhlYWQubGluZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldFNlbGVjdGlvbih7bGluZTphbmNob3IubGluZSxjaDphbmNob3IuY2grMX0se2xpbmU6aGVhZC5saW5lLGNoOmhlYWQuY2h9KVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0U2VsZWN0aW9uKHtsaW5lOmFuY2hvci5saW5lLGNoOmFuY2hvci5jaCsxfSx7bGluZTpoZWFkLmxpbmUsY2g6aGVhZC5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH0gXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBjbG9zZSBtYXRoIHN5bWJvbFxyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2X2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaC0xfSxcclxuXHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNofSlcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2h9LFxyXG5cdFx0XHRcdFx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsY2g6cG9zaXRpb24uY2grMX0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHQyX2NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaH0sXHJcblx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSxjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0aWYgKHByZXZfY2hhciAhPSBcIiRcIiAmJiBuZXh0X2NoYXIgPT0gXCIkXCIpe1xyXG5cdFx0XHRcdFx0XHRcdGlmIChuZXh0Ml9jaGFyID09IFwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzJ9KVxyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLGNoOnBvc2l0aW9uLmNoKzF9KVxyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0Nsb3NlTWF0aFxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VNYXRoX3RvZ2dsZSAmJiB0aGlzLnZpbUFsbG93X2F1dG9DbG9zZU1hdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcIiRcIik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHBlcmZvcm0gbW92ZUludG9NYXRoXHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLm1vdmVJbnRvTWF0aF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9KVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHQyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoICsgMSB9KVxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRfMiA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMiB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0XHRpZiAodCA9PSAnJCcgJiYgdDIgIT0gJyQnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9KVxyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodF8yID09ICckJCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0pXHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdFx0Y2FzZSAnICc6XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5hdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZSAmJlxyXG5cdFx0XHRcdFx0XHQhdGhpcy5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1cF90b2dnbGUgJiZcclxuXHRcdFx0XHRcdFx0IXRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlICYmXHJcblx0XHRcdFx0XHRcdCF0aGlzLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUpIHJldHVybjtcclxuXHJcblx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5NYXRoKGVkaXRvcikpIHtcclxuXHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbGFzdF9kb2xsYXIgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJyQnLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gY2hlY2sgZm9yIGN1c3RvbSBzaG9ydGhhbmRcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuY3VzdG9tU2hvcnRoYW5kX3RvZ2dsZSAmJiAhdGhpcy53aXRoaW5UZXh0KGVkaXRvciwgcG9zaXRpb24uY2gpKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGtleXdvcmQ6c3RyaW5nID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRsZXQga2V5d29yZF9sZW5ndGg6bnVtYmVyID0gMDtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMCA7IGkgPCB0aGlzLnNob3J0aGFuZF9hcnJheS5sZW5ndGggOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGtleXdvcmRfbGVuZ3RoID0gdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMF0ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBrZXl3b3JkX2xlbmd0aCA+IHBvc2l0aW9uLmNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICgga2V5d29yZF9sZW5ndGggPT0gcG9zaXRpb24uY2ggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleXdvcmQgPSBcIkBcIiArIGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXl3b3JkID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0ga2V5d29yZF9sZW5ndGggLSAxIH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoa2V5d29yZFswXS50b0xvd2VyQ2FzZSgpID09IGtleXdvcmRbMF0udG9VcHBlckNhc2UoKSB8fCBcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5d29yZFswXSA9PSBcIkBcIiApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzBdID09IGtleXdvcmQuc2xpY2UoLSBrZXl3b3JkX2xlbmd0aCkgJiYgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV0gIT0ga2V5d29yZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJlcGxhY2Vfc2xhc2ggPSAoa2V5d29yZFswXT09XCJcXFxcXCIgJiYgdGhpcy5zaG9ydGhhbmRfYXJyYXlbaV1bMV1bMF09PVwiXFxcXFwiKSA/IDEgOiAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNldF9jdXJzb3JfcG9zaXRpb24gPSB0aGlzLnNob3J0aGFuZF9hcnJheVtpXVsxXS5pbmRleE9mKFwiI2N1cnNvclwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggfSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzZXRfY3Vyc29yX3Bvc2l0aW9uICE9IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwiXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCAtIGtleXdvcmRfbGVuZ3RoIC0gcmVwbGFjZV9zbGFzaCArIHNldF9jdXJzb3JfcG9zaXRpb259LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggKyBzZXRfY3Vyc29yX3Bvc2l0aW9uKzd9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2ggLSBrZXl3b3JkX2xlbmd0aCAtIHJlcGxhY2Vfc2xhc2ggKyBzZXRfY3Vyc29yX3Bvc2l0aW9ufSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLnNsaWNlKC0yKSA9PSBcInt9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNoOiBwb3NpdGlvbi5jaCArIHRoaXMuc2hvcnRoYW5kX2FycmF5W2ldWzFdLmxlbmd0aCAtIGtleXdvcmRfbGVuZ3RoIC0gMSAtIHJlcGxhY2Vfc2xhc2h9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIGZpbmQgbGFzdCB1bmJyYWNrZXRlZCBzdWJzY3JpcHQgd2l0aGluIGxhc3QgMTAgY2hhcmFjdGVycyBhbmQgcGVyZm9ybSBhdXRvRW5jbG9zZVN1YlxyXG5cdFx0XHRcdFx0XHQvLyBpZ25vcmUgZXhwcmVzc2lvbiB0aGF0IGNvbnRhaW4gKyAtICogLyBeXHJcblx0XHRcdFx0XHRcdGNvbnN0IGxhc3RfbWF0aCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignJCcsIHBvc2l0aW9uLmNoIC0gMSk7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9FbmNsb3NlU3ViX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBsYXN0X3N1YnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXycsIHBvc2l0aW9uLmNoKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobGFzdF9zdWJzY3JpcHQgIT0gLTEgJiYgbGFzdF9zdWJzY3JpcHQgPiBsYXN0X21hdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxldHRlcl9hZnRlcl9zdWJzY3JpcHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3Vic2NyaXB0ICsgMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1YnNjcmlwdCArIDIgfSk7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAobGV0dGVyX2FmdGVyX3N1YnNjcmlwdCAhPSBcIntcIiAmJiBcclxuXHRcdFx0XHRcdFx0XHRcdFx0KHBvc2l0aW9uLmNoIC0gbGFzdF9zdWJzY3JpcHQpIDw9IDEwICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFwifVwiLCBwb3NpdGlvbik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXCJ7XCIsIHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmxhc3Rfc3Vic2NyaXB0KzF9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdC8vIHJldHJpZXZlIHRoZSBsYXN0IHVuYnJhY2tldGVkIHN1cGVyc2NyaXB0XHJcblx0XHRcdFx0XHRcdGxldCBsYXN0X3N1cGVyc2NyaXB0ID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCdeJywgcG9zaXRpb24uY2gpO1xyXG5cdFx0XHRcdFx0XHR3aGlsZSAobGFzdF9zdXBlcnNjcmlwdCAhPSAtMSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHR3b19sZXR0ZXJzX2FmdGVyX3N1cGVyc2NyaXB0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDEgfSxcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAzIH0pO1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0d29fbGV0dGVyc19hZnRlcl9zdXBlcnNjcmlwdFswXSA9PSAneycgfHwgdHdvX2xldHRlcnNfYWZ0ZXJfc3VwZXJzY3JpcHQgPT0gJyB7Jykge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGFzdF9zdXBlcnNjcmlwdCA9IGN1cnJlbnRfbGluZS5sYXN0SW5kZXhPZignXicsIGxhc3Rfc3VwZXJzY3JpcHQgLSAxKTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGxhc3Rfc3VwZXJzY3JpcHQgPCBsYXN0X21hdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxhc3Rfc3VwZXJzY3JpcHQgPSAtMVxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcmV0cmlldmUgdGhlIGxhc3QgZGl2aWRlIHN5bWJvbFxyXG5cdFx0XHRcdFx0XHRsZXQgbGFzdF9kaXZpZGUgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJy8nLCBwb3NpdGlvbi5jaCAtIDIpO1xyXG5cclxuXHRcdFx0XHRcdFx0d2hpbGUgKGxhc3RfZGl2aWRlICE9IC0xKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXJvdW5kX2RpdmlkZSA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAyIH0pO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChhcm91bmRfZGl2aWRlWzBdID09ICcgJyAmJiBhcm91bmRfZGl2aWRlWzJdID09ICcgJykge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGFzdF9kaXZpZGUgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJ14nLCBsYXN0X2RpdmlkZSAtIDEpO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobGFzdF9kaXZpZGUgPCBsYXN0X21hdGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxhc3RfZGl2aWRlID0gLTFcclxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIHBlcmZvcm0gYXV0b0VuY2xvc2VTdXBcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3Rfc3VwZXJzY3JpcHQgPiBsYXN0X2RpdmlkZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaWYgYW55IGJyYWNrZXRzIGZyb20gbGFzdCBzdXAgdG8gY3Vyc29yIHN0aWxsIHVuY2xvc2VkLCBkb250IGRvIGF1dG9FbmNsb3NlU3VwIHlldFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIWJyYWNrZXRzLnNvbWUoZSA9PiB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBlWzBdLCBlWzFdLCBwb3NpdGlvbi5jaCwgbGFzdF9zdXBlcnNjcmlwdClbMF0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYXV0b0VuY2xvc2VTdXAoZWRpdG9yLCBldmVudCwgbGFzdF9zdXBlcnNjcmlwdCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gcGVyZm9ybSBhdXRvRnJhY3Rpb25cclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0ZyYWN0aW9uX3RvZ2dsZSAmJiAhdGhpcy53aXRoaW5UZXh0KGVkaXRvciwgbGFzdF9kaXZpZGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGxhc3RfZGl2aWRlID4gbGFzdF9kb2xsYXIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJyYWNrZXRzID0gW1snKCcsICcpJ10sIFsneycsICd9J10sIFsnWycsICddJ11dO1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gaWYgYW55IGJyYWNrZXRzIGluIGRlbm9taW5hdG9yIHN0aWxsIHVuY2xvc2VkLCBkb250IGRvIGF1dG9GcmFjdGlvbiB5ZXRcclxuXHRcdFx0XHRcdFx0XHRcdGlmICghYnJhY2tldHMuc29tZShlID0+IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGVbMF0sIGVbMV0sIHBvc2l0aW9uLmNoLCBsYXN0X2RpdmlkZSlbMF0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuYXV0b0ZyYWN0aW9uKGVkaXRvciwgZXZlbnQsIGxhc3Rfc3VwZXJzY3JpcHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBwZXJmb3JtIGF1dG9MYXJnZUJyYWNrZXRcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0xhcmdlQnJhY2tldF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRsZXQgc3ltYm9sX2JlZm9yZSA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSlcclxuXHRcdFx0XHRcdFx0XHRpZiAoc3ltYm9sX2JlZm9yZSA9PSAnKScgfHwgc3ltYm9sX2JlZm9yZSA9PSAnXScpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXV0b0xhcmdlQnJhY2tldChlZGl0b3IsIGV2ZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdFbnRlcic6XHJcblx0XHRcdFx0XHQvLyBwZXJmb3JtIEVudGVyIHNob3J0Y3V0IHdpdGhpbiBtYXRyaXggYmxvY2tcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBiZWdpbl9tYXRyaXggPSBbJ1xcXFxiZWdpbnsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsIFwiXFxcXGJlZ2lue21hdHJpeH1cIixcIlxcXFxiZWdpbntibWF0cml4fVwiLCBcIlxcXFxiZWdpbntCbWF0cml4fVwiLCBcIlxcXFxiZWdpbnt2bWF0cml4fVwiLCBcIlxcXFxiZWdpbntWbWF0cml4fVwiLCBcIlxcXFxiZWdpbntzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdFx0Y29uc3QgZW5kX21hdHJpeCA9IFsnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIsIFwiXFxcXGVuZHttYXRyaXh9XCIsXCJcXFxcZW5ke2JtYXRyaXh9XCIsIFwiXFxcXGVuZHtCbWF0cml4fVwiLCBcIlxcXFxlbmR7dm1hdHJpeH1cIiwgXCJcXFxcZW5ke1ZtYXRyaXh9XCIsIFwiXFxcXGVuZHtzbWFsbG1hdHJpeH1cIl1cclxuXHRcdFx0XHRcdFx0bGV0IHN0YXRlID0gZmFsc2VcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBiZWdpbl9tYXRyaXgubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChlZGl0b3IsIGJlZ2luX21hdHJpeFtpXSwgZW5kX21hdHJpeFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUgPSB0cnVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHN0YXRlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignIFxcXFxcXFxcICcpXHJcblx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBFbnRlciBzaG9ydGN1dCB3aXRoaW4gYWxpZ24gYmxvY2tcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KFxyXG5cdFx0XHRcdFx0XHRcdGVkaXRvcixcclxuXHRcdFx0XHRcdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyLFxyXG5cdFx0XHRcdFx0XHRcdCdcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignXFxcXFxcXFxcXG4mJylcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gZW50ZXIgZm9yIGNhc2VzIGJsb2NrXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3IsXHJcblx0XHRcdFx0XHRcdFx0J1xcXFxiZWdpbntjYXNlc30nLFxyXG5cdFx0XHRcdFx0XHRcdCdcXFxcZW5ke2Nhc2VzfSdcclxuXHRcdFx0XHRcdFx0KSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgXFxcXFxcXFxcXG4nKVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gZG91YmxlIGVudGVyIGZvciAkJFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2Ml9DaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMiB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pXHJcblx0XHRcdFx0XHRcdGNvbnN0IG5leHQyX0NoYXIgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCArIDIgfSlcclxuXHRcdFx0XHRcdFx0aWYgKHByZXYyX0NoYXI9PVwiJCRcIiYmbmV4dDJfQ2hhcj09XCIkJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ1xcbicpXHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcihwb3NpdGlvbilcclxuXHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0XHRjYXNlICdUYWInOlxyXG5cdFx0XHRcdFx0Ly8gcGVyZm9ybSBUYWIgc2hvcnRjdXQgd2l0aGluIG1hdHJpeCBibG9ja1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfdG9nZ2xlKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGJlZ2luX21hdHJpeCA9IFsnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlciwgXCJcXFxcYmVnaW57bWF0cml4fVwiLFwiXFxcXGJlZ2lue2JtYXRyaXh9XCIsIFwiXFxcXGJlZ2lue0JtYXRyaXh9XCIsIFwiXFxcXGJlZ2lue3ZtYXRyaXh9XCIsIFwiXFxcXGJlZ2lue1ZtYXRyaXh9XCIsIFwiXFxcXGJlZ2lue3NtYWxsbWF0cml4fVwiXVxyXG5cdFx0XHRcdFx0XHRjb25zdCBlbmRfbWF0cml4ID0gWydcXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlciwgXCJcXFxcZW5ke21hdHJpeH1cIixcIlxcXFxlbmR7Ym1hdHJpeH1cIiwgXCJcXFxcZW5ke0JtYXRyaXh9XCIsIFwiXFxcXGVuZHt2bWF0cml4fVwiLCBcIlxcXFxlbmR7Vm1hdHJpeH1cIiwgXCJcXFxcZW5ke3NtYWxsbWF0cml4fVwiXVxyXG5cdFx0XHRcdFx0XHRsZXQgc3RhdGUgPSBmYWxzZVxyXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJlZ2luX21hdHJpeC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbkFueUJyYWNrZXRzX2RvY3VtZW50KGVkaXRvciwgYmVnaW5fbWF0cml4W2ldLCBlbmRfbWF0cml4W2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZSA9IHRydWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChzdGF0ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKCcgJiAnKVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHJcblx0XHRcdFx0XHQvLyBUYWIgc2hvcnRjdXQgZm9yIGNhc2VzIGJsb2NrXHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hZGRDYXNlc0Jsb2NrX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy53aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudChlZGl0b3IsXHJcblx0XHRcdFx0XHRcdCdcXFxcYmVnaW57Y2FzZXN9JyxcclxuXHRcdFx0XHRcdFx0J1xcXFxlbmR7Y2FzZXN9J1xyXG5cdFx0XHRcdFx0XHQpKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJyAmICcpXHJcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8vIFRhYiB0byBnbyB0byBuZXh0ICN0YWJcclxuXHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRcdFx0XHRjb25zdCB0YWJfcG9zaXRpb24gPSBjdXJyZW50X2xpbmUuaW5kZXhPZihcIiN0YWJcIik7XHJcblx0XHRcdFx0XHRpZiAodGFiX3Bvc2l0aW9uIT0tMSl7XHJcblx0XHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXCJcIixcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6dGFiX3Bvc2l0aW9ufSxcclxuXHRcdFx0XHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6dGFiX3Bvc2l0aW9uKzR9KVxyXG5cdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnRhYl9wb3NpdGlvbn0pXHJcblx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0Ly8gVGFiIHRvIG5leHQgY2xvc2UgYnJhY2tldFxyXG5cdFx0XHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdFx0XHRcdFx0XHJcblx0XHRcdFx0XHRcdGlmIChldmVudC5zaGlmdEtleSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNsb3NlX3N5bWJvbHMgPSBbJ30nLCAnXScsICcpJ10gXHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJlY2VkaW5nX3RleHQgPSBlZGl0b3IuZ2V0UmFuZ2Uoe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6MH0se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2h9KVxyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSBwcmVjZWRpbmdfdGV4dC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2xvc2Vfc3ltYm9scy5jb250YWlucyhwcmVjZWRpbmdfdGV4dFtpXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDppfSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uLmNoLWkgPiAxICYmIHByZWNlZGluZ190ZXh0W2ldPT1cIiRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmkrMX0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcmVjZWRpbmdfdGV4dC5zbGljZSgtMik9PVwiJCRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTJ9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJlY2VkaW5nX3RleHRbLTFdPT1cIiRcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoLTF9KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5cclxuXHRcdFx0XHRcdFx0XHRcdH1cdFx0XHRcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2xvc2Vfc3ltYm9scyA9IFsnfScsICddJywgJyknLCAnJCddIFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZvbGxvd2luZ190ZXh0ID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9LHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOmN1cnJlbnRfbGluZS5sZW5ndGh9KVxyXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZm9sbG93aW5nX3RleHQubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjbG9zZV9zeW1ib2xzLmNvbnRhaW5zKGZvbGxvd2luZ190ZXh0W2ldKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoK2krMX0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHRcdFx0fVx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBUYWIgb3V0IG9mICRcclxuXHRcdFx0XHRcdGlmICh0aGlzLndpdGhpbk1hdGgoZWRpdG9yKSkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbmV4dF8yID0gZWRpdG9yLmdldFJhbmdlKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofSx7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsyfSlcclxuXHRcdFx0XHRcdFx0aWYgKG5leHRfMiA9PSBcIiQkXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzJ9KVxyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAobmV4dF8yWzBdID09IFwiJFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaCsxfSlcclxuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVyblxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlS2V5UHJlc3MgPSAoXHJcblx0XHRjbTogQ29kZU1pcnJvci5FZGl0b3IsXHJcblx0XHRldmVudDogS2V5Ym9hcmRFdmVudCxcclxuXHQpOiB2b2lkID0+IHtcclxuXHJcblx0XHRpZiAoWyd7JywgJ1snLCAnKCcsICdtJ10uY29udGFpbnMoZXZlbnQua2V5KSkge1xyXG5cdFx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdFx0aWYgKCF2aWV3KSByZXR1cm47XHJcblxyXG5cdFx0XHRjb25zdCBlZGl0b3IgPSB2aWV3LmVkaXRvcjtcclxuXHRcdFx0aWYgKHRoaXMud2l0aGluTWF0aChlZGl0b3IpKSB7XHJcblx0XHRcdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRcdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRcdFx0Y29uc3QgbmV4dF9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfSxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoKzEgfSk7XHJcblx0XHRcdFx0Y29uc3QgbmV4dF8yY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0sXHJcblx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCsyIH0pO1xyXG5cdFx0XHRcdGNvbnN0IGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCA9IChbJyQnLCcgJywnXHQnLCcnXS5jb250YWlucyhuZXh0X2NoYXIpIHx8IG5leHRfMmNoYXIgPT0gJ1xcXFxcXFxcJyk7XHJcblx0XHRcdFx0c3dpdGNoIChldmVudC5rZXkpIHtcclxuXHRcdFx0XHRcdGNhc2UgJ3snOlxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VDdXJseV90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ3t9Jyk7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9KTtcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRjYXNlICdbJzpcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghdGhpcy53aXRoaW5BbnlCcmFja2V0c19pbmxpbmUoZWRpdG9yLCBicmFja2V0cykgJiYgZm9sbG93ZWRfYnlfJHNwYWNldGFibm9uZWRvdWJsZXNsYXNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignW10nKTtcclxuXHRcdFx0XHRcdFx0XHRcdGVkaXRvci5zZXRDdXJzb3Ioe2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2grMX0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdGNhc2UgJygnOlxyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvQ2xvc2VSb3VuZF90b2dnbGUpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIXRoaXMud2l0aGluQW55QnJhY2tldHNfaW5saW5lKGVkaXRvciwgYnJhY2tldHMpICYmIGZvbGxvd2VkX2J5XyRzcGFjZXRhYm5vbmVkb3VibGVzbGFzaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJygpJyk7XHJcblx0XHRcdFx0XHRcdFx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNoKzF9KTtcclxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fVx0XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdGNhc2UgJ20nOlxyXG5cdFx0XHRcdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1N1bUxpbWl0X3RvZ2dsZSkgcmV0dXJuO1xyXG5cdFx0XHRcdFx0XHRpZiAoZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMyB9LFxyXG5cdFx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH0pID09ICdcXFxcc3UnKSB7XHJcblx0XHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ21cXFxcbGltaXRzJylcclxuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cdH07XHJcblxyXG5cdC8vbWFpbiBmdW5jdGlvbnNcclxuXHRwcml2YXRlIHJlYWRvbmx5IGF1dG9FbmNsb3NlU3VwID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRldmVudDpFdmVudCxcclxuXHRcdGxhc3Rfc3VwZXJzY3JpcHQ6IG51bWJlclxyXG5cdCk6IGJvb2xlYW4gPT4ge1xyXG5cdFx0Ly8gc3VwZXJzY3JpcHQgYnJhY2tldGluZ1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRjb25zdCBsZXR0ZXJfYmVmb3JlX2N1cnNvciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdClcclxuXHJcblx0XHRpZiAobGFzdF9zdXBlcnNjcmlwdCAhPSAtMSAmJiBsZXR0ZXJfYmVmb3JlX2N1cnNvciAhPSBcIl5cIikge1xyXG5cdFx0XHRjb25zdCBsZXR0ZXJfYWZ0ZXJfc3VwZXJzY3JpcHQgPSBlZGl0b3IuZ2V0UmFuZ2UoXHJcblx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDEgfSxcclxuXHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMiB9KTtcclxuXHRcdFx0aWYgKGxldHRlcl9hZnRlcl9zdXBlcnNjcmlwdCA9PSAnKCcgJiYgbGV0dGVyX2JlZm9yZV9jdXJzb3IgPT0gJyknICYmIHBvc2l0aW9uLmNoLWxhc3Rfc3VwZXJzY3JpcHQgPiA2KSB7XHJcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdCd9JyxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0J3snLFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDEgfSxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3Rfc3VwZXJzY3JpcHQgKyAyIH1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGxldHRlcl9hZnRlcl9zdXBlcnNjcmlwdCA9PSAnICcpIHtcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbignfScpO1xyXG5cdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoJ3snLCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X3N1cGVyc2NyaXB0ICsgMiB9KTtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oJ30nKTtcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKCd7JywgeyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9zdXBlcnNjcmlwdCArIDEgfSk7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSBhdXRvRnJhY3Rpb24gPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdGV2ZW50OkV2ZW50LFxyXG5cdFx0bGFzdF9zdXBlcnNjcmlwdDogbnVtYmVyXHJcblx0KTogYm9vbGVhbiA9PiB7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGNvbnN0IGN1cnJlbnRfbGluZSA9IGVkaXRvci5nZXRMaW5lKHBvc2l0aW9uLmxpbmUpO1xyXG5cdFx0bGV0IGxhc3RfZGl2aWRlID0gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKCcvJywgcG9zaXRpb24uY2ggLSAxKTtcclxuXHJcblx0XHQvLyBpZiBjdXJzb3IgaXMgcHJlY2VlZGVkIGJ5IGEgY2xvc2UgYnJhY2tldCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG9wZW4gYnJhY2tldFxyXG5cdFx0Ly8gaXMgZm91bmQgYmVmb3JlIFwiL1wiLCByZW1vdmUgdGhlIGJyYWNrZXRzIGFuZCBlbmNsb3NlIHdob2xlIGV4cHJlc3Npb24gdXNpbmcgXFxmcmFjXHJcblx0XHRjb25zdCBsZXR0ZXJfYmVmb3JlX2N1cnNvciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdClcclxuXHJcblx0XHQvLyBpZiB0aGVyZSBhcmUgYW55IGJyYWNrZXRzIHVuY2xvc2VkIGJlZm9yZSBkaXZpZGUgc3ltYm9sLFxyXG5cdFx0Ly8gaW5jbHVkZSB0aGUgb3BlbiBicmFja2V0cyBpbnRvIHN0b3Bfc3ltYm9sc1xyXG5cdFx0Y29uc3QgYnJhY2tldHMgPSBbWycoJywgJyknXSwgWyd7JywgJ30nXSwgWydbJywgJ10nXV07XHJcblx0XHRsZXQgc3RvcF9icmFja2V0cyA9IFtdXHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGJyYWNrZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChsZXR0ZXJfYmVmb3JlX2N1cnNvciA9PSBicmFja2V0c1tpXVsxXSkge1xyXG5cdFx0XHRcdGNvbnN0IG9wZW5fYnJhY2tldHMgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoZWRpdG9yLCBicmFja2V0c1tpXVswXSwgYnJhY2tldHNbaV1bMV0sIHBvc2l0aW9uLmNoIC0gMSwgMClbMV1cclxuXHRcdFx0XHRjb25zdCBwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCA9IG9wZW5fYnJhY2tldHNbb3Blbl9icmFja2V0cy5sZW5ndGggLSAxXVxyXG5cdFx0XHRcdGlmIChwb3Nfb2ZfdGhlX29wZW5fYnJhY2tldCA8IGxhc3RfZGl2aWRlKSB7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0XHQnfScsXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIC0gMSB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0XHQnfXsnLFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSB9LFxyXG5cdFx0XHRcdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDEgfVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZShcclxuXHRcdFx0XHRcdFx0J1xcXFxmcmFjeycsXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc19vZl90aGVfb3Blbl9icmFja2V0IH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc19vZl90aGVfb3Blbl9icmFja2V0ICsgMSB9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRzdG9wX2JyYWNrZXRzLnB1c2goLi4udGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgYnJhY2tldHNbaV1bMF0sIGJyYWNrZXRzW2ldWzFdLCBsYXN0X2RpdmlkZSwgMClbMV0pXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGZyYWMgPSAwXHJcblxyXG5cdFx0Ly8gaWYgbnVtZXJhdG9yIGlzIGVuY2xvc2VkIGJ5ICgpLCBwbGFjZSBmcmFjIGluIGZyb250IG9mICgpIGFuZCByZW1vdmUgKClcclxuXHRcdGxldCBudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAwXHJcblx0XHRpZiAoZWRpdG9yLmdldFJhbmdlKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIC0gMSB9LCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSB9KSA9PSAnKScpIHtcclxuXHRcdFx0Y29uc3QgbnVtZXJhdG9yX29wZW5fYnJhY2tldCA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsICcoJywgJyknLCBsYXN0X2RpdmlkZSAtIDEsIDApWzFdLnNsaWNlKC0xKVswXVxyXG5cdFx0XHRmcmFjID0gbnVtZXJhdG9yX29wZW5fYnJhY2tldCAtIDE7XHJcblx0XHRcdG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCA9IDFcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IHN0b3Bfc3ltYm9scyA9IFsnJCcsICc9JywgJz4nLCAnPCcsICcsJywgJy8nLCAnICddXHJcblx0XHRcdGNvbnN0IHN5bWJvbF9wb3NpdGlvbnMgPSBzdG9wX3N5bWJvbHMubWFwKGUgPT4gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKGUsIGxhc3RfZGl2aWRlIC0gMSkpXHJcblx0XHRcdGZyYWMgPSBNYXRoLm1heChsYXN0X3N1cGVyc2NyaXB0LCAuLi5zeW1ib2xfcG9zaXRpb25zLCAuLi5zdG9wX2JyYWNrZXRzKVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBpZiBkZW5vbWluYXRvciBpcyBlbmNsb3NlZCBieSAoKSwgcmVtb3ZlICgpXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdCk7XHJcblx0XHRsZXQgZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAwO1xyXG5cdFx0aWYgKGRlbm9taW5hdG9yLnNsaWNlKC0xKVswXSA9PSAnKScpIHtcclxuXHRcdFx0Y29uc3QgZGVub21pbmF0b3Jfb3Blbl9icmFja2V0ID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgJygnLCAnKScsIHBvc2l0aW9uLmNoIC0gMSwgMClbMV0uc2xpY2UoLTEpWzBdXHJcblx0XHRcdGlmIChkZW5vbWluYXRvcl9vcGVuX2JyYWNrZXQgPT0gbGFzdF9kaXZpZGUgKyAxKSB7XHJcblx0XHRcdFx0ZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAxO1xyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBwZXJmb3JtIFxcZnJhYyByZXBsYWNlXHJcblx0XHRcclxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdCd9JyxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHRcdCk7XHJcblx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHQnfXsnLFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSAtIG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDEgKyBkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCB9XHJcblx0XHRcdCk7XHJcblx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHQnXFxcXGZyYWN7JyxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZnJhYyArIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZnJhYyArIDEgKyBudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgfVxyXG5cdFx0XHQpO1xyXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdHJldHVyblxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgYXV0b0ZyYWN0aW9uQ002ID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3IsXHJcblx0XHRsYXN0X3N1cGVyc2NyaXB0OiBudW1iZXJcclxuXHQpOiBib29sZWFuID0+IHtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0Y29uc3QgY3VycmVudF9saW5lID0gZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSk7XHJcblx0XHRsZXQgbGFzdF9kaXZpZGUgPSBjdXJyZW50X2xpbmUubGFzdEluZGV4T2YoJy8nLCBwb3NpdGlvbi5jaCAtIDEpO1xyXG5cclxuXHRcdC8vIGlmIGN1cnNvciBpcyBwcmVjZWVkZWQgYnkgYSBjbG9zZSBicmFja2V0LCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlbiBicmFja2V0XHJcblx0XHQvLyBpcyBmb3VuZCBiZWZvcmUgXCIvXCIsIHJlbW92ZSB0aGUgYnJhY2tldHMgYW5kIGVuY2xvc2Ugd2hvbGUgZXhwcmVzc2lvbiB1c2luZyBcXGZyYWNcclxuXHRcdGNvbnN0IGxldHRlcl9iZWZvcmVfY3Vyc29yID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggfVxyXG5cdFx0KVxyXG5cclxuXHRcdC8vIGlmIHRoZXJlIGFyZSBhbnkgYnJhY2tldHMgdW5jbG9zZWQgYmVmb3JlIGRpdmlkZSBzeW1ib2wsXHJcblx0XHQvLyBpbmNsdWRlIHRoZSBvcGVuIGJyYWNrZXRzIGludG8gc3RvcF9zeW1ib2xzXHJcblx0XHRjb25zdCBicmFja2V0cyA9IFtbJygnLCAnKSddLCBbJ3snLCAnfSddLCBbJ1snLCAnXSddXTtcclxuXHRcdGxldCBzdG9wX2JyYWNrZXRzID0gW11cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYnJhY2tldHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0aWYgKGxldHRlcl9iZWZvcmVfY3Vyc29yID09IGJyYWNrZXRzW2ldWzFdKSB7XHJcblx0XHRcdFx0Y29uc3Qgb3Blbl9icmFja2V0cyA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGJyYWNrZXRzW2ldWzBdLCBicmFja2V0c1tpXVsxXSwgcG9zaXRpb24uY2ggLSAxLCAwKVsxXVxyXG5cdFx0XHRcdGNvbnN0IHBvc19vZl90aGVfb3Blbl9icmFja2V0ID0gb3Blbl9icmFja2V0c1tvcGVuX2JyYWNrZXRzLmxlbmd0aCAtIDFdXHJcblx0XHRcdFx0aWYgKHBvc19vZl90aGVfb3Blbl9icmFja2V0IDwgbGFzdF9kaXZpZGUpIHtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHRcdCd9JyxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSAxIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdFx0XHRcdCd9eycsXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIH0sXHJcblx0XHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlICsgMSB9XHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHRcdFx0XHQnXFxcXGZyYWN7JyxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgfSxcclxuXHRcdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zX29mX3RoZV9vcGVuX2JyYWNrZXQgKyAxIH1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRzdG9wX2JyYWNrZXRzLnB1c2goLi4udGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgYnJhY2tldHNbaV1bMF0sIGJyYWNrZXRzW2ldWzFdLCBsYXN0X2RpdmlkZSwgMClbMV0pXHJcblx0XHR9XHJcblxyXG5cdFx0bGV0IGZyYWMgPSAwXHJcblxyXG5cdFx0Ly8gaWYgbnVtZXJhdG9yIGlzIGVuY2xvc2VkIGJ5ICgpLCBwbGFjZSBmcmFjIGluIGZyb250IG9mICgpIGFuZCByZW1vdmUgKClcclxuXHRcdGxldCBudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAwXHJcblx0XHRpZiAoZWRpdG9yLmdldFJhbmdlKHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxhc3RfZGl2aWRlIC0gMSB9LCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSB9KSA9PSAnKScpIHtcclxuXHRcdFx0Y29uc3QgbnVtZXJhdG9yX29wZW5fYnJhY2tldCA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsICcoJywgJyknLCBsYXN0X2RpdmlkZSAtIDEsIDApWzFdLnNsaWNlKC0xKVswXVxyXG5cdFx0XHRmcmFjID0gbnVtZXJhdG9yX29wZW5fYnJhY2tldCAtIDE7XHJcblx0XHRcdG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCA9IDFcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IHN0b3Bfc3ltYm9scyA9IFsnJCcsICc9JywgJz4nLCAnPCcsICcsJywgJy8nLCAnICddXHJcblx0XHRcdGNvbnN0IHN5bWJvbF9wb3NpdGlvbnMgPSBzdG9wX3N5bWJvbHMubWFwKGUgPT4gY3VycmVudF9saW5lLmxhc3RJbmRleE9mKGUsIGxhc3RfZGl2aWRlIC0gMSkpXHJcblx0XHRcdGZyYWMgPSBNYXRoLm1heChsYXN0X3N1cGVyc2NyaXB0LCAuLi5zeW1ib2xfcG9zaXRpb25zLCAuLi5zdG9wX2JyYWNrZXRzKVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBpZiBkZW5vbWluYXRvciBpcyBlbmNsb3NlZCBieSAoKSwgcmVtb3ZlICgpXHJcblx0XHRjb25zdCBkZW5vbWluYXRvciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGFzdF9kaXZpZGUgKyAxIH0sXHJcblx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHBvc2l0aW9uLmNoIH1cclxuXHRcdCk7XHJcblx0XHRsZXQgZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAwO1xyXG5cdFx0aWYgKGRlbm9taW5hdG9yLnNsaWNlKC0xKVswXSA9PSAnKScpIHtcclxuXHRcdFx0Y29uc3QgZGVub21pbmF0b3Jfb3Blbl9icmFja2V0ID0gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgJygnLCAnKScsIHBvc2l0aW9uLmNoIC0gMSwgMClbMV0uc2xpY2UoLTEpWzBdXHJcblx0XHRcdGlmIChkZW5vbWluYXRvcl9vcGVuX2JyYWNrZXQgPT0gbGFzdF9kaXZpZGUgKyAxKSB7XHJcblx0XHRcdFx0ZGVub21pbmF0b3JfcmVtb3ZlX2JyYWNrZXQgPSAxO1xyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBwZXJmb3JtIFxcZnJhYyByZXBsYWNlXHJcblx0XHRcclxuXHRcdGVkaXRvci5yZXBsYWNlUmFuZ2UoXHJcblx0XHRcdCd9JyxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcG9zaXRpb24uY2ggLSBkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCB9XHJcblx0XHRcdCk7XHJcblx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHQnfXsnLFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSAtIG51bWVyYXRvcl9yZW1vdmVfYnJhY2tldCB9LFxyXG5cdFx0XHR7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsYXN0X2RpdmlkZSArIDEgKyBkZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldCB9XHJcblx0XHRcdCk7XHJcblx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKFxyXG5cdFx0XHQnXFxcXGZyYWN7JyxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZnJhYyArIDEgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogZnJhYyArIDEgKyBudW1lcmF0b3JfcmVtb3ZlX2JyYWNrZXQgfVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdGNvbnN0IHBvcyA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0ZWRpdG9yLnNldEN1cnNvcih7bGluZTpwb3MubGluZSxjaDpwb3MuY2grMS1kZW5vbWluYXRvcl9yZW1vdmVfYnJhY2tldH0pXHJcblx0XHRyZXR1cm4gdHJ1ZVxyXG5cdH07XHJcblxyXG5cdHByaXZhdGUgcmVhZG9ubHkgYXV0b0xhcmdlQnJhY2tldCA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0ZXZlbnQ6IEV2ZW50XHJcblx0KTogYm9vbGVhbiA9PiB7XHJcblx0XHRjb25zdCBwb3NpdGlvbiA9IGVkaXRvci5nZXRDdXJzb3IoKTtcclxuXHRcdGxldCBicmFja2V0cyA9IFtbJ1snLCAnXSddLCBbJygnLCAnKSddXTtcclxuXHRcdGNvbnN0IHByZXZfY2hhciA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0e2xpbmU6cG9zaXRpb24ubGluZSwgY2g6cG9zaXRpb24uY2gtMX0sXHJcblx0XHRcdHtsaW5lOnBvc2l0aW9uLmxpbmUsIGNoOnBvc2l0aW9uLmNofVxyXG5cdFx0KVxyXG5cdFx0Y29uc3QgY3VycmVudF9icmFja2V0cyA9IGJyYWNrZXRzLmZpbHRlcihlID0+IGVbMV09PXByZXZfY2hhcilbMF1cclxuXHRcdGlmIChjdXJyZW50X2JyYWNrZXRzLmxlbmd0aD09MCkgcmV0dXJuO1xyXG5cdFx0XHJcblx0XHRjb25zdCBvcGVuX2JyYWNrZXQgPSB0aGlzLnVuY2xvc2VkX2JyYWNrZXQoXHJcblx0XHRcdGVkaXRvcixcclxuXHRcdFx0Y3VycmVudF9icmFja2V0c1swXSxcclxuXHRcdFx0Y3VycmVudF9icmFja2V0c1sxXSxcclxuXHRcdFx0cG9zaXRpb24uY2gtMSxcclxuXHRcdFx0MClbMV0uc2xpY2UoLTEpWzBdXHJcblx0XHRjb25zdCB0ZXh0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpvcGVuX2JyYWNrZXR9LFxyXG5cdFx0XHR7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpwb3NpdGlvbi5jaH0pXHJcblx0XHRcdFxyXG5cdFx0Y29uc3QgbGFyZ2Vfb3BlcmF0b3JzID0gWydcXFxcc3VtJywgJ1xcXFxpbnQnLCAnXFxcXGZyYWMnLCdcXFxcZGZyYWMnXTtcclxuXHRcdGxldCBsYXJnZV9vcGVyYXRvcnNfbG9jYXRpb25zOm51bWJlcltdID0gW107XHJcblxyXG5cdFx0Zm9yIChsZXQgaSA9IDAgOyBpIDwgbGFyZ2Vfb3BlcmF0b3JzLmxlbmd0aCA7IGkrKykge1xyXG5cdFx0XHRsZXQgZm91bmQgPSAwO1xyXG5cdFx0XHR3aGlsZSAoZm91bmQgIT0gLTEpIHtcclxuXHRcdFx0XHRmb3VuZCA9IHRleHQuaW5kZXhPZihsYXJnZV9vcGVyYXRvcnNbaV0sZm91bmQrMSlcclxuXHRcdFx0XHRpZiAoZm91bmQgIT0gLTEpIHtcclxuXHRcdFx0XHRcdGxhcmdlX29wZXJhdG9yc19sb2NhdGlvbnMucHVzaChmb3VuZCArIG9wZW5fYnJhY2tldCk7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcdFxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdFxyXG5cdFx0bGV0IHJldFZhbCA9IGZhbHNlXHJcblxyXG5cdFx0Zm9yIChsZXQgaSA9IDAgOyBpIDwgbGFyZ2Vfb3BlcmF0b3JzX2xvY2F0aW9ucy5sZW5ndGggOyBpKyspIHtcclxuXHRcdFx0bGV0IGxlZnRfYXJyYXk6IG51bWJlcltdID0gW107XHJcblx0XHRcdGxldCByaWdodF9hcnJheTogbnVtYmVyW10gPSBbXTtcclxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBicmFja2V0cy5sZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdGxlZnRfYXJyYXkucHVzaChcclxuXHRcdFx0XHRcdC4uLnRoaXMudW5jbG9zZWRfYnJhY2tldChcclxuXHRcdFx0XHRcdFx0ZWRpdG9yLCBcclxuXHRcdFx0XHRcdFx0YnJhY2tldHNbal1bMF0sIFxyXG5cdFx0XHRcdFx0XHRicmFja2V0c1tqXVsxXSwgXHJcblx0XHRcdFx0XHRcdGxhcmdlX29wZXJhdG9yc19sb2NhdGlvbnNbaV0sIFxyXG5cdFx0XHRcdFx0XHQwKVsxXSlcclxuXHRcdFx0XHRyaWdodF9hcnJheS5wdXNoKFxyXG5cdFx0XHRcdFx0Li4udGhpcy51bmNsb3NlZF9icmFja2V0KFxyXG5cdFx0XHRcdFx0XHRlZGl0b3IsIFxyXG5cdFx0XHRcdFx0XHRicmFja2V0c1tqXVswXSwgXHJcblx0XHRcdFx0XHRcdGJyYWNrZXRzW2pdWzFdLCBcclxuXHRcdFx0XHRcdFx0Y3VycmVudF9saW5lLmxlbmd0aCwgXHJcblx0XHRcdFx0XHRcdGxhcmdlX29wZXJhdG9yc19sb2NhdGlvbnNbaV0sIFxyXG5cdFx0XHRcdFx0XHRmYWxzZSlbMV0pXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRmb3IgKGxldCBrID0gcmlnaHRfYXJyYXkubGVuZ3RoIC0gMTsgayA+IC0xOyBrLS0pIHtcclxuXHRcdFx0XHQvLyBjaGVjayBpZiB1bmNsb3NlZCBicmFja2V0cyBhbHJlYWR5IGFwcGVuZGVkIHdpdGggXFxyaWdodFxyXG5cdFx0XHRcdGxldCBjaGVja19yaWdodCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IHJpZ2h0X2FycmF5W2tdIC0gNiB9LFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogcmlnaHRfYXJyYXlba10gfSk7XHJcblx0XHRcdFx0aWYgKGNoZWNrX3JpZ2h0ICE9ICdcXFxccmlnaHQnKSB7XHJcblx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVJhbmdlKCdcXFxccmlnaHQnLCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiByaWdodF9hcnJheVtrXSB9KTtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRyZXRWYWwgPSB0cnVlXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGZvciAobGV0IGwgPSBsZWZ0X2FycmF5Lmxlbmd0aCAtIDE7IGwgPiAtMTsgbC0tKSB7XHJcblx0XHRcdFx0Ly8gY2hlY2sgaWYgdW5jbG9zZWQgYnJhY2tldHMgYWxyZWFkeSBhcHBlbmRlZCB3aXRoIFxcbGVmdFxyXG5cdFx0XHRcdGxldCBjaGVja19sZWZ0ID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogbGVmdF9hcnJheVtsXSAtIDUgfSxcclxuXHRcdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGxlZnRfYXJyYXlbbF0gfSk7XHJcblx0XHRcdFx0aWYgKGNoZWNrX2xlZnQgIT0gJ1xcXFxsZWZ0Jykge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VSYW5nZSgnXFxcXGxlZnQnLCB7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBsZWZ0X2FycmF5W2xdIH0pO1xyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRcdHJldFZhbCA9IHRydWVcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9O1xyXG5cdFx0fTtcclxuXHRcdHJldHVybiByZXRWYWxcclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIGFkZEFsaWduQmxvY2soZWRpdG9yOiBFZGl0b3IpIHtcclxuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0aWYgKCF2aWV3KSByZXR1cm47XHJcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYWRkQWxpZ25CbG9ja190b2dnbGUpIHJldHVybjtcclxuXHRcdGNvbnN0IHNlbGVjdGVkX3RleHQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKClcclxuXHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFxyXG5cdFx0XHQnXFxcXGJlZ2lueycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyICsgJ31cXG4nICtcclxuXHRcdFx0c2VsZWN0ZWRfdGV4dCArXHJcblx0XHRcdCdcXG5cXFxcZW5keycgKyB0aGlzLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyICsgJ30nXHJcblx0XHQpO1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRlZGl0b3Iuc2V0Q3Vyc29yKHsgbGluZTogcG9zaXRpb24ubGluZSAtIDEsIGNoOiBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lIC0gMSkubGVuZ3RoIH0pXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFkZE1hdHJpeEJsb2NrKGVkaXRvcjogRWRpdG9yKSB7XHJcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcclxuXHRcdGlmICghdmlldykgcmV0dXJuO1xyXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3RvZ2dsZSkgcmV0dXJuO1xyXG5cdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXHJcblx0XHRcdCdcXFxcYmVnaW57JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyICsgJ30nICtcclxuXHRcdFx0J1xcXFxlbmR7JyArIHRoaXMuc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyICsgJ30nXHJcblx0XHQpO1xyXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBlZGl0b3IuZ2V0Q3Vyc29yKCk7XHJcblx0XHRjb25zdCByZXRyYWN0X2xlbmd0aCA9ICgnXFxcXGVuZHsnICsgdGhpcy5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja19wYXJhbWV0ZXIgKyAnfScpLmxlbmd0aFxyXG5cdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUsIGNoOiBwb3NpdGlvbi5jaCAtIHJldHJhY3RfbGVuZ3RoIH0pXHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFkZENhc2VzQmxvY2soZWRpdG9yOiBFZGl0b3IpIHtcclxuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xyXG5cdFx0aWYgKCF2aWV3KSByZXR1cm47XHJcblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuYWRkQ2FzZXNCbG9ja190b2dnbGUpIHJldHVybjtcclxuXHRcdGNvbnN0IHNlbGVjdGVkX3RleHQgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uKClcclxuXHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFxyXG5cdFx0XHQnXFxcXGJlZ2lue2Nhc2VzfVxcbicgK1xyXG5cdFx0XHRzZWxlY3RlZF90ZXh0ICtcclxuXHRcdFx0J1xcblxcXFxlbmR7Y2FzZXN9J1xyXG5cdFx0KTtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0ZWRpdG9yLnNldEN1cnNvcih7IGxpbmU6IHBvc2l0aW9uLmxpbmUgLSAxLCBjaDogZWRpdG9yLmdldExpbmUocG9zaXRpb24ubGluZSAtIDEpLmxlbmd0aCB9KVxyXG5cdH1cclxuXHJcblx0Ly91dGlsaXR5IGZ1bmN0aW9uc1xyXG5cdHByaXZhdGUgcmVhZG9ubHkgdW5jbG9zZWRfYnJhY2tldCA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0b3Blbl9zeW1ib2w6IHN0cmluZyxcclxuXHRcdGNsb3NlX3N5bWJvbDogc3RyaW5nLFxyXG5cdFx0YmVmb3JlOiBudW1iZXIsXHJcblx0XHRhZnRlcjogbnVtYmVyLFxyXG5cdFx0dW5jbG9zZWRfb3Blbl9zeW1ib2w6IGJvb2xlYW4gPSB0cnVlIC8vZmFsc2UgZm9yIHVuY2xvc2VkX2Nsb3NlX3N5bWJvbFxyXG5cdCk6IFtib29sZWFuLCBudW1iZXJbXV0gPT4ge1xyXG5cdFx0Ly8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSB1bmNsb3NlZCBicmFja2V0IHdpdGhpbiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IGJlZm9yZSBhbmQgYWZ0ZXJcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpO1xyXG5cdFx0Y29uc3QgdGV4dCA9IGVkaXRvci5nZXRSYW5nZShcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogYWZ0ZXIgfSxcclxuXHRcdFx0eyBsaW5lOiBwb3NpdGlvbi5saW5lLCBjaDogYmVmb3JlIH0pO1xyXG5cdFx0bGV0IG9wZW5fYXJyYXk6IG51bWJlcltdID0gW11cclxuXHRcdGxldCBjbG9zZV9hcnJheTogbnVtYmVyW10gPSBbXVxyXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHN3aXRjaCAodGV4dFtpXSkge1xyXG5cdFx0XHRcdGNhc2Ugb3Blbl9zeW1ib2w6XHJcblx0XHRcdFx0XHRvcGVuX2FycmF5LnB1c2goYWZ0ZXIgKyBpKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgY2xvc2Vfc3ltYm9sOlxyXG5cdFx0XHRcdFx0aWYgKG9wZW5fYXJyYXkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRvcGVuX2FycmF5LnBvcCgpXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRjbG9zZV9hcnJheS5wdXNoKGFmdGVyICsgaSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKHVuY2xvc2VkX29wZW5fc3ltYm9sKSB7XHJcblx0XHRcdHJldHVybiBbb3Blbl9hcnJheS5sZW5ndGggPiAwLCBvcGVuX2FycmF5XTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiBbY2xvc2VfYXJyYXkubGVuZ3RoID4gMCwgY2xvc2VfYXJyYXldO1xyXG5cdFx0fVxyXG5cclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IHdpdGhpblRleHQgPSAoXHJcblx0XHRlZGl0b3I6IEVkaXRvcixcclxuXHRcdGF0X3doZXJlOiBudW1iZXJcclxuXHQpOiBCb29sZWFuID0+IHtcclxuXHRcdC8vIGNoZWNrIGlmIHdpdGhpbiB0ZXh0e31cclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpXHJcblx0XHRjb25zdCBicmFja2V0X2xvY2F0aW9ucyA9IHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsICd7JywnfScsIGF0X3doZXJlLCAwKVsxXVxyXG5cdFx0cmV0dXJuIGJyYWNrZXRfbG9jYXRpb25zLnNvbWUobG9jID0+IGVkaXRvci5nZXRSYW5nZSh7bGluZTpwb3NpdGlvbi5saW5lLCBjaDpsb2MtNH0se2xpbmU6cG9zaXRpb24ubGluZSwgY2g6bG9jfSk9PVwidGV4dFwiKVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSB3aXRoaW5NYXRoID0gKFxyXG5cdFx0ZWRpdG9yOiBFZGl0b3JcclxuXHQpOiBCb29sZWFuID0+IHtcclxuXHRcdC8vIGNoZWNrIGlmIGN1cnNvciB3aXRoaW4gJCRcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpXHJcblx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdGxldCBjdXJzb3JfaW5kZXggPSBwb3NpdGlvbi5jaFxyXG5cdFx0bGV0IGZyb20gPSAwO1xyXG5cdFx0bGV0IGZvdW5kID0gY3VycmVudF9saW5lLmluZGV4T2YoJyQnLCBmcm9tKTtcclxuXHRcdHdoaWxlIChmb3VuZCAhPSAtMSAmJiBmb3VuZCA8IGN1cnNvcl9pbmRleCkge1xyXG5cdFx0XHRsZXQgbmV4dF9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZvdW5kICsgMSB9LFxyXG5cdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZvdW5kICsgMiB9KVxyXG5cdFx0XHRsZXQgcHJldl9jaGFyID0gZWRpdG9yLmdldFJhbmdlKFxyXG5cdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZvdW5kIC0gMSB9LFxyXG5cdFx0XHRcdHsgbGluZTogcG9zaXRpb24ubGluZSwgY2g6IGZvdW5kIH0pXHJcblx0XHRcdGlmIChuZXh0X2NoYXIgPT0gJyQnIHx8IHByZXZfY2hhciA9PSAnJCcgfHwgbmV4dF9jaGFyID09ICcgJykge1xyXG5cdFx0XHRcdGZyb20gPSBmb3VuZCArIDE7XHJcblx0XHRcdFx0Zm91bmQgPSBjdXJyZW50X2xpbmUuaW5kZXhPZignJCcsIGZyb20pO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZyb20gPSBmb3VuZCArIDE7XHJcblx0XHRcdFx0bGV0IG5leHRfZm91bmQgPSBjdXJyZW50X2xpbmUuaW5kZXhPZignJCcsIGZyb20pO1xyXG5cdFx0XHRcdGlmIChuZXh0X2ZvdW5kID09IC0xKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChjdXJzb3JfaW5kZXggPiBmb3VuZCAmJiBjdXJzb3JfaW5kZXggPD0gbmV4dF9mb3VuZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGZyb20gPSBuZXh0X2ZvdW5kICsgMTtcclxuXHRcdFx0XHRcdGZvdW5kID0gY3VycmVudF9saW5lLmluZGV4T2YoJyQnLCBmcm9tKTtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGRvY3VtZW50X3RleHQgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcclxuXHRcdGN1cnNvcl9pbmRleCA9IGVkaXRvci5wb3NUb09mZnNldChwb3NpdGlvbik7XHJcblx0XHRmcm9tID0gMDtcclxuXHRcdGZvdW5kID0gZG9jdW1lbnRfdGV4dC5pbmRleE9mKCckJCcsIGZyb20pO1xyXG5cdFx0bGV0IGNvdW50ID0gMDtcclxuXHRcdHdoaWxlIChmb3VuZCAhPSAtMSAmJiBmb3VuZCA8IGN1cnNvcl9pbmRleCkge1xyXG5cdFx0XHRjb3VudCArPSAxO1xyXG5cdFx0XHRmcm9tID0gZm91bmQgKyAyO1xyXG5cdFx0XHRmb3VuZCA9IGRvY3VtZW50X3RleHQuaW5kZXhPZignJCQnLCBmcm9tKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBjb3VudCAlIDIgPT0gMTtcclxuXHR9O1xyXG5cclxuXHRwcml2YXRlIHJlYWRvbmx5IHdpdGhpbkFueUJyYWNrZXRzX2lubGluZSA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0YnJhY2tldHM6IHN0cmluZ1tdW11cclxuXHQpOiBCb29sZWFuID0+IHtcclxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZWRpdG9yLmdldEN1cnNvcigpXHJcblx0XHRjb25zdCBjdXJyZW50X2xpbmUgPSBlZGl0b3IuZ2V0TGluZShwb3NpdGlvbi5saW5lKTtcclxuXHRcdHJldHVybiBicmFja2V0cy5zb21lKGUgPT4gdGhpcy51bmNsb3NlZF9icmFja2V0KGVkaXRvciwgZVswXSwgZVsxXSwgcG9zaXRpb24uY2gsIDApWzBdICYmXHJcblx0XHRcdHRoaXMudW5jbG9zZWRfYnJhY2tldChlZGl0b3IsIGVbMF0sIGVbMV0sIGN1cnJlbnRfbGluZS5sZW5ndGgsIHBvc2l0aW9uLmNoLCBmYWxzZSlbMF0pXHJcblx0fTtcclxuXHJcblx0cHJpdmF0ZSByZWFkb25seSB3aXRoaW5BbnlCcmFja2V0c19kb2N1bWVudCA9IChcclxuXHRcdGVkaXRvcjogRWRpdG9yLFxyXG5cdFx0b3Blbl9zeW1ib2w6IHN0cmluZyxcclxuXHRcdGNsb3NlX3N5bWJvbDogc3RyaW5nXHJcblx0KTogQm9vbGVhbiA9PiB7XHJcblx0XHRjb25zdCBkb2N1bWVudF90ZXh0ID0gZWRpdG9yLmdldFZhbHVlKClcclxuXHRcdGNvbnN0IGN1cnNvclBvcyA9IGVkaXRvci5nZXRDdXJzb3IoKVxyXG5cdFx0Y29uc3QgY3Vyc29yX2luZGV4ID0gZWRpdG9yLnBvc1RvT2Zmc2V0KGN1cnNvclBvcylcclxuXHRcdC8vIGNvdW50IG9wZW4gc3ltYm9sc1xyXG5cdFx0bGV0IGZyb20gPSAwO1xyXG5cdFx0bGV0IGZvdW5kID0gZG9jdW1lbnRfdGV4dC5pbmRleE9mKG9wZW5fc3ltYm9sLCBmcm9tKTtcclxuXHRcdGxldCBjb3VudCA9IDA7XHJcblx0XHR3aGlsZSAoZm91bmQgIT0gLTEgJiYgZm91bmQgPCBjdXJzb3JfaW5kZXgpIHtcclxuXHRcdFx0Y291bnQgKz0gMTtcclxuXHRcdFx0ZnJvbSA9IGZvdW5kICsgMTtcclxuXHRcdFx0Zm91bmQgPSBkb2N1bWVudF90ZXh0LmluZGV4T2Yob3Blbl9zeW1ib2wsIGZyb20pO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgb3Blbl9zeW1ib2xfY291bnRzID0gY291bnRcclxuXHJcblx0XHQvLyBjb3VudCBjbG9zZSBzeW1ib2xzXHJcblx0XHRmcm9tID0gMDtcclxuXHRcdGZvdW5kID0gZG9jdW1lbnRfdGV4dC5pbmRleE9mKGNsb3NlX3N5bWJvbCwgZnJvbSk7XHJcblx0XHRjb3VudCA9IDA7XHJcblx0XHR3aGlsZSAoZm91bmQgIT0gLTEgJiYgZm91bmQgPCBjdXJzb3JfaW5kZXgpIHtcclxuXHRcdFx0Y291bnQgKz0gMTtcclxuXHRcdFx0ZnJvbSA9IGZvdW5kICsgMTtcclxuXHRcdFx0Zm91bmQgPSBkb2N1bWVudF90ZXh0LmluZGV4T2YoY2xvc2Vfc3ltYm9sLCBmcm9tKTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGNsb3NlX3N5bWJvbF9jb3VudHMgPSBjb3VudFxyXG5cclxuXHRcdHJldHVybiBvcGVuX3N5bWJvbF9jb3VudHMgPiBjbG9zZV9zeW1ib2xfY291bnRzO1xyXG5cdH07XHJcblxyXG5cdC8vIFNldHRpbmdzIGxvYWQgYW5kIHNhdmVcclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHR9O1xyXG5cclxuXHRwdWJsaWMgb251bmxvYWQoKTogdm9pZCB7XHJcblx0XHRjb25zb2xlLmxvZygndW5sb2FkaW5nIFF1aWNrLUxhdGV4IHBsdWdpbicpO1xyXG5cclxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5pdGVyYXRlQ29kZU1pcnJvcnMoKGNtKSA9PiB7XHJcblx0XHRcdGNtLm9mZigndmltLW1vZGUtY2hhbmdlJywgdGhpcy5oYW5kbGVWaW1Nb2RlQ2hhbmdlKTtcclxuXHRcdFx0Y20ub2ZmKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duKTtcclxuXHRcdFx0Y20ub2ZmKCdrZXlwcmVzcycsIHRoaXMuaGFuZGxlS2V5UHJlc3MpO1xyXG5cdFx0XHRcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcbn07XHJcblxyXG5cclxuY2xhc3MgUXVpY2tMYXRleFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHRwbHVnaW46IFF1aWNrTGF0ZXhQbHVnaW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFF1aWNrTGF0ZXhQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdRdWljayBMYXRleCBmb3IgT2JzaWRpYW4gLSBTZXR0aW5ncycgfSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvY2xvc2UgJCQgc3ltYm9scycpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgb25lICQgc3ltYm9sIHdpbGwgYXV0b21hdGljYWxseSBsb3NlIHdpdGggYW5vdGhlciAkIHN5bWJvbCAnK1xyXG5cdFx0XHRcdFx0JyhiZXN0IHVzZWQgd2l0aCBcIk1vdmUgY3Vyc29yIGJldHdlZW4gJCQgc3ltYm9sc1wiIGZ1bmN0aW9uJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlTWF0aF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlTWF0aF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ01vdmUgY3Vyc29yIGJldHdlZW4gJCQgc3ltYm9scycpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgdHdvIGNvbnNlY3V0aXZlICQgc3ltYm9scyB3aWxsIGF1dG9tYXRpY2FsbHkgc2hpZnQgdGhlIGN1cnNvciBpbiBiZXR3ZWVuIHRoZSAkJCBzeW1ib2xzJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MubW92ZUludG9NYXRoX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5tb3ZlSW50b01hdGhfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdFbmNsb3NlIHNlbGVjdGVkIGV4cHJlc3Npb24gd2l0aCBtYXRoIHN5bWJvbCAkJCcpXHJcblx0XHRcdC5zZXREZXNjKCdTZWxlY3QgYW4gZXhwcmVzc2lvbiBhbmQgcHJlc3MgXCIkXCIga2V5IHdpbGwgYXV0b21hdGljYWxseSAnICtcclxuXHRcdFx0XHQnZW5jbG9zZSB0aGUgZXhwcmVzc2lvbiB3aXRoIHRoZSBtYXRoIHN5bWJvbHMuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5jbG9zZVNlbGVjdGlvbl90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZW5jbG9zZVNlbGVjdGlvbl90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG9jbG9zZSB7fSBjdXJseSBicmFja2V0cycpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgXCJ7XCIgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHdpdGggXCJ9XCInKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VDdXJseV90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlQ3VybHlfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvY2xvc2UgW10gc3F1YXJlIGJyYWNrZXRzJylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBcIltcIiB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2Ugd2l0aCBcIl1cIicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZVNxdWFyZV90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0Nsb3NlU3F1YXJlX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0b2Nsb3NlICgpIHJvdW5kIGJyYWNrZXRzJylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBcIihcIiB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2Ugd2l0aCBcIilcIicpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9DbG9zZVJvdW5kX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvQ2xvc2VSb3VuZF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0F1dG8gYXBwZW5kIFwiXFxcXGxpbWl0c1wiIGFmdGVyIFwiXFxcXHN1bVwiJylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBcIlxcXFxzdW1cIiB3aWxsIGF1dG9tYXRpY2FsbHkgYXBwZW5kIFwiXFxcXGxpbWl0c1wiIHRvIHNob3J0ZW4gdGhlIHN5bnRheCcgK1xyXG5cdFx0XHRcdCcgZm9yIHByb3BlciBkaXNwbGF5IG9mIHRoZSBsaW1pdHMgZm9yIHN1bW1hdGlvbiBzeW1ib2wuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b1N1bUxpbWl0X3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvU3VtTGltaXRfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvIGVubGFyZ2UgYnJhY2tldHMgdGhhdCBjb250YWlucyBcXFxcc3VtLCBcXFxcaW50IG9yIFxcXFxmcmFjJylcclxuXHRcdFx0LnNldERlc2MoJ1BsYWNlIGN1cnNvciByaWdodCBhZnRlciBhICgpIG9yIFtdIGJyYWNrZXRlZCBleHByZXNzaW9uIHRoYXQgY29udGFpbnMgZWl0aGVyICcgK1xyXG5cdFx0XHRcdCdcXFxcc3VtLCBcXFxcaW50IG9yIFxcXFxmcmFjIGFuZCBwcmVzcyB0aGUgc3BhY2Uga2V5LCB0aGUgb3V0ZXJtb3N0IGJyYWNrZXRzIHdpbGwgYmUnICtcclxuXHRcdFx0XHQnIGFwcGVuZGVkIHdpdGggXFxcXGxlZnQgYW5kIFxcXFxyaWdodCBpbiBvcmRlciB0byBkaXNwbGF5IGxhcmdlciBicmFja2V0cyB0byBlbmNsb3NlIHRoZXNlIGJpZyBleHByZXNzaW9ucy4nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvTGFyZ2VCcmFja2V0X3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0byBlbmNsb3NlIGV4cHJlc3Npb24gYWZ0ZXIgc3VwZXJzY2lwdCB3aXRoIHt9JylcclxuXHRcdFx0LnNldERlc2MoJ1R5cGluZyBleHByZXNzaW9uIGFmdGVyIHN1cGVyc2NyaXB0IFwiXlwiIHN5bWJvbCBmb2xsb3cgYnkgYSBcInNwYWNlXCIga2V5ICcgK1xyXG5cdFx0XHRcdCd3aWxsIGF1dG9tYXRpY2FsbHkgc3Vycm91bmQgdGhlIGV4cHJlc3Npb24gd2l0aCBcInt9XCInKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvRW5jbG9zZVN1cF90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0VuY2xvc2VTdXBfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdBdXRvIGVuY2xvc2UgZXhwcmVzc2lvbiBhZnRlciBzdWJzY3JpcHQgd2l0aCB7fScpXHJcblx0XHRcdC5zZXREZXNjKCdUeXBpbmcgZXhwcmVzc2lvbiBhZnRlciBzdWJzY3JpcHQgXCJfXCIgc3ltYm9sIGZvbGxvdyBieSBhIFwic3BhY2VcIiBrZXkgJyArXHJcblx0XHRcdFx0J3dpbGwgYXV0b21hdGljYWxseSBzdXJyb3VuZCB0aGUgZXhwcmVzc2lvbiB3aXRoIFwie31cIi4gJyArXHJcblx0XHRcdFx0J05vdGU6IGV4cHJlc3Npb24gbW9yZSB0aGFuIDEwIGNoYXJhY3RlcnMgbG9uZyB3aWxsIGJlIGlnbm9yZWQuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0VuY2xvc2VTdWJfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9FbmNsb3NlU3ViX3RvZ2dsZSA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdFx0dGhpcy5kaXNwbGF5KCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVHlwZSBcIi9cIiBpbnN0ZWFkIG9mIFxcXFxmcmFje317fScpXHJcblx0XHRcdC5zZXREZXNjKCdVc2UgXCIvXCIgc3ltYm9sIGZvciBxdWlja2x5IHR5cGluZyBmcmFjdGlvbnMuIGVnLiB0eXBlIFwiMS8yXCIgZm9sbG93ZWQgYnkgYSBcInNwYWNlXCIga2V5JyArXHJcblx0XHRcdFx0JyB0byB0cmFuc2Zvcm0gdG8gXFxcXGZyYWN7MX17Mn0nKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hdXRvRnJhY3Rpb25fdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9GcmFjdGlvbl90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1Nob3J0Y3V0IGZvciBBbGlnbiBCbG9jaycpXHJcblx0XHRcdC5zZXREZXNjKCdVc2Ugc2hvcnRjdXQga2V5IHRvIHF1aWNrbHkgaW5zZXJ0IFxcXFxiZWdpbnthbGlnbip9IFxcXFxlbmR7YWxpZ24qfSBibG9jay4gJyArXHJcblx0XHRcdFx0J0RlZmF1bHQ6IFwiQWx0K1NoaWZ0K0FcIiAoTWFjOiBcIk9wdGlvbitTaGlmdCtBXCIpJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkQWxpZ25CbG9ja190b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkQWxpZ25CbG9ja190b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0FsaWduIEJsb2NrIFBhcmFtZXRlcicpXHJcblx0XHRcdC5zZXREZXNjKCdTZXQgdGhlIHRleHQgcGFyYW1ldGVyIGluIFxcXFxiZWdpbntwYXJhbWV0ZXJ9IGFuZCBcXFxcZW5ke3BhcmFtZXRlcn0uJylcclxuXHRcdFx0LmFkZFRleHQoKHRleHQpID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ2RlZmF1bHQ6IGFsaWduKicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZEFsaWduQmxvY2tfcGFyYW1ldGVyID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgn44CQTkVXIeOAkUF1dG8tYWxpZ24gYXQgdGhlc2Ugc3ltYm9scycpXHJcblx0XHRcdC5zZXREZXNjKCdXaGVuIHdpdGhpbiB0aGUgYWxpZ24gYmxvY2ssIHRoZSBhbGlnbiBzeW1ib2wgXCImXCIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGJlZm9yZSB0aGVzZSBzeW1ib2xzLiAoc2VwYXJhdGUgYnkgc3BhY2VzKScpXHJcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmF1dG9BbGlnblN5bWJvbHMpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYXV0b0FsaWduU3ltYm9scyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uYXV0b0FsaWduX2FycmF5ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1Nob3J0Y3V0IGZvciBDYXNlcyBCbG9jaycpXHJcblx0XHRcdC5zZXREZXNjKCdVc2Ugc2hvcnRjdXQga2V5IHRvIHF1aWNrbHkgaW5zZXJ0IFxcXFxiZWdpbntjYXNlc30gXFxcXGVuZHtjYXNlc30gYmxvY2suICcgK1xyXG5cdFx0XHRcdCdEZWZhdWx0OiBcIkFsdCtTaGlmdCtDXCIgKE1hYzogXCJPcHRpb24rU2hpZnQrQ1wiKScpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZENhc2VzQmxvY2tfdG9nZ2xlID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnBsdWdpbi5zZXR0aW5ncyk7XHJcblx0XHRcdFx0XHR0aGlzLmRpc3BsYXkoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcdFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdVc2Ugc2hpZnQtZW50ZXIgZm9yIGxpbmUgYnJlYWsgaW4gYWxpZ24gYW5kIGNhc2VzIGJsb2NrJylcclxuXHRcdFx0LnNldERlc2MoJ0ZvciBhbGlnbiBhbmQgY2FzZXMgYmxvY2sgYWJvdmUsIHByZXNzaW5nIGVudGVyIGF1dG9tYXRpY2FsbHkgYWRkcyBsaW5lIGJyZWFrIHN5bWJvbCBcIlxcXFxcIiBvciBcIiZcIi4gU3dpdGNoIGhlcmUgdG8gdXNlIHNoaWZ0LWVudGVyIGluc3RlYWQuJylcclxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB0b2dnbGVcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hpZnRFbnRlcl90b2dnbGUpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc2hpZnRFbnRlcl90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1Nob3J0Y3V0IGZvciBNYXRyaXggQmxvY2snKVxyXG5cdFx0XHQuc2V0RGVzYygnVXNlIHNob3J0Y3V0IGtleSB0byBxdWlja2x5ICBpbnNlcnQgXFxcXGJlZ2lue3BtYXRyaXh9IFxcXFxlbmR7cG1hdHJpeH0gYmxvY2suICcgK1xyXG5cdFx0XHRcdCdEZWZhdWx0OiBcIkFsdCtTaGlmdCtNXCIgKE1hYzogXCJPcHRpb24rU2hpZnQrTVwiKScpXHJcblx0XHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4gdG9nZ2xlXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3RvZ2dsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hZGRNYXRyaXhCbG9ja190b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ01hdHJpeCBCbG9jayBQYXJhbWV0ZXInKVxyXG5cdFx0XHQuc2V0RGVzYygnU2V0IHRoZSB0ZXh0IHBhcmFtZXRlciBpbiBcXFxcYmVnaW57cGFyYW1ldGVyfSBhbmQgXFxcXGVuZHtwYXJhbWV0ZXJ9LicpXHJcblx0XHRcdC5hZGRUZXh0KCh0ZXh0KSA9PiB0ZXh0XHJcblx0XHRcdFx0LnNldFBsYWNlaG9sZGVyKCdkZWZhdWx0OiBwbWF0cml4JylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYWRkTWF0cml4QmxvY2tfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFkZE1hdHJpeEJsb2NrX3BhcmFtZXRlciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0N1c3RvbSBTaG9ydGhhbmQnKVxyXG5cdFx0XHQuc2V0RGVzYygnVXNlIGN1c3RvbSBzaG9ydGhhbmQgKGNhbiBiZSBtdWx0aXBsZSBsZXR0ZXJzKSBmb3IgY29tbW9uIGxhdGV4IHN0cmluZ3MuICcrXHJcblx0XHRcdCdFZywgdHlwaW5nIFwiYWxcIiBmb2xsb3dlZCBieSBcInNwYWNlXCIga2V5IHdpbGwgcmVwbGFjZSB3aXRoIFwiXFxcXGFscGhhXCInKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHRvZ2dsZVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfdG9nZ2xlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF90b2dnbGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVEYXRhKHRoaXMucGx1Z2luLnNldHRpbmdzKTtcclxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0N1c3RvbSBTaG9ydGhhbmQgUGFyYW1ldGVyJylcclxuXHRcdFx0LnNldERlc2MoJ1NlcGFyYXRlIHRoZSBtdWx0aS1sZXR0ZXJzIHNob3J0aGFuZCBhbmQgdGhlIHNuaXBwZXQgd2l0aCBcIjpcIiBhbmQgJytcclxuXHRcdFx0J2VuZCBlYWNoIHNldCBvZiBzaG9ydGhhbmQgc25pcHBldCBwYWlyIGJ5IFwiO1wiIGFuZCBhIG5ld2xpbmUuICcrXHJcblx0XHRcdCdGb3IgZXhwcmVzc2lvbnMgdGhhdCBlbmQgd2l0aCBcInt9XCIsIHRoZSBjdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBsYWNlZCB3aXRoaW4gdGhlIGJyYWNrZXQuICcrXHJcblx0XHRcdCdBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHR5cGUgXCIjY3Vyc29yXCIgd2l0aGluIHRoZSBzbmlwcGV0IHRvIHNldCB0aGUgY3Vyc29yIGxvY2F0aW9uIGFmdGVyIHJlcGxhY2VtZW50LiAnK1xyXG5cdFx0XHQnWW91IGNhbiBhbHNvIGluY2x1ZGUgXCIjdGFiXCIgd2l0aGluIHRoZSBzbmlwcGV0IGZvciB1c2UgY2FzZXMgc3VjaCBhcyBtdWx0aXBsZSB7fXMgKGUuZy4gXFxcXGJpbm9teyNjdXJzb3J9eyN0YWJ9KS4gJytcclxuXHRcdFx0J1ByZXNzaW5nIHRhYiBrZXkgaW4gc3VjaCBjYXNlcyB3aWxsIGp1bXAgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBcIiN0YWJcIiBrZXl3b3JkLicrXHJcblx0XHRcdCdTaG9ydGhhbmRzIG5vdyBzdXBwb3J0IG11bHRpbGluZSBzbmlwcGV0cyB0b28hICcrXHJcblx0XHRcdCcodHJ5IHVuaW5zdGFsbCB0aGVuIHJlaW5zdGFsbGluZyB0aGUgcGx1Z2luIHRvIHNlZSB0aGUgbmV3IHNldCBvZiBzaG9ydGhhbmRzLiknKVxyXG5cdFx0XHQuc2V0Q2xhc3MoXCJ0ZXh0LXNuaXBwZXRzLWNsYXNzXCIpXHJcblx0XHRcdC5hZGRUZXh0QXJlYSgodGV4dCkgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jdXN0b21TaG9ydGhhbmRfcGFyYW1ldGVyKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmN1c3RvbVNob3J0aGFuZF9wYXJhbWV0ZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHdoaWxlKHZhbHVlLnNsaWNlKC0xKT09XCJcXG5cIil7XHJcblx0XHRcdFx0XHRcdHZhbHVlID0gdmFsdWUuc2xpY2UoMCwtMSlcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmKHZhbHVlLnNsaWNlKC0xKT09XCI7XCIpe1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsLTEpXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZih2YWx1ZS5sYXN0SW5kZXhPZihcIjtcXG5cIik9PS0xKXtcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2hvcnRoYW5kX2FycmF5ID0gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcChpdGVtPT5pdGVtLnNwbGl0KFwiOlwiKS5tYXAoaXRlbT0+aXRlbS50cmltKCkpKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRoaXMucGx1Z2luLnNob3J0aGFuZF9hcnJheSA9IHZhbHVlLnNwbGl0KFwiO1xcblwiKS5tYXAoaXRlbT0+aXRlbS5zcGxpdChcIjpcIikpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEodGhpcy5wbHVnaW4uc2V0dGluZ3MpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHR9O1xyXG59Il0sIm5hbWVzIjpbIlBsdWdpbiIsIlByZWMiLCJrZXltYXAiLCJNYXJrZG93blZpZXciLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFB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TUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFDLElBQUksRUFBQyxNQUFNLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxNQUFNLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTs2QkFDcEY7NEJBQ0QsT0FBTyxJQUFJLENBQUE7eUJBQ1g7d0JBQ0QsT0FBTyxLQUFLLENBQUE7cUJBQ1o7eUJBQU07O3dCQUVOLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTt3QkFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFDckMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7d0JBQ3JDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2hDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsRUFDbkMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO3dCQUN2QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNqQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLEVBQ25DLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTt3QkFDdkMsSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUM7NEJBQ3hDLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtnQ0FDdkIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7Z0NBQ3ZELE9BQU8sSUFBSSxDQUFBOzZCQUNYO2lDQUFNO2dDQUNOLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO2dDQUN2RCxPQUFPLElBQUksQ0FBQTs2QkFDWDt5QkFDRDs7d0JBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTs0QkFDdEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUM3Qjs7d0JBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFOzRCQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ3hCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBOzRCQUMxQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUN6QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQ3hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTs0QkFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDMUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7NEJBQzFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxFQUFFO2dDQUMxQixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTs2QkFDOUQ7aUNBQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dDQUN2QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTs2QkFDOUQ7eUJBQ0Q7d0JBQ0QsT0FBTyxLQUFLLENBQUE7cUJBQ1o7aUJBQ0Q7YUFFRDtZQUNEO2dCQUNDLEdBQUcsRUFBRSxLQUFLO2dCQUNWLEdBQUcsRUFBRTtvQkFDSixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFBO29CQUNqRSxJQUFJLENBQUMsSUFBSTt3QkFBRSxPQUFPLEtBQUssQ0FBQTtvQkFFdkIsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQTs7b0JBRzNCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTt3QkFDeEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsR0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQTt3QkFDeE0sTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsR0FBQyxHQUFHLEVBQUUsZUFBZSxFQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLENBQUE7d0JBQ3hMLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQTt3QkFDakIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO3dCQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDN0MsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDM0UsS0FBSyxHQUFHLElBQUksQ0FBQTtnQ0FDWixRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dDQUN4QixNQUFNOzZCQUNOO3lCQUNGO3dCQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFBO3dCQUUvRyxJQUFJLEtBQUssRUFBRTs0QkFDVixJQUFJLFVBQVUsSUFBSSxLQUFLLEVBQUU7Z0NBQ3hCLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7Z0NBQ3BHLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxRQUFRLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7Z0NBQ3hFLE9BQU8sSUFBSSxDQUFBOzZCQUNYO2lDQUFNO2dDQUNOLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQ0FDOUIsT0FBTyxJQUFJLENBQUE7NkJBQ1g7eUJBQ0Q7cUJBQ0Q7O29CQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTt3QkFDdkMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUMxQyxnQkFBZ0IsRUFDaEIsY0FBYyxDQUNiLEVBQUU7NEJBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNwQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7NEJBQy9HLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBQyxDQUFDLENBQUMsQ0FBQTs0QkFDakQsSUFBSSxVQUFVLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxjQUFjLEVBQUU7Z0NBQ3ZELE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7Z0NBQ3BHLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksR0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFBO2dDQUM3RCxPQUFPLElBQUksQ0FBQTs2QkFDWDtpQ0FBTTtnQ0FDTixNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUE7Z0NBQzlCLE9BQU8sSUFBSSxDQUFBOzZCQUNYO3lCQUNEO3FCQUNEOztvQkFHRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ25ELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDL0QsSUFBSSxZQUFZLElBQUUsQ0FBQyxDQUFDLEVBQUM7NEJBQ3BCLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUN0QixFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxZQUFZLEVBQUMsRUFDckMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7NEJBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQTs0QkFDdkQsT0FBTyxJQUFJLENBQUE7eUJBQ1g7cUJBQ0Q7O29CQUdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7d0JBQzNHLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQzt3QkFDckQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFDLENBQUMsQ0FBQyxDQUFBO3dCQUNqRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7NEJBQ25CLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUN4RCxPQUFPLElBQUksQ0FBQTt5QkFDWDs2QkFBTSxJQUFJLFFBQVEsQ0FBQyxFQUFFLElBQUksT0FBTyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7NEJBQ3ZELE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksR0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFBOzRCQUM3RCxPQUFPLElBQUksQ0FBQTt5QkFDWDs2QkFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUU7NEJBQzVCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUN4RCxPQUFPLElBQUksQ0FBQTt5QkFDWDtxQkFDRDs7b0JBR0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUM1QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3BDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNuRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUE7d0JBQzNILE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUMvQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQzlDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQ0FDMUQsT0FBTyxJQUFJLENBQUE7NkJBQ1g7eUJBQ0Q7cUJBQ0Q7O29CQUdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7d0JBQ3JELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDakQsSUFBSSxRQUFRLENBQUMsRUFBRSxJQUFJLE9BQU8sSUFBSSxTQUFTLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEdBQUMsR0FBRyxFQUFFOzRCQUNoRyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxTQUFTLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTs0QkFDN0QsT0FBTyxJQUFJLENBQUE7eUJBQ1g7cUJBQ0Q7b0JBR0QsT0FBTyxLQUFLLENBQUE7aUJBQ1o7YUFDRDtZQUNEO2dCQUNDLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixHQUFHLEVBQUU7b0JBRUosTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFBO3dCQUN2RyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7d0JBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUNoRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQzlDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQ0FDNUMsT0FBTyxJQUFJLENBQUE7NkJBQ1g7aUNBQU0sSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsR0FBRyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFFLEdBQUcsRUFBRTtnQ0FDdkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQ0FDOUMsT0FBTyxJQUFJLENBQUE7NkJBQ1g7aUNBQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxFQUFFO2dDQUMxQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQ0FDeEQsT0FBTyxJQUFJLENBQUE7NkJBQ1g7aUNBQU0sSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBRSxHQUFHLEVBQUU7Z0NBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO2dDQUN4RCxPQUFPLElBQUksQ0FBQTs2QkFDWDt5QkFDRDtxQkFDRDtvQkFDRCxPQUFPLEtBQUssQ0FBQTtpQkFDWjthQUNEO1lBQ0Q7Z0JBQ0MsR0FBRyxFQUFFLE9BQU87Z0JBQ1osR0FBRyxFQUFFO29CQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUE7b0JBQ2pFLElBQUksQ0FBQyxJQUFJO3dCQUFFLE9BQU8sS0FBSyxDQUFBO29CQUV2QixNQUFNLE1BQU0sR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFBO29CQUUzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7d0JBQ3JDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUI7d0JBQ3RDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7d0JBQ3BDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7d0JBQ3BDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7d0JBQUUsT0FBTyxLQUFLLENBQUM7b0JBRXJELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7d0JBR25FLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTs0QkFDbEYsSUFBSSxPQUFPLEdBQVUsRUFBRSxDQUFDOzRCQUN4QixJQUFJLGNBQWMsR0FBVSxDQUFDLENBQUM7NEJBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtnQ0FDdkQsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dDQUNuRCxJQUFLLGNBQWMsR0FBRyxRQUFRLENBQUMsRUFBRSxFQUFFO29DQUNsQyxTQUFTO2lDQUNUO3FDQUFNLElBQUssY0FBYyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUc7b0NBQzNDLE9BQU8sR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDOUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxjQUFjLEVBQUUsRUFDekQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7aUNBQzNDO3FDQUFNO29DQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUN4QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxDQUFDLEVBQUUsRUFDN0QsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7aUNBQzNDO2dDQUNELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7b0NBQ3ZELE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUc7b0NBQ3BCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUUsY0FBYyxDQUFDO3dDQUNoRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRTt3Q0FDdkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0NBQ3hGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7d0NBQzFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDN0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsYUFBYSxFQUFFLEVBQ3pFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dDQUMzQyxJQUFJLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxFQUFFOzRDQUM5QixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFDdEIsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsYUFBYSxHQUFHLG1CQUFtQixFQUFDLEVBQzNGLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLGFBQWEsR0FBRyxtQkFBbUIsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDOzRDQUMvRixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLGFBQWEsR0FBRyxtQkFBbUIsRUFBQyxDQUFDLENBQUE7eUNBQzdHOzZDQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7NENBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQ2YsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0RBQ3JCLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLGNBQWMsR0FBRyxDQUFDLEdBQUcsYUFBYSxFQUFDLENBQ3hGLENBQUM7eUNBQ0g7NkNBQU0sQ0FFTjt3Q0FDRCxPQUFPLElBQUksQ0FBQztxQ0FDWjtpQ0FDRDs2QkFDRDt5QkFDRDs7O3dCQUlELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ2pFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTs0QkFDeEMsSUFBSSxjQUFjLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNoRSxJQUFJLGNBQWMsSUFBSSxDQUFDLENBQUMsSUFBSSxjQUFjLEdBQUcsU0FBUyxFQUFFO2dDQUN2RCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzdDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGNBQWMsR0FBRyxDQUFDLEVBQUUsRUFDL0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQ2xELElBQUksc0JBQXNCLElBQUksR0FBRztvQ0FDaEMsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsS0FBSyxFQUFFLEVBQUc7b0NBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQ0FDN0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsY0FBYyxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7b0NBQ3BFLE9BQU8sSUFBSSxDQUFDO2lDQUNaOzZCQUNEO3lCQUNEOzt3QkFHRCxJQUFJLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFFbEUsT0FBTyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsRUFBRTs0QkFDOUIsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNwRCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsRUFDakQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDcEQsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksNkJBQTZCLElBQUksSUFBSSxFQUFFO2dDQUNyRixnQkFBZ0IsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQzs2QkFDdkU7aUNBQU0sSUFBSSxnQkFBZ0IsR0FBRyxTQUFTLEVBQUU7Z0NBQ3hDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFBO2dDQUNyQixNQUFNOzZCQUNOO2lDQUFNO2dDQUNOLE1BQU07NkJBQ047eUJBQ0Q7O3dCQUdELElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBRWpFLE9BQU8sV0FBVyxJQUFJLENBQUMsQ0FBQyxFQUFFOzRCQUN6QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNwQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUMvQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQ0FDdkQsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQzs2QkFDN0Q7aUNBQU0sSUFBSSxXQUFXLEdBQUcsU0FBUyxFQUFFO2dDQUNuQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0NBQ2hCLE1BQU07NkJBQ047aUNBQU07Z0NBQ04sTUFBTTs2QkFDTjt5QkFDRDs7d0JBR0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxJQUFJLGdCQUFnQixHQUFHLFdBQVcsRUFBRTs7Z0NBRW5DLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQ0FDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQ0FDckcsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztpQ0FDNUQ7NkJBQ0Q7eUJBQ0Q7O3dCQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFOzRCQUMvRSxJQUFJLFdBQVcsR0FBRyxXQUFXLEVBQUU7Z0NBQzlCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7Z0NBRXRELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29DQUNoRyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7aUNBQ3REOzZCQUNEO3lCQUNEOzt3QkFHRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7NEJBQzFDLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2xDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBOzRCQUMxQyxJQUFJLGFBQWEsSUFBSSxHQUFHLElBQUksYUFBYSxJQUFJLEdBQUcsRUFBRTtnQ0FDakQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDOzZCQUM1Qzt5QkFDRDs7d0JBR0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFOzRCQUN6QixJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FDbEMsTUFBTSxFQUNOLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUNsRCxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUNoRDtnQ0FDRCxJQUFJLE9BQU8sR0FBVSxFQUFFLENBQUM7Z0NBQ3hCLElBQUksY0FBYyxHQUFVLENBQUMsQ0FBQztnQ0FDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFHLENBQUMsRUFBRSxFQUFFO29DQUN2RCxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7b0NBQ2hELElBQUssY0FBYyxHQUFHLFFBQVEsQ0FBQyxFQUFFLEVBQUU7d0NBQ2xDLFNBQVM7cUNBQ1Q7eUNBQU07d0NBQ04sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ3hCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQ3pELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3FDQUMzQztvQ0FDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFO3dDQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUM7d0NBQ3BGLE9BQU8sS0FBSyxDQUFDO3FDQUNiO2lDQUNEOzZCQUNEO3lCQUNEO3FCQUNEO2lCQUNEO2FBRUQ7WUFDRDtnQkFDQyxHQUFHLEVBQUUsT0FBTztnQkFDWixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBQ3ZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFFLEtBQUssRUFBRTt3QkFDakYsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQ2xDLE1BQU0sRUFDTixVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFDbEQsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFDaEQ7NEJBQ0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBOzRCQUNqQyxPQUFPLElBQUksQ0FBQzt5QkFDWjtxQkFDRDtvQkFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBRSxLQUFLLEVBQUU7d0JBQ2pGLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUNsQyxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZCxFQUFFOzRCQUNGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTs0QkFDbEMsT0FBTyxJQUFJLENBQUM7eUJBQ1o7cUJBQ0Q7b0JBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO3dCQUN4QyxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBQyxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO3dCQUN4TSxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTt3QkFDeEwsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFBO3dCQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs0QkFDN0MsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDM0UsS0FBSyxHQUFHLElBQUksQ0FBQTtnQ0FDWixNQUFNOzZCQUNOO3lCQUNGO3dCQUNELElBQUksS0FBSyxFQUFFOzRCQUNWLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTs0QkFDakMsT0FBTyxJQUFJLENBQUE7eUJBQ1g7cUJBQ0Q7O29CQUdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNqQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTt3QkFDMUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDakMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7d0JBQzlDLElBQUksVUFBVSxJQUFFLElBQUksSUFBRSxVQUFVLElBQUUsSUFBSSxFQUFFOzRCQUN2QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUE7NEJBQzdCLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7NEJBQzFCLE9BQU8sS0FBSyxDQUFBO3lCQUNaO3FCQUNEO29CQUNELE9BQU8sS0FBSyxDQUFBO2lCQUNaO2FBQ0Q7WUFDRDtnQkFDQyxHQUFHLEVBQUUsYUFBYTtnQkFDbEIsR0FBRyxFQUFFO29CQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUE7b0JBQ2pFLElBQUksQ0FBQyxJQUFJO3dCQUFFLE9BQU8sS0FBSyxDQUFBO29CQUN2QixNQUFNLE1BQU0sR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFBO29CQUMzQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsSUFBRSxJQUFJLEVBQUU7d0JBQ2hGLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUNsQyxNQUFNLEVBQ04sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQ2xELFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQ2hEOzRCQUNELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQTs0QkFDakMsT0FBTyxJQUFJLENBQUM7eUJBQ1o7cUJBQ0Q7b0JBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLElBQUUsSUFBSSxFQUFFO3dCQUNoRixJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FDbEMsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixjQUFjLENBQ2QsRUFBRTs0QkFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUE7NEJBQ2xDLE9BQU8sSUFBSSxDQUFDO3lCQUNaO3FCQUNEO29CQUNELE9BQU8sS0FBSyxDQUFDO2lCQUNiO2FBQ0Q7WUFDRDtnQkFDQyxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFDeEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QyxNQUFNLG9DQUFvQyxJQUFJLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQzs0QkFDNUcsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksb0NBQW9DLEVBQUU7Z0NBQzdGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7Z0NBQ3pELE9BQU8sSUFBSSxDQUFDOzZCQUNaO3lCQUNEO3FCQUNEO29CQUNELE9BQU8sS0FBSyxDQUFBO2lCQUNaO2FBRUQ7WUFDRDtnQkFDQyxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixFQUFFOzRCQUN6QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFDeEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QyxNQUFNLG9DQUFvQyxJQUFJLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQzs0QkFDNUcsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksb0NBQW9DLEVBQUU7Z0NBQzdGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7Z0NBQ3pELE9BQU8sSUFBSSxDQUFDOzZCQUNaO3lCQUNEO3FCQUNEO29CQUNELE9BQU8sS0FBSyxDQUFBO2lCQUNaO2FBQ0Q7WUFDRDtnQkFDQyxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQzdDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFDeEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QyxNQUFNLG9DQUFvQyxJQUFJLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsQ0FBQzs0QkFDNUcsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksb0NBQW9DLEVBQUU7Z0NBQzdGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7Z0NBQ3pELE9BQU8sSUFBSSxDQUFDOzZCQUNaO3lCQUNEO3FCQUNEO29CQUNELE9BQU8sS0FBSyxDQUFBO2lCQUNaO2FBRUQ7WUFDRDtnQkFDQyxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQTs0QkFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUMzRyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3RELENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUMxRCxRQUFRLElBQUksR0FBRyxFQUFFO2dDQUNqQixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtnQ0FDdkQsT0FBTyxJQUFJLENBQUM7NkJBQ1o7aUNBQU07Z0NBQ04sT0FBTyxLQUFLLENBQUM7NkJBQ2I7eUJBQ0Q7cUJBQ0Q7b0JBQ0QsT0FBTyxLQUFLLENBQUE7aUJBQ1o7YUFDRDtZQUNEO2dCQUNDLEdBQUcsRUFBRSxHQUFHO2dCQUNSLEdBQUcsRUFBRTtvQkFDSixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFBO29CQUNqRSxJQUFJLENBQUMsSUFBSTt3QkFBRSxPQUFPLEtBQUssQ0FBQTtvQkFFdkIsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQTtvQkFFM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7NEJBQ3hDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFBOzRCQUNoRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7NEJBQzNHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDdEQsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQzFELFFBQVEsSUFBSSxHQUFHLEVBQUU7Z0NBQ2pCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO2dDQUN2RCxPQUFPLElBQUksQ0FBQzs2QkFDWjtpQ0FBTTtnQ0FDTixPQUFPLEtBQUssQ0FBQzs2QkFDYjt5QkFDRDtxQkFDRDtvQkFDRCxPQUFPLEtBQUssQ0FBQTtpQkFDWjthQUNEO1lBQ0Q7Z0JBQ0MsR0FBRyxFQUFFLEdBQUc7Z0JBQ1IsR0FBRyxFQUFFO29CQUNKLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUE7b0JBQ2pFLElBQUksQ0FBQyxJQUFJO3dCQUFFLE9BQU8sS0FBSyxDQUFBO29CQUV2QixNQUFNLE1BQU0sR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFBO29CQUUzQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTs0QkFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUE7NEJBQ2hELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTs0QkFDM0csSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUN0RCxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDMUQsUUFBUSxJQUFJLEdBQUcsRUFBRTtnQ0FDakIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7Z0NBQ3ZELE9BQU8sSUFBSSxDQUFDOzZCQUNaO2lDQUFNO2dDQUNOLE9BQU8sS0FBSyxDQUFDOzZCQUNiO3lCQUNEO3FCQUNEO29CQUNELE9BQU8sS0FBSyxDQUFBO2lCQUNaO2FBQ0Q7WUFDRDtnQkFDQyxHQUFHLEVBQUUsR0FBRztnQkFDUixHQUFHLEVBQUU7b0JBQ0osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQTtvQkFDakUsSUFBSSxDQUFDLElBQUk7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBRXZCLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxNQUFNLENBQUE7b0JBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQzt3QkFBRSxPQUFPLEtBQUssQ0FBQTtvQkFFMUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUVwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7d0JBQUUsT0FBTztvQkFDL0MsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUM1QixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRTs0QkFDckQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFBOzRCQUNwQyxPQUFPLElBQUksQ0FBQzt5QkFDWjtxQkFDRDtvQkFDRCxPQUFPLEtBQUssQ0FBQTtpQkFDWjthQUNEO1NBQ0QsQ0FBQyxDQUFDLENBQUM7UUF5RWEsd0JBQW1CLEdBQUcsQ0FDaEMsT0FBWTtZQUVaLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUNyQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDOztnQkFFbkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztTQUMzQyxDQUFDO1FBRVksa0JBQWEsR0FBRyxDQUNoQyxFQUFxQixFQUNyQixLQUFvQjtZQUVwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU87WUFFbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUUzQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbkQsUUFBUSxLQUFLLENBQUMsR0FBRztvQkFDaEIsS0FBSyxHQUFHO3dCQUNQLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQ3JDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtnQ0FDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQ0FDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDdEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUE7Z0NBQzFELElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO29DQUM1QixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxJQUFJLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7aUNBQ2xGO3FDQUFNLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFO29DQUNuQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUE7aUNBQ2xGO3FDQUFNO29DQUNOLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBQyxJQUFJLEVBQUMsTUFBTSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsTUFBTSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxJQUFJLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7aUNBQ3BGO2dDQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQ0FDdkIsT0FBTzs2QkFDUDt5QkFDRDs2QkFBTTs7NEJBRU4sTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBOzRCQUNuQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNoQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxFQUNyQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxFQUFDLENBQUMsQ0FBQTs0QkFDckMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxFQUNuQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7NEJBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsRUFDbkMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBOzRCQUN2QyxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLEdBQUcsRUFBQztnQ0FDeEMsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO29DQUN2QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTtvQ0FDdkQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29DQUN2QixPQUFPO2lDQUNQO3FDQUFNO29DQUNOLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBQyxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO29DQUN2RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0NBQ3ZCLE9BQU87aUNBQ1A7NkJBQ0Q7OzRCQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7Z0NBQ3RFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQzs2QkFDN0I7OzRCQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtnQ0FDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dDQUNwQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUN4QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtnQ0FDMUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDekIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7Z0NBQzlDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzFCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dDQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRTtvQ0FDMUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUNBQzlEO3FDQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtvQ0FDdkIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7aUNBQzlEOzZCQUNEO3lCQUNEO3dCQUVELE9BQU87b0JBRVIsS0FBSyxHQUFHO3dCQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQjs0QkFDckMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1Qjs0QkFDdEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQjs0QkFDcEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQjs0QkFDcEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQjs0QkFBRSxPQUFPO3dCQUUvQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBRTVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ25ELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7OzRCQUduRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0NBQ2xGLElBQUksT0FBTyxHQUFVLEVBQUUsQ0FBQztnQ0FDeEIsSUFBSSxjQUFjLEdBQVUsQ0FBQyxDQUFDO2dDQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7b0NBQ3ZELGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQ0FDbkQsSUFBSyxjQUFjLEdBQUcsUUFBUSxDQUFDLEVBQUUsRUFBRTt3Q0FDbEMsU0FBUztxQ0FDVDt5Q0FBTSxJQUFLLGNBQWMsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFHO3dDQUMzQyxPQUFPLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQ3pELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3FDQUMzQzt5Q0FBTTt3Q0FDTixPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDeEIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxjQUFjLEdBQUcsQ0FBQyxFQUFFLEVBQzdELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3FDQUMzQztvQ0FDRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO3dDQUN2RCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFHO3dDQUNwQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFFLGNBQWMsQ0FBQzs0Q0FDaEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUU7NENBQ3ZDLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRDQUN4RixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRDQUMxRSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzdDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLGFBQWEsRUFBRSxFQUN6RSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzs0Q0FDM0MsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLENBQUMsRUFBRTtnREFDOUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQ3RCLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLGFBQWEsR0FBRyxtQkFBbUIsRUFBQyxFQUMzRixFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxhQUFhLEdBQUcsbUJBQW1CLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztnREFDL0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsR0FBRyxhQUFhLEdBQUcsbUJBQW1CLEVBQUMsQ0FBQyxDQUFBOzZDQUM3RztpREFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO2dEQUN4RCxNQUFNLENBQUMsU0FBUyxDQUNmLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO29EQUNyQixFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxjQUFjLEdBQUcsQ0FBQyxHQUFHLGFBQWEsRUFBQyxDQUN4RixDQUFDOzZDQUNIO2lEQUFNLENBRU47NENBQ0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDOzRDQUN2QixPQUFPO3lDQUNQO3FDQUNEO2lDQUNEOzZCQUNEOzs7NEJBSUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFDakUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO2dDQUN4QyxJQUFJLGNBQWMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQ2hFLElBQUksY0FBYyxJQUFJLENBQUMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxTQUFTLEVBQUU7b0NBQ3ZELE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDN0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsY0FBYyxHQUFHLENBQUMsRUFBRSxFQUMvQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQ0FDbEQsSUFBSSxzQkFBc0IsSUFBSSxHQUFHO3dDQUNoQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxLQUFLLEVBQUUsRUFBRzt3Q0FDdkMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7d0NBQ25DLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLGNBQWMsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO3dDQUNwRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7d0NBQ3ZCLE9BQU87cUNBQ1A7aUNBQ0Q7NkJBQ0Q7OzRCQUdELElBQUksZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNsRSxPQUFPLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxFQUFFO2dDQUM5QixNQUFNLDZCQUE2QixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ3BELEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRSxFQUNqRCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dDQUNwRCxJQUFJLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSw2QkFBNkIsSUFBSSxJQUFJLEVBQUU7b0NBQ3JGLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDO2lDQUN2RTtxQ0FBTSxJQUFJLGdCQUFnQixHQUFHLFNBQVMsRUFBRTtvQ0FDeEMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUE7b0NBQ3JCLE1BQU07aUNBQ047cUNBQU07b0NBQ04sTUFBTTtpQ0FDTjs2QkFDRDs7NEJBR0QsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFFakUsT0FBTyxXQUFXLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0NBQ3pCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ3BDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQy9DLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO29DQUN2RCxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lDQUM3RDtxQ0FBTSxJQUFJLFdBQVcsR0FBRyxTQUFTLEVBQUU7b0NBQ25DLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQTtvQ0FDaEIsTUFBTTtpQ0FDTjtxQ0FBTTtvQ0FDTixNQUFNO2lDQUNOOzZCQUNEOzs0QkFHRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7Z0NBQ3hDLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxFQUFFOztvQ0FFbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO29DQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dDQUNyRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzt3Q0FDckQsT0FBTztxQ0FDUDtpQ0FDRDs2QkFDRDs7NEJBR0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUU7Z0NBQy9FLElBQUksV0FBVyxHQUFHLFdBQVcsRUFBRTtvQ0FDOUIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDOztvQ0FFdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0NBQ2hHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3dDQUNuRCxPQUFPO3FDQUNQO2lDQUNEOzZCQUNEOzs0QkFHRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7Z0NBQzFDLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2xDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO2dDQUMxQyxJQUFJLGFBQWEsSUFBSSxHQUFHLElBQUksYUFBYSxJQUFJLEdBQUcsRUFBRTtvQ0FDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztvQ0FDckMsT0FBTztpQ0FDUDs2QkFDRDt5QkFFRDt3QkFDRCxNQUFNO29CQUVQLEtBQUssT0FBTzs7d0JBRVgsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLGlCQUFpQixFQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLENBQUE7NEJBQ3BNLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxFQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLENBQUE7NEJBQ3BMLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQTs0QkFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQzdDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0NBQzNFLEtBQUssR0FBRyxJQUFJLENBQUE7b0NBQ1osTUFBTTtpQ0FDTjs2QkFDRjs0QkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQ0FDcEIsSUFBSSxLQUFLLEVBQUU7b0NBQ1YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBO29DQUNqQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0NBQ3ZCLE9BQU07aUNBQ047NkJBQ0Q7eUJBQ0Q7O3dCQUdELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTs0QkFDdkMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQ2xDLE1BQU0sRUFDTixVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFDbEQsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFDaEQ7Z0NBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0NBQ3BCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQ0FDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lDQUN2QjtnQ0FDRCxPQUFPOzZCQUNQO3lCQUNEOzt3QkFHRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUU7NEJBQ3ZDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUNsQyxNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGNBQWMsQ0FDZCxFQUFFO2dDQUNGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQ0FDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dDQUN2QixPQUFPOzZCQUNQO3lCQUNEOzt3QkFHRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDakMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7NEJBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2pDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFDeEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBOzRCQUM5QyxJQUFJLFVBQVUsSUFBRSxJQUFJLElBQUUsVUFBVSxJQUFFLElBQUksRUFBRTtnQ0FDdkMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO2dDQUM3QixNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBOzZCQUMxQjt5QkFDRDt3QkFFRCxPQUFPO29CQUVSLEtBQUssS0FBSzs7d0JBRVQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFOzRCQUN4QyxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLGlCQUFpQixFQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDLENBQUE7NEJBQ3BNLE1BQU0sVUFBVSxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxFQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLENBQUE7NEJBQ3BMLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQTs0QkFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQzdDLElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0NBQzNFLEtBQUssR0FBRyxJQUFJLENBQUE7b0NBQ1osTUFBTTtpQ0FDTjs2QkFDRjs0QkFDRCxJQUFJLEtBQUssRUFBRTtnQ0FDVixNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUE7Z0NBQzlCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQ0FDdkIsT0FBTzs2QkFDUDt5QkFDRDs7d0JBR0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFOzRCQUN2QyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQzFDLGdCQUFnQixFQUNoQixjQUFjLENBQ2IsRUFBRTtnQ0FDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUE7Z0NBQzlCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQ0FDdkIsT0FBTzs2QkFDUDt5QkFDRDs7d0JBR0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNwQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDbEQsSUFBSSxZQUFZLElBQUUsQ0FBQyxDQUFDLEVBQUM7NEJBQ3BCLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUN0QixFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxZQUFZLEVBQUMsRUFDckMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7NEJBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQTs0QkFDdkQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDOzRCQUN2QixPQUFPO3lCQUNQOzt3QkFHRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBRW5ELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtnQ0FDbkIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dDQUNyQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFBO2dDQUN2RyxLQUFLLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDaEQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dDQUM5QyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7d0NBQzVDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3Q0FDdkIsT0FBTTtxQ0FDTjt5Q0FBTSxJQUFJLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUUsR0FBRyxFQUFFO3dDQUN2RCxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO3dDQUM5QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7d0NBQ3ZCLE9BQU07cUNBQ047eUNBQU0sSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxFQUFFO3dDQUMxQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTt3Q0FDeEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dDQUN2QixPQUFNO3FDQUNOO3lDQUFNLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsR0FBRyxFQUFFO3dDQUNuQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQTt3Q0FDeEQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dDQUN2QixPQUFNO3FDQUNOO2lDQUNEOzZCQUNEO2lDQUFNO2dDQUNOLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0NBQzFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxZQUFZLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtnQ0FDM0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0NBQy9DLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3Q0FDOUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO3dDQUMxRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7d0NBQ3ZCLE9BQU07cUNBQ047aUNBQ0Q7NkJBQ0Q7eUJBQ0Q7O3dCQUdELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTs0QkFDNUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsRUFBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7NEJBQzNHLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQ0FDbkIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUE7Z0NBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQ0FDdkIsT0FBTTs2QkFDTjtpQ0FBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0NBQzVCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFBO2dDQUN4RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0NBQ3ZCLE9BQU07NkJBQ047eUJBQ0Q7aUJBRUY7YUFDRDtTQUNELENBQUM7UUFFZSxtQkFBYyxHQUFHLENBQ2pDLEVBQXFCLEVBQ3JCLEtBQW9CO1lBR3BCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQ0EscUJBQVksQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsSUFBSTtvQkFBRSxPQUFPO2dCQUVsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQzVCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNoQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQ3hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDN0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDakMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUN4QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdDLE1BQU0sb0NBQW9DLElBQUksQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDO29CQUM1RyxRQUFRLEtBQUssQ0FBQyxHQUFHO3dCQUNoQixLQUFLLEdBQUc7NEJBQ1AsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO2dDQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxvQ0FBb0MsRUFBRTtvQ0FDN0YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO29DQUM5QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztvQ0FDekQsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29DQUN2QixPQUFPO2lDQUNQOzZCQUNEOzRCQUNELE9BQU87d0JBQ1IsS0FBSyxHQUFHOzRCQUNQLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtnQ0FDekMsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksb0NBQW9DLEVBQUU7b0NBQzdGLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FDOUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBQyxRQUFRLENBQUMsRUFBRSxHQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7b0NBQ3pELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQ0FDdkIsT0FBTztpQ0FDUDs2QkFDRDs0QkFDRCxPQUFPO3dCQUNSLEtBQUssR0FBRzs0QkFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7Z0NBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLG9DQUFvQyxFQUFFO29DQUM3RixNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQzlCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO29DQUN6RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7b0NBQ3ZCLE9BQU87aUNBQ1A7NkJBQ0Q7NEJBQ0QsT0FBTzt3QkFDUixLQUFLLEdBQUc7NEJBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CO2dDQUFFLE9BQU87NEJBQy9DLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FDbEIsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxFQUFFO2dDQUNyRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUE7Z0NBQ3BDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtnQ0FDdEIsT0FBTzs2QkFDUDtxQkFDRjtpQkFDRDthQUNEO1NBQ0QsQ0FBQzs7UUFHZSxtQkFBYyxHQUFHLENBQ2pDLE1BQWMsRUFDZCxLQUFXLEVBQ1gsZ0JBQXdCOztZQUd4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUMzQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3hDLENBQUE7WUFFRCxJQUFJLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixJQUFJLEdBQUcsRUFBRTtnQkFDMUQsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUMvQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsRUFDakQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsSUFBSSx3QkFBd0IsSUFBSSxHQUFHLElBQUksb0JBQW9CLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEdBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO29CQUN2RyxNQUFNLENBQUMsWUFBWSxDQUNsQixHQUFHLEVBQ0gsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN2QyxDQUFDO29CQUNILE1BQU0sQ0FBQyxZQUFZLENBQ2xCLEdBQUcsRUFDSCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsRUFDakQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQ2hELENBQUM7b0JBQ0gsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFBO29CQUN0QixPQUFPLElBQUksQ0FBQztpQkFDWjtxQkFBTSxJQUFJLHdCQUF3QixJQUFJLEdBQUcsRUFBRTtvQkFDM0MsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3QixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM1RSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7b0JBQ3RCLE9BQU8sSUFBSSxDQUFDO2lCQUNaO3FCQUFNO29CQUNOLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDNUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFBO29CQUN0QixPQUFPLElBQUksQ0FBQztpQkFDWjthQUNEO2lCQUFNO2dCQUNOLE9BQU8sS0FBSyxDQUFDO2FBQ2I7U0FDRCxDQUFDO1FBRWUsaUJBQVksR0FBRyxDQUMvQixNQUFjLEVBQ2QsS0FBVyxFQUNYLGdCQUF3QjtZQUV4QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsSUFBSSxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQzs7O1lBSWpFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDM0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN4QyxDQUFBOzs7WUFJRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFBO1lBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLG9CQUFvQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDM0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUMxRyxNQUFNLHVCQUF1QixHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO29CQUN2RSxJQUFJLHVCQUF1QixHQUFHLFdBQVcsRUFBRTt3QkFDMUMsTUFBTSxDQUFDLFlBQVksQ0FDbEIsR0FBRyxFQUNILEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FDdkMsQ0FBQzt3QkFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixJQUFJLEVBQ0osRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQ3hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FDM0MsQ0FBQzt3QkFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixTQUFTLEVBQ1QsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsRUFDcEQsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLENBQ3ZELENBQUM7d0JBQ0gsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN2QixPQUFPO3FCQUNQO2lCQUNEO2dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDdkc7WUFFRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUE7O1lBR1osSUFBSSx3QkFBd0IsR0FBRyxDQUFDLENBQUE7WUFDaEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDbkgsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDMUcsSUFBSSxHQUFHLHNCQUFzQixHQUFHLENBQUMsQ0FBQztnQkFDbEMsd0JBQXdCLEdBQUcsQ0FBQyxDQUFBO2FBQzVCO2lCQUFNO2dCQUNOLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7Z0JBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzVGLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQTthQUN4RTs7WUFHRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUNsQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FDeEMsQ0FBQztZQUNGLElBQUksMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtnQkFDcEMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzVHLElBQUksd0JBQXdCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtvQkFDaEQsMEJBQTBCLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQjthQUNEOztZQUlELE1BQU0sQ0FBQyxZQUFZLENBQ2xCLEdBQUcsRUFDSCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLDBCQUEwQixFQUFFLEVBQ3JFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FDdkMsQ0FBQztZQUNILE1BQU0sQ0FBQyxZQUFZLENBQ2xCLElBQUksRUFDSixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsd0JBQXdCLEVBQUUsRUFDbkUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsR0FBRywwQkFBMEIsRUFBRSxDQUN4RSxDQUFDO1lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FDbEIsU0FBUyxFQUNULEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsRUFDckMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyx3QkFBd0IsRUFBRSxDQUMvRCxDQUFDO1lBQ0gsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU07U0FDTixDQUFDO1FBRWUsb0JBQWUsR0FBRyxDQUNsQyxNQUFjLEVBQ2QsZ0JBQXdCO1lBRXhCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7WUFJakUsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUMzQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3hDLENBQUE7OztZQUlELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUE7WUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pDLElBQUksb0JBQW9CLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMzQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQzFHLE1BQU0sdUJBQXVCLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7b0JBQ3ZFLElBQUksdUJBQXVCLEdBQUcsV0FBVyxFQUFFO3dCQUMxQyxNQUFNLENBQUMsWUFBWSxDQUNsQixHQUFHLEVBQ0gsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDNUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUN2QyxDQUFDO3dCQUNILE1BQU0sQ0FBQyxZQUFZLENBQ2xCLElBQUksRUFDSixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFDeEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUMzQyxDQUFDO3dCQUNILE1BQU0sQ0FBQyxZQUFZLENBQ2xCLFNBQVMsRUFDVCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxFQUNwRCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSx1QkFBdUIsR0FBRyxDQUFDLEVBQUUsQ0FDdkQsQ0FBQzt3QkFDSCxPQUFPLElBQUksQ0FBQztxQkFDWjtpQkFDRDtnQkFDRCxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3ZHO1lBRUQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFBOztZQUdaLElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFBO1lBQ2hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ25ILE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBQzFHLElBQUksR0FBRyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLHdCQUF3QixHQUFHLENBQUMsQ0FBQTthQUM1QjtpQkFBTTtnQkFDTixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUN4RCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUM1RixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUE7YUFDeEU7O1lBR0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDbEMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxFQUM1QyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3hDLENBQUM7WUFDRixJQUFJLDBCQUEwQixHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUU7Z0JBQ3BDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUM1RyxJQUFJLHdCQUF3QixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQ2hELDBCQUEwQixHQUFHLENBQUMsQ0FBQztpQkFDL0I7YUFDRDs7WUFJRCxNQUFNLENBQUMsWUFBWSxDQUNsQixHQUFHLEVBQ0gsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRywwQkFBMEIsRUFBRSxFQUNyRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQ3ZDLENBQUM7WUFDSCxNQUFNLENBQUMsWUFBWSxDQUNsQixJQUFJLEVBQ0osRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxHQUFHLHdCQUF3QixFQUFFLEVBQ25FLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsR0FBRyxDQUFDLEdBQUcsMEJBQTBCLEVBQUUsQ0FDeEUsQ0FBQztZQUNILE1BQU0sQ0FBQyxZQUFZLENBQ2xCLFNBQVMsRUFDVCxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQ3JDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsd0JBQXdCLEVBQUUsQ0FDL0QsQ0FBQztZQUVILE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUM5QixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUMsQ0FBQyxHQUFDLDBCQUEwQixFQUFDLENBQUMsQ0FBQTtZQUN4RSxPQUFPLElBQUksQ0FBQTtTQUNYLENBQUM7UUFFZSxxQkFBZ0IsR0FBRyxDQUNuQyxNQUFjLEVBQ2QsS0FBWTtZQUVaLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFDdEMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxDQUNwQyxDQUFBO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDakUsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLElBQUUsQ0FBQztnQkFBRSxPQUFPO1lBRXZDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDekMsTUFBTSxFQUNOLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFDbkIsUUFBUSxDQUFDLEVBQUUsR0FBQyxDQUFDLEVBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDbkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDM0IsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsWUFBWSxFQUFDLEVBQ3JDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFBO1lBRXRDLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0QsSUFBSSx5QkFBeUIsR0FBWSxFQUFFLENBQUM7WUFFNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDZCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDbkIsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssR0FBQyxDQUFDLENBQUMsQ0FBQTtvQkFDaEQsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7d0JBQ2hCLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUM7cUJBQ3JEO2lCQUNEO2FBQ0Q7WUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVuRCxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUE7WUFFbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUcsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLE1BQU0sRUFBRyxDQUFDLEVBQUUsRUFBRTtnQkFDNUQsSUFBSSxVQUFVLEdBQWEsRUFBRSxDQUFDO2dCQUM5QixJQUFJLFdBQVcsR0FBYSxFQUFFLENBQUM7Z0JBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN6QyxVQUFVLENBQUMsSUFBSSxDQUNkLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN2QixNQUFNLEVBQ04sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNkLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDZCx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtvQkFDUixXQUFXLENBQUMsSUFBSSxDQUNmLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUN2QixNQUFNLEVBQ04sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNkLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDZCxZQUFZLENBQUMsTUFBTSxFQUNuQix5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFDNUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDWjtnQkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTs7b0JBRWpELElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQ2hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFDL0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxXQUFXLElBQUksU0FBUyxFQUFFO3dCQUM3QixNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM1RSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sR0FBRyxJQUFJLENBQUE7cUJBQ2I7aUJBQ0Q7Z0JBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O29CQUVoRCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUMvQixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQzlDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzdDLElBQUksVUFBVSxJQUFJLFFBQVEsRUFBRTt3QkFDM0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDMUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFBO3FCQUNiO2lCQUNEO2FBQ0Q7WUFDRCxPQUFPLE1BQU0sQ0FBQTtTQUNiLENBQUM7O1FBNENlLHFCQUFnQixHQUFHLENBQ25DLE1BQWMsRUFDZCxXQUFtQixFQUNuQixZQUFvQixFQUNwQixNQUFjLEVBQ2QsS0FBYSxFQUNiLHVCQUFnQyxJQUFJOzs7WUFHcEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQzNCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUNsQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLElBQUksVUFBVSxHQUFhLEVBQUUsQ0FBQTtZQUM3QixJQUFJLFdBQVcsR0FBYSxFQUFFLENBQUE7WUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDZCxLQUFLLFdBQVc7d0JBQ2YsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQzNCLE1BQU07b0JBQ1AsS0FBSyxZQUFZO3dCQUNoQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRCQUMxQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7eUJBQ2hCOzZCQUFNOzRCQUNOLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUM1Qjt3QkFDRCxNQUFNO2lCQUNQO2FBQ0Q7WUFDRCxJQUFJLG9CQUFvQixFQUFFO2dCQUN6QixPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDM0M7aUJBQU07Z0JBQ04sT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQzdDO1NBRUQsQ0FBQztRQUVlLGVBQVUsR0FBRyxDQUM3QixNQUFjLEVBQ2QsUUFBZ0I7O1lBR2hCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUNuQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDaEYsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsR0FBRyxHQUFDLENBQUMsRUFBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFDLEdBQUcsRUFBQyxDQUFDLElBQUUsTUFBTSxDQUFDLENBQUE7U0FDMUgsQ0FBQTtRQUVnQixlQUFVLEdBQUcsQ0FDN0IsTUFBYzs7WUFHZCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDbkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQTtZQUM5QixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsWUFBWSxFQUFFO2dCQUMzQyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUM5QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQ3RDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN4QyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUM5QixFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQ3RDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7Z0JBQ3BDLElBQUksU0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUU7b0JBQzdELElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNqQixLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3hDLFNBQVM7aUJBQ1Q7cUJBQU07b0JBQ04sSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ2pCLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNqRCxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUMsRUFBRTt3QkFDckIsT0FBTyxLQUFLLENBQUM7cUJBQ2I7eUJBQU0sSUFBSSxZQUFZLEdBQUcsS0FBSyxJQUFJLFlBQVksSUFBSSxVQUFVLEVBQUU7d0JBQzlELE9BQU8sSUFBSSxDQUFDO3FCQUNaO3lCQUFNO3dCQUNOLElBQUksR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ3hDLFNBQVM7cUJBQ1Q7aUJBQ0Q7YUFDRDtZQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxZQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ1QsS0FBSyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMxQztZQUNELE9BQU8sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEIsQ0FBQztRQUVlLDZCQUF3QixHQUFHLENBQzNDLE1BQWMsRUFDZCxRQUFvQjtZQUVwQixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDbkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUN2RixDQUFDO1FBRWUsK0JBQTBCLEdBQUcsQ0FDN0MsTUFBYyxFQUNkLFdBQW1CLEVBQ25CLFlBQW9CO1lBRXBCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQTtZQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDcEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTs7WUFFbEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLFlBQVksRUFBRTtnQkFDM0MsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDWCxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDakIsS0FBSyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUE7O1lBR2hDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDVCxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbEQsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNWLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxZQUFZLEVBQUU7Z0JBQzNDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNsRDtZQUNELE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFBO1lBRWpDLE9BQU8sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7U0FDaEQsQ0FBQztLQWtCRjtJQXJpQ00sTUFBTTs7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFFMUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFFeEQsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7O1lBRzFCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUE7WUFDeEQsT0FBTSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxFQUFDO2dCQUNoQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUNuQztZQUNELElBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLEdBQUcsRUFBQztnQkFDNUIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDbkM7WUFDRCxJQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUUsQ0FBQyxDQUFDLEVBQUM7Z0JBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQy9GO2lCQUFNO2dCQUNOLElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMxRTs7WUFHRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWpFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBcUI7b0JBQzdDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ25ELEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUV2QyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDZixFQUFFLEVBQUUsZUFBZTtvQkFDbkIsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsT0FBTyxFQUFFO3dCQUNSOzRCQUNDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7NEJBQzNCLEdBQUcsRUFBRSxHQUFHO3lCQUNSO3FCQUNEO29CQUNELGNBQWMsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztpQkFDdEQsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2YsRUFBRSxFQUFFLGdCQUFnQjtvQkFDcEIsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsT0FBTyxFQUFFO3dCQUNSOzRCQUNDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7NEJBQzNCLEdBQUcsRUFBRSxHQUFHO3lCQUNSO3FCQUNEO29CQUNELGNBQWMsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztpQkFDdkQsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2YsRUFBRSxFQUFFLGVBQWU7b0JBQ25CLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLE9BQU8sRUFBRTt3QkFDUjs0QkFDQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDOzRCQUMzQixHQUFHLEVBQUUsR0FBRzt5QkFDUjtxQkFDRDtvQkFDRCxjQUFjLEVBQUUsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7aUJBQ3RELENBQUMsQ0FBQzthQUNILENBQUMsQ0FBQztTQUNIO0tBQUE7SUE0eEJPLGFBQWEsQ0FBQyxNQUFjO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDaEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQzNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDdEIsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEdBQUcsS0FBSztZQUMxRCxhQUFhO1lBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUN4RCxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0tBQzNGO0lBRU8sY0FBYyxDQUFDLE1BQWM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUNBLHFCQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCO1lBQUUsT0FBTztRQUNqRCxNQUFNLENBQUMsZ0JBQWdCLENBQ3RCLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLEdBQUc7WUFDekQsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxDQUN2RCxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxFQUFFLE1BQU0sQ0FBQTtRQUN2RixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQTtLQUMzRTtJQUVPLGFBQWEsQ0FBQyxNQUFjO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDQSxxQkFBWSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQjtZQUFFLE9BQU87UUFDaEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQzNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDdEIsa0JBQWtCO1lBQ2xCLGFBQWE7WUFDYixnQkFBZ0IsQ0FDaEIsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtLQUMzRjs7SUE4SUssWUFBWTs7WUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQzNFO0tBQUE7O0lBRU0sUUFBUTtRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7WUFDeEMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNwRCxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBRXhDLENBQUMsQ0FBQztLQUNIO0NBRUQ7QUFHRCxNQUFNLG9CQUFxQixTQUFRQyx5QkFBZ0I7SUFHbEQsWUFBWSxHQUFRLEVBQUUsTUFBd0I7UUFDN0MsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztLQUNyQjtJQUVNLE9BQU87UUFDYixNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzdCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVwQixXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxxQ0FBcUMsRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSUMsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDO2FBQy9CLE9BQU8sQ0FBQyxvRUFBb0U7WUFDM0UsMkRBQTJELENBQUM7YUFDN0QsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO2FBQ25ELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO2FBQ3pDLE9BQU8sQ0FBQyxnR0FBZ0csQ0FBQzthQUN6RyxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7YUFDbEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsaURBQWlELENBQUM7YUFDMUQsT0FBTyxDQUFDLDREQUE0RDtZQUNwRSwrQ0FBK0MsQ0FBQzthQUNoRCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUM7YUFDdEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7WUFDckQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsNkJBQTZCLENBQUM7YUFDdEMsT0FBTyxDQUFDLDhDQUE4QyxDQUFDO2FBQ3ZELFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQzthQUNwRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztZQUNuRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQzthQUN2QyxPQUFPLENBQUMsOENBQThDLENBQUM7YUFDdkQsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO2FBQ3JELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLDZCQUE2QixDQUFDO2FBQ3RDLE9BQU8sQ0FBQyw4Q0FBOEMsQ0FBQzthQUN2RCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7YUFDcEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsc0NBQXNDLENBQUM7YUFDL0MsT0FBTyxDQUFDLDJFQUEyRTtZQUNuRix5REFBeUQsQ0FBQzthQUMxRCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7YUFDbEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsNERBQTRELENBQUM7YUFDckUsT0FBTyxDQUFDLGdGQUFnRjtZQUN4RixnRkFBZ0Y7WUFDaEYseUdBQXlHLENBQUM7YUFDMUcsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDO2FBQ3RELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1lBQ3JELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLGtEQUFrRCxDQUFDO2FBQzNELE9BQU8sQ0FBQyx5RUFBeUU7WUFDakYsc0RBQXNELENBQUM7YUFDdkQsU0FBUyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07YUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO2FBQ3BELFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1lBQ25ELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDZixDQUFBLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7YUFDdEIsT0FBTyxDQUFDLGlEQUFpRCxDQUFDO2FBQzFELE9BQU8sQ0FBQyx1RUFBdUU7WUFDL0Usd0RBQXdEO1lBQ3hELGdFQUFnRSxDQUFDO2FBQ2pFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQzthQUNwRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztZQUNuRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQzthQUN6QyxPQUFPLENBQUMsdUZBQXVGO1lBQy9GLCtCQUErQixDQUFDO2FBQ2hDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQzthQUNsRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUNqRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQzthQUNuQyxPQUFPLENBQUMsMEVBQTBFO1lBQ2xGLGdEQUFnRCxDQUFDO2FBQ2pELFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQzthQUNuRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQzthQUNoQyxPQUFPLENBQUMsb0VBQW9FLENBQUM7YUFDN0UsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUk7YUFDckIsY0FBYyxDQUFDLGlCQUFpQixDQUFDO2FBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQzthQUN0RCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztZQUNyRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakQsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQzthQUM1QyxPQUFPLENBQUMsMEhBQTBILENBQUM7YUFDbkksT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUk7YUFDckIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO2FBQy9DLFFBQVEsQ0FBQyxDQUFPLEtBQUs7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pELENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMsMEJBQTBCLENBQUM7YUFDbkMsT0FBTyxDQUFDLHdFQUF3RTtZQUNoRixnREFBZ0QsQ0FBQzthQUNqRCxTQUFTLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTTthQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7YUFDbkQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNmLENBQUEsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQzthQUN0QixPQUFPLENBQUMseURBQXlELENBQUM7YUFDbEUsT0FBTyxDQUFDLDJJQUEySSxDQUFDO2FBQ3BKLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUNoRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQzthQUNwQyxPQUFPLENBQUMsNkVBQTZFO1lBQ3JGLGdEQUFnRCxDQUFDO2FBQ2pELFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQzthQUNwRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztZQUNuRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQzthQUNqQyxPQUFPLENBQUMsb0VBQW9FLENBQUM7YUFDN0UsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUk7YUFDckIsY0FBYyxDQUFDLGtCQUFrQixDQUFDO2FBQ2xDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQzthQUN2RCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztZQUN0RCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakQsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQzthQUMzQixPQUFPLENBQUMsMkVBQTJFO1lBQ3BGLHFFQUFxRSxDQUFDO2FBQ3JFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNO2FBQzNCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQzthQUNyRCxRQUFRLENBQUMsQ0FBTyxLQUFLO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztZQUNwRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2YsQ0FBQSxDQUFDLENBQUMsQ0FBQztRQUVOLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2FBQ3RCLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQzthQUNyQyxPQUFPLENBQUMsb0VBQW9FO1lBQzdFLCtEQUErRDtZQUMvRCxrR0FBa0c7WUFDbEcseUdBQXlHO1lBQ3pHLG1IQUFtSDtZQUNuSCxpRkFBaUY7WUFDakYsaURBQWlEO1lBQ2pELGdGQUFnRixDQUFDO2FBQ2hGLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQzthQUMvQixXQUFXLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSTthQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7YUFDeEQsUUFBUSxDQUFDLENBQU8sS0FBSztZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUM7WUFDdkQsT0FBTSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUUsSUFBSSxFQUFDO2dCQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUN6QjtZQUNELElBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFFLEdBQUcsRUFBQztnQkFDdkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDekI7WUFDRCxJQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUUsQ0FBQyxDQUFDLEVBQUM7Z0JBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNqRztpQkFBTTtnQkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVFO1lBQ0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pELENBQUEsQ0FBQyxDQUFDLENBQUM7S0FDTjs7Ozs7OyJ9
|