UNPKG

@dotglitch/ngx-common

Version:

Angular components and utilities that are commonly used.

232 lines 29 kB
import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core'; import { MonacoAutoTypeImporter } from './ts-type-resolver/main'; import { debounceTime } from 'rxjs'; import * as i0 from "@angular/core"; let Monaco; export class VscodeComponent { set code(value) { if (value == this._code) return; if (typeof value != "string") throw new TypeError("Value must be of type string"); this._code = value; this.editor?.setValue(this.code); } ; get code() { return this._code?.trim(); } set language(value) { this._language = { 'ts': "typescript", 'html': 'xml', 'scss': 'css' }[value] || value || "auto"; } get language() { return this._language; } get settings() { return { ...this.restSettings, theme: this.theme, language: this.language, tabSize: this.tabSize, readOnly: this.readOnly, fontFamily: this.fontFamily, fontSize: this.fontSize, automaticLayout: this.automaticLayout, scrollBeyondLastLine: this.scrollBeyondLastLine, colorDecorators: this.colorDecorators, folding: this.folding, scrollBeyondLastColumn: this.scrollBeyondLastColumn, minimap: this.minimap, scrollbar: this.scrollbar, smoothScrolling: this.smoothScrolling, mouseWheelScrollSensitivity: this.mouseWheelScrollSensitivity, lineNumbers: this.lineNumbers }; } constructor(viewContainer) { this.viewContainer = viewContainer; this.isDirty = false; this.codeChange = new EventEmitter(); this.onCodeType = new EventEmitter(); this.typeDebounce = this.onCodeType.pipe(debounceTime(100)); this.installationLocation = "/lib/monaco/vs"; this.tabSize = 2; this.readOnly = false; this.theme = "vs-dark"; this.fontFamily = "Droid Sans Mono"; this.fontSize = 14; this.automaticLayout = true; this.colorDecorators = true; this.folding = true; this.minimapEnabled = true; this.minimap = { enabled: true }; this.scrollbar = { alwaysConsumeMouseWheel: false, // scrollByPage: true }; this.smoothScrolling = true; this.mouseWheelScrollSensitivity = 2; this.scrollBeyondLastLine = false; this.scrollBeyondLastColumn = 0; this.lineNumbers = "on"; this.restSettings = {}; this.resize = () => { this.editor?.layout(); }; InstallMonacoUMD(this.installationLocation); this._sub = this.typeDebounce.subscribe(t => { this.codeChange.next(this._code = this.editor.getValue()); }); } ngOnChanges(changes) { // If we changed anything OTHER than code, reload the editor if (Object.keys(changes).length > 1 || !changes['code']) { if (this.editor) { this.editor?.dispose(); this.createEditor(); } } if (changes['theme']) window['monaco']?.editor.setTheme(this.theme); } async ngAfterViewInit() { await InstallMonacoUMD(); this.createEditor(); } ngOnDestroy() { this.editor?.dispose(); this._sub?.unsubscribe(); } createEditor() { if (this.customLanguage) { this.customLanguage.init(window['monaco']); } let editor = this.editor = window['monaco'].editor.create(this.viewContainer?.element?.nativeElement, this.settings); // const autoTypings = await MonacoAutoTypeImporter.create(editor, { monaco: Monaco, }); this.configureLanguageSupport(); if (this.code) { editor.setValue(this.code); } editor.getModel().onDidChangeContent(() => this.onCodeType.emit()); } configureLanguageSupport() { } download() { const code = this.editor.getValue(); let blob = new Blob([code], { type: 'text/log' }); let elm = document.createElement('a'); let blobURL = URL.createObjectURL(blob); // Set the data values. elm.href = blobURL; elm.download = this.filename; document.body.appendChild(elm); elm.click(); document.body.removeChild(elm); elm.remove(); URL.revokeObjectURL(blobURL); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: VscodeComponent, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: VscodeComponent, isStandalone: true, selector: "app-vscode", inputs: { code: "code", customLanguage: "customLanguage", language: "language", installationLocation: "installationLocation", tabSize: "tabSize", readOnly: "readOnly", theme: "theme", fontFamily: "fontFamily", fontSize: "fontSize", automaticLayout: "automaticLayout", colorDecorators: "colorDecorators", folding: "folding", minimapEnabled: "minimapEnabled", minimap: "minimap", scrollbar: "scrollbar", smoothScrolling: "smoothScrolling", mouseWheelScrollSensitivity: "mouseWheelScrollSensitivity", scrollBeyondLastLine: "scrollBeyondLastLine", scrollBeyondLastColumn: "scrollBeyondLastColumn", lineNumbers: "lineNumbers", restSettings: "restSettings" }, outputs: { codeChange: "codeChange" }, host: { listeners: { "window:resize": "resize($event)" } }, usesOnChanges: true, ngImport: i0, template: '', isInline: true, styles: [":host{display:block;height:100%;max-height:100vh;max-width:100vw}\n"] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: VscodeComponent, decorators: [{ type: Component, args: [{ selector: 'app-vscode', template: '', standalone: true, styles: [":host{display:block;height:100%;max-height:100vh;max-width:100vw}\n"] }] }], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { code: [{ type: Input }], codeChange: [{ type: Output }], customLanguage: [{ type: Input }], language: [{ type: Input }], installationLocation: [{ type: Input }], tabSize: [{ type: Input }], readOnly: [{ type: Input }], theme: [{ type: Input }], fontFamily: [{ type: Input }], fontSize: [{ type: Input }], automaticLayout: [{ type: Input }], colorDecorators: [{ type: Input }], folding: [{ type: Input }], minimapEnabled: [{ type: Input }], minimap: [{ type: Input }], scrollbar: [{ type: Input }], smoothScrolling: [{ type: Input }], mouseWheelScrollSensitivity: [{ type: Input }], scrollBeyondLastLine: [{ type: Input }], scrollBeyondLastColumn: [{ type: Input }], lineNumbers: [{ type: Input }], restSettings: [{ type: Input }], resize: [{ type: HostListener, args: ['window:resize', ['$event']] }] } }); export const InstallMonacoUMD = async (path) => { if (window['monaco']) return window['monaco']; // Prevent duplicate injection const scriptEls = document.querySelectorAll('body>script[monaco][defer][src]'); // Only perform installation if a path is specified. if (path && scriptEls.length == 0) { // Monaco has a UMD loader that requires this // Merge with any pre-existing global require objects. if (!window['require']) window['require'] = {}; if (!window['require']['paths']) window['require']['paths'] = {}; if (path.endsWith('/')) path = path.slice(0, -1); window['require']['paths'].vs = path; const monacoFiles = [ 'loader.js', 'editor/editor.main.nls.js', 'editor/editor.main.js', ]; for (let i = 0; i < monacoFiles.length; i++) { const script = document.createElement("script"); script.setAttribute("monaco", ""); script.setAttribute("defer", ""); script.setAttribute("src", path + '/' + monacoFiles[i]); document.body.append(script); } } // Return a promise that will resolve when monaco finishes loading return await new Promise((res, rej) => { let count = 0; let i = window.setInterval(() => { count++; if (window['monaco'] != undefined) { window.clearInterval(i); res(true); } else if (count >= 100) { window.clearInterval(i); res(false); } }, 100); }); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy92c2NvZGUvdnNjb2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQThDLE1BQU0sZUFBZSxDQUFDO0FBRzNKLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRXBDLElBQUksTUFBMkIsQ0FBQztBQWVoQyxNQUFNLE9BQU8sZUFBZTtJQU14QixJQUFhLElBQUksQ0FBQyxLQUFhO1FBQzNCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ25CLE9BQU87UUFDWCxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVE7WUFDeEIsTUFBTSxJQUFJLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQUEsQ0FBQztJQUNGLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFTeEMsSUFBYSxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2IsSUFBSSxFQUFFLFlBQVk7WUFDbEIsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUE7SUFDL0IsQ0FBQztJQUNELElBQUksUUFBUSxL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LEdBQUcsRUFBRTtZQUM1QixLQUFLLEVBQUUsQ0FBQztZQUVSLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxDQUFDO2lCQUNJLElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0ICogYXMgTW9uYWNvRWRpdG9yIGZyb20gJ21vbmFjby1lZGl0b3InO1xyXG5pbXBvcnQgeyBNb25hY29BdXRvVHlwZUltcG9ydGVyIH0gZnJvbSAnLi90cy10eXBlLXJlc29sdmVyL21haW4nO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzJztcclxuXHJcbmxldCBNb25hY286IHR5cGVvZiBNb25hY29FZGl0b3I7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLXZzY29kZScsXHJcbiAgICB0ZW1wbGF0ZTogJycsXHJcbiAgICBzdHlsZXM6IFtgXHJcbjpob3N0IHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWF4LWhlaWdodDogMTAwdmg7XHJcbiAgICBtYXgtd2lkdGg6IDEwMHZ3O1xyXG59XHJcbiAgICBgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIFZzY29kZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgICBpc0RpcnR5ID0gZmFsc2U7XHJcbiAgICBlZGl0b3I6IE1vbmFjb0VkaXRvci5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xyXG4gICAgZmlsZW5hbWU6IHN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIF9jb2RlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBzZXQgY29kZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IHRoaXMuX2NvZGUpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJWYWx1ZSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nXCIpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb2RlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5lZGl0b3I/LnNldFZhbHVlKHRoaXMuY29kZSk7XHJcbiAgICB9O1xyXG4gICAgZ2V0IGNvZGUoKSB7IHJldHVybiB0aGlzLl9jb2RlPy50cmltKCkgfVxyXG4gICAgQE91dHB1dCgpIGNvZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgb25Db2RlVHlwZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSB0eXBlRGVib3VuY2UgPSB0aGlzLm9uQ29kZVR5cGUucGlwZShkZWJvdW5jZVRpbWUoMTAwKSk7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tTGFuZ3VhZ2U6IHsgaW5pdDogRnVuY3Rpb247IH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgX2xhbmd1YWdlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBzZXQgbGFuZ3VhZ2UodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX2xhbmd1YWdlID0ge1xyXG4gICAgICAgICAgICAndHMnOiBcInR5cGVzY3JpcHRcIixcclxuICAgICAgICAgICAgJ2h0bWwnOiAneG1sJyxcclxuICAgICAgICAgICAgJ3Njc3MnOiAnY3NzJ1xyXG4gICAgICAgIH1bdmFsdWVdIHx8IHZhbHVlIHx8IFwiYXV0b1wiXHJcbiAgICB9XHJcbiAgICBnZXQgbGFuZ3VhZ2UoKSB7IHJldHVybiB0aGlzLl9sYW5ndWFnZSB9XHJcblxyXG4gICAgQElucHV0KCkgaW5zdGFsbGF0aW9uTG9jYXRpb24gPSBcIi9saWIvbW9uYWNvL3ZzXCI7XHJcblxyXG5cclxuICAgIEBJbnB1dCgpIHRhYlNpemUgPSAyO1xyXG4gICAgQElucHV0KCkgcmVhZE9ubHkgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHRoZW1lID0gXCJ2cy1kYXJrXCI7XHJcbiAgICBASW5wdXQoKSBmb250RmFtaWx5ID0gXCJEcm9pZCBTYW5zIE1vbm9cIjtcclxuICAgIEBJbnB1dCgpIGZvbnRTaXplID0gMTQ7XHJcblxyXG4gICAgQElucHV0KCkgYXV0b21hdGljTGF5b3V0ID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGNvbG9yRGVjb3JhdG9ycyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBmb2xkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBtaW5pbWFwRW5hYmxlZCA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBtaW5pbWFwOiBNb25hY29FZGl0b3IuZWRpdG9yLklFZGl0b3JNaW5pbWFwT3B0aW9ucyA9IHtcclxuICAgICAgICBlbmFibGVkOiB0cnVlXHJcbiAgICB9O1xyXG4gICAgQElucHV0KCkgc2Nyb2xsYmFyOiBNb25hY29FZGl0b3IuZWRpdG9yLklFZGl0b3JTY3JvbGxiYXJPcHRpb25zID0ge1xyXG4gICAgICAgIGFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsOiBmYWxzZSxcclxuICAgICAgICAvLyBzY3JvbGxCeVBhZ2U6IHRydWVcclxuICAgIH07XHJcbiAgICBASW5wdXQoKSBzbW9vdGhTY3JvbGxpbmcgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgbW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5ID0gMjtcclxuICAgIEBJbnB1dCgpIHNjcm9sbEJleW9uZExhc3RMaW5lID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBzY3JvbGxCZXlvbmRMYXN0Q29sdW1uID0gMDtcclxuXHJcbiAgICBASW5wdXQoKSBsaW5lTnVtYmVyczogTW9uYWNvRWRpdG9yLmVkaXRvci5MaW5lTnVtYmVyc1R5cGUgPSBcIm9uXCI7XHJcblxyXG4gICAgQElucHV0KCkgcmVzdFNldHRpbmdzOiBNb25hY29FZGl0b3IuZWRpdG9yLklTdGFuZGFsb25lRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHt9O1xyXG5cclxuICAgIGdldCBzZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnJlc3RTZXR0aW5ncyxcclxuICAgICAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXHJcbiAgICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxyXG4gICAgICAgICAgICB0YWJTaXplOiB0aGlzLnRhYlNpemUsXHJcbiAgICAgICAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRPbmx5LFxyXG4gICAgICAgICAgICBmb250RmFtaWx5OiB0aGlzLmZvbnRGYW1pbHksXHJcbiAgICAgICAgICAgIGZvbnRTaXplOiB0aGlzLmZvbnRTaXplLFxyXG4gICAgICAgICAgICBhdXRvbWF0aWNMYXlvdXQ6IHRoaXMuYXV0b21hdGljTGF5b3V0LFxyXG4gICAgICAgICAgICBzY3JvbGxCZXlvbmRMYXN0TGluZTogdGhpcy5zY3JvbGxCZXlvbmRMYXN0TGluZSxcclxuICAgICAgICAgICAgY29sb3JEZWNvcmF0b3JzOiB0aGlzLmNvbG9yRGVjb3JhdG9ycyxcclxuICAgICAgICAgICAgZm9sZGluZzogdGhpcy5mb2xkaW5nLFxyXG4gICAgICAgICAgICBzY3JvbGxCZXlvbmRMYXN0Q29sdW1uOiB0aGlzLnNjcm9sbEJleW9uZExhc3RDb2x1bW4sXHJcbiAgICAgICAgICAgIG1pbmltYXA6IHRoaXMubWluaW1hcCxcclxuICAgICAgICAgICAgc2Nyb2xsYmFyOiB0aGlzLnNjcm9sbGJhcixcclxuICAgICAgICAgICAgc21vb3RoU2Nyb2xsaW5nOiB0aGlzLnNtb290aFNjcm9sbGluZyxcclxuICAgICAgICAgICAgbW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5OiB0aGlzLm1vdXNlV2hlZWxTY3JvbGxTZW5zaXRpdml0eSxcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRoaXMubGluZU51bWJlcnNcclxuICAgICAgICB9IGFzIE1vbmFjb0VkaXRvci5lZGl0b3IuSVN0YW5kYWxvbmVFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N1YjtcclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICAgIEluc3RhbGxNb25hY29VTUQodGhpcy5pbnN0YWxsYXRpb25Mb2NhdGlvbik7XHJcblxyXG4gICAgICAgIHRoaXMuX3N1YiA9IHRoaXMudHlwZURlYm91bmNlLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jb2RlQ2hhbmdlLm5leHQodGhpcy5fY29kZSA9IHRoaXMuZWRpdG9yLmdldFZhbHVlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICAvLyBJZiB3ZSBjaGFuZ2VkIGFueXRoaW5nIE9USEVSIHRoYW4gY29kZSwgcmVsb2FkIHRoZSBlZGl0b3JcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoID4gMSB8fCAhY2hhbmdlc1snY29kZSddKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3I/LmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlRWRpdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3RoZW1lJ10pXHJcbiAgICAgICAgICAgIHdpbmRvd1snbW9uYWNvJ10/LmVkaXRvci5zZXRUaGVtZSh0aGlzLnRoZW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgYXdhaXQgSW5zdGFsbE1vbmFjb1VNRCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwb3NlKCk7XHJcbiAgICAgICAgdGhpcy5fc3ViPy51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlRWRpdG9yKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUxhbmd1YWdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tTGFuZ3VhZ2UuaW5pdCh3aW5kb3dbJ21vbmFjbyddKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBlZGl0b3IgPSB0aGlzLmVkaXRvciA9IHdpbmRvd1snbW9uYWNvJ10uZWRpdG9yLmNyZWF0ZShcclxuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzIGFzIGFueVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IGF1dG9UeXBpbmdzID0gYXdhaXRcclxuICAgICAgICBNb25hY29BdXRvVHlwZUltcG9ydGVyLmNyZWF0ZShlZGl0b3IsIHtcclxuICAgICAgICAgICAgbW9uYWNvOiBNb25hY28sXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlndXJlTGFuZ3VhZ2VTdXBwb3J0KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvZGUpIHtcclxuICAgICAgICAgICAgZWRpdG9yLnNldFZhbHVlKHRoaXMuY29kZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZGl0b3IuZ2V0TW9kZWwoKS5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4gdGhpcy5vbkNvZGVUeXBlLmVtaXQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maWd1cmVMYW5ndWFnZVN1cHBvcnQoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkKCkge1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpO1xyXG5cclxuICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtjb2RlXSwgeyB0eXBlOiAndGV4dC9sb2cnIH0pO1xyXG4gICAgICAgIGxldCBlbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgbGV0IGJsb2JVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIGRhdGEgdmFsdWVzLlxyXG4gICAgICAgIGVsbS5ocmVmID0gYmxvYlVSTDtcclxuICAgICAgICBlbG0uZG93bmxvYWQgPSB0aGlzLmZpbGVuYW1lO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsbSk7XHJcbiAgICAgICAgZWxtLmNsaWNrKCk7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxtKTtcclxuICAgICAgICBlbG0ucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgICByZXNpemUgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3I/LmxheW91dCgpO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEluc3RhbGxNb25hY29VTUQgPSBhc3luYyAocGF0aD86IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKHdpbmRvd1snbW9uYWNvJ10pIHJldHVybiB3aW5kb3dbJ21vbmFjbyddO1xyXG5cclxuICAgIC8vIFByZXZlbnQgZHVwbGljYXRlIGluamVjdGlvblxyXG4gICAgY29uc3Qgc2NyaXB0RWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keT5zY3JpcHRbbW9uYWNvXVtkZWZlcl1bc3JjXScpO1xyXG5cclxuICAgIC8vIE9ubHkgcGVyZm9ybSBpbnN0YWxsYXRpb24gaWYgYSBwYXRoIGlzIHNwZWNpZmllZC5cclxuICAgIGlmIChwYXRoICYmIHNjcmlwdEVscy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgIC8vIE1vbmFjbyBoYXMgYSBVTUQgbG9hZGVyIHRoYXQgcmVxdWlyZXMgdGhpc1xyXG4gICAgICAgIC8vIE1lcmdlIHdpdGggYW55IHByZS1leGlzdGluZyBnbG9iYWwgcmVxdWlyZSBvYmplY3RzLlxyXG4gICAgICAgIGlmICghd2luZG93WydyZXF1aXJlJ10pIHdpbmRvd1sncmVxdWlyZSddID0ge30gYXMgYW55O1xyXG4gICAgICAgIGlmICghd2luZG93WydyZXF1aXJlJ11bJ3BhdGhzJ10pIHdpbmRvd1sncmVxdWlyZSddWydwYXRocyddID0ge307XHJcblxyXG4gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCcvJykpXHJcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcclxuXHJcbiAgICAgICAgd2luZG93WydyZXF1aXJlJ11bJ3BhdGhzJ10udnMgPSBwYXRoO1xyXG5cclxuICAgICAgICBjb25zdCBtb25hY29GaWxlcyA9IFtcclxuICAgICAgICAgICAgJ2xvYWRlci5qcycsXHJcbiAgICAgICAgICAgICdlZGl0b3IvZWRpdG9yLm1haW4ubmxzLmpzJyxcclxuICAgICAgICAgICAgJ2VkaXRvci9lZGl0b3IubWFpbi5qcycsXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb25hY29GaWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG4gICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKFwibW9uYWNvXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKFwiZGVmZXJcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgcGF0aCArICcvJyArIG1vbmFjb0ZpbGVzW2ldKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2NyaXB0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIGEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aGVuIG1vbmFjbyBmaW5pc2hlcyBsb2FkaW5nXHJcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgICBsZXQgaSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvdW50Kys7XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93Wydtb25hY28nXSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGkpO1xyXG4gICAgICAgICAgICAgICAgcmVzKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID49IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoaSk7XHJcbiAgICAgICAgICAgICAgICByZXMoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMTAwKTtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==