UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

140 lines 19 kB
import { __decorate, __metadata } from "tslib"; import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import { debounce } from 'lodash-es'; import { Observable } from 'rxjs'; import { Terminal } from 'xterm'; import { FitAddon } from 'xterm-addon-fit'; import { SearchAddon } from 'xterm-addon-search'; import { WebLinksAddon } from 'xterm-addon-web-links'; import { clearWindowsXtermTools, setWindowsXtermTools, } from '../core/public-api'; import { ObservableInput, ValueHook } from '../core/utils/decorators'; import { EffectDirectiveModule } from '../effect-directive/module'; import { XTERM_DARK_THEME, XTERM_LIGHT_THEME } from '../exec/constants'; import { initRendererAddon } from '../exec/terminal/component'; import { CommonLayoutModule } from '../page-scaffold/page-header/common-layout/common-layout.module'; import * as i0 from "@angular/core"; const _c0 = ["anchor"]; const SHELL_THEMES = { dark: XTERM_DARK_THEME, light: XTERM_LIGHT_THEME, }; export class XtermComponent { constructor() { this.feedLines = 1; this.searchAddonInit = new EventEmitter(); this.terminalInit = new EventEmitter(); this.searchAddon = new SearchAddon(); this.baseTerminalOptions = { fontSize: 12, lineHeight: 1.5, letterSpacing: 0, fontWeight: 'normal', fontFamily: 'Menlo, Monaco, "Consolas", "Courier New", monospace', cursorBlink: false, convertEol: true, scrollback: Number.MAX_SAFE_INTEGER, allowProposedApi: true, }; } initFitAddon() { this.fitAddon = new FitAddon(); const resizeObserver = new ResizeObserver(debounce(([entry]) => { if (entry.contentRect.width !== 0) { this.fitAddon.fit(); } }, 200)); resizeObserver.observe(this.terminalWrapper.nativeElement); return this.fitAddon; } initSearchAddon() { this.searchAddon = new SearchAddon(); this.searchAddonInit.next(this.searchAddon); return this.searchAddon; } initXterm() { this.terminal = new Terminal(this.baseTerminalOptions); this.terminal.loadAddon(this.initFitAddon()); this.terminal.loadAddon(this.initSearchAddon()); this.terminal.loadAddon(new WebLinksAddon()); this.terminal.loadAddon(initRendererAddon()); this.terminal.open(this.terminalWrapper.nativeElement); this.setTheme(); this.bindCopyEvent(); setWindowsXtermTools(this.terminal); this.terminalInit.next(this.terminal); } ngAfterViewInit() { this.initXterm(); this.logs$.subscribe(logs => { this.fitAddon.fit(); this.write(logs, () => { requestAnimationFrame(() => this.terminal.scrollToBottom()); }); }); } ngOnDestroy() { if (this.terminal) { this.terminal.dispose(); } clearWindowsXtermTools(); } write(logs, callback) { if (this.terminal?.write) { this.terminal.clear(); Array.isArray(logs) ? logs.forEach(v => this.terminal.write(v, callback)) : this.terminal.write(logs || '', callback); } } bindCopyEvent() { this.terminal.attachCustomKeyEventHandler((e) => { if (e.ctrlKey && e.key?.toLowerCase() === 'c') { document.execCommand('copy'); } return false; }); } setTheme(theme = this.theme) { if (!this.terminal) { return; } this.terminal.options.theme = SHELL_THEMES[theme]; } static { this.ɵfac = function XtermComponent_Factory(t) { return new (t || XtermComponent)(); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: XtermComponent, selectors: [["acl-xterm"]], viewQuery: function XtermComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 7); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.terminalWrapper = _t.first); } }, inputs: { theme: "theme", logs: "logs" }, outputs: { searchAddonInit: "searchAddonInit", terminalInit: "terminalInit" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 0, consts: [["anchor", ""], [1, "logs-xterm"]], template: function XtermComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 1, 0); } }, dependencies: [CommonModule, CommonLayoutModule, EffectDirectiveModule], styles: [".logs-xterm[_ngcontent-%COMP%]{color:rgb(var(--aui-color-n-8));width:100%;height:100%}.logs-xterm[_ngcontent-%COMP%] .xterm{padding:0 20px;height:100%}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-screen{pointer-events:none}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport{width:100%!important;border-radius:0 0 2px 2px}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar{width:8px;height:4px}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgb(var(--aui-color-n-7))}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--aui-color-n-5))}.logs-xterm[_ngcontent-%COMP%] .xterm .xterm-viewport::-webkit-scrollbar-corner{background-color:transparent}"], changeDetection: 0 }); } } __decorate([ ValueHook(function (theme) { this.setTheme(theme); }), __metadata("design:type", String) ], XtermComponent.prototype, "theme", void 0); __decorate([ ObservableInput(), __metadata("design:type", Observable) ], XtermComponent.prototype, "logs$", void 0); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(XtermComponent, [{ type: Component, args: [{ selector: 'acl-xterm', template: '<div class="logs-xterm" #anchor></div>', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, CommonLayoutModule, EffectDirectiveModule], styles: [".logs-xterm{color:rgb(var(--aui-color-n-8));width:100%;height:100%}.logs-xterm ::ng-deep .xterm{padding:0 20px;height:100%}.logs-xterm ::ng-deep .xterm .xterm-screen{pointer-events:none}.logs-xterm ::ng-deep .xterm .xterm-viewport{width:100%!important;border-radius:0 0 2px 2px}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar{width:8px;height:4px}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgb(var(--aui-color-n-7))}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--aui-color-n-5))}.logs-xterm ::ng-deep .xterm .xterm-viewport::-webkit-scrollbar-corner{background-color:transparent}\n"] }] }], null, { theme: [{ type: Input }], logs$: [], logs: [{ type: Input }], terminalWrapper: [{ type: ViewChild, args: ['anchor', { static: true }] }], searchAddonInit: [{ type: Output }], terminalInit: [{ type: Output }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(XtermComponent, { className: "XtermComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHRlcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL3h0ZXJtL3h0ZXJtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBNEIsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsb0JBQW9CLEdBQ3JCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQzs7O0FBRXJHLE1BQU0sWUFBWSxHQUEwQjtJQUMxQyxJQUFJLEVBQUUsZ0JBQWdC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QztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQzsrRUF4SFUsY0FBYztvRUFBZCxjQUFjOzs7Ozs7WUFOZCw0QkFBc0M7NEJBSXZDLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUI7O0FBT2pFO0lBSkMsU0FBUyxDQUFDLFVBQVUsS0FBWTtRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQzs7NkNBRVc7QUFLYjtJQURDLGVBQWUsRUFBRTs4QkFDWCxVQUFVOzZDQUFvQjtpRkFWMUIsY0FBYztjQVIxQixTQUFTOzJCQUNFLFdBQVcsWUFDWCx3Q0FBd0MsbUJBRWpDLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDO2dCQU9sRSxLQUFLO2tCQURKLEtBQUs7WUFNTixLQUFLLE1BR0wsSUFBSTtrQkFESCxLQUFLO1lBSU4sZUFBZTtrQkFEZCxTQUFTO21CQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7WUFJckMsZUFBZTtrQkFEZCxNQUFNO1lBSVAsWUFBWTtrQkFEWCxNQUFNOztrRkFyQkksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRoZW1lIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJVGVybWluYWxPcHRpb25zLCBJVGhlbWUsIFRlcm1pbmFsIH0gZnJvbSAneHRlcm0nO1xuaW1wb3J0IHsgRml0QWRkb24gfSBmcm9tICd4dGVybS1hZGRvbi1maXQnO1xuaW1wb3J0IHsgU2VhcmNoQWRkb24gfSBmcm9tICd4dGVybS1hZGRvbi1zZWFyY2gnO1xuaW1wb3J0IHsgV2ViTGlua3NBZGRvbiB9IGZyb20gJ3h0ZXJtLWFkZG9uLXdlYi1saW5rcyc7XG5cbmltcG9ydCB7XG4gIGNsZWFyV2luZG93c1h0ZXJtVG9vbHMsXG4gIHNldFdpbmRvd3NYdGVybVRvb2xzLFxufSBmcm9tICcuLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZUlucHV0LCBWYWx1ZUhvb2sgfSBmcm9tICcuLi9jb3JlL3V0aWxzL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgRWZmZWN0RGlyZWN0aXZlTW9kdWxlIH0gZnJvbSAnLi4vZWZmZWN0LWRpcmVjdGl2ZS9tb2R1bGUnO1xuaW1wb3J0IHsgWFRFUk1fREFSS19USEVNRSwgWFRFUk1fTElHSFRfVEhFTUUgfSBmcm9tICcuLi9leGVjL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbml0UmVuZGVyZXJBZGRvbiB9IGZyb20gJy4uL2V4ZWMvdGVybWluYWwvY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbkxheW91dE1vZHVsZSB9IGZyb20gJy4uL3BhZ2Utc2NhZmZvbGQvcGFnZS1oZWFkZXIvY29tbW9uLWxheW91dC9jb21tb24tbGF5b3V0Lm1vZHVsZSc7XG5cbmNvbnN0IFNIRUxMX1RIRU1FUzogUmVjb3JkPFRoZW1lLCBJVGhlbWU+ID0ge1xuICBkYXJrOiBYVEVSTV9EQVJLX1RIRU1FLFxuICBsaWdodDogWFRFUk1fTElHSFRfVEhFTUUsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wteHRlcm0nLFxuICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJsb2dzLXh0ZXJtXCIgI2FuY2hvcj48L2Rpdj4nLFxuICBzdHlsZVVybHM6IFsneHRlcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENvbW1vbkxheW91dE1vZHVsZSwgRWZmZWN0RGlyZWN0aXZlTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgWHRlcm1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmFsdWVIb29rKGZ1bmN0aW9uICh0aGVtZTogVGhlbWUpIHtcbiAgICB0aGlzLnNldFRoZW1lKHRoZW1lKTtcbiAgfSlcbiAgQElucHV0KClcbiAgdGhlbWU6IFRoZW1lO1xuXG4gIGZlZWRMaW5lcyA9IDE7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGxvZ3MkOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgc3RyaW5nPjtcblxuICBASW5wdXQoKVxuICBsb2dzOiBzdHJpbmdbXSB8IHN0cmluZztcblxuICBAVmlld0NoaWxkKCdhbmNob3InLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICB0ZXJtaW5hbFdyYXBwZXI6IEVsZW1lbnRSZWY7XG5cbiAgQE91dHB1dCgpXG4gIHNlYXJjaEFkZG9uSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8U2VhcmNoQWRkb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHRlcm1pbmFsSW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8VGVybWluYWw+KCk7XG5cbiAgdGVybWluYWw6IFRlcm1pbmFsO1xuICBzZWFyY2hBZGRvbiA9IG5ldyBTZWFyY2hBZGRvbigpO1xuXG4gIGZpdEFkZG9uOiBGaXRBZGRvbjtcblxuICBiYXNlVGVybWluYWxPcHRpb25zOiBJVGVybWluYWxPcHRpb25zID0ge1xuICAgIGZvbnRTaXplOiAxMixcbiAgICBsaW5lSGVpZ2h0OiAxLjUsXG4gICAgbGV0dGVyU3BhY2luZzogMCxcbiAgICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgICBmb250RmFtaWx5OiAnTWVubG8sIE1vbmFjbywgXCJDb25zb2xhc1wiLCBcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gICAgY3Vyc29yQmxpbms6IGZhbHNlLFxuICAgIGNvbnZlcnRFb2w6IHRydWUsXG4gICAgc2Nyb2xsYmFjazogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgYWxsb3dQcm9wb3NlZEFwaTogdHJ1ZSxcbiAgfTtcblxuICBwcml2YXRlIGluaXRGaXRBZGRvbigpIHtcbiAgICB0aGlzLmZpdEFkZG9uID0gbmV3IEZpdEFkZG9uKCk7XG5cbiAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihcbiAgICAgIGRlYm91bmNlKChbZW50cnldKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeS5jb250ZW50UmVjdC53aWR0aCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuZml0QWRkb24uZml0KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDIwMCksXG4gICAgKTtcblxuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy50ZXJtaW5hbFdyYXBwZXIubmF0aXZlRWxlbWVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5maXRBZGRvbjtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFNlYXJjaEFkZG9uKCkge1xuICAgIHRoaXMuc2VhcmNoQWRkb24gPSBuZXcgU2VhcmNoQWRkb24oKTtcbiAgICB0aGlzLnNlYXJjaEFkZG9uSW5pdC5uZXh0KHRoaXMuc2VhcmNoQWRkb24pO1xuICAgIHJldHVybiB0aGlzLnNlYXJjaEFkZG9uO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0WHRlcm0oKSB7XG4gICAgdGhpcy50ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCh0aGlzLmJhc2VUZXJtaW5hbE9wdGlvbnMpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKHRoaXMuaW5pdEZpdEFkZG9uKCkpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKHRoaXMuaW5pdFNlYXJjaEFkZG9uKCkpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKG5ldyBXZWJMaW5rc0FkZG9uKCkpO1xuICAgIHRoaXMudGVybWluYWwubG9hZEFkZG9uKGluaXRSZW5kZXJlckFkZG9uKCkpO1xuXG4gICAgdGhpcy50ZXJtaW5hbC5vcGVuKHRoaXMudGVybWluYWxXcmFwcGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuc2V0VGhlbWUoKTtcbiAgICB0aGlzLmJpbmRDb3B5RXZlbnQoKTtcblxuICAgIHNldFdpbmRvd3NYdGVybVRvb2xzKHRoaXMudGVybWluYWwpO1xuICAgIHRoaXMudGVybWluYWxJbml0Lm5leHQodGhpcy50ZXJtaW5hbCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0WHRlcm0oKTtcblxuICAgIHRoaXMubG9ncyQuc3Vic2NyaWJlKGxvZ3MgPT4ge1xuICAgICAgdGhpcy5maXRBZGRvbi5maXQoKTtcbiAgICAgIHRoaXMud3JpdGUobG9ncywgKCkgPT4ge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy50ZXJtaW5hbC5zY3JvbGxUb0JvdHRvbSgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGVybWluYWwpIHtcbiAgICAgIHRoaXMudGVybWluYWwuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBjbGVhcldpbmRvd3NYdGVybVRvb2xzKCk7XG4gIH1cblxuICB3cml0ZShsb2dzOiBzdHJpbmcgfCBzdHJpbmdbXSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMudGVybWluYWw/LndyaXRlKSB7XG4gICAgICB0aGlzLnRlcm1pbmFsLmNsZWFyKCk7XG4gICAgICBBcnJheS5pc0FycmF5KGxvZ3MpXG4gICAgICAgID8gbG9ncy5mb3JFYWNoKHYgPT4gdGhpcy50ZXJtaW5hbC53cml0ZSh2LCBjYWxsYmFjaykpXG4gICAgICAgIDogdGhpcy50ZXJtaW5hbC53cml0ZShsb2dzIHx8ICcnLCBjYWxsYmFjayk7XG4gICAgfVxuICB9XG5cbiAgYmluZENvcHlFdmVudCgpIHtcbiAgICB0aGlzLnRlcm1pbmFsLmF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGUuY3RybEtleSAmJiBlLmtleT8udG9Mb3dlckNhc2UoKSA9PT0gJ2MnKSB7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBzZXRUaGVtZSh0aGVtZTogVGhlbWUgPSB0aGlzLnRoZW1lKSB7XG4gICAgaWYgKCF0aGlzLnRlcm1pbmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50ZXJtaW5hbC5vcHRpb25zLnRoZW1lID0gU0hFTExfVEhFTUVTW3RoZW1lXTtcbiAgfVxufVxuIl19