UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

179 lines 27.6 kB
import { Component, ElementRef, Input, ViewChild } from '@angular/core'; import { SchemaPrimitiveType } from '../schema/schema-models'; import { SchemaFormEditorUtilities } from './schema-form-editor-utilities'; import * as i0 from "@angular/core"; const _c0 = ["schemaTextEditor"]; export class SchemaFormEditorSchemaTextComponent { constructor() { this.strings = MsftSme.getStrings().MsftSmeShell.Angular.SchemaForm.Editor; this.isInitialized = false; } get schema() { return this.internalSchema; } set schema(value) { this.internalSchema = value; if (this.isInitialized) { this.refreshSchema(); } } ngOnInit() { this.timer = setInterval(() => { this.handleEditingSchemaTextHTMLChange(); }, 1500); this.isInitialized = true; } ngOnDestroy() { clearInterval(this.timer); } generateSchema() { let schema; const schemaTextEditorHTMLElement = this.schemaTextEditorElement.nativeElement; let text = schemaTextEditorHTMLElement.innerText; text = text.replace(/<SchemaObjectProperty>/g, '').replace(/<SchemaArrayProperty>/g, ''); for (const item in SchemaPrimitiveType) { if (isNaN(parseInt(SchemaPrimitiveType[item], 0))) { text = text.replace(new RegExp('SchemaPrimitiveType.' + SchemaPrimitiveType[item], 'g'), item); } } // The schema form editor is only available in debug mode, not in prod mode. // The security wise the following code should be fine. schema = (new Function('return ' + text.replace(/\n/g, '').replace(/\r/g, '')))(); return schema; } copySchemaToClipboard() { const schemaTextEditorHTMLElement = this.schemaTextEditorElement.nativeElement; let sel; let range; if (window.getSelection && document.createRange) { range = document.createRange(); range.selectNodeContents(schemaTextEditorHTMLElement); sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } else if (document.body['createTextRange']) { range = document.body['createTextRange'](); range.moveToElementText(schemaTextEditorHTMLElement); range.select(); } document.execCommand('copy'); } refreshSchema() { this.editingSchemaHTML = ''; this.editingSchemaHTML += this.convertDataToText(this.schema, 0); const schemaTextEditorHTMLElement = this.schemaTextEditorElement.nativeElement; schemaTextEditorHTMLElement.innerHTML = this.editingSchemaHTML; } convertDataToText(data, level) { let result = ''; switch (typeof data) { case 'number': case 'boolean': result += data; break; case 'string': result += '\'' + data.replace(/\'/g, '\\\'') + '\''; break; case 'object': if (Array.isArray(data)) { result += '['; for (let i = 0; i < data.length; i++) { if (i !== 0) { result += ','; } result += '<br/>'; result += SchemaFormEditorUtilities.getIndentText(level + 1) + this.convertDataToText(data[i], level + 1); } result += '<br/>'; result += SchemaFormEditorUtilities.getIndentText(level) + ']'; } else { result += this.getTypeScriptInterfaceForSchemaObject(data) + '{'; let isFirstProperty = true; for (const property in data) { if (data.hasOwnProperty(property) && !MsftSme.isNullOrUndefined(data[property]) && data[property] !== '') { if (!isFirstProperty) { result += ','; } result += '<br/>'; result += SchemaFormEditorUtilities.getIndentText(level + 1) + '<span class="property">' + property + '</span>: '; if (property === 'type') { result += 'SchemaPrimitiveType.' + SchemaPrimitiveType[data[property]]; } else { result += this.convertDataToText(data[property], level + 1); } isFirstProperty = false; } } result += '<br/>'; result += SchemaFormEditorUtilities.getIndentText(level) + '}'; break; } } return result; } getTypeScriptInterfaceForSchemaObject(object) { let propertyType = ''; if (object.type && object.type === SchemaPrimitiveType.Object) { propertyType = 'SchemaObjectProperty'; } else if (object.type && object.type === SchemaPrimitiveType.Array) { propertyType = 'SchemaArrayProperty'; } if (propertyType) { propertyType = '&lt;<span class="property-type">' + propertyType + '</span>&gt;'; } return propertyType; } handleEditingSchemaTextHTMLChange() { const schemaTextEditorHTMLElement = this.schemaTextEditorElement.nativeElement; this.editingSchemaHTML = schemaTextEditorHTMLElement.innerHTML; this.editingSchemaHTMLOld = this.editingSchemaHTML; } } /** @nocollapse */ SchemaFormEditorSchemaTextComponent.ɵfac = function SchemaFormEditorSchemaTextComponent_Factory(t) { return new (t || SchemaFormEditorSchemaTextComponent)(); }; /** @nocollapse */ SchemaFormEditorSchemaTextComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SchemaFormEditorSchemaTextComponent, selectors: [["sme-schema-form-editor-schema-text"]], viewQuery: function SchemaFormEditorSchemaTextComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.schemaTextEditorElement = _t.first); } }, inputs: { schema: "schema" }, decls: 15, vars: 4, consts: [[1, "sme-layout-absolute-phone-up", "sme-position-inset-none", "sme-arrange-stack-v"], [1, "sme-position-flex-none", "sme-padding-bottom-xxs"], [3, "click"], ["contenteditable", "true", 1, "syntax-editor", "sme-position-flex-auto", "sme-background-color-base", "sme-arrange-overflow-auto", "sme-font-label"], ["schemaTextEditor", ""], [1, "sme-position-none", "sme-padding-top-xxs"], [1, "sme-border-inset-sm", "sme-border-color-white-50", "sme-color-green", "sme-padding-inset-xxxs", "sme-padding-horizontal-sm"]], template: function SchemaFormEditorSchemaTextComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "p"); i0.ɵɵtext(3); i0.ɵɵelementEnd(); i0.ɵɵelementStart(4, "p"); i0.ɵɵtext(5); i0.ɵɵelementStart(6, "button", 2); i0.ɵɵlistener("click", function SchemaFormEditorSchemaTextComponent_Template_button_click_6_listener() { return ctx.copySchemaToClipboard(); }); i0.ɵɵtext(7); i0.ɵɵelementEnd()()(); i0.ɵɵelement(8, "div", 3, 4); i0.ɵɵelementStart(10, "div", 5)(11, "span"); i0.ɵɵtext(12); i0.ɵɵelementEnd(); i0.ɵɵelementStart(13, "span", 6); i0.ɵɵtext(14, "// tslint:disable:max-line-length"); i0.ɵɵelementEnd()()(); } if (rf & 2) { i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(ctx.strings.SchemaText.Message1); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1("", ctx.strings.SchemaText.Message2, " "); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx.strings.SchemaText.CopyToClipboardButton.Text); i0.ɵɵadvance(5); i0.ɵɵtextInterpolate(ctx.strings.SchemaText.LintMessage); } }, styles: ["[_nghost-%COMP%] .syntax-editor .property{color:#0000ca}[_nghost-%COMP%] .syntax-editor .property-type{color:green}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchemaFormEditorSchemaTextComponent, [{ type: Component, args: [{ selector: 'sme-schema-form-editor-schema-text', template: "<div class=\"sme-layout-absolute-phone-up sme-position-inset-none sme-arrange-stack-v\">\r\n <div class=\"sme-position-flex-none sme-padding-bottom-xxs\">\r\n <p>{{strings.SchemaText.Message1}}</p>\r\n <p>{{strings.SchemaText.Message2}}\r\n <button (click)=\"copySchemaToClipboard()\">{{strings.SchemaText.CopyToClipboardButton.Text}}</button>\r\n </p>\r\n </div>\r\n <div #schemaTextEditor contenteditable=\"true\" class=\"syntax-editor sme-position-flex-auto sme-background-color-base sme-arrange-overflow-auto sme-font-label\"></div>\r\n <div class=\"sme-position-none sme-padding-top-xxs\">\r\n <span>{{strings.SchemaText.LintMessage}}</span>\r\n <span class=\"sme-border-inset-sm sme-border-color-white-50 sme-color-green sme-padding-inset-xxxs sme-padding-horizontal-sm\">// tslint:disable:max-line-length</span>\r\n </div>\r\n</div>", styles: [":host::ng-deep .syntax-editor .property{color:#0000ca}:host::ng-deep .syntax-editor .property-type{color:green}\n"] }] }], null, { schemaTextEditorElement: [{ type: ViewChild, args: ['schemaTextEditor'] }], schema: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWZvcm0tZWRpdG9yLXNjaGVtYS10ZXh0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL3NjaGVtYS1mb3JtL3NjaGVtYS1mb3JtLWVkaXRvci1zY2hlbWEtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9zY2hlbWEtZm9ybS9zY2hlbWEtZm9ybS1lZGl0b3Itc2NoZW1hLXRleHQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0YsT0FBTyxFQUFjLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7OztBQU8zRSxNQUFNLE9BQU8sbUNBQW1DO0lBTGhEO1FBTVcsWUFBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFOUUsa0JBQWEsR0FBRyxLQUFLLENBQUM7S0FxSmpDO0lBM0lHLElBQ1csTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBaUI7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQ3BCLEdBQUcsRUFBRTtZQUNELElBQUksQ0FBQyxp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WUFBWSxHQUFHLGtDQUFrQyxHQUFHLFlBQVksR0FBRyxhQUFhLENBQUM7U0FDcEY7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRU8saUNBQWlDO1FBQ3JDLE1BQU0sMkJBQTJCLEdBQW1CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUM7UUFDL0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLDJCQUEyQixDQUFDLFNBQVMsQ0FBQztRQUMvRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ3ZELENBQUM7O3lJQXZKUSxtQ0FBbUM7cUhBQW5DLG1DQUFtQzs7Ozs7O1FDVmhELDhCQUFzRixhQUFBLFFBQUE7UUFFM0UsWUFBK0I7UUFBQSxpQkFBSTtRQUN0Qyx5QkFBRztRQUFBLFlBQ0M7UUFBQSxpQ0FBMEM7UUFBbEMsZ0hBQVMsMkJBQXVCLElBQUM7UUFBQyxZQUFpRDtRQUFBLGlCQUFTLEVBQUEsRUFBQTtRQUc1Ryw0QkFBb0s7UUFDcEssK0JBQW1ELFlBQUE7UUFDekMsYUFBa0M7UUFBQSxpQkFBTztRQUMvQyxnQ0FBNkg7UUFBQSxrREFBaUM7UUFBQSxpQkFBTyxFQUFBLEVBQUE7O1FBUmxLLGVBQStCO1FBQS9CLHFEQUErQjtRQUMvQixlQUNDO1FBREQsK0RBQ0M7UUFBMEMsZUFBaUQ7UUFBakQsdUVBQWlEO1FBS3pGLGVBQWtDO1FBQWxDLHdEQUFrQzs7dUZEQ25DLG1DQUFtQztjQUwvQyxTQUFTOzJCQUNJLG9DQUFvQztnQkFldEMsdUJBQXVCO2tCQUQ5QixTQUFTO21CQUFDLGtCQUFrQjtZQUlsQixNQUFNO2tCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdHJpbmdzIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3N0cmluZ3MnO1xyXG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBTY2hlbWFQcmltaXRpdmVUeXBlIH0gZnJvbSAnLi4vc2NoZW1hL3NjaGVtYS1tb2RlbHMnO1xyXG5pbXBvcnQgeyBTY2hlbWFGb3JtRWRpdG9yVXRpbGl0aWVzIH0gZnJvbSAnLi9zY2hlbWEtZm9ybS1lZGl0b3ItdXRpbGl0aWVzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtc2NoZW1hLWZvcm0tZWRpdG9yLXNjaGVtYS10ZXh0JyxcclxuICAgIHN0eWxlVXJsczogWycuL3NjaGVtYS1mb3JtLWVkaXRvci5jb21wb25lbnQuY3NzJ10sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2NoZW1hLWZvcm0tZWRpdG9yLXNjaGVtYS10ZXh0LmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2NoZW1hRm9ybUVkaXRvclNjaGVtYVRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgc3RyaW5ncyA9IE1zZnRTbWUuZ2V0U3RyaW5nczxTdHJpbmdzPigpLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLlNjaGVtYUZvcm0uRWRpdG9yO1xyXG5cclxuICAgIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSB0aW1lcjtcclxuICAgIHByaXZhdGUgaW50ZXJuYWxTY2hlbWE6IERhdGFTY2hlbWE7XHJcblxyXG4gICAgcHJpdmF0ZSBlZGl0aW5nU2NoZW1hSFRNTE9sZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBlZGl0aW5nU2NoZW1hSFRNTDogc3RyaW5nO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NjaGVtYVRleHRFZGl0b3InKVxyXG4gICAgcHJpdmF0ZSBzY2hlbWFUZXh0RWRpdG9yRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBzY2hlbWEoKTogRGF0YVNjaGVtYSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTY2hlbWE7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHNjaGVtYSh2YWx1ZTogRGF0YVNjaGVtYSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxTY2hlbWEgPSB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNjaGVtYSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVkaXRpbmdTY2hlbWFUZXh0SFRNTENoYW5nZSgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAxNTAwKTtcclxuICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZW5lcmF0ZVNjaGVtYSgpOiBEYXRhU2NoZW1hIHtcclxuICAgICAgICBsZXQgc2NoZW1hOiBEYXRhU2NoZW1hO1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYVRleHRFZGl0b3JIVE1MRWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD50aGlzLnNjaGVtYVRleHRFZGl0b3JFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHRleHQgPSBzY2hlbWFUZXh0RWRpdG9ySFRNTEVsZW1lbnQuaW5uZXJUZXh0O1xyXG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxTY2hlbWFPYmplY3RQcm9wZXJ0eT4vZywgJycpLnJlcGxhY2UoLzxTY2hlbWFBcnJheVByb3BlcnR5Pi9nLCAnJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIGluIFNjaGVtYVByaW1pdGl2ZVR5cGUpIHtcclxuICAgICAgICAgICAgaWYgKGlzTmFOKHBhcnNlSW50KFNjaGVtYVByaW1pdGl2ZVR5cGVbaXRlbV0sIDApKSkge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZShuZXcgUmVnRXhwKCdTY2hlbWFQcmltaXRpdmVUeXBlLicgKyBTY2hlbWFQcmltaXRpdmVUeXBlW2l0ZW1dLCAnZycpLCBpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGhlIHNjaGVtYSBmb3JtIGVkaXRvciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBkZWJ1ZyBtb2RlLCBub3QgaW4gcHJvZCBtb2RlLlxyXG4gICAgICAgIC8vIFRoZSBzZWN1cml0eSB3aXNlIHRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgYmUgZmluZS5cclxuICAgICAgICBzY2hlbWEgPSAobmV3IEZ1bmN0aW9uKCdyZXR1cm4gJyArIHRleHQucmVwbGFjZSgvXFxuL2csICcnKS5yZXBsYWNlKC9cXHIvZywgJycpKSkoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29weVNjaGVtYVRvQ2xpcGJvYXJkKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYVRleHRFZGl0b3JIVE1MRWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD50aGlzLnNjaGVtYVRleHRFZGl0b3JFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGxldCBzZWw7XHJcbiAgICAgICAgbGV0IHJhbmdlO1xyXG4gICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uICYmIGRvY3VtZW50LmNyZWF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHNjaGVtYVRleHRFZGl0b3JIVE1MRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keVsnY3JlYXRlVGV4dFJhbmdlJ10pIHtcclxuICAgICAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5ib2R5WydjcmVhdGVUZXh0UmFuZ2UnXSgpO1xyXG4gICAgICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChzY2hlbWFUZXh0RWRpdG9ySFRNTEVsZW1lbnQpO1xyXG4gICAgICAgICAgICByYW5nZS5zZWxlY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hTY2hlbWEoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nU2NoZW1hSFRNTCA9ICcnO1xyXG4gICAgICAgIHRoaXMuZWRpdGluZ1NjaGVtYUhUTUwgKz0gdGhpcy5jb252ZXJ0RGF0YVRvVGV4dCh0aGlzLnNjaGVtYSwgMCk7XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hVGV4dEVkaXRvckhUTUxFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PnRoaXMuc2NoZW1hVGV4dEVkaXRvckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBzY2hlbWFUZXh0RWRpdG9ySFRNTEVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5lZGl0aW5nU2NoZW1hSFRNTDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbnZlcnREYXRhVG9UZXh0KGRhdGE6IGFueSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBkYXRhKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFwnJyArIGRhdGEucmVwbGFjZSgvXFwnL2csICdcXFxcXFwnJykgKyAnXFwnJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1snO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzxici8+JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFNjaGVtYUZvcm1FZGl0b3JVdGlsaXRpZXMuZ2V0SW5kZW50VGV4dChsZXZlbCArIDEpICsgdGhpcy5jb252ZXJ0RGF0YVRvVGV4dChkYXRhW2ldLCBsZXZlbCArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzxici8+JztcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gU2NoZW1hRm9ybUVkaXRvclV0aWxpdGllcy5nZXRJbmRlbnRUZXh0KGxldmVsKSArICddJztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuZ2V0VHlwZVNjcmlwdEludGVyZmFjZUZvclNjaGVtYU9iamVjdChkYXRhKSArICd7JztcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXJzdFByb3BlcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmICFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKGRhdGFbcHJvcGVydHldKSAmJiBkYXRhW3Byb3BlcnR5XSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGaXJzdFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnPGJyLz4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IFNjaGVtYUZvcm1FZGl0b3JVdGlsaXRpZXMuZ2V0SW5kZW50VGV4dChsZXZlbCArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPHNwYW4gY2xhc3M9XCJwcm9wZXJ0eVwiPicgKyBwcm9wZXJ0eSArICc8L3NwYW4+OiAnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSAndHlwZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1NjaGVtYVByaW1pdGl2ZVR5cGUuJyArIFNjaGVtYVByaW1pdGl2ZVR5cGVbZGF0YVtwcm9wZXJ0eV1dO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy5jb252ZXJ0RGF0YVRvVGV4dChkYXRhW3Byb3BlcnR5XSwgbGV2ZWwgKyAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3RQcm9wZXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnPGJyLz4nO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTY2hlbWFGb3JtRWRpdG9yVXRpbGl0aWVzLmdldEluZGVudFRleHQobGV2ZWwpICsgJ30nO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFR5cGVTY3JpcHRJbnRlcmZhY2VGb3JTY2hlbWFPYmplY3Qob2JqZWN0OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBwcm9wZXJ0eVR5cGUgPSAnJztcclxuICAgICAgICBpZiAob2JqZWN0LnR5cGUgJiYgb2JqZWN0LnR5cGUgPT09IFNjaGVtYVByaW1pdGl2ZVR5cGUuT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIHByb3BlcnR5VHlwZSA9ICdTY2hlbWFPYmplY3RQcm9wZXJ0eSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvYmplY3QudHlwZSAmJiBvYmplY3QudHlwZSA9PT0gU2NoZW1hUHJpbWl0aXZlVHlwZS5BcnJheSkge1xyXG4gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSAnU2NoZW1hQXJyYXlQcm9wZXJ0eSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvcGVydHlUeXBlKSB7XHJcbiAgICAgICAgICAgIHByb3BlcnR5VHlwZSA9ICcmbHQ7PHNwYW4gY2xhc3M9XCJwcm9wZXJ0eS10eXBlXCI+JyArIHByb3BlcnR5VHlwZSArICc8L3NwYW4+Jmd0Oyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJvcGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlRWRpdGluZ1NjaGVtYVRleHRIVE1MQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYVRleHRFZGl0b3JIVE1MRWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD50aGlzLnNjaGVtYVRleHRFZGl0b3JFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nU2NoZW1hSFRNTCA9IHNjaGVtYVRleHRFZGl0b3JIVE1MRWxlbWVudC5pbm5lckhUTUw7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nU2NoZW1hSFRNTE9sZCA9IHRoaXMuZWRpdGluZ1NjaGVtYUhUTUw7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtYWJzb2x1dGUtcGhvbmUtdXAgc21lLXBvc2l0aW9uLWluc2V0LW5vbmUgc21lLWFycmFuZ2Utc3RhY2stdlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LW5vbmUgc21lLXBhZGRpbmctYm90dG9tLXh4c1wiPlxyXG4gICAgICAgIDxwPnt7c3RyaW5ncy5TY2hlbWFUZXh0Lk1lc3NhZ2UxfX08L3A+XHJcbiAgICAgICAgPHA+e3tzdHJpbmdzLlNjaGVtYVRleHQuTWVzc2FnZTJ9fVxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjb3B5U2NoZW1hVG9DbGlwYm9hcmQoKVwiPnt7c3RyaW5ncy5TY2hlbWFUZXh0LkNvcHlUb0NsaXBib2FyZEJ1dHRvbi5UZXh0fX08L2J1dHRvbj5cclxuICAgICAgICA8L3A+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgI3NjaGVtYVRleHRFZGl0b3IgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIGNsYXNzPVwic3ludGF4LWVkaXRvciBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHNtZS1iYWNrZ3JvdW5kLWNvbG9yLWJhc2Ugc21lLWFycmFuZ2Utb3ZlcmZsb3ctYXV0byBzbWUtZm9udC1sYWJlbFwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1wb3NpdGlvbi1ub25lIHNtZS1wYWRkaW5nLXRvcC14eHNcIj5cclxuICAgICAgICA8c3Bhbj57e3N0cmluZ3MuU2NoZW1hVGV4dC5MaW50TWVzc2FnZX19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWJvcmRlci1pbnNldC1zbSBzbWUtYm9yZGVyLWNvbG9yLXdoaXRlLTUwIHNtZS1jb2xvci1ncmVlbiBzbWUtcGFkZGluZy1pbnNldC14eHhzIHNtZS1wYWRkaW5nLWhvcml6b250YWwtc21cIj4vLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGg8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19