Skip to content

Instantly share code, notes, and snippets.

@jiyee
Created April 8, 2023 14:51
Show Gist options
  • Save jiyee/cae237dd31300a5bec797dcd6e5f51c2 to your computer and use it in GitHub Desktop.
Save jiyee/cae237dd31300a5bec797dcd6e5f51c2 to your computer and use it in GitHub Desktop.
/*
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 child_process = require('child_process');
var util = require('util');
/******************************************************************************
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 = {
fcitxRemotePath_macOS: '/usr/local/bin/fcitx-remote',
fcitxRemotePath_windows: 'C:\\Program Files\\bin\\fcitx-remote',
fcitxRemotePath_linux: '/usr/bin/fcitx-remote',
IMSwitch_when_insert_mode: true,
IMSwitch_developer_logging: false,
};
const pexec = util.promisify(child_process.exec);
var IMStatus;
(function (IMStatus) {
IMStatus["Unknown"] = "Unknown";
IMStatus["Active"] = "Active";
IMStatus["Inactive"] = "Inactive";
})(IMStatus || (IMStatus = {}));
class VimIMSwitchPlugin extends obsidian.Plugin {
constructor() {
super(...arguments);
this.imStatus = IMStatus.Unknown;
this.fcitxRemotePath = "";
this.editorMode = null;
this.initialized = false;
this.cmEditor = null;
this.focusedScope = new obsidian.Scope();
this.onVimModeChange = (cm) => __awaiter(this, void 0, void 0, function* () {
// this.debug_log("Vim Input Method Switch: Vim mode change to : " + cm.mode);
if (cm.mode == "normal" || cm.mode == "visual") {
yield this.getFcitxRemoteStatus();
if (this.imStatus == IMStatus.Active) {
yield this.deactivateIM();
}
}
else if (cm.mode == "insert" || cm.mode == "replace") {
if (this.imStatus == IMStatus.Inactive && this.settings.IMSwitch_when_insert_mode == true) {
yield this.activateIM();
}
}
});
}
debug_log(content) {
var _a;
if ((_a = this.settings) === null || _a === void 0 ? void 0 : _a.IMSwitch_developer_logging) {
console.log(content);
}
}
onload() {
return __awaiter(this, void 0, void 0, function* () {
console.log('Vim Input Method Switch: loading plugin');
yield this.loadSettings();
// this.addStatusBarItem().setText('Vim IM Switch Enabled');
this.addSettingTab(new IMSwitchSettingTab(this.app, this));
this.app.workspace.on('quit', () => __awaiter(this, void 0, void 0, function* () {
yield this.deactivateIM();
}));
this.app.workspace.on('file-open', (file) => __awaiter(this, void 0, void 0, function* () {
this.debug_log("Vim Input Method Switch: file-open");
if (!this.initialized && file)
yield this.initialize();
// {mode: string, ?subMode: string} object. Modes: "insert", "normal", "replace", "visual". Visual sub-modes: "linewise", "blockwise"}
if (this.cmEditor) {
// default is normal mode, try to deactivate the IM.
yield this.deactivateIM();
if (this.imStatus == IMStatus.Unknown) {
yield this.getFcitxRemoteStatus();
}
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
this.cmEditor.on("vim-mode-change", this.onVimModeChange);
}
}));
// Used when we open a new markdown view by "split vertically",
// which will not trigger 'file-open' event on obsidian v0.15.6
this.app.workspace.on('active-leaf-change', (leaf) => __awaiter(this, void 0, void 0, function* () {
this.debug_log("Vim Input Method Switch: active-leaf-change");
if (this.app.workspace.activeLeaf.view.getViewType() == "markdown") {
this.debug_log("Vim Input Method Switch: focus on markdown view");
if (!this.initialized)
yield this.initialize();
// {mode: string, ?subMode: string} object. Modes: "insert", "normal", "replace", "visual". Visual sub-modes: "linewise", "blockwise"}
if (this.cmEditor) {
// default is normal mode, try to deactivate the IM.
yield this.deactivateIM();
if (this.imStatus == IMStatus.Unknown) {
yield this.getFcitxRemoteStatus();
}
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
this.cmEditor.on("vim-mode-change", this.onVimModeChange);
}
}
}));
});
}
initialize() {
var _a, _b, _c, _d;
return __awaiter(this, void 0, void 0, function* () {
if (this.initialized) {
return;
}
this.debug_log("Vim Input Method Switch: initializing");
// Determine if we have the legacy Obsidian editor (CM5) or the new one (CM6).
// This is only available after Obsidian is fully loaded, so we do it as part of the `file-open` event.
if ('editor:toggle-source' in this.app.commands.editorCommands) {
this.editorMode = 'cm6';
this.debug_log('Vim Input Method Switch: using CodeMirror 6 mode');
}
else {
this.editorMode = 'cm5';
this.debug_log('Vim Input Method Switch: using CodeMirror 5 mode');
}
// For CM6 this actually returns an instance of the object named CodeMirror from cm_adapter of codemirror_vim
const view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
if (this.editorMode == 'cm6') {
this.cmEditor = (_c = (_b = (_a = view.sourceMode) === null || _a === void 0 ? void 0 : _a.cmEditor) === null || _b === void 0 ? void 0 : _b.cm) === null || _c === void 0 ? void 0 : _c.cm;
}
else {
this.cmEditor = (_d = view.sourceMode) === null || _d === void 0 ? void 0 : _d.cmEditor;
}
});
}
runCmd(cmd, args = []) {
return __awaiter(this, void 0, void 0, function* () {
const output = yield pexec(`${cmd} ${args.join(" ")}`);
return output.stdout || output.stderr;
});
}
getFcitxRemoteStatus() {
return __awaiter(this, void 0, void 0, function* () {
if (this.fcitxRemotePath == "") {
this.debug_log("Vim Input Method Switch: cannot get fcitx-remote path, please set it correctly.");
return;
}
let fcitxRemoteOutput = yield this.runCmd(this.fcitxRemotePath);
fcitxRemoteOutput = fcitxRemoteOutput.trimRight();
if (fcitxRemoteOutput == "1") {
this.imStatus = IMStatus.Inactive;
}
else if (fcitxRemoteOutput == "2") {
this.imStatus = IMStatus.Active;
}
else {
this.imStatus = IMStatus.Unknown;
}
this.debug_log("Vim Input Method Switch: input method status: " + this.imStatus.toString());
});
}
activateIM() {
return __awaiter(this, void 0, void 0, function* () {
if (this.fcitxRemotePath == "") {
this.debug_log("Vim Input Method Switch: cannot get fcitx-remote path, please set it correctly.");
return;
}
const output = yield this.runCmd(this.fcitxRemotePath, ["-o"]);
this.debug_log("Vim Input Method Switch: activate input method: " + output);
if (/Changing to/gi.test(output)) { // https://github.com/xcodebuild/fcitx-remote-for-osx/blob/master/fcitx-remote/main.m#L95
this.imStatus = IMStatus.Inactive;
this.debug_log("Vim Input Method Switch: input method status: " + this.imStatus.toString());
}
});
}
deactivateIM() {
return __awaiter(this, void 0, void 0, function* () {
if (this.fcitxRemotePath == "") {
this.debug_log("Vim Input Method Switch: cannot get fcitx-remote path, please set it correctly.");
return;
}
const output = yield this.runCmd(this.fcitxRemotePath, ["-c"]);
this.debug_log("Vim Input Method Switch: deactivate input method: " + output);
if (/Changing to/gi.test(output)) { // https://github.com/xcodebuild/fcitx-remote-for-osx/blob/master/fcitx-remote/main.m#L95
this.imStatus = IMStatus.Inactive;
this.debug_log("Vim Input Method Switch: input method status: " + this.imStatus.toString());
}
});
}
onunload() {
if (this.cmEditor) {
this.cmEditor.off("vim-mode-change", this.onVimModeChange);
}
this.debug_log('Vim Input Method Switch: unloading plugin');
}
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
this.updateCurrentPath();
});
}
updateCurrentPath() {
return __awaiter(this, void 0, void 0, function* () {
switch (process.platform) {
case 'darwin':
this.fcitxRemotePath = this.settings.fcitxRemotePath_macOS;
break;
case 'linux':
this.fcitxRemotePath = this.settings.fcitxRemotePath_linux;
break;
case 'win32':
this.fcitxRemotePath = this.settings.fcitxRemotePath_windows;
break;
default:
console.log('Vim Input Method Switch: does not support ' + process.platform + ' currently.');
break;
}
});
}
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
});
}
}
VimIMSwitchPlugin.modifiers = ["Meta"];
class IMSwitchSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
containerEl.createEl('h2', { text: 'Settings for Vim IM Switch plugin.' });
new obsidian.Setting(containerEl)
.setName('Fcitx Remote Path for macOS')
.setDesc('The absolute path to fcitx-remote bin file on macOS.')
.addText(text => text
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_macOS)
.setValue(this.plugin.settings.fcitxRemotePath_macOS)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.fcitxRemotePath_macOS = value;
this.plugin.updateCurrentPath();
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Fcitx Remote Path for Linux')
.setDesc('The absolute path to fcitx-remote bin file on Linux.')
.addText(text => text
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_linux)
.setValue(this.plugin.settings.fcitxRemotePath_linux)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.fcitxRemotePath_linux = value;
this.plugin.updateCurrentPath();
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Fcitx Remote Path for Windows')
.setDesc('The absolute path to fcitx-remote bin file on Windows.')
.addText(text => text
.setPlaceholder(DEFAULT_SETTINGS.fcitxRemotePath_windows)
.setValue(this.plugin.settings.fcitxRemotePath_windows)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.fcitxRemotePath_windows = value;
this.plugin.updateCurrentPath();
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Auto switch input method when entering insert or replace mode')
.addToggle(toggle => toggle.setValue(this.plugin.settings.IMSwitch_when_insert_mode)
.onChange((value) => {
this.plugin.settings.IMSwitch_when_insert_mode = value;
this.plugin.updateCurrentPath();
this.plugin.saveSettings();
}));
new obsidian.Setting(containerEl)
.setName('Toggle developer logging')
.addToggle(toggle => toggle.setValue(this.plugin.settings.IMSwitch_developer_logging)
.onChange((value) => {
this.plugin.settings.IMSwitch_developer_logging = value;
this.plugin.updateCurrentPath();
this.plugin.saveSettings();
}));
}
}
module.exports = VimIMSwitchPlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcclxuICAgIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XHJcbn1cclxuIiwiaW1wb3J0IHsgQXBwLCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFdvcmtzcGFjZSwgTWFya2Rvd25WaWV3LCBURmlsZSwgV29ya3NwYWNlTGVhZiwgU2NvcGUsIHR5cGUgTW9kaWZpZXIsIEtleW1hcENvbnRleHQgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xyXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tIFwidXRpbFwiO1xyXG5pbXBvcnQgKiBhcyBDb2RlTWlycm9yIGZyb20gJ2NvZGVtaXJyb3InO1xyXG5cclxuaW50ZXJmYWNlIFZpbUlNU3dpdGNoU2V0dGluZ3Mge1xyXG5cdGZjaXR4UmVtb3RlUGF0aF9tYWNPUzogc3RyaW5nO1xyXG5cdGZjaXR4UmVtb3RlUGF0aF93aW5kb3dzOiBzdHJpbmc7XHJcblx0ZmNpdHhSZW1vdGVQYXRoX2xpbnV4OiBzdHJpbmc7XHJcblx0SU1Td2l0Y2hfd2hlbl9pbnNlcnRfbW9kZTogYm9vbGVhbjtcclxuXHRJTVN3aXRjaF9kZXZlbG9wZXJfbG9nZ2luZzogYm9vbGVhbjtcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogVmltSU1Td2l0Y2hTZXR0aW5ncyA9IHtcclxuXHRmY2l0eFJlbW90ZVBhdGhfbWFjT1M6ICcvdXNyL2xvY2FsL2Jpbi9mY2l0eC1yZW1vdGUnLFxyXG5cdGZjaXR4UmVtb3RlUGF0aF93aW5kb3dzOiAnQzpcXFxcUHJvZ3JhbSBGaWxlc1xcXFxiaW5cXFxcZmNpdHgtcmVtb3RlJyxcclxuXHRmY2l0eFJlbW90ZVBhdGhfbGludXg6ICcvdXNyL2Jpbi9mY2l0eC1yZW1vdGUnLFxyXG5cdElNU3dpdGNoX3doZW5faW5zZXJ0X21vZGU6IHRydWUsXHJcblx0SU1Td2l0Y2hfZGV2ZWxvcGVyX2xvZ2dpbmc6IGZhbHNlLFxyXG59XHJcblxyXG5jb25zdCBwZXhlYyA9IHByb21pc2lmeShleGVjKTtcclxuXHJcbmVudW0gSU1TdGF0dXMge1xyXG5cdFVua25vd24gPSBcIlVua25vd25cIixcclxuXHRBY3RpdmUgPSBcIkFjdGl2ZVwiLFxyXG5cdEluYWN0aXZlID0gXCJJbmFjdGl2ZVwiLFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaW1JTVN3aXRjaFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFZpbUlNU3dpdGNoU2V0dGluZ3M7XHJcblx0aW1TdGF0dXMgPSBJTVN0YXR1cy5Vbmtub3duO1xyXG5cdGZjaXR4UmVtb3RlUGF0aCA9IFwiXCI7XHJcblxyXG5cdHByaXZhdGUgZWRpdG9yTW9kZTogJ2NtNScgfCAnY202JyA9IG51bGw7XHJcblx0cHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cdHByaXZhdGUgY21FZGl0b3I6IENvZGVNaXJyb3IuRWRpdG9yID0gbnVsbDtcclxuXHJcbiAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IE1vZGlmaWVyW10gPSBbXCJNZXRhXCJdXHJcblxyXG4gIHByb3RlY3RlZCByZWFkb25seSBmb2N1c2VkU2NvcGUgPSBuZXcgU2NvcGUoKVxyXG5cclxuXHRkZWJ1Z19sb2coY29udGVudDogYW55KSB7XHJcblx0XHRpZiAodGhpcy5zZXR0aW5ncz8uSU1Td2l0Y2hfZGV2ZWxvcGVyX2xvZ2dpbmcpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coY29udGVudCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRjb25zb2xlLmxvZygnVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGxvYWRpbmcgcGx1Z2luJyk7XHJcblxyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHQvLyB0aGlzLmFkZFN0YXR1c0Jhckl0ZW0oKS5zZXRUZXh0KCdWaW0gSU0gU3dpdGNoIEVuYWJsZWQnKTtcclxuXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IElNU3dpdGNoU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xyXG5cclxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbigncXVpdCcsIGFzeW5jICgpID0+IHtcclxuXHRcdFx0YXdhaXQgdGhpcy5kZWFjdGl2YXRlSU0oKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgYXN5bmMgKGZpbGU6IFRGaWxlKSA9PiB7XHJcblx0XHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGZpbGUtb3BlblwiKVxyXG5cdFx0XHRpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgJiYgZmlsZSlcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcclxuXHRcdFx0XHQvLyB7bW9kZTogc3RyaW5nLCA/c3ViTW9kZTogc3RyaW5nfSBvYmplY3QuIE1vZGVzOiBcImluc2VydFwiLCBcIm5vcm1hbFwiLCBcInJlcGxhY2VcIiwgXCJ2aXN1YWxcIi4gVmlzdWFsIHN1Yi1tb2RlczogXCJsaW5ld2lzZVwiLCBcImJsb2Nrd2lzZVwifVxyXG5cdFx0XHRcdGlmICh0aGlzLmNtRWRpdG9yKSB7XHJcblx0XHRcdFx0XHQvLyBkZWZhdWx0IGlzIG5vcm1hbCBtb2RlLCB0cnkgdG8gZGVhY3RpdmF0ZSB0aGUgSU0uXHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRlYWN0aXZhdGVJTSgpO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuaW1TdGF0dXMgPT0gSU1TdGF0dXMuVW5rbm93bikge1xyXG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEZjaXR4UmVtb3RlU3RhdHVzKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLmNtRWRpdG9yLm9mZihcInZpbS1tb2RlLWNoYW5nZVwiLCB0aGlzLm9uVmltTW9kZUNoYW5nZSk7XHJcblx0XHRcdFx0XHR0aGlzLmNtRWRpdG9yLm9uKFwidmltLW1vZGUtY2hhbmdlXCIsIHRoaXMub25WaW1Nb2RlQ2hhbmdlKTtcclxuXHRcdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBVc2VkIHdoZW4gd2Ugb3BlbiBhIG5ldyBtYXJrZG93biB2aWV3IGJ5IFwic3BsaXQgdmVydGljYWxseVwiLFxyXG5cdFx0Ly8gd2hpY2ggd2lsbCBub3QgdHJpZ2dlciAnZmlsZS1vcGVuJyBldmVudCBvbiBvYnNpZGlhbiB2MC4xNS42XHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIGFzeW5jIChsZWFmOiBXb3Jrc3BhY2VMZWFmKSA9PiB7XHJcblx0XHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGFjdGl2ZS1sZWFmLWNoYW5nZVwiKVxyXG5cdFx0XHRpZih0aGlzLmFwcC53b3Jrc3BhY2UuYWN0aXZlTGVhZi52aWV3LmdldFZpZXdUeXBlKCkgPT0gXCJtYXJrZG93blwiKSB7XHJcblx0XHRcdFx0dGhpcy5kZWJ1Z19sb2coXCJWaW0gSW5wdXQgTWV0aG9kIFN3aXRjaDogZm9jdXMgb24gbWFya2Rvd24gdmlld1wiKVxyXG5cdFx0XHRcdGlmICghdGhpcy5pbml0aWFsaXplZClcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG5cdFx0XHRcdC8vIHttb2RlOiBzdHJpbmcsID9zdWJNb2RlOiBzdHJpbmd9IG9iamVjdC4gTW9kZXM6IFwiaW5zZXJ0XCIsIFwibm9ybWFsXCIsIFwicmVwbGFjZVwiLCBcInZpc3VhbFwiLiBWaXN1YWwgc3ViLW1vZGVzOiBcImxpbmV3aXNlXCIsIFwiYmxvY2t3aXNlXCJ9XHJcblx0XHRcdFx0aWYgKHRoaXMuY21FZGl0b3IpIHtcclxuXHRcdFx0XHRcdC8vIGRlZmF1bHQgaXMgbm9ybWFsIG1vZGUsIHRyeSB0byBkZWFjdGl2YXRlIHRoZSBJTS5cclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGVhY3RpdmF0ZUlNKCk7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5pbVN0YXR1cyA9PSBJTVN0YXR1cy5Vbmtub3duKSB7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0RmNpdHhSZW1vdGVTdGF0dXMoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHRoaXMuY21FZGl0b3Iub2ZmKFwidmltLW1vZGUtY2hhbmdlXCIsIHRoaXMub25WaW1Nb2RlQ2hhbmdlKTtcclxuXHRcdFx0XHRcdHRoaXMuY21FZGl0b3Iub24oXCJ2aW0tbW9kZS1jaGFuZ2VcIiwgdGhpcy5vblZpbU1vZGVDaGFuZ2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBpbml0aWFsaXplKCkge1xyXG5cdFx0aWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGluaXRpYWxpemluZ1wiKVxyXG5cclxuXHRcdC8vIERldGVybWluZSBpZiB3ZSBoYXZlIHRoZSBsZWdhY3kgT2JzaWRpYW4gZWRpdG9yIChDTTUpIG9yIHRoZSBuZXcgb25lIChDTTYpLlxyXG5cdFx0Ly8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciBPYnNpZGlhbiBpcyBmdWxseSBsb2FkZWQsIHNvIHdlIGRvIGl0IGFzIHBhcnQgb2YgdGhlIGBmaWxlLW9wZW5gIGV2ZW50LlxyXG5cdFx0aWYgKCdlZGl0b3I6dG9nZ2xlLXNvdXJjZScgaW4gKHRoaXMuYXBwIGFzIGFueSkuY29tbWFuZHMuZWRpdG9yQ29tbWFuZHMpIHtcclxuXHRcdFx0dGhpcy5lZGl0b3JNb2RlID0gJ2NtNic7XHJcblx0XHRcdHRoaXMuZGVidWdfbG9nKCdWaW0gSW5wdXQgTWV0aG9kIFN3aXRjaDogdXNpbmcgQ29kZU1pcnJvciA2IG1vZGUnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZWRpdG9yTW9kZSA9ICdjbTUnO1xyXG5cdFx0XHR0aGlzLmRlYnVnX2xvZygnVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IHVzaW5nIENvZGVNaXJyb3IgNSBtb2RlJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRm9yIENNNiB0aGlzIGFjdHVhbGx5IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIG9iamVjdCBuYW1lZCBDb2RlTWlycm9yIGZyb20gY21fYWRhcHRlciBvZiBjb2RlbWlycm9yX3ZpbVxyXG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblx0XHRpZiAodGhpcy5lZGl0b3JNb2RlID09ICdjbTYnKSB7XHJcblx0XHRcdHRoaXMuY21FZGl0b3IgPSAodmlldyBhcyBhbnkpLnNvdXJjZU1vZGU/LmNtRWRpdG9yPy5jbT8uY207XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmNtRWRpdG9yID0gKHZpZXcgYXMgYW55KS5zb3VyY2VNb2RlPy5jbUVkaXRvcjtcclxuXHRcdH1cclxuXHJcbiAgICAvLyB0aGlzLnJlZ2lzdGVyU2NvcGVFdmVudChcclxuICAgIC8vICAgdGhpcy5hcHAuc2NvcGUucmVnaXN0ZXIoXHJcbiAgICAvLyAgICAgW10sXHJcbiAgICAvLyAgICAgXCJqXCIsXHJcbiAgICAvLyAgICAgKGV2dDogS2V5Ym9hcmRFdmVudCwgY3R4OiBLZXltYXBDb250ZXh0KSA9PiB7XHJcbiAgICAvLyAgICAgICBpZiAodGhpcy5jbUVkaXRvci5nZXRPcHRpb24oXCJrZXlNYXBcIikgPT0gXCJ2aW1cIikge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmdldEZjaXR4UmVtb3RlU3RhdHVzKCk7XHJcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLmltU3RhdHVzID09IElNU3RhdHVzLkFjdGl2ZSkge1xyXG4gICAgLy8gICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcInByZXNzIGogaW4gdmltIG1vZGVcIik7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgKVxyXG4gICAgLy8gKTtcclxuXHJcblx0XHQvLyBvbiBPYnNpZGlhbiB2MC4xNS42LCB3ZSBjYW4ndCByZXVzZSBjbUVkaXRvciBnb3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhcHBsaWNhdGlvblxyXG5cdFx0Ly8gd2UgbmVlZCB0byBnZXQgY21FZGl0b3IgYWdhaW4gZm9yIGV2ZXJ5ICdmaWxlLW9wZW4nXHJcblx0XHQvLyBhbmQgZXZlcnkgJ3NwbGl0IHZlcnRpY2FsbHknIGFuZCBldmVyeSAnc3BsaXQgaG9yaXpvbnRhbGx5J1xyXG5cdFx0Ly8gdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcblx0fVxyXG5cclxuXHRvblZpbU1vZGVDaGFuZ2UgPSBhc3luYyAoY206IGFueSkgPT4ge1xyXG5cdFx0Ly8gdGhpcy5kZWJ1Z19sb2coXCJWaW0gSW5wdXQgTWV0aG9kIFN3aXRjaDogVmltIG1vZGUgY2hhbmdlIHRvIDogXCIgKyBjbS5tb2RlKTtcclxuXHJcblx0XHRpZiAoY20ubW9kZSA9PSBcIm5vcm1hbFwiIHx8IGNtLm1vZGUgPT0gXCJ2aXN1YWxcIikge1xyXG5cdFx0XHRhd2FpdCB0aGlzLmdldEZjaXR4UmVtb3RlU3RhdHVzKCk7XHJcblx0XHRcdGlmICh0aGlzLmltU3RhdHVzID09IElNU3RhdHVzLkFjdGl2ZSkge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMuZGVhY3RpdmF0ZUlNKCk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoY20ubW9kZSA9PSBcImluc2VydFwiIHx8IGNtLm1vZGUgPT0gXCJyZXBsYWNlXCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuaW1TdGF0dXMgPT0gSU1TdGF0dXMuSW5hY3RpdmUgJiYgdGhpcy5zZXR0aW5ncy5JTVN3aXRjaF93aGVuX2luc2VydF9tb2RlID09IHRydWUpIHtcclxuXHRcdFx0XHRhd2FpdCB0aGlzLmFjdGl2YXRlSU0oKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgcnVuQ21kKGNtZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSA9IFtdKSA6IFByb21pc2U8c3RyaW5nPiB7XHJcblx0XHRjb25zdCBvdXRwdXQgPSBhd2FpdCBwZXhlYyhgJHtjbWR9ICR7YXJncy5qb2luKFwiIFwiKX1gKTtcclxuXHRcdHJldHVybiBvdXRwdXQuc3Rkb3V0IHx8IG91dHB1dC5zdGRlcnI7XHJcblx0fVxyXG5cclxuXHRhc3luYyBnZXRGY2l0eFJlbW90ZVN0YXR1cygpIHtcclxuXHRcdGlmICh0aGlzLmZjaXR4UmVtb3RlUGF0aCA9PSBcIlwiKSB7XHJcblx0XHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGNhbm5vdCBnZXQgZmNpdHgtcmVtb3RlIHBhdGgsIHBsZWFzZSBzZXQgaXQgY29ycmVjdGx5LlwiKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0bGV0IGZjaXR4UmVtb3RlT3V0cHV0ID0gYXdhaXQgdGhpcy5ydW5DbWQodGhpcy5mY2l0eFJlbW90ZVBhdGgpO1xyXG5cdFx0ZmNpdHhSZW1vdGVPdXRwdXQgPSBmY2l0eFJlbW90ZU91dHB1dC50cmltUmlnaHQoKTtcclxuXHRcdGlmIChmY2l0eFJlbW90ZU91dHB1dCA9PSBcIjFcIikge1xyXG5cdFx0XHR0aGlzLmltU3RhdHVzID0gSU1TdGF0dXMuSW5hY3RpdmU7XHJcblx0XHR9IGVsc2UgaWYgKGZjaXR4UmVtb3RlT3V0cHV0ID09IFwiMlwiKSB7XHJcblx0XHRcdHRoaXMuaW1TdGF0dXMgPSBJTVN0YXR1cy5BY3RpdmU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmltU3RhdHVzID0gSU1TdGF0dXMuVW5rbm93bjtcclxuXHRcdH1cclxuXHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGlucHV0IG1ldGhvZCBzdGF0dXM6IFwiICsgdGhpcy5pbVN0YXR1cy50b1N0cmluZygpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGFjdGl2YXRlSU0oKSB7XHJcblx0XHRpZiAodGhpcy5mY2l0eFJlbW90ZVBhdGggPT0gXCJcIikge1xyXG5cdFx0XHR0aGlzLmRlYnVnX2xvZyhcIlZpbSBJbnB1dCBNZXRob2QgU3dpdGNoOiBjYW5ub3QgZ2V0IGZjaXR4LXJlbW90ZSBwYXRoLCBwbGVhc2Ugc2V0IGl0IGNvcnJlY3RseS5cIik7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMucnVuQ21kKHRoaXMuZmNpdHhSZW1vdGVQYXRoLCBbXCItb1wiXSk7XHJcblx0XHR0aGlzLmRlYnVnX2xvZyhcIlZpbSBJbnB1dCBNZXRob2QgU3dpdGNoOiBhY3RpdmF0ZSBpbnB1dCBtZXRob2Q6IFwiICsgb3V0cHV0KTtcclxuXHJcblx0XHRpZiAoL0NoYW5naW5nIHRvL2dpLnRlc3Qob3V0cHV0KSkgeyAvLyBodHRwczovL2dpdGh1Yi5jb20veGNvZGVidWlsZC9mY2l0eC1yZW1vdGUtZm9yLW9zeC9ibG9iL21hc3Rlci9mY2l0eC1yZW1vdGUvbWFpbi5tI0w5NVxyXG5cdFx0XHR0aGlzLmltU3RhdHVzID0gSU1TdGF0dXMuSW5hY3RpdmU7XHJcblx0XHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGlucHV0IG1ldGhvZCBzdGF0dXM6IFwiICsgdGhpcy5pbVN0YXR1cy50b1N0cmluZygpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIGRlYWN0aXZhdGVJTSgpIHtcclxuXHRcdGlmICh0aGlzLmZjaXR4UmVtb3RlUGF0aCA9PSBcIlwiKSB7XHJcblx0XHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGNhbm5vdCBnZXQgZmNpdHgtcmVtb3RlIHBhdGgsIHBsZWFzZSBzZXQgaXQgY29ycmVjdGx5LlwiKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5ydW5DbWQodGhpcy5mY2l0eFJlbW90ZVBhdGgsIFtcIi1jXCJdKTtcclxuXHRcdHRoaXMuZGVidWdfbG9nKFwiVmltIElucHV0IE1ldGhvZCBTd2l0Y2g6IGRlYWN0aXZhdGUgaW5wdXQgbWV0aG9kOiBcIiArIG91dHB1dCk7XHJcblxyXG5cdFx0aWYgKC9DaGFuZ2luZyB0by9naS50ZXN0KG91dHB1dCkpIHsgLy8gaHR0cHM6Ly9naXRodWIuY29tL3hjb2RlYnVpbGQvZmNpdHgtcmVtb3RlLWZvci1vc3gvYmxvYi9tYXN0ZXIvZmNpdHgtcmVtb3RlL21haW4ubSNMOTVcclxuXHRcdFx0dGhpcy5pbVN0YXR1cyA9IElNU3RhdHVzLkluYWN0aXZlO1xyXG5cdFx0XHR0aGlzLmRlYnVnX2xvZyhcIlZpbSBJbnB1dCBNZXRob2QgU3dpdGNoOiBpbnB1dCBtZXRob2Qgc3RhdHVzOiBcIiArIHRoaXMuaW1TdGF0dXMudG9TdHJpbmcoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRvbnVubG9hZCgpIHtcclxuXHRcdGlmICh0aGlzLmNtRWRpdG9yKSB7XHJcblx0XHRcdHRoaXMuY21FZGl0b3Iub2ZmKFwidmltLW1vZGUtY2hhbmdlXCIsIHRoaXMub25WaW1Nb2RlQ2hhbmdlKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuZGVidWdfbG9nKCdWaW0gSW5wdXQgTWV0aG9kIFN3aXRjaDogdW5sb2FkaW5nIHBsdWdpbicpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0XHR0aGlzLnVwZGF0ZUN1cnJlbnRQYXRoKCk7XHJcblx0fVxyXG5cclxuXHRhc3luYyB1cGRhdGVDdXJyZW50UGF0aCgpIHtcclxuXHRcdHN3aXRjaCAocHJvY2Vzcy5wbGF0Zm9ybSkge1xyXG5cdFx0XHRjYXNlICdkYXJ3aW4nOlxyXG5cdFx0XHRcdHRoaXMuZmNpdHhSZW1vdGVQYXRoID0gdGhpcy5zZXR0aW5ncy5mY2l0eFJlbW90ZVBhdGhfbWFjT1M7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2xpbnV4JzpcclxuXHRcdFx0XHR0aGlzLmZjaXR4UmVtb3RlUGF0aCA9IHRoaXMuc2V0dGluZ3MuZmNpdHhSZW1vdGVQYXRoX2xpbnV4O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICd3aW4zMic6XHJcblx0XHRcdFx0dGhpcy5mY2l0eFJlbW90ZVBhdGggPSB0aGlzLnNldHRpbmdzLmZjaXR4UmVtb3RlUGF0aF93aW5kb3dzO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdWaW0gSW5wdXQgTWV0aG9kIFN3aXRjaDogZG9lcyBub3Qgc3VwcG9ydCAnICsgcHJvY2Vzcy5wbGF0Zm9ybSArICcgY3VycmVudGx5LicpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuXHJcbmNsYXNzIElNU3dpdGNoU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVmltSU1Td2l0Y2hQbHVnaW47XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFZpbUlNU3dpdGNoUGx1Z2luKSB7XHJcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XHJcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRsZXQge2NvbnRhaW5lckVsfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7dGV4dDogJ1NldHRpbmdzIGZvciBWaW0gSU0gU3dpdGNoIHBsdWdpbi4nfSk7XHJcblxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdGY2l0eCBSZW1vdGUgUGF0aCBmb3IgbWFjT1MnKVxyXG5cdFx0XHQuc2V0RGVzYygnVGhlIGFic29sdXRlIHBhdGggdG8gZmNpdHgtcmVtb3RlIGJpbiBmaWxlIG9uIG1hY09TLicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLmZjaXR4UmVtb3RlUGF0aF9tYWNPUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZmNpdHhSZW1vdGVQYXRoX21hY09TKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmZjaXR4UmVtb3RlUGF0aF9tYWNPUyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlQ3VycmVudFBhdGgoKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnRmNpdHggUmVtb3RlIFBhdGggZm9yIExpbnV4JylcclxuXHRcdFx0LnNldERlc2MoJ1RoZSBhYnNvbHV0ZSBwYXRoIHRvIGZjaXR4LXJlbW90ZSBiaW4gZmlsZSBvbiBMaW51eC4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoREVGQVVMVF9TRVRUSU5HUy5mY2l0eFJlbW90ZVBhdGhfbGludXgpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZjaXR4UmVtb3RlUGF0aF9saW51eClcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5mY2l0eFJlbW90ZVBhdGhfbGludXggPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZUN1cnJlbnRQYXRoKCk7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0ZjaXR4IFJlbW90ZSBQYXRoIGZvciBXaW5kb3dzJylcclxuXHRcdFx0LnNldERlc2MoJ1RoZSBhYnNvbHV0ZSBwYXRoIHRvIGZjaXR4LXJlbW90ZSBiaW4gZmlsZSBvbiBXaW5kb3dzLicpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcihERUZBVUxUX1NFVFRJTkdTLmZjaXR4UmVtb3RlUGF0aF93aW5kb3dzKVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5mY2l0eFJlbW90ZVBhdGhfd2luZG93cylcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5mY2l0eFJlbW90ZVBhdGhfd2luZG93cyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlQ3VycmVudFBhdGgoKTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnQXV0byBzd2l0Y2ggaW5wdXQgbWV0aG9kIHdoZW4gZW50ZXJpbmcgaW5zZXJ0IG9yIHJlcGxhY2UgbW9kZScpXHJcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JTVN3aXRjaF93aGVuX2luc2VydF9tb2RlKVxyXG5cdFx0XHRcdC5vbkNoYW5nZSgodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLklNU3dpdGNoX3doZW5faW5zZXJ0X21vZGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnVwZGF0ZUN1cnJlbnRQYXRoKCk7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1RvZ2dsZSBkZXZlbG9wZXIgbG9nZ2luZycpXHJcblx0XHRcdC5hZGRUb2dnbGUodG9nZ2xlID0+IHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5JTVN3aXRjaF9kZXZlbG9wZXJfbG9nZ2luZylcclxuXHRcdFx0XHQub25DaGFuZ2UoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5JTVN3aXRjaF9kZXZlbG9wZXJfbG9nZ2luZyA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4udXBkYXRlQ3VycmVudFBhdGgoKTtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHR9XHJcbn1cclxuIl0sIm5hbWVzIjpbInByb21pc2lmeSIsImV4ZWMiLCJQbHVnaW4iLCJTY29wZSIsIk1hcmtkb3duVmlldyIsIlBsdWdpblNldHRpbmdUYWIiLCJTZXR0aW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1REE7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment