zigholding_obsidian-notesyn.../main.js
zigholding f4369bff39 汉化
2024-04-27 14:07:37 +08:00

388 lines
39 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => VaultExpoterPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
// src/fseditor.ts
var FsEditor = class {
constructor(plugin) {
this.plugin = plugin;
this.fs = require("fs");
this.path = require("path");
}
get root() {
let a = this.plugin.app.vault.adapter;
return a.basePath.replace(/\\/g, "/");
}
abspath(tfile) {
if (tfile) {
return this.root + "/" + tfile.path;
} else {
return null;
}
}
isfile(path) {
return this.fs.existsSync(path) && this.fs.statSync(path).isFile();
}
isdir(path) {
return this.fs.existsSync(path) && this.fs.statSync(path).isDirectory();
}
mkdirRecursiveSync(path) {
if (this.isdir(path)) {
return true;
}
const parent = this.path.dirname(path);
if (!this.isdir(parent)) {
this.mkdirRecursiveSync(parent);
}
this.fs.mkdirSync(path);
}
/**
* 附件 src 到 dst不在 vault 中,需要绝对路径
* overwrite复盖mtime新文件
*/
copy_file_by_path(src, dst, mode = "pass>overwrite>mtime") {
const fs = this.fs;
mode = mode.split(">")[0];
if (!fs.existsSync(src)) {
return;
}
if (fs.existsSync(dst)) {
if (mode === "overwrite") {
fs.unlinkSync(dst);
fs.copyFileSync(src, dst);
} else if (mode === "mtime") {
if (fs.statSync(dst).mtimeMs < fs.statSync(src).mtimeMs) {
fs.unlinkSync(dst);
fs.copyFileSync(src, dst);
}
}
} else {
fs.copyFileSync(src, dst);
}
}
copy_tfile(tfile, dst, mode = "mtime") {
if (tfile) {
let src = this.abspath(tfile);
src && this.copy_file_by_path(src, dst, mode);
}
}
mirror_tfile(tfile, vault_root, mode = "mtime", attachment = true, outlink = false) {
if (tfile) {
vault_root = vault_root.replace(/\\g/, "/");
let src = this.root + "/" + tfile.path;
let dst = vault_root + "/" + tfile.path;
this.mkdirRecursiveSync(this.path.dirname);
this.copy_file_by_path(src, dst, mode);
if (attachment) {
let nc = this.plugin.app.plugins.getPlugin("note-chain");
let tfiles = nc.chain.get_outlinks(tfile);
for (let t of tfiles) {
if (!(t.extension === "md")) {
this.mirror_tfile(t, vault_root, mode, false);
} else if (outlink) {
this.mirror_tfile(t, vault_root, mode, false);
}
}
}
}
}
modify(path, callback, encoding = "utf8") {
const fs = this.fs;
if (!fs.existsSync(path)) {
return;
}
;
fs.readFile(
path,
encoding,
(err, data) => {
if (err) {
console.error("Error reading file:", err);
;
}
let rs = callback(path, data);
fs.writeFile(path, rs, encoding, (err2) => {
if (err2) {
console.error("Error writing file:", err2);
} else {
console.log("File content updated successfully.");
}
});
}
);
}
};
// src/strings.ts
var Strings = class {
constructor() {
let lang = window.localStorage.getItem("language");
if (lang) {
this.language = lang;
} else {
this.language = "en";
}
}
get cmd_export_readme() {
if (this.language == "zh") {
return "\u5BFC\u51FA readMe";
} else {
return "Export readMe";
}
}
get cmd_set_git_project() {
if (this.language == "zh") {
return "\u8BBE\u7F6EGit\u9879\u76EE\u8DEF\u5F84";
} else {
return "Set Dir of Git Project";
}
}
get cmd_export_plugin() {
if (this.language == "zh") {
return "\u5BFC\u51FA\u63D2\u4EF6";
} else {
return "Export Plugin";
}
}
get prompt_path_of_folder() {
if (this.language == "zh") {
return "\u8F93\u5165\u6587\u4EF6\u5939\u8DEF\u5F84";
} else {
return "Input Path of Folder";
}
}
get notice_output() {
if (this.language == "zh") {
return "\u5BFC\u51FA\uFF1A";
} else {
return "Output:";
}
}
};
var strings = new Strings();
// main.ts
var DEFAULT_SETTINGS = {
nameLocalGitProject: "LocalGitProject",
readmeRemoveFrontmatter: true,
assetsLocalGitProject: "assets",
pluginDirExporter: ""
};
var cmd_export_readme = (plugin) => ({
id: "export_readme",
name: strings.cmd_export_readme,
callback: async () => {
const nc = plugin.notechain;
let tfile = nc.chain.current_note;
await plugin.export_readme(
tfile,
null,
true,
plugin.settings.assetsLocalGitProject
);
}
});
var cmd_set_git_project = (plugin) => ({
id: "set_git_project",
name: strings.cmd_set_git_project,
callback: async () => {
const nc = plugin.notechain;
let dir = await nc.chain.tp_prompt(strings.prompt_path_of_folder);
if (!dir || !plugin.fsEditor.fs.existsSync(dir)) {
return;
}
await nc.editor.set_frontmatter(
nc.chain.current_note,
plugin.settings.nameLocalGitProject,
dir
);
}
});
var cmd_export_plugin = (plugin) => ({
id: "cmd_export_plugin",
name: strings.cmd_export_plugin,
callback: async () => {
const nc = plugin.notechain;
let plugins = Object.keys(plugin.app.plugins.plugins);
let p = await nc.chain.tp_suggester(plugins, plugins);
let eplugin = plugin.app.plugins.getPlugin(p);
if (eplugin) {
let target = plugin.settings.pluginDirExporter;
if (!plugin.fsEditor.fs.existsSync(target)) {
target = await nc.chain.tp_prompt(strings.prompt_path_of_folder);
}
target = target.replace(/\\/g, "/");
if (!target.endsWith("/" + p)) {
target = target + "/" + p;
}
if (!plugin.fsEditor.fs.existsSync(target)) {
plugin.fsEditor.fs.mkdirSync(target);
}
let items = ["main.js", "manifest.json", "styles.css", "data.json"];
for (let item of items) {
let src = `${plugin.fsEditor.root}/${eplugin.manifest.dir}/${item}`;
let dst = `${target}/${item}`;
plugin.fsEditor.copy_file_by_path(src, dst, "overwrite");
new import_obsidian.Notice(`${strings.notice_output}${p}/${item}`, 3e3);
}
}
}
});
var commandBuilders = [
cmd_export_readme,
cmd_set_git_project,
cmd_export_plugin
];
function addCommands(plugin) {
commandBuilders.forEach((c) => {
plugin.addCommand(c(plugin));
});
}
var VaultExpoterPlugin = class extends import_obsidian.Plugin {
async onload() {
await this.loadSettings();
this.app.vt = this;
this.fsEditor = new FsEditor(this);
this.addSettingTab(new VExporterSettingTab(this.app, this));
addCommands(this);
}
onunload() {
}
get notechain() {
return this.app.plugins.getPlugin("note-chain");
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
async export_readme(tfile, dst, as_readme = true, assets = "assets") {
let nc = this.app.plugins.getPlugin("note-chain");
if (!tfile) {
tfile = nc.chain.current_note;
}
if (!dst) {
dst = this.settings.nameLocalGitProject;
}
if (!dst.contains("/")) {
dst = nc.editor.get_frontmatter(tfile, dst);
}
if (!dst) {
dst = await nc.chain.tp_prompt("Path of LocalGitProject");
if (!dst) {
return;
}
}
dst = dst.replace(/\\/g, "/");
if (!this.fsEditor.fs.existsSync(dst)) {
console.log("No Dir:", dst);
}
console.log(dst);
let olinks = nc.chain.get_outlinks(tfile);
let tmp;
if (as_readme) {
tmp = dst + "/readMe.md";
} else {
tmp = dst + "/" + tfile.basename + ".md";
}
this.fsEditor.copy_tfile(tfile, tmp);
await this.replace_readme(tmp);
let adir = dst + "/" + assets;
if (!this.fsEditor.fs.existsSync(adir)) {
this.fsEditor.fs.mkdirSync(adir);
}
for (let f of olinks) {
if (!(f.extension === "md")) {
this.fsEditor.copy_tfile(f, adir + "/" + f.basename + "." + f.extension);
}
}
}
replace_readme(path) {
const ufunc = (path2, data) => {
let replacedContent = data.replace(
/\!\[\[(.*?)\]\]/g,
(match, filename) => {
return `![${filename}](./assets/${filename})`;
}
);
if (this.settings.readmeRemoveFrontmatter) {
replacedContent = replacedContent.replace(
/---[\n(\r\n)][\s\S]*?---[\n(\r\n)]/,
""
);
}
return replacedContent;
};
this.fsEditor.modify(path, ufunc, "utf8");
}
};
var VExporterSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
getSettingValue(field) {
return this.plugin.settings[field];
}
add_toggle(name, desc, field) {
const { containerEl } = this;
let value = this.plugin.settings[field];
let item = new import_obsidian.Setting(containerEl).setName(name).setDesc(desc).addToggle(
(text) => text.setValue(value).onChange(async (value2) => {
this.plugin.settings[field] = value2;
await this.plugin.saveSettings();
})
);
return item;
}
display() {
const { containerEl } = this;
containerEl.empty();
new import_obsidian.Setting(containerEl).setName("LocalGitProject").setDesc("Metadata Name for Dir of Git Porject").addText((text) => text.setPlaceholder("Enter your field").setValue(this.plugin.settings.nameLocalGitProject).onChange(async (value) => {
this.plugin.settings.nameLocalGitProject = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName("Folder For Assets").setDesc("Dir Name for Assets").addText((text) => text.setValue(this.plugin.settings.assetsLocalGitProject).onChange(async (value) => {
this.plugin.settings.assetsLocalGitProject = value;
await this.plugin.saveSettings();
}));
this.add_toggle(
"Remove Frontmatter?",
"",
"readmeRemoveFrontmatter"
);
new import_obsidian.Setting(containerEl).setName("Plugin Dir To Export").addText((text) => text.setValue(this.plugin.settings.pluginDirExporter).onChange(async (value) => {
this.plugin.settings.pluginDirExporter = value;
await this.plugin.saveSettings();
}));
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvZnNlZGl0b3IudHMiLCAic3JjL3N0cmluZ3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCAqIGFzIE1vZHVsZSBmcm9tICdtb2R1bGUnO1xyXG5pbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgTm90aWNlLCBQbHVnaW4sIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcsIFRGaWxlIH0gZnJvbSAnb2JzaWRpYW4nO1xyXG5cclxuaW1wb3J0IHsgRnNFZGl0b3IgfSBmcm9tICdzcmMvZnNlZGl0b3InO1xyXG5pbXBvcnQgeyBzdHJpbmdzIH0gZnJvbSAnc3JjL3N0cmluZ3MnO1xyXG5cclxuaW50ZXJmYWNlIFZFeHBvcnRlclNldHRpbmdzIHtcclxuXHRuYW1lTG9jYWxHaXRQcm9qZWN0OiBzdHJpbmc7XHJcblx0YXNzZXRzTG9jYWxHaXRQcm9qZWN0OnN0cmluZztcclxuXHRyZWFkbWVSZW1vdmVGcm9udG1hdHRlcjpib29sZWFuO1xyXG5cdHBsdWdpbkRpckV4cG9ydGVyOnN0cmluZztcclxufVxyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogVkV4cG9ydGVyU2V0dGluZ3MgPSB7XHJcblx0bmFtZUxvY2FsR2l0UHJvamVjdDogJ0xvY2FsR2l0UHJvamVjdCcsXHJcblx0cmVhZG1lUmVtb3ZlRnJvbnRtYXR0ZXI6dHJ1ZSxcclxuXHRhc3NldHNMb2NhbEdpdFByb2plY3Q6ICdhc3NldHMnLFxyXG5cdHBsdWdpbkRpckV4cG9ydGVyOicnXHJcbn1cclxuXHJcblxyXG5jb25zdCBjbWRfZXhwb3J0X3JlYWRtZSA9IChwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSA9PiAoe1xyXG5cdGlkOiAnZXhwb3J0X3JlYWRtZScsXHJcblx0bmFtZTogc3RyaW5ncy5jbWRfZXhwb3J0X3JlYWRtZSxcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0bGV0IHRmaWxlID0gbmMuY2hhaW4uY3VycmVudF9ub3RlO1xyXG5cdFx0YXdhaXQgcGx1Z2luLmV4cG9ydF9yZWFkbWUoXHJcblx0XHRcdHRmaWxlLG51bGwsdHJ1ZSxwbHVnaW4uc2V0dGluZ3MuYXNzZXRzTG9jYWxHaXRQcm9qZWN0XHJcblx0XHQpO1xyXG5cdH1cclxufSk7XHJcblxyXG5jb25zdCBjbWRfc2V0X2dpdF9wcm9qZWN0ID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdzZXRfZ2l0X3Byb2plY3QnLFxyXG5cdG5hbWU6IHN0cmluZ3MuY21kX3NldF9naXRfcHJvamVjdCxcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0bGV0IGRpciA9IGF3YWl0IG5jLmNoYWluLnRwX3Byb21wdChzdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRpZighZGlyIHx8ICFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyhkaXIpKXtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cdFx0YXdhaXQgbmMuZWRpdG9yLnNldF9mcm9udG1hdHRlcihcclxuXHRcdFx0bmMuY2hhaW4uY3VycmVudF9ub3RlLFxyXG5cdFx0XHRwbHVnaW4uc2V0dGluZ3MubmFtZUxvY2FsR2l0UHJvamVjdCxcclxuXHRcdFx0ZGlyXHJcblx0XHQpXHJcblx0fVxyXG59KTtcclxuXHJcbmNvbnN0IGNtZF9leHBvcnRfcGx1Z2luID0gKHBsdWdpbjpWYXVsdEV4cG90ZXJQbHVnaW4pID0+ICh7XHJcblx0aWQ6ICdjbWRfZXhwb3J0X3BsdWdpbicsXHJcblx0bmFtZTogc3RyaW5ncy5jbWRfZXhwb3J0X3BsdWdpbixcclxuXHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0Y29uc3QgbmMgPSBwbHVnaW4ubm90ZWNoYWluO1xyXG5cdFx0XHJcblx0XHRsZXQgcGx1Z2lucyA9IE9iamVjdC5rZXlzKChwbHVnaW4uYXBwIGFzIGFueSkucGx1Z2lucy5wbHVnaW5zKTtcclxuXHRcdGxldCBwID0gYXdhaXQgbmMuY2hhaW4udHBfc3VnZ2VzdGVyKHBsdWdpbnMscGx1Z2lucyk7XHJcblx0XHRsZXQgZXBsdWdpbiA9IChwbHVnaW4uYXBwIGFzIGFueSkucGx1Z2lucy5nZXRQbHVnaW4ocCk7XHJcblx0XHRpZihlcGx1Z2luKXtcclxuXHRcdFx0bGV0IHRhcmdldCA9IHBsdWdpbi5zZXR0aW5ncy5wbHVnaW5EaXJFeHBvcnRlcjtcclxuXHRcdFx0aWYoIXBsdWdpbi5mc0VkaXRvci5mcy5leGlzdHNTeW5jKHRhcmdldCkpe1xyXG5cdFx0XHRcdHRhcmdldCA9IGF3YWl0IG5jLmNoYWluLnRwX3Byb21wdChzdHJpbmdzLnByb21wdF9wYXRoX29mX2ZvbGRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0dGFyZ2V0ID0gdGFyZ2V0LnJlcGxhY2UoL1xcXFwvZywnLycpO1xyXG5cdFx0XHRpZighdGFyZ2V0LmVuZHNXaXRoKCcvJyArIHApKXtcclxuXHRcdFx0XHR0YXJnZXQgPSB0YXJnZXQgKyAnLycgKyBwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmKCFwbHVnaW4uZnNFZGl0b3IuZnMuZXhpc3RzU3luYyh0YXJnZXQpKXtcclxuXHRcdFx0XHRwbHVnaW4uZnNFZGl0b3IuZnMubWtkaXJTeW5jKHRhcmdldCk7XHJcblx0XHRcdH1cclxuXHRcdFx0bGV0IGl0ZW1zID0gWydtYWluLmpzJywnbWFuaWZlc3QuanNvbicsJ3N0eWxlcy5jc3MnLCdkYXRhLmpzb24nXTtcclxuXHRcdFx0Zm9yKGxldCBpdGVtIG9mIGl0ZW1zKXtcclxuXHRcdFx0XHRsZXQgc3JjID0gYCR7cGx1Z2luLmZzRWRpdG9yLnJvb3R9LyR7ZXBsdWdpbi5tYW5pZmVzdC5kaXJ9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdGxldCBkc3QgPSBgJHt0YXJnZXR9LyR7aXRlbX1gO1xyXG5cdFx0XHRcdHBsdWdpbi5mc0VkaXRvci5jb3B5X2ZpbGVfYnlfcGF0aChzcmMsZHN0LCdvdmVyd3JpdGUnKTtcclxuXHRcdFx0XHRuZXcgTm90aWNlKGAke3N0cmluZ3Mubm90aWNlX291dHB1dH0ke3B9LyR7aXRlbX1gLDMwMDApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbmNvbnN0IGNvbW1hbmRCdWlsZGVycyA9IFtcclxuXHRjbWRfZXhwb3J0X3JlYWRtZSxcclxuXHRjbWRfc2V0X2dpdF9wcm9qZWN0LFxyXG5cdGNtZF9leHBvcnRfcGx1Z2luXHJcbl07XHJcblxyXG5mdW5jdGlvbiBhZGRDb21tYW5kcyhwbHVnaW46VmF1bHRFeHBvdGVyUGx1Z2luKSB7XHJcbiAgICBjb21tYW5kQnVpbGRlcnMuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIHBsdWdpbi5hZGRDb21tYW5kKGMocGx1Z2luKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmF1bHRFeHBvdGVyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHRzZXR0aW5nczogVkV4cG9ydGVyU2V0dGluZ3M7XHJcblx0ZnNFZGl0b3IgOiBGc0VkaXRvcjtcclxuXHRhc3luYyBvbmxvYWQoKSB7XHJcblx0XHRhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xyXG5cdFx0dGhpcy5hcHAudnQgPSB0aGlzO1xyXG5cdFx0dGhpcy5mc0VkaXRvciA9IG5ldyBGc0VkaXRvcih0aGlzKTtcclxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFZFeHBvcnRlclNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHJcblx0XHRhZGRDb21tYW5kcyh0aGlzKTtcclxuXHR9XHJcblxyXG5cdG9udW5sb2FkKCkge1xyXG5cclxuXHR9XHJcblxyXG5cdGdldCBub3RlY2hhaW4oKXtcclxuXHRcdHJldHVybiAodGhpcy5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xyXG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBzYXZlU2V0dGluZ3MoKSB7XHJcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xyXG5cdH1cclxuXHRcclxuXHRhc3luYyBleHBvcnRfcmVhZG1lKHRmaWxlOlRGaWxlLGRzdDpzdHJpbmd8bnVsbCxhc19yZWFkbWU9dHJ1ZSxhc3NldHM9J2Fzc2V0cycpe1xyXG5cdFx0bGV0IG5jID0gKHRoaXMuYXBwIGFzIGFueSkucGx1Z2lucy5nZXRQbHVnaW4oJ25vdGUtY2hhaW4nKTtcclxuXHRcdGlmKCF0ZmlsZSl7dGZpbGUgPSBuYy5jaGFpbi5jdXJyZW50X25vdGU7fVxyXG5cdFx0XHJcblx0XHRpZighZHN0KXtcclxuXHRcdFx0ZHN0ID0gdGhpcy5zZXR0aW5ncy5uYW1lTG9jYWxHaXRQcm9qZWN0O1xyXG5cdFx0fVxyXG5cdFx0aWYoIWRzdC5jb250YWlucygnLycpKXtcclxuXHRcdFx0ZHN0ID0gbmMuZWRpdG9yLmdldF9mcm9udG1hdHRlcih0ZmlsZSxkc3QpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmKCFkc3Qpe1xyXG5cdFx0XHRkc3QgPSBhd2FpdCBuYy5jaGFpbi50cF9wcm9tcHQoJ1BhdGggb2YgTG9jYWxHaXRQcm9qZWN0Jyk7XHJcblx0XHRcdGlmKCFkc3Qpe3JldHVybjt9XHJcblx0XHR9XHJcblx0XHRkc3QgPSBkc3QucmVwbGFjZSgvXFxcXC9nLCcvJyk7XHJcblx0XHRpZighdGhpcy5mc0VkaXRvci5mcy5leGlzdHNTeW5jKGRzdCkpe1xyXG5cdFx0XHRjb25zb2xlLmxvZygnTm8gRGlyOicsZHN0KTtcclxuXHRcdH1cclxuXHRcdGNvbnNvbGUubG9nKGRzdCk7XHJcblx0XHRsZXQgb2xpbmtzID0gbmMuY2hhaW4uZ2V0X291dGxpbmtzKHRmaWxlKTtcclxuXHRcdFxyXG5cdFx0bGV0IHRtcDtcclxuXHRcdGlmKGFzX3JlYWRtZSl7XHJcblx0XHRcdHRtcCA9IGRzdCsnLycrJ3JlYWRNZS5tZCc7XHJcblx0XHR9ZWxzZXtcclxuXHRcdFx0dG1wID0gZHN0KycvJyt0ZmlsZS5iYXNlbmFtZSsnLm1kJztcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmZzRWRpdG9yLmNvcHlfdGZpbGUodGZpbGUsdG1wKTtcclxuXHRcdGF3YWl0IHRoaXMucmVwbGFjZV9yZWFkbWUodG1wKTtcclxuXHJcblx0XHRsZXQgYWRpciA9IGRzdCsnLycrYXNzZXRzO1xyXG5cdFx0aWYoIXRoaXMuZnNFZGl0b3IuZnMuZXhpc3RzU3luYyhhZGlyKSl7XHJcblx0XHRcdHRoaXMuZnNFZGl0b3IuZnMubWtkaXJTeW5jKGFkaXIpO1xyXG5cdFx0fVxyXG5cdFx0Zm9yKGxldCBmIG9mIG9saW5rcyl7XHJcblx0XHRcdGlmKCEoZi5leHRlbnNpb249PT0nbWQnKSl7XHJcblx0XHRcdFx0dGhpcy5mc0VkaXRvci5jb3B5X3RmaWxlKGYsYWRpcisnLycrZi5iYXNlbmFtZSsnLicrZi5leHRlbnNpb24pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdFxyXG5cdHJlcGxhY2VfcmVhZG1lKHBhdGg6c3RyaW5nKXtcclxuXHRcdGNvbnN0IHVmdW5jID0gKHBhdGg6c3RyaW5nLGRhdGE6c3RyaW5nKT0+e1xyXG5cdFx0XHRsZXQgcmVwbGFjZWRDb250ZW50ID0gZGF0YS5yZXBsYWNlKFxyXG5cdFx0XHRcdC9cXCFcXFtcXFsoLio/KVxcXVxcXS9nLCBcclxuXHRcdFx0XHQobWF0Y2g6YW55LCBmaWxlbmFtZTpzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gYCFbJHtmaWxlbmFtZX1dKC4vYXNzZXRzLyR7ZmlsZW5hbWV9KWA7XHJcblx0XHRcdH0pO1xyXG5cdFx0XHRpZih0aGlzLnNldHRpbmdzLnJlYWRtZVJlbW92ZUZyb250bWF0dGVyKXtcclxuXHRcdFx0XHRyZXBsYWNlZENvbnRlbnQgPSByZXBsYWNlZENvbnRlbnQucmVwbGFjZShcclxuXHRcdFx0XHRcdC8tLS1bXFxuKFxcclxcbildW1xcc1xcU10qPy0tLVtcXG4oXFxyXFxuKV0vLCcnXHJcblx0XHRcdFx0KVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXBsYWNlZENvbnRlbnQ7XHJcblx0XHR9XHJcblx0XHR0aGlzLmZzRWRpdG9yLm1vZGlmeShwYXRoLHVmdW5jLCd1dGY4Jyk7XHJcblx0fVxyXG59XHJcblxyXG5jbGFzcyBWRXhwb3J0ZXJTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XHJcblx0cGx1Z2luOiBWYXVsdEV4cG90ZXJQbHVnaW47XHJcblx0XHJcblxyXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFZhdWx0RXhwb3RlclBsdWdpbikge1xyXG5cdFx0c3VwZXIoYXBwLCBwbHVnaW4pO1xyXG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XHJcblx0fVxyXG5cclxuXHRnZXRTZXR0aW5nVmFsdWUoZmllbGQ6IGtleW9mIFZFeHBvcnRlclNldHRpbmdzKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wbHVnaW4uc2V0dGluZ3NbZmllbGRdO1xyXG5cdH1cclxuXHJcblx0YWRkX3RvZ2dsZShuYW1lOnN0cmluZyxkZXNjOnN0cmluZyxmaWVsZDprZXlvZiBWRXhwb3J0ZXJTZXR0aW5ncyl7XHJcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHRcdGxldCB2YWx1ZSA9IHRoaXMucGx1Z2luLnNldHRpbmdzW2ZpZWxkXSBhcyBib29sZWFuO1xyXG5cdFx0bGV0IGl0ZW0gPSBuZXcgU2V0dGluZyhjb250YWluZXJFbCkgIFxyXG5cdFx0XHQuc2V0TmFtZShuYW1lKVxyXG5cdFx0XHQuc2V0RGVzYyhkZXNjKVxyXG5cdFx0XHQuYWRkVG9nZ2xlKHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh2YWx1ZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlOm5ldmVyKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5nc1tmaWVsZF0gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHRyZXR1cm4gaXRlbTtcclxuXHR9XHJcblxyXG5cdGRpc3BsYXkoKTogdm9pZCB7XHJcblx0XHRjb25zdCB7Y29udGFpbmVyRWx9ID0gdGhpcztcclxuXHJcblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnTG9jYWxHaXRQcm9qZWN0JylcclxuXHRcdFx0LnNldERlc2MoJ01ldGFkYXRhIE5hbWUgZm9yIERpciBvZiBHaXQgUG9yamVjdCcpXHJcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxyXG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignRW50ZXIgeW91ciBmaWVsZCcpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5hbWVMb2NhbEdpdFByb2plY3QpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MubmFtZUxvY2FsR2l0UHJvamVjdCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ0ZvbGRlciBGb3IgQXNzZXRzJylcclxuXHRcdFx0LnNldERlc2MoJ0RpciBOYW1lIGZvciBBc3NldHMnKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYXNzZXRzTG9jYWxHaXRQcm9qZWN0KVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFzc2V0c0xvY2FsR2l0UHJvamVjdCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHJcblx0XHR0aGlzLmFkZF90b2dnbGUoXHJcblx0XHRcdCdSZW1vdmUgRnJvbnRtYXR0ZXI/JywnJywncmVhZG1lUmVtb3ZlRnJvbnRtYXR0ZXInXHJcblx0XHQpO1xyXG5cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnUGx1Z2luIERpciBUbyBFeHBvcnQnKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGx1Z2luRGlyRXhwb3J0ZXIgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHRcdFxyXG5cdH1cclxufVxyXG4iLCAiXHJcbmltcG9ydCB7IEFwcCwgRWRpdG9yLCBNYXJrZG93blZpZXcsIE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgVEZpbGUgfSBmcm9tICdvYnNpZGlhbic7XHJcblxyXG5leHBvcnQgY2xhc3MgRnNFZGl0b3J7XHJcbiAgICBmcztcclxuICAgIHBhdGg7XHJcbiAgICBwbHVnaW4gOlBsdWdpbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW46UGx1Z2luKXtcclxuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcclxuICAgICAgICB0aGlzLmZzID0gcmVxdWlyZSgnZnMnKTtcclxuICAgICAgICB0aGlzLnBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKXtcclxuICAgICAgICBsZXQgYSA9IHRoaXMucGx1Z2luLmFwcC52YXVsdC5hZGFwdGVyIGFzIGFueTtcclxuICAgICAgICByZXR1cm4gYS5iYXNlUGF0aC5yZXBsYWNlKC9cXFxcL2csJy8nKTtcclxuICAgIH1cclxuXHJcbiAgICBhYnNwYXRoKHRmaWxlOlRGaWxlKXtcclxuXHRcdGlmKHRmaWxlKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMucm9vdCsnLycrdGZpbGUucGF0aDtcclxuXHRcdH1lbHNle1xyXG5cdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgaXNmaWxlKHBhdGg6c3RyaW5nKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHBhdGgpICYmIHRoaXMuZnMuc3RhdFN5bmMocGF0aCkuaXNGaWxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNkaXIocGF0aDpzdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmMocGF0aCkgJiYgdGhpcy5mcy5zdGF0U3luYyhwYXRoKS5pc0RpcmVjdG9yeSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1rZGlyUmVjdXJzaXZlU3luYyhwYXRoOnN0cmluZyl7XHJcbiAgICAgICAgaWYodGhpcy5pc2RpcihwYXRoKSl7cmV0dXJuIHRydWU7fVxyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGF0aC5kaXJuYW1lKHBhdGgpO1xyXG4gICAgICAgIGlmKCF0aGlzLmlzZGlyKHBhcmVudCkpe1xyXG4gICAgICAgICAgICB0aGlzLm1rZGlyUmVjdXJzaXZlU3luYyhwYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZzLm1rZGlyU3luYyhwYXRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuXHQqIFx1OTY0NFx1NEVGNiBzcmMgXHU1MjMwIGRzdFx1RkYwQ1x1NEUwRFx1NTcyOCB2YXVsdCBcdTRFMkRcdUZGMENcdTk3MDBcdTg5ODFcdTdFRERcdTVCRjlcdThERUZcdTVGODRcclxuXHQqIG92ZXJ3cml0ZVx1RkYwQ1x1NTkwRFx1NzZENlx1RkYxQm10aW1lXHVGRjBDXHU2NUIwXHU2NTg3XHU0RUY2XHVGRjFCXHJcblx0Ki9cclxuICAgIGNvcHlfZmlsZV9ieV9wYXRoKHNyYzpzdHJpbmcsZHN0OnN0cmluZyxtb2RlPSdwYXNzPm92ZXJ3cml0ZT5tdGltZScpIHtcclxuICAgICAgICBjb25zdCBmcyA9IHRoaXMuZnM7XHJcblxyXG4gICAgICAgIG1vZGUgPSBtb2RlLnNwbGl0KCc+JylbMF1cclxuICAgICAgICBpZighZnMuZXhpc3RzU3luYyhzcmMpKXtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihmcy5leGlzdHNTeW5jKGRzdCkpe1xyXG4gICAgICAgICAgICBpZihtb2RlPT09J292ZXJ3cml0ZScpe1xyXG4gICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhkc3QpO1xyXG4gICAgICAgICAgICAgICAgZnMuY29weUZpbGVTeW5jKHNyYyxkc3QpO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihtb2RlPT09J210aW1lJyl7XHJcbiAgICAgICAgICAgICAgICAvLyBkc3QgXHU2NkY0XHU2NUIwXHU2NUY2XHU5NUY0XHU1QzBGXHU0RThFIHNyY1xyXG4gICAgICAgICAgICAgICAgaWYoZnMuc3RhdFN5bmMoZHN0KS5tdGltZU1zPGZzLnN0YXRTeW5jKHNyYykubXRpbWVNcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMudW5saW5rU3luYyhkc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhzcmMsZHN0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoc3JjLGRzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvcHlfdGZpbGUodGZpbGU6VEZpbGUsIGRzdDpzdHJpbmcsbW9kZT0nbXRpbWUnKSB7XHJcblx0XHRpZih0ZmlsZSl7XHJcblx0XHRcdGxldCBzcmMgPSB0aGlzLmFic3BhdGgodGZpbGUpO1xyXG5cdFx0XHRzcmMgJiYgdGhpcy5jb3B5X2ZpbGVfYnlfcGF0aChzcmMsZHN0LG1vZGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcbiAgICBtaXJyb3JfdGZpbGUodGZpbGU6VEZpbGUsdmF1bHRfcm9vdDpzdHJpbmcsbW9kZT0nbXRpbWUnLGF0dGFjaG1lbnQ9dHJ1ZSxvdXRsaW5rPWZhbHNlKXtcclxuICAgICAgICAvLyBcdTVDMDZcdTdCMTRcdThCQjBcdTk1NUNcdTUwQ0ZcdTc5RkJcdTUyQThcdTUyMzBcdTUyMkJcdTc2ODRcdTVFOTNcdTRFMkRcdUZGMENcdTY1ODdcdTRFRjZcdTdFRDNcdTY3ODRcdTRFMEVcdTVGNTNcdTUyNERcdTVFOTNcdTc2RjhcdTU0MENcclxuICAgICAgICBpZih0ZmlsZSl7XHJcbiAgICAgICAgICAgIHZhdWx0X3Jvb3QgPSB2YXVsdF9yb290LnJlcGxhY2UoL1xcXFxnLywnLycpO1xyXG5cdFx0XHRsZXQgc3JjID0gdGhpcy5yb290ICsgJy8nICsgdGZpbGUucGF0aDtcclxuICAgICAgICAgICAgbGV0IGRzdCA9IHZhdWx0X3Jvb3QrJy8nK3RmaWxlLnBhdGg7XHJcbiAgICAgICAgICAgIHRoaXMubWtkaXJSZWN1cnNpdmVTeW5jKHRoaXMucGF0aC5kaXJuYW1lKTtcclxuXHRcdFx0dGhpcy5jb3B5X2ZpbGVfYnlfcGF0aChzcmMsZHN0LG1vZGUpO1xyXG4gICAgICAgICAgICBpZihhdHRhY2htZW50KXtcclxuICAgICAgICAgICAgICAgIGxldCBuYyA9ICh0aGlzLnBsdWdpbi5hcHAgYXMgYW55KS5wbHVnaW5zLmdldFBsdWdpbignbm90ZS1jaGFpbicpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRmaWxlcyA9IG5jLmNoYWluLmdldF9vdXRsaW5rcyh0ZmlsZSk7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IHQgb2YgdGZpbGVzKXtcclxuICAgICAgICAgICAgICAgICAgICBpZighKHQuZXh0ZW5zaW9uPT09J21kJykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvcl90ZmlsZSh0LHZhdWx0X3Jvb3QsbW9kZSxmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYob3V0bGluayl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yX3RmaWxlKHQsdmF1bHRfcm9vdCxtb2RlLGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICBtb2RpZnkocGF0aDpzdHJpbmcsY2FsbGJhY2s6RnVuY3Rpb24sZW5jb2Rpbmc9J3V0ZjgnKXtcclxuICAgICAgICBjb25zdCBmcyA9IHRoaXMuZnM7XHJcbiAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMocGF0aCkpe3JldHVybn07XHJcblxyXG4gICAgICAgIGZzLnJlYWRGaWxlKHBhdGgsIGVuY29kaW5nLCAoZXJyOkVycm9yLCBkYXRhOnN0cmluZykgPT4ge1xyXG5cdFx0XHRpZihlcnIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVhZGluZyBmaWxlOicsIGVycik7O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBycyA9IGNhbGxiYWNrKHBhdGgsZGF0YSk7XHJcblx0XHRcdGZzLndyaXRlRmlsZShwYXRoLCBycywgZW5jb2RpbmcsIChlcnI6RXJyb3IpID0+IHtcclxuXHRcdFx0ICBpZiAoZXJyKSB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3Igd3JpdGluZyBmaWxlOicsIGVycik7XHJcblx0XHRcdCAgfSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnRmlsZSBjb250ZW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xyXG5cdFx0XHQgIH1cclxuXHRcdFx0fSk7XHJcblx0XHQgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsICJcclxuY2xhc3MgU3RyaW5nc3tcclxuICAgIGxhbmd1YWdlOnN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgbGV0IGxhbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJyk7XHJcbiAgICAgICAgaWYobGFuZyl7XHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5nO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gJ2VuJztcclxuICAgICAgICB9XHJcblx0fVxyXG5cclxuICAgIGdldCBjbWRfZXhwb3J0X3JlYWRtZSgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQSByZWFkTWUnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnRXhwb3J0IHJlYWRNZSc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjbWRfc2V0X2dpdF9wcm9qZWN0KCl7XHJcbiAgICAgICAgaWYodGhpcy5sYW5ndWFnZT09J3poJyl7XHJcbiAgICAgICAgICAgIHJldHVybiAnXHU4QkJFXHU3RjZFR2l0XHU5ODc5XHU3NkVFXHU4REVGXHU1Rjg0J1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gJ1NldCBEaXIgb2YgR2l0IFByb2plY3QnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY21kX2V4cG9ydF9wbHVnaW4oKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdTVCRkNcdTUxRkFcdTYzRDJcdTRFRjYnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnRXhwb3J0IFBsdWdpbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcm9tcHRfcGF0aF9vZl9mb2xkZXIoKXtcclxuICAgICAgICBpZih0aGlzLmxhbmd1YWdlPT0nemgnKXtcclxuICAgICAgICAgICAgcmV0dXJuICdcdThGOTNcdTUxNjVcdTY1ODdcdTRFRjZcdTU5MzlcdThERUZcdTVGODQnXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiAnSW5wdXQgUGF0aCBvZiBGb2xkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90aWNlX291dHB1dCgpe1xyXG4gICAgICAgIGlmKHRoaXMubGFuZ3VhZ2U9PSd6aCcpe1xyXG4gICAgICAgICAgICByZXR1cm4gJ1x1NUJGQ1x1NTFGQVx1RkYxQSdcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuICdPdXRwdXQ6JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgc3RyaW5ncyA9IG5ldyBTdHJpbmdzKCk7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBLHNCQUFtRzs7O0FDRTVGLElBQU0sV0FBTixNQUFjO0FBQUEsRUFLakIsWUFB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YUFBTztBQUFBLElBQ1I7QUFDQSxTQUFLLFNBQVMsT0FBTyxNQUFLLE9BQU0sTUFBTTtBQUFBLEVBQ3ZDO0FBQ0Q7QUFFQSxJQUFNLHNCQUFOLGNBQWtDLGlDQUFpQjtBQUFBLEVBSWxELFlBQVksS0FBVSxRQUE0QjtBQUNqRCxVQUFNLEtBQUssTUFBTTtBQUNqQixTQUFLLFNBQVM7QUFBQSxFQUNmO0FBQUEsRUFFQSxnQkFBZ0IsT0FBZ0M7QUFDL0MsV0FBTyxLQUFLLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFDbEM7QUFBQSxFQUVBLFdBQVcsTUFBWSxNQUFZLE9BQThCO0FBQ2hFLFVBQU0sRUFBQyxZQUFXLElBQUk7QUFDdEIsUUFBSSxRQUFRLEtBQUssT0FBTyxTQUFTLEtBQUs7QUFDdEMsUUFBSSxPQUFPLElBQUksd0JBQVEsV0FBVyxFQUNoQyxRQUFRLElBQUksRUFDWixRQUFRLElBQUksRUFDWjtBQUFBLE1BQVUsVUFBUSxLQUNqQixTQUFTLEtBQUssRUFDZCxTQUFTLE9BQU9DLFdBQWdCO0FBQ2hDLGFBQUssT0FBTyxTQUFTLEtBQUssSUFBSUE7QUFDOUIsY0FBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLE1BQ2hDLENBQUM7QUFBQSxJQUNGO0FBQ0QsV0FBTztBQUFBLEVBQ1I7QUFBQSxFQUVBLFVBQWdCO0FBQ2YsVUFBTSxFQUFDLFlBQVcsSUFBSTtBQUV0QixnQkFBWSxNQUFNO0FBRWxCLFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLGlCQUFpQixFQUN6QixRQUFRLHNDQUFzQyxFQUM5QyxRQUFRLFVBQVEsS0FDZixlQUFlLGtCQUFrQixFQUNqQyxTQUFTLEtBQUssT0FBTyxTQUFTLG1CQUFtQixFQUNqRCxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyxzQkFBc0I7QUFDM0MsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUVKLFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLG1CQUFtQixFQUMzQixRQUFRLHFCQUFxQixFQUM3QixRQUFRLFVBQVEsS0FDZixTQUFTLEtBQUssT0FBTyxTQUFTLHFCQUFxQixFQUNuRCxTQUFTLE9BQU8sVUFBVTtBQUMxQixXQUFLLE9BQU8sU0FBUyx3QkFBd0I7QUFDN0MsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUVKLFNBQUs7QUFBQSxNQUNKO0FBQUEsTUFBc0I7QUFBQSxNQUFHO0FBQUEsSUFDMUI7QUFFQSxRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSxzQkFBc0IsRUFDOUIsUUFBUSxVQUFRLEtBQ2YsU0FBUyxLQUFLLE9BQU8sU0FBUyxpQkFBaUIsRUFDL0MsU0FBUyxPQUFPLFVBQVU7QUFDMUIsV0FBSyxPQUFPLFNBQVMsb0JBQW9CO0FBQ3pDLFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUNoQyxDQUFDLENBQUM7QUFBQSxFQUVMO0FBQ0Q7IiwKICAibmFtZXMiOiBbImVyciIsICJwYXRoIiwgInZhbHVlIl0KfQo=