307 lines
57 KiB
JavaScript
307 lines
57 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var obsidian = require('obsidian');
|
||
|
|
||
|
/*! *****************************************************************************
|
||
|
Copyright (c) Microsoft Corporation.
|
||
|
|
||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||
|
purpose with or without fee is hereby granted.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||
|
PERFORMANCE OF THIS SOFTWARE.
|
||
|
***************************************************************************** */
|
||
|
/* global Reflect, Promise */
|
||
|
|
||
|
var extendStatics = function(d, b) {
|
||
|
extendStatics = Object.setPrototypeOf ||
|
||
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
|
return extendStatics(d, b);
|
||
|
};
|
||
|
|
||
|
function __extends(d, b) {
|
||
|
extendStatics(d, b);
|
||
|
function __() { this.constructor = d; }
|
||
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
|
}
|
||
|
|
||
|
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());
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function __generator(thisArg, body) {
|
||
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
||
|
function step(op) {
|
||
|
if (f) throw new TypeError("Generator is already executing.");
|
||
|
while (_) try {
|
||
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
||
|
switch (op[0]) {
|
||
|
case 0: case 1: t = op; break;
|
||
|
case 4: _.label++; return { value: op[1], done: false };
|
||
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||
|
default:
|
||
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||
|
if (t[2]) _.ops.pop();
|
||
|
_.trys.pop(); continue;
|
||
|
}
|
||
|
op = body.call(thisArg, _);
|
||
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var Hider = /** @class */ (function (_super) {
|
||
|
__extends(Hider, _super);
|
||
|
function Hider() {
|
||
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
||
|
// refresh function for when we change settings
|
||
|
_this.refresh = function () {
|
||
|
// re-load the style
|
||
|
_this.updateStyle();
|
||
|
};
|
||
|
// update the styles (at the start, or as the result of a settings change)
|
||
|
_this.updateStyle = function () {
|
||
|
document.body.classList.toggle('hider-ribbon', _this.settings.hideRibbon);
|
||
|
document.body.classList.toggle('hider-status', _this.settings.hideStatus);
|
||
|
document.body.classList.toggle('hider-tabs', _this.settings.hideTabs);
|
||
|
document.body.classList.toggle('hider-scroll', _this.settings.hideScroll);
|
||
|
document.body.classList.toggle('hider-sidebar-buttons', _this.settings.hideSidebarButtons);
|
||
|
document.body.classList.toggle('hider-tooltips', _this.settings.hideTooltips);
|
||
|
document.body.classList.toggle('hider-search-suggestions', _this.settings.hideSearchSuggestions);
|
||
|
document.body.classList.toggle('hider-search-counts', _this.settings.hideSearchCounts);
|
||
|
document.body.classList.toggle('hider-instructions', _this.settings.hideInstructions);
|
||
|
document.body.classList.toggle('hider-meta', _this.settings.hideMeta);
|
||
|
document.body.classList.toggle('hider-vault', _this.settings.hideVault);
|
||
|
};
|
||
|
return _this;
|
||
|
}
|
||
|
Hider.prototype.onload = function () {
|
||
|
return __awaiter(this, void 0, void 0, function () {
|
||
|
var _this = this;
|
||
|
return __generator(this, function (_a) {
|
||
|
switch (_a.label) {
|
||
|
case 0:
|
||
|
// load settings
|
||
|
return [4 /*yield*/, this.loadSettings()];
|
||
|
case 1:
|
||
|
// load settings
|
||
|
_a.sent();
|
||
|
// add the settings tab
|
||
|
this.addSettingTab(new HiderSettingTab(this.app, this));
|
||
|
// add the toggle on/off command
|
||
|
this.addCommand({
|
||
|
id: 'toggle-tab-containers',
|
||
|
name: 'Toggle tab bar',
|
||
|
callback: function () {
|
||
|
_this.settings.hideTabs = !_this.settings.hideTabs;
|
||
|
_this.saveData(_this.settings);
|
||
|
_this.refresh();
|
||
|
}
|
||
|
});
|
||
|
this.addCommand({
|
||
|
id: 'toggle-app-ribbon',
|
||
|
name: 'Toggle app ribbon',
|
||
|
callback: function () {
|
||
|
_this.settings.hideRibbon = !_this.settings.hideRibbon;
|
||
|
_this.saveData(_this.settings);
|
||
|
_this.refresh();
|
||
|
}
|
||
|
});
|
||
|
this.addCommand({
|
||
|
id: 'toggle-hider-status',
|
||
|
name: 'Toggle status bar',
|
||
|
callback: function () {
|
||
|
_this.settings.hideStatus = !_this.settings.hideStatus;
|
||
|
_this.saveData(_this.settings);
|
||
|
_this.refresh();
|
||
|
}
|
||
|
});
|
||
|
this.refresh();
|
||
|
return [2 /*return*/];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
Hider.prototype.onunload = function () {
|
||
|
console.log('Unloading Hider plugin');
|
||
|
};
|
||
|
Hider.prototype.loadSettings = function () {
|
||
|
return __awaiter(this, void 0, void 0, function () {
|
||
|
var _a, _b, _c, _d;
|
||
|
return __generator(this, function (_e) {
|
||
|
switch (_e.label) {
|
||
|
case 0:
|
||
|
_a = this;
|
||
|
_c = (_b = Object).assign;
|
||
|
_d = [DEFAULT_SETTINGS];
|
||
|
return [4 /*yield*/, this.loadData()];
|
||
|
case 1:
|
||
|
_a.settings = _c.apply(_b, _d.concat([_e.sent()]));
|
||
|
return [2 /*return*/];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
Hider.prototype.saveSettings = function () {
|
||
|
return __awaiter(this, void 0, void 0, function () {
|
||
|
return __generator(this, function (_a) {
|
||
|
switch (_a.label) {
|
||
|
case 0: return [4 /*yield*/, this.saveData(this.settings)];
|
||
|
case 1:
|
||
|
_a.sent();
|
||
|
return [2 /*return*/];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
return Hider;
|
||
|
}(obsidian.Plugin));
|
||
|
var DEFAULT_SETTINGS = {
|
||
|
hideRibbon: false,
|
||
|
hideStatus: false,
|
||
|
hideTabs: false,
|
||
|
hideScroll: false,
|
||
|
hideSidebarButtons: false,
|
||
|
hideTooltips: false,
|
||
|
hideSearchSuggestions: false,
|
||
|
hideSearchCounts: false,
|
||
|
hideInstructions: false,
|
||
|
hideMeta: false,
|
||
|
hideVault: false
|
||
|
};
|
||
|
var HiderSettingTab = /** @class */ (function (_super) {
|
||
|
__extends(HiderSettingTab, _super);
|
||
|
function HiderSettingTab(app, plugin) {
|
||
|
var _this = _super.call(this, app, plugin) || this;
|
||
|
_this.plugin = plugin;
|
||
|
return _this;
|
||
|
}
|
||
|
HiderSettingTab.prototype.display = function () {
|
||
|
var _this = this;
|
||
|
var containerEl = this.containerEl;
|
||
|
containerEl.empty();
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide app ribbon')
|
||
|
.setDesc('Hides the Obsidian menu. Warning: to open Settings you will need use the hotkey (default is CMD + ,)')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideRibbon)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideRibbon = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide tab bar')
|
||
|
.setDesc('Hides the tab container at the top of the window')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideTabs)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideTabs = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide status bar')
|
||
|
.setDesc('Hides word count, character count and backlink count')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideStatus)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideStatus = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide vault name')
|
||
|
.setDesc('Hides the root folder name')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideVault)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideVault = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide scroll bars')
|
||
|
.setDesc('Hides all scroll bars')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideScroll)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideScroll = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide sidebar toggle buttons')
|
||
|
.setDesc('Hides both sidebar buttons')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideSidebarButtons)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideSidebarButtons = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide tooltips')
|
||
|
.setDesc('Hides all tooltips')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideTooltips)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideTooltips = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide instructions')
|
||
|
.setDesc('Hides instructional tips in modals')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideInstructions)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideInstructions = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide search suggestions')
|
||
|
.setDesc('Hides suggestions in search pane')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideSearchSuggestions)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideSearchSuggestions = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide count of search term matches')
|
||
|
.setDesc('Hides the number of matches within each search result')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideSearchCounts)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideSearchCounts = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
new obsidian.Setting(containerEl)
|
||
|
.setName('Hide metadata block in Reading view')
|
||
|
.setDesc('When front matter is turned off in your Editor settings this hides the metadata block')
|
||
|
.addToggle(function (toggle) { return toggle.setValue(_this.plugin.settings.hideMeta)
|
||
|
.onChange(function (value) {
|
||
|
_this.plugin.settings.hideMeta = value;
|
||
|
_this.plugin.saveData(_this.plugin.settings);
|
||
|
_this.plugin.refresh();
|
||
|
}); });
|
||
|
};
|
||
|
return HiderSettingTab;
|
||
|
}(obsidian.PluginSettingTab));
|
||
|
|
||
|
module.exports = Hider;
|
||
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmF
|