UNPKG

dcl-npc-toolkit

Version:

A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations.

540 lines 86.9 kB
import { AudioSource, engine } from "@dcl/sdk/ecs";
import { activeNPC, clearNPC, closeDialogWindow, isActiveNpcSet, npcDataComponent, setActiveNPC, stopWalking } from "./npc";
import { IsTypingDialog } from "./components";
import { NPCState } from "./types";
import { leftClickSection, leftClickSectionbBlack, lightTheme, section, skipButtonSection, skipButtonSectionBlack } from './ui';
import { getBubbleTextLength } from './bubble';
import { Color4 } from '@dcl/sdk/math';
import { delayedFunction } from './utils/utils';
export const npcDialogComponent = new Map();
export const npcDialogTypingSystems = new Map();
export const npcDialogInputListener = new Map();
export var ConfirmMode;
(function (ConfirmMode) {
    ConfirmMode[ConfirmMode["Confirm"] = 0] = "Confirm";
    ConfirmMode[ConfirmMode["Cancel"] = 1] = "Cancel";
    ConfirmMode[ConfirmMode["Next"] = 2] = "Next";
    ConfirmMode[ConfirmMode["Button3"] = 3] = "Button3";
    ConfirmMode[ConfirmMode["Button4"] = 4] = "Button4";
})(ConfirmMode || (ConfirmMode = {}));
export let UIscaleMultiplier = 0.75;
let portraitXPos = -50 * UIscaleMultiplier;
let portraitYPos = 20 * UIscaleMultiplier;
let imageXPos = 350 * UIscaleMultiplier;
let imageYPos = 50 * UIscaleMultiplier;
let portraitScale = 256 * UIscaleMultiplier;
let imageScale = 256 * UIscaleMultiplier;
let textSize = 24 * UIscaleMultiplier;
let textYPos = 10 * UIscaleMultiplier;
let buttonWidth = 174 * UIscaleMultiplier;
let buttonHeight = 46 * UIscaleMultiplier;
let buttonTextSize = 20 * UIscaleMultiplier;
let button1XPos = 150 * UIscaleMultiplier;
let button2XPos = -80 * UIscaleMultiplier;
let button3XPos = -80 * UIscaleMultiplier;
let button4XPos = 150 * UIscaleMultiplier;
let button1YPos = -65 * UIscaleMultiplier;
let button2YPos = -65 * UIscaleMultiplier;
let button1YPos4 = -20 * UIscaleMultiplier;
let button2YPos4 = -20 * UIscaleMultiplier;
let button3YPos = -80 * UIscaleMultiplier;
let button4YPos = -80 * UIscaleMultiplier;
let skipButtonXPos = -300 * UIscaleMultiplier;
let skipButtonYPos = -100 * UIscaleMultiplier;
let buttonIconWidth = 26 * UIscaleMultiplier;
let buttonIconHeight = 26 * UIscaleMultiplier;
export function addDialog(npc, sound, defaultPortrait) {
    npcDialogComponent.set(npc, {
        typing: true,
        visible: false,
        visibleText: "",
        visibleChars: 0,
        fullText: "",
        timer: 0,
        speed: 45,
        originalScript: [],
        script: [],
        index: 0,
        sound: sound ? sound : undefined,
        soundPlayer: sound ? engine.addEntity() : undefined,
        fontSize: 22,
        isQuestion: false,
        buttons: 0,
        displayPortrait: defaultPortrait ? true : false,
        defaultPortrait: defaultPortrait ? defaultPortrait : null,
        defaultPortraitTexture: defaultPortrait ? defaultPortrait.path : lightTheme,
        currentPortrait: defaultPortrait ? defaultPortrait.path : lightTheme,
        portraitWidth: defaultPortrait && defaultPortrait.width ? defaultPortrait.width * UIscaleMultiplier : portraitScale,
        portraitHeight: defaultPortrait && defaultPortrait.height ? defaultPortrait.height * UIscaleMultiplier : portraitScale,
        portraitX: defaultPortrait && defaultPortrait.offsetX ? defaultPortrait.offsetX * UIscaleMultiplier + portraitXPos : portraitXPos,
        portraitY: defaultPortrait && defaultPortrait.offsetY ? defaultPortrait.offsetY * UIscaleMultiplier + portraitYPos : portraitYPos,
        portaitSHeight: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceHeight ? defaultPortrait.section.sourceHeight : 256,
        portraitSWidth: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceWidth ? defaultPortrait.section.sourceWidth : 256,
        portaitSTop: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceTop ? defaultPortrait.section.sourceTop : 0,
        portraitSLeft: defaultPortrait && defaultPortrait.section && defaultPortrait.section.sourceLeft ? defaultPortrait.section.sourceLeft : 0
    });
}
export function displayImage() {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).displayImage;
}
export function displayPortrait() {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).displayPortrait;
}
export function displaySkipable() {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).skipable;
}
export function getSkipableTheme() {
    return !isActiveNpcSet() ? skipButtonSectionBlack : npcDataComponent.get(activeNPC).theme == lightTheme ? skipButtonSectionBlack : skipButtonSection;
}
export function getLeftClickTheme() {
    return !isActiveNpcSet() ? leftClickSection : npcDataComponent.get(activeNPC).theme == lightTheme ? leftClickSection : leftClickSectionbBlack;
}
export function positionTextX() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).positionX;
}
export function positionTextY() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).positionY;
}
export function positionPortaitX() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitX;
}
export function positionPortaitY() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitY;
}
export function portraitWidth() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitWidth;
}
export function portraitHeight() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).portraitHeight;
}
export function positionImageX() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageX;
}
export function positionImageY() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageY;
}
export function imageWidth() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageWidth;
}
export function imageHeight() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).imageHeight;
}
export function getPortrait() {
    if (!isActiveNpcSet())
        return lightTheme;
    const p = npcDialogComponent.get(activeNPC).currentPortrait;
    return typeof p === 'string' && p.length >= 0 ? p : lightTheme;
}
export function getImage() {
    if (!isActiveNpcSet())
        return "";
    const img = npcDialogComponent.get(activeNPC).dialogImageTexture;
    return typeof img === 'string' ? img : "";
}
export function getText() {
    return !isActiveNpcSet() ? "" : npcDialogComponent.get(activeNPC).visibleText;
}
export function getTextColor() {
    return !isActiveNpcSet() ? Color4.Black() : npcDataComponent.get(activeNPC).theme == lightTheme ? Color4.Black() : Color4.White();
}
export function getTheme() {
    return !isActiveNpcSet() ? lightTheme : npcDataComponent.get(activeNPC).theme;
}
export function getButtonText(button) {
    let text = "";
    if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
        let dialogData = npcDialogComponent.get(activeNPC);
        if (dialogData.isQuestion && dialogData.buttons > button) {
            text = dialogData.script[dialogData.index].buttons[button].label;
        }
    }
    return text;
}
export function getbuttonSize(button) {
    let ButtonSize;
    if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
        let dialogData = npcDialogComponent.get(activeNPC);
        if (dialogData.isQuestion && dialogData.buttons > button) {
            if (dialogData.script[dialogData.index].buttons[button].size !== undefined) {
                ButtonSize = dialogData.script[dialogData.index].buttons[button]?.size;
            }
        }
    }
    return ButtonSize;
}
export function getFontSize() {
    return !isActiveNpcSet() ? 22 : npcDialogComponent.get(activeNPC).fontSize;
}
export function getButtonFontSize(button) {
    let ButtonFontSize = 0;
    if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
        let dialogData = npcDialogComponent.get(activeNPC);
        if (dialogData.isQuestion && dialogData.buttons > button) {
            if (dialogData.script[dialogData.index].buttons[button].fontSize !== undefined) {
                ButtonFontSize = dialogData.script[dialogData.index].buttons[button]?.fontSize;
            }
            else {
                ButtonFontSize = 16;
            }
        }
    }
    return ButtonFontSize;
}
export function displayDialog() {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).visible;
}
export function getWindowHeight() {
    let windowHeights;
    if (activeNPC != 0 && npcDialogComponent.has(activeNPC)) {
        let dialogData = npcDialogComponent.get(activeNPC);
        if (dialogData.isQuestion) {
            if (dialogData.script[dialogData.index].windowHeight !== undefined) {
                windowHeights = dialogData.script[dialogData.index]?.windowHeight;
            }
        }
    }
    return windowHeights;
}
export function displayButton(button) {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).isQuestion && npcDialogComponent.get(activeNPC).buttons >= button;
}
export function displayFirstButtonContainer() {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).isQuestion && npcDialogComponent.get(activeNPC).buttons >= 1;
}
export function displaySecondButtonContainer() {
    return !isActiveNpcSet() ? false : npcDialogComponent.get(activeNPC).isQuestion && npcDialogComponent.get(activeNPC).buttons >= 3;
}
export function getTextPosition() {
    return !isActiveNpcSet() ? { top: 0, left: 0 } : { top: npcDialogComponent.get(activeNPC).margin + npcDialogComponent.get(activeNPC).positionY, left: npcDialogComponent.get(activeNPC).positionX };
}
export function buttonClick(button) {
    if (isActiveNpcSet()) {
        confirmText(activeNPC, button);
    }
}
export function closeDialog(npc) {
    let dialogData = npcDialogComponent.get(npc);
    if (!dialogData)
        return;
    dialogData.visible = false;
    dialogData.typing = false;
    dialogData.visibleText = "";
    dialogData.visibleChars = 0;
    dialogData.fullText = "";
    dialogData.timer = 0;
    dialogData.index = 0;
    dialogData.script.length = 0;
    dialogData.buttons = 0;
    dialogData.margin = 0;
    dialogData.displayPortrait = false;
    dialogData.skipable = false;
    dialogData.displayImage = false;
    if (IsTypingDialog.has(npc)) {
        IsTypingDialog.deleteFrom(npc);
    }
    clearNPC();
}
export function talk(npc, dialog, startIndex, duration) {
    npcDataComponent.get(npc).introduced = true;
    if (npcDialogComponent.has(npc)) {
        setActiveNPC(npc);
        if (npcDataComponent.get(npc).state == NPCState.FOLLOWPATH) {
            stopWalking(npc);
        }
        npcDataComponent.get(npc).state = NPCState.TALKING;
        let index;
        if (!startIndex) {
            index = 0;
        }
        else if (typeof startIndex === 'number') {
            index = startIndex;
        }
        else {
            index = findDialogByName(dialog, startIndex);
        }
        openDialog(npc, dialog, index);
    }
}
export function openDialog(npc, dialog, startIndex) {
    let dialogData = npcDialogComponent.get(npc);
    dialogData.script = dialog.slice();
    dialogData.index = startIndex;
    let currentText = dialog[startIndex] ? dialog[startIndex] : { text: '' };
    if (dialogData.sound) {
        AudioSource.createOrReplace(dialogData.soundPlayer, {
            audioClipUrl: dialogData.sound,
            loop: false,
            playing: false
        });
        let audio = AudioSource.getMutable(dialogData.soundPlayer);
        audio.volume = npcDataComponent.get(npc).volume;
        audio.playing = true;
    }
    beginTyping(npc);
}
const BASE_DIALOG_FONT_SIZE = 22;
const BASE_DIALOG_LINE_CHARS = 45;
export function addLineBreak(text, bubble, fontSize) {
    if (bubble) {
        return lineBreak(text, getBubbleTextLength(text));
    }
    const fs = fontSize && fontSize > 0 ? fontSize : BASE_DIALOG_FONT_SIZE;
    const maxChars = Math.max(15, Math.round(BASE_DIALOG_LINE_CHARS * BASE_DIALOG_FONT_SIZE / fs));
    return lineBreak(text, maxChars);
}
function beginTyping(npc) {
    let dialogData = npcDialogComponent.get(npc);
    let currentText = dialogData.script[dialogData.index] ? dialogData.script[dialogData.index] : { text: '' };
    dialogData.visible = true;
    dialogData.typing = true;
    dialogData.visibleText = "";
    dialogData.visibleChars = 0;
    dialogData.timer = 0;
    dialogData.isQuestion = false;
    dialogData.buttons = 0;
    dialogData.margin = 0;
    dialogData.displayPortrait = false;
    dialogData.displayImage = false;
    dialogData.skipable = false;
    dialogData.fontSize = currentText.fontSize ? currentText.fontSize : BASE_DIALOG_FONT_SIZE;
    dialogData.skipable = currentText.skipable ? true : false;
    dialogData.speed = currentText.hasOwnProperty('typeSpeed') ? currentText.typeSpeed : 45;
    dialogData.positionX = currentText.offsetX ? currentText.offsetX * UIscaleMultiplier : '22%';
    dialogData.positionY = currentText.offsetY ? currentText.offsetY * UIscaleMultiplier + textYPos : textYPos;
    dialogData.fullText = addLineBreak(currentText.text, false, dialogData.fontSize);
    if (currentText.audio) {
        AudioSource.createOrReplace(dialogData.soundPlayer, {
            audioClipUrl: currentText.audio,
            loop: false,
            playing: false
        });
        let audio = AudioSource.getMutable(dialogData.soundPlayer);
        audio.volume = npcDataComponent.get(npc).volume;
        audio.playing = true;
    }
    if (currentText.portrait) {
        dialogData.currentPortrait = currentText.portrait.path;
        dialogData.portraitX = currentText.portrait.offsetX
            ? currentText.portrait.offsetX * UIscaleMultiplier + portraitXPos
            : portraitXPos;
        dialogData.portraitY = currentText.portrait.offsetY
            ? currentText.portrait.offsetY * UIscaleMultiplier + portraitYPos
            : portraitYPos;
        dialogData.portraitWidth = currentText.portrait.width ? currentText.portrait.width * UIscaleMultiplier : portraitScale;
        dialogData.portraitHeight = currentText.portrait.height ? currentText.portrait.height * UIscaleMultiplier : portraitScale;
        dialogData.displayPortrait = true;
    }
    else if (dialogData.defaultPortrait) {
        const dp = dialogData.defaultPortrait;
        dialogData.currentPortrait = dialogData.defaultPortraitTexture;
        dialogData.portraitX = dp.offsetX ? dp.offsetX * UIscaleMultiplier + portraitXPos : portraitXPos;
        dialogData.portraitY = dp.offsetY ? dp.offsetY * UIscaleMultiplier + portraitYPos : portraitYPos;
        dialogData.portraitWidth = dp.width ? dp.width * UIscaleMultiplier : portraitScale;
        dialogData.portraitHeight = dp.height ? dp.height * UIscaleMultiplier : portraitScale;
        dialogData.displayPortrait = true;
    }
    else {
        dialogData.displayPortrait = false;
    }
    if (currentText.isQuestion) {
        dialogData.buttons = currentText.buttons.length;
        if (dialogData.buttons >= 3) {
            dialogData.margin = -25;
        }
        else if (dialogData.buttons >= 1) {
            dialogData.margin = -25;
        }
        delayedFunction(() => {
            dialogData.isQuestion = true;
        }, 700);
    }
    dialogData.openTime = Math.floor(Date.now());
    if (currentText.image) {
        dialogData.dialogImageTexture = currentText.image.path;
        dialogData.imageX = currentText.image.offsetX ? currentText.image.offsetX * UIscaleMultiplier + imageXPos : -40;
        dialogData.imageY = currentText.image.offsetY ? currentText.image.offsetY * UIscaleMultiplier + imageYPos : 40;
        dialogData.imageHeight = currentText.image.height ? currentText.image.height * UIscaleMultiplier : imageScale;
        dialogData.imageWidth = currentText.image.width ? currentText.image.width * UIscaleMultiplier : imageScale;
        dialogData.displayImage = true;
    }
    if (dialogData.speed <= 0) {
        rushText(npc);
    }
    else {
        if (!IsTypingDialog.has(npc)) {
            IsTypingDialog.create(npc);
        }
    }
}
export function addLineBreaks(dialog, bubble) {
    let cleaned = dialog.slice();
    cleaned.forEach((d) => {
        d.text = lineBreak(d.text, bubble ? getBubbleTextLength(d.text) : 50);
    });
    return cleaned;
}
function lineBreak(text, maxLineLength) {
    const words = text.split(' ');
    let currentLine = '';
    const lines = [];
    for (const word of words) {
        if (currentLine.length + word.length + 1 <= maxLineLength) {
            currentLine += `${word} `;
        }
        else {
            lines.push(currentLine.trim());
            currentLine = `${word} `;
        }
    }
    lines.push(currentLine.trim());
    return lines.join('\n');
}
export function handleDialogClick() {
    let npc = activeNPC;
    if (npcDialogComponent.has(npc)) {
        let dialogData = npcDialogComponent.get(npc);
        if (!dialogData.visible || (Math.floor(Date.now()) - dialogData.openTime < 100))
            return;
        if (dialogData.typing) {
            rushText(npc);
        }
        else {
            confirmText(npc, ConfirmMode.Next);
        }
    }
}
export function rushText(npc) {
    let dialogData = npcDialogComponent.get(npc);
    dialogData.typing = false;
    dialogData.timer = 0;
    dialogData.visibleChars = dialogData.fullText.length;
    dialogData.visibleText = dialogData.fullText;
}
export function confirmText(npc, mode) {
    let dialogData = npcDialogComponent.get(npc);
    dialogData.openTime = Math.floor(Date.now());
    let currentText = dialogData.script[dialogData.index];
    if (mode == ConfirmMode.Next) {
        if (!currentText.isQuestion) {
            if (currentText.triggeredByNext) {
                currentText.triggeredByNext();
            }
            if (currentText.isEndOfDialog) {
                closeDialog(npc);
                return;
            }
            dialogData.index++;
        }
    }
    if (mode == ConfirmMode.Confirm) {
        if (currentText.buttons && currentText.buttons.length >= 1) {
            if (typeof currentText.buttons[0].goToDialog === 'number') {
                dialogData.index = currentText.buttons[0].goToDialog;
            }
            if (currentText.buttons[0].triggeredActions) {
                currentText.buttons[0].triggeredActions();
            }
        }
    }
    if (mode == ConfirmMode.Cancel) {
        if (currentText.buttons && currentText.buttons.length >= 1) {
            if (typeof currentText.buttons[1].goToDialog === 'number') {
                dialogData.index = currentText.buttons[1].goToDialog;
            }
            if (currentText.buttons[1].triggeredActions) {
                currentText.buttons[1].triggeredActions();
            }
        }
    }
    if (mode == ConfirmMode.Button3) {
        if (currentText.buttons && currentText.buttons.length >= 1) {
            if (typeof currentText.buttons[2].goToDialog === 'number') {
                dialogData.index = currentText.buttons[2].goToDialog;
            }
            if (currentText.buttons[2].triggeredActions) {
                currentText.buttons[2].triggeredActions();
            }
        }
    }
    if (mode == ConfirmMode.Button4) {
        if (currentText.buttons && currentText.buttons.length >= 1) {
            if (typeof currentText.buttons[3].goToDialog === 'number') {
                dialogData.index = currentText.buttons[3].goToDialog;
            }
            if (currentText.buttons[3].triggeredActions) {
                currentText.buttons[3].triggeredActions();
            }
        }
    }
    beginTyping(npc);
}
export function skipDialogs(npc) {
    let dialogData = npcDialogComponent.get(npc);
    if (!dialogData.visible || +Date.now() - dialogData.openTime < 100)
        return;
    while (dialogData.script[dialogData.index] &&
        dialogData.script[dialogData.index].skipable &&
        dialogData.script[dialogData.index].isQuestion) {
        if (dialogData.script[dialogData.index].triggeredByNext) {
            dialogData.script[dialogData.index].triggeredByNext();
        }
        if (dialogData.script[dialogData.index].skipable &&
            dialogData.script[dialogData.index].isEndOfDialog) {
            closeDialogWindow(npc);
            return;
        }
        dialogData.index += 1;
    }
    confirmText(npc, ConfirmMode.Next);
}
export function getImageAtlasMapping(data) {
    if (!data)
        return [];
    const { atlasWidth, atlasHeight, sourceWidth, sourceHeight, sourceTop, sourceLeft, } = data;
    return [
        sourceLeft / atlasWidth, (atlasHeight - sourceTop - sourceHeight) / atlasHeight,
        sourceLeft / atlasWidth, (atlasHeight - sourceTop) / atlasHeight,
        (sourceLeft + sourceWidth) / atlasWidth, (atlasHeight - sourceTop) / atlasHeight,
        (sourceLeft + sourceWidth) / atlasWidth, (atlasHeight - sourceTop - sourceHeight) / atlasHeight,
    ];
}
export function realWidth(width) {
    return width ? width : section.sourceWidth;
}
export function realHeight(height) {
    return height ? height : section.sourceHeight;
}
export function findDialogByName(dialogs, name) {
    for (let i = 0; i < dialogs.length; i++) {
        if (dialogs[i].name && dialogs[i].name == name) {
            return i;
        }
    }
    return 0;
}
export function closeTag(dialogData, newChars) {
    if (dialogData.visibleChars == 0 || newChars == 0)
        return;
    let openTag = false;
    let closeTag = false;
    for (let i = dialogData.visibleChars - newChars; i < dialogData.visibleChars; i++) {
        if (!openTag) {
            if (dialogData.fullText.substr(i, 1) == '<') {
                openTag = true;
            }
        }
        else {
            if (dialogData.fullText.substr(i, 1) == '>') {
                closeTag = true;
            }
        }
    }
    if (!openTag || closeTag) {
        return;
    }
    while (dialogData.visibleChars < dialogData.fullText.length && dialogData.fullText.substr(dialogData.visibleChars - 1, 1) != '>') {
        dialogData.visibleChars += 1;
    }
    return;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RpYWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFVLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBYyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFZLFdBQVcsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsSixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlDLE9BQU8sRUFBcUIsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHaEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDN0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUE7QUFDakUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW9CLElBQUksR0FBRyxFQUFFLENBQUE7QUFFaEUsTUFBTSxDQUFOLElBQVksV0FNVDtBQU5ILFdBQVksV0FBVztJQUNuQixtREFBVyxDQUFBO0lBQ1gsaURBQVUsQ0FBQTtJQUNWLDZDQUFRLENBQUE7SUFDUixtREFBVyxDQUFBO0lBQ1gsbURBQVcsQ0FBQTtBQUNiLENBQUMsRUFOUyxXQUFXLEtBQVgsV0FBVyxRQU1wQjtBQUVILE1BQU0sQ0FBQyxJ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O1FBQzdCLElBQUksV0FBVyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFELFVBQVUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7WUFDdEQsQ0FBQztZQU9ELElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1QyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDM0MsQ0FBQztRQUNILENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLElBQUksV0FBVyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzRCxJQUFJLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFELFVBQVUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7WUFDdEQsQ0FBQztZQU9ELElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1QyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDM0MsQ0FBQztRQUNILENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLElBQUksV0FBVyxDQUFDLE9BQU8sSUFBSSxXQUFX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RSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUMsQ0FBQztnQkFDMUMsUUFBUSxHQUFFLElBQUksQ0FBQTtZQUVoQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFHLENBQUMsT0FBTyxJQUFJLFFBQVEsRUFBQyxDQUFDO1FBQ3ZCLE9BQU07SUFDUixDQUFDO0lBRUQsT0FBTSxVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBQyxDQUFDO1FBQzdILFVBQVUsQ0FBQyxZQUFZLElBQUUsQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFDRCxPQUFNO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQXVkaW9Tb3VyY2UsIEVudGl0eSwgZW5naW5lIH0gZnJvbSBcIkBkY2wvc2RrL2Vjc1wiO1xuaW1wb3J0IHsgYWN0aXZlTlBDLCBjbGVhck5QQywgY2xvc2VEaWFsb2dXaW5kb3csIGZvbGxvd1BhdGgsIGlzQWN0aXZlTnBjU2V0LCBucGNEYXRhQ29tcG9uZW50LCBzZXRBY3RpdmVOUEMsIHN0b3BQYXRoLCBzdG9wV2Fsa2luZyB9IGZyb20gXCIuL25wY1wiO1xuaW1wb3J0IHsgSXNUeXBpbmdEaWFsb2cgfSBmcm9tIFwiLi9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBoYW5kbGVEaWFsb2dUeXBpbmcgfSBmcm9tIFwiLi9zeXN0ZW1zXCI7XG5pbXBvcnQgeyBEaWFsb2csIEltYWdlRGF0YSwgTlBDU3RhdGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbGVmdENsaWNrU2VjdGlvbiwgbGVmdENsaWNrU2VjdGlvbmJCbGFjaywgbGlnaHRUaGVtZSwgc2VjdGlvbiwgc2tpcEJ1dHRvblNlY3Rpb24sIHNraXBCdXR0b25TZWN0aW9uQmxhY2sgfSBmcm9tICcuL3VpJztcbmltcG9ydCB7IGdldEJ1YmJsZVRleHRMZW5ndGggfSBmcm9tICcuL2J1YmJsZSc7XG5pbXBvcnQgeyBDb2xvcjQgfSBmcm9tICdAZGNsL3Nkay9tYXRoJztcbmltcG9ydCB7IGRlbGF5ZWRGdW5jdGlvbiB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG5cbmV4cG9ydCBjb25zdCBucGNEaWFsb2dDb21wb25lbnQ6IE1hcDxFbnRpdHksIGFueT4gPSBuZXcgTWFwKClcbmV4cG9ydCBjb25zdCBucGNEaWFsb2dUeXBpbmdTeXN0ZW1zOiBNYXA8RW50aXR5LCBhbnk+ID0gbmV3IE1hcCgpXG5leHBvcnQgY29uc3QgbnBjRGlhbG9nSW5wdXRMaXN0ZW5lcjogTWFwPEVudGl0eSxhbnk+ID0gbmV3IE1hcCgpXG5cbmV4cG9ydCBlbnVtIENvbmZpcm1Nb2RlIHtcbiAgICBDb25maXJtID0gMCxcbiAgICBDYW5jZWwgPSAxLFxuICAgIE5leHQgPSAyLFxuICAgIEJ1dHRvbjMgPSAzLFxuICAgIEJ1dHRvbjQgPSA0XG4gIH1cblxuZXhwb3J0IGxldCBVSXNjYWxlTXVsdGlwbGllciA9IDAuNzVcblxubGV0IHBvcnRyYWl0WFBvcyA9IC01MCAqIFVJc2NhbGVNdWx0aXBsaWVyIFxubGV0IHBvcnRyYWl0WVBvcyA9IDIwICogVUlzY2FsZU11bHRpcGxpZXJcblxubGV0IGltYWdlWFBvcyA9IDM1MCAqIFVJc2NhbGVNdWx0aXBsaWVyXG5sZXQgaW1hZ2VZUG9zID0gNTAgKiBVSXNjYWxlTXVsdGlwbGllclxuXG5sZXQgcG9ydHJhaXRTY2FsZSA9IDI1NiAqIFVJc2NhbGVNdWx0aXBsaWVyIFxubGV0IGltYWdlU2NhbGUgPSAyNTYgKiBVSXNjYWxlTXVsdGlwbGllciBcblxubGV0IHRleHRTaXplID0gMjQgKiBVSXNjYWxlTXVsdGlwbGllclxubGV0IHRleHRZUG9zID0gMTAgKiBVSXNjYWxlTXVsdGlwbGllclxuXG5sZXQgYnV0dG9uV2lkdGggPSAxNzQqIFVJc2NhbGVNdWx0aXBsaWVyXG5sZXQgYnV0dG9uSGVpZ2h0ID0gNDYqIFVJc2NhbGVNdWx0aXBsaWVyXG5cblxubGV0IGJ1dHRvblRleHRTaXplID0gMjAgKiBVSXNjYWxlTXVsdGlwbGllclxuXG5sZXQgYnV0dG9uMVhQb3MgPSAxNTAgKiBVSXNjYWxlTXVsdGlwbGllclxubGV0IGJ1dHRvbjJYUG9zID0gLTgwICogVUlzY2FsZU11bHRpcGxpZXJcbmxldCBidXR0b24zWFBvcyA9IC04MCAqIFVJc2NhbGVNdWx0aXBsaWVyXG5sZXQgYnV0dG9uNFhQb3MgPSAxNTAgKiBVSXNjYWxlTXVsdGlwbGllclxuXG5sZXQgYnV0dG9uMVlQb3MgPSAtNjUgKiBVSXNjYWxlTXVsdGlwbGllclxubGV0IGJ1dHRvbjJZUG9zID0gLTY1ICogVUlzY2FsZU11bHRpcGxpZXJcbmxldCBidXR0b24xWVBvczQgPSAtMjAgKiBVSXNjYWxlTXVsdGlwbGllclxubGV0IGJ1dHRvbjJZUG9zNCA9IC0yMCAqIFVJc2NhbGVNdWx0aXBsaWVyXG5sZXQgYnV0dG9uM1lQb3MgPSAtODAgKiBVSXNjYWxlTXVsdGlwbGllclxubGV0IGJ1dHRvbjRZUG9zID0gLTgwICogVUlzY2FsZU11bHRpcGxpZXJcblxubGV0IHNraXBCdXR0b25YUG9zID0gLTMwMCAqIFVJc2NhbGVNdWx0aXBsaWVyXG5sZXQgc2tpcEJ1dHRvbllQb3MgPSAtMTAwICogVUlzY2FsZU11bHRpcGxpZXJcblxubGV0IGJ1dHRvbkljb25XaWR0aCA9IDI2ICogVUlzY2FsZU11bHRpcGxpZXJcbmxldCBidXR0b25JY29uSGVpZ2h0ID0gMjYgKiBVSXNjYWxlTXVsdGlwbGllclxuXG4vL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGlhbG9nKG5wYzpFbnRpdHksIHNvdW5kPzpzdHJpbmcsIGRlZmF1bHRQb3J0cmFpdD86SW1hZ2VEYXRhKXtcbiAgICAvL2NvbnNvbGUubG9nKCdhZGRpbmcgZGlhbG9nIGZvciBucGMnLCBucGMpXG4gICAgbnBjRGlhbG9nQ29tcG9uZW50LnNldChucGMsIHtcbiAgICAgICAgdHlwaW5nOnRydWUsXG4gICAgICAgIHZpc2libGU6ZmFsc2UsXG4gICAgICAgIHZpc2libGVUZXh0OlwiXCIsXG4gICAgICAgIHZpc2libGVDaGFyczowLFxuICAgICAgICBmdWxsVGV4dDpcIlwiLFxuICAgICAgICB0aW1lcjowLFxuICAgICAgICBzcGVlZDo0NSxcbiAgICAgICAgb3JpZ2luYWxTY3JpcHQ6W10sXG4gICAgICAgIHNjcmlwdDpbXSxcbiAgICAgICAgaW5kZXg6MCxcbiAgICAgICAgc291bmQ6IHNvdW5kID8gc291bmQgOiB1bmRlZmluZWQsXG4gICAgICAgIHNvdW5kUGxheWVyOiBzb3VuZCA/IGVuZ2luZS5hZGRFbnRpdHkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZm9udFNpemU6MjIsXG4gICAgICAgIGlzUXVlc3Rpb246ZmFsc2UsXG4gICAgICAgIGJ1dHRvbnM6MCxcbiAgICAgICAgZGlzcGxheVBvcnRyYWl0OiBkZWZhdWx0UG9ydHJhaXQgPyB0cnVlIDogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRQb3J0cmFpdDogZGVmYXVsdFBvcnRyYWl0ID8gZGVmYXVsdFBvcnRyYWl0IDogbnVsbCxcbiAgICAgICAgZGVmYXVsdFBvcnRyYWl0VGV4dHVyZTogZGVmYXVsdFBvcnRyYWl0ID8gZGVmYXVsdFBvcnRyYWl0LnBhdGggOiBsaWdodFRoZW1lLFxuICAgICAgICBjdXJyZW50UG9ydHJhaXQ6IGRlZmF1bHRQb3J0cmFpdCA/IGRlZmF1bHRQb3J0cmFpdC5wYXRoIDogbGlnaHRUaGVtZSxcbiAgICAgICAgcG9ydHJhaXRXaWR0aDogZGVmYXVsdFBvcnRyYWl0ICYmIGRlZmF1bHRQb3J0cmFpdC53aWR0aCA/IGRlZmF1bHRQb3J0cmFpdC53aWR0aCAqIFVJc2NhbGVNdWx0aXBsaWVyIDogcG9ydHJhaXRTY2FsZSxcbiAgICAgICAgcG9ydHJhaXRIZWlnaHQ6IGRlZmF1bHRQb3J0cmFpdCAmJiBkZWZhdWx0UG9ydHJhaXQuaGVpZ2h0ID8gZGVmYXVsdFBvcnRyYWl0LmhlaWdodCAqIFVJc2NhbGVNdWx0aXBsaWVyIDogcG9ydHJhaXRTY2FsZSxcbiAgICAgICAgcG9ydHJhaXRYOiBkZWZhdWx0UG9ydHJhaXQgJiYgZGVmYXVsdFBvcnRyYWl0Lm9mZnNldFggPyBkZWZhdWx0UG9ydHJhaXQub2Zmc2V0WCAqIFVJc2NhbGVNdWx0aXBsaWVyICsgcG9ydHJhaXRYUG9zIDogcG9ydHJhaXRYUG9zLFxuICAgICAgICBwb3J0cmFpdFk6ICBkZWZhdWx0UG9ydHJhaXQgJiYgZGVmYXVsdFBvcnRyYWl0Lm9mZnNldFkgPyBkZWZhdWx0UG9ydHJhaXQub2Zmc2V0WSAqIFVJc2NhbGVNdWx0aXBsaWVyICsgcG9ydHJhaXRZUG9zIDogcG9ydHJhaXRZUG9zLFxuICAgICAgICBwb3J0YWl0U0hlaWdodDogZGVmYXVsdFBvcnRyYWl0ICYmIGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uICYmIGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uLnNvdXJjZUhlaWdodCA/IGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uLnNvdXJjZUhlaWdodCA6IDI1NixcbiAgICAgICAgcG9ydHJhaXRTV2lkdGg6IGRlZmF1bHRQb3J0cmFpdCAmJiBkZWZhdWx0UG9ydHJhaXQuc2VjdGlvbiAmJiBkZWZhdWx0UG9ydHJhaXQuc2VjdGlvbi5zb3VyY2VXaWR0aCA/IGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uLnNvdXJjZVdpZHRoIDogMjU2LFxuICAgICAgICBwb3J0YWl0U1RvcDogZGVmYXVsdFBvcnRyYWl0ICYmIGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uICYmIGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uLnNvdXJjZVRvcCA/IGRlZmF1bHRQb3J0cmFpdC5zZWN0aW9uLnNvdXJjZVRvcCA6IDAsXG4gICAgICAgIHBvcnRyYWl0U0xlZnQ6IGRlZmF1bHRQb3J0cmFpdCAmJiBkZWZhdWx0UG9ydHJhaXQuc2VjdGlvbiAmJiBkZWZhdWx0UG9ydHJhaXQuc2VjdGlvbi5zb3VyY2VMZWZ0ID8gZGVmYXVsdFBvcnRyYWl0LnNlY3Rpb24uc291cmNlTGVmdCA6IDBcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheUltYWdlKCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IGZhbHNlIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLmRpc3BsYXlJbWFnZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVBvcnRyYWl0KCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IGZhbHNlIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLmRpc3BsYXlQb3J0cmFpdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVNraXBhYmxlKCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IGZhbHNlIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnNraXBhYmxlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTa2lwYWJsZVRoZW1lKCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IHNraXBCdXR0b25TZWN0aW9uQmxhY2sgOiBucGNEYXRhQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnRoZW1lID09IGxpZ2h0VGhlbWUgPyBza2lwQnV0dG9uU2VjdGlvbkJsYWNrIDogc2tpcEJ1dHRvblNlY3Rpb25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExlZnRDbGlja1RoZW1lKCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IGxlZnRDbGlja1NlY3Rpb24gOiBucGNEYXRhQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnRoZW1lID09IGxpZ2h0VGhlbWUgPyBsZWZ0Q2xpY2tTZWN0aW9uIDogbGVmdENsaWNrU2VjdGlvbmJCbGFja1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25UZXh0WCgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnBvc2l0aW9uWFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25UZXh0WSgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnBvc2l0aW9uWVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Qb3J0YWl0WCgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnBvcnRyYWl0WFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Qb3J0YWl0WSgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnBvcnRyYWl0WVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9ydHJhaXRXaWR0aCgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnBvcnRyYWl0V2lkdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcnRyYWl0SGVpZ2h0KCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IFwiXCIgOiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykucG9ydHJhaXRIZWlnaHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uSW1hZ2VYKCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IFwiXCIgOiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykuaW1hZ2VYXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGlvbkltYWdlWSgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLmltYWdlWVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VXaWR0aCgpe1xuICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBcIlwiIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLmltYWdlV2lkdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlSGVpZ2h0KCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IFwiXCIgOiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykuaW1hZ2VIZWlnaHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvcnRyYWl0KCl7XG4gIGlmICghaXNBY3RpdmVOcGNTZXQoKSkgcmV0dXJuIGxpZ2h0VGhlbWVcbiAgY29uc3QgcCA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS5jdXJyZW50UG9ydHJhaXRcbiAgcmV0dXJuIHR5cGVvZiBwID09PSAnc3RyaW5nJyAmJiBwLmxlbmd0aCA+PSAwID8gcCA6IGxpZ2h0VGhlbWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlKCl7XG4gIGlmICghaXNBY3RpdmVOcGNTZXQoKSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgaW1nID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLmRpYWxvZ0ltYWdlVGV4dHVyZVxuICByZXR1cm4gdHlwZW9mIGltZyA9PT0gJ3N0cmluZycgPyBpbWcgOiBcIlwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KCl7XG4gICAgcmV0dXJuICFpc0FjdGl2ZU5wY1NldCgpID8gXCJcIiA6IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS52aXNpYmxlVGV4dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dENvbG9yKCl7XG4gIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IENvbG9yNC5CbGFjaygpIDogbnBjRGF0YUNvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS50aGVtZSA9PSBsaWdodFRoZW1lID8gQ29sb3I0LkJsYWNrKCkgOiBDb2xvcjQuV2hpdGUoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGhlbWUoKXtcbiAgcmV0dXJuICFpc0FjdGl2ZU5wY1NldCgpID8gbGlnaHRUaGVtZSA6IG5wY0RhdGFDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykudGhlbWVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1dHRvblRleHQoYnV0dG9uOm51bWJlcil7XG4gICAgbGV0IHRleHQgPSBcIlwiXG5cbiAgICBpZihhY3RpdmVOUEMgIT0gMCAmJiBucGNEaWFsb2dDb21wb25lbnQuaGFzKGFjdGl2ZU5QQykpe1xuICAgICAgICBsZXQgZGlhbG9nRGF0YSA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKVxuICAgICAgICBpZihkaWFsb2dEYXRhLmlzUXVlc3Rpb24gJiYgZGlhbG9nRGF0YS5idXR0b25zID4gYnV0dG9uKXtcbiAgICAgICAgICAgIHRleHQgPSBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XS5idXR0b25zW2J1dHRvbl0ubGFiZWxcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0YnV0dG9uU2l6ZShidXR0b246bnVtYmVyKSB7XG4gIGxldCBCdXR0b25TaXplOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWRcbiAgaWYgKGFjdGl2ZU5QQyAhPSAwICYmIG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMoYWN0aXZlTlBDKSkge1xuICAgICAgbGV0IGRpYWxvZ0RhdGEgPSBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQyk7XG4gICAgICBpZiAoZGlhbG9nRGF0YS5pc1F1ZXN0aW9uICYmIGRpYWxvZ0RhdGEuYnV0dG9ucyA+IGJ1dHRvbikge1xuICAgICAgICAgIGlmIChkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XS5idXR0b25zW2J1dHRvbl0uc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIEJ1dHRvblNpemUgPSBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XS5idXR0b25zW2J1dHRvbl0/LnNpemU7XG4gICAgICAgICAgfVxuICAgICAgfVxuICB9XG4gIHJldHVybiBCdXR0b25TaXplXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb250U2l6ZSgpe1xuICAgIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IDIyIDogbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLmZvbnRTaXplXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdXR0b25Gb250U2l6ZShidXR0b246bnVtYmVyKXtcbiAgbGV0IEJ1dHRvbkZvbnRTaXplOiBudW1iZXIgPSAwXG4gIGlmIChhY3RpdmVOUEMgIT0gMCAmJiBucGNEaWFsb2dDb21wb25lbnQuaGFzKGFjdGl2ZU5QQykpIHtcbiAgICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpO1xuICAgICAgaWYgKGRpYWxvZ0RhdGEuaXNRdWVzdGlvbiAmJiBkaWFsb2dEYXRhLmJ1dHRvbnMgPiBidXR0b24pIHtcbiAgICAgICAgICBpZiAoZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0uYnV0dG9uc1tidXR0b25dLmZvbnRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIEJ1dHRvbkZvbnRTaXplID0gZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0uYnV0dG9uc1tidXR0b25dPy5mb250U2l6ZTtcbiAgICAgICAgICB9IGVsc2Uge0J1dHRvbkZvbnRTaXplID0gMTZ9XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIEJ1dHRvbkZvbnRTaXplXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5RGlhbG9nKCl7XG4gICAgcmV0dXJuICFpc0FjdGl2ZU5wY1NldCgpID8gZmFsc2UgOiAgbnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLnZpc2libGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd0hlaWdodCgpIHtcbiAgbGV0IHdpbmRvd0hlaWdodHM6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZFxuICBpZiAoYWN0aXZlTlBDICE9IDAgJiYgbnBjRGlhbG9nQ29tcG9uZW50LmhhcyhhY3RpdmVOUEMpKSB7XG4gICAgICBsZXQgZGlhbG9nRGF0YSA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKTtcbiAgICAgIGlmIChkaWFsb2dEYXRhLmlzUXVlc3Rpb24pIHtcbiAgICAgICAgICBpZiAoZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0ud2luZG93SGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdpbmRvd0hlaWdodHMgPSBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XT8ud2luZG93SGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICByZXR1cm4gd2luZG93SGVpZ2h0c1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheUJ1dHRvbihidXR0b246bnVtYmVyKXtcbiAgICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBmYWxzZSA6ICBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykuaXNRdWVzdGlvbiAmJiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykuYnV0dG9ucyA+PSBidXR0b25cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlGaXJzdEJ1dHRvbkNvbnRhaW5lcigpe1xuICAgIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IGZhbHNlIDogIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS5pc1F1ZXN0aW9uICYmIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS5idXR0b25zID49IDFcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlTZWNvbmRCdXR0b25Db250YWluZXIoKXtcbiAgICByZXR1cm4gIWlzQWN0aXZlTnBjU2V0KCkgPyBmYWxzZSA6ICBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykuaXNRdWVzdGlvbiAmJiBucGNEaWFsb2dDb21wb25lbnQuZ2V0KGFjdGl2ZU5QQykuYnV0dG9ucyA+PSAzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0UG9zaXRpb24oKXtcbiAgICAvL2NvbnNvbGUubG9nKG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS5idXR0b25zKVxuICAgIHJldHVybiAhaXNBY3RpdmVOcGNTZXQoKSA/IHt0b3A6MCwgbGVmdDowfSA6IHt0b3A6bnBjRGlhbG9nQ29tcG9uZW50LmdldChhY3RpdmVOUEMpLm1hcmdpbiArIG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS5wb3NpdGlvblksIGxlZnQ6IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQoYWN0aXZlTlBDKS5wb3NpdGlvblh9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidXR0b25DbGljayhidXR0b246bnVtYmVyKXtcbiAgICBpZihpc0FjdGl2ZU5wY1NldCgpKXtcbiAgICAgICAgY29uZmlybVRleHQoYWN0aXZlTlBDLCBidXR0b24pXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VEaWFsb2cobnBjOkVudGl0eSl7XG4gICAgbGV0IGRpYWxvZ0RhdGEgPSBucGNEaWFsb2dDb21wb25lbnQuZ2V0KG5wYylcbiAgICBpZighZGlhbG9nRGF0YSkgcmV0dXJuXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlID0gZmFsc2VcbiAgICBkaWFsb2dEYXRhLnR5cGluZyA9IGZhbHNlXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlVGV4dCA9IFwiXCJcbiAgICBkaWFsb2dEYXRhLnZpc2libGVDaGFycyA9IDBcbiAgICBkaWFsb2dEYXRhLmZ1bGxUZXh0ID0gXCJcIlxuICAgIGRpYWxvZ0RhdGEudGltZXIgPSAwXG4gICAgZGlhbG9nRGF0YS5pbmRleCA9IDBcbiAgICBkaWFsb2dEYXRhLnNjcmlwdC5sZW5ndGggPSAwXG4gICAgZGlhbG9nRGF0YS5idXR0b25zID0gMFxuICAgIGRpYWxvZ0RhdGEubWFyZ2luID0gMFxuICAgIGRpYWxvZ0RhdGEuZGlzcGxheVBvcnRyYWl0ID0gZmFsc2VcbiAgICBkaWFsb2dEYXRhLnNraXBhYmxlID0gZmFsc2VcbiAgICBkaWFsb2dEYXRhLmRpc3BsYXlJbWFnZSA9IGZhbHNlXG4gICAgLy9jb25zb2xlLmxvZygnZGlhbG9nIGRhdGEgaXMgbm93ICcsIGRpYWxvZ0RhdGEpXG5cbiAgICBpZihJc1R5cGluZ0RpYWxvZy5oYXMobnBjKSl7XG4gICAgICBJc1R5cGluZ0RpYWxvZy5kZWxldGVGcm9tKG5wYylcbiAgICB9XG4gICAgLy8gaWYobnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5tYW51YWxTdG9wKXtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdkaWFsb2cgZW5kZWQsIG5lZWR0byB3YWxrIGFnYWluJylcbiAgICAvLyAgIGZvbGxvd1BhdGgobnBjKVxuICAgIC8vIH1cbiAgICBjbGVhck5QQygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWxrKG5wYzpFbnRpdHksIGRpYWxvZzpEaWFsb2dbXSwgc3RhcnRJbmRleD86bnVtYmVyIHwgc3RyaW5nLCBkdXJhdGlvbj86bnVtYmVyKXtcbiAgICBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLmludHJvZHVjZWQgPSB0cnVlXG4gICAgaWYobnBjRGlhbG9nQ29tcG9uZW50LmhhcyhucGMpKXtcblxuICAgICAgICBzZXRBY3RpdmVOUEMobnBjKVxuICAgICAgICBpZihucGNEYXRhQ29tcG9uZW50LmdldChucGMpLnN0YXRlID09IE5QQ1N0YXRlLkZPTExPV1BBVEgpe1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzcGVha2luZyBkaWFsb2csIG5lZWQgdG8gc3RvcCBwYXRoXCIpXG4gICAgICAgICAgc3RvcFdhbGtpbmcobnBjKVxuICAgICAgICB9XG5cbiAgICAgICAgbnBjRGF0YUNvbXBvbmVudC5nZXQobnBjKS5zdGF0ZSA9IE5QQ1N0YXRlLlRBTEtJTkdcblxuXG4gICAgICAgIGxldCBpbmRleDphbnlcblxuICAgICAgICBpZiAoIXN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICBpbmRleCA9IDBcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RhcnRJbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBpbmRleCA9IHN0YXJ0SW5kZXhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRleCA9IGZpbmREaWFsb2dCeU5hbWUoZGlhbG9nLCBzdGFydEluZGV4KVxuICAgICAgICB9XG5cbiAgICAgICAgb3BlbkRpYWxvZyhucGMsZGlhbG9nLCBpbmRleClcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcGVuRGlhbG9nKG5wYzpFbnRpdHksIGRpYWxvZzpEaWFsb2dbXSwgc3RhcnRJbmRleDpudW1iZXIpe1xuICAgIC8vY29uc29sZS5sb2coJ3NjcmlwdCB0byB0YWxrIGlzJywgZGlhbG9nKVxuICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpXG4gICAgZGlhbG9nRGF0YS5zY3JpcHQgPSBkaWFsb2cuc2xpY2UoKVxuICAgIGRpYWxvZ0RhdGEuaW5kZXggPSBzdGFydEluZGV4XG5cbiAgICAvL2NvbnNvbGUubG9nKCdkaWFsb2cgZGF0YSBpcyBub3cnLCBkaWFsb2dEYXRhKVxuICAgIFxuICAgIGxldCBjdXJyZW50VGV4dDogRGlhbG9nID0gZGlhbG9nW3N0YXJ0SW5kZXhdID8gZGlhbG9nW3N0YXJ0SW5kZXhdIDogeyB0ZXh0OiAnJyB9XG5cbiAgICBpZiAoZGlhbG9nRGF0YS5zb3VuZCkge1xuICAgICAgICBBdWRpb1NvdXJjZS5jcmVhdGVPclJlcGxhY2UoZGlhbG9nRGF0YS5zb3VuZFBsYXllciwge1xuICAgICAgICAgICAgYXVkaW9DbGlwVXJsOiBkaWFsb2dEYXRhLnNvdW5kLFxuICAgICAgICAgICAgbG9vcDogZmFsc2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICBsZXQgYXVkaW8gPSBBdWRpb1NvdXJjZS5nZXRNdXRhYmxlKGRpYWxvZ0RhdGEuc291bmRQbGF5ZXIpXG4gICAgICAgIGF1ZGlvLnZvbHVtZSA9IG5wY0RhdGFDb21wb25lbnQuZ2V0KG5wYykudm9sdW1lXG4gICAgICAgIGF1ZGlvLnBsYXlpbmcgPSB0cnVlXG4gICAgfVxuXG4gICAgLy9UT0RPXG4gICAgLy9zZXQgaW1hZ2Ugb24gdGhlIHJpZ2h0XG4gICAgLy9zZXQgdGV4dFxuICAgIGJlZ2luVHlwaW5nKG5wYylcbn0gXG5cbmNvbnN0IEJBU0VfRElBTE9HX0ZPTlRfU0laRSA9IDIyXG5jb25zdCBCQVNFX0RJQUxPR19MSU5FX0NIQVJTID0gNDVcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExpbmVCcmVhayh0ZXh0OnN0cmluZywgYnViYmxlPzpib29sZWFuLCBmb250U2l6ZT86bnVtYmVyKXtcbiAgaWYgKGJ1YmJsZSkge1xuICAgIHJldHVybiBsaW5lQnJlYWsodGV4dCwgZ2V0QnViYmxlVGV4dExlbmd0aCh0ZXh0KSEpXG4gIH1cbiAgY29uc3QgZnMgPSBmb250U2l6ZSAmJiBmb250U2l6ZSA+IDAgPyBmb250U2l6ZSA6IEJBU0VfRElBTE9HX0ZPTlRfU0laRVxuICBjb25zdCBtYXhDaGFycyA9IE1hdGgubWF4KDE1LCBNYXRoLnJvdW5kKEJBU0VfRElBTE9HX0xJTkVfQ0hBUlMgKiBCQVNFX0RJQUxPR19GT05UX1NJWkUgLyBmcykpXG4gIHJldHVybiBsaW5lQnJlYWsodGV4dCwgbWF4Q2hhcnMpXG59XG5cbmZ1bmN0aW9uIGJlZ2luVHlwaW5nKG5wYzpFbnRpdHkpe1xuICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpXG4gICAgbGV0IGN1cnJlbnRUZXh0OiBEaWFsb2cgPSBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XSA/IGRpYWxvZ0RhdGEuc2NyaXB0W2RpYWxvZ0RhdGEuaW5kZXhdIDogeyB0ZXh0OiAnJyB9XG5cbiAgICBkaWFsb2dEYXRhLnZpc2libGUgPSB0cnVlXG4gICAgZGlhbG9nRGF0YS50eXBpbmcgPSB0cnVlXG4gICAgZGlhbG9nRGF0YS52aXNpYmxlVGV4dCA9IFwiXCJcbiAgICBkaWFsb2dEYXRhLnZpc2libGVDaGFycyA9IDBcbiAgICBkaWFsb2dEYXRhLnRpbWVyID0gMFxuICAgIGRpYWxvZ0RhdGEuaXNRdWVzdGlvbiA9IGZhbHNlXG4gICAgZGlhbG9nRGF0YS5idXR0b25zID0gMFxuICAgIGRpYWxvZ0RhdGEubWFyZ2luID0gMFxuICAgIGRpYWxvZ0RhdGEuZGlzcGxheVBvcnRyYWl0ID0gZmFsc2VcbiAgICBkaWFsb2dEYXRhLmRpc3BsYXlJbWFnZSA9IGZhbHNlXG4gICAgZGlhbG9nRGF0YS5za2lwYWJsZSA9IGZhbHNlXG5cbiAgICAvLyBSZXNvbHZlIGV2ZXJ5IHBlci1lbnRyeSBwcm9wZXJ0eSBleHBsaWNpdGx5OiBlYWNoIG11c3QgZWl0aGVyIGNvbWUgZnJvbVxuICAgIC8vIHRoZSBjdXJyZW50IGVudHJ5IG9yIGJlIHJlc2V0IHRvIGl0cyBkZWZhdWx0LiBPdGhlcndpc2UgdmFsdWVzIGxlYWtcbiAgICAvLyBmcm9tIHRoZSBwcmV2aW91cyBlbnRyeS5cbiAgICBkaWFsb2dEYXRhLmZvbnRTaXplID0gY3VycmVudFRleHQuZm9udFNpemUgPyBjdXJyZW50VGV4dC5mb250U2l6ZSA6IEJBU0VfRElBTE9HX0ZPTlRfU0laRVxuICAgIGRpYWxvZ0RhdGEuc2tpcGFibGUgPSBjdXJyZW50VGV4dC5za2lwYWJsZSA/IHRydWUgOiBmYWxzZVxuICAgIGRpYWxvZ0RhdGEuc3BlZWQgPSBjdXJyZW50VGV4dC5oYXNPd25Qcm9wZXJ0eSgndHlwZVNwZWVkJykgPyBjdXJyZW50VGV4dC50eXBlU3BlZWQgOiA0NVxuICAgIGRpYWxvZ0RhdGEucG9zaXRpb25YID0gY3VycmVudFRleHQub2Zmc2V0WCA/IGN1cnJlbnRUZXh0Lm9mZnNldFggKiBVSXNjYWxlTXVsdGlwbGllciA6ICcyMiUnXG4gICAgZGlhbG9nRGF0YS5wb3NpdGlvblkgPSBjdXJyZW50VGV4dC5vZmZzZXRZID8gY3VycmVudFRleHQub2Zmc2V0WSAqIFVJc2NhbGVNdWx0aXBsaWVyICsgdGV4dFlQb3MgOiB0ZXh0WVBvc1xuXG4gICAgZGlhbG9nRGF0YS5mdWxsVGV4dCA9IGFkZExpbmVCcmVhayhjdXJyZW50VGV4dC50ZXh0LCBmYWxzZSwgZGlhbG9nRGF0YS5mb250U2l6ZSlcblxuICAgIC8vIFBsYXkgYXVkaW8gZm9yIHRoZSBjdXJyZW50IGRpYWxvZ3VlIGVudHJ5XG4gICAgaWYgKGN1cnJlbnRUZXh0LmF1ZGlvKSB7XG4gICAgICBBdWRpb1NvdXJjZS5jcmVhdGVPclJlcGxhY2UoZGlhbG9nRGF0YS5zb3VuZFBsYXllciwge1xuICAgICAgICBhdWRpb0NsaXBVcmw6IGN1cnJlbnRUZXh0LmF1ZGlvLFxuICAgICAgICBsb29wOiBmYWxzZSxcbiAgICAgICAgcGxheWluZzogZmFsc2VcbiAgICAgIH0pXG4gICAgICBsZXQgYXVkaW8gPSBBdWRpb1NvdXJjZS5nZXRNdXRhYmxlKGRpYWxvZ0RhdGEuc291bmRQbGF5ZXIpXG4gICAgICBhdWRpby52b2x1bWUgPSBucGNEYXRhQ29tcG9uZW50LmdldChucGMpLnZvbHVtZVxuICAgICAgYXVkaW8ucGxheWluZyA9IHRydWVcbiAgICB9XG5cbiAgICBpZihjdXJyZW50VGV4dC5wb3J0cmFpdCl7XG4gICAgICBkaWFsb2dEYXRhLmN1cnJlbnRQb3J0cmFpdCA9IGN1cnJlbnRUZXh0LnBvcnRyYWl0LnBhdGhcblxuICAgICAgZGlhbG9nRGF0YS5wb3J0cmFpdFggPSBjdXJyZW50VGV4dC5wb3J0cmFpdC5vZmZzZXRYXG4gICAgICA/IGN1cnJlbnRUZXh0LnBvcnRyYWl0Lm9mZnNldFggKiBVSXNjYWxlTXVsdGlwbGllciArIHBvcnRyYWl0WFBvc1xuICAgICAgOiBwb3J0cmFpdFhQb3NcblxuICAgICAgZGlhbG9nRGF0YS5wb3J0cmFpdFkgPSBjdXJyZW50VGV4dC5wb3J0cmFpdC5vZmZzZXRZXG4gICAgICA/IGN1cnJlbnRUZXh0LnBvcnRyYWl0Lm9mZnNldFkgKiBVSXNjYWxlTXVsdGlwbGllciArIHBvcnRyYWl0WVBvc1xuICAgICAgOiBwb3J0cmFpdFlQb3NcblxuICAgICAgZGlhbG9nRGF0YS5wb3J0cmFpdFdpZHRoID0gY3VycmVudFRleHQucG9ydHJhaXQud2lkdGggPyBjdXJyZW50VGV4dC5wb3J0cmFpdC53aWR0aCAqIFVJc2NhbGVNdWx0aXBsaWVyIDogcG9ydHJhaXRTY2FsZVxuXG4gICAgICBkaWFsb2dEYXRhLnBvcnRyYWl0SGVpZ2h0ID0gY3VycmVudFRleHQucG9ydHJhaXQuaGVpZ2h0ID8gY3VycmVudFRleHQucG9ydHJhaXQuaGVpZ2h0ICogVUlzY2FsZU11bHRpcGxpZXIgOiBwb3J0cmFpdFNjYWxlXG4gICAgICBkaWFsb2dEYXRhLmRpc3BsYXlQb3J0cmFpdCA9IHRydWVcbiAgICB9ZWxzZSBpZihkaWFsb2dEYXRhLmRlZmF1bHRQb3J0cmFpdCl7XG4gICAgICBjb25zdCBkcCA9IGRpYWxvZ0RhdGEuZGVmYXVsdFBvcnRyYWl0XG4gICAgICBkaWFsb2dEYXRhLmN1cnJlbnRQb3J0cmFpdCA9IGRpYWxvZ0RhdGEuZGVmYXVsdFBvcnRyYWl0VGV4dHVyZVxuICAgICAgZGlhbG9nRGF0YS5wb3J0cmFpdFggPSBkcC5vZmZzZXRYID8gZHAub2Zmc2V0WCAqIFVJc2NhbGVNdWx0aXBsaWVyICsgcG9ydHJhaXRYUG9zIDogcG9ydHJhaXRYUG9zXG4gICAgICBkaWFsb2dEYXRhLnBvcnRyYWl0WSA9IGRwLm9mZnNldFkgPyBkcC5vZmZzZXRZICogVUlzY2FsZU11bHRpcGxpZXIgKyBwb3J0cmFpdFlQb3MgOiBwb3J0cmFpdFlQb3NcbiAgICAgIGRpYWxvZ0RhdGEucG9ydHJhaXRXaWR0aCA9IGRwLndpZHRoID8gZHAud2lkdGggKiBVSXNjYWxlTXVsdGlwbGllciA6IHBvcnRyYWl0U2NhbGVcbiAgICAgIGRpYWxvZ0RhdGEucG9ydHJhaXRIZWlnaHQgPSBkcC5oZWlnaHQgPyBkcC5oZWlnaHQgKiBVSXNjYWxlTXVsdGlwbGllciA6IHBvcnRyYWl0U2NhbGVcbiAgICAgIGRpYWxvZ0RhdGEuZGlzcGxheVBvcnRyYWl0ID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgZGlhbG9nRGF0YS5kaXNwbGF5UG9ydHJhaXQgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmKGN1cnJlbnRUZXh0LmlzUXVlc3Rpb24pe1xuICAgICAgICBkaWFsb2dEYXRhLmJ1dHRvbnMgPSBjdXJyZW50VGV4dC5idXR0b25zIS5sZW5ndGhcbiAgICAgICAgaWYoZGlhbG9nRGF0YS5idXR0b25zID49IDMpe1xuICAgICAgICAgICAgZGlhbG9nRGF0YS5tYXJnaW4gPSAtMjVcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKGRpYWxvZ0RhdGEuYnV0dG9ucyA+PTEpe1xuICAgICAgICAgICAgZGlhbG9nRGF0YS5tYXJnaW4gPSAtMjVcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGF5ZWRGdW5jdGlvbigoKSA9PiB7XG4gICAgICAgICAgZGlhbG9nRGF0YS5pc1F1ZXN0aW9uID0gdHJ1ZVxuICAgICAgICB9LCA3MDApXG4gICAgfVxuXG4gICAgZGlhbG9nRGF0YS5vcGVuVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSlcblxuICAgIGlmKGN1cnJlbnRUZXh0LmltYWdlKXtcbiAgICAgIGRpYWxvZ0RhdGEuZGlhbG9nSW1hZ2VUZXh0dXJlID0gY3VycmVudFRleHQuaW1hZ2UucGF0aFxuICAgICAgZGlhbG9nRGF0YS5pbWFnZVggPSBjdXJyZW50VGV4dC5pbWFnZS5vZmZzZXRYID8gY3VycmVudFRleHQuaW1hZ2Uub2Zmc2V0WCAqIFVJc2NhbGVNdWx0aXBsaWVyICsgaW1hZ2VYUG9zIDogLTQwXG4gICAgICBkaWFsb2dEYXRhLmltYWdlWSA9IGN1cnJlbnRUZXh0LmltYWdlLm9mZnNldFkgPyBjdXJyZW50VGV4dC5pbWFnZS5vZmZzZXRZICogVUlzY2FsZU11bHRpcGxpZXIgKyBpbWFnZVlQb3MgOiA0MFxuICAgICAgZGlhbG9nRGF0YS5pbWFnZUhlaWdodCA9IGN1cnJlbnRUZXh0LmltYWdlLmhlaWdodCA/IGN1cnJlbnRUZXh0LmltYWdlLmhlaWdodCAqIFVJc2NhbGVNdWx0aXBsaWVyIDogaW1hZ2VTY2FsZVxuICAgICAgZGlhbG9nRGF0YS5pbWFnZVdpZHRoID0gY3VycmVudFRleHQuaW1hZ2Uud2lkdGggPyBjdXJyZW50VGV4dC5pbWFnZS53aWR0aCAqIFVJc2NhbGVNdWx0aXBsaWVyIDogaW1hZ2VTY2FsZVxuICAgICAgZGlhbG9nRGF0YS5kaXNwbGF5SW1hZ2UgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYoZGlhbG9nRGF0YS5zcGVlZCA8PSAwKXtcbiAgICAgICAgcnVzaFRleHQobnBjKVxuICAgIH1cbiAgICBlbHNle1xuICAgICAgICBpZighSXNUeXBpbmdEaWFsb2cuaGFzKG5wYykpe1xuICAgICAgICAgICAgSXNUeXBpbmdEaWFsb2cuY3JlYXRlKG5wYylcbiAgICAgICAgfVxuICAgIFxuICAgICAgICAvLyBpZighbnBjRGlhbG9nVHlwaW5nU3lzdGVtcy5oYXMobnBjKSl7XG4gICAgICAgIC8vICAgICBucGNEaWFsb2dUeXBpbmdTeXN0ZW1zLnNldChucGMsZW5naW5lLmFkZFN5c3RlbShoYW5kbGVEaWFsb2dUeXBpbmcpKVxuICAgICAgICAvLyB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGluZUJyZWFrcyhkaWFsb2c6RGlhbG9nW10sIGJ1YmJsZT86Ym9vbGVhbil7XG4gICAgbGV0IGNsZWFuZWQ6RGlhbG9nW10gPSBkaWFsb2cuc2xpY2UoKVxuICAgIGNsZWFuZWQuZm9yRWFjaCgoZCk9PntcbiAgICAgIGQudGV4dCA9IGxpbmVCcmVhayhkLnRleHQsIGJ1YmJsZT8gZ2V0QnViYmxlVGV4dExlbmd0aChkLnRleHQpISA6IDUwKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsZWFuZWRcbn1cblxuZnVuY3Rpb24gbGluZUJyZWFrKHRleHQ6IHN0cmluZywgbWF4TGluZUxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcbiAgICBsZXQgY3VycmVudExpbmUgPSAnJztcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICBcbiAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHtcbiAgICAgIGlmIChjdXJyZW50TGluZS5sZW5ndGggKyB3b3JkLmxlbmd0aCArIDEgPD0gbWF4TGluZUxlbmd0aCkge1xuICAgICAgICBjdXJyZW50TGluZSArPSBgJHt3b3JkfSBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZS50cmltKCkpO1xuICAgICAgICBjdXJyZW50TGluZSA9IGAke3dvcmR9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUudHJpbSgpKTtcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaWFsb2dDbGljaygpe1xuICAvL2NvbnNvbGUubG9nKCdoYW5kbGluZyBjbGljaycpXG4gICAgbGV0IG5wYyA9IGFjdGl2ZU5QQ1xuICAgIGlmKG5wY0RpYWxvZ0NvbXBvbmVudC5oYXMobnBjKSl7XG4gICAgICAgIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpXG4gICAgICAgIGlmKCFkaWFsb2dEYXRhLnZpc2libGUgfHwgKE1hdGguZmxvb3IoRGF0ZS5ub3coKSkgLSBkaWFsb2dEYXRhLm9wZW5UaW1lICA8IDEwMCkpIHJldHVyblxuICAgICAgICBcbiAgICAgICAgaWYoZGlhbG9nRGF0YS50eXBpbmcpe1xuICAgICAgICAgICAgcnVzaFRleHQobnBjKVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgICBjb25maXJtVGV4dChucGMsIENvbmZpcm1Nb2RlLk5leHQpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydXNoVGV4dChucGM6RW50aXR5KXtcbiAgICBsZXQgZGlhbG9nRGF0YSA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKVxuICAgIGRpYWxvZ0RhdGEudHlwaW5nID0gZmFsc2VcbiAgICBkaWFsb2dEYXRhLnRpbWVyID0gMFxuICAgIGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzID0gZGlhbG9nRGF0YS5mdWxsVGV4dC5sZW5ndGhcbiAgICBkaWFsb2dEYXRhLnZpc2libGVUZXh0ID0gZGlhbG9nRGF0YS5mdWxsVGV4dFxuICAgIC8vZW5naW5lLnJlbW92ZVN5c3RlbShucGNEaWFsb2dUeXBpbmdTeXN0ZW1zLmdldChucGMpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlybVRleHQobnBjOkVudGl0eSwgbW9kZTogQ29uZmlybU1vZGUpOiB2b2lkIHtcbiAgLy9jb25zb2xlLmxvZygnY29uZmlybSB0ZXh0JylcbiAgICBsZXQgZGlhbG9nRGF0YSA9IG5wY0RpYWxvZ0NvbXBvbmVudC5nZXQobnBjKVxuICAgIGRpYWxvZ0RhdGEub3BlblRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkpXG5cbiAgICBsZXQgY3VycmVudFRleHQgPSBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XVxuICAgIC8vIFVwZGF0ZSBhY3RpdmUgdGV4dFxuICAgIGlmIChtb2RlID09IENvbmZpcm1Nb2RlLk5leHQpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50VGV4dC5pc1F1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFRleHQudHJpZ2dlcmVkQnlOZXh0KSB7XG4gICAgICAgICAgICBjdXJyZW50VGV4dC50cmlnZ2VyZWRCeU5leHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRUZXh0LmlzRW5kT2ZEaWFsb2cpIHtcbiAgICAgICAgICAgIGNsb3NlRGlhbG9nKG5wYylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlhbG9nRGF0YS5pbmRleCsrXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PSBDb25maXJtTW9kZS5Db25maXJtKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5idXR0b25zICYmIGN1cnJlbnRUZXh0LmJ1dHRvbnMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRUZXh0LmJ1dHRvbnNbMF0uZ29Ub0RpYWxvZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRpYWxvZ0RhdGEuaW5kZXggPSBjdXJyZW50VGV4dC5idXR0b25zWzBdLmdvVG9EaWFsb2dcbiAgICAgICAgICB9IFxuXG4gICAgICAgICAgLy9UT0RPXG4gICAgICAgICAgLy9hbGxvdyBkaWFsb2dzIHRvIGJlIGluZGV4IGJ5IG5hbWVcbiAgICAgICAgLy8gICBlbHNlIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYWN0aXZlVGV4dElkID0gZmluZERpYWxvZ0J5TmFtZSh0aGlzLk5QQ1NjcmlwdCwgY3VycmVudFRleHQuYnV0dG9uc1swXS5nb1RvRGlhbG9nKVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFRleHQuYnV0dG9uc1swXS50cmlnZ2VyZWRBY3Rpb25zKSB7XG4gICAgICAgICAgICBjdXJyZW50VGV4dC5idXR0b25zWzBdLnRyaWdnZXJlZEFjdGlvbnMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlID09IENvbmZpcm1Nb2RlLkNhbmNlbCkge1xuICAgICAgICBpZiAoY3VycmVudFRleHQuYnV0dG9ucyAmJiBjdXJyZW50VGV4dC5idXR0b25zLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50VGV4dC5idXR0b25zWzFdLmdvVG9EaWFsb2cgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBkaWFsb2dEYXRhLmluZGV4ID0gY3VycmVudFRleHQuYnV0dG9uc1sxXS5nb1RvRGlhbG9nXG4gICAgICAgICAgfSBcblxuICAgICAgICAgIC8vVE9ET1xuICAgICAgICAgIC8vYWxsb3cgZGlhbG9ncyB0byBiZSBpbmRleCBieSBuYW1lXG4gICAgICAgIC8vICAgZWxzZSB7XG4gICAgICAgIC8vICAgICB0aGlzLmFjdGl2ZVRleHRJZCA9IGZpbmREaWFsb2dCeU5hbWUodGhpcy5OUENTY3JpcHQsIGN1cnJlbnRUZXh0LmJ1dHRvbnNbMF0uZ29Ub0RpYWxvZylcbiAgICAgICAgLy8gICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRUZXh0LmJ1dHRvbnNbMV0udHJpZ2dlcmVkQWN0aW9ucykge1xuICAgICAgICAgICAgY3VycmVudFRleHQuYnV0dG9uc1sxXS50cmlnZ2VyZWRBY3Rpb25zKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PSBDb25maXJtTW9kZS5CdXR0b24zKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGV4dC5idXR0b25zICYmIGN1cnJlbnRUZXh0LmJ1dHRvbnMubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnRUZXh0LmJ1dHRvbnNbMl0uZ29Ub0RpYWxvZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGRpYWxvZ0RhdGEuaW5kZXggPSBjdXJyZW50VGV4dC5idXR0b25zWzJdLmdvVG9EaWFsb2dcbiAgICAgICAgICB9IFxuXG4gICAgICAgICAgLy9UT0RPXG4gICAgICAgICAgLy9hbGxvdyBkaWFsb2dzIHRvIGJlIGluZGV4IGJ5IG5hbWVcbiAgICAgICAgLy8gICBlbHNlIHtcbiAgICAgICAgLy8gICAgIHRoaXMuYWN0aXZlVGV4dElkID0gZmluZERpYWxvZ0J5TmFtZSh0aGlzLk5QQ1NjcmlwdCwgY3VycmVudFRleHQuYnV0dG9uc1swXS5nb1RvRGlhbG9nKVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgICBpZiAoY3VycmVudFRleHQuYnV0dG9uc1syXS50cmlnZ2VyZWRBY3Rpb25zKSB7XG4gICAgICAgICAgICBjdXJyZW50VGV4dC5idXR0b25zWzJdLnRyaWdnZXJlZEFjdGlvbnMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2RlID09IENvbmZpcm1Nb2RlLkJ1dHRvbjQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRUZXh0LmJ1dHRvbnMgJiYgY3VycmVudFRleHQuYnV0dG9ucy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFRleHQuYnV0dG9uc1szXS5nb1RvRGlhbG9nID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZGlhbG9nRGF0YS5pbmRleCA9IGN1cnJlbnRUZXh0LmJ1dHRvbnNbM10uZ29Ub0RpYWxvZ1xuICAgICAgICAgIH0gXG5cbiAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAvL2FsbG93IGRpYWxvZ3MgdG8gYmUgaW5kZXggYnkgbmFtZVxuICAgICAgICAvLyAgIGVsc2Uge1xuICAgICAgICAvLyAgICAgdGhpcy5hY3RpdmVUZXh0SWQgPSBmaW5kRGlhbG9nQnlOYW1lKHRoaXMuTlBDU2NyaXB0LCBjdXJyZW50VGV4dC5idXR0b25zWzBdLmdvVG9EaWFsb2cpXG4gICAgICAgIC8vICAgfVxuICAgICAgICAgIGlmIChjdXJyZW50VGV4dC5idXR0b25zWzNdLnRyaWdnZXJlZEFjdGlvbnMpIHtcbiAgICAgICAgICAgIGN1cnJlbnRUZXh0LmJ1dHRvbnNbM10udHJpZ2dlcmVkQWN0aW9ucygpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBiZWdpblR5cGluZyhucGMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBza2lwRGlhbG9ncyhucGM6RW50aXR5KSB7XG4gIGxldCBkaWFsb2dEYXRhID0gbnBjRGlhbG9nQ29tcG9uZW50LmdldChucGMpXG4gIGlmICghZGlhbG9nRGF0YS52aXNpYmxlIHx8ICtEYXRlLm5vdygpIC0gZGlhbG9nRGF0YS5vcGVuVGltZSA8IDEwMCkgcmV0dXJuXG5cbiAgd2hpbGUgKFxuICAgIGRpYWxvZ0RhdGEuc2NyaXB0W2RpYWxvZ0RhdGEuaW5kZXhdICYmXG4gICAgICBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XS5za2lwYWJsZSAmJlxuICAgICAgICBkaWFsb2dEYXRhLnNjcmlwdFtkaWFsb2dEYXRhLmluZGV4XS5pc1F1ZXN0aW9uXG4gICl7XG4gICAgaWYoZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0udHJpZ2dlcmVkQnlOZXh0KXtcbiAgICAgIGRpYWxvZ0RhdGEuc2NyaXB0W2RpYWxvZ0RhdGEuaW5kZXhdLnRyaWdnZXJlZEJ5TmV4dCgpXG4gICAgfVxuXG4gICAgaWYoZGlhbG9nRGF0YS5zY3JpcHRbZGlhbG9nRGF0YS5pbmRleF0uc2tpcGFibGUgJiZcbiAgICAgIGRpYWxvZ0RhdGEuc2NyaXB0W2RpYWxvZ0RhdGEuaW5kZXhdLmlzRW5kT2ZEaWFsb2dcbiAgICAgICl7XG4gICAgICAgIGNsb3NlRGlhbG9nV2luZG93KG5wYylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgXG4gICAgICBkaWFsb2dEYXRhLmluZGV4ICs9IDFcbiAgfVxuICBjb25maXJtVGV4dChucGMsIENvbmZpcm1Nb2RlLk5leHQpXG59XG5cbmV4cG9ydCB0eXBlIEltYWdlQXRsYXNEYXRhID0ge1xuICAgIGF0bGFzV2lkdGg6IG51bWJlcjtcbiAgICBhdGxhc0hlaWdodDogbnVtYmVyO1xuICAgIHNvdXJjZVdpZHRoOiBudW1iZXI7XG4gICAgc291cmNlSGVpZ2h0OiBudW1iZXI7XG4gICAgc291cmNlTGVmdDogbnVtYmVyO1xuICAgIHNvdXJjZVRvcDogbnVtYmVyO1xuICB9XG4gIFxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1hZ2VBdGxhc01hcHBpbmcoZGF0YT86IEltYWdlQXRsYXNEYXRhKTogbnVtYmVyW10ge1xuICAgIGlmICghZGF0YSkgcmV0dXJuIFtdXG4gIFxuICAgIGNvbnN0IHtcbiAgICAgIGF0bGFzV2lkdGgsXG4gICAgICBhdGxhc0hlaWdodCxcbiAgICAgIHNvdXJjZVdpZHRoLFxuICAgICAgc291cmNlSGVpZ2h0LFxuICAgICAgc291cmNlVG9wLFxuICAgICAgc291cmNlTGVmdCxcbiAgICB9ID0gZGF0YVxuICBcbiAgICByZXR1cm4gW1xuICAgICAgc291cmNlTGVmdCAvIGF0bGFzV2lkdGgsIChhdGxhc0hlaWdodCAtIHNvdXJjZVRvcCAtIHNvdXJjZUhlaWdodCkgLyBhdGxhc0hlaWdodCxcbiAgICAgIHNvdXJjZUxlZnQgLyBhdGxhc1dpZHRoLCAoYXRsYXNIZWlnaHQgLSBzb3VyY2VUb3ApIC8gYXRsYXNIZWlnaHQsXG4gICAgICAoc291cmNlTGVmdCArIHNvdXJjZVdpZHRoKSAvIGF0bGFzV2lkdGgsIChhdGxhc0hlaWdodCAtIHNvdXJjZVRvcCkgLyBhdGxhc0hlaWdodCxcbiAgICAgIChzb3VyY2VMZWZ0ICsgc291cmNlV2lkdGgpIC8gYXRsYXNXaWR0aCwgKGF0bGFzSGVpZ2h0IC0gc291cmNlVG9wIC0gc291cmNlSGVpZ2h0KSAvIGF0bGFzSGVpZ2h0LFxuICAgIF1cbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiByZWFsV2lkdGgod2lkdGg/Om51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHdpZHRoID8gd2lkdGggOiBzZWN0aW9uLnNvdXJjZVdpZHRoXG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVhbEhlaWdodChoZWlnaHQ/Om51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGhlaWdodCA/IGhlaWdodCA6IHNlY3Rpb24uc291cmNlSGVpZ2h0XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZmluZERpYWxvZ0J5TmFtZShkaWFsb2dzOiBEaWFsb2dbXSwgbmFtZTogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZGlhbG9nc1tpXS5uYW1lICYmIGRpYWxvZ3NbaV0ubmFtZSA9PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZVRhZyhkaWFsb2dEYXRhOmFueSwgbmV3Q2hhcnM6IG51bWJlcil7XG4gIGlmKGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzID09IDAgfHwgbmV3Q2hhcnMgPT0wICkgcmV0dXJuXG5cbmxldCBvcGVuVGFnOiBib29sZWFuID0gZmFsc2VcbmxldCBjbG9zZVRhZyA6IGJvb2xlYW4gPSBmYWxzZVxuZm9yKGxldCBpID0gZGlhbG9nRGF0YS52aXNpYmxlQ2hhcnMtbmV3Q2hhcnM7IGkgPCBkaWFsb2dEYXRhLnZpc2libGVDaGFycyA7IGkrKyl7XG4gIFxuICBpZighb3BlblRhZyl7XG4gICAgaWYoZGlhbG9nRGF0YS5mdWxsVGV4dC5zdWJzdHIoaSwgMSkgPT0gJzwnKXtcbiAgICAgIG9wZW5UYWc9IHRydWVcbiAgICAgIFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZihkaWFsb2dEYXRhLmZ1bGxUZXh0LnN1YnN0cihpLCAxKSA9PSAnPicpe1xuICAgICAgY2xvc2VUYWc9IHRydWVcbiAgICAgIFxuICAgIH1cbiAgfVxufVxuXG5pZighb3BlblRhZyB8fCBjbG9zZVRhZyl7XHRcbiAgcmV0dXJuXG59XG5cbndoaWxlKGRpYWxvZ0RhdGEudmlzaWJsZUNoYXJzIDwgZGlhbG9nRGF0YS5mdWxsVGV4dC5sZW5ndGggJiYgZGlhbG9nRGF0YS5mdWxsVGV4dC5zdWJzdHIoZGlhbG9nRGF0YS52aXNpYmxlQ2hhcnMtMSwgMSkgIT0gJz4nKXtcbiAgZGlhbG9nRGF0YS52aXNpYmxlQ2hhcnMrPTFcbn1cbnJldHVyblxufVxuIl19