@alauda-fe/common 1.4.28-beta.4 → 1.4.28-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/array-form-table/form/component.d.ts +1 -1
  2. package/code/code-editor-configs.d.ts +0 -2
  3. package/code/public-api.d.ts +0 -4
  4. package/code/resource-yaml-display/component.d.ts +6 -64
  5. package/core/abstract/base-nested-form-control.d.ts +1 -1
  6. package/core/constants/constants.d.ts +0 -3
  7. package/core/services/intercept-deactivate.service.d.ts +2 -2
  8. package/core/services/public-api.d.ts +0 -1
  9. package/core/services/time.service.d.ts +2 -8
  10. package/core/types/public-api.d.ts +0 -1
  11. package/esm2022/code/code-editor-configs.mjs +2 -12
  12. package/esm2022/code/public-api.mjs +1 -5
  13. package/esm2022/code/resource-yaml-display/component.mjs +42 -255
  14. package/esm2022/core/constants/constants.mjs +1 -4
  15. package/esm2022/core/guards/intercept-deactivate.guard.mjs +2 -2
  16. package/esm2022/core/services/intercept-deactivate.service.mjs +1 -1
  17. package/esm2022/core/services/public-api.mjs +1 -2
  18. package/esm2022/core/services/time.service.mjs +36 -13
  19. package/esm2022/core/services/workspace-helper.service.mjs +3 -4
  20. package/esm2022/core/types/public-api.mjs +1 -2
  21. package/esm2022/exec/terminal-group/component.mjs +2 -2
  22. package/esm2022/page-scaffold/page/page.module.mjs +6 -5
  23. package/esm2022/page-scaffold/page-header/help-menu/module.mjs +9 -8
  24. package/esm2022/table/module.mjs +12 -11
  25. package/esm2022/translate/constants.mjs +1 -2
  26. package/esm2022/translate/intl-format.pipes.mjs +293 -0
  27. package/esm2022/translate/public-api.mjs +4 -3
  28. package/esm2022/translate/relative-time-manager.service.mjs +87 -0
  29. package/esm2022/translate/translate.directive.mjs +5 -4
  30. package/esm2022/translate/translate.module.mjs +22 -3
  31. package/esm2022/translate/translate.pipe.mjs +7 -8
  32. package/esm2022/translate/translate.service.mjs +721 -142
  33. package/esm2022/translate/types.mjs +1 -1
  34. package/package.json +2 -2
  35. package/page-scaffold/page/page.module.d.ts +4 -3
  36. package/page-scaffold/page-header/help-menu/module.d.ts +2 -1
  37. package/styles/global.scss +0 -4
  38. package/table/module.d.ts +2 -1
  39. package/translate/intl-format.pipes.d.ts +122 -0
  40. package/translate/public-api.d.ts +3 -2
  41. package/translate/relative-time-manager.service.d.ts +32 -0
  42. package/translate/translate.module.d.ts +4 -2
  43. package/translate/translate.pipe.d.ts +4 -5
  44. package/translate/translate.service.d.ts +292 -20
  45. package/translate/types.d.ts +16 -0
  46. package/code/managed-fields-folder.util.d.ts +0 -35
  47. package/code/resource-yaml-display/schema/component.d.ts +0 -61
  48. package/code/resource-yaml-editor/component.d.ts +0 -95
  49. package/code/yaml-examples.d.ts +0 -8
  50. package/code/yaml-sidebar/component.d.ts +0 -57
  51. package/code/yaml-sidebar/types.d.ts +0 -21
  52. package/code/yaml-sidebar/yaml-examples.d.ts +0 -8
  53. package/core/services/kubernetes-schema.service.d.ts +0 -44
  54. package/core/types/openapi.d.ts +0 -37
  55. package/esm2022/code/managed-fields-folder.util.mjs +0 -150
  56. package/esm2022/code/resource-yaml-display/schema/component.mjs +0 -531
  57. package/esm2022/code/resource-yaml-editor/component.mjs +0 -391
  58. package/esm2022/code/yaml-examples.mjs +0 -337
  59. package/esm2022/code/yaml-sidebar/component.mjs +0 -482
  60. package/esm2022/code/yaml-sidebar/types.mjs +0 -2
  61. package/esm2022/code/yaml-sidebar/yaml-examples.mjs +0 -340
  62. package/esm2022/core/services/kubernetes-schema.service.mjs +0 -129
  63. package/esm2022/core/types/openapi.mjs +0 -2
@@ -1,391 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { CodeEditorModule, MonacoLanguageService, } from '@alauda/code-editor';
3
- import { CARD_MODULE, CHECKBOX_MODULE, ButtonModule, IconModule, } from '@alauda/ui';
4
- import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';
5
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, forwardRef, } from '@angular/core';
6
- import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms';
7
- import { yamlDefaults } from 'monaco-yaml';
8
- import { BehaviorSubject, combineLatest, Observable, map, distinctUntilChanged, of, switchMap, shareReplay, takeUntil, Subject, } from 'rxjs';
9
- import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service';
10
- import { YamlUtilService } from '../../core/services/yaml-util.service';
11
- import { ObservableInput } from '../../core/utils/decorators';
12
- import { publishRef } from '../../core/utils/operators';
13
- import { parseAll, stringify } from '../../core/utils/yaml';
14
- import { TRANSLATE_MODULE } from '../../translate/translate.module';
15
- import { updateActions, yamlWriteMinimapOptions } from '../code-editor-configs';
16
- import { foldManagedFields, } from '../managed-fields-folder.util';
17
- import { ResourceYamlSidebarComponent } from '../yaml-sidebar/component';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "../../core/services/yaml-util.service";
20
- import * as i2 from "../../core/services/kubernetes-schema.service";
21
- import * as i3 from "@alauda/code-editor";
22
- import * as i4 from "@alauda/ui";
23
- import * as i5 from "@angular/forms";
24
- import * as i6 from "../../translate/translate.pipe";
25
- const _c0 = ["codeEditor"];
26
- function ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelementContainer(0);
28
- } }
29
- function ResourceYamlEditorComponent_aui_card_0_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "aui-card");
31
- i0.ɵɵtemplate(1, ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template, 1, 0, "ng-container", 3);
32
- i0.ɵɵelementEnd();
33
- } if (rf & 2) {
34
- i0.ɵɵnextContext();
35
- const content_r1 = i0.ɵɵreference(2);
36
- i0.ɵɵadvance();
37
- i0.ɵɵproperty("ngTemplateOutlet", content_r1);
38
- } }
39
- function ResourceYamlEditorComponent_ng_template_1_button_6_Template(rf, ctx) { if (rf & 1) {
40
- const _r4 = i0.ɵɵgetCurrentView();
41
- i0.ɵɵelementStart(0, "button", 10);
42
- i0.ɵɵpipe(1, "async");
43
- i0.ɵɵpipe(2, "async");
44
- i0.ɵɵpipe(3, "async");
45
- i0.ɵɵpipe(4, "translate");
46
- 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()); });
47
- i0.ɵɵelement(5, "aui-icon", 11);
48
- i0.ɵɵpipe(6, "async");
49
- i0.ɵɵelementEnd();
50
- } if (rf & 2) {
51
- i0.ɵɵnextContext();
52
- const codeEditor_r5 = i0.ɵɵreference(4);
53
- const ctx_r2 = i0.ɵɵnextContext();
54
- i0.ɵɵproperty("hidden", !!codeEditor_r5.fullscreenDialog)("type", i0.ɵɵpipeBind1(1, 5, ctx_r2.showSidebar$$) ? "primary" : "text")("disabled", !i0.ɵɵpipeBind1(2, 7, ctx_r2.finalSchema$))("title", i0.ɵɵpipeBind1(3, 9, ctx_r2.finalSchema$) ? "" : i0.ɵɵpipeBind1(4, 11, "schema_not_available"));
55
- i0.ɵɵadvance(5);
56
- i0.ɵɵproperty("icon", i0.ɵɵpipeBind1(6, 13, ctx_r2.showSidebar$$) ? "prod:expand_sidebar" : "prod:collapse_sidebar");
57
- } }
58
- function ResourceYamlEditorComponent_ng_template_1_div_8_Template(rf, ctx) { if (rf & 1) {
59
- const _r6 = i0.ɵɵgetCurrentView();
60
- i0.ɵɵelementStart(0, "div", 12)(1, "acl-resource-yaml-sidebar", 13);
61
- i0.ɵɵpipe(2, "async");
62
- 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)); });
63
- i0.ɵɵelementEnd()();
64
- } if (rf & 2) {
65
- const ctx_r2 = i0.ɵɵnextContext(2);
66
- i0.ɵɵadvance();
67
- 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);
68
- } }
69
- function ResourceYamlEditorComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
70
- const _r2 = i0.ɵɵgetCurrentView();
71
- i0.ɵɵelementStart(0, "div", 4);
72
- i0.ɵɵpipe(1, "async");
73
- i0.ɵɵelementStart(2, "div", 5)(3, "aui-code-editor", 6, 1);
74
- 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); });
75
- i0.ɵɵelementContainerStart(5, 7);
76
- i0.ɵɵtemplate(6, ResourceYamlEditorComponent_ng_template_1_button_6_Template, 7, 15, "button", 8);
77
- i0.ɵɵpipe(7, "async");
78
- i0.ɵɵelementContainerEnd();
79
- i0.ɵɵelementEnd()();
80
- i0.ɵɵtemplate(8, ResourceYamlEditorComponent_ng_template_1_div_8_Template, 3, 7, "div", 9);
81
- i0.ɵɵpipe(9, "async");
82
- i0.ɵɵpipe(10, "async");
83
- i0.ɵɵelementEnd();
84
- } if (rf & 2) {
85
- const ctx_r2 = i0.ɵɵnextContext();
86
- i0.ɵɵclassProp("with-sidebar", i0.ɵɵpipeBind1(1, 9, ctx_r2.showSidebar$$));
87
- i0.ɵɵadvance(3);
88
- i0.ɵɵproperty("originalValue", ctx_r2.originalValue);
89
- i0.ɵɵtwoWayProperty("ngModel", ctx_r2.value);
90
- i0.ɵɵproperty("options", ctx_r2.options)("actionsConfig", ctx_r2.actionsConfig)("modelUri", ctx_r2.modelUri);
91
- i0.ɵɵadvance(3);
92
- i0.ɵɵproperty("ngIf", ctx_r2.sidebarEnable && !!i0.ɵɵpipeBind1(7, 11, ctx_r2.resource$));
93
- i0.ɵɵadvance(2);
94
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(9, 13, ctx_r2.showSidebar$$) && i0.ɵɵpipeBind1(10, 15, ctx_r2.resource$));
95
- } }
96
- export class ResourceYamlEditorComponent {
97
- set originalValue(value) {
98
- this._originalValue = value || '';
99
- }
100
- get originalValue() {
101
- return this._originalValue;
102
- }
103
- constructor(yamlUtil, schemaService, monacoLanguageService) {
104
- this.yamlUtil = yamlUtil;
105
- this.schemaService = schemaService;
106
- this.monacoLanguageService = monacoLanguageService;
107
- this.destroy$ = new Subject();
108
- this._value = '';
109
- this._originalValue = '';
110
- this.onChange = (_value) => {
111
- // Placeholder for form control change callback
112
- };
113
- this.onTouched = () => {
114
- // Placeholder for form control touched callback
115
- };
116
- this.showSidebar$$ = new BehaviorSubject(true);
117
- this.showDebugPanel$$ = new BehaviorSubject(true);
118
- this.monacoEditor = null;
119
- this.registeredSchemas = new Set();
120
- this.hasWrapper = true;
121
- this.showDebugInfo = false;
122
- this.sidebarEnable = true;
123
- this.schemaEnable = true;
124
- this.exampleEnable = true;
125
- this.autoFoldManagedFields = true;
126
- this.options = yamlWriteMinimapOptions;
127
- this.actionsConfig = updateActions;
128
- this.tryYaml = new EventEmitter();
129
- this.autoFillNamespace = true;
130
- this.hasFolded = false;
131
- /**
132
- * 自动获取的 schema,当没有手动提供 schema 时使用
133
- */
134
- this.autoSchema$ = this.resource$.pipe(switchMap(resource => {
135
- if (!resource) {
136
- return of(null);
137
- }
138
- const firstResource = (Array.isArray(resource) ? resource[0] : resource);
139
- if (!firstResource?.apiVersion || !firstResource?.kind) {
140
- return of(null);
141
- }
142
- return this.schemaService.getResourceSchema(firstResource.apiVersion, firstResource.kind);
143
- }), publishRef());
144
- /**
145
- * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
146
- */
147
- this.finalSchema$ = combineLatest([this.schema$, this.autoSchema$]).pipe(map(([manualSchema, autoSchema]) => manualSchema || autoSchema), distinctUntilChanged(), shareReplay(1));
148
- this.yamlSchemaService =
149
- this.monacoLanguageService.getLanguageSchemaService(['yaml', 'yamlDefaults'], yamlDefaults);
150
- // 自动设置 schema
151
- combineLatest([this.resource$, this.finalSchema$])
152
- .pipe(takeUntil(this.destroy$))
153
- .subscribe(([resource, schema]) => {
154
- if (resource && schema) {
155
- const firstResource = Array.isArray(resource)
156
- ? resource[0]
157
- : resource;
158
- if (firstResource && !Array.isArray(firstResource)) {
159
- this.setYamlSchema(firstResource, schema);
160
- }
161
- }
162
- });
163
- this.autoSchema$.pipe(takeUntil(this.destroy$)).subscribe();
164
- }
165
- ngAfterViewInit() {
166
- // 监听 YAML 内容变化,自动折叠 managedFields
167
- if (this.autoFoldManagedFields && this.schemaService.definitions) {
168
- this.selfFoldManagedFields();
169
- }
170
- }
171
- selfFoldManagedFields() {
172
- if (this.hasFolded) {
173
- return;
174
- }
175
- this.hasFolded = true;
176
- setTimeout(() => {
177
- const editor = this.getEditorInstance();
178
- if (editor) {
179
- foldManagedFields(editor);
180
- }
181
- }, 0);
182
- }
183
- get value() {
184
- return this._value;
185
- }
186
- set value(val) {
187
- this._value = val;
188
- this.onChange(val);
189
- this.onTouched();
190
- }
191
- // ControlValueAccessor implementation
192
- writeValue(value) {
193
- this._value = value || '';
194
- }
195
- registerOnChange(fn) {
196
- this.onChange = fn;
197
- }
198
- registerOnTouched(fn) {
199
- this.onTouched = fn;
200
- }
201
- toggleSidebar() {
202
- this.showSidebar$$.next(!this.showSidebar$$.value);
203
- }
204
- toggleDebugInfo() {
205
- this.showDebugPanel$$.next(!this.showDebugPanel$$.value);
206
- }
207
- getCurrentResource() {
208
- const resource = this.resource;
209
- if (Array.isArray(resource)) {
210
- return resource.length > 0 ? resource[0] : null;
211
- }
212
- return resource || null;
213
- }
214
- getCurrentSchema() {
215
- return this.schema || null;
216
- }
217
- getDebugInfo() {
218
- const resource = this.getCurrentResource();
219
- return {
220
- hasResource: !!resource,
221
- resourceApiVersion: resource?.apiVersion,
222
- resourceKind: resource?.kind,
223
- hasManualSchema: !!this.schema,
224
- workspaceHelperAvailable: this.schemaService.isWorkspaceHelperAvailable(),
225
- currentWorkspace: this.schemaService.workspaceHelper?.baseParamsSnapshot,
226
- };
227
- }
228
- onTryYaml(yamlContent) {
229
- let targetYaml = yamlContent;
230
- const namespace = this.schemaService.workspaceHelper?.baseParamsSnapshot?.namespace;
231
- if (this.autoFillNamespace && namespace) {
232
- targetYaml = parseAll(yamlContent)
233
- .filter(r => !!r)
234
- .map((r) => {
235
- if (!r?.metadata?.namespace) {
236
- return {
237
- ...r,
238
- metadata: {
239
- ...r.metadata,
240
- namespace,
241
- },
242
- };
243
- }
244
- return r;
245
- })
246
- .map(r => stringify(r, { sortMapEntries: true }))
247
- .join('---\r\n');
248
- }
249
- this.tryYaml.emit(targetYaml);
250
- }
251
- /**
252
- * 设置 YAML schema 以提供 hover 提示和自动完成
253
- */
254
- setYamlSchema(resource, schema) {
255
- if (!schema) {
256
- return;
257
- }
258
- // 使用 apiVersion + kind 组合作为标识
259
- const apiVersion = resource?.apiVersion || 'unknown';
260
- const kind = resource?.kind || 'unknown';
261
- const schemaKey = `${apiVersion}/${kind}`;
262
- this.modelUri = `${schemaKey}.yaml`;
263
- this.selfFoldManagedFields();
264
- // 检查是否已经注册过相同的 schema,避免重复注册
265
- if (this.registeredSchemas.has(schemaKey)) {
266
- return;
267
- }
268
- // 获取完整的 definitions 以支持 $ref 引用
269
- const definitions = this.schemaService.definitions || {};
270
- // 创建包含完整 definitions 的 schema 对象
271
- const fullSchema = {
272
- ...schema,
273
- definitions,
274
- };
275
- // 确保schema被正确注册,并启用自动完成功能
276
- this.yamlSchemaService.addSchema({
277
- uri: `k8s://${schemaKey}.schema.json`,
278
- fileMatch: [this.modelUri],
279
- schema: fullSchema,
280
- });
281
- this.registeredSchemas.add(schemaKey);
282
- }
283
- /**
284
- * 获取 Monaco 编辑器实例
285
- */
286
- getEditorInstance() {
287
- if (!this.monacoEditor && this.codeEditorRef?.editor) {
288
- this.monacoEditor = this.codeEditorRef.editor;
289
- }
290
- return this.monacoEditor;
291
- }
292
- /**
293
- * 手动折叠 managedFields
294
- */
295
- foldManagedFields() {
296
- const editor = this.getEditorInstance();
297
- if (editor) {
298
- foldManagedFields(editor);
299
- }
300
- }
301
- ngOnDestroy() {
302
- this.destroy$.next();
303
- this.destroy$.complete();
304
- }
305
- static { this.ɵfac = function ResourceYamlEditorComponent_Factory(t) { return new (t || ResourceYamlEditorComponent)(i0.ɵɵdirectiveInject(i1.YamlUtilService), i0.ɵɵdirectiveInject(i2.KubernetesSchemaService), i0.ɵɵdirectiveInject(i3.MonacoLanguageService)); }; }
306
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceYamlEditorComponent, selectors: [["acl-resource-yaml-editor"]], viewQuery: function ResourceYamlEditorComponent_Query(rf, ctx) { if (rf & 1) {
307
- i0.ɵɵviewQuery(_c0, 5);
308
- } if (rf & 2) {
309
- let _t;
310
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditorRef = _t.first);
311
- } }, 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([
312
- {
313
- provide: NG_VALUE_ACCESSOR,
314
- useExisting: forwardRef(() => ResourceYamlEditorComponent),
315
- multi: true,
316
- },
317
- ]), 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", ""], ["auiButton", "", "class", "aui-code-editor-toolbar__control-button", "size", "small", 3, "hidden", "type", "disabled", "title", "click", 4, "ngIf"], ["class", "yaml-sidebar-section", 4, "ngIf"], ["auiButton", "", "size", "small", 1, "aui-code-editor-toolbar__control-button", 3, "click", "hidden", "type", "disabled", "title"], [3, "icon"], [1, "yaml-sidebar-section"], [3, "close", "tryYaml", "resource", "schema", "schemaEnable", "exampleEnable", "extraExamples"]], template: function ResourceYamlEditorComponent_Template(rf, ctx) { if (rf & 1) {
318
- 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);
319
- } if (rf & 2) {
320
- const content_r1 = i0.ɵɵreference(2);
321
- i0.ɵɵproperty("ngIf", ctx.hasWrapper)("ngIfElse", content_r1);
322
- } }, dependencies: [i4.CardComponent, NgIf,
323
- FormsModule, i5.NgControlStatus, i5.NgModel, ButtonModule,
324
- CodeEditorModule, i3.CodeEditorComponent, i6.TranslatePipe, AsyncPipe,
325
- NgTemplateOutlet,
326
- ResourceYamlSidebarComponent,
327
- IconModule, i4.IconComponent], 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:1;min-width:0}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:400px;flex-shrink: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 (max-width: 1200px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:350px}}@media (max-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 }); }
328
- }
329
- __decorate([
330
- ObservableInput(),
331
- __metadata("design:type", Observable)
332
- ], ResourceYamlEditorComponent.prototype, "resource$", void 0);
333
- __decorate([
334
- ObservableInput(),
335
- __metadata("design:type", Observable)
336
- ], ResourceYamlEditorComponent.prototype, "schema$", void 0);
337
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceYamlEditorComponent, [{
338
- type: Component,
339
- args: [{ selector: 'acl-resource-yaml-editor', preserveWhitespaces: false, standalone: true, imports: [
340
- CARD_MODULE,
341
- NgIf,
342
- FormsModule,
343
- CHECKBOX_MODULE,
344
- ButtonModule,
345
- CodeEditorModule,
346
- TRANSLATE_MODULE,
347
- AsyncPipe,
348
- NgTemplateOutlet,
349
- ResourceYamlSidebarComponent,
350
- IconModule,
351
- ], providers: [
352
- {
353
- provide: NG_VALUE_ACCESSOR,
354
- useExisting: forwardRef(() => ResourceYamlEditorComponent),
355
- multi: true,
356
- },
357
- ], 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 auiButton\n *ngIf=\"sidebarEnable && !!(resource$ | async)\"\n [hidden]=\"!!codeEditor.fullscreenDialog\"\n class=\"aui-code-editor-toolbar__control-button\"\n [type]=\"(showSidebar$$ | async) ? 'primary' : 'text'\"\n [disabled]=\"!(finalSchema$ | async)\"\n size=\"small\"\n (click)=\"toggleSidebar()\"\n [title]=\"\n (finalSchema$ | async) ? '' : ('schema_not_available' | 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:1;min-width:0}.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:400px;flex-shrink: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 (max-width: 1200px){.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:350px}}@media (max-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"] }]
358
- }], () => [{ type: i1.YamlUtilService }, { type: i2.KubernetesSchemaService }, { type: i3.MonacoLanguageService }], { codeEditorRef: [{
359
- type: ViewChild,
360
- args: ['codeEditor', { static: false }]
361
- }], hasWrapper: [{
362
- type: Input
363
- }], showDebugInfo: [{
364
- type: Input
365
- }], sidebarEnable: [{
366
- type: Input
367
- }], schema: [{
368
- type: Input
369
- }], schemaEnable: [{
370
- type: Input
371
- }], exampleEnable: [{
372
- type: Input
373
- }], resource: [{
374
- type: Input
375
- }], autoFoldManagedFields: [{
376
- type: Input
377
- }], originalValue: [{
378
- type: Input
379
- }], options: [{
380
- type: Input
381
- }], actionsConfig: [{
382
- type: Input
383
- }], tryYaml: [{
384
- type: Output
385
- }], resource$: [], schema$: [], autoFillNamespace: [{
386
- type: Input
387
- }], extraExamples: [{
388
- type: Input
389
- }] }); })();
390
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceYamlEditorComponent, { className: "ResourceYamlEditorComponent" }); })();
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsR0FHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsVUFBVSxFQUNWLEdBQUcsRUFDSCxvQkFBb0IsRUFDcEIsRUFBRSxFQUNGLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUl4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFD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O2tCQURoQixLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLOztrRkFoRkssMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29kZUVkaXRvck1vZHVsZSxcbiAgTGFuZ3VhZ2VTY2hlbWFTZXJ2aWNlLFxuICBNb25hY29MYW5ndWFnZVNlcnZpY2UsXG59IGZyb20gJ0BhbGF1ZGEvY29kZS1lZGl0b3InO1xuaW1wb3J0IHtcbiAgQ0FSRF9NT0RVTEUsXG4gIENIRUNLQk9YX01PRFVMRSxcbiAgQnV0dG9uTW9kdWxlLFxuICBJY29uTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3Jtc01vZHVsZSxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHlhbWxEZWZhdWx0cyB9IGZyb20gJ21vbmFjby15YW1sJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHRha2VVbnRpbCxcbiAgU3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEt1YmVybmV0ZXNTY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9rdWJlcm5ldGVzLXNjaGVtYS5zZXJ2aWNlJztcbmltcG9ydCB7IFlhbWxVdGlsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMveWFtbC11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXJyYXlhYmxlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9oZWxwZXJzJztcbmltcG9ydCB7IEt1YmVybmV0ZXNSZXNvdXJjZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvazhzL2NvcmUnO1xuaW1wb3J0IHsgT3BlbkFQSVYzU2NoZW1hT2JqZWN0IH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zY2hlbWEnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IHB1Ymxpc2hSZWYgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBwYXJzZUFsbCwgc3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy95YW1sJztcbmltcG9ydCB7IFRSQU5TTEFURV9NT0RVTEUgfSBmcm9tICcuLi8uLi90cmFuc2xhdGUvdHJhbnNsYXRlLm1vZHVsZSc7XG5pbXBvcnQgeyB1cGRhdGVBY3Rpb25zLCB5YW1sV3JpdGVNaW5pbWFwT3B0aW9ucyB9IGZyb20gJy4uL2NvZGUtZWRpdG9yLWNvbmZpZ3MnO1xuaW1wb3J0IHtcbiAgZm9sZE1hbmFnZWRGaWVsZHMsXG4gIEVkaXRvckluc3RhbmNlUHJvdmlkZXIsXG59IGZyb20gJy4uL21hbmFnZWQtZmllbGRzLWZvbGRlci51dGlsJztcbmltcG9ydCB7IFJlc291cmNlWWFtbFNpZGViYXJDb21wb25lbnQgfSBmcm9tICcuLi95YW1sLXNpZGViYXIvY29tcG9uZW50JztcbmltcG9ydCB7IFlhbWxFeGFtcGxlIH0gZnJvbSAnLi4veWFtbC1zaWRlYmFyL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLXJlc291cmNlLXlhbWwtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3N0eWxlcy5zY3NzJ10sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ0FSRF9NT0RVTEUsXG4gICAgTmdJZixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDSEVDS0JPWF9NT0RVTEUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvZGVFZGl0b3JNb2R1bGUsXG4gICAgVFJBTlNMQVRFX01PRFVMRSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXNvdXJjZVlhbWxTaWRlYmFyQ29tcG9uZW50LFxuICAgIEljb25Nb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmVzb3VyY2VZYW1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVlhbWxFZGl0b3JDb21wb25lbnQ8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT5cbiAgaW1wbGVtZW50c1xuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE9uRGVzdHJveSxcbiAgICBFZGl0b3JJbnN0YW5jZVByb3ZpZGVyLFxuICAgIEFmdGVyVmlld0luaXRcbntcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG4gIHByaXZhdGUgX29yaWdpbmFsVmFsdWUgPSAnJztcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIFBsYWNlaG9sZGVyIGZvciBmb3JtIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrXG4gIH07XG5cbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZvcm0gY29udHJvbCB0b3VjaGVkIGNhbGxiYWNrXG4gIH07XG5cbiAgc2hvd1NpZGViYXIkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gIHNob3dEZWJ1Z1BhbmVsJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuXG4gIG1vZGVsVXJpOiBzdHJpbmc7XG4gIHByaXZhdGUgeWFtbFNjaGVtYVNlcnZpY2U6IExhbmd1YWdlU2NoZW1hU2VydmljZTtcbiAgcHJpdmF0ZSBtb25hY29FZGl0b3I6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgcmVnaXN0ZXJlZFNjaGVtYXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCdjb2RlRWRpdG9yJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgY29kZUVkaXRvclJlZjogYW55O1xuXG4gIEBJbnB1dCgpXG4gIGhhc1dyYXBwZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dEZWJ1Z0luZm8gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzaWRlYmFyRW5hYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzY2hlbWE6IE9wZW5BUElWM1NjaGVtYU9iamVjdDtcblxuICBASW5wdXQoKVxuICBzY2hlbWFFbmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGV4YW1wbGVFbmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHJlc291cmNlOiBBcnJheWFibGU8VD47XG5cbiAgQElucHV0KClcbiAgYXV0b0ZvbGRNYW5hZ2VkRmllbGRzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgb3JpZ2luYWxWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3JpZ2luYWxWYWx1ZSA9IHZhbHVlIHx8ICcnO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxWYWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnMgPSB5YW1sV3JpdGVNaW5pbWFwT3B0aW9ucztcblxuICBASW5wdXQoKVxuICBhY3Rpb25zQ29uZmlnID0gdXBkYXRlQWN0aW9ucztcblxuICBAT3V0cHV0KClcbiAgdHJ5WWFtbCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICByZWFkb25seSByZXNvdXJjZSQhOiBPYnNlcnZhYmxlPEFycmF5YWJsZTxUPj47XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IHNjaGVtYSQhOiBPYnNlcnZhYmxlPE9wZW5BUElWM1NjaGVtYU9iamVjdD47XG5cbiAgQElucHV0KClcbiAgYXV0b0ZpbGxOYW1lc3BhY2UgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGV4dHJhRXhhbXBsZXM6IFlhbWxFeGFtcGxlW107XG5cbiAgaGFzRm9sZGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIOiHquWKqOiOt+WPlueahCBzY2hlbWHvvIzlvZPmsqHmnInmiYvliqjmj5Dkvpsgc2NoZW1hIOaXtuS9v+eUqFxuICAgKi9cbiAgYXV0b1NjaGVtYSQgPSB0aGlzLnJlc291cmNlJC5waXBlKFxuICAgIHN3aXRjaE1hcChyZXNvdXJjZSA9PiB7XG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RSZXNvdXJjZSA9IChcbiAgICAgICAgQXJyYXkuaXNBcnJheShyZXNvdXJjZSkgPyByZXNvdXJjZVswXSA6IHJlc291cmNlXG4gICAgICApIGFzIFQ7XG4gICAgICBpZiAoIWZpcnN0UmVzb3VyY2U/LmFwaVZlcnNpb24gfHwgIWZpcnN0UmVzb3VyY2U/LmtpbmQpIHtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFJlc291cmNlU2NoZW1hKFxuICAgICAgICBmaXJzdFJlc291cmNlLmFwaVZlcnNpb24sXG4gICAgICAgIGZpcnN0UmVzb3VyY2Uua2luZCxcbiAgICAgICk7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIC8qKlxuICAgKiDmnIDnu4jkvb/nlKjnmoQgc2NoZW1h77yM5LyY5YWI5L2/55So5omL5Yqo5o+Q5L6b55qE77yM5ZCm5YiZ5L2/55So6Ieq5Yqo6I635Y+W55qEXG4gICAqL1xuICBmaW5hbFNjaGVtYSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnNjaGVtYSQsIHRoaXMuYXV0b1NjaGVtYSRdKS5waXBlKFxuICAgIG1hcCgoW21hbnVhbFNjaGVtYSwgYXV0b1NjaGVtYV0pID0+IG1hbnVhbFNjaGVtYSB8fCBhdXRvU2NoZW1hKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB5YW1sVXRpbDogWWFtbFV0aWxTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSBzY2hlbWFTZXJ2aWNlOiBLdWJlcm5ldGVzU2NoZW1hU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vbmFjb0xhbmd1YWdlU2VydmljZTogTW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLnlhbWxTY2hlbWFTZXJ2aWNlID1cbiAgICAgIHRoaXMubW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlLmdldExhbmd1YWdlU2NoZW1hU2VydmljZShcbiAgICAgICAgWyd5YW1sJywgJ3lhbWxEZWZhdWx0cyddLFxuICAgICAgICB5YW1sRGVmYXVsdHMsXG4gICAgICApO1xuXG4gICAgLy8g6Ieq5Yqo6K6+572uIHNjaGVtYVxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMucmVzb3VyY2UkLCB0aGlzLmZpbmFsU2NoZW1hJF0pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbcmVzb3VyY2UsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlICYmIHNjaGVtYSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0UmVzb3VyY2UgPSBBcnJheS5pc0FycmF5KHJlc291cmNlKVxuICAgICAgICAgICAgPyByZXNvdXJjZVswXVxuICAgICAgICAgICAgOiByZXNvdXJjZTtcbiAgICAgICAgICBpZiAoZmlyc3RSZXNvdXJjZSAmJiAhQXJyYXkuaXNBcnJheShmaXJzdFJlc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRZYW1sU2NoZW1hKGZpcnN0UmVzb3VyY2UgYXMgVCwgc2NoZW1hKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvU2NoZW1hJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8g55uR5ZCsIFlBTUwg5YaF5a655Y+Y5YyW77yM6Ieq5Yqo5oqY5Y+gIG1hbmFnZWRGaWVsZHNcbiAgICBpZiAodGhpcy5hdXRvRm9sZE1hbmFnZWRGaWVsZHMgJiYgdGhpcy5zY2hlbWFTZXJ2aWNlLmRlZmluaXRpb25zKSB7XG4gICAgICB0aGlzLnNlbGZGb2xkTWFuYWdlZEZpZWxkcygpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGZGb2xkTWFuYWdlZEZpZWxkcygpIHtcbiAgICBpZiAodGhpcy5oYXNGb2xkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYXNGb2xkZWQgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5nZXRFZGl0b3JJbnN0YW5jZSgpO1xuICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICBmb2xkTWFuYWdlZEZpZWxkcyhlZGl0b3IpO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWwpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICB0b2dnbGVTaWRlYmFyKCkge1xuICAgIHRoaXMuc2hvd1NpZGViYXIkJC5uZXh0KCF0aGlzLnNob3dTaWRlYmFyJCQudmFsdWUpO1xuICB9XG5cbiAgdG9nZ2xlRGVidWdJbmZvKCkge1xuICAgIHRoaXMuc2hvd0RlYnVnUGFuZWwkJC5uZXh0KCF0aGlzLnNob3dEZWJ1Z1BhbmVsJCQudmFsdWUpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFJlc291cmNlKCk6IFQgfCBudWxsIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2UubGVuZ3RoID4gMCA/IHJlc291cmNlWzBdIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIChyZXNvdXJjZSBhcyBUKSB8fCBudWxsO1xuICB9XG5cbiAgZ2V0Q3VycmVudFNjaGVtYSgpOiBPcGVuQVBJVjNTY2hlbWFPYmplY3QgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWEgfHwgbnVsbDtcbiAgfVxuXG4gIGdldERlYnVnSW5mbygpIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuZ2V0Q3VycmVudFJlc291cmNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhhc1Jlc291cmNlOiAhIXJlc291cmNlLFxuICAgICAgcmVzb3VyY2VBcGlWZXJzaW9uOiByZXNvdXJjZT8uYXBpVmVyc2lvbixcbiAgICAgIHJlc291cmNlS2luZDogcmVzb3VyY2U/LmtpbmQsXG4gICAgICBoYXNNYW51YWxTY2hlbWE6ICEhdGhpcy5zY2hlbWEsXG4gICAgICB3b3Jrc3BhY2VIZWxwZXJBdmFpbGFibGU6IHRoaXMuc2NoZW1hU2VydmljZS5pc1dvcmtzcGFjZUhlbHBlckF2YWlsYWJsZSgpLFxuICAgICAgY3VycmVudFdvcmtzcGFjZTogdGhpcy5zY2hlbWFTZXJ2aWNlLndvcmtzcGFjZUhlbHBlcj8uYmFzZVBhcmFtc1NuYXBzaG90LFxuICAgIH07XG4gIH1cblxuICBvblRyeVlhbWwoeWFtbENvbnRlbnQ6IHN0cmluZykge1xuICAgIGxldCB0YXJnZXRZYW1sID0geWFtbENvbnRlbnQ7XG5cbiAgICBjb25zdCBuYW1lc3BhY2UgPVxuICAgICAgdGhpcy5zY2hlbWFTZXJ2aWNlLndvcmtzcGFjZUhlbHBlcj8uYmFzZVBhcmFtc1NuYXBzaG90Py5uYW1lc3BhY2U7XG5cbiAgICBpZiAodGhpcy5hdXRvRmlsbE5hbWVzcGFjZSAmJiBuYW1lc3BhY2UpIHtcbiAgICAgIHRhcmdldFlhbWwgPSBwYXJzZUFsbCh5YW1sQ29udGVudClcbiAgICAgICAgLmZpbHRlcihyID0+ICEhcilcbiAgICAgICAgLm1hcCgocjogS3ViZXJuZXRlc1Jlc291cmNlKSA9PiB7XG4gICAgICAgICAgaWYgKCFyPy5tZXRhZGF0YT8ubmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5yLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIC4uLnIubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAociA9PiBzdHJpbmdpZnkociwgeyBzb3J0TWFwRW50cmllczogdHJ1ZSB9KSlcbiAgICAgICAgLmpvaW4oJy0tLVxcclxcbicpO1xuICAgIH1cblxuICAgIHRoaXMudHJ5WWFtbC5lbWl0KHRhcmdldFlhbWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiuvue9riBZQU1MIHNjaGVtYSDku6Xmj5DkvpsgaG92ZXIg5o+Q56S65ZKM6Ieq5Yqo5a6M5oiQXG4gICAqL1xuICBzZXRZYW1sU2NoZW1hKHJlc291cmNlOiBULCBzY2hlbWE6IE9wZW5BUElWM1NjaGVtYU9iamVjdCkge1xuICAgIGlmICghc2NoZW1hKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g5L2/55SoIGFwaVZlcnNpb24gKyBraW5kIOe7hOWQiOS9nOS4uuagh+ivhlxuICAgIGNvbnN0IGFwaVZlcnNpb24gPSByZXNvdXJjZT8uYXBpVmVyc2lvbiB8fCAndW5rbm93bic7XG4gICAgY29uc3Qga2luZCA9IHJlc291cmNlPy5raW5kIHx8ICd1bmtub3duJztcbiAgICBjb25zdCBzY2hlbWFLZXkgPSBgJHthcGlWZXJzaW9ufS8ke2tpbmR9YDtcblxuICAgIHRoaXMubW9kZWxVcmkgPSBgJHtzY2hlbWFLZXl9LnlhbWxgO1xuXG4gICAgdGhpcy5zZWxmRm9sZE1hbmFnZWRGaWVsZHMoKTtcblxuICAgIC8vIOajgOafpeaYr+WQpuW3sue7j+azqOWGjOi/h+ebuOWQjOeahCBzY2hlbWHvvIzpgb/lhY3ph43lpI3ms6jlhoxcbiAgICBpZiAodGhpcy5yZWdpc3RlcmVkU2NoZW1hcy5oYXMoc2NoZW1hS2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOiOt+WPluWujOaVtOeahCBkZWZpbml0aW9ucyDku6XmlK/mjIEgJHJlZiDlvJXnlKhcbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuc2NoZW1hU2VydmljZS5kZWZpbml0aW9ucyB8fCB7fTtcblxuICAgIC8vIOWIm+W7uuWMheWQq+WujOaVtCBkZWZpbml0aW9ucyDnmoQgc2NoZW1hIOWvueixoVxuICAgIGNvbnN0IGZ1bGxTY2hlbWEgPSB7XG4gICAgICAuLi5zY2hlbWEsXG4gICAgICBkZWZpbml0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8g56Gu5L+dc2NoZW1h6KKr5q2j56Gu5rOo5YaM77yM5bm25ZCv55So6Ieq5Yqo5a6M5oiQ5Yqf6IO9XG4gICAgdGhpcy55YW1sU2NoZW1hU2VydmljZS5hZGRTY2hlbWEoe1xuICAgICAgdXJpOiBgazhzOi8vJHtzY2hlbWFLZXl9LnNjaGVtYS5qc29uYCxcbiAgICAgIGZpbGVNYXRjaDogW3RoaXMubW9kZWxVcmldLFxuICAgICAgc2NoZW1hOiBmdWxsU2NoZW1hLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcmVkU2NoZW1hcy5hZGQoc2NoZW1hS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgTW9uYWNvIOe8lui+keWZqOWunuS+i1xuICAgKi9cbiAgZ2V0RWRpdG9ySW5zdGFuY2UoKTpcbiAgICB8IGltcG9ydCgnbW9uYWNvLWVkaXRvcicpLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3JcbiAgICB8IG51bGwge1xuICAgIGlmICghdGhpcy5tb25hY29FZGl0b3IgJiYgdGhpcy5jb2RlRWRpdG9yUmVmPy5lZGl0b3IpIHtcbiAgICAgIHRoaXMubW9uYWNvRWRpdG9yID0gdGhpcy5jb2RlRWRpdG9yUmVmLmVkaXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9uYWNvRWRpdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIOaJi+WKqOaKmOWPoCBtYW5hZ2VkRmllbGRzXG4gICAqL1xuICBmb2xkTWFuYWdlZEZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvckluc3RhbmNlKCk7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgZm9sZE1hbmFnZWRGaWVsZHMoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxhdWktY2FyZCAqbmdJZj1cImhhc1dyYXBwZXI7IGVsc2UgY29udGVudFwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiIC8+XG48L2F1aS1jYXJkPlxuPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ5YW1sLWVkaXRvci1jb250YWluZXJcIlxuICAgIFtjbGFzcy53aXRoLXNpZGViYXJdPVwic2hvd1NpZGViYXIkJCB8IGFzeW5jXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ5YW1sLWVkaXRvci1zZWN0aW9uXCI+XG4gICAgICA8YXVpLWNvZGUtZWRpdG9yXG4gICAgICAgICNjb2RlRWRpdG9yXG4gICAgICAgIG5hbWU9XCJ5YW1sXCJcbiAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwib3JpZ2luYWxWYWx1ZVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgW2FjdGlvbnNDb25maWddPVwiYWN0aW9uc0NvbmZpZ1wiXG4gICAgICAgIFttb2RlbFVyaV09XCJtb2RlbFVyaVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgYXVpQ29kZUVkaXRvclRvb2xiYXJSaWdodFNpZGU+XG4gICAgICAgICAgPCEtLSBTY2hlbWEg5oyJ6ZKu77ya5b2T5ZCv55So5L6n6L655qCP5pe25pi+56S6IC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGF1aUJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaWRlYmFyRW5hYmxlICYmICEhKHJlc291cmNlJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cIiEhY29kZUVkaXRvci5mdWxsc2NyZWVuRGlhbG9nXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYXVpLWNvZGUtZWRpdG9yLXRvb2xiYXJfX2NvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgICAgIFt0eXBlXT1cIihzaG93U2lkZWJhciQkIHwgYXN5bmMpID8gJ3ByaW1hcnknIDogJ3RleHQnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhKGZpbmFsU2NoZW1hJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNpZGViYXIoKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiXG4gICAgICAgICAgICAgIChmaW5hbFNjaGVtYSQgfCBhc3luYykgPyAnJyA6ICgnc2NoZW1hX25vdF9hdmFpbGFibGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YXVpLWljb25cbiAgICAgICAgICAgICAgW2ljb25dPVwiXG4gICAgICAgICAgICAgICAgKHNob3dTaWRlYmFyJCQgfCBhc3luYylcbiAgICAgICAgICAgICAgICAgID8gJ3Byb2Q6ZXhwYW5kX3NpZGViYXInXG4gICAgICAgICAgICAgICAgICA6ICdwcm9kOmNvbGxhcHNlX3NpZGViYXInXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9hdWktaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2F1aS1jb2RlLWVkaXRvcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInlhbWwtc2lkZWJhci1zZWN0aW9uXCJcbiAgICAgICpuZ0lmPVwiKHNob3dTaWRlYmFyJCQgfCBhc3luYykgJiYgKHJlc291cmNlJCB8IGFzeW5jKVwiXG4gICAgPlxuICAgICAgPGFjbC1yZXNvdXJjZS15YW1sLXNpZGViYXJcbiAgICAgICAgW3Jlc291cmNlXT1cImdldEN1cnJlbnRSZXNvdXJjZSgpXCJcbiAgICAgICAgW3NjaGVtYV09XCJmaW5hbFNjaGVtYSQgfCBhc3luY1wiXG4gICAgICAgIFtzY2hlbWFFbmFibGVdPVwic2NoZW1hRW5hYmxlXCJcbiAgICAgICAgW2V4YW1wbGVFbmFibGVdPVwiZXhhbXBsZUVuYWJsZVwiXG4gICAgICAgIFtleHRyYUV4YW1wbGVzXT1cImV4dHJhRXhhbXBsZXNcIlxuICAgICAgICAoY2xvc2UpPVwidG9nZ2xlU2lkZWJhcigpXCJcbiAgICAgICAgKHRyeVlhbWwpPVwib25UcnlZYW1sKCRldmVudClcIlxuICAgICAgPjwvYWNsLXJlc291cmNlLXlhbWwtc2lkZWJhcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19