@alauda-fe/storage 0.0.1

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 (44) hide show
  1. package/esm2022/alauda-fe-storage.mjs +5 -0
  2. package/esm2022/index.mjs +23 -0
  3. package/esm2022/lib/components/pvc-delete-dialog/component.mjs +292 -0
  4. package/esm2022/lib/components/pvc-expand-capacity-dialog/component.mjs +193 -0
  5. package/esm2022/lib/components/pvc-form/component.mjs +674 -0
  6. package/esm2022/lib/components/rebuild-volume-dialog/component.mjs +251 -0
  7. package/esm2022/lib/components/source-link/component.mjs +81 -0
  8. package/esm2022/lib/components/spec-form/component.mjs +464 -0
  9. package/esm2022/lib/components/storage-feature-tags/component.mjs +146 -0
  10. package/esm2022/lib/components/storageclass-select/component.mjs +179 -0
  11. package/esm2022/lib/pipes/actual-capacity.pipe.mjs +17 -0
  12. package/esm2022/lib/services/common-util.service.mjs +163 -0
  13. package/esm2022/lib/services/pvc-util.service.mjs +416 -0
  14. package/esm2022/lib/types/commons.mjs +75 -0
  15. package/esm2022/lib/types/internal.mjs +7 -0
  16. package/esm2022/lib/types/k8s.mjs +2 -0
  17. package/esm2022/lib/types/resource-definition.mjs +13 -0
  18. package/esm2022/lib/types/resource-exports.mjs +8 -0
  19. package/esm2022/lib/types/resource-internals.mjs +2 -0
  20. package/esm2022/lib/utils/constants.mjs +202 -0
  21. package/esm2022/lib/utils/resource-exports.mjs +65 -0
  22. package/esm2022/lib/utils/util.mjs +132 -0
  23. package/index.d.ts +17 -0
  24. package/lib/components/pvc-delete-dialog/component.d.ts +33 -0
  25. package/lib/components/pvc-expand-capacity-dialog/component.d.ts +36 -0
  26. package/lib/components/pvc-form/component.d.ts +106 -0
  27. package/lib/components/rebuild-volume-dialog/component.d.ts +28 -0
  28. package/lib/components/source-link/component.d.ts +17 -0
  29. package/lib/components/spec-form/component.d.ts +71 -0
  30. package/lib/components/storage-feature-tags/component.d.ts +25 -0
  31. package/lib/components/storageclass-select/component.d.ts +26 -0
  32. package/lib/pipes/actual-capacity.pipe.d.ts +8 -0
  33. package/lib/services/common-util.service.d.ts +48 -0
  34. package/lib/services/pvc-util.service.d.ts +130 -0
  35. package/lib/types/commons.d.ts +85 -0
  36. package/lib/types/internal.d.ts +4 -0
  37. package/lib/types/k8s.d.ts +105 -0
  38. package/lib/types/resource-definition.d.ts +18 -0
  39. package/lib/types/resource-exports.d.ts +16 -0
  40. package/lib/types/resource-internals.d.ts +20 -0
  41. package/lib/utils/constants.d.ts +37 -0
  42. package/lib/utils/resource-exports.d.ts +12 -0
  43. package/lib/utils/util.d.ts +19 -0
  44. package/package.json +38 -0
@@ -0,0 +1,674 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { FormModule, IconModule, InputModule, RadioModule, SelectModule, TooltipModule, } from '@alauda/ui';
3
+ import { AccessModes, getK8sResourceAnnotationErrorMapper$, k8sResourceAnnotationValidator, getK8sResourceLabelErrorMapper$, k8sResourceLabelValidator, VolumeMode, FoldableBlockComponent, KeyValueFormTableComponent, createNestedFormControl, dataTransfer, ReadonlyFieldDirective, K8S_RESOURCE_NAME_BASE, CoerceNumberDirective, TranslateService, DisabledDirective, ObservableInput, K8sApiService, RESOURCE_TYPES, skipError, VolumeModes, publishRef, bind, TRANSLATE_MODULE, ERRORS_MAPPER_MODULE, PurePipe, POSITIVE_INT_PATTERN, } from '@alauda-fe/common';
4
+ import { AsyncPipe, LowerCasePipe, NgFor, NgIf } from '@angular/common';
5
+ import { ChangeDetectionStrategy, Component, Input, forwardRef, } from '@angular/core';
6
+ import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
7
+ import { compose } from 'ramda';
8
+ import { Observable, combineLatest, map, of, switchMap } from 'rxjs';
9
+ import { StorageCommonUtilService, } from '../../services/common-util.service';
10
+ import { AccessModeTranslateKey, VolumeModeTranslateKey, } from '../../utils/constants';
11
+ import { buildPvcResource } from '../../utils/util';
12
+ import { StorageFeatureTagsComponent } from '../storage-feature-tags/component';
13
+ import { StorageClassSelectComponent } from '../storageclass-select/component';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "../../services/common-util.service";
16
+ import * as i2 from "@alauda-fe/common";
17
+ import * as i3 from "@angular/forms";
18
+ import * as i4 from "@alauda/ui";
19
+ const _c0 = a0 => ({ pattern: a0 });
20
+ function PersistentVolumeClaimFormComponent_aui_form_item_0_Template(rf, ctx) { if (rf & 1) {
21
+ const _r1 = i0.ɵɵgetCurrentView();
22
+ i0.ɵɵelementStart(0, "aui-form-item", 12)(1, "label", 13);
23
+ i0.ɵɵtext(2);
24
+ i0.ɵɵpipe(3, "translate");
25
+ i0.ɵɵelementEnd();
26
+ i0.ɵɵelementStart(4, "input", 14, 0);
27
+ i0.ɵɵpipe(6, "translate");
28
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_0_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.model.name, $event) || (ctx_r1.model.name = $event); return i0.ɵɵresetView($event); });
29
+ i0.ɵɵelementEnd();
30
+ i0.ɵɵelement(7, "acl-errors-mapper", 15);
31
+ i0.ɵɵpipe(8, "translate");
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ const name_r3 = i0.ɵɵreference(5);
35
+ const ctx_r1 = i0.ɵɵnextContext();
36
+ i0.ɵɵadvance(2);
37
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "name"));
38
+ i0.ɵɵadvance(2);
39
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.name);
40
+ i0.ɵɵproperty("placeholder", i0.ɵɵpipeBind1(6, 8, ctx_r1.resourceNameReg.tip))("pattern", ctx_r1.resourceNameReg.pattern);
41
+ i0.ɵɵadvance(3);
42
+ i0.ɵɵproperty("errors", name_r3.errors)("errorsMapper", i0.ɵɵpureFunction1(12, _c0, i0.ɵɵpipeBind1(8, 10, ctx_r1.resourceNameReg.tip)));
43
+ } }
44
+ function PersistentVolumeClaimFormComponent_ng_container_2_aui_form_item_1_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 13);
46
+ i0.ɵɵtext(2);
47
+ i0.ɵɵpipe(3, "translate");
48
+ i0.ɵɵelementEnd();
49
+ i0.ɵɵtext(4);
50
+ i0.ɵɵelementEnd();
51
+ } if (rf & 2) {
52
+ const dataSource_r4 = ctx.ngIf;
53
+ i0.ɵɵadvance(2);
54
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "storage.data_source"));
55
+ i0.ɵɵadvance(2);
56
+ i0.ɵɵtextInterpolate1(" ", dataSource_r4.name, " ");
57
+ } }
58
+ function PersistentVolumeClaimFormComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
59
+ i0.ɵɵelementContainerStart(0);
60
+ i0.ɵɵtemplate(1, PersistentVolumeClaimFormComponent_ng_container_2_aui_form_item_1_Template, 5, 4, "aui-form-item", 10);
61
+ i0.ɵɵelementContainerEnd();
62
+ } if (rf & 2) {
63
+ const ctx_r1 = i0.ɵɵnextContext();
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵproperty("ngIf", ctx_r1.model.dataSource);
66
+ } }
67
+ function PersistentVolumeClaimFormComponent_aui_form_item_4_ng_template_11_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵtext(0);
69
+ i0.ɵɵpipe(1, "translate");
70
+ } if (rf & 2) {
71
+ const ctx_r1 = i0.ɵɵnextContext(2);
72
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(1, 1, ctx_r1.createMethod === ctx_r1.PvcStorageClassCreateType.DYNAMIC ? "storage.dynamic_create" : "storage.static_match"), " ");
73
+ } }
74
+ function PersistentVolumeClaimFormComponent_aui_form_item_4_Template(rf, ctx) { if (rf & 1) {
75
+ const _r5 = i0.ɵɵgetCurrentView();
76
+ i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 13);
77
+ i0.ɵɵtext(2);
78
+ i0.ɵɵpipe(3, "translate");
79
+ i0.ɵɵelementEnd();
80
+ i0.ɵɵelementStart(4, "aui-radio-group", 16);
81
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_4_Template_aui_radio_group_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.createMethod, $event) || (ctx_r1.createMethod = $event); return i0.ɵɵresetView($event); });
82
+ i0.ɵɵlistener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_4_Template_aui_radio_group_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createMethodChange($event)); });
83
+ i0.ɵɵelementStart(5, "aui-radio-button", 17);
84
+ i0.ɵɵtext(6);
85
+ i0.ɵɵpipe(7, "translate");
86
+ i0.ɵɵelementEnd();
87
+ i0.ɵɵelementStart(8, "aui-radio-button", 17);
88
+ i0.ɵɵtext(9);
89
+ i0.ɵɵpipe(10, "translate");
90
+ i0.ɵɵelementEnd()();
91
+ i0.ɵɵtemplate(11, PersistentVolumeClaimFormComponent_aui_form_item_4_ng_template_11_Template, 2, 3, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
92
+ i0.ɵɵelementEnd();
93
+ } if (rf & 2) {
94
+ const createTypeTmpl_r6 = i0.ɵɵreference(12);
95
+ const ctx_r1 = i0.ɵɵnextContext();
96
+ i0.ɵɵadvance(2);
97
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 8, "storage.create_method"));
98
+ i0.ɵɵadvance(2);
99
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.createMethod);
100
+ i0.ɵɵproperty("aclReadonlyField", ctx_r1.isFromSnapshot || !!ctx_r1.createType)("aclReadonlyFieldTemplate", createTypeTmpl_r6);
101
+ i0.ɵɵadvance();
102
+ i0.ɵɵproperty("value", ctx_r1.PvcStorageClassCreateType.DYNAMIC);
103
+ i0.ɵɵadvance();
104
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(7, 10, "storage.dynamic_create"), " ");
105
+ i0.ɵɵadvance(2);
106
+ i0.ɵɵproperty("value", ctx_r1.PvcStorageClassCreateType.STATIC);
107
+ i0.ɵɵadvance();
108
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(10, 12, "storage.static_match"), " ");
109
+ } }
110
+ function PersistentVolumeClaimFormComponent_ng_container_6_aui_form_item_1_Template(rf, ctx) { if (rf & 1) {
111
+ const _r7 = i0.ɵɵgetCurrentView();
112
+ i0.ɵɵelementStart(0, "aui-form-item", 18)(1, "label", 13);
113
+ i0.ɵɵtext(2);
114
+ i0.ɵɵpipe(3, "translate");
115
+ i0.ɵɵelementEnd();
116
+ i0.ɵɵelementStart(4, "acl-storageclass-select", 19, 2);
117
+ i0.ɵɵpipe(6, "async");
118
+ i0.ɵɵpipe(7, "async");
119
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_ng_container_6_aui_form_item_1_Template_acl_storageclass_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.model.storageClassName, $event) || (ctx_r1.model.storageClassName = $event); return i0.ɵɵresetView($event); });
120
+ i0.ɵɵlistener("storageClassChange", function PersistentVolumeClaimFormComponent_ng_container_6_aui_form_item_1_Template_acl_storageclass_select_storageClassChange_4_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.storageclassChange($event)); });
121
+ i0.ɵɵelementEnd();
122
+ i0.ɵɵelement(8, "acl-errors-mapper", 20);
123
+ i0.ɵɵelementEnd();
124
+ } if (rf & 2) {
125
+ const storageClassName_r8 = i0.ɵɵreference(5);
126
+ const ctx_r1 = i0.ɵɵnextContext(2);
127
+ i0.ɵɵadvance(2);
128
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "storageclass"));
129
+ i0.ɵɵadvance(2);
130
+ i0.ɵɵproperty("storageClasses", i0.ɵɵpipeBind1(6, 8, ctx_r1.storageClassList$))("volumeSnapshotClasses", i0.ɵɵpipeBind1(7, 10, ctx_r1.volumeSnapshotClassList$))("isFromSnapshot", ctx_r1.isFromSnapshot);
131
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.storageClassName);
132
+ i0.ɵɵadvance(4);
133
+ i0.ɵɵproperty("errors", storageClassName_r8.errors);
134
+ } }
135
+ function PersistentVolumeClaimFormComponent_ng_container_6_Template(rf, ctx) { if (rf & 1) {
136
+ i0.ɵɵelementContainerStart(0);
137
+ i0.ɵɵtemplate(1, PersistentVolumeClaimFormComponent_ng_container_6_aui_form_item_1_Template, 9, 12, "aui-form-item", 11);
138
+ i0.ɵɵelementContainerEnd();
139
+ } if (rf & 2) {
140
+ const ctx_r1 = i0.ɵɵnextContext();
141
+ i0.ɵɵadvance();
142
+ i0.ɵɵproperty("ngIf", ctx_r1.createMethod !== ctx_r1.PvcStorageClassCreateType.STATIC);
143
+ } }
144
+ function PersistentVolumeClaimFormComponent_aui_form_item_8_aui_radio_button_6_Template(rf, ctx) { if (rf & 1) {
145
+ i0.ɵɵelementStart(0, "aui-radio-button", 25);
146
+ i0.ɵɵpipe(1, "translate");
147
+ i0.ɵɵpipe(2, "pure");
148
+ i0.ɵɵpipe(3, "pure");
149
+ i0.ɵɵtext(4);
150
+ i0.ɵɵpipe(5, "translate");
151
+ i0.ɵɵelementEnd();
152
+ } if (rf & 2) {
153
+ const mode_r10 = ctx.$implicit;
154
+ const ctx_r1 = i0.ɵɵnextContext(2);
155
+ i0.ɵɵproperty("auiTooltip", i0.ɵɵpipeBind1(1, 5, "storage.storage_forbid_select_access_mode"))("auiTooltipDisabled", !i0.ɵɵpipeBind3(2, 7, mode_r10, ctx_r1.storageCommonUtil.isAccessModeDisabled, ctx_r1.selectedStorageSelectOption))("value", mode_r10)("disabled", i0.ɵɵpipeBind3(3, 11, mode_r10, ctx_r1.storageCommonUtil.isAccessModeDisabled, ctx_r1.selectedStorageSelectOption));
156
+ i0.ɵɵadvance(4);
157
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 15, "storage." + ctx_r1.AccessModeTranslateKey[mode_r10]), " ");
158
+ } }
159
+ function PersistentVolumeClaimFormComponent_aui_form_item_8_ng_template_10_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "ul", 26)(1, "li");
161
+ i0.ɵɵtext(2);
162
+ i0.ɵɵpipe(3, "translate");
163
+ i0.ɵɵelementEnd();
164
+ i0.ɵɵelementStart(4, "li");
165
+ i0.ɵɵtext(5);
166
+ i0.ɵɵpipe(6, "translate");
167
+ i0.ɵɵelementEnd();
168
+ i0.ɵɵelementStart(7, "li");
169
+ i0.ɵɵtext(8);
170
+ i0.ɵɵpipe(9, "translate");
171
+ i0.ɵɵelementEnd()();
172
+ } if (rf & 2) {
173
+ i0.ɵɵadvance(2);
174
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 3, "storage.access_mode_rwo"));
175
+ i0.ɵɵadvance(3);
176
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 5, "storage.access_mode_rox"));
177
+ i0.ɵɵadvance(3);
178
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 7, "storage.access_mode_rwx"));
179
+ } }
180
+ function PersistentVolumeClaimFormComponent_aui_form_item_8_Template(rf, ctx) { if (rf & 1) {
181
+ const _r9 = i0.ɵɵgetCurrentView();
182
+ i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 13);
183
+ i0.ɵɵtext(2);
184
+ i0.ɵɵpipe(3, "translate");
185
+ i0.ɵɵelementEnd();
186
+ i0.ɵɵelementStart(4, "aui-radio-group", 21, 3);
187
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_8_Template_aui_radio_group_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.model.accessModes, $event) || (ctx_r1.model.accessModes = $event); return i0.ɵɵresetView($event); });
188
+ i0.ɵɵtemplate(6, PersistentVolumeClaimFormComponent_aui_form_item_8_aui_radio_button_6_Template, 6, 17, "aui-radio-button", 22);
189
+ i0.ɵɵelementEnd();
190
+ i0.ɵɵelementStart(7, "div", 23);
191
+ i0.ɵɵelement(8, "aui-icon", 24);
192
+ i0.ɵɵelementEnd();
193
+ i0.ɵɵelement(9, "acl-errors-mapper", 20);
194
+ i0.ɵɵtemplate(10, PersistentVolumeClaimFormComponent_aui_form_item_8_ng_template_10_Template, 10, 9, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
195
+ i0.ɵɵelementEnd();
196
+ } if (rf & 2) {
197
+ const accessMode_r11 = i0.ɵɵreference(5);
198
+ const accessModeTip_r12 = i0.ɵɵreference(11);
199
+ const ctx_r1 = i0.ɵɵnextContext();
200
+ i0.ɵɵadvance(2);
201
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "storage.access_mode"));
202
+ i0.ɵɵadvance(2);
203
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.accessModes);
204
+ i0.ɵɵadvance(2);
205
+ i0.ɵɵproperty("ngForOf", ctx_r1.accessModes);
206
+ i0.ɵɵadvance(2);
207
+ i0.ɵɵproperty("auiTooltip", accessModeTip_r12)("auiTooltipPosition", "top center");
208
+ i0.ɵɵadvance();
209
+ i0.ɵɵproperty("errors", accessMode_r11.errors);
210
+ } }
211
+ function PersistentVolumeClaimFormComponent_aui_form_item_10_aui_select_6_aui_option_1_Template(rf, ctx) { if (rf & 1) {
212
+ i0.ɵɵelementStart(0, "aui-option", 31);
213
+ i0.ɵɵtext(1);
214
+ i0.ɵɵelementEnd();
215
+ } if (rf & 2) {
216
+ const item_r15 = ctx.$implicit;
217
+ i0.ɵɵproperty("label", item_r15)("value", item_r15);
218
+ i0.ɵɵadvance();
219
+ i0.ɵɵtextInterpolate1(" ", item_r15, " ");
220
+ } }
221
+ function PersistentVolumeClaimFormComponent_aui_form_item_10_aui_select_6_Template(rf, ctx) { if (rf & 1) {
222
+ const _r14 = i0.ɵɵgetCurrentView();
223
+ i0.ɵɵelementStart(0, "aui-select", 29);
224
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_10_aui_select_6_Template_aui_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.unit, $event) || (ctx_r1.unit = $event); return i0.ɵɵresetView($event); });
225
+ i0.ɵɵtemplate(1, PersistentVolumeClaimFormComponent_aui_form_item_10_aui_select_6_aui_option_1_Template, 2, 3, "aui-option", 30);
226
+ i0.ɵɵelementEnd();
227
+ } if (rf & 2) {
228
+ const ctx_r1 = i0.ɵɵnextContext(2);
229
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.unit);
230
+ i0.ɵɵadvance();
231
+ i0.ɵɵproperty("ngForOf", ctx_r1.UNITS);
232
+ } }
233
+ function PersistentVolumeClaimFormComponent_aui_form_item_10_ng_template_7_Template(rf, ctx) { if (rf & 1) {
234
+ i0.ɵɵtext(0);
235
+ } if (rf & 2) {
236
+ const ctx_r1 = i0.ɵɵnextContext(2);
237
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.model.storage, "Gi ");
238
+ } }
239
+ function PersistentVolumeClaimFormComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) {
240
+ const _r13 = i0.ɵɵgetCurrentView();
241
+ i0.ɵɵelementStart(0, "aui-form-item", 18)(1, "label", 13);
242
+ i0.ɵɵtext(2);
243
+ i0.ɵɵpipe(3, "translate");
244
+ i0.ɵɵelementEnd();
245
+ i0.ɵɵelementStart(4, "input", 27, 5);
246
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_10_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.model.storage, $event) || (ctx_r1.model.storage = $event); return i0.ɵɵresetView($event); });
247
+ i0.ɵɵelementEnd();
248
+ i0.ɵɵtemplate(6, PersistentVolumeClaimFormComponent_aui_form_item_10_aui_select_6_Template, 2, 2, "aui-select", 28)(7, PersistentVolumeClaimFormComponent_aui_form_item_10_ng_template_7_Template, 1, 1, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
249
+ i0.ɵɵelement(9, "acl-errors-mapper", 15);
250
+ i0.ɵɵpipe(10, "translate");
251
+ i0.ɵɵelementEnd();
252
+ } if (rf & 2) {
253
+ const storage_r16 = i0.ɵɵreference(5);
254
+ const capacityTpl_r17 = i0.ɵɵreference(8);
255
+ const ctx_r1 = i0.ɵɵnextContext();
256
+ i0.ɵɵadvance(2);
257
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 8, "storage.capacity"));
258
+ i0.ɵɵadvance(2);
259
+ i0.ɵɵproperty("pattern", ctx_r1.POSITIVE_INT_PATTERN.pattern);
260
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.storage);
261
+ i0.ɵɵproperty("aclReadonlyField", ctx_r1.isFromSnapshot)("aclReadonlyFieldTemplate", capacityTpl_r17);
262
+ i0.ɵɵadvance(2);
263
+ i0.ɵɵproperty("ngIf", !ctx_r1.isFromSnapshot);
264
+ i0.ɵɵadvance(3);
265
+ i0.ɵɵproperty("errors", storage_r16.errors)("errorsMapper", i0.ɵɵpureFunction1(12, _c0, i0.ɵɵpipeBind1(10, 10, ctx_r1.POSITIVE_INT_PATTERN.tip)));
266
+ } }
267
+ function PersistentVolumeClaimFormComponent_aui_form_item_12_aui_radio_button_5_Template(rf, ctx) { if (rf & 1) {
268
+ i0.ɵɵelementStart(0, "aui-radio-button", 35);
269
+ i0.ɵɵpipe(1, "translate");
270
+ i0.ɵɵpipe(2, "pure");
271
+ i0.ɵɵpipe(3, "pure");
272
+ i0.ɵɵtext(4);
273
+ i0.ɵɵpipe(5, "translate");
274
+ i0.ɵɵelementEnd();
275
+ } if (rf & 2) {
276
+ const mode_r19 = ctx.$implicit;
277
+ const ctx_r1 = i0.ɵɵnextContext(2);
278
+ i0.ɵɵproperty("auiTooltip", i0.ɵɵpipeBind1(1, 5, "storage.storage_forbid_select_volume_mode"))("auiTooltipDisabled", !i0.ɵɵpipeBind3(2, 7, mode_r19, ctx_r1.storageCommonUtil.isVolumeModeDisabled, ctx_r1.selectedStorageSelectOption))("disabled", i0.ɵɵpipeBind3(3, 11, mode_r19, ctx_r1.storageCommonUtil.isVolumeModeDisabled, ctx_r1.selectedStorageSelectOption))("value", mode_r19);
279
+ i0.ɵɵadvance(4);
280
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 15, "storage." + ctx_r1.VolumeModeTranslateKey[mode_r19]), " ");
281
+ } }
282
+ function PersistentVolumeClaimFormComponent_aui_form_item_12_div_6_Template(rf, ctx) { if (rf & 1) {
283
+ i0.ɵɵelementStart(0, "div", 23);
284
+ i0.ɵɵelement(1, "aui-icon", 24);
285
+ i0.ɵɵelementEnd();
286
+ } if (rf & 2) {
287
+ i0.ɵɵnextContext();
288
+ const volumeModeTip_r20 = i0.ɵɵreference(8);
289
+ i0.ɵɵadvance();
290
+ i0.ɵɵproperty("auiTooltip", volumeModeTip_r20)("auiTooltipPosition", "top center");
291
+ } }
292
+ function PersistentVolumeClaimFormComponent_aui_form_item_12_ng_template_7_Template(rf, ctx) { if (rf & 1) {
293
+ i0.ɵɵelementStart(0, "ul", 26)(1, "li");
294
+ i0.ɵɵtext(2);
295
+ i0.ɵɵpipe(3, "translate");
296
+ i0.ɵɵelementEnd();
297
+ i0.ɵɵelementStart(4, "li");
298
+ i0.ɵɵtext(5);
299
+ i0.ɵɵpipe(6, "translate");
300
+ i0.ɵɵelementEnd()();
301
+ } if (rf & 2) {
302
+ i0.ɵɵadvance(2);
303
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 2, "storage.volume_mode_file_system_hint"));
304
+ i0.ɵɵadvance(3);
305
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 4, "storage.volume_mode_block_device_hint"));
306
+ } }
307
+ function PersistentVolumeClaimFormComponent_aui_form_item_12_ng_template_9_Template(rf, ctx) { if (rf & 1) {
308
+ i0.ɵɵtext(0);
309
+ i0.ɵɵpipe(1, "translate");
310
+ } if (rf & 2) {
311
+ const ctx_r1 = i0.ɵɵnextContext(2);
312
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(1, 1, ctx_r1.model.volumeMode === "Filesystem" ? "storage.file_system" : "storage.block_device"), " ");
313
+ } }
314
+ function PersistentVolumeClaimFormComponent_aui_form_item_12_Template(rf, ctx) { if (rf & 1) {
315
+ const _r18 = i0.ɵɵgetCurrentView();
316
+ i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 13);
317
+ i0.ɵɵtext(2);
318
+ i0.ɵɵpipe(3, "translate");
319
+ i0.ɵɵelementEnd();
320
+ i0.ɵɵelementStart(4, "aui-radio-group", 32);
321
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_aui_form_item_12_Template_aui_radio_group_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.model.volumeMode, $event) || (ctx_r1.model.volumeMode = $event); return i0.ɵɵresetView($event); });
322
+ i0.ɵɵtemplate(5, PersistentVolumeClaimFormComponent_aui_form_item_12_aui_radio_button_5_Template, 6, 17, "aui-radio-button", 33);
323
+ i0.ɵɵelementEnd();
324
+ i0.ɵɵtemplate(6, PersistentVolumeClaimFormComponent_aui_form_item_12_div_6_Template, 2, 2, "div", 34)(7, PersistentVolumeClaimFormComponent_aui_form_item_12_ng_template_7_Template, 7, 6, "ng-template", null, 7, i0.ɵɵtemplateRefExtractor)(9, PersistentVolumeClaimFormComponent_aui_form_item_12_ng_template_9_Template, 2, 3, "ng-template", null, 8, i0.ɵɵtemplateRefExtractor);
325
+ i0.ɵɵelementEnd();
326
+ } if (rf & 2) {
327
+ const volumeModeTmpl_r21 = i0.ɵɵreference(10);
328
+ const ctx_r1 = i0.ɵɵnextContext();
329
+ i0.ɵɵadvance(2);
330
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "storage.volume_mode"));
331
+ i0.ɵɵadvance(2);
332
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.volumeMode);
333
+ i0.ɵɵproperty("aclReadonlyField", ctx_r1.isFromSnapshot || !!ctx_r1.volumeMode)("aclReadonlyFieldTemplate", volumeModeTmpl_r21);
334
+ i0.ɵɵadvance();
335
+ i0.ɵɵproperty("ngForOf", ctx_r1.volumeModes);
336
+ i0.ɵɵadvance();
337
+ i0.ɵɵproperty("ngIf", !ctx_r1.volumeMode);
338
+ } }
339
+ function PersistentVolumeClaimFormComponent_ng_container_14_aui_form_item_3_Template(rf, ctx) { if (rf & 1) {
340
+ const _r22 = i0.ɵɵgetCurrentView();
341
+ i0.ɵɵelementStart(0, "aui-form-item", 38)(1, "label", 13);
342
+ i0.ɵɵtext(2);
343
+ i0.ɵɵpipe(3, "translate");
344
+ i0.ɵɵelementEnd();
345
+ i0.ɵɵelementStart(4, "acl-key-value-form-table", 39);
346
+ i0.ɵɵpipe(5, "translate");
347
+ i0.ɵɵpipe(6, "lowercase");
348
+ i0.ɵɵpipe(7, "async");
349
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_ng_container_14_aui_form_item_3_Template_acl_key_value_form_table_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.model.labels, $event) || (ctx_r1.model.labels = $event); return i0.ɵɵresetView($event); });
350
+ i0.ɵɵelementEnd()();
351
+ } if (rf & 2) {
352
+ const ctx_r1 = i0.ɵɵnextContext(2);
353
+ i0.ɵɵadvance(2);
354
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 5, "label"));
355
+ i0.ɵɵadvance(2);
356
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.labels);
357
+ i0.ɵɵproperty("resourceNameTranslated", i0.ɵɵpipeBind1(6, 9, i0.ɵɵpipeBind1(5, 7, "storage.labels")))("validator", ctx_r1.labelValidator)("errorMapper", i0.ɵɵpipeBind1(7, 11, ctx_r1.labelErrorMapper$));
358
+ } }
359
+ function PersistentVolumeClaimFormComponent_ng_container_14_aui_form_item_5_Template(rf, ctx) { if (rf & 1) {
360
+ const _r23 = i0.ɵɵgetCurrentView();
361
+ i0.ɵɵelementStart(0, "aui-form-item", 38)(1, "label", 13);
362
+ i0.ɵɵtext(2);
363
+ i0.ɵɵpipe(3, "translate");
364
+ i0.ɵɵelementEnd();
365
+ i0.ɵɵelementStart(4, "acl-key-value-form-table", 40);
366
+ i0.ɵɵpipe(5, "translate");
367
+ i0.ɵɵpipe(6, "lowercase");
368
+ i0.ɵɵpipe(7, "async");
369
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_ng_container_14_aui_form_item_5_Template_acl_key_value_form_table_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.model.annotations, $event) || (ctx_r1.model.annotations = $event); return i0.ɵɵresetView($event); });
370
+ i0.ɵɵelementEnd()();
371
+ } if (rf & 2) {
372
+ const ctx_r1 = i0.ɵɵnextContext(2);
373
+ i0.ɵɵadvance(2);
374
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 5, "storage.k8s_annotation"));
375
+ i0.ɵɵadvance(2);
376
+ i0.ɵɵproperty("resourceNameTranslated", i0.ɵɵpipeBind1(6, 9, i0.ɵɵpipeBind1(5, 7, "storage.k8s_annotation")));
377
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.annotations);
378
+ i0.ɵɵproperty("validator", ctx_r1.annotationValidator)("errorMapper", i0.ɵɵpipeBind1(7, 11, ctx_r1.annotationErrorMapper$));
379
+ } }
380
+ function PersistentVolumeClaimFormComponent_ng_container_14_ng_container_7_Template(rf, ctx) { if (rf & 1) {
381
+ const _r24 = i0.ɵɵgetCurrentView();
382
+ i0.ɵɵelementContainerStart(0);
383
+ i0.ɵɵelementStart(1, "aui-form-item", 41)(2, "label", 13);
384
+ i0.ɵɵtext(3);
385
+ i0.ɵɵpipe(4, "translate");
386
+ i0.ɵɵelementEnd();
387
+ i0.ɵɵelementStart(5, "acl-key-value-form-table", 42);
388
+ i0.ɵɵtwoWayListener("ngModelChange", function PersistentVolumeClaimFormComponent_ng_container_14_ng_container_7_Template_acl_key_value_form_table_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.model.selector, $event) || (ctx_r1.model.selector = $event); return i0.ɵɵresetView($event); });
389
+ i0.ɵɵelementEnd()();
390
+ i0.ɵɵelementContainerEnd();
391
+ } if (rf & 2) {
392
+ const ctx_r1 = i0.ɵɵnextContext(2);
393
+ i0.ɵɵadvance();
394
+ i0.ɵɵproperty("hidden", ctx_r1.createMethod === ctx_r1.PvcStorageClassCreateType.DYNAMIC);
395
+ i0.ɵɵadvance(2);
396
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 3, "storage.selector"));
397
+ i0.ɵɵadvance(2);
398
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.model.selector);
399
+ } }
400
+ function PersistentVolumeClaimFormComponent_ng_container_14_Template(rf, ctx) { if (rf & 1) {
401
+ i0.ɵɵelementContainerStart(0);
402
+ i0.ɵɵelementStart(1, "acl-foldable-block", 36);
403
+ i0.ɵɵpipe(2, "translate");
404
+ i0.ɵɵtemplate(3, PersistentVolumeClaimFormComponent_ng_container_14_aui_form_item_3_Template, 8, 13, "aui-form-item", 37);
405
+ i0.ɵɵpipe(4, "pure");
406
+ i0.ɵɵtemplate(5, PersistentVolumeClaimFormComponent_ng_container_14_aui_form_item_5_Template, 8, 13, "aui-form-item", 37);
407
+ i0.ɵɵpipe(6, "pure");
408
+ i0.ɵɵtemplate(7, PersistentVolumeClaimFormComponent_ng_container_14_ng_container_7_Template, 6, 5, "ng-container", 10);
409
+ i0.ɵɵpipe(8, "pure");
410
+ i0.ɵɵelementEnd();
411
+ i0.ɵɵelementContainerEnd();
412
+ } if (rf & 2) {
413
+ const ctx_r1 = i0.ɵɵnextContext();
414
+ i0.ɵɵadvance();
415
+ i0.ɵɵpropertyInterpolate("hint", i0.ɵɵpipeBind1(2, 4, "storage.advanced"));
416
+ i0.ɵɵadvance(2);
417
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(4, 6, "labels", ctx_r1.displayFieldSupported));
418
+ i0.ɵɵadvance(2);
419
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(6, 9, "annotations", ctx_r1.displayFieldSupported));
420
+ i0.ɵɵadvance(2);
421
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(8, 12, "selector", ctx_r1.displayFieldSupported));
422
+ } }
423
+ const PvcStorageClassCreateType = {
424
+ DYNAMIC: 'dynamic',
425
+ STATIC: 'static',
426
+ };
427
+ const UNITS = ['Gi', 'Ti'];
428
+ export class PersistentVolumeClaimFormComponent extends createNestedFormControl({
429
+ autoEmitChange: true,
430
+ }) {
431
+ get showAdvancedField() {
432
+ if (!this.displayFields?.length) {
433
+ return true;
434
+ }
435
+ return this.displayFields?.some(field => ['labels', 'annotations', 'selector'].includes(field));
436
+ }
437
+ writeValue(value) {
438
+ this.model = this.valueIn(value ??
439
+ buildPvcResource({
440
+ namespace: this.baseParams.namespace,
441
+ volumeMode: this.volumeMode,
442
+ }));
443
+ if (this.createType) {
444
+ this.createMethod = this.createType;
445
+ }
446
+ }
447
+ constructor(storageCommonUtil, translate, k8sApi) {
448
+ super();
449
+ this.storageCommonUtil = storageCommonUtil;
450
+ this.translate = translate;
451
+ this.k8sApi = k8sApi;
452
+ this.accessModes = AccessModes;
453
+ this.volumeModes = VolumeModes;
454
+ this.POSITIVE_INT_PATTERN = POSITIVE_INT_PATTERN;
455
+ this.model = {};
456
+ this.resourceNameReg = K8S_RESOURCE_NAME_BASE;
457
+ this.labelValidator = k8sResourceLabelValidator;
458
+ this.AccessModeTranslateKey = AccessModeTranslateKey;
459
+ this.VolumeModeTranslateKey = VolumeModeTranslateKey;
460
+ this.labelErrorMapper$ = getK8sResourceLabelErrorMapper$(this.translate);
461
+ this.annotationValidator = k8sResourceAnnotationValidator;
462
+ this.annotationErrorMapper$ = getK8sResourceAnnotationErrorMapper$(this.translate);
463
+ this.PvcStorageClassCreateType = PvcStorageClassCreateType;
464
+ this.UNITS = UNITS;
465
+ this.unit = 'Gi';
466
+ this.storageClassList$ = combineLatest([
467
+ this.baseParams$,
468
+ this.storageClasses$,
469
+ ]).pipe(switchMap(([{ cluster }, storageClasses]) => {
470
+ if (storageClasses) {
471
+ return of(storageClasses);
472
+ }
473
+ return this.k8sApi
474
+ .getResourceList({
475
+ type: RESOURCE_TYPES.STORAGE_CLASS,
476
+ cluster,
477
+ queryParams: {
478
+ limit: '0',
479
+ },
480
+ })
481
+ .pipe(map(res => res?.items));
482
+ }), publishRef());
483
+ this.volumeSnapshotClassList$ = this.baseParams$.pipe(switchMap(baseParams => this.k8sApi
484
+ .getResourceList({
485
+ type: RESOURCE_TYPES.VOLUME_SNAPSHOT_CLASS,
486
+ cluster: baseParams.cluster,
487
+ })
488
+ .pipe(map(r => r.items), skipError([]))), publishRef());
489
+ this.adaptResourceModel = (pvc) => {
490
+ const storage = pvc?.spec?.resources?.requests?.storage;
491
+ if (storage) {
492
+ const res = String(storage).match(/[A-Za-z]+|\d+(?:\.\d+)?/g);
493
+ pvc.spec.resources.requests.storage = res[0] || '';
494
+ this.unit = res[1] || 'Gi';
495
+ }
496
+ // "" 表示静态创建
497
+ this.createMethod =
498
+ pvc?.spec?.storageClassName === '' ? 'static' : 'dynamic';
499
+ return pvc;
500
+ };
501
+ this.overrideResource = (pvc) => {
502
+ if (this.createMethod === 'dynamic' ||
503
+ Object.keys(pvc?.spec?.selector?.matchLabels ?? {}).length === 0) {
504
+ delete pvc?.spec?.selector;
505
+ }
506
+ if (this.createMethod === 'static') {
507
+ pvc.spec.storageClassName = '';
508
+ }
509
+ if (pvc?.spec?.resources?.requests?.storage) {
510
+ pvc.spec.resources.requests.storage = `${pvc.spec.resources.requests.storage}${this.unit}`;
511
+ }
512
+ return pvc;
513
+ };
514
+ const [toModel, toResource] = dataTransfer({
515
+ name: 'metadata.name',
516
+ labels: 'metadata.labels',
517
+ annotations: 'metadata.annotations',
518
+ storageClassName: 'spec.storageClassName',
519
+ accessModes: ['spec', 'accessModes', 0],
520
+ volumeMode: 'spec.volumeMode',
521
+ storage: 'spec.resources.requests.storage',
522
+ dataSource: 'spec.dataSource',
523
+ selector: 'spec.selector.matchLabels',
524
+ });
525
+ this.valueIn = compose(toModel, this.adaptResourceModel);
526
+ this.modelOut = compose(this.overrideResource, toResource);
527
+ }
528
+ createMethodChange(createType) {
529
+ // 静态匹配不需要限制访问模式
530
+ if (createType === 'static') {
531
+ this.selectedStorageSelectOption = null;
532
+ }
533
+ }
534
+ storageclassChange(selectedOption) {
535
+ this.selectedStorageSelectOption = selectedOption;
536
+ this.setAccessModeToSupportValueIfNeed();
537
+ this.setVolumeModeToSupportValueIfNeed();
538
+ }
539
+ displayFieldSupported(fieldName) {
540
+ if (!this.displayFields?.length) {
541
+ return true;
542
+ }
543
+ return this.displayFields.includes(fieldName);
544
+ }
545
+ setAccessModeToSupportValueIfNeed() {
546
+ if (this.storageCommonUtil.isAccessModeDisabled(this.model.accessModes, this.selectedStorageSelectOption)) {
547
+ this.model.accessModes = this.accessModes.find(accessMode => !this.storageCommonUtil.isAccessModeDisabled(accessMode, this.selectedStorageSelectOption));
548
+ }
549
+ }
550
+ setVolumeModeToSupportValueIfNeed() {
551
+ if (this.storageCommonUtil.isVolumeModeDisabled(this.model.volumeMode, this.selectedStorageSelectOption)) {
552
+ this.model.volumeMode = this.volumeModes.find(volumeMode => !this.storageCommonUtil.isVolumeModeDisabled(volumeMode, this.selectedStorageSelectOption));
553
+ }
554
+ }
555
+ static { this.ɵfac = function PersistentVolumeClaimFormComponent_Factory(t) { return new (t || PersistentVolumeClaimFormComponent)(i0.ɵɵdirectiveInject(i1.StorageCommonUtilService), i0.ɵɵdirectiveInject(i2.TranslateService), i0.ɵɵdirectiveInject(i2.K8sApiService)); }; }
556
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PersistentVolumeClaimFormComponent, selectors: [["acl-pvc-form"]], inputs: { baseParams: "baseParams", storageClasses: "storageClasses", isFromSnapshot: "isFromSnapshot", createType: "createType", volumeMode: "volumeMode", displayFields: "displayFields" }, standalone: true, features: [i0.ɵɵProvidersFeature([
557
+ {
558
+ provide: NG_VALUE_ACCESSOR,
559
+ useExisting: forwardRef(() => PersistentVolumeClaimFormComponent),
560
+ multi: true,
561
+ },
562
+ {
563
+ provide: NG_VALIDATORS,
564
+ useExisting: forwardRef(() => PersistentVolumeClaimFormComponent),
565
+ multi: true,
566
+ },
567
+ ]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 15, vars: 29, consts: [["name", "ngModel"], ["createTypeTmpl", ""], ["storageClassName", "ngModel"], ["accessMode", "ngModel"], ["accessModeTip", ""], ["storage", "ngModel"], ["capacityTpl", ""], ["volumeModeTip", ""], ["volumeModeTmpl", ""], ["width", "large", 4, "ngIf"], [4, "ngIf"], ["width", "medium", 4, "ngIf"], ["width", "large"], ["auiFormItemLabel", ""], ["aui-input", "", "auiFormItemControl", "", "name", "name", "maxlength", "63", "required", "", 3, "ngModelChange", "ngModel", "placeholder", "pattern"], ["auiFormItemError", "", 3, "errors", "errorsMapper"], ["size", "medium", "name", "createMethod", 3, "ngModelChange", "ngModel", "aclReadonlyField", "aclReadonlyFieldTemplate"], [3, "value"], ["width", "medium"], ["auiFormItemControl", "", "required", "", "name", "storageClassName", 3, "ngModelChange", "storageClassChange", "storageClasses", "volumeSnapshotClasses", "isFromSnapshot", "ngModel"], ["auiFormItemError", "", 3, "errors"], ["auiFormItemControl", "", "required", "", "name", "accessModes", 3, "ngModelChange", "ngModel"], [3, "auiTooltip", "auiTooltipDisabled", "value", "disabled", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", ""], ["icon", "question_circle", 1, "icon--help", 3, "auiTooltip", "auiTooltipPosition"], [3, "auiTooltip", "auiTooltipDisabled", "value", "disabled"], [1, "d-list"], ["aui-input", "", "type", "text", "name", "storage", "required", "", "auiFormItemControl", "", "required", "", 3, "ngModelChange", "pattern", "ngModel", "aclReadonlyField", "aclReadonlyFieldTemplate"], ["class", "tw-max-w-[60px] tw-ml-[-60px]", 3, "ngModel", "ngModelChange", 4, "ngIf"], [1, "tw-max-w-[60px]", "tw-ml-[-60px]", 3, "ngModelChange", "ngModel"], [3, "label", "value", 4, "ngFor", "ngForOf"], [3, "label", "value"], ["size", "medium", "name", "volumeMode", 3, "ngModelChange", "ngModel", "aclReadonlyField", "aclReadonlyFieldTemplate"], [3, "auiTooltip", "auiTooltipDisabled", "disabled", "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", 4, "ngIf"], [3, "auiTooltip", "auiTooltipDisabled", "disabled", "value"], [3, "hint"], ["formGroupName", "metadata", 4, "ngIf"], ["formGroupName", "metadata"], ["auiFormItemControl", "", "name", "labels", 3, "ngModelChange", "ngModel", "resourceNameTranslated", "validator", "errorMapper"], ["auiFormItemControl", "", "name", "annotations", 3, "ngModelChange", "resourceNameTranslated", "ngModel", "validator", "errorMapper"], [3, "hidden"], ["auiFormItemControl", "", "name", "selector", 3, "ngModelChange", "ngModel"]], template: function PersistentVolumeClaimFormComponent_Template(rf, ctx) { if (rf & 1) {
568
+ i0.ɵɵtemplate(0, PersistentVolumeClaimFormComponent_aui_form_item_0_Template, 9, 14, "aui-form-item", 9);
569
+ i0.ɵɵpipe(1, "pure");
570
+ i0.ɵɵtemplate(2, PersistentVolumeClaimFormComponent_ng_container_2_Template, 2, 1, "ng-container", 10);
571
+ i0.ɵɵpipe(3, "pure");
572
+ i0.ɵɵtemplate(4, PersistentVolumeClaimFormComponent_aui_form_item_4_Template, 13, 14, "aui-form-item", 10);
573
+ i0.ɵɵpipe(5, "pure");
574
+ i0.ɵɵtemplate(6, PersistentVolumeClaimFormComponent_ng_container_6_Template, 2, 1, "ng-container", 10);
575
+ i0.ɵɵpipe(7, "pure");
576
+ i0.ɵɵtemplate(8, PersistentVolumeClaimFormComponent_aui_form_item_8_Template, 12, 8, "aui-form-item", 10);
577
+ i0.ɵɵpipe(9, "pure");
578
+ i0.ɵɵtemplate(10, PersistentVolumeClaimFormComponent_aui_form_item_10_Template, 11, 14, "aui-form-item", 11);
579
+ i0.ɵɵpipe(11, "pure");
580
+ i0.ɵɵtemplate(12, PersistentVolumeClaimFormComponent_aui_form_item_12_Template, 11, 8, "aui-form-item", 10);
581
+ i0.ɵɵpipe(13, "pure");
582
+ i0.ɵɵtemplate(14, PersistentVolumeClaimFormComponent_ng_container_14_Template, 9, 15, "ng-container", 10);
583
+ } if (rf & 2) {
584
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(1, 8, "name", ctx.displayFieldSupported));
585
+ i0.ɵɵadvance(2);
586
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(3, 11, "dataSource", ctx.displayFieldSupported));
587
+ i0.ɵɵadvance(2);
588
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(5, 14, "createType", ctx.displayFieldSupported));
589
+ i0.ɵɵadvance(2);
590
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(7, 17, "storageClassName", ctx.displayFieldSupported));
591
+ i0.ɵɵadvance(2);
592
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(9, 20, "accessModes", ctx.displayFieldSupported));
593
+ i0.ɵɵadvance(2);
594
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(11, 23, "storage", ctx.displayFieldSupported));
595
+ i0.ɵɵadvance(2);
596
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind2(13, 26, "volumeMode", ctx.displayFieldSupported));
597
+ i0.ɵɵadvance(2);
598
+ i0.ɵɵproperty("ngIf", ctx.showAdvancedField);
599
+ } }, dependencies: [NgIf,
600
+ NgFor,
601
+ FormsModule, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.RequiredValidator, i3.MaxLengthValidator, i3.PatternValidator, i3.NgModel, FormModule, i4.FormItemComponent, i4.FormItemAddonDirective, i4.FormItemErrorDirective, i4.FormItemLabelDirective, i4.FormItemControlDirective, RadioModule, i4.RadioGroupComponent, i4.RadioButtonComponent, InputModule, i4.InputComponent, SelectModule, i4.SelectComponent, i4.OptionComponent, TooltipModule, i4.TooltipDirective, IconModule, i4.IconComponent, PurePipe,
602
+ AsyncPipe,
603
+ LowerCasePipe,
604
+ ReadonlyFieldDirective,
605
+ FoldableBlockComponent,
606
+ StorageClassSelectComponent,
607
+ KeyValueFormTableComponent, i2.TranslatePipe, i2.ErrorsMapperComponent], encapsulation: 2, changeDetection: 0 }); }
608
+ }
609
+ __decorate([
610
+ ObservableInput(),
611
+ __metadata("design:type", Observable)
612
+ ], PersistentVolumeClaimFormComponent.prototype, "baseParams$", void 0);
613
+ __decorate([
614
+ ObservableInput(),
615
+ __metadata("design:type", Observable)
616
+ ], PersistentVolumeClaimFormComponent.prototype, "storageClasses$", void 0);
617
+ __decorate([
618
+ bind,
619
+ __metadata("design:type", Function),
620
+ __metadata("design:paramtypes", [String]),
621
+ __metadata("design:returntype", void 0)
622
+ ], PersistentVolumeClaimFormComponent.prototype, "displayFieldSupported", null);
623
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PersistentVolumeClaimFormComponent, [{
624
+ type: Component,
625
+ args: [{ standalone: true, selector: 'acl-pvc-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
626
+ NgIf,
627
+ NgFor,
628
+ FormsModule,
629
+ FormModule,
630
+ RadioModule,
631
+ InputModule,
632
+ SelectModule,
633
+ TooltipModule,
634
+ IconModule,
635
+ PurePipe,
636
+ AsyncPipe,
637
+ LowerCasePipe,
638
+ CoerceNumberDirective,
639
+ ReadonlyFieldDirective,
640
+ DisabledDirective,
641
+ FoldableBlockComponent,
642
+ StorageClassSelectComponent,
643
+ StorageFeatureTagsComponent,
644
+ KeyValueFormTableComponent,
645
+ TRANSLATE_MODULE,
646
+ ERRORS_MAPPER_MODULE,
647
+ ], providers: [
648
+ {
649
+ provide: NG_VALUE_ACCESSOR,
650
+ useExisting: forwardRef(() => PersistentVolumeClaimFormComponent),
651
+ multi: true,
652
+ },
653
+ {
654
+ provide: NG_VALIDATORS,
655
+ useExisting: forwardRef(() => PersistentVolumeClaimFormComponent),
656
+ multi: true,
657
+ },
658
+ ], template: "<aui-form-item\n width=\"large\"\n *ngIf=\"'name' | pure: displayFieldSupported\"\n>\n <label auiFormItemLabel>{{ 'name' | translate }}</label>\n <input\n aui-input\n auiFormItemControl\n [(ngModel)]=\"model.name\"\n name=\"name\"\n #name=\"ngModel\"\n maxlength=\"63\"\n [placeholder]=\"resourceNameReg.tip | translate\"\n [pattern]=\"resourceNameReg.pattern\"\n required\n />\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"name.errors\"\n [errorsMapper]=\"{\n pattern: resourceNameReg.tip | translate,\n }\"\n ></acl-errors-mapper>\n</aui-form-item>\n\n<ng-container *ngIf=\"'dataSource' | pure: displayFieldSupported\">\n <aui-form-item *ngIf=\"model.dataSource as dataSource\">\n <label auiFormItemLabel>{{ 'storage.data_source' | translate }}</label>\n {{ dataSource.name }}\n </aui-form-item>\n</ng-container>\n\n<aui-form-item *ngIf=\"'createType' | pure: displayFieldSupported\">\n <label auiFormItemLabel>{{ 'storage.create_method' | translate }}</label>\n <aui-radio-group\n size=\"medium\"\n [(ngModel)]=\"createMethod\"\n name=\"createMethod\"\n [aclReadonlyField]=\"isFromSnapshot || !!createType\"\n [aclReadonlyFieldTemplate]=\"createTypeTmpl\"\n (ngModelChange)=\"createMethodChange($event)\"\n >\n <aui-radio-button [value]=\"PvcStorageClassCreateType.DYNAMIC\">\n {{ 'storage.dynamic_create' | translate }}\n </aui-radio-button>\n <aui-radio-button [value]=\"PvcStorageClassCreateType.STATIC\">\n {{ 'storage.static_match' | translate }}\n </aui-radio-button>\n </aui-radio-group>\n <ng-template #createTypeTmpl>\n {{\n (createMethod === PvcStorageClassCreateType.DYNAMIC\n ? 'storage.dynamic_create'\n : 'storage.static_match'\n ) | translate\n }}\n </ng-template>\n</aui-form-item>\n\n<ng-container *ngIf=\"'storageClassName' | pure: displayFieldSupported\">\n <aui-form-item\n *ngIf=\"createMethod !== PvcStorageClassCreateType.STATIC\"\n width=\"medium\"\n >\n <label auiFormItemLabel>{{ 'storageclass' | translate }}</label>\n <acl-storageclass-select\n [storageClasses]=\"storageClassList$ | async\"\n [volumeSnapshotClasses]=\"volumeSnapshotClassList$ | async\"\n [isFromSnapshot]=\"isFromSnapshot\"\n auiFormItemControl\n required\n [(ngModel)]=\"model.storageClassName\"\n name=\"storageClassName\"\n #storageClassName=\"ngModel\"\n (storageClassChange)=\"storageclassChange($event)\"\n ></acl-storageclass-select>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"storageClassName.errors\"\n ></acl-errors-mapper>\n </aui-form-item>\n</ng-container>\n\n<aui-form-item *ngIf=\"'accessModes' | pure: displayFieldSupported\">\n <label auiFormItemLabel>{{ 'storage.access_mode' | translate }}</label>\n <aui-radio-group\n auiFormItemControl\n [(ngModel)]=\"model.accessModes\"\n required\n name=\"accessModes\"\n #accessMode=\"ngModel\"\n >\n <aui-radio-button\n *ngFor=\"let mode of accessModes\"\n [auiTooltip]=\"'storage.storage_forbid_select_access_mode' | translate\"\n [auiTooltipDisabled]=\"\n !(\n mode\n | pure\n : storageCommonUtil.isAccessModeDisabled\n : selectedStorageSelectOption\n )\n \"\n [value]=\"mode\"\n [disabled]=\"\n mode\n | pure\n : storageCommonUtil.isAccessModeDisabled\n : selectedStorageSelectOption\n \"\n >\n {{ 'storage.' + AccessModeTranslateKey[mode] | translate }}\n </aui-radio-button>\n </aui-radio-group>\n <div auiFormItemAddon>\n <aui-icon\n [auiTooltip]=\"accessModeTip\"\n [auiTooltipPosition]=\"'top center'\"\n icon=\"question_circle\"\n class=\"icon--help\"\n ></aui-icon>\n </div>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"accessMode.errors\"\n ></acl-errors-mapper>\n <ng-template #accessModeTip>\n <ul class=\"d-list\">\n <li>{{ 'storage.access_mode_rwo' | translate }}</li>\n <li>{{ 'storage.access_mode_rox' | translate }}</li>\n <li>{{ 'storage.access_mode_rwx' | translate }}</li>\n </ul>\n </ng-template>\n</aui-form-item>\n\n<aui-form-item\n width=\"medium\"\n *ngIf=\"'storage' | pure: displayFieldSupported\"\n>\n <label auiFormItemLabel>{{ 'storage.capacity' | translate }}</label>\n <input\n aui-input\n type=\"text\"\n [pattern]=\"POSITIVE_INT_PATTERN.pattern\"\n [(ngModel)]=\"model.storage\"\n name=\"storage\"\n #storage=\"ngModel\"\n required\n auiFormItemControl\n required\n [aclReadonlyField]=\"isFromSnapshot\"\n [aclReadonlyFieldTemplate]=\"capacityTpl\"\n />\n <aui-select\n *ngIf=\"!isFromSnapshot\"\n [(ngModel)]=\"unit\"\n class=\"tw-max-w-[60px] tw-ml-[-60px]\"\n >\n <aui-option\n *ngFor=\"let item of UNITS\"\n [label]=\"item\"\n [value]=\"item\"\n >\n {{ item }}\n </aui-option>\n </aui-select>\n <ng-template #capacityTpl> {{ model.storage }}Gi </ng-template>\n <acl-errors-mapper\n auiFormItemError\n [errors]=\"storage.errors\"\n [errorsMapper]=\"{\n pattern: POSITIVE_INT_PATTERN.tip | translate,\n }\"\n ></acl-errors-mapper>\n</aui-form-item>\n\n<aui-form-item *ngIf=\"'volumeMode' | pure: displayFieldSupported\">\n <label auiFormItemLabel>{{ 'storage.volume_mode' | translate }}</label>\n <aui-radio-group\n size=\"medium\"\n [(ngModel)]=\"model.volumeMode\"\n name=\"volumeMode\"\n [aclReadonlyField]=\"isFromSnapshot || !!volumeMode\"\n [aclReadonlyFieldTemplate]=\"volumeModeTmpl\"\n >\n <aui-radio-button\n *ngFor=\"let mode of volumeModes\"\n [auiTooltip]=\"'storage.storage_forbid_select_volume_mode' | translate\"\n [auiTooltipDisabled]=\"\n !(\n mode\n | pure\n : storageCommonUtil.isVolumeModeDisabled\n : selectedStorageSelectOption\n )\n \"\n [disabled]=\"\n mode\n | pure\n : storageCommonUtil.isVolumeModeDisabled\n : selectedStorageSelectOption\n \"\n [value]=\"mode\"\n >\n {{ 'storage.' + VolumeModeTranslateKey[mode] | translate }}\n </aui-radio-button>\n </aui-radio-group>\n <div\n auiFormItemAddon\n *ngIf=\"!volumeMode\"\n >\n <aui-icon\n [auiTooltip]=\"volumeModeTip\"\n [auiTooltipPosition]=\"'top center'\"\n icon=\"question_circle\"\n class=\"icon--help\"\n ></aui-icon>\n </div>\n <ng-template #volumeModeTip>\n <ul class=\"d-list\">\n <li>{{ 'storage.volume_mode_file_system_hint' | translate }}</li>\n <li>{{ 'storage.volume_mode_block_device_hint' | translate }}</li>\n </ul>\n </ng-template>\n <ng-template #volumeModeTmpl>\n {{\n (model.volumeMode === 'Filesystem'\n ? 'storage.file_system'\n : 'storage.block_device'\n ) | translate\n }}\n </ng-template>\n</aui-form-item>\n\n<ng-container *ngIf=\"showAdvancedField\">\n <acl-foldable-block hint=\"{{ 'storage.advanced' | translate }}\">\n <aui-form-item\n formGroupName=\"metadata\"\n *ngIf=\"'labels' | pure: displayFieldSupported\"\n >\n <label auiFormItemLabel>{{ 'label' | translate }}</label>\n <acl-key-value-form-table\n auiFormItemControl\n [(ngModel)]=\"model.labels\"\n name=\"labels\"\n [resourceNameTranslated]=\"'storage.labels' | translate | lowercase\"\n [validator]=\"labelValidator\"\n [errorMapper]=\"labelErrorMapper$ | async\"\n ></acl-key-value-form-table>\n </aui-form-item>\n <aui-form-item\n formGroupName=\"metadata\"\n *ngIf=\"'annotations' | pure: displayFieldSupported\"\n >\n <label auiFormItemLabel>{{ 'storage.k8s_annotation' | translate }}</label>\n <acl-key-value-form-table\n auiFormItemControl\n [resourceNameTranslated]=\"\n 'storage.k8s_annotation' | translate | lowercase\n \"\n [(ngModel)]=\"model.annotations\"\n name=\"annotations\"\n [validator]=\"annotationValidator\"\n [errorMapper]=\"annotationErrorMapper$ | async\"\n ></acl-key-value-form-table>\n </aui-form-item>\n <ng-container *ngIf=\"'selector' | pure: displayFieldSupported\">\n <aui-form-item\n [hidden]=\"createMethod === PvcStorageClassCreateType.DYNAMIC\"\n >\n <label auiFormItemLabel>{{ 'storage.selector' | translate }}</label>\n <acl-key-value-form-table\n auiFormItemControl\n [(ngModel)]=\"model.selector\"\n name=\"selector\"\n ></acl-key-value-form-table>\n </aui-form-item>\n </ng-container>\n </acl-foldable-block>\n</ng-container>\n" }]
659
+ }], () => [{ type: i1.StorageCommonUtilService }, { type: i2.TranslateService }, { type: i2.K8sApiService }], { baseParams: [{
660
+ type: Input,
661
+ args: [{ required: true }]
662
+ }], baseParams$: [], storageClasses: [{
663
+ type: Input
664
+ }], storageClasses$: [], isFromSnapshot: [{
665
+ type: Input
666
+ }], createType: [{
667
+ type: Input
668
+ }], volumeMode: [{
669
+ type: Input
670
+ }], displayFields: [{
671
+ type: Input
672
+ }], displayFieldSupported: [] }); })();
673
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PersistentVolumeClaimFormComponent, { className: "PersistentVolumeClaimFormComponent", filePath: "lib/components/pvc-form/component.ts", lineNumber: 134 }); })();
674
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yYWdlL3NyYy9saWIvY29tcG9uZW50cy9wdmMtZm9ybS9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3N0b3JhZ2Uvc3JjL2xpYi9jb21wb25lbnRzL3B2Yy1mb3JtL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLGFBQWEsR0FDZCxNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBRUwsV0FBVyxFQUNYLG9DQUFvQyxFQUNwQyw4QkFBOEIsRUFDOUIsK0JBQStCLEVBQy9CLHlCQUF5QixFQUN6QixVQUFVLEVBRVYsc0JBQXNCLEVBQ3RCLDBCQUEwQixFQUcxQix1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGFBQWEsRUFDYixjQUFjLEVBQ2QsU0FBUyxFQUNULFdBQVcsRUFFWCxVQUFVLEVBRVYsSUFBSSxFQUVKLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsUUFBUSxFQUNSLG9CQUFvQixHQUNyQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxF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QUNoQixvQkFBb0I7aUJBQ3JCLGFBQ1U7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLENBQUM7d0JBQ2pFLEtBQUssRUFBRSxJQUFJO3FCQUNaO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxhQUFhO3dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxtQ0FBbUMsQ0FBQzt3QkFDakUsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7b0hBU0QsVUFBVTtrQkFEVCxLQUFLO21CQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtZQUl6QixXQUFXLE1BR1gsY0FBYztrQkFEYixLQUFLO1lBSU4sZUFBZSxNQUlmLGNBQWM7a0JBRGIsS0FBSztZQUtOLFVBQVU7a0JBRFQsS0FBSztZQUtOLFVBQVU7a0JBRFQsS0FBSztZQUtOLGFBQWE7a0JBRFosS0FBSztZQTJITixxQkFBcUI7a0ZBMUpWLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZvcm1Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIElucHV0TW9kdWxlLFxuICBSYWRpb01vZHVsZSxcbiAgU2VsZWN0TW9kdWxlLFxuICBUb29sdGlwTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIEFjY2Vzc01vZGUsXG4gIEFjY2Vzc01vZGVzLFxuICBnZXRLOHNSZXNvdXJjZUFubm90YXRpb25FcnJvck1hcHBlciQsXG4gIGs4c1Jlc291cmNlQW5ub3RhdGlvblZhbGlkYXRvcixcbiAgZ2V0SzhzUmVzb3VyY2VMYWJlbEVycm9yTWFwcGVyJCxcbiAgazhzUmVzb3VyY2VMYWJlbFZhbGlkYXRvcixcbiAgVm9sdW1lTW9kZSxcbiAgTGFiZWxTZWxlY3RvcixcbiAgRm9sZGFibGVCbG9ja0NvbXBvbmVudCxcbiAgS2V5VmFsdWVGb3JtVGFibGVDb21wb25lbnQsXG4gIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSxcbiAgUGVyc2lzdGVudFZvbHVtZUNsYWltRGF0YVNvdXJjZSxcbiAgY3JlYXRlTmVzdGVkRm9ybUNvbnRyb2wsXG4gIGRhdGFUcmFuc2ZlcixcbiAgUmVhZG9ubHlGaWVsZERpcmVjdGl2ZSxcbiAgSzhTX1JFU09VUkNFX05BTUVfQkFTRSxcbiAgQ29lcmNlTnVtYmVyRGlyZWN0aXZlLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxuICBEaXNhYmxlZERpcmVjdGl2ZSxcbiAgT2JzZXJ2YWJsZUlucHV0LFxuICBLOHNBcGlTZXJ2aWNlLFxuICBSRVNPVVJDRV9UWVBFUyxcbiAgc2tpcEVycm9yLFxuICBWb2x1bWVNb2RlcyxcbiAgVmFsdWVPZixcbiAgcHVibGlzaFJlZixcbiAgU3RyaW5nTWFwLFxuICBiaW5kLFxuICBXb3Jrc3BhY2VQYXJhbXMsXG4gIFRSQU5TTEFURV9NT0RVTEUsXG4gIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICBQdXJlUGlwZSxcbiAgUE9TSVRJVkVfSU5UX1BBVFRFUk4sXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTG93ZXJDYXNlUGlwZSwgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJ3JhbWRhJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QsIG1hcCwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBTdG9yYWdlU2VsZWN0T3B0aW9uLFxuICBTdG9yYWdlQ29tbW9uVXRpbFNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZUNsYXNzLCBWb2x1bWVTbmFwc2hvdENsYXNzIH0gZnJvbSAnLi4vLi4vdHlwZXMvazhzJztcbmltcG9ydCB7XG4gIEFjY2Vzc01vZGVUcmFuc2xhdGVLZXksXG4gIFZvbHVtZU1vZGVUcmFuc2xhdGVLZXksXG59IGZyb20gJy4uLy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBidWlsZFB2Y1Jlc291cmNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbCc7XG5pbXBvcnQgeyBTdG9yYWdlRmVhdHVyZVRhZ3NDb21wb25lbnQgfSBmcm9tICcuLi9zdG9yYWdlLWZlYXR1cmUtdGFncy9jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RvcmFnZUNsYXNzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc3RvcmFnZWNsYXNzLXNlbGVjdC9jb21wb25lbnQnO1xuXG5jb25zdCBQdmNTdG9yYWdlQ2xhc3NDcmVhdGVUeXBlID0ge1xuICBEWU5BTUlDOiAnZHluYW1pYycsXG4gIFNUQVRJQzogJ3N0YXRpYycsXG59IGFzIGNvbnN0O1xuXG50eXBlIFB2Y1N0b3JhZ2VDbGFzc0NyZWF0ZVR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBQdmNTdG9yYWdlQ2xhc3NDcmVhdGVUeXBlPjtcblxuaW50ZXJmYWNlIFBlcnNpc3RlbnRWb2x1bWVGb3JtTW9kZWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsczogU3RyaW5nTWFwO1xuICBhbm5vdGF0aW9uczogU3RyaW5nTWFwO1xuICAvLyBudWxsIOihqOekuuS9v+eUqOm7mOiupCBzY1xuICAvLyBcIlwiIOaIluS4jeWGmeivpeWtl+auteihqOekuuS4jeiuvue9ruWtmOWCqOexu1xuICBzdG9yYWdlQ2xhc3NOYW1lOiBzdHJpbmc7XG4gIGFjY2Vzc01vZGVzOiBBY2Nlc3NNb2RlO1xuICB2b2x1bWVNb2RlOiBWb2x1bWVNb2RlO1xuICBzdG9yYWdlOiBzdHJpbmc7XG4gIGRhdGFTb3VyY2U/OiBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1EYXRhU291cmNlO1xuICBzZWxlY3RvcjogTGFiZWxTZWxlY3Rvcjtcbn1cblxudHlwZSBEaXNwbGF5RmllbGQgPSBrZXlvZiBQZXJzaXN0ZW50Vm9sdW1lRm9ybU1vZGVsIHwgJ2NyZWF0ZVR5cGUnO1xuXG5jb25zdCBVTklUUyA9IFsnR2knLCAnVGknXSBhcyBjb25zdDtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLXB2Yy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0lmLFxuICAgIE5nRm9yLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEZvcm1Nb2R1bGUsXG4gICAgUmFkaW9Nb2R1bGUsXG4gICAgSW5wdXRNb2R1bGUsXG4gICAgU2VsZWN0TW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgSWNvbk1vZHVsZSxcbiAgICBQdXJlUGlwZSxcbiAgICBBc3luY1BpcGUsXG4gICAgTG93ZXJDYXNlUGlwZSxcbiAgICBDb2VyY2VOdW1iZXJEaXJlY3RpdmUsXG4gICAgUmVhZG9ubHlGaWVsZERpcmVjdGl2ZSxcbiAgICBEaXNhYmxlZERpcmVjdGl2ZSxcbiAgICBGb2xkYWJsZUJsb2NrQ29tcG9uZW50LFxuICAgIFN0b3JhZ2VDbGFzc1NlbGVjdENvbXBvbmVudCxcbiAgICBTdG9yYWdlRmVhdHVyZVRhZ3NDb21wb25lbnQsXG4gICAgS2V5VmFsdWVGb3JtVGFibGVDb21wb25lbnQsXG4gICAgVFJBTlNMQVRFX01PRFVMRSxcbiAgICBFUlJPUlNfTUFQUEVSX01PRFVMRSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW1Gb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFBlcnNpc3RlbnRWb2x1bWVDbGFpbUZvcm1Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUGVyc2lzdGVudFZvbHVtZUNsYWltRm9ybUNvbXBvbmVudCBleHRlbmRzIGNyZWF0ZU5lc3RlZEZvcm1Db250cm9sPFxuICBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0sXG4gIFBlcnNpc3RlbnRWb2x1bWVGb3JtTW9kZWxcbj4oe1xuICBhdXRvRW1pdENoYW5nZTogdHJ1ZSxcbn0pIHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgYmFzZVBhcmFtczogV29ya3NwYWNlUGFyYW1zO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICBiYXNlUGFyYW1zJCE6IE9ic2VydmFibGU8V29ya3NwYWNlUGFyYW1zPjtcblxuICBASW5wdXQoKVxuICBzdG9yYWdlQ2xhc3NlczogU3RvcmFnZUNsYXNzW107XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHN0b3JhZ2VDbGFzc2VzJCE6IE9ic2VydmFibGU8U3RvcmFnZUNsYXNzW10+O1xuXG4gIC8vIOW/q+eFp+exuyBwdmMg5Yib5bu6XG4gIEBJbnB1dCgpXG4gIGlzRnJvbVNuYXBzaG90OiBib29sZWFuO1xuXG4gIC8vIOWmguaenOS8oOWFpeebuOW6lOeahCBjcmVhdGVUeXBlIOihqOekuuWbuuWumuWFtuWAvFxuICBASW5wdXQoKVxuICBjcmVhdGVUeXBlOiBQdmNTdG9yYWdlQ2xhc3NDcmVhdGVUeXBlO1xuXG4gIC8vIOWmguaenOS8oOWFpeebuOW6lOeahCB2b2x1bWVNb2RlIOihqOekuuWbuuWumuWFtuWAvFxuICBASW5wdXQoKVxuICB2b2x1bWVNb2RlOiBWb2x1bWVNb2RlO1xuXG4gIC8vIOWmguaenOS8oOWFpeebuOW6lOeahCBkaXNwbGF5RmllbGQg6KGo56S65Y+q5Lya5bGV56S65a+55bqU55qEIGNvbnRyb2xcbiAgQElucHV0KClcbiAgZGlzcGxheUZpZWxkczogRGlzcGxheUZpZWxkW107XG5cbiAgZ2V0IHNob3dBZHZhbmNlZEZpZWxkKCkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5RmllbGRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlGaWVsZHM/LnNvbWUoZmllbGQgPT5cbiAgICAgIFsnbGFiZWxzJywgJ2Fubm90YXRpb25zJywgJ3NlbGVjdG9yJ10uaW5jbHVkZXMoZmllbGQpLFxuICAgICk7XG4gIH1cblxuICBhY2Nlc3NNb2RlcyA9IEFjY2Vzc01vZGVzO1xuICB2b2x1bWVNb2RlcyA9IFZvbHVtZU1vZGVzO1xuICBQT1NJVElWRV9JTlRfUEFUVEVSTiA9IFBPU0lUSVZFX0lOVF9QQVRURVJOO1xuXG4gIG92ZXJyaWRlIG1vZGVsID0ge30gYXMgUGVyc2lzdGVudFZvbHVtZUZvcm1Nb2RlbDtcblxuICByZXNvdXJjZU5hbWVSZWcgPSBLOFNfUkVTT1VSQ0VfTkFNRV9CQVNFO1xuICBsYWJlbFZhbGlkYXRvciA9IGs4c1Jlc291cmNlTGFiZWxWYWxpZGF0b3I7XG4gIEFjY2Vzc01vZGVUcmFuc2xhdGVLZXkgPSBBY2Nlc3NNb2RlVHJhbnNsYXRlS2V5O1xuICBWb2x1bWVNb2RlVHJhbnNsYXRlS2V5ID0gVm9sdW1lTW9kZVRyYW5zbGF0ZUtleTtcblxuICBsYWJlbEVycm9yTWFwcGVyJCA9IGdldEs4c1Jlc291cmNlTGFiZWxFcnJvck1hcHBlciQodGhpcy50cmFuc2xhdGUpO1xuICBhbm5vdGF0aW9uVmFsaWRhdG9yID0gazhzUmVzb3VyY2VBbm5vdGF0aW9uVmFsaWRhdG9yO1xuICBhbm5vdGF0aW9uRXJyb3JNYXBwZXIkID0gZ2V0SzhzUmVzb3VyY2VBbm5vdGF0aW9uRXJyb3JNYXBwZXIkKHRoaXMudHJhbnNsYXRlKTtcblxuICBjcmVhdGVNZXRob2Q6IFB2Y1N0b3JhZ2VDbGFzc0NyZWF0ZVR5cGU7XG4gIFB2Y1N0b3JhZ2VDbGFzc0NyZWF0ZVR5cGUgPSBQdmNTdG9yYWdlQ2xhc3NDcmVhdGVUeXBlO1xuICBzZWxlY3RlZFN0b3JhZ2VTZWxlY3RPcHRpb246IFN0b3JhZ2VTZWxlY3RPcHRpb247XG4gIFVOSVRTID0gVU5JVFM7XG4gIHVuaXQgPSAnR2knO1xuXG4gIHN0b3JhZ2VDbGFzc0xpc3QkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5iYXNlUGFyYW1zJCxcbiAgICB0aGlzLnN0b3JhZ2VDbGFzc2VzJCxcbiAgXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFt7IGNsdXN0ZXIgfSwgc3RvcmFnZUNsYXNzZXNdKSA9PiB7XG4gICAgICBpZiAoc3RvcmFnZUNsYXNzZXMpIHtcbiAgICAgICAgcmV0dXJuIG9mKHN0b3JhZ2VDbGFzc2VzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLms4c0FwaVxuICAgICAgICAuZ2V0UmVzb3VyY2VMaXN0PFN0b3JhZ2VDbGFzcz4oe1xuICAgICAgICAgIHR5cGU6IFJFU09VUkNFX1RZUEVTLlNUT1JBR0VfQ0xBU1MsXG4gICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgbGltaXQ6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShtYXAocmVzID0+IHJlcz8uaXRlbXMpKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgdm9sdW1lU25hcHNob3RDbGFzc0xpc3QkID0gdGhpcy5iYXNlUGFyYW1zJC5waXBlKFxuICAgIHN3aXRjaE1hcChiYXNlUGFyYW1zID0+XG4gICAgICB0aGlzLms4c0FwaVxuICAgICAgICAuZ2V0UmVzb3VyY2VMaXN0PFZvbHVtZVNuYXBzaG90Q2xhc3M+KHtcbiAgICAgICAgICB0eXBlOiBSRVNPVVJDRV9UWVBFUy5WT0xVTUVfU05BUFNIT1RfQ0xBU1MsXG4gICAgICAgICAgY2x1c3RlcjogYmFzZVBhcmFtcy5jbHVzdGVyLFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAociA9PiByLml0ZW1zKSxcbiAgICAgICAgICBza2lwRXJyb3IoW10gYXMgVm9sdW1lU25hcHNob3RDbGFzc1tdKSxcbiAgICAgICAgKSxcbiAgICApLFxuICAgIHB1Ymxpc2hSZWYoKSxcbiAgKTtcblxuICBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0pOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gdGhpcy52YWx1ZUluKFxuICAgICAgdmFsdWUgPz9cbiAgICAgICAgYnVpbGRQdmNSZXNvdXJjZSh7XG4gICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmJhc2VQYXJhbXMubmFtZXNwYWNlLFxuICAgICAgICAgIHZvbHVtZU1vZGU6IHRoaXMudm9sdW1lTW9kZSxcbiAgICAgICAgfSksXG4gICAgKTtcbiAgICBpZiAodGhpcy5jcmVhdGVUeXBlKSB7XG4gICAgICB0aGlzLmNyZWF0ZU1ldGhvZCA9IHRoaXMuY3JlYXRlVHlwZTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3RvcmFnZUNvbW1vblV0aWw6IFN0b3JhZ2VDb21tb25VdGlsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGs4c0FwaTogSzhzQXBpU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IFt0b01vZGVsLCB0b1Jlc291cmNlXSA9IGRhdGFUcmFuc2ZlcjxcbiAgICAgIFBlcnNpc3RlbnRWb2x1bWVDbGFpbSxcbiAgICAgIFBlcnNpc3RlbnRWb2x1bWVGb3JtTW9kZWxcbiAgICA+KHtcbiAgICAgIG5hbWU6ICdtZXRhZGF0YS5uYW1lJyxcbiAgICAgIGxhYmVsczogJ21ldGFkYXRhLmxhYmVscycsXG4gICAgICBhbm5vdGF0aW9uczogJ21ldGFkYXRhLmFubm90YXRpb25zJyxcbiAgICAgIHN0b3JhZ2VDbGFzc05hbWU6ICdzcGVjLnN0b3JhZ2VDbGFzc05hbWUnLFxuICAgICAgYWNjZXNzTW9kZXM6IFsnc3BlYycsICdhY2Nlc3NNb2RlcycsIDBdLFxuICAgICAgdm9sdW1lTW9kZTogJ3NwZWMudm9sdW1lTW9kZScsXG4gICAgICBzdG9yYWdlOiAnc3BlYy5yZXNvdXJjZXMucmVxdWVzdHMuc3RvcmFnZScsXG4gICAgICBkYXRhU291cmNlOiAnc3BlYy5kYXRhU291cmNlJyxcbiAgICAgIHNlbGVjdG9yOiAnc3BlYy5zZWxlY3Rvci5tYXRjaExhYmVscycsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZhbHVlSW4gPSBjb21wb3NlKHRvTW9kZWwsIHRoaXMuYWRhcHRSZXNvdXJjZU1vZGVsKTtcbiAgICB0aGlzLm1vZGVsT3V0ID0gY29tcG9zZSh0aGlzLm92ZXJyaWRlUmVzb3VyY2UsIHRvUmVzb3VyY2UpO1xuICB9XG5cbiAgY3JlYXRlTWV0aG9kQ2hhbmdlKGNyZWF0ZVR5cGU6IFB2Y1N0b3JhZ2VDbGFzc0NyZWF0ZVR5cGUpIHtcbiAgICAvLyDpnZnmgIHljLnphY3kuI3pnIDopoHpmZDliLborr/pl67mqKHlvI9cbiAgICBpZiAoY3JlYXRlVHlwZSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yYWdlU2VsZWN0T3B0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzdG9yYWdlY2xhc3NDaGFuZ2Uoc2VsZWN0ZWRPcHRpb246IFN0b3JhZ2VTZWxlY3RPcHRpb24pIHtcbiAgICB0aGlzLnNlbGVjdGVkU3RvcmFnZVNlbGVjdE9wdGlvbiA9IHNlbGVjdGVkT3B0aW9uO1xuICAgIHRoaXMuc2V0QWNjZXNzTW9kZVRvU3VwcG9ydFZhbHVlSWZOZWVkKCk7XG4gICAgdGhpcy5zZXRWb2x1bWVNb2RlVG9TdXBwb3J0VmFsdWVJZk5lZWQoKTtcbiAgfVxuXG4gIEBiaW5kXG4gIGRpc3BsYXlGaWVsZFN1cHBvcnRlZChmaWVsZE5hbWU6IERpc3BsYXlGaWVsZCkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5RmllbGRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpc3BsYXlGaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWNjZXNzTW9kZVRvU3VwcG9ydFZhbHVlSWZOZWVkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3RvcmFnZUNvbW1vblV0aWwuaXNBY2Nlc3NNb2RlRGlzYWJsZWQoXG4gICAgICAgIHRoaXMubW9kZWwuYWNjZXNzTW9kZXMsXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yYWdlU2VsZWN0T3B0aW9uLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhpcy5tb2RlbC5hY2Nlc3NNb2RlcyA9IHRoaXMuYWNjZXNzTW9kZXMuZmluZChcbiAgICAgICAgYWNjZXNzTW9kZSA9PlxuICAgICAgICAgICF0aGlzLnN0b3JhZ2VDb21tb25VdGlsLmlzQWNjZXNzTW9kZURpc2FibGVkKFxuICAgICAgICAgICAgYWNjZXNzTW9kZSxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yYWdlU2VsZWN0T3B0aW9uLFxuICAgICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Vm9sdW1lTW9kZVRvU3VwcG9ydFZhbHVlSWZOZWVkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuc3RvcmFnZUNvbW1vblV0aWwuaXNWb2x1bWVNb2RlRGlzYWJsZWQoXG4gICAgICAgIHRoaXMubW9kZWwudm9sdW1lTW9kZSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZFN0b3JhZ2VTZWxlY3RPcHRpb24sXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLm1vZGVsLnZvbHVtZU1vZGUgPSB0aGlzLnZvbHVtZU1vZGVzLmZpbmQoXG4gICAgICAgIHZvbHVtZU1vZGUgPT5cbiAgICAgICAgICAhdGhpcy5zdG9yYWdlQ29tbW9uVXRpbC5pc1ZvbHVtZU1vZGVEaXNhYmxlZChcbiAgICAgICAgICAgIHZvbHVtZU1vZGUsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmFnZVNlbGVjdE9wdGlvbixcbiAgICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0UmVzb3VyY2VNb2RlbCA9IChwdmM6IFBlcnNpc3RlbnRWb2x1bWVDbGFpbSkgPT4ge1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBwdmM/LnNwZWM/LnJlc291cmNlcz8ucmVxdWVzdHM/LnN0b3JhZ2U7XG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHJlcyA9IFN0cmluZyhzdG9yYWdlKS5tYXRjaCgvW0EtWmEtel0rfFxcZCsoPzpcXC5cXGQrKT8vZyk7XG4gICAgICBwdmMuc3BlYy5yZXNvdXJjZXMucmVxdWVzdHMuc3RvcmFnZSA9IHJlc1swXSB8fCAnJztcbiAgICAgIHRoaXMudW5pdCA9IHJlc1sxXSB8fCAnR2knO1xuICAgIH1cblxuICAgIC8vIFwiXCIg6KGo56S66Z2Z5oCB5Yib5bu6XG4gICAgdGhpcy5jcmVhdGVNZXRob2QgPVxuICAgICAgcHZjPy5zcGVjPy5zdG9yYWdlQ2xhc3NOYW1lID09PSAnJyA/ICdzdGF0aWMnIDogJ2R5bmFtaWMnO1xuXG4gICAgcmV0dXJuIHB2YztcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJyaWRlUmVzb3VyY2UgPSAocHZjOiBQZXJzaXN0ZW50Vm9sdW1lQ2xhaW0pID0+IHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNyZWF0ZU1ldGhvZCA9PT0gJ2R5bmFtaWMnIHx8XG4gICAgICBPYmplY3Qua2V5cyhwdmM/LnNwZWM/LnNlbGVjdG9yPy5tYXRjaExhYmVscyA/PyB7fSkubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBkZWxldGUgcHZjPy5zcGVjPy5zZWxlY3RvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jcmVhdGVNZXRob2QgPT09ICdzdGF0aWMnKSB7XG4gICAgICBwdmMuc3BlYy5zdG9yYWdlQ2xhc3NOYW1lID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHB2Yz8uc3BlYz8ucmVzb3VyY2VzPy5yZXF1ZXN0cz8uc3RvcmFnZSkge1xuICAgICAgcHZjLnNwZWMucmVzb3VyY2VzLnJlcXVlc3RzLnN0b3JhZ2UgPSBgJHtwdmMuc3BlYy5yZXNvdXJjZXMucmVxdWVzdHMuc3RvcmFnZX0ke3RoaXMudW5pdH1gO1xuICAgIH1cbiAgICByZXR1cm4gcHZjO1xuICB9O1xufVxuIiwiPGF1aS1mb3JtLWl0ZW1cbiAgd2lkdGg9XCJsYXJnZVwiXG4gICpuZ0lmPVwiJ25hbWUnIHwgcHVyZTogZGlzcGxheUZpZWxkU3VwcG9ydGVkXCJcbj5cbiAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ25hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgPGlucHV0XG4gICAgYXVpLWlucHV0XG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgWyhuZ01vZGVsKV09XCJtb2RlbC5uYW1lXCJcbiAgICBuYW1lPVwibmFtZVwiXG4gICAgI25hbWU9XCJuZ01vZGVsXCJcbiAgICBtYXhsZW5ndGg9XCI2M1wiXG4gICAgW3BsYWNlaG9sZGVyXT1cInJlc291cmNlTmFtZVJlZy50aXAgfCB0cmFuc2xhdGVcIlxuICAgIFtwYXR0ZXJuXT1cInJlc291cmNlTmFtZVJlZy5wYXR0ZXJuXCJcbiAgICByZXF1aXJlZFxuICAvPlxuICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgW2Vycm9yc109XCJuYW1lLmVycm9yc1wiXG4gICAgW2Vycm9yc01hcHBlcl09XCJ7XG4gICAgICBwYXR0ZXJuOiByZXNvdXJjZU5hbWVSZWcudGlwIHwgdHJhbnNsYXRlLFxuICAgIH1cIlxuICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbjwvYXVpLWZvcm0taXRlbT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIidkYXRhU291cmNlJyB8IHB1cmU6IGRpc3BsYXlGaWVsZFN1cHBvcnRlZFwiPlxuICA8YXVpLWZvcm0taXRlbSAqbmdJZj1cIm1vZGVsLmRhdGFTb3VyY2UgYXMgZGF0YVNvdXJjZVwiPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLmRhdGFfc291cmNlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAge3sgZGF0YVNvdXJjZS5uYW1lIH19XG4gIDwvYXVpLWZvcm0taXRlbT5cbjwvbmctY29udGFpbmVyPlxuXG48YXVpLWZvcm0taXRlbSAqbmdJZj1cIidjcmVhdGVUeXBlJyB8IHB1cmU6IGRpc3BsYXlGaWVsZFN1cHBvcnRlZFwiPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnc3RvcmFnZS5jcmVhdGVfbWV0aG9kJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gIDxhdWktcmFkaW8tZ3JvdXBcbiAgICBzaXplPVwibWVkaXVtXCJcbiAgICBbKG5nTW9kZWwpXT1cImNyZWF0ZU1ldGhvZFwiXG4gICAgbmFtZT1cImNyZWF0ZU1ldGhvZFwiXG4gICAgW2FjbFJlYWRvbmx5RmllbGRdPVwiaXNGcm9tU25hcHNob3QgfHwgISFjcmVhdGVUeXBlXCJcbiAgICBbYWNsUmVhZG9ubHlGaWVsZFRlbXBsYXRlXT1cImNyZWF0ZVR5cGVUbXBsXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJjcmVhdGVNZXRob2RDaGFuZ2UoJGV2ZW50KVwiXG4gID5cbiAgICA8YXVpLXJhZGlvLWJ1dHRvbiBbdmFsdWVdPVwiUHZjU3RvcmFnZUNsYXNzQ3JlYXRlVHlwZS5EWU5BTUlDXCI+XG4gICAgICB7eyAnc3RvcmFnZS5keW5hbWljX2NyZWF0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2F1aS1yYWRpby1idXR0b24+XG4gICAgPGF1aS1yYWRpby1idXR0b24gW3ZhbHVlXT1cIlB2Y1N0b3JhZ2VDbGFzc0NyZWF0ZVR5cGUuU1RBVElDXCI+XG4gICAgICB7eyAnc3RvcmFnZS5zdGF0aWNfbWF0Y2gnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9hdWktcmFkaW8tYnV0dG9uPlxuICA8L2F1aS1yYWRpby1ncm91cD5cbiAgPG5nLXRlbXBsYXRlICNjcmVhdGVUeXBlVG1wbD5cbiAgICB7e1xuICAgICAgKGNyZWF0ZU1ldGhvZCA9PT0gUHZjU3RvcmFnZUNsYXNzQ3JlYXRlVHlwZS5EWU5BTUlDXG4gICAgICAgID8gJ3N0b3JhZ2UuZHluYW1pY19jcmVhdGUnXG4gICAgICAgIDogJ3N0b3JhZ2Uuc3RhdGljX21hdGNoJ1xuICAgICAgKSB8IHRyYW5zbGF0ZVxuICAgIH19XG4gIDwvbmctdGVtcGxhdGU+XG48L2F1aS1mb3JtLWl0ZW0+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCInc3RvcmFnZUNsYXNzTmFtZScgfCBwdXJlOiBkaXNwbGF5RmllbGRTdXBwb3J0ZWRcIj5cbiAgPGF1aS1mb3JtLWl0ZW1cbiAgICAqbmdJZj1cImNyZWF0ZU1ldGhvZCAhPT0gUHZjU3RvcmFnZUNsYXNzQ3JlYXRlVHlwZS5TVEFUSUNcIlxuICAgIHdpZHRoPVwibWVkaXVtXCJcbiAgPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlY2xhc3MnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YWNsLXN0b3JhZ2VjbGFzcy1zZWxlY3RcbiAgICAgIFtzdG9yYWdlQ2xhc3Nlc109XCJzdG9yYWdlQ2xhc3NMaXN0JCB8IGFzeW5jXCJcbiAgICAgIFt2b2x1bWVTbmFwc2hvdENsYXNzZXNdPVwidm9sdW1lU25hcHNob3RDbGFzc0xpc3QkIHwgYXN5bmNcIlxuICAgICAgW2lzRnJvbVNuYXBzaG90XT1cImlzRnJvbVNuYXBzaG90XCJcbiAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgcmVxdWlyZWRcbiAgICAgIFsobmdNb2RlbCldPVwibW9kZWwuc3RvcmFnZUNsYXNzTmFtZVwiXG4gICAgICBuYW1lPVwic3RvcmFnZUNsYXNzTmFtZVwiXG4gICAgICAjc3RvcmFnZUNsYXNzTmFtZT1cIm5nTW9kZWxcIlxuICAgICAgKHN0b3JhZ2VDbGFzc0NoYW5nZSk9XCJzdG9yYWdlY2xhc3NDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvYWNsLXN0b3JhZ2VjbGFzcy1zZWxlY3Q+XG4gICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgICBbZXJyb3JzXT1cInN0b3JhZ2VDbGFzc05hbWUuZXJyb3JzXCJcbiAgICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgPC9hdWktZm9ybS1pdGVtPlxuPC9uZy1jb250YWluZXI+XG5cbjxhdWktZm9ybS1pdGVtICpuZ0lmPVwiJ2FjY2Vzc01vZGVzJyB8IHB1cmU6IGRpc3BsYXlGaWVsZFN1cHBvcnRlZFwiPlxuICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnc3RvcmFnZS5hY2Nlc3NfbW9kZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICA8YXVpLXJhZGlvLWdyb3VwXG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgWyhuZ01vZGVsKV09XCJtb2RlbC5hY2Nlc3NNb2Rlc1wiXG4gICAgcmVxdWlyZWRcbiAgICBuYW1lPVwiYWNjZXNzTW9kZXNcIlxuICAgICNhY2Nlc3NNb2RlPVwibmdNb2RlbFwiXG4gID5cbiAgICA8YXVpLXJhZGlvLWJ1dHRvblxuICAgICAgKm5nRm9yPVwibGV0IG1vZGUgb2YgYWNjZXNzTW9kZXNcIlxuICAgICAgW2F1aVRvb2x0aXBdPVwiJ3N0b3JhZ2Uuc3RvcmFnZV9mb3JiaWRfc2VsZWN0X2FjY2Vzc19tb2RlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbYXVpVG9vbHRpcERpc2FibGVkXT1cIlxuICAgICAgICAhKFxuICAgICAgICAgIG1vZGVcbiAgICAgICAgICB8IHB1cmVcbiAgICAgICAgICAgIDogc3RvcmFnZUNvbW1vblV0aWwuaXNBY2Nlc3NNb2RlRGlzYWJsZWRcbiAgICAgICAgICAgIDogc2VsZWN0ZWRTdG9yYWdlU2VsZWN0T3B0aW9uXG4gICAgICAgIClcbiAgICAgIFwiXG4gICAgICBbdmFsdWVdPVwibW9kZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgIG1vZGVcbiAgICAgICAgICB8IHB1cmVcbiAgICAgICAgICAgIDogc3RvcmFnZUNvbW1vblV0aWwuaXNBY2Nlc3NNb2RlRGlzYWJsZWRcbiAgICAgICAgICAgIDogc2VsZWN0ZWRTdG9yYWdlU2VsZWN0T3B0aW9uXG4gICAgICBcIlxuICAgID5cbiAgICAgIHt7ICdzdG9yYWdlLicgKyBBY2Nlc3NNb2RlVHJhbnNsYXRlS2V5W21vZGVdIHwgdHJhbnNsYXRlIH19XG4gICAgPC9hdWktcmFkaW8tYnV0dG9uPlxuICA8L2F1aS1yYWRpby1ncm91cD5cbiAgPGRpdiBhdWlGb3JtSXRlbUFkZG9uPlxuICAgIDxhdWktaWNvblxuICAgICAgW2F1aVRvb2x0aXBdPVwiYWNjZXNzTW9kZVRpcFwiXG4gICAgICBbYXVpVG9vbHRpcFBvc2l0aW9uXT1cIid0b3AgY2VudGVyJ1wiXG4gICAgICBpY29uPVwicXVlc3Rpb25fY2lyY2xlXCJcbiAgICAgIGNsYXNzPVwiaWNvbi0taGVscFwiXG4gICAgPjwvYXVpLWljb24+XG4gIDwvZGl2PlxuICA8YWNsLWVycm9ycy1tYXBwZXJcbiAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgW2Vycm9yc109XCJhY2Nlc3NNb2RlLmVycm9yc1wiXG4gID48L2FjbC1lcnJvcnMtbWFwcGVyPlxuICA8bmctdGVtcGxhdGUgI2FjY2Vzc01vZGVUaXA+XG4gICAgPHVsIGNsYXNzPVwiZC1saXN0XCI+XG4gICAgICA8bGk+e3sgJ3N0b3JhZ2UuYWNjZXNzX21vZGVfcndvJyB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgICA8bGk+e3sgJ3N0b3JhZ2UuYWNjZXNzX21vZGVfcm94JyB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgICA8bGk+e3sgJ3N0b3JhZ2UuYWNjZXNzX21vZGVfcnd4JyB8IHRyYW5zbGF0ZSB9fTwvbGk+XG4gICAgPC91bD5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvYXVpLWZvcm0taXRlbT5cblxuPGF1aS1mb3JtLWl0ZW1cbiAgd2lkdGg9XCJtZWRpdW1cIlxuICAqbmdJZj1cIidzdG9yYWdlJyB8IHB1cmU6IGRpc3BsYXlGaWVsZFN1cHBvcnRlZFwiXG4+XG4gIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLmNhcGFjaXR5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gIDxpbnB1dFxuICAgIGF1aS1pbnB1dFxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICBbcGF0dGVybl09XCJQT1NJVElWRV9JTlRfUEFUVEVSTi5wYXR0ZXJuXCJcbiAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnN0b3JhZ2VcIlxuICAgIG5hbWU9XCJzdG9yYWdlXCJcbiAgICAjc3RvcmFnZT1cIm5nTW9kZWxcIlxuICAgIHJlcXVpcmVkXG4gICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgcmVxdWlyZWRcbiAgICBbYWNsUmVhZG9ubHlGaWVsZF09XCJpc0Zyb21TbmFwc2hvdFwiXG4gICAgW2FjbFJlYWRvbmx5RmllbGRUZW1wbGF0ZV09XCJjYXBhY2l0eVRwbFwiXG4gIC8+XG4gIDxhdWktc2VsZWN0XG4gICAgKm5nSWY9XCIhaXNGcm9tU25hcHNob3RcIlxuICAgIFsobmdNb2RlbCldPVwidW5pdFwiXG4gICAgY2xhc3M9XCJ0dy1tYXgtdy1bNjBweF0gdHctbWwtWy02MHB4XVwiXG4gID5cbiAgICA8YXVpLW9wdGlvblxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgVU5JVFNcIlxuICAgICAgW2xhYmVsXT1cIml0ZW1cIlxuICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgID5cbiAgICAgIHt7IGl0ZW0gfX1cbiAgICA8L2F1aS1vcHRpb24+XG4gIDwvYXVpLXNlbGVjdD5cbiAgPG5nLXRlbXBsYXRlICNjYXBhY2l0eVRwbD4ge3sgbW9kZWwuc3RvcmFnZSB9fUdpIDwvbmctdGVtcGxhdGU+XG4gIDxhY2wtZXJyb3JzLW1hcHBlclxuICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICBbZXJyb3JzXT1cInN0b3JhZ2UuZXJyb3JzXCJcbiAgICBbZXJyb3JzTWFwcGVyXT1cIntcbiAgICAgIHBhdHRlcm46IFBPU0lUSVZFX0lOVF9QQVRURVJOLnRpcCB8IHRyYW5zbGF0ZSxcbiAgICB9XCJcbiAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG48L2F1aS1mb3JtLWl0ZW0+XG5cbjxhdWktZm9ybS1pdGVtICpuZ0lmPVwiJ3ZvbHVtZU1vZGUnIHwgcHVyZTogZGlzcGxheUZpZWxkU3VwcG9ydGVkXCI+XG4gIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLnZvbHVtZV9tb2RlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gIDxhdWktcmFkaW8tZ3JvdXBcbiAgICBzaXplPVwibWVkaXVtXCJcbiAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnZvbHVtZU1vZGVcIlxuICAgIG5hbWU9XCJ2b2x1bWVNb2RlXCJcbiAgICBbYWNsUmVhZG9ubHlGaWVsZF09XCJpc0Zyb21TbmFwc2hvdCB8fCAhIXZvbHVtZU1vZGVcIlxuICAgIFthY2xSZWFkb25seUZpZWxkVGVtcGxhdGVdPVwidm9sdW1lTW9kZVRtcGxcIlxuICA+XG4gICAgPGF1aS1yYWRpby1idXR0b25cbiAgICAgICpuZ0Zvcj1cImxldCBtb2RlIG9mIHZvbHVtZU1vZGVzXCJcbiAgICAgIFthdWlUb29sdGlwXT1cIidzdG9yYWdlLnN0b3JhZ2VfZm9yYmlkX3NlbGVjdF92b2x1bWVfbW9kZScgfCB0cmFuc2xhdGVcIlxuICAgICAgW2F1aVRvb2x0aXBEaXNhYmxlZF09XCJcbiAgICAgICAgIShcbiAgICAgICAgICBtb2RlXG4gICAgICAgICAgfCBwdXJlXG4gICAgICAgICAgICA6IHN0b3JhZ2VDb21tb25VdGlsLmlzVm9sdW1lTW9kZURpc2FibGVkXG4gICAgICAgICAgICA6IHNlbGVjdGVkU3RvcmFnZVNlbGVjdE9wdGlvblxuICAgICAgICApXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICBtb2RlXG4gICAgICAgICAgfCBwdXJlXG4gICAgICAgICAgICA6IHN0b3JhZ2VDb21tb25VdGlsLmlzVm9sdW1lTW9kZURpc2FibGVkXG4gICAgICAgICAgICA6IHNlbGVjdGVkU3RvcmFnZVNlbGVjdE9wdGlvblxuICAgICAgXCJcbiAgICAgIFt2YWx1ZV09XCJtb2RlXCJcbiAgICA+XG4gICAgICB7eyAnc3RvcmFnZS4nICsgVm9sdW1lTW9kZVRyYW5zbGF0ZUtleVttb2RlXSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYXVpLXJhZGlvLWJ1dHRvbj5cbiAgPC9hdWktcmFkaW8tZ3JvdXA+XG4gIDxkaXZcbiAgICBhdWlGb3JtSXRlbUFkZG9uXG4gICAgKm5nSWY9XCIhdm9sdW1lTW9kZVwiXG4gID5cbiAgICA8YXVpLWljb25cbiAgICAgIFthdWlUb29sdGlwXT1cInZvbHVtZU1vZGVUaXBcIlxuICAgICAgW2F1aVRvb2x0aXBQb3NpdGlvbl09XCIndG9wIGNlbnRlcidcIlxuICAgICAgaWNvbj1cInF1ZXN0aW9uX2NpcmNsZVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgID48L2F1aS1pY29uPlxuICA8L2Rpdj5cbiAgPG5nLXRlbXBsYXRlICN2b2x1bWVNb2RlVGlwPlxuICAgIDx1bCBjbGFzcz1cImQtbGlzdFwiPlxuICAgICAgPGxpPnt7ICdzdG9yYWdlLnZvbHVtZV9tb2RlX2ZpbGVfc3lzdGVtX2hpbnQnIHwgdHJhbnNsYXRlIH19PC9saT5cbiAgICAgIDxsaT57eyAnc3RvcmFnZS52b2x1bWVfbW9kZV9ibG9ja19kZXZpY2VfaGludCcgfCB0cmFuc2xhdGUgfX08L2xpPlxuICAgIDwvdWw+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjdm9sdW1lTW9kZVRtcGw+XG4gICAge3tcbiAgICAgIChtb2RlbC52b2x1bWVNb2RlID09PSAnRmlsZXN5c3RlbSdcbiAgICAgICAgPyAnc3RvcmFnZS5maWxlX3N5c3RlbSdcbiAgICAgICAgOiAnc3RvcmFnZS5ibG9ja19kZXZpY2UnXG4gICAgICApIHwgdHJhbnNsYXRlXG4gICAgfX1cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvYXVpLWZvcm0taXRlbT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBZHZhbmNlZEZpZWxkXCI+XG4gIDxhY2wtZm9sZGFibGUtYmxvY2sgaGludD1cInt7ICdzdG9yYWdlLmFkdmFuY2VkJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgIDxhdWktZm9ybS1pdGVtXG4gICAgICBmb3JtR3JvdXBOYW1lPVwibWV0YWRhdGFcIlxuICAgICAgKm5nSWY9XCInbGFiZWxzJyB8IHB1cmU6IGRpc3BsYXlGaWVsZFN1cHBvcnRlZFwiXG4gICAgPlxuICAgICAgPGxhYmVsIGF1aUZvcm1JdGVtTGFiZWw+e3sgJ2xhYmVsJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICA8YWNsLWtleS12YWx1ZS1mb3JtLXRhYmxlXG4gICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLmxhYmVsc1wiXG4gICAgICAgIG5hbWU9XCJsYWJlbHNcIlxuICAgICAgICBbcmVzb3VyY2VOYW1lVHJhbnNsYXRlZF09XCInc3RvcmFnZS5sYWJlbHMnIHwgdHJhbnNsYXRlIHwgbG93ZXJjYXNlXCJcbiAgICAgICAgW3ZhbGlkYXRvcl09XCJsYWJlbFZhbGlkYXRvclwiXG4gICAgICAgIFtlcnJvck1hcHBlcl09XCJsYWJlbEVycm9yTWFwcGVyJCB8IGFzeW5jXCJcbiAgICAgID48L2FjbC1rZXktdmFsdWUtZm9ybS10YWJsZT5cbiAgICA8L2F1aS1mb3JtLWl0ZW0+XG4gICAgPGF1aS1mb3JtLWl0ZW1cbiAgICAgIGZvcm1Hcm91cE5hbWU9XCJtZXRhZGF0YVwiXG4gICAgICAqbmdJZj1cIidhbm5vdGF0aW9ucycgfCBwdXJlOiBkaXNwbGF5RmllbGRTdXBwb3J0ZWRcIlxuICAgID5cbiAgICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLms4c19hbm5vdGF0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICA8YWNsLWtleS12YWx1ZS1mb3JtLXRhYmxlXG4gICAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgICBbcmVzb3VyY2VOYW1lVHJhbnNsYXRlZF09XCJcbiAgICAgICAgICAnc3RvcmFnZS5rOHNfYW5ub3RhdGlvbicgfCB0cmFuc2xhdGUgfCBsb3dlcmNhc2VcbiAgICAgICAgXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJtb2RlbC5hbm5vdGF0aW9uc1wiXG4gICAgICAgIG5hbWU9XCJhbm5vdGF0aW9uc1wiXG4gICAgICAgIFt2YWxpZGF0b3JdPVwiYW5ub3RhdGlvblZhbGlkYXRvclwiXG4gICAgICAgIFtlcnJvck1hcHBlcl09XCJhbm5vdGF0aW9uRXJyb3JNYXBwZXIkIHwgYXN5bmNcIlxuICAgICAgPjwvYWNsLWtleS12YWx1ZS1mb3JtLXRhYmxlPlxuICAgIDwvYXVpLWZvcm0taXRlbT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiJ3NlbGVjdG9yJyB8IHB1cmU6IGRpc3BsYXlGaWVsZFN1cHBvcnRlZFwiPlxuICAgICAgPGF1aS1mb3JtLWl0ZW1cbiAgICAgICAgW2hpZGRlbl09XCJjcmVhdGVNZXRob2QgPT09IFB2Y1N0b3JhZ2VDbGFzc0NyZWF0ZVR5cGUuRFlOQU1JQ1wiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLnNlbGVjdG9yJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgIDxhY2wta2V5LXZhbHVlLWZvcm0tdGFibGVcbiAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsLnNlbGVjdG9yXCJcbiAgICAgICAgICBuYW1lPVwic2VsZWN0b3JcIlxuICAgICAgICA+PC9hY2wta2V5LXZhbHVlLWZvcm0tdGFibGU+XG4gICAgICA8L2F1aS1mb3JtLWl0ZW0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvYWNsLWZvbGRhYmxlLWJsb2NrPlxuPC9uZy1jb250YWluZXI+XG4iXX0=