cc-terminal
Version:
AngularJs Web based terminal module
191 lines • 24.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { filter, map, takeUntil } from 'rxjs/operators';
import cloneDeep from 'lodash.clonedeep';
import * as i0 from "@angular/core";
export class CcTerminalService {
constructor() {
this.ngUnsubscribe = new Subject(); // https://stackoverflow.com/questions/38008334/angular-rxjs-when-should-i-unsubscribe-from-subscription/41177163#41177163
this.event = new Subject();
this.readyStore();
}
fetch(url) {
return Observable.create(observer => {
// angular http lib does not support arrayBuffer hence XMLHTTP
const req = new XMLHttpRequest();
req.open('get', url, true);
req.responseType = 'arraybuffer';
req.onreadystatechange = function () {
if (req.readyState === 4 && req.status === 200) {
observer.next(req.response);
observer.complete();
}
};
req.send();
});
}
// calls the next event with listener id on listening component and data to send
broadcast(key, data) {
this.event.next({ key, data });
}
/**
* @description - This function will register to execute the store whenever store is ready.
*/
readyStore() {
this.on('store-ready').subscribe(_store => {
this.store = _store;
this.store.state$.subscribe(state => {
console.log('StoreReady: In Service:', state);
});
});
}
// filters through active observers and maps data to a matching observer
on(key) {
return this.event.asObservable().pipe(filter((event) => event.key === key), map(event => event.data));
}
/**
* @description - Get the Current prompt
*/
getPrompt() {
return this.prompt;
}
/**
* @description - Get the Current store
*/
getStore() {
console.log('here');
return this.store;
}
initPrompt(config) {
this.prompt = {};
let _user, _path, _userPathSeparator, _promptEnd;
config = config ? config.promptConfiguration : null;
const build = () => {
this.prompt.text = _user + _userPathSeparator + _path + _promptEnd;
};
this.prompt.reset = () => {
_user = config && config.user != null ? (config.user || '') : 'anon';
_path = config && config.path != null ? (config.path || '') : '\\';
_userPathSeparator = config && config.separator != null ? (config.separator || '') : '@';
_promptEnd = config && config.end != null ? (config.end || '') : ':>';
build();
};
this.prompt.text = '';
this.prompt.reset();
return this.prompt;
}
/**
* @description - This function will help you to interpret your commands.
* @param cmd - command
*/
interpret(cmd) {
const prompt = this.getPrompt();
// this.store.state$.subscribe(state => { console.log(state); });
const command = (cmd.command || '').split(' ');
let _command = null;
this.store.state$.pipe(takeUntil(this.ngUnsubscribe)).subscribe(state => {
_command = cloneDeep(state.commands.filter(// Remove the reference of command by making copy, to avoid modifying the command state
(item) => {
return item.name === command[0];
})[0] || null);
});
if (_command && _command.name) {
if (_command.callback && typeof _command.callback === 'function') {
_command.callback();
}
switch (_command.name) {
case 'help':
_command.details.result = _command.details.result.map((_result) => {
if (_result && _result.text && typeof _result.text === 'function') {
let text = _result.text(this.store.state.commands.map((c) => { return c.name; }));
return { ..._result, text };
}
else {
return _result;
}
});
break;
default:
_command.details.result = _command.details.result.map((_result) => {
if (_result && _result.text && typeof _result.text === 'function') {
let text = (_result.text()).toString();
return { ..._result, text };
}
else {
return _result;
}
});
}
_command.details.result.splice(0, 0, { text: prompt.text + cmd.command });
console.log('Final:', _command);
this.broadcast('terminal-output', _command);
}
else {
let result = '';
try {
result = eval(cmd.command); // eval.call(null, cmd.command);
if (result !== undefined) {
this.broadcast('terminal-output', {
details: {
output: true,
result: [
{ text: prompt.text + cmd.command, },
{ text: '' + result },
],
breakLine: true,
}
});
}
}
catch (e) {
this.broadcast('terminal-output', {
details: {
output: true,
result: [
{ text: prompt.text + cmd.command, },
{ text: '' + e, css: { color: 'red' } },
],
breakLine: true,
}
});
}
}
/**
* @description - Regex for exact match command
* note: we can add this in constants
* TODO: We can design the exact match regex based command also.
*/
const regex = {
alert: /^alert$/,
};
// Example of how to work with regex based command
// else if (regex.alert.test(command[0])) {
// this.broadcast('terminal-output', {
// details: {
// output: true,
// result: [
// { text: prompt.text + cmd.command, },
// { text: '' + e, css: { color: 'red' } }],
// breakLine: true,
// }
// });
// command.splice(0, 1); // Remove command from command string
// alert(command.join(' '));
// console.log(command);
// }
}
ngOnDestroy() {
// Clear Storage allocation of memory.
this.ngUnsubscribe.next(true);
this.ngUnsubscribe.complete();
}
}
/** @nocollapse */ CcTerminalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CcTerminalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ CcTerminalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CcTerminalService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: CcTerminalService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2MtdGVybWluYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NjLXRlcm1pbmFsL3NyYy9saWIvY2MtdGVybWluYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sU0FBUyxNQUFNLGtCQUFrQixDQUFDOztBQVV6QyxNQUFNLE9BQU8saUJBQWlCO0lBTTVCO1FBTFEsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDLENBQUMsMEhBQTBIO1FBTXhLLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBVztRQUVmLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsQyw4REFBOEQ7WUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNqQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0IsR0FBRyxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7WUFDakMsR0FBRyxDQUFDLGtCQUFrQixHQUFHO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUM5QyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDNUIsUUFBUSxDQUFD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QUM7UUFFRixrREFBa0Q7UUFDbEQsMkNBQTJDO1FBQzNDLHNDQUFzQztRQUN0QyxlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGNBQWM7UUFDZCw2Q0FBNkM7UUFDN0MsaURBQWlEO1FBQ2pELHVCQUF1QjtRQUN2QixNQUFNO1FBQ04sTUFBTTtRQUNOLGdFQUFnRTtRQUNoRSw4QkFBOEI7UUFDOUIsMEJBQTBCO1FBQzFCLElBQUk7SUFDTixDQUFDO0lBRUQsV0FBVztRQUNULHNDQUFzQztRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7O2lJQTVMVSxpQkFBaUI7cUlBQWpCLGlCQUFpQixjQUZoQixNQUFNOzJGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tYW5kU3RvcmUgfSBmcm9tICcuL2NjLXRlcm1pbmFsLWNvbW1hbmQtc3RvcmUnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW50ZXJmYWNlIEJyb2FkY2FzdEV2ZW50IHtcbiAga2V5OiBhbnk7XG4gIGRhdGE/OiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENjVGVybWluYWxTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTsgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzgwMDgzMzQvYW5ndWxhci1yeGpzLXdoZW4tc2hvdWxkLWktdW5zdWJzY3JpYmUtZnJvbS1zdWJzY3JpcHRpb24vNDExNzcxNjMjNDExNzcxNjNcbiAgcHJvbXB0OiBhbnk7XG4gIHB1YmxpYyBzdG9yZTogQ29tbWFuZFN0b3JlO1xuICBwcml2YXRlIGV2ZW50OiBTdWJqZWN0PEJyb2FkY2FzdEV2ZW50PjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV2ZW50ID0gbmV3IFN1YmplY3Q8QnJvYWRjYXN0RXZlbnQ+KCk7XG4gICAgdGhpcy5yZWFkeVN0b3JlKCk7XG4gIH1cblxuICBmZXRjaCh1cmw6IHN0cmluZykge1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKG9ic2VydmVyID0+IHtcbiAgICAgIC8vIGFuZ3VsYXIgaHR0cCBsaWIgZG9lcyBub3Qgc3VwcG9ydCBhcnJheUJ1ZmZlciBoZW5jZSBYTUxIVFRQXG4gICAgICBjb25zdCByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHJlcS5vcGVuKCdnZXQnLCB1cmwsIHRydWUpO1xuICAgICAgcmVxLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT09IDQgJiYgcmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXEucmVzcG9uc2UpO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXEuc2VuZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gY2FsbHMgdGhlIG5leHQgZXZlbnQgd2l0aCBsaXN0ZW5lciBpZCBvbiBsaXN0ZW5pbmcgY29tcG9uZW50IGFuZCBkYXRhIHRvIHNlbmRcbiAgYnJvYWRjYXN0KGtleTogYW55LCBkYXRhPzogYW55KSB7XG4gICAgdGhpcy5ldmVudC5uZXh0KHsga2V5LCBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiAtIFRoaXMgZnVuY3Rpb24gd2lsbCByZWdpc3RlciB0byBleGVjdXRlIHRoZSBzdG9yZSB3aGVuZXZlciBzdG9yZSBpcyByZWFkeS5cbiAgICovXG4gIHJlYWR5U3RvcmUoKSB7XG4gICAgdGhpcy5vbjxhbnk+KCdzdG9yZS1yZWFkeScpLnN1YnNjcmliZShfc3RvcmUgPT4ge1xuICAgICAgdGhpcy5zdG9yZSA9IF9zdG9yZTtcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdG9yZVJlYWR5OiBJbiBTZXJ2aWNlOicsIHN0YXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZmlsdGVycyB0aHJvdWdoIGFjdGl2ZSBvYnNlcnZlcnMgYW5kIG1hcHMgZGF0YSB0byBhIG1hdGNoaW5nIG9ic2VydmVyXG4gIG9uPFQ+KGtleTogYW55KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnQuYXNPYnNlcnZhYmxlKCkucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC5rZXkgPT09IGtleSksIG1hcChldmVudCA9PiA8VD5ldmVudC5kYXRhKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gR2V0IHRoZSBDdXJyZW50IHByb21wdFxuICAgKi9cbiAgcHVibGljIGdldFByb21wdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9tcHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIC0gR2V0IHRoZSBDdXJyZW50IHN0b3JlXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RvcmUoKSB7XG4gICAgY29uc29sZS5sb2coJ2hlcmUnKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yZTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0UHJvbXB0KGNvbmZpZzogYW55KSB7XG4gICAgdGhpcy5wcm9tcHQgPSB7fTtcbiAgICBsZXQgX3VzZXI6IGFueSwgX3BhdGg6IGFueSwgX3VzZXJQYXRoU2VwYXJhdG9yOiBhbnksIF9wcm9tcHRFbmQ6IGFueTtcbiAgICBjb25maWcgPSBjb25maWcgPyBjb25maWcucHJvbXB0Q29uZmlndXJhdGlvbiA6IG51bGw7XG4gICAgY29uc3QgYnVpbGQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb21wdC50ZXh0ID0gX3VzZXIgKyBfdXNlclBhdGhTZXBhcmF0b3IgKyBfcGF0aCArIF9wcm9tcHRFbmQ7XG4gICAgfTtcbiAgICB0aGlzLnByb21wdC5yZXNldCA9ICgpID0+IHtcbiAgICAgIF91c2VyID0gY29uZmlnICYmIGNvbmZpZy51c2VyICE9IG51bGwgPyAoY29uZmlnLnVzZXIgfHwgJycpIDogJ2Fub24nO1xuICAgICAgX3BhdGggPSBjb25maWcgJiYgY29uZmlnLnBhdGggIT0gbnVsbCA/IChjb25maWcucGF0aCB8fCAnJykgOiAnXFxcXCc7XG4gICAgICBfdXNlclBhdGhTZXBhcmF0b3IgPSBjb25maWcgJiYgY29uZmlnLnNlcGFyYXRvciAhPSBudWxsID8gKGNvbmZpZy5zZXBhcmF0b3IgfHwgJycpIDogJ0AnO1xuICAgICAgX3Byb21wdEVuZCA9IGNvbmZpZyAmJiBjb25maWcuZW5kICE9IG51bGwgPyAoY29uZmlnLmVuZCB8fCAnJykgOiAnOj4nO1xuICAgICAgYnVpbGQoKTtcbiAgICB9O1xuICAgIHRoaXMucHJvbXB0LnRleHQgPSAnJztcbiAgICB0aGlzLnByb21wdC5yZXNldCgpO1xuICAgIHJldHVybiB0aGlzLnByb21wdDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiAtIFRoaXMgZnVuY3Rpb24gd2lsbCBoZWxwIHlvdSB0byBpbnRlcnByZXQgeW91ciBjb21tYW5kcy5cbiAgICogQHBhcmFtIGNtZCAtIGNvbW1hbmRcbiAgICovXG4gIHB1YmxpYyBpbnRlcnByZXQoY21kOiBhbnkpIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmdldFByb21wdCgpO1xuICAgIC8vIHRoaXMuc3RvcmUuc3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7IGNvbnNvbGUubG9nKHN0YXRlKTsgfSk7XG4gICAgY29uc3QgY29tbWFuZCA9IChjbWQuY29tbWFuZCB8fCAnJykuc3BsaXQoJyAnKTtcbiAgICBsZXQgX2NvbW1hbmQgPSBudWxsO1xuICAgIHRoaXMuc3RvcmUuc3RhdGUkLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICBfY29tbWFuZCA9IGNsb25lRGVlcChzdGF0ZS5jb21tYW5kcy5maWx0ZXIoIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIG9mIGNvbW1hbmQgYnkgbWFraW5nIGNvcHksIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgY29tbWFuZCBzdGF0ZVxuICAgICAgICAoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IGNvbW1hbmRbMF07XG4gICAgICAgIH0pWzBdIHx8IG51bGwpO1xuICAgIH0pO1xuICAgIGlmIChfY29tbWFuZCAmJiBfY29tbWFuZC5uYW1lKSB7XG4gICAgICBpZiAoX2NvbW1hbmQuY2FsbGJhY2sgJiYgdHlwZW9mIF9jb21tYW5kLmNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIF9jb21tYW5kLmNhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKF9jb21tYW5kLm5hbWUpIHtcbiAgICAgICAgY2FzZSAnaGVscCc6XG4gICAgICAgICAgX2NvbW1hbmQuZGV0YWlscy5yZXN1bHQgPSBfY29tbWFuZC5kZXRhaWxzLnJlc3VsdC5tYXAoKF9yZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0ICYmIF9yZXN1bHQudGV4dCAmJiB0eXBlb2YgX3Jlc3VsdC50ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGxldCB0ZXh0ID0gX3Jlc3VsdC50ZXh0KHRoaXMuc3RvcmUuc3RhdGUuY29tbWFuZHMubWFwKChjKSA9PiB7IHJldHVybiBjLm5hbWU7IH0pKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uX3Jlc3VsdCwgdGV4dCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX2NvbW1hbmQuZGV0YWlscy5yZXN1bHQgPSBfY29tbWFuZC5kZXRhaWxzLnJlc3VsdC5tYXAoKF9yZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0ICYmIF9yZXN1bHQudGV4dCAmJiB0eXBlb2YgX3Jlc3VsdC50ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGxldCB0ZXh0ID0gKF9yZXN1bHQudGV4dCgpKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5fcmVzdWx0LCB0ZXh0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIF9jb21tYW5kLmRldGFpbHMucmVzdWx0LnNwbGljZSgwLCAwLCB7IHRleHQ6IHByb21wdC50ZXh0ICsgY21kLmNvbW1hbmQgfSk7XG4gICAgICBjb25zb2xlLmxvZygnRmluYWw6JywgX2NvbW1hbmQpO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ3Rlcm1pbmFsLW91dHB1dCcsIF9jb21tYW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZXZhbChjbWQuY29tbWFuZCk7IC8vIGV2YWwuY2FsbChudWxsLCBjbWQuY29tbWFuZCk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuYnJvYWRjYXN0KCd0ZXJtaW5hbC1vdXRwdXQnLCB7XG4gICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgIG91dHB1dDogdHJ1ZSxcbiAgICAgICAgICAgICAgcmVzdWx0OiBbXG4gICAgICAgICAgICAgICAgeyB0ZXh0OiBwcm9tcHQudGV4dCArIGNtZC5jb21tYW5kLCB9LFxuICAgICAgICAgICAgICAgIHsgdGV4dDogJycgKyByZXN1bHQgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYnJlYWtMaW5lOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0KCd0ZXJtaW5hbC1vdXRwdXQnLCB7XG4gICAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgICAgb3V0cHV0OiB0cnVlLFxuICAgICAgICAgICAgcmVzdWx0OiBbXG4gICAgICAgICAgICAgIHsgdGV4dDogcHJvbXB0LnRleHQgKyBjbWQuY29tbWFuZCwgfSxcbiAgICAgICAgICAgICAgeyB0ZXh0OiAnJyArIGUsIGNzczogeyBjb2xvcjogJ3JlZCcgfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGJyZWFrTGluZTogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiAtIFJlZ2V4IGZvciBleGFjdCBtYXRjaCBjb21tYW5kXG4gICAgICogICBub3RlOiB3ZSBjYW4gYWRkIHRoaXMgaW4gY29uc3RhbnRzXG4gICAgICogIFRPRE86IFdlIGNhbiBkZXNpZ24gdGhlIGV4YWN0IG1hdGNoIHJlZ2V4IGJhc2VkIGNvbW1hbmQgYWxzby5cbiAgICAgKi9cbiAgICBjb25zdCByZWdleCA9IHsgLy8gV2UgY2FuIGRlc2lnbiB0aGUgZXhhY3QgbWF0Y2ggcmVnZXggYmFzZWQgY29tbWFuZCBhbHNvLlxuICAgICAgYWxlcnQ6IC9eYWxlcnQkLyxcbiAgICB9O1xuXG4gICAgLy8gRXhhbXBsZSBvZiBob3cgdG8gd29yayB3aXRoIHJlZ2V4IGJhc2VkIGNvbW1hbmRcbiAgICAvLyBlbHNlIGlmIChyZWdleC5hbGVydC50ZXN0KGNvbW1hbmRbMF0pKSB7XG4gICAgLy8gdGhpcy5icm9hZGNhc3QoJ3Rlcm1pbmFsLW91dHB1dCcsIHtcbiAgICAvLyAgIGRldGFpbHM6IHtcbiAgICAvLyAgIG91dHB1dDogdHJ1ZSxcbiAgICAvLyAgIHJlc3VsdDogW1xuICAgIC8vICAgICAgeyB0ZXh0OiBwcm9tcHQudGV4dCArIGNtZC5jb21tYW5kLCB9LFxuICAgIC8vICAgICAgeyB0ZXh0OiAnJyArIGUsIGNzczogeyBjb2xvcjogJ3JlZCcgfSB9XSxcbiAgICAvLyAgICAgYnJlYWtMaW5lOiB0cnVlLFxuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuICAgIC8vICAgY29tbWFuZC5zcGxpY2UoMCwgMSk7IC8vIFJlbW92ZSBjb21tYW5kIGZyb20gY29tbWFuZCBzdHJpbmdcbiAgICAvLyAgIGFsZXJ0KGNvbW1hbmQuam9pbignICcpKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGNvbW1hbmQpO1xuICAgIC8vIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIENsZWFyIFN0b3JhZ2UgYWxsb2NhdGlvbiBvZiBtZW1vcnkuXG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxufVxuIl19