UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

389 lines 54.6 kB
import { __decorate, __metadata } from "tslib"; import { CodeEditorModule, MonacoLanguageService, } from '@alauda/code-editor'; import { CARD_MODULE, CHECKBOX_MODULE, ButtonModule, IconModule, TooltipModule, } from '@alauda/ui'; import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, forwardRef, } from '@angular/core'; import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms'; import { yamlDefaults } from 'monaco-yaml'; import { BehaviorSubject, combineLatest, Observable, map, distinctUntilChanged, of, switchMap, shareReplay, takeUntil, Subject, } from 'rxjs'; import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service'; import { YamlUtilService } from '../../core/services/yaml-util.service'; import { ObservableInput, publishRef, parseAll, stringify, } from '../../core/utils/public-api'; import { TRANSLATE_MODULE } from '../../translate/translate.module'; import { updateActions, yamlWriteMinimapOptions } from '../code-editor-configs'; import { foldManagedFields, } from '../managed-fields-folder.util'; import { ResourceYamlSidebarComponent } from '../yaml-sidebar/component'; import * as i0 from "@angular/core"; import * as i1 from "../../core/services/yaml-util.service"; import * as i2 from "../../core/services/kubernetes-schema.service"; import * as i3 from "@alauda/code-editor"; import * as i4 from "@alauda/ui"; import * as i5 from "@angular/forms"; import * as i6 from "../../translate/translate.pipe"; const _c0 = ["codeEditor"]; function ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainer(0); } } function ResourceYamlEditorComponent_aui_card_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "aui-card"); i0.ɵɵtemplate(1, ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template, 1, 0, "ng-container", 3); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵnextContext(); const content_r1 = i0.ɵɵreference(2); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", content_r1); } } function ResourceYamlEditorComponent_ng_template_1_button_6_Template(rf, ctx) { if (rf & 1) { const _r4 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 10); i0.ɵɵpipe(1, "async"); i0.ɵɵpipe(2, "async"); i0.ɵɵpipe(3, "translate"); i0.ɵɵlistener("click", function ResourceYamlEditorComponent_ng_template_1_button_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); }); i0.ɵɵelement(4, "aui-icon", 11); i0.ɵɵpipe(5, "async"); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵnextContext(); const codeEditor_r5 = i0.ɵɵreference(4); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵproperty("hidden", !!codeEditor_r5.fullscreenDialog)("disabled", !i0.ɵɵpipeBind1(1, 4, ctx_r2.finalSchema$))("auiTooltip", i0.ɵɵpipeBind1(3, 8, i0.ɵɵpipeBind1(2, 6, ctx_r2.showSidebar$$) ? "hide_sidebar" : "view_sidebar")); i0.ɵɵadvance(4); i0.ɵɵproperty("icon", i0.ɵɵpipeBind1(5, 10, ctx_r2.showSidebar$$) ? "prod:expand_sidebar" : "prod:collapse_sidebar"); } } function ResourceYamlEditorComponent_ng_template_1_div_8_Template(rf, ctx) { if (rf & 1) { const _r6 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 12)(1, "acl-resource-yaml-sidebar", 13); i0.ɵɵpipe(2, "async"); i0.ɵɵlistener("close", function ResourceYamlEditorComponent_ng_template_1_div_8_Template_acl_resource_yaml_sidebar_close_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); })("tryYaml", function ResourceYamlEditorComponent_ng_template_1_div_8_Template_acl_resource_yaml_sidebar_tryYaml_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onTryYaml($event)); }); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵproperty("resource", ctx_r2.getCurrentResource())("schema", i0.ɵɵpipeBind1(2, 5, ctx_r2.finalSchema$))("schemaEnable", ctx_r2.schemaEnable)("exampleEnable", ctx_r2.exampleEnable)("extraExamples", ctx_r2.extraExamples); } } function ResourceYamlEditorComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) { const _r2 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 4); i0.ɵɵpipe(1, "async"); i0.ɵɵelementStart(2, "div", 5)(3, "aui-code-editor", 6, 1); i0.ɵɵtwoWayListener("ngModelChange", function ResourceYamlEditorComponent_ng_template_1_Template_aui_code_editor_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.value, $event) || (ctx_r2.value = $event); return i0.ɵɵresetView($event); }); i0.ɵɵelementContainerStart(5, 7); i0.ɵɵtemplate(6, ResourceYamlEditorComponent_ng_template_1_button_6_Template, 6, 12, "button", 8); i0.ɵɵpipe(7, "async"); i0.ɵɵelementContainerEnd(); i0.ɵɵelementEnd()(); i0.ɵɵtemplate(8, ResourceYamlEditorComponent_ng_template_1_div_8_Template, 3, 7, "div", 9); i0.ɵɵpipe(9, "async"); i0.ɵɵpipe(10, "async"); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵclassProp("with-sidebar", i0.ɵɵpipeBind1(1, 9, ctx_r2.showSidebar$$)); i0.ɵɵadvance(3); i0.ɵɵproperty("originalValue", ctx_r2.originalValue); i0.ɵɵtwoWayProperty("ngModel", ctx_r2.value); i0.ɵɵproperty("options", ctx_r2.options)("actionsConfig", ctx_r2.actionsConfig)("modelUri", ctx_r2.modelUri); i0.ɵɵadvance(3); i0.ɵɵproperty("ngIf", ctx_r2.sidebarEnable && !!i0.ɵɵpipeBind1(7, 11, ctx_r2.resource$)); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(9, 13, ctx_r2.showSidebar$$) && i0.ɵɵpipeBind1(10, 15, ctx_r2.resource$)); } } export class ResourceYamlEditorComponent { set originalValue(value) { this._originalValue = value || ''; } get originalValue() { return this._originalValue; } constructor(yamlUtil, schemaService, monacoLanguageService) { this.yamlUtil = yamlUtil; this.schemaService = schemaService; this.monacoLanguageService = monacoLanguageService; this.destroy$ = new Subject(); this._value = ''; this._originalValue = ''; this.onChange = (_value) => { // Placeholder for form control change callback }; this.onTouched = () => { // Placeholder for form control touched callback }; this.showSidebar$$ = new BehaviorSubject(true); this.showDebugPanel$$ = new BehaviorSubject(true); this.monacoEditor = null; this.registeredSchemas = new Set(); this.hasWrapper = true; this.showDebugInfo = false; this.sidebarEnable = true; this.schemaEnable = true; this.exampleEnable = true; this.autoFoldManagedFields = true; this.options = yamlWriteMinimapOptions; this.actionsConfig = updateActions; this.tryYaml = new EventEmitter(); this.autoFillNamespace = true; this.hasFolded = false; /** * 自动获取的 schema,当没有手动提供 schema 时使用 */ this.autoSchema$ = this.resource$.pipe(switchMap(resource => { if (!resource) { return of(null); } const firstResource = (Array.isArray(resource) ? resource[0] : resource); if (!firstResource?.apiVersion || !firstResource?.kind) { return of(null); } return this.schemaService.getResourceSchema(firstResource.apiVersion, firstResource.kind); }), publishRef()); /** * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的 */ this.finalSchema$ = combineLatest([this.schema$, this.autoSchema$]).pipe(map(([manualSchema, autoSchema]) => manualSchema || autoSchema), distinctUntilChanged(), shareReplay(1)); this.yamlSchemaService = this.monacoLanguageService.getLanguageSchemaService(['yaml', 'yamlDefaults'], yamlDefaults); // 自动设置 schema combineLatest([this.resource$, this.finalSchema$]) .pipe(takeUntil(this.destroy$)) .subscribe(([resource, schema]) => { if (resource && schema) { const firstResource = Array.isArray(resource) ? resource[0] : resource; if (firstResource && !Array.isArray(firstResource)) { this.setYamlSchema(firstResource, schema); } } }); this.autoSchema$.pipe(takeUntil(this.destroy$)).subscribe(); } ngAfterViewInit() { // 监听 YAML 内容变化,自动折叠 managedFields if (this.autoFoldManagedFields && this.schemaService.definitions) { this.selfFoldManagedFields(); } } selfFoldManagedFields() { if (this.hasFolded) { return; } this.hasFolded = true; setTimeout(() => { const editor = this.getEditorInstance(); if (editor) { foldManagedFields(editor); } }, 0); } get value() { return this._value; } set value(val) { this._value = val; this.onChange(val); this.onTouched(); } // ControlValueAccessor implementation writeValue(value) { this._value = value || ''; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } toggleSidebar() { this.showSidebar$$.next(!this.showSidebar$$.value); } toggleDebugInfo() { this.showDebugPanel$$.next(!this.showDebugPanel$$.value); } getCurrentResource() { const resource = this.resource; if (Array.isArray(resource)) { return resource.length > 0 ? resource[0] : null; } return resource || null; } getCurrentSchema() { return this.schema || null; } getDebugInfo() { const resource = this.getCurrentResource(); return { hasResource: !!resource, resourceApiVersion: resource?.apiVersion, resourceKind: resource?.kind, hasManualSchema: !!this.schema, workspaceHelperAvailable: this.schemaService.isWorkspaceHelperAvailable(), currentWorkspace: this.schemaService.workspaceHelper?.baseParamsSnapshot, }; } onTryYaml(yamlContent) { let targetYaml = yamlContent; const namespace = this.schemaService.workspaceHelper?.baseParamsSnapshot?.namespace; if (this.autoFillNamespace && namespace) { targetYaml = parseAll(yamlContent) .filter(r => !!r) .map((r) => { if (!r?.metadata?.namespace) { return { ...r, metadata: { ...r.metadata, namespace, }, }; } return r; }) .map(r => stringify(r, { sortMapEntries: true })) .join('---\r\n'); } this.tryYaml.emit(targetYaml); } /** * 设置 YAML schema 以提供 hover 提示和自动完成 */ setYamlSchema(resource, schema) { if (!schema) { return; } // 使用 apiVersion + kind 组合作为标识 const apiVersion = resource?.apiVersion || 'unknown'; const kind = resource?.kind || 'unknown'; const schemaKey = `${apiVersion}/${kind}`; this.modelUri = `${schemaKey}.yaml`; this.selfFoldManagedFields(); // 检查是否已经注册过相同的 schema,避免重复注册 if (this.registeredSchemas.has(schemaKey)) { return; } // 获取完整的 definitions 以支持 $ref 引用 const definitions = this.schemaService.definitions || {}; // 创建包含完整 definitions 的 schema 对象 const fullSchema = { ...schema, definitions, }; // 确保schema被正确注册,并启用自动完成功能 this.yamlSchemaService.addSchema({ uri: `k8s://${schemaKey}.schema.json`, fileMatch: [this.modelUri], schema: fullSchema, }); this.registeredSchemas.add(schemaKey); } /** * 获取 Monaco 编辑器实例 */ getEditorInstance() { if (!this.monacoEditor && this.codeEditorRef?.editor) { this.monacoEditor = this.codeEditorRef.editor; } return this.monacoEditor; } /** * 手动折叠 managedFields */ foldManagedFields() { const editor = this.getEditorInstance(); if (editor) { foldManagedFields(editor); } } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } static { this.ɵfac = function ResourceYamlEditorComponent_Factory(t) { return new (t || ResourceYamlEditorComponent)(i0.ɵɵdirectiveInject(i1.YamlUtilService), i0.ɵɵdirectiveInject(i2.KubernetesSchemaService), i0.ɵɵdirectiveInject(i3.MonacoLanguageService)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceYamlEditorComponent, selectors: [["acl-resource-yaml-editor"]], viewQuery: function ResourceYamlEditorComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditorRef = _t.first); } }, inputs: { hasWrapper: "hasWrapper", showDebugInfo: "showDebugInfo", sidebarEnable: "sidebarEnable", schema: "schema", schemaEnable: "schemaEnable", exampleEnable: "exampleEnable", resource: "resource", autoFoldManagedFields: "autoFoldManagedFields", originalValue: "originalValue", options: "options", actionsConfig: "actionsConfig", autoFillNamespace: "autoFillNamespace", extraExamples: "extraExamples" }, outputs: { tryYaml: "tryYaml" }, standalone: true, features: [i0.ɵɵProvidersFeature([ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ResourceYamlEditorComponent), multi: true, }, ]), i0.ɵɵStandaloneFeature], decls: 3, vars: 2, consts: [["content", ""], ["codeEditor", ""], [4, "ngIf", "ngIfElse"], [4, "ngTemplateOutlet"], [1, "yaml-editor-container"], [1, "yaml-editor-section"], ["name", "yaml", 3, "ngModelChange", "originalValue", "ngModel", "options", "actionsConfig", "modelUri"], ["auiCodeEditorToolbarRightSide", ""], ["class", "aui-code-editor-toolbar__control-button", "type", "button", 3, "hidden", "disabled", "auiTooltip", "click", 4, "ngIf"], ["class", "yaml-sidebar-section", 4, "ngIf"], ["type", "button", 1, "aui-code-editor-toolbar__control-button", 3, "click", "hidden", "disabled", "auiTooltip"], [3, "icon"], [1, "yaml-sidebar-section"], [3, "close", "tryYaml", "resource", "schema", "schemaEnable", "exampleEnable", "extraExamples"]], template: function ResourceYamlEditorComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, ResourceYamlEditorComponent_aui_card_0_Template, 2, 1, "aui-card", 2)(1, ResourceYamlEditorComponent_ng_template_1_Template, 11, 17, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { const content_r1 = i0.ɵɵreference(2); i0.ɵɵproperty("ngIf", ctx.hasWrapper)("ngIfElse", content_r1); } }, dependencies: [i4.CardComponent, NgIf, FormsModule, i5.NgControlStatus, i5.NgModel, ButtonModule, CodeEditorModule, i3.CodeEditorComponent, i6.TranslatePipe, AsyncPipe, NgTemplateOutlet, ResourceYamlSidebarComponent, IconModule, i4.IconComponent, TooltipModule, i4.TooltipDirective], styles: ["[_nghost-%COMP%]:not(.dialog-content){display:block;height:calc(100vh - (var(--acl-page-header-height) + 44px) - 147px)}[_nghost-%COMP%]:not(.dialog-content) .aui-code-editor{min-height:100%}[_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%]{height:100%}[_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] .aui-card__content[_ngcontent-%COMP%], [_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] aui-code-editor[_ngcontent-%COMP%], [_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] .aui-code-editor[_ngcontent-%COMP%]{height:100%;min-height:100%}[_nghost-%COMP%]{display:block}[_nghost-%COMP%] aui-card, [_nghost-%COMP%] .aui-card, [_nghost-%COMP%] .aui-card__content{height:100%}[_nghost-%COMP%] .aui-checkbox{margin-right:0}[_nghost-%COMP%] aui-code-editor[_ngcontent-%COMP%]{height:100%}.yaml-editor-container[_ngcontent-%COMP%]{display:flex;height:100%}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-editor-section[_ngcontent-%COMP%]{flex:2;min-width:0}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{flex:1 0 0%}.yaml-editor-container[_ngcontent-%COMP%]:not(.with-sidebar) .yaml-editor-section[_ngcontent-%COMP%]{flex:1}.yaml-editor-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.yaml-editor-section[_ngcontent-%COMP%] aui-code-editor[_ngcontent-%COMP%]{flex:1;height:100%}.yaml-sidebar-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.yaml-sidebar-section[_ngcontent-%COMP%] acl-resource-yaml-sidebar[_ngcontent-%COMP%]{flex:1;height:100%}.yaml-debug-section[_ngcontent-%COMP%]{position:absolute;top:0;right:0;width:350px;height:100%;background:var(--aui-color-bg-container);border-left:1px solid var(--aui-color-border-default);z-index:1000;overflow-y:auto}.debug-panel[_ngcontent-%COMP%]{padding:16px;font-size:12px}.debug-panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 12px;font-size:14px;color:var(--aui-color-text-primary)}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%]{margin-bottom:16px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--aui-color-text-primary);display:block;margin-bottom:4px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{margin:0;padding-left:16px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin-bottom:2px;color:var(--aui-color-text-secondary)}.debug-panel[_ngcontent-%COMP%] .debug-actions[_ngcontent-%COMP%]{border-top:1px solid var(--aui-color-border-default);padding-top:12px;text-align:right}@media (width <= 1200px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:350px}}@media (width <= 992px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%]{flex-direction:column}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-editor-section[_ngcontent-%COMP%]{flex:1;min-height:50%}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:100%;height:50%;border-top:1px solid var(--aui-color-border, #e0e0e0);border-left:none}}"], changeDetection: 0 }); } } __decorate([ ObservableInput(), __metadata("design:type", Observable) ], ResourceYamlEditorComponent.prototype, "resource$", void 0); __decorate([ ObservableInput(), __metadata("design:type", Observable) ], ResourceYamlEditorComponent.prototype, "schema$", void 0); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceYamlEditorComponent, [{ type: Component, args: [{ selector: 'acl-resource-yaml-editor', preserveWhitespaces: false, standalone: true, imports: [ CARD_MODULE, NgIf, FormsModule, CHECKBOX_MODULE, ButtonModule, CodeEditorModule, TRANSLATE_MODULE, AsyncPipe, NgTemplateOutlet, ResourceYamlSidebarComponent, IconModule, TooltipModule, ], providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ResourceYamlEditorComponent), multi: true, }, ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<aui-card *ngIf=\"hasWrapper; else content\">\n <ng-container *ngTemplateOutlet=\"content\" />\n</aui-card>\n<ng-template #content>\n <div\n class=\"yaml-editor-container\"\n [class.with-sidebar]=\"showSidebar$$ | async\"\n >\n <div class=\"yaml-editor-section\">\n <aui-code-editor\n #codeEditor\n name=\"yaml\"\n [originalValue]=\"originalValue\"\n [(ngModel)]=\"value\"\n [options]=\"options\"\n [actionsConfig]=\"actionsConfig\"\n [modelUri]=\"modelUri\"\n >\n <ng-container auiCodeEditorToolbarRightSide>\n <!-- Schema \u6309\u94AE\uFF1A\u5F53\u542F\u7528\u4FA7\u8FB9\u680F\u65F6\u663E\u793A -->\n <button\n *ngIf=\"sidebarEnable && !!(resource$ | async)\"\n [hidden]=\"!!codeEditor.fullscreenDialog\"\n class=\"aui-code-editor-toolbar__control-button\"\n type=\"button\"\n [disabled]=\"!(finalSchema$ | async)\"\n (click)=\"toggleSidebar()\"\n [auiTooltip]=\"\n ((showSidebar$$ | async) ? 'hide_sidebar' : 'view_sidebar')\n | translate\n \"\n >\n <aui-icon\n [icon]=\"\n (showSidebar$$ | async)\n ? 'prod:expand_sidebar'\n : 'prod:collapse_sidebar'\n \"\n ></aui-icon>\n </button>\n </ng-container>\n </aui-code-editor>\n </div>\n <div\n class=\"yaml-sidebar-section\"\n *ngIf=\"(showSidebar$$ | async) && (resource$ | async)\"\n >\n <acl-resource-yaml-sidebar\n [resource]=\"getCurrentResource()\"\n [schema]=\"finalSchema$ | async\"\n [schemaEnable]=\"schemaEnable\"\n [exampleEnable]=\"exampleEnable\"\n [extraExamples]=\"extraExamples\"\n (close)=\"toggleSidebar()\"\n (tryYaml)=\"onTryYaml($event)\"\n ></acl-resource-yaml-sidebar>\n </div>\n </div>\n</ng-template>\n", styles: [":host(:not(.dialog-content)){display:block;height:calc(100vh - (var(--acl-page-header-height) + 44px) - 147px)}:host(:not(.dialog-content)) ::ng-deep .aui-code-editor{min-height:100%}:host(:not(.dialog-content))>.aui-card{height:100%}:host(:not(.dialog-content))>.aui-card .aui-card__content,:host(:not(.dialog-content))>.aui-card aui-code-editor,:host(:not(.dialog-content))>.aui-card .aui-code-editor{height:100%;min-height:100%}:host{display:block}:host ::ng-deep aui-card,:host ::ng-deep .aui-card,:host ::ng-deep .aui-card__content{height:100%}:host ::ng-deep .aui-checkbox{margin-right:0}:host aui-code-editor{height:100%}.yaml-editor-container{display:flex;height:100%}.yaml-editor-container.with-sidebar .yaml-editor-section{flex:2;min-width:0}.yaml-editor-container.with-sidebar .yaml-sidebar-section{flex:1 0 0%}.yaml-editor-container:not(.with-sidebar) .yaml-editor-section{flex:1}.yaml-editor-section{display:flex;flex-direction:column;height:100%}.yaml-editor-section aui-code-editor{flex:1;height:100%}.yaml-sidebar-section{display:flex;flex-direction:column;height:100%}.yaml-sidebar-section acl-resource-yaml-sidebar{flex:1;height:100%}.yaml-debug-section{position:absolute;top:0;right:0;width:350px;height:100%;background:var(--aui-color-bg-container);border-left:1px solid var(--aui-color-border-default);z-index:1000;overflow-y:auto}.debug-panel{padding:16px;font-size:12px}.debug-panel h4{margin:0 0 12px;font-size:14px;color:var(--aui-color-text-primary)}.debug-panel .debug-item{margin-bottom:16px}.debug-panel .debug-item strong{color:var(--aui-color-text-primary);display:block;margin-bottom:4px}.debug-panel .debug-item ul{margin:0;padding-left:16px}.debug-panel .debug-item ul li{margin-bottom:2px;color:var(--aui-color-text-secondary)}.debug-panel .debug-actions{border-top:1px solid var(--aui-color-border-default);padding-top:12px;text-align:right}@media (width <= 1200px){.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:350px}}@media (width <= 992px){.yaml-editor-container.with-sidebar{flex-direction:column}.yaml-editor-container.with-sidebar .yaml-editor-section{flex:1;min-height:50%}.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:100%;height:50%;border-top:1px solid var(--aui-color-border, #e0e0e0);border-left:none}}\n"] }] }], () => [{ type: i1.YamlUtilService }, { type: i2.KubernetesSchemaService }, { type: i3.MonacoLanguageService }], { codeEditorRef: [{ type: ViewChild, args: ['codeEditor', { static: false }] }], hasWrapper: [{ type: Input }], showDebugInfo: [{ type: Input }], sidebarEnable: [{ type: Input }], schema: [{ type: Input }], schemaEnable: [{ type: Input }], exampleEnable: [{ type: Input }], resource: [{ type: Input }], autoFoldManagedFields: [{ type: Input }], originalValue: [{ type: Input }], options: [{ type: Input }], actionsConfig: [{ type: Input }], tryYaml: [{ type: Output }], resource$: [], schema$: [], autoFillNamespace: [{ type: Input }], extraExamples: [{ type: Input }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceYamlEditorComponent, { className: "ResourceYamlEditorComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEdBR1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFVBQVUsRUFDVixHQUFHLEVBQ0gsb0JBQW9CLEVBQ3BCLEVBQUUsRUFDRixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxPQUFPLEdBQ1IsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFNeEUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1Ys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QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvZGVFZGl0b3JNb2R1bGUsXG4gIExhbmd1YWdlU2NoZW1hU2VydmljZSxcbiAgTW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlLFxufSBmcm9tICdAYWxhdWRhL2NvZGUtZWRpdG9yJztcbmltcG9ydCB7XG4gIENBUkRfTU9EVUxFLFxuICBDSEVDS0JPWF9NT0RVTEUsXG4gIEJ1dHRvbk1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgVG9vbHRpcE1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB5YW1sRGVmYXVsdHMgfSBmcm9tICdtb25hY28teWFtbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIG1hcCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG9mLFxuICBzd2l0Y2hNYXAsXG4gIHNoYXJlUmVwbGF5LFxuICB0YWtlVW50aWwsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBLdWJlcm5ldGVzU2NoZW1hU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMva3ViZXJuZXRlcy1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBZYW1sVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3lhbWwtdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFycmF5YWJsZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvaGVscGVycyc7XG5pbXBvcnQge1xuICBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gIE9wZW5BUElWM1NjaGVtYU9iamVjdCxcbn0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGVJbnB1dCxcbiAgcHVibGlzaFJlZixcbiAgcGFyc2VBbGwsXG4gIHN0cmluZ2lmeSxcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9wdWJsaWMtYXBpJztcbmltcG9ydCB7IFRSQU5TTEFURV9NT0RVTEUgfSBmcm9tICcuLi8uLi90cmFuc2xhdGUvdHJhbnNsYXRlLm1vZHVsZSc7XG5pbXBvcnQgeyB1cGRhdGVBY3Rpb25zLCB5YW1sV3JpdGVNaW5pbWFwT3B0aW9ucyB9IGZyb20gJy4uL2NvZGUtZWRpdG9yLWNvbmZpZ3MnO1xuaW1wb3J0IHtcbiAgZm9sZE1hbmFnZWRGaWVsZHMsXG4gIEVkaXRvckluc3RhbmNlUHJvdmlkZXIsXG59IGZyb20gJy4uL21hbmFnZWQtZmllbGRzLWZvbGRlci51dGlsJztcbmltcG9ydCB7IFJlc291cmNlWWFtbFNpZGViYXJDb21wb25lbnQgfSBmcm9tICcuLi95YW1sLXNpZGViYXIvY29tcG9uZW50JztcbmltcG9ydCB7IFlhbWxFeGFtcGxlIH0gZnJvbSAnLi4veWFtbC1zaWRlYmFyL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLXJlc291cmNlLXlhbWwtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3N0eWxlcy5zY3NzJ10sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ0FSRF9NT0RVTEUsXG4gICAgTmdJZixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDSEVDS0JPWF9NT0RVTEUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvZGVFZGl0b3JNb2R1bGUsXG4gICAgVFJBTlNMQVRFX01PRFVMRSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXNvdXJjZVlhbWxTaWRlYmFyQ29tcG9uZW50LFxuICAgIEljb25Nb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSZXNvdXJjZVlhbWxFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlc291cmNlWWFtbEVkaXRvckNvbXBvbmVudDxUIGV4dGVuZHMgS3ViZXJuZXRlc1Jlc291cmNlPlxuICBpbXBsZW1lbnRzXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgT25EZXN0cm95LFxuICAgIEVkaXRvckluc3RhbmNlUHJvdmlkZXIsXG4gICAgQWZ0ZXJWaWV3SW5pdFxue1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcbiAgcHJpdmF0ZSBfb3JpZ2luYWxWYWx1ZSA9ICcnO1xuICBwcml2YXRlIG9uQ2hhbmdlID0gKF92YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZvcm0gY29udHJvbCBjaGFuZ2UgY2FsbGJhY2tcbiAgfTtcblxuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZm9ybSBjb250cm9sIHRvdWNoZWQgY2FsbGJhY2tcbiAgfTtcblxuICBzaG93U2lkZWJhciQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgc2hvd0RlYnVnUGFuZWwkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG5cbiAgbW9kZWxVcmk6IHN0cmluZztcbiAgcHJpdmF0ZSB5YW1sU2NoZW1hU2VydmljZTogTGFuZ3VhZ2VTY2hlbWFTZXJ2aWNlO1xuICBwcml2YXRlIG1vbmFjb0VkaXRvcjogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWdpc3RlcmVkU2NoZW1hcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvZGVFZGl0b3InLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHJpdmF0ZSBjb2RlRWRpdG9yUmVmOiBhbnk7XG5cbiAgQElucHV0KClcbiAgaGFzV3JhcHBlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2hvd0RlYnVnSW5mbyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNpZGViYXJFbmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNjaGVtYTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0O1xuXG4gIEBJbnB1dCgpXG4gIHNjaGVtYUVuYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgZXhhbXBsZUVuYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcmVzb3VyY2U6IEFycmF5YWJsZTxUPjtcblxuICBASW5wdXQoKVxuICBhdXRvRm9sZE1hbmFnZWRGaWVsZHMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBvcmlnaW5hbFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vcmlnaW5hbFZhbHVlID0gdmFsdWUgfHwgJyc7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgb3B0aW9ucyA9IHlhbWxXcml0ZU1pbmltYXBPcHRpb25zO1xuXG4gIEBJbnB1dCgpXG4gIGFjdGlvbnNDb25maWcgPSB1cGRhdGVBY3Rpb25zO1xuXG4gIEBPdXRwdXQoKVxuICB0cnlZYW1sID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IHJlc291cmNlJCE6IE9ic2VydmFibGU8QXJyYXlhYmxlPFQ+PjtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgcmVhZG9ubHkgc2NoZW1hJCE6IE9ic2VydmFibGU8T3BlbkFQSVYzU2NoZW1hT2JqZWN0PjtcblxuICBASW5wdXQoKVxuICBhdXRvRmlsbE5hbWVzcGFjZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgZXh0cmFFeGFtcGxlczogWWFtbEV4YW1wbGVbXTtcblxuICBoYXNGb2xkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICog6Ieq5Yqo6I635Y+W55qEIHNjaGVtYe+8jOW9k+ayoeacieaJi+WKqOaPkOS+myBzY2hlbWEg5pe25L2/55SoXG4gICAqL1xuICBhdXRvU2NoZW1hJCA9IHRoaXMucmVzb3VyY2UkLnBpcGUoXG4gICAgc3dpdGNoTWFwKHJlc291cmNlID0+IHtcbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdFJlc291cmNlID0gKFxuICAgICAgICBBcnJheS5pc0FycmF5KHJlc291cmNlKSA/IHJlc291cmNlWzBdIDogcmVzb3VyY2VcbiAgICAgICkgYXMgVDtcbiAgICAgIGlmICghZmlyc3RSZXNvdXJjZT8uYXBpVmVyc2lvbiB8fCAhZmlyc3RSZXNvdXJjZT8ua2luZCkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0UmVzb3VyY2VTY2hlbWEoXG4gICAgICAgIGZpcnN0UmVzb3VyY2UuYXBpVmVyc2lvbixcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5raW5kLFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgLyoqXG4gICAqIOacgOe7iOS9v+eUqOeahCBzY2hlbWHvvIzkvJjlhYjkvb/nlKjmiYvliqjmj5DkvpvnmoTvvIzlkKbliJnkvb/nlKjoh6rliqjojrflj5bnmoRcbiAgICovXG4gIGZpbmFsU2NoZW1hJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc2NoZW1hJCwgdGhpcy5hdXRvU2NoZW1hJF0pLnBpcGUoXG4gICAgbWFwKChbbWFudWFsU2NoZW1hLCBhdXRvU2NoZW1hXSkgPT4gbWFudWFsU2NoZW1hIHx8IGF1dG9TY2hlbWEpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHlhbWxVdGlsOiBZYW1sVXRpbFNlcnZpY2UsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVtYVNlcnZpY2U6IEt1YmVybmV0ZXNTY2hlbWFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlOiBNb25hY29MYW5ndWFnZVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMueWFtbFNjaGVtYVNlcnZpY2UgPVxuICAgICAgdGhpcy5tb25hY29MYW5ndWFnZVNlcnZpY2UuZ2V0TGFuZ3VhZ2VTY2hlbWFTZXJ2aWNlKFxuICAgICAgICBbJ3lhbWwnLCAneWFtbERlZmF1bHRzJ10sXG4gICAgICAgIHlhbWxEZWZhdWx0cyxcbiAgICAgICk7XG5cbiAgICAvLyDoh6rliqjorr7nva4gc2NoZW1hXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5yZXNvdXJjZSQsIHRoaXMuZmluYWxTY2hlbWEkXSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtyZXNvdXJjZSwgc2NoZW1hXSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2UgJiYgc2NoZW1hKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RSZXNvdXJjZSA9IEFycmF5LmlzQXJyYXkocmVzb3VyY2UpXG4gICAgICAgICAgICA/IHJlc291cmNlWzBdXG4gICAgICAgICAgICA6IHJlc291cmNlO1xuICAgICAgICAgIGlmIChmaXJzdFJlc291cmNlICYmICFBcnJheS5pc0FycmF5KGZpcnN0UmVzb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFlhbWxTY2hlbWEoZmlyc3RSZXNvdXJjZSBhcyBULCBzY2hlbWEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmF1dG9TY2hlbWEkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyDnm5HlkKwgWUFNTCDlhoXlrrnlj5jljJbvvIzoh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkc1xuICAgIGlmICh0aGlzLmF1dG9Gb2xkTWFuYWdlZEZpZWxkcyAmJiB0aGlzLnNjaGVtYVNlcnZpY2UuZGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VsZkZvbGRNYW5hZ2VkRmllbGRzKCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZkZvbGRNYW5hZ2VkRmllbGRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ZvbGRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhc0ZvbGRlZCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvckluc3RhbmNlKCk7XG4gICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgIGZvbGRNYW5hZ2VkRmllbGRzKGVkaXRvcik7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbCk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgfHwgJyc7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHRvZ2dsZVNpZGViYXIoKSB7XG4gICAgdGhpcy5zaG93U2lkZWJhciQkLm5leHQoIXRoaXMuc2hvd1NpZGViYXIkJC52YWx1ZSk7XG4gIH1cblxuICB0b2dnbGVEZWJ1Z0luZm8oKSB7XG4gICAgdGhpcy5zaG93RGVidWdQYW5lbCQkLm5leHQoIXRoaXMuc2hvd0RlYnVnUGFuZWwkJC52YWx1ZSk7XG4gIH1cblxuICBnZXRDdXJyZW50UmVzb3VyY2UoKTogVCB8IG51bGwge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvdXJjZSkpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZS5sZW5ndGggPiAwID8gcmVzb3VyY2VbMF0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKHJlc291cmNlIGFzIFQpIHx8IG51bGw7XG4gIH1cblxuICBnZXRDdXJyZW50U2NoZW1hKCk6IE9wZW5BUElWM1NjaGVtYU9iamVjdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSB8fCBudWxsO1xuICB9XG5cbiAgZ2V0RGVidWdJbmZvKCkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXRDdXJyZW50UmVzb3VyY2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzUmVzb3VyY2U6ICEhcmVzb3VyY2UsXG4gICAgICByZXNvdXJjZUFwaVZlcnNpb246IHJlc291cmNlPy5hcGlWZXJzaW9uLFxuICAgICAgcmVzb3VyY2VLaW5kOiByZXNvdXJjZT8ua2luZCxcbiAgICAgIGhhc01hbnVhbFNjaGVtYTogISF0aGlzLnNjaGVtYSxcbiAgICAgIHdvcmtzcGFjZUhlbHBlckF2YWlsYWJsZTogdGhpcy5zY2hlbWFTZXJ2aWNlLmlzV29ya3NwYWNlSGVscGVyQXZhaWxhYmxlKCksXG4gICAgICBjdXJyZW50V29ya3NwYWNlOiB0aGlzLnNjaGVtYVNlcnZpY2Uud29ya3NwYWNlSGVscGVyPy5iYXNlUGFyYW1zU25hcHNob3QsXG4gICAgfTtcbiAgfVxuXG4gIG9uVHJ5WWFtbCh5YW1sQ29udGVudDogc3RyaW5nKSB7XG4gICAgbGV0IHRhcmdldFlhbWwgPSB5YW1sQ29udGVudDtcblxuICAgIGNvbnN0IG5hbWVzcGFjZSA9XG4gICAgICB0aGlzLnNjaGVtYVNlcnZpY2Uud29ya3NwYWNlSGVscGVyPy5iYXNlUGFyYW1zU25hcHNob3Q/Lm5hbWVzcGFjZTtcblxuICAgIGlmICh0aGlzLmF1dG9GaWxsTmFtZXNwYWNlICYmIG5hbWVzcGFjZSkge1xuICAgICAgdGFyZ2V0WWFtbCA9IHBhcnNlQWxsKHlhbWxDb250ZW50KVxuICAgICAgICAuZmlsdGVyKHIgPT4gISFyKVxuICAgICAgICAubWFwKChyOiBLdWJlcm5ldGVzUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICBpZiAoIXI/Lm1ldGFkYXRhPy5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnIsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgLi4uci5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChyID0+IHN0cmluZ2lmeShyLCB7IHNvcnRNYXBFbnRyaWVzOiB0cnVlIH0pKVxuICAgICAgICAuam9pbignLS0tXFxyXFxuJyk7XG4gICAgfVxuXG4gICAgdGhpcy50cnlZYW1sLmVtaXQodGFyZ2V0WWFtbCk7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIFlBTUwgc2NoZW1hIOS7peaPkOS+myBob3ZlciDmj5DnpLrlkozoh6rliqjlrozmiJBcbiAgICovXG4gIHNldFlhbWxTY2hlbWEocmVzb3VyY2U6IFQsIHNjaGVtYTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0KSB7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDkvb/nlKggYXBpVmVyc2lvbiArIGtpbmQg57uE5ZCI5L2c5Li65qCH6K+GXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IHJlc291cmNlPy5hcGlWZXJzaW9uIHx8ICd1bmtub3duJztcbiAgICBjb25zdCBraW5kID0gcmVzb3VyY2U/LmtpbmQgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IHNjaGVtYUtleSA9IGAke2FwaVZlcnNpb259LyR7a2luZH1gO1xuXG4gICAgdGhpcy5tb2RlbFVyaSA9IGAke3NjaGVtYUtleX0ueWFtbGA7XG5cbiAgICB0aGlzLnNlbGZGb2xkTWFuYWdlZEZpZWxkcygpO1xuXG4gICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5rOo5YaM6L+H55u45ZCM55qEIHNjaGVtYe+8jOmBv+WFjemHjeWkjeazqOWGjFxuICAgIGlmICh0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzLmhhcyhzY2hlbWFLZXkpKSB7XG4gICAg