hivessh
Version:
HiveSsh is an innovative library designed to streamline SSH2 connections and simplify task execution on Linux servers.
149 lines • 20.3 kB
JavaScript
import { trimAll } from "../../utils/base.js";
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
*/
export const aptEnv = {
LANG: "en_US.UTF-8",
DEBIAN_FRONTEND: "noninteractive",
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
*/
export const ignoredErrMsgs = [
"debconf: unable to initialize frontend",
"warning"
];
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
*/
export const ignoreMessageFilter = (data) => {
let data2 = trimAll(data).toLowerCase();
for (const msg of ignoredErrMsgs) {
if (data2.includes(msg)) {
return undefined;
}
}
return data;
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
*/
export const parsePackageList = (exit) => {
if (!exit.out.includes("Listing...")) {
throw new Error("Cmd out of '" + exit.cmd + "' not includes 'Listing...':\n " +
exit.out.split("\n").join("\n "));
}
return exit.out.split("\n")
.filter((v) => v.includes("/"))
.map((v) => v.split("/")[0])
.map(trimAll)
.filter((v) => v.length != 0);
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
* @param exit
* @returns
*/
export const parsePackageDescription = (exit) => {
const fieldLines = exit.out
.split("\n")
.filter((v) => v.includes(": "));
const fields = {};
for (const fieldLine of fieldLines) {
const firstPos = fieldLine.indexOf(": ");
const key = trimAll(fieldLine.slice(0, firstPos)).toLowerCase();
const value = trimAll(fieldLine.slice(firstPos + 2));
if (key.length == 0 ||
value.length == 0) {
continue;
}
fields[key] = value;
}
if (!fields["package"]) {
throw new Error("'package' field in '" + exit.cmd + "' is missing:\n" +
JSON.stringify(fields));
}
if (!fields["version"]) {
throw new Error("'version' field in '" + exit.cmd + "' is missing:\n" +
JSON.stringify(fields));
}
return {
name: fields["package"],
version: fields["version"],
description: fields["description"],
fields: fields
};
};
/**
* @deprecated The AbstractPackageManager (APM) feature will be removed in the future to more focus on the core problems and solutions
* @param sshHost
* @param cmdTimeoutMillis
* @returns
*/
export const initAptApm = (sshHost, cmdTimeoutMillis) => {
return {
type: "apt",
sshHost,
//### cache
updateCache: () => sshHost.exec("apt-get update", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(),
clearCache: () => sshHost.exec("apt-get clean", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(),
//### edit
install: (...pkgs) => sshHost.exec("apt-get install -o Dpkg::Options::=\"--force-confnew\" -y " +
pkgs.join(" "), {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(),
uninstall: (...pkgs) => sshHost.exec("apt-get purge -y --allow-remove-essential " +
pkgs.join(" "), {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(),
//### maintenance
upgradeAll: () => sshHost.exec("apt-get full-upgrade -o Dpkg::Options::=\"--force-confnew\" -y", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(),
uninstallUnused: () => sshHost.exec("apt-get autoremove -y", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(),
//### get
list: () => sshHost.exec("apt list --installed", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(parsePackageList),
upgradable: () => sshHost.exec("apt list --upgradable", {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(parsePackageList),
describe: (pkg) => sshHost.exec("apt show " + pkg, {
sudo: true,
timeoutMillis: cmdTimeoutMillis,
mapErrOut: ignoreMessageFilter,
env: aptEnv,
}).then(parsePackageDescription),
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwbS9pbXBsL2FwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFHeEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDbEIsSUFBSSxFQUFFLGFBQWE7SUFDbkIsZUFBZSxFQUFFLGdCQUFnQjtDQUNwQyxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWE7SUFDcEMsd0NBQXdDO0lBQ3hDLFNBQVM7Q0FDWixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBcUIsQ0FDakQsSUFBWSxFQUNkLEVBQUU7SUFDQSxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMvQixJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQ3JCLENBQUM7WUFDQyxPQUFPLFNBQVMsQ0FBQTtRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUM1QixJQUFvQixFQUNaLEVBQUU7SUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUNYLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLGtDQUFrQztZQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQ3BDLENBQUE7SUFDTCxD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LElBQUk7WUFDVixhQUFhLEVBQUUsZ0JBQWdCO1lBQy9CLFNBQVMsRUFBRSxtQkFBbUI7WUFDOUIsR0FBRyxFQUFFLE1BQU07U0FDZCxDQUNKLENBQUMsSUFBSSxFQUFFO1FBRVosU0FBUztRQUNULElBQUksRUFBRSxHQUFHLEVBQUUsQ0FDUCxPQUFPLENBQUMsSUFBSSxDQUNSLHNCQUFzQixFQUN0QjtZQUNJLElBQUksRUFBRSxJQUFJO1lBQ1YsYUFBYSxFQUFFLGdCQUFnQjtZQUMvQixTQUFTLEVBQUUsbUJBQW1CO1lBQzlCLEdBQUcsRUFBRSxNQUFNO1NBQ2QsQ0FDSixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQ2IsT0FBTyxDQUFDLElBQUksQ0FDUix1QkFBdUIsRUFDdkI7WUFDSSxJQUFJLEVBQUUsSUFBSTtZQUNWLGFBQWEsRUFBRSxnQkFBZ0I7WUFDL0IsU0FBUyxFQUFFLG1CQUFtQjtZQUM5QixHQUFHLEVBQUUsTUFBTTtTQUNkLENBQ0osQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDNUIsUUFBUSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDdEIsT0FBTyxDQUFDLElBQUksQ0FDUixXQUFXLEdBQUcsR0FBRyxFQUNqQjtZQUNJLElBQUksRUFBRSxJQUFJO1lBQ1YsYUFBYSxFQUFFLGdCQUFnQjtZQUMvQixTQUFTLEVBQUUsbUJBQW1CO1lBQzlCLEdBQUcsRUFBRSxNQUFNO1NBQ2QsQ0FDSixDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztLQUN0QyxDQUFBO0FBQ0wsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3NoQ2hhbm5lbEV4aXQsIFN0cmVhbURhdGFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vU3NoRXhlYy5qc1wiXG5pbXBvcnQgeyBTc2hIb3N0IH0gZnJvbSBcIi4uLy4uL1NzaEhvc3QuanNcIlxuaW1wb3J0IHsgQXdhaXRhYmxlLCB0cmltQWxsIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UuanNcIlxuaW1wb3J0IHsgQWJzdHJhY3RQYWNrYWdlLCBBYnN0cmFjdFBhY2thZ2VNYW5hZ2VyLCBBcG1Jbml0IH0gZnJvbSBcIi4uL2FwbS5qc1wiXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGFwdEVudiA9IHtcbiAgICBMQU5HOiBcImVuX1VTLlVURi04XCIsXG4gICAgREVCSUFOX0ZST05URU5EOiBcIm5vbmludGVyYWN0aXZlXCIsXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlnbm9yZWRFcnJNc2dzOiBzdHJpbmdbXSA9IFtcbiAgICBcImRlYmNvbmY6IHVuYWJsZSB0byBpbml0aWFsaXplIGZyb250ZW5kXCIsXG4gICAgXCJ3YXJuaW5nXCJcbl1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGUgQWJzdHJhY3RQYWNrYWdlTWFuYWdlciAoQVBNKSBmZWF0dXJlIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlIHRvIG1vcmUgZm9jdXMgb24gdGhlIGNvcmUgcHJvYmxlbXMgYW5kIHNvbHV0aW9uc1xuICovXG5leHBvcnQgY29uc3QgaWdub3JlTWVzc2FnZUZpbHRlcjogU3RyZWFtRGF0YU1hcHBlciA9IChcbiAgICBkYXRhOiBzdHJpbmdcbikgPT4ge1xuICAgIGxldCBkYXRhMiA9IHRyaW1BbGwoZGF0YSkudG9Mb3dlckNhc2UoKVxuICAgIGZvciAoY29uc3QgbXNnIG9mIGlnbm9yZWRFcnJNc2dzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEyLmluY2x1ZGVzKG1zZylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGUgQWJzdHJhY3RQYWNrYWdlTWFuYWdlciAoQVBNKSBmZWF0dXJlIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlIHRvIG1vcmUgZm9jdXMgb24gdGhlIGNvcmUgcHJvYmxlbXMgYW5kIHNvbHV0aW9uc1xuICovXG5leHBvcnQgY29uc3QgcGFyc2VQYWNrYWdlTGlzdCA9IChcbiAgICBleGl0OiBTc2hDaGFubmVsRXhpdFxuKTogc3RyaW5nW10gPT4ge1xuICAgIGlmICghZXhpdC5vdXQuaW5jbHVkZXMoXCJMaXN0aW5nLi4uXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiQ21kIG91dCBvZiAnXCIgKyBleGl0LmNtZCArIFwiJyBub3QgaW5jbHVkZXMgJ0xpc3RpbmcuLi4nOlxcbiAgXCIgK1xuICAgICAgICAgICAgZXhpdC5vdXQuc3BsaXQoXCJcXG5cIikuam9pbihcIlxcbiAgXCIpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpdC5vdXQuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgLmZpbHRlcigodikgPT4gdi5pbmNsdWRlcyhcIi9cIikpXG4gICAgICAgIC5tYXAoKHYpID0+IHYuc3BsaXQoXCIvXCIpWzBdKVxuICAgICAgICAubWFwKHRyaW1BbGwpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHYubGVuZ3RoICE9IDApXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqIEBwYXJhbSBleGl0IFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZVBhY2thZ2VEZXNjcmlwdGlvbiA9IChcbiAgICBleGl0OiBTc2hDaGFubmVsRXhpdFxuKTogQWJzdHJhY3RQYWNrYWdlID0+IHtcbiAgICBjb25zdCBmaWVsZExpbmVzID0gZXhpdC5vdXRcbiAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHYuaW5jbHVkZXMoXCI6IFwiKSlcblxuICAgIGNvbnN0IGZpZWxkczoge1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdcbiAgICB9ID0ge31cblxuICAgIGZvciAoY29uc3QgZmllbGRMaW5lIG9mIGZpZWxkTGluZXMpIHtcbiAgICAgICAgY29uc3QgZmlyc3RQb3MgPSBmaWVsZExpbmUuaW5kZXhPZihcIjogXCIpXG5cbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbUFsbChcbiAgICAgICAgICAgIGZpZWxkTGluZS5zbGljZSgwLCBmaXJzdFBvcylcbiAgICAgICAgKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdHJpbUFsbChcbiAgICAgICAgICAgIGZpZWxkTGluZS5zbGljZShmaXJzdFBvcyArIDIpXG4gICAgICAgIClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBrZXkubGVuZ3RoID09IDAgfHxcbiAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA9PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGZpZWxkc1trZXldID0gdmFsdWVcbiAgICB9XG5cblxuICAgIGlmICghZmllbGRzW1wicGFja2FnZVwiXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIidwYWNrYWdlJyBmaWVsZCBpbiAnXCIgKyBleGl0LmNtZCArIFwiJyBpcyBtaXNzaW5nOlxcblwiICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZpZWxkcylcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGlmICghZmllbGRzW1widmVyc2lvblwiXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIid2ZXJzaW9uJyBmaWVsZCBpbiAnXCIgKyBleGl0LmNtZCArIFwiJyBpcyBtaXNzaW5nOlxcblwiICtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZpZWxkcylcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGZpZWxkc1tcInBhY2thZ2VcIl0sXG4gICAgICAgIHZlcnNpb246IGZpZWxkc1tcInZlcnNpb25cIl0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmaWVsZHNbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgZmllbGRzOiBmaWVsZHNcbiAgICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhlIEFic3RyYWN0UGFja2FnZU1hbmFnZXIgKEFQTSkgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB0byBtb3JlIGZvY3VzIG9uIHRoZSBjb3JlIHByb2JsZW1zIGFuZCBzb2x1dGlvbnNcbiAqIEBwYXJhbSBzc2hIb3N0IFxuICogQHBhcmFtIGNtZFRpbWVvdXRNaWxsaXMgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRBcHRBcG06IEFwbUluaXQgPSAoXG4gICAgc3NoSG9zdDogU3NoSG9zdCxcbiAgICBjbWRUaW1lb3V0TWlsbGlzPzogbnVtYmVyIHwgdW5kZWZpbmVkXG4pOiBBd2FpdGFibGU8QWJzdHJhY3RQYWNrYWdlTWFuYWdlcj4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiYXB0XCIsXG4gICAgICAgIHNzaEhvc3QsXG5cbiAgICAgICAgLy8jIyMgY2FjaGVcbiAgICAgICAgdXBkYXRlQ2FjaGU6ICgpID0+IHNzaEhvc3QuZXhlYyhcbiAgICAgICAgICAgIFwiYXB0LWdldCB1cGRhdGVcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRNaWxsaXM6IGNtZFRpbWVvdXRNaWxsaXMsXG4gICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgIGVudjogYXB0RW52LFxuICAgICAgICAgICAgfVxuICAgICAgICApLnRoZW4oKSxcbiAgICAgICAgY2xlYXJDYWNoZTogKCkgPT4gc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgXCJhcHQtZ2V0IGNsZWFuXCIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0TWlsbGlzOiBjbWRUaW1lb3V0TWlsbGlzLFxuICAgICAgICAgICAgICAgIG1hcEVyck91dDogaWdub3JlTWVzc2FnZUZpbHRlcixcbiAgICAgICAgICAgICAgICBlbnY6IGFwdEVudixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKS50aGVuKCksXG5cbiAgICAgICAgLy8jIyMgZWRpdFxuICAgICAgICBpbnN0YWxsOiAoLi4ucGtnczogc3RyaW5nW10pID0+XG4gICAgICAgICAgICBzc2hIb3N0LmV4ZWMoXG4gICAgICAgICAgICAgICAgXCJhcHQtZ2V0IGluc3RhbGwgLW8gRHBrZzo6T3B0aW9uczo6PVxcXCItLWZvcmNlLWNvbmZuZXdcXFwiIC15IFwiICtcbiAgICAgICAgICAgICAgICBwa2dzLmpvaW4oXCIgXCIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IGFwdEVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKSxcbiAgICAgICAgdW5pbnN0YWxsOiAoLi4ucGtnczogc3RyaW5nW10pID0+XG4gICAgICAgICAgICBzc2hIb3N0LmV4ZWMoXG4gICAgICAgICAgICAgICAgXCJhcHQtZ2V0IHB1cmdlIC15IC0tYWxsb3ctcmVtb3ZlLWVzc2VudGlhbCBcIiArXG4gICAgICAgICAgICAgICAgcGtncy5qb2luKFwiIFwiKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1ZG86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNaWxsaXM6IGNtZFRpbWVvdXRNaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgIG1hcEVyck91dDogaWdub3JlTWVzc2FnZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgZW52OiBhcHRFbnYsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKCksXG5cbiAgICAgICAgLy8jIyMgbWFpbnRlbmFuY2VcbiAgICAgICAgdXBncmFkZUFsbDogKCkgPT5cbiAgICAgICAgICAgIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgICAgICAgICBcImFwdC1nZXQgZnVsbC11cGdyYWRlIC1vIERwa2c6Ok9wdGlvbnM6Oj1cXFwiLS1mb3JjZS1jb25mbmV3XFxcIiAteVwiLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IGFwdEVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKSxcbiAgICAgICAgdW5pbnN0YWxsVW51c2VkOiAoKSA9PlxuICAgICAgICAgICAgc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgICAgIFwiYXB0LWdldCBhdXRvcmVtb3ZlIC15XCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0TWlsbGlzOiBjbWRUaW1lb3V0TWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICBtYXBFcnJPdXQ6IGlnbm9yZU1lc3NhZ2VGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGVudjogYXB0RW52LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbigpLFxuXG4gICAgICAgIC8vIyMjIGdldFxuICAgICAgICBsaXN0OiAoKSA9PlxuICAgICAgICAgICAgc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgICAgIFwiYXB0IGxpc3QgLS1pbnN0YWxsZWRcIixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN1ZG86IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNaWxsaXM6IGNtZFRpbWVvdXRNaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgIG1hcEVyck91dDogaWdub3JlTWVzc2FnZUZpbHRlcixcbiAgICAgICAgICAgICAgICAgICAgZW52OiBhcHRFbnYsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKHBhcnNlUGFja2FnZUxpc3QpLFxuICAgICAgICB1cGdyYWRhYmxlOiAoKSA9PlxuICAgICAgICAgICAgc3NoSG9zdC5leGVjKFxuICAgICAgICAgICAgICAgIFwiYXB0IGxpc3QgLS11cGdyYWRhYmxlXCIsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdWRvOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0TWlsbGlzOiBjbWRUaW1lb3V0TWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICBtYXBFcnJPdXQ6IGlnbm9yZU1lc3NhZ2VGaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIGVudjogYXB0RW52LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbihwYXJzZVBhY2thZ2VMaXN0KSxcbiAgICAgICAgZGVzY3JpYmU6IChwa2c6IHN0cmluZykgPT5cbiAgICAgICAgICAgIHNzaEhvc3QuZXhlYyhcbiAgICAgICAgICAgICAgICBcImFwdCBzaG93IFwiICsgcGtnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3VkbzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dE1pbGxpczogY21kVGltZW91dE1pbGxpcyxcbiAgICAgICAgICAgICAgICAgICAgbWFwRXJyT3V0OiBpZ25vcmVNZXNzYWdlRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IGFwdEVudixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4ocGFyc2VQYWNrYWdlRGVzY3JpcHRpb24pLFxuICAgIH1cbn0iXX0=