@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.
- package/esm2022/alauda-fe-storage.mjs +5 -0
- package/esm2022/index.mjs +23 -0
- package/esm2022/lib/components/pvc-delete-dialog/component.mjs +292 -0
- package/esm2022/lib/components/pvc-expand-capacity-dialog/component.mjs +193 -0
- package/esm2022/lib/components/pvc-form/component.mjs +674 -0
- package/esm2022/lib/components/rebuild-volume-dialog/component.mjs +251 -0
- package/esm2022/lib/components/source-link/component.mjs +81 -0
- package/esm2022/lib/components/spec-form/component.mjs +464 -0
- package/esm2022/lib/components/storage-feature-tags/component.mjs +146 -0
- package/esm2022/lib/components/storageclass-select/component.mjs +179 -0
- package/esm2022/lib/pipes/actual-capacity.pipe.mjs +17 -0
- package/esm2022/lib/services/common-util.service.mjs +163 -0
- package/esm2022/lib/services/pvc-util.service.mjs +416 -0
- package/esm2022/lib/types/commons.mjs +75 -0
- package/esm2022/lib/types/internal.mjs +7 -0
- package/esm2022/lib/types/k8s.mjs +2 -0
- package/esm2022/lib/types/resource-definition.mjs +13 -0
- package/esm2022/lib/types/resource-exports.mjs +8 -0
- package/esm2022/lib/types/resource-internals.mjs +2 -0
- package/esm2022/lib/utils/constants.mjs +202 -0
- package/esm2022/lib/utils/resource-exports.mjs +65 -0
- package/esm2022/lib/utils/util.mjs +132 -0
- package/index.d.ts +17 -0
- package/lib/components/pvc-delete-dialog/component.d.ts +33 -0
- package/lib/components/pvc-expand-capacity-dialog/component.d.ts +36 -0
- package/lib/components/pvc-form/component.d.ts +106 -0
- package/lib/components/rebuild-volume-dialog/component.d.ts +28 -0
- package/lib/components/source-link/component.d.ts +17 -0
- package/lib/components/spec-form/component.d.ts +71 -0
- package/lib/components/storage-feature-tags/component.d.ts +25 -0
- package/lib/components/storageclass-select/component.d.ts +26 -0
- package/lib/pipes/actual-capacity.pipe.d.ts +8 -0
- package/lib/services/common-util.service.d.ts +48 -0
- package/lib/services/pvc-util.service.d.ts +130 -0
- package/lib/types/commons.d.ts +85 -0
- package/lib/types/internal.d.ts +4 -0
- package/lib/types/k8s.d.ts +105 -0
- package/lib/types/resource-definition.d.ts +18 -0
- package/lib/types/resource-exports.d.ts +16 -0
- package/lib/types/resource-internals.d.ts +20 -0
- package/lib/utils/constants.d.ts +37 -0
- package/lib/utils/resource-exports.d.ts +12 -0
- package/lib/utils/util.d.ts +19 -0
- package/package.json +38 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
import { FormModule, IconModule, InputModule, RadioModule, SelectModule, TooltipModule, isTemplateRef, } from '@alauda/ui';
|
|
2
|
+
import { TRANSLATE_MODULE, ERRORS_MAPPER_MODULE, CoreModule, CoerceNumberDirective, POSITIVE_INT_PATTERN, initGreaterValidator, isEqual, TranslateService, } from '@alauda-fe/common';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, Injector, Input, } from '@angular/core';
|
|
5
|
+
import { ReactiveFormsModule, Validators } from '@angular/forms';
|
|
6
|
+
import { BaseResourceFormGroupComponent } from 'ng-resource-form-util';
|
|
7
|
+
import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';
|
|
8
|
+
import { ResourceSize, } from '../../types/resource-exports';
|
|
9
|
+
import { formatResource, getResourceSpecificationMapper, getResourceSpecification, } from '../../utils/resource-exports';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@alauda-fe/common";
|
|
12
|
+
import * as i2 from "@angular/common";
|
|
13
|
+
import * as i3 from "@angular/forms";
|
|
14
|
+
import * as i4 from "@alauda/ui";
|
|
15
|
+
function ResourceSpecFormComponent_aui_radio_button_6_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
+
i0.ɵɵelementStart(0, "aui-radio-button", 28)(1, "div", 29)(2, "div");
|
|
17
|
+
i0.ɵɵtext(3);
|
|
18
|
+
i0.ɵɵpipe(4, "translate");
|
|
19
|
+
i0.ɵɵelementStart(5, "div", 30);
|
|
20
|
+
i0.ɵɵtext(6);
|
|
21
|
+
i0.ɵɵpipe(7, "translate");
|
|
22
|
+
i0.ɵɵelementEnd()()()();
|
|
23
|
+
} if (rf & 2) {
|
|
24
|
+
const item_r2 = ctx.$implicit;
|
|
25
|
+
i0.ɵɵproperty("value", item_r2.size);
|
|
26
|
+
i0.ɵɵadvance(3);
|
|
27
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(4, 3, "storage." + item_r2.size + "_scale"), " ");
|
|
28
|
+
i0.ɵɵadvance(3);
|
|
29
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(7, 5, item_r2.tip), " ");
|
|
30
|
+
} }
|
|
31
|
+
function ResourceSpecFormComponent_aui_icon_7_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵelement(0, "aui-icon", 31);
|
|
33
|
+
} if (rf & 2) {
|
|
34
|
+
i0.ɵɵnextContext();
|
|
35
|
+
const descriptionTemplate_r3 = i0.ɵɵreference(9);
|
|
36
|
+
i0.ɵɵproperty("auiTooltip", descriptionTemplate_r3);
|
|
37
|
+
} }
|
|
38
|
+
function ResourceSpecFormComponent_ng_template_8_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
i0.ɵɵelementContainer(0, 33);
|
|
40
|
+
} if (rf & 2) {
|
|
41
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
42
|
+
i0.ɵɵproperty("ngTemplateOutlet", ctx_r3.resourceSpecificationDescription);
|
|
43
|
+
} }
|
|
44
|
+
function ResourceSpecFormComponent_ng_template_8_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
i0.ɵɵtext(0);
|
|
46
|
+
} if (rf & 2) {
|
|
47
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
48
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r3.resourceSpecificationDescription, " ");
|
|
49
|
+
} }
|
|
50
|
+
function ResourceSpecFormComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
|
|
51
|
+
i0.ɵɵtemplate(0, ResourceSpecFormComponent_ng_template_8_ng_container_0_Template, 1, 1, "ng-container", 32)(1, ResourceSpecFormComponent_ng_template_8_ng_template_1_Template, 1, 1, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
|
|
52
|
+
} if (rf & 2) {
|
|
53
|
+
const text_r5 = i0.ɵɵreference(2);
|
|
54
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
55
|
+
i0.ɵɵproperty("ngIf", ctx_r3.isTemplateRef(ctx_r3.resourceSpecificationDescription))("ngIfElse", text_r5);
|
|
56
|
+
} }
|
|
57
|
+
function ResourceSpecFormComponent_aui_form_item_10_aui_select_10_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelementStart(0, "aui-select", 36)(1, "aui-option", 37);
|
|
59
|
+
i0.ɵɵtext(2, "m");
|
|
60
|
+
i0.ɵɵelementEnd();
|
|
61
|
+
i0.ɵɵelementStart(3, "aui-option", 38);
|
|
62
|
+
i0.ɵɵpipe(4, "translate");
|
|
63
|
+
i0.ɵɵtext(5);
|
|
64
|
+
i0.ɵɵpipe(6, "translate");
|
|
65
|
+
i0.ɵɵelementEnd()();
|
|
66
|
+
} if (rf & 2) {
|
|
67
|
+
i0.ɵɵadvance(3);
|
|
68
|
+
i0.ɵɵproperty("label", i0.ɵɵpipeBind1(4, 2, "core"));
|
|
69
|
+
i0.ɵɵadvance(2);
|
|
70
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(6, 4, "core"), " ");
|
|
71
|
+
} }
|
|
72
|
+
function ResourceSpecFormComponent_aui_form_item_10_ng_template_11_span_0_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
74
|
+
i0.ɵɵtext(1);
|
|
75
|
+
i0.ɵɵpipe(2, "translate");
|
|
76
|
+
i0.ɵɵelementEnd();
|
|
77
|
+
} if (rf & 2) {
|
|
78
|
+
const cpuUnit_r6 = ctx.ngIf;
|
|
79
|
+
i0.ɵɵadvance();
|
|
80
|
+
i0.ɵɵtextInterpolate1(" ", cpuUnit_r6 === "core" ? i0.ɵɵpipeBind1(2, 1, "core") : cpuUnit_r6, " ");
|
|
81
|
+
} }
|
|
82
|
+
function ResourceSpecFormComponent_aui_form_item_10_ng_template_11_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
i0.ɵɵtemplate(0, ResourceSpecFormComponent_aui_form_item_10_ng_template_11_span_0_Template, 3, 3, "span", 39);
|
|
84
|
+
} if (rf & 2) {
|
|
85
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
86
|
+
i0.ɵɵproperty("ngIf", ctx_r3.form.get("requests.cpu.unit").value);
|
|
87
|
+
} }
|
|
88
|
+
function ResourceSpecFormComponent_aui_form_item_10_aui_select_21_Template(rf, ctx) { if (rf & 1) {
|
|
89
|
+
i0.ɵɵelementStart(0, "aui-select", 41)(1, "aui-option", 42);
|
|
90
|
+
i0.ɵɵtext(2, "Mi");
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
i0.ɵɵelementStart(3, "aui-option", 43);
|
|
93
|
+
i0.ɵɵtext(4, "Gi");
|
|
94
|
+
i0.ɵɵelementEnd()();
|
|
95
|
+
} }
|
|
96
|
+
function ResourceSpecFormComponent_aui_form_item_10_ng_template_22_Template(rf, ctx) { if (rf & 1) {
|
|
97
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
98
|
+
i0.ɵɵtext(1);
|
|
99
|
+
i0.ɵɵelementEnd();
|
|
100
|
+
} if (rf & 2) {
|
|
101
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
102
|
+
i0.ɵɵadvance();
|
|
103
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r3.form.get("requests.memory.unit").value, " ");
|
|
104
|
+
} }
|
|
105
|
+
function ResourceSpecFormComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) {
|
|
106
|
+
i0.ɵɵelementStart(0, "aui-form-item", 17)(1, "label", 12);
|
|
107
|
+
i0.ɵɵtext(2);
|
|
108
|
+
i0.ɵɵpipe(3, "translate");
|
|
109
|
+
i0.ɵɵelementEnd();
|
|
110
|
+
i0.ɵɵelementStart(4, "div", 34)(5, "aui-form-item", 19)(6, "aui-input-group", 20)(7, "span", 21);
|
|
111
|
+
i0.ɵɵtext(8, "CPU");
|
|
112
|
+
i0.ɵɵelementEnd();
|
|
113
|
+
i0.ɵɵelement(9, "input", 22);
|
|
114
|
+
i0.ɵɵtemplate(10, ResourceSpecFormComponent_aui_form_item_10_aui_select_10_Template, 7, 6, "aui-select", 23)(11, ResourceSpecFormComponent_aui_form_item_10_ng_template_11_Template, 1, 1, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
|
|
115
|
+
i0.ɵɵelementEnd();
|
|
116
|
+
i0.ɵɵelement(13, "div", 24, 7);
|
|
117
|
+
i0.ɵɵelementEnd();
|
|
118
|
+
i0.ɵɵelementStart(15, "aui-form-item", 25)(16, "aui-input-group", 26)(17, "span", 21);
|
|
119
|
+
i0.ɵɵtext(18);
|
|
120
|
+
i0.ɵɵpipe(19, "translate");
|
|
121
|
+
i0.ɵɵelementEnd();
|
|
122
|
+
i0.ɵɵelement(20, "input", 35);
|
|
123
|
+
i0.ɵɵtemplate(21, ResourceSpecFormComponent_aui_form_item_10_aui_select_21_Template, 5, 0, "aui-select", 27)(22, ResourceSpecFormComponent_aui_form_item_10_ng_template_22_Template, 2, 1, "ng-template", null, 8, i0.ɵɵtemplateRefExtractor);
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
i0.ɵɵelement(24, "div", 24, 9);
|
|
126
|
+
i0.ɵɵelementEnd()()();
|
|
127
|
+
} if (rf & 2) {
|
|
128
|
+
const rcUnit_r7 = i0.ɵɵreference(12);
|
|
129
|
+
const cpuRequestError_r8 = i0.ɵɵreference(14);
|
|
130
|
+
const rmUnit_r9 = i0.ɵɵreference(23);
|
|
131
|
+
const memoryRequiredError_r10 = i0.ɵɵreference(25);
|
|
132
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
133
|
+
i0.ɵɵadvance(2);
|
|
134
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 14, "storage.resource_request"));
|
|
135
|
+
i0.ɵɵadvance(7);
|
|
136
|
+
i0.ɵɵproperty("pattern", ctx_r3.POSITIVE_INT_PATTERN.pattern)("aclErrorsMapper", ctx_r3.errorMapper)("aclErrorsMapperOutlet", cpuRequestError_r8)("readonly", ctx_r3.form.get("size").value !== ctx_r3.ResourceSize.CUSTOMIZE);
|
|
137
|
+
i0.ɵɵadvance();
|
|
138
|
+
i0.ɵɵproperty("ngIf", ctx_r3.form.get("size").value === ctx_r3.ResourceSize.CUSTOMIZE)("ngIfElse", rcUnit_r7);
|
|
139
|
+
i0.ɵɵadvance(8);
|
|
140
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(19, 16, "memory"));
|
|
141
|
+
i0.ɵɵadvance(2);
|
|
142
|
+
i0.ɵɵproperty("readonly", ctx_r3.form.get("size").value !== ctx_r3.ResourceSize.CUSTOMIZE)("pattern", ctx_r3.POSITIVE_INT_PATTERN.pattern)("aclErrorsMapper", ctx_r3.errorMapper)("aclErrorsMapperOutlet", memoryRequiredError_r10);
|
|
143
|
+
i0.ɵɵadvance();
|
|
144
|
+
i0.ɵɵproperty("ngIf", ctx_r3.form.get("size").value === ctx_r3.ResourceSize.CUSTOMIZE)("ngIfElse", rmUnit_r9);
|
|
145
|
+
} }
|
|
146
|
+
function ResourceSpecFormComponent_aui_select_21_Template(rf, ctx) { if (rf & 1) {
|
|
147
|
+
i0.ɵɵelementStart(0, "aui-select", 36)(1, "aui-option", 37);
|
|
148
|
+
i0.ɵɵtext(2, "m");
|
|
149
|
+
i0.ɵɵelementEnd();
|
|
150
|
+
i0.ɵɵelementStart(3, "aui-option", 38);
|
|
151
|
+
i0.ɵɵpipe(4, "translate");
|
|
152
|
+
i0.ɵɵtext(5);
|
|
153
|
+
i0.ɵɵpipe(6, "translate");
|
|
154
|
+
i0.ɵɵelementEnd()();
|
|
155
|
+
} if (rf & 2) {
|
|
156
|
+
i0.ɵɵadvance(3);
|
|
157
|
+
i0.ɵɵproperty("label", i0.ɵɵpipeBind1(4, 2, "core"));
|
|
158
|
+
i0.ɵɵadvance(2);
|
|
159
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(6, 4, "core"), " ");
|
|
160
|
+
} }
|
|
161
|
+
function ResourceSpecFormComponent_ng_template_22_span_0_Template(rf, ctx) { if (rf & 1) {
|
|
162
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
163
|
+
i0.ɵɵtext(1);
|
|
164
|
+
i0.ɵɵpipe(2, "translate");
|
|
165
|
+
i0.ɵɵelementEnd();
|
|
166
|
+
} if (rf & 2) {
|
|
167
|
+
const cpuUnit_r11 = ctx.ngIf;
|
|
168
|
+
i0.ɵɵadvance();
|
|
169
|
+
i0.ɵɵtextInterpolate1(" ", cpuUnit_r11 === "core" ? i0.ɵɵpipeBind1(2, 1, "core") : cpuUnit_r11, " ");
|
|
170
|
+
} }
|
|
171
|
+
function ResourceSpecFormComponent_ng_template_22_Template(rf, ctx) { if (rf & 1) {
|
|
172
|
+
i0.ɵɵtemplate(0, ResourceSpecFormComponent_ng_template_22_span_0_Template, 3, 3, "span", 39);
|
|
173
|
+
} if (rf & 2) {
|
|
174
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
175
|
+
i0.ɵɵproperty("ngIf", ctx_r3.form.get("limits.cpu.unit").value);
|
|
176
|
+
} }
|
|
177
|
+
function ResourceSpecFormComponent_aui_select_32_Template(rf, ctx) { if (rf & 1) {
|
|
178
|
+
i0.ɵɵelementStart(0, "aui-select", 41)(1, "aui-option", 42);
|
|
179
|
+
i0.ɵɵtext(2, "Mi");
|
|
180
|
+
i0.ɵɵelementEnd();
|
|
181
|
+
i0.ɵɵelementStart(3, "aui-option", 43);
|
|
182
|
+
i0.ɵɵtext(4, "Gi");
|
|
183
|
+
i0.ɵɵelementEnd()();
|
|
184
|
+
} }
|
|
185
|
+
function ResourceSpecFormComponent_ng_template_33_Template(rf, ctx) { if (rf & 1) {
|
|
186
|
+
i0.ɵɵelementStart(0, "span", 40);
|
|
187
|
+
i0.ɵɵtext(1);
|
|
188
|
+
i0.ɵɵelementEnd();
|
|
189
|
+
} if (rf & 2) {
|
|
190
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
191
|
+
i0.ɵɵadvance();
|
|
192
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r3.form.get("limits.memory.unit").value, " ");
|
|
193
|
+
} }
|
|
194
|
+
const DEFINED_RESOURCE_SPECIFICATION = [
|
|
195
|
+
{
|
|
196
|
+
size: ResourceSize.SMALL,
|
|
197
|
+
limits: {
|
|
198
|
+
cpu: {
|
|
199
|
+
value: 200,
|
|
200
|
+
unit: 'm',
|
|
201
|
+
},
|
|
202
|
+
memory: {
|
|
203
|
+
value: 256,
|
|
204
|
+
unit: 'Mi',
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
size: ResourceSize.MEDIUM,
|
|
210
|
+
limits: {
|
|
211
|
+
cpu: {
|
|
212
|
+
value: 2,
|
|
213
|
+
unit: 'core',
|
|
214
|
+
},
|
|
215
|
+
memory: {
|
|
216
|
+
value: 1,
|
|
217
|
+
unit: 'Gi',
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
size: ResourceSize.LARGE,
|
|
223
|
+
limits: {
|
|
224
|
+
cpu: {
|
|
225
|
+
value: 4,
|
|
226
|
+
unit: 'core',
|
|
227
|
+
},
|
|
228
|
+
memory: {
|
|
229
|
+
value: 2,
|
|
230
|
+
unit: 'Gi',
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
];
|
|
235
|
+
export class ResourceSpecFormComponent extends BaseResourceFormGroupComponent {
|
|
236
|
+
set errorMapper(errorMapper) {
|
|
237
|
+
this._errorMapper = {
|
|
238
|
+
...this._errorMapper,
|
|
239
|
+
...errorMapper,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
get errorMapper() {
|
|
243
|
+
return this._errorMapper;
|
|
244
|
+
}
|
|
245
|
+
get resourceSpecificationMapper() {
|
|
246
|
+
return getResourceSpecificationMapper(this.resourceSpecification);
|
|
247
|
+
}
|
|
248
|
+
constructor(injector, translate) {
|
|
249
|
+
super(injector);
|
|
250
|
+
this.translate = translate;
|
|
251
|
+
this.resourceSpecification = DEFINED_RESOURCE_SPECIFICATION;
|
|
252
|
+
this.showResourceRequests = false;
|
|
253
|
+
this._errorMapper = {
|
|
254
|
+
pattern: this.translate.get(POSITIVE_INT_PATTERN.tip),
|
|
255
|
+
memory_max: this.translate.get('request_greater_than_limits_error'),
|
|
256
|
+
cpu_max: this.translate.get('request_greater_than_limits_error'),
|
|
257
|
+
};
|
|
258
|
+
this.ResourceSize = ResourceSize;
|
|
259
|
+
this.POSITIVE_INT_PATTERN = POSITIVE_INT_PATTERN;
|
|
260
|
+
this.isTemplateRef = isTemplateRef;
|
|
261
|
+
}
|
|
262
|
+
ngOnInit() {
|
|
263
|
+
super.ngOnInit();
|
|
264
|
+
if (this.showResourceRequests) {
|
|
265
|
+
const greaterValidatorSubscriptions = [
|
|
266
|
+
initGreaterValidator('cpu', this.form),
|
|
267
|
+
initGreaterValidator('memory', this.form),
|
|
268
|
+
];
|
|
269
|
+
this.destroy$.subscribe(() => {
|
|
270
|
+
greaterValidatorSubscriptions.forEach(sub => sub.unsubscribe());
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
this.form.statusChanges
|
|
274
|
+
.pipe(debounceTime(0), distinctUntilChanged(isEqual), takeUntil(this.destroy$))
|
|
275
|
+
.subscribe(() => {
|
|
276
|
+
[
|
|
277
|
+
'limits.cpu.value',
|
|
278
|
+
'limits.memory.value',
|
|
279
|
+
...(this.showResourceRequests
|
|
280
|
+
? ['requests.cpu.value', 'requests.memory.value']
|
|
281
|
+
: []),
|
|
282
|
+
].forEach(key => {
|
|
283
|
+
this.form.get(key).markAsDirty();
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
createForm() {
|
|
288
|
+
const { limits, requests } = this.resourceSpecificationMapper[ResourceSize.SMALL];
|
|
289
|
+
const resourceLimitForm = this.fb.group({
|
|
290
|
+
cpu: this.fb.group({
|
|
291
|
+
value: this.fb.control(limits?.cpu?.value, [Validators.required]),
|
|
292
|
+
unit: this.fb.control(limits?.cpu?.unit),
|
|
293
|
+
}, {
|
|
294
|
+
validators: this.validatorFn?.limits?.cpu || [],
|
|
295
|
+
}),
|
|
296
|
+
memory: this.fb.group({
|
|
297
|
+
value: this.fb.control(limits?.memory?.value, [Validators.required]),
|
|
298
|
+
unit: this.fb.control(limits?.memory?.unit),
|
|
299
|
+
}, {
|
|
300
|
+
validators: this.validatorFn?.limits?.memory || [],
|
|
301
|
+
}),
|
|
302
|
+
});
|
|
303
|
+
const resourceRequestForm = this.fb.group({
|
|
304
|
+
cpu: this.fb.group({
|
|
305
|
+
value: this.fb.control(requests?.cpu?.value, [Validators.required]),
|
|
306
|
+
unit: this.fb.control(requests?.cpu?.unit),
|
|
307
|
+
}, {
|
|
308
|
+
validators: this.validatorFn?.requests?.cpu || [],
|
|
309
|
+
}),
|
|
310
|
+
memory: this.fb.group({
|
|
311
|
+
value: this.fb.control(requests?.memory?.value, [
|
|
312
|
+
Validators.required,
|
|
313
|
+
]),
|
|
314
|
+
unit: this.fb.control(requests?.memory?.unit),
|
|
315
|
+
}, {
|
|
316
|
+
validators: this.validatorFn?.requests?.memory || [],
|
|
317
|
+
}),
|
|
318
|
+
});
|
|
319
|
+
return this.fb.group({
|
|
320
|
+
size: this.fb.control(ResourceSize.SMALL),
|
|
321
|
+
limits: resourceLimitForm,
|
|
322
|
+
...(this.showResourceRequests ? { requests: resourceRequestForm } : null),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
getDefaultFormModel() {
|
|
326
|
+
return {
|
|
327
|
+
size: ResourceSize.SMALL,
|
|
328
|
+
limits: this.resourceSpecificationMapper[ResourceSize.SMALL]?.limits,
|
|
329
|
+
...(this.showResourceRequests
|
|
330
|
+
? {
|
|
331
|
+
requests: this.resourceSpecificationMapper[ResourceSize.SMALL]?.requests,
|
|
332
|
+
}
|
|
333
|
+
: null),
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
adaptFormModel(formModel) {
|
|
337
|
+
const { limits, requests } = formModel;
|
|
338
|
+
return {
|
|
339
|
+
limits: {
|
|
340
|
+
cpu: formatResource(limits.cpu),
|
|
341
|
+
memory: formatResource(limits.memory),
|
|
342
|
+
},
|
|
343
|
+
...(this.showResourceRequests && {
|
|
344
|
+
requests: {
|
|
345
|
+
cpu: formatResource(requests.cpu),
|
|
346
|
+
memory: formatResource(requests.memory),
|
|
347
|
+
},
|
|
348
|
+
}),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
adaptResourceModel(resource) {
|
|
352
|
+
if (!resource) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
return getResourceSpecification(resource, this.resourceSpecification);
|
|
356
|
+
}
|
|
357
|
+
onResourceSizeChange(size) {
|
|
358
|
+
const limits = this.resourceSpecificationMapper[size]?.limits;
|
|
359
|
+
const resourceLimitForm = this.form.get('limits');
|
|
360
|
+
const requests = this.resourceSpecificationMapper[size]?.requests;
|
|
361
|
+
const resourceRequestForm = this.form.get('requests');
|
|
362
|
+
if (!limits) {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
resourceLimitForm.patchValue(limits);
|
|
366
|
+
resourceRequestForm?.patchValue(requests);
|
|
367
|
+
}
|
|
368
|
+
static { this.ɵfac = function ResourceSpecFormComponent_Factory(t) { return new (t || ResourceSpecFormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.TranslateService)); }; }
|
|
369
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceSpecFormComponent, selectors: [["acl-resource-spec-form"]], inputs: { resourceSizeTips: "resourceSizeTips", resourceSpecificationDescription: "resourceSpecificationDescription", resourceSpecification: "resourceSpecification", showResourceRequests: "showResourceRequests", validatorFn: "validatorFn", errorMapper: "errorMapper" }, standalone: true, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 37, vars: 25, consts: [["descriptionTemplate", ""], ["cUnit", ""], ["cpuError", ""], ["mUnit", ""], ["memoryError", ""], ["text", ""], ["rcUnit", ""], ["cpuRequestError", ""], ["rmUnit", ""], ["memoryRequiredError", ""], [3, "formGroup"], [1, "spec-model"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", "formControlName", "size", "required", "", 3, "ngModelChange"], [3, "value", 4, "ngFor", "ngForOf"], ["auiFormItemAddon", "", "icon", "question_circle", "auiTooltipPosition", "end bottom", "class", "icon--help", 3, "auiTooltip", 4, "ngIf"], ["width", "large", 4, "ngIf"], ["width", "large"], ["formGroupName", "limits", 1, "tw-flex", "tw-flex-1", "aui-form-item__control"], [1, "tw-flex-1"], ["auiFormItemControl", "", "formGroupName", "cpu"], ["auiInputAddonBefore", "", 1, "tw-required-mark"], ["aui-input", "", "formControlName", "value", "aclCoerceNumber", "", "required", "", "auiFormItemControl", "", 3, "pattern", "aclErrorsMapper", "aclErrorsMapperOutlet", "readonly"], ["class", "custom-spec-form__cpu-unit", "auiInputAddonAfter", "", "formControlName", "unit", 4, "ngIf", "ngIfElse"], ["auiFormItemError", ""], ["width", "large", 1, "tw-flex-1", "tw-ml-8"], ["auiFormItemControl", "", "formGroupName", "memory"], ["auiInputAddonAfter", "", "formControlName", "unit", 4, "ngIf", "ngIfElse"], [3, "value"], [1, "spec-model__label"], [1, "text-help"], ["auiFormItemAddon", "", "icon", "question_circle", "auiTooltipPosition", "end bottom", 1, "icon--help", 3, "auiTooltip"], [3, "ngTemplateOutlet", 4, "ngIf", "ngIfElse"], [3, "ngTemplateOutlet"], ["formGroupName", "requests", 1, "tw-flex", "tw-flex-1", "aui-form-item__control"], ["aui-input", "", "formControlName", "value", "aclCoerceNumber", "", "required", "", 3, "readonly", "pattern", "aclErrorsMapper", "aclErrorsMapperOutlet"], ["auiInputAddonAfter", "", "formControlName", "unit", 1, "custom-spec-form__cpu-unit"], ["value", "m"], ["value", "core", 3, "label"], ["auiInputAddonAfter", "", 4, "ngIf"], ["auiInputAddonAfter", ""], ["auiInputAddonAfter", "", "formControlName", "unit"], ["value", "Mi"], ["value", "Gi"]], template: function ResourceSpecFormComponent_Template(rf, ctx) { if (rf & 1) {
|
|
370
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
371
|
+
i0.ɵɵelementContainerStart(0, 10);
|
|
372
|
+
i0.ɵɵelementStart(1, "aui-form-item", 11)(2, "label", 12);
|
|
373
|
+
i0.ɵɵtext(3);
|
|
374
|
+
i0.ɵɵpipe(4, "translate");
|
|
375
|
+
i0.ɵɵelementEnd();
|
|
376
|
+
i0.ɵɵelementStart(5, "aui-radio-group", 13);
|
|
377
|
+
i0.ɵɵlistener("ngModelChange", function ResourceSpecFormComponent_Template_aui_radio_group_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onResourceSizeChange($event)); });
|
|
378
|
+
i0.ɵɵtemplate(6, ResourceSpecFormComponent_aui_radio_button_6_Template, 8, 7, "aui-radio-button", 14);
|
|
379
|
+
i0.ɵɵelementEnd();
|
|
380
|
+
i0.ɵɵtemplate(7, ResourceSpecFormComponent_aui_icon_7_Template, 1, 1, "aui-icon", 15)(8, ResourceSpecFormComponent_ng_template_8_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
381
|
+
i0.ɵɵelementEnd();
|
|
382
|
+
i0.ɵɵtemplate(10, ResourceSpecFormComponent_aui_form_item_10_Template, 26, 18, "aui-form-item", 16);
|
|
383
|
+
i0.ɵɵelementStart(11, "aui-form-item", 17)(12, "label", 12);
|
|
384
|
+
i0.ɵɵtext(13);
|
|
385
|
+
i0.ɵɵpipe(14, "translate");
|
|
386
|
+
i0.ɵɵelementEnd();
|
|
387
|
+
i0.ɵɵelementStart(15, "div", 18)(16, "aui-form-item", 19)(17, "aui-input-group", 20)(18, "span", 21);
|
|
388
|
+
i0.ɵɵtext(19, "CPU");
|
|
389
|
+
i0.ɵɵelementEnd();
|
|
390
|
+
i0.ɵɵelement(20, "input", 22);
|
|
391
|
+
i0.ɵɵtemplate(21, ResourceSpecFormComponent_aui_select_21_Template, 7, 6, "aui-select", 23)(22, ResourceSpecFormComponent_ng_template_22_Template, 1, 1, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
392
|
+
i0.ɵɵelementEnd();
|
|
393
|
+
i0.ɵɵelement(24, "div", 24, 2);
|
|
394
|
+
i0.ɵɵelementEnd();
|
|
395
|
+
i0.ɵɵelementStart(26, "aui-form-item", 25)(27, "aui-input-group", 26)(28, "span", 21);
|
|
396
|
+
i0.ɵɵtext(29);
|
|
397
|
+
i0.ɵɵpipe(30, "translate");
|
|
398
|
+
i0.ɵɵelementEnd();
|
|
399
|
+
i0.ɵɵelement(31, "input", 22);
|
|
400
|
+
i0.ɵɵtemplate(32, ResourceSpecFormComponent_aui_select_32_Template, 5, 0, "aui-select", 27)(33, ResourceSpecFormComponent_ng_template_33_Template, 2, 1, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
|
|
401
|
+
i0.ɵɵelementEnd();
|
|
402
|
+
i0.ɵɵelement(35, "div", 24, 4);
|
|
403
|
+
i0.ɵɵelementEnd()()();
|
|
404
|
+
i0.ɵɵelementContainerEnd();
|
|
405
|
+
} if (rf & 2) {
|
|
406
|
+
const cUnit_r12 = i0.ɵɵreference(23);
|
|
407
|
+
const cpuError_r13 = i0.ɵɵreference(25);
|
|
408
|
+
const mUnit_r14 = i0.ɵɵreference(34);
|
|
409
|
+
const memoryError_r15 = i0.ɵɵreference(36);
|
|
410
|
+
i0.ɵɵproperty("formGroup", ctx.form);
|
|
411
|
+
i0.ɵɵadvance(3);
|
|
412
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 19, "storage.specification"));
|
|
413
|
+
i0.ɵɵadvance(3);
|
|
414
|
+
i0.ɵɵproperty("ngForOf", ctx.resourceSizeTips);
|
|
415
|
+
i0.ɵɵadvance();
|
|
416
|
+
i0.ɵɵproperty("ngIf", ctx.resourceSpecificationDescription);
|
|
417
|
+
i0.ɵɵadvance(3);
|
|
418
|
+
i0.ɵɵproperty("ngIf", ctx.showResourceRequests);
|
|
419
|
+
i0.ɵɵadvance(3);
|
|
420
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 21, "storage.resource_limit"));
|
|
421
|
+
i0.ɵɵadvance(7);
|
|
422
|
+
i0.ɵɵproperty("pattern", ctx.POSITIVE_INT_PATTERN.pattern)("aclErrorsMapper", ctx.errorMapper)("aclErrorsMapperOutlet", cpuError_r13)("readonly", ctx.form.get("size").value !== ctx.ResourceSize.CUSTOMIZE);
|
|
423
|
+
i0.ɵɵadvance();
|
|
424
|
+
i0.ɵɵproperty("ngIf", ctx.form.get("size").value === ctx.ResourceSize.CUSTOMIZE)("ngIfElse", cUnit_r12);
|
|
425
|
+
i0.ɵɵadvance(8);
|
|
426
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(30, 23, "memory"));
|
|
427
|
+
i0.ɵɵadvance(2);
|
|
428
|
+
i0.ɵɵproperty("pattern", ctx.POSITIVE_INT_PATTERN.pattern)("aclErrorsMapper", ctx.errorMapper)("aclErrorsMapperOutlet", memoryError_r15)("readonly", ctx.form.get("size").value !== ctx.ResourceSize.CUSTOMIZE);
|
|
429
|
+
i0.ɵɵadvance();
|
|
430
|
+
i0.ɵɵproperty("ngIf", ctx.form.get("size").value === ctx.ResourceSize.CUSTOMIZE)("ngIfElse", mUnit_r14);
|
|
431
|
+
} }, dependencies: [CommonModule, i2.NgForOf, i2.NgIf, i2.NgTemplateOutlet, ReactiveFormsModule, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.RequiredValidator, i3.PatternValidator, i3.FormGroupDirective, i3.FormControlName, i3.FormGroupName, FormModule, i4.FormItemComponent, i4.FormItemAddonDirective, i4.FormItemErrorDirective, i4.FormItemLabelDirective, i4.FormItemControlDirective, IconModule, i4.IconComponent, InputModule, i4.InputComponent, i4.InputGroupComponent, i4.InputAddonBeforeDirective, i4.InputAddonAfterDirective, RadioModule, i4.RadioGroupComponent, i4.RadioButtonComponent, SelectModule, i4.SelectComponent, i4.OptionComponent, TooltipModule, i4.TooltipDirective, i1.TranslatePipe, i1.ErrorsMapperDirective, CoreModule, i1.E2eAttributeBindingDirective, i1.ValidatorsDirective, CoerceNumberDirective], styles: ["aui-form-item[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}.spec-model[_ngcontent-%COMP%] .aui-form-item__label-wrapper{height:64px}.spec-model[_ngcontent-%COMP%] .aui-form-item__label-wrapper.hasLabel:after{align-self:center}.spec-model[_ngcontent-%COMP%] .aui-form-item__addon-wrapper{align-self:center}.spec-model[_ngcontent-%COMP%] .aui-radio-button__label{height:64px;min-width:132px;padding:0}.spec-model[_ngcontent-%COMP%] .aui-radio-button__label>span{flex:1;height:100%}.spec-model[_ngcontent-%COMP%] .aui-radio-button__label .text-help{margin-top:2px;font-size:12px}.spec-model__label[_ngcontent-%COMP%]{display:flex;text-align:center;justify-content:center;align-items:center;height:100%;padding:0 15px}[_nghost-%COMP%] .aui-form-item__label-wrapper:empty{display:none}[_nghost-%COMP%] .aui-input-group__input-wrapper:focus-within+.aui-input-group__addon .aui-select__input, [_nghost-%COMP%] .aui-input-group__input-wrapper:hover+.aui-input-group__addon .aui-select__input{border-left-color:rgb(var(--aui-color-primary))}[_nghost-%COMP%] aui-input-group.ng-invalid .aui-input-group__input-wrapper+.aui-input-group__addon .aui-select__input{border-left-color:rgb(var(--aui-color-red))}[_nghost-%COMP%] .aui-input-group__addon--after aui-select{margin-left:-8px;margin-right:-8px;width:56px} html:not([lang|=zh]) .custom-spec-form__cpu-unit{width:78px}"], changeDetection: 0 }); }
|
|
432
|
+
}
|
|
433
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceSpecFormComponent, [{
|
|
434
|
+
type: Component,
|
|
435
|
+
args: [{ standalone: true, selector: 'acl-resource-spec-form', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
436
|
+
CommonModule,
|
|
437
|
+
ReactiveFormsModule,
|
|
438
|
+
FormModule,
|
|
439
|
+
IconModule,
|
|
440
|
+
InputModule,
|
|
441
|
+
RadioModule,
|
|
442
|
+
SelectModule,
|
|
443
|
+
TooltipModule,
|
|
444
|
+
TRANSLATE_MODULE,
|
|
445
|
+
ERRORS_MAPPER_MODULE,
|
|
446
|
+
CoreModule,
|
|
447
|
+
CoerceNumberDirective,
|
|
448
|
+
], template: "<ng-container [formGroup]=\"form\">\n <aui-form-item class=\"spec-model\">\n <label auiFormItemLabel>{{ 'storage.specification' | translate }}</label>\n <aui-radio-group\n auiFormItemControl\n formControlName=\"size\"\n (ngModelChange)=\"onResourceSizeChange($event)\"\n required\n >\n <aui-radio-button\n *ngFor=\"let item of resourceSizeTips\"\n [value]=\"item.size\"\n >\n <div class=\"spec-model__label\">\n <div>\n {{ 'storage.' + item.size + '_scale' | translate }}\n <div class=\"text-help\">\n {{ item.tip | translate }}\n </div>\n </div>\n </div>\n </aui-radio-button>\n </aui-radio-group>\n <aui-icon\n *ngIf=\"resourceSpecificationDescription\"\n auiFormItemAddon\n [auiTooltip]=\"descriptionTemplate\"\n icon=\"question_circle\"\n auiTooltipPosition=\"end bottom\"\n class=\"icon--help\"\n ></aui-icon>\n <ng-template #descriptionTemplate>\n <ng-container\n *ngIf=\"isTemplateRef(resourceSpecificationDescription); else text\"\n [ngTemplateOutlet]=\"resourceSpecificationDescription\"\n ></ng-container>\n <ng-template #text>\n {{ resourceSpecificationDescription }}\n </ng-template>\n </ng-template>\n </aui-form-item>\n\n <aui-form-item\n width=\"large\"\n *ngIf=\"showResourceRequests\"\n >\n <label auiFormItemLabel>{{ 'storage.resource_request' | translate }}</label>\n <div\n formGroupName=\"requests\"\n class=\"tw-flex tw-flex-1 aui-form-item__control\"\n >\n <aui-form-item class=\"tw-flex-1\">\n <aui-input-group\n auiFormItemControl\n formGroupName=\"cpu\"\n >\n <span\n auiInputAddonBefore\n class=\"tw-required-mark\"\n >CPU</span\n >\n <input\n aui-input\n formControlName=\"value\"\n aclCoerceNumber\n [pattern]=\"POSITIVE_INT_PATTERN.pattern\"\n [aclErrorsMapper]=\"errorMapper\"\n [aclErrorsMapperOutlet]=\"cpuRequestError\"\n required\n [readonly]=\"form.get('size').value !== ResourceSize.CUSTOMIZE\"\n auiFormItemControl\n />\n <aui-select\n *ngIf=\"\n form.get('size').value === ResourceSize.CUSTOMIZE;\n else rcUnit\n \"\n class=\"custom-spec-form__cpu-unit\"\n auiInputAddonAfter\n formControlName=\"unit\"\n >\n <aui-option value=\"m\">m</aui-option>\n <aui-option\n value=\"core\"\n [label]=\"'core' | translate\"\n >\n {{ 'core' | translate }}\n </aui-option>\n </aui-select>\n <ng-template #rcUnit>\n <span\n *ngIf=\"form.get('requests.cpu.unit').value as cpuUnit\"\n auiInputAddonAfter\n >\n {{ cpuUnit === 'core' ? ('core' | translate) : cpuUnit }}\n </span>\n </ng-template>\n </aui-input-group>\n <div\n auiFormItemError\n #cpuRequestError\n ></div>\n </aui-form-item>\n\n <aui-form-item\n class=\"tw-flex-1 tw-ml-8\"\n width=\"large\"\n >\n <aui-input-group\n auiFormItemControl\n formGroupName=\"memory\"\n >\n <span\n auiInputAddonBefore\n class=\"tw-required-mark\"\n >{{ 'memory' | translate }}</span\n >\n <input\n aui-input\n formControlName=\"value\"\n aclCoerceNumber\n [readonly]=\"form.get('size').value !== ResourceSize.CUSTOMIZE\"\n [pattern]=\"POSITIVE_INT_PATTERN.pattern\"\n [aclErrorsMapper]=\"errorMapper\"\n [aclErrorsMapperOutlet]=\"memoryRequiredError\"\n required\n />\n <aui-select\n *ngIf=\"\n form.get('size').value === ResourceSize.CUSTOMIZE;\n else rmUnit\n \"\n auiInputAddonAfter\n formControlName=\"unit\"\n >\n <aui-option value=\"Mi\">Mi</aui-option>\n <aui-option value=\"Gi\">Gi</aui-option>\n </aui-select>\n <ng-template #rmUnit>\n <span auiInputAddonAfter>\n {{ form.get('requests.memory.unit').value }}\n </span>\n </ng-template>\n </aui-input-group>\n <div\n auiFormItemError\n #memoryRequiredError\n ></div>\n </aui-form-item>\n </div>\n </aui-form-item>\n\n <aui-form-item width=\"large\">\n <label auiFormItemLabel>{{ 'storage.resource_limit' | translate }}</label>\n <div\n formGroupName=\"limits\"\n class=\"tw-flex tw-flex-1 aui-form-item__control\"\n >\n <aui-form-item class=\"tw-flex-1\">\n <aui-input-group\n auiFormItemControl\n formGroupName=\"cpu\"\n >\n <span\n auiInputAddonBefore\n class=\"tw-required-mark\"\n >CPU</span\n >\n <input\n aui-input\n formControlName=\"value\"\n aclCoerceNumber\n [pattern]=\"POSITIVE_INT_PATTERN.pattern\"\n [aclErrorsMapper]=\"errorMapper\"\n [aclErrorsMapperOutlet]=\"cpuError\"\n [readonly]=\"form.get('size').value !== ResourceSize.CUSTOMIZE\"\n required\n auiFormItemControl\n />\n <aui-select\n *ngIf=\"\n form.get('size').value === ResourceSize.CUSTOMIZE;\n else cUnit\n \"\n class=\"custom-spec-form__cpu-unit\"\n auiInputAddonAfter\n formControlName=\"unit\"\n >\n <aui-option value=\"m\">m</aui-option>\n <aui-option\n value=\"core\"\n [label]=\"'core' | translate\"\n >\n {{ 'core' | translate }}\n </aui-option>\n </aui-select>\n <ng-template #cUnit>\n <span\n *ngIf=\"form.get('limits.cpu.unit').value as cpuUnit\"\n auiInputAddonAfter\n >\n {{ cpuUnit === 'core' ? ('core' | translate) : cpuUnit }}\n </span>\n </ng-template>\n </aui-input-group>\n <div\n auiFormItemError\n #cpuError\n ></div>\n </aui-form-item>\n\n <aui-form-item\n class=\"tw-flex-1 tw-ml-8\"\n width=\"large\"\n >\n <aui-input-group\n auiFormItemControl\n formGroupName=\"memory\"\n >\n <span\n auiInputAddonBefore\n class=\"tw-required-mark\"\n >{{ 'memory' | translate }}</span\n >\n <input\n aui-input\n formControlName=\"value\"\n aclCoerceNumber\n [pattern]=\"POSITIVE_INT_PATTERN.pattern\"\n [aclErrorsMapper]=\"errorMapper\"\n [aclErrorsMapperOutlet]=\"memoryError\"\n [readonly]=\"form.get('size').value !== ResourceSize.CUSTOMIZE\"\n required\n auiFormItemControl\n />\n\n <aui-select\n *ngIf=\"\n form.get('size').value === ResourceSize.CUSTOMIZE;\n else mUnit\n \"\n auiInputAddonAfter\n formControlName=\"unit\"\n >\n <aui-option value=\"Mi\">Mi</aui-option>\n <aui-option value=\"Gi\">Gi</aui-option>\n </aui-select>\n <ng-template #mUnit>\n <span auiInputAddonAfter>\n {{ form.get('limits.memory.unit').value }}\n </span>\n </ng-template>\n </aui-input-group>\n <div\n auiFormItemError\n #memoryError\n ></div>\n </aui-form-item>\n </div>\n </aui-form-item>\n</ng-container>\n", styles: ["aui-form-item aui-form-item ::ng-deep .aui-form-item{margin-bottom:0}.spec-model ::ng-deep .aui-form-item__label-wrapper{height:64px}.spec-model ::ng-deep .aui-form-item__label-wrapper.hasLabel:after{align-self:center}.spec-model ::ng-deep .aui-form-item__addon-wrapper{align-self:center}.spec-model ::ng-deep .aui-radio-button__label{height:64px;min-width:132px;padding:0}.spec-model ::ng-deep .aui-radio-button__label>span{flex:1;height:100%}.spec-model ::ng-deep .aui-radio-button__label .text-help{margin-top:2px;font-size:12px}.spec-model__label{display:flex;text-align:center;justify-content:center;align-items:center;height:100%;padding:0 15px}:host ::ng-deep .aui-form-item__label-wrapper:empty{display:none}:host ::ng-deep .aui-input-group__input-wrapper:focus-within+.aui-input-group__addon .aui-select__input,:host ::ng-deep .aui-input-group__input-wrapper:hover+.aui-input-group__addon .aui-select__input{border-left-color:rgb(var(--aui-color-primary))}:host ::ng-deep aui-input-group.ng-invalid .aui-input-group__input-wrapper+.aui-input-group__addon .aui-select__input{border-left-color:rgb(var(--aui-color-red))}:host ::ng-deep .aui-input-group__addon--after aui-select{margin-left:-8px;margin-right:-8px;width:56px}::ng-deep html:not([lang|=zh]) .custom-spec-form__cpu-unit{width:78px}\n"] }]
|
|
449
|
+
}], () => [{ type: i0.Injector }, { type: i1.TranslateService }], { resourceSizeTips: [{
|
|
450
|
+
type: Input,
|
|
451
|
+
args: [{ required: true }]
|
|
452
|
+
}], resourceSpecificationDescription: [{
|
|
453
|
+
type: Input
|
|
454
|
+
}], resourceSpecification: [{
|
|
455
|
+
type: Input
|
|
456
|
+
}], showResourceRequests: [{
|
|
457
|
+
type: Input
|
|
458
|
+
}], validatorFn: [{
|
|
459
|
+
type: Input
|
|
460
|
+
}], errorMapper: [{
|
|
461
|
+
type: Input
|
|
462
|
+
}] }); })();
|
|
463
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceSpecFormComponent, { className: "ResourceSpecFormComponent", filePath: "lib/components/spec-form/component.ts", lineNumber: 120 }); })();
|
|
464
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yYWdlL3NyYy9saWIvY29tcG9uZW50cy9zcGVjLWZvcm0vY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy9zdG9yYWdlL3NyYy9saWIvY29tcG9uZW50cy9zcGVjLWZvcm0vdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixhQUFhLEVBQ2IsYUFBYSxHQUNkLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixPQUFPLEVBRVAsZ0JBQWdCLEdBQ2pCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJFLE9BQU8sRUFDTCxZQUFZLEdBR2IsTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLDhCQUE4QixFQUM5Qix3QkFBd0IsR0FDekIsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7OztJQzdCNUIsQUFERixBQUpGLDRDQUdDLGNBQ2dDLFVBQ3hCO0lBQ0gsWUFDQTs7SUFBQSwrQkFBdUI7SUFDckIsWUFDRjs7SUFHTixBQURFLEFBREUsQUFERSxpQkFBTSxFQUNGLEVBQ0YsRUFDVzs7O0lBVmpCLG9DQUFtQjtJQUlmLGVBQ0E7SUFEQSwyRkFDQTtJQUNFLGVBQ0Y7SUFERSxrRUFDRjs7O0lBS1IsK0JBT1k7Ozs7SUFKVixtREFBa0M7OztJQU1sQyw0QkFHZ0I7OztJQURkLDBFQUFxRDs7O0lBR3JELFlBQ0Y7OztJQURFLHdFQUNGOzs7SUFGQSxBQUpBLDJHQUdDLDRIQUNrQjs7OztJQUh1QyxBQUF2RCxvRkFBdUQscUJBQVM7OztJQWdEN0QsQUFURixzQ0FRQyxxQkFDdUI7SUFBQSxpQkFBQztJQUFBLGlCQUFhO0lBQ3BDLHNDQUdDOztJQUNDLFlBQ0Y7O0lBQ0YsQUFERSxpQkFBYSxFQUNGOztJQUpULGVBQTRCO0lBQTVCLG9EQUE0QjtJQUU1QixlQUNGO0lBREUsNkRBQ0Y7OztJQUdBLGdDQUdDO0lBQ0MsWUFDRjs7SUFBQSxpQkFBTzs7O0lBREwsY0FDRjtJQURFLGtHQUNGOzs7SUFMQSw2R0FHQzs7O0lBRkUsaUVBQTBDOzs7SUE0QzdDLEFBUkYsc0NBT0MscUJBQ3dCO0lBQUEsa0JBQUU7SUFBQSxpQkFBYTtJQUN0QyxzQ0FBdUI7SUFBQSxrQkFBRTtJQUMzQixBQUQyQixpQkFBYSxFQUMzQjs7O0lBRVgsZ0NBQXlCO0lBQ3ZCLFlBQ0Y7SUFBQSxpQkFBTzs7O0lBREwsY0FDRjtJQURFLDhFQUNGOzs7SUEvRlIsQUFKRix5Q0FHQyxnQkFDeUI7SUFBQSxZQUE0Qzs7SUFBQSxpQkFBUTtJQVV0RSxBQUpGLEFBREYsQUFKRiwrQkFHQyx3QkFDa0MsMEJBSTlCLGVBSUk7SUFBQSxtQkFBRztJQUFBLGlCQUNMO0lBQ0QsNEJBVUU7SUFrQkYsQUFqQkEsNEdBUUMsaUlBU29CO0lBUXZCLGlCQUFrQjtJQUNsQiw4QkFHTztJQUNULGlCQUFnQjtJQVVaLEFBSkYsQUFKRiwwQ0FHQywyQkFJRSxnQkFJSTtJQUFBLGFBQTBCOztJQUFBLGlCQUM1QjtJQUNELDZCQVNFO0lBWUYsQUFYQSw0R0FPQyxpSUFJb0I7SUFLdkIsaUJBQWtCO0lBQ2xCLDhCQUdPO0lBR2IsQUFERSxBQURFLGlCQUFnQixFQUNaLEVBQ1E7Ozs7Ozs7SUF4R1UsZUFBNEM7SUFBNUMsdUVBQTRDO0lBbUI1RCxlQUF3QztJQUl4QyxBQUZBLEFBREEsQUFEQSw2REFBd0MsdUNBQ1QsNkNBQ1UsNkVBRXFCO0lBSTdELGNBR1Y7SUFBQSxBQUhVLHNGQUdWLHVCQUNIO0lBc0NhLGVBQTBCO0lBQTFCLHNEQUEwQjtJQU0zQixlQUE4RDtJQUc5RCxBQURBLEFBREEsQUFEQSwwRkFBOEQsZ0RBQ3RCLHVDQUNULGtEQUNjO0lBSTVDLGNBR1Y7SUFBQSxBQUhVLHNGQUdWLHVCQUNIOzs7SUF3RFksQUFURixzQ0FRQyxxQkFDdUI7SUFBQSxpQkFBQztJQUFBLGlCQUFhO0lBQ3BDLHNDQUdDOztJQUNDLFlBQ0Y7O0lBQ0YsQUFERSxpQkFBYSxFQUNGOztJQUpULGVBQTRCO0lBQTVCLG9EQUE0QjtJQUU1QixlQUNGO0lBREUsNkRBQ0Y7OztJQUdBLGdDQUdDO0lBQ0MsWUFDRjs7SUFBQSxpQkFBTzs7O0lBREwsY0FDRjtJQURFLG9HQUNGOzs7SUFMQSw0RkFHQzs7O0lBRkUsK0RBQXdDOzs7SUE4QzNDLEFBUkYsc0NBT0MscUJBQ3dCO0lBQUEsa0JBQUU7SUFBQSxpQkFBYTtJQUN0QyxzQ0FBdUI7SUFBQSxrQkFBRTtJQUMzQixBQUQyQixpQkFBYSxFQUMzQjs7O0lBRVgsZ0NBQXlCO0lBQ3ZCLFlBQ0Y7SUFBQSxpQkFBTzs7O0lBREwsY0FDRjtJQURFLDRFQUNGOztBRDdNWixNQUFNLDhCQUE4QixHQUE0QjtJQUM5RDtRQUNFLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSztRQUN4QixNQUFNLEVBQUU7WUFDTixHQUFHLEVBQUU7Z0JBQ0gsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsSUFBSSxFQUFFLEdBQUc7YUFDVjtZQUNELE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsR0FBRztnQkFDVixJQUFJLEVBQUUsSUFBSTthQUNYO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFlBQVksQ0FBQyxNQUFNO1FBQ3pCLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLEVBQUUsTUFBTTthQUNiO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksRUFBRSxJQUFJO2FBQ1g7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUs7UUFDeEIsTUFBTSxFQUFFO1lBQ04sR0FBRyxFQUFFO2dCQUNILEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksRUFBRSxNQUFNO2FBQ2I7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLElBQUk7YUFDWDtTQUNGO0tBQ0Y7Q0FDRixDQUFDO0FBa0NGLE1BQU0sT0FBTyx5QkFDWCxTQUFRLDhCQUdQO0lBb0JELElBQ0ksV0FBVyxDQUFDLFdBQXNCO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEIsR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNwQixHQUFHLFdBQVc7U0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSwyQkFBMkI7UUFDN0IsT0FBTyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBWUQsWUFDRSxRQUFrQixFQUNELFNBQTJCO1FBRTVDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUZDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBcEM5QywwQkFBcUIsR0FBRyw4QkFBOEIsQ0FBQztRQUd2RCx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFxQnJCLGlCQUFZLEdBQWM7WUFDaEMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQztZQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsbUNBQW1DLENBQUM7WUFDbkUsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxDQUFDO1NBQ2pFLENBQUM7UUFFRixpQkFBWSxHQUFHLFlBQVksQ0FBQztRQUM1Qix5QkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQUM1QyxrQkFBYSxHQUFHLGFBQWEsQ0FBQztJQU85QixDQUFDO0lBRVEsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzlCLE1BQU0sNkJBQTZCLEdBQUc7Z0JBQ3BDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN0QyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQzthQUMxQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUMzQiw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7YUFDcEIsSUFBSSxDQUNILFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFDN0IsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDekI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2Q7Z0JBQ0Usa0JBQWtCO2dCQUNsQixxQkFBcUI7Z0JBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CO29CQUMzQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSx1QkFBdUIsQ0FBQztvQkFDakQsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVEsVUFBVTtRQUNqQixNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUN4QixJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdEMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUNoQjtnQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQzthQUN6QyxFQUNEO2dCQUNFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRTthQUNoRCxDQUNGO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUNuQjtnQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQzthQUM1QyxFQUNEO2dCQUNFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRTthQUNuRCxDQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ2hCO2dCQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDO2FBQzNDLEVBQ0Q7Z0JBQ0UsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUFFO2FBQ2xELENBQ0Y7WUFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQ25CO2dCQUNFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtvQkFDOUMsVUFBVSxDQUFDLFFBQVE7aUJBQ3BCLENBQUM7Z0JBQ0YsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDO2FBQzlDLEVBQ0Q7Z0JBQ0UsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxFQUFFO2FBQ3JELENBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxpQkFBaUI7WUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQzFFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUSxtQkFBbUI7UUFDMUIsT0FBTztZQUNMLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSztZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNO1lBQ3BFLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CO2dCQUMzQixDQUFDLENBQUM7b0JBQ0UsUUFBUSxFQUNOLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUTtpQkFDakU7Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUNWLENBQUM7SUFDSixDQUFDO0lBRVEsY0FBYyxDQUNyQixTQUFnQztRQUVoQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUV2QyxPQUFPO1lBQ0wsTUFBTSxFQUFFO2dCQUNOLEdBQUcsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDL0IsTUFBTSxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ3RDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSTtnQkFDL0IsUUFBUSxFQUFFO29CQUNSLEdBQUcsRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztvQkFDakMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2lCQUN4QzthQUNGLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVRLGtCQUFrQixDQUN6QixRQUE4QjtRQUU5QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sd0JBQXdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFrQjtRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQzlELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUNsRSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBRUQsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDOzBGQXZNVSx5QkFBeUI7b0VBQXpCLHlCQUF5Qjs7WUN2SHRDLGlDQUFpQztZQUU3QixBQURGLHlDQUFrQyxnQkFDUjtZQUFBLFlBQXlDOztZQUFBLGlCQUFRO1lBQ3pFLDJDQUtDO1lBRkMsMktBQWlCLGdDQUE0QixLQUFDO1lBRzlDLHFHQUdDO1lBVUgsaUJBQWtCO1lBU2xCLEFBUkEscUZBT0MsOEdBQ2lDO1lBU3BDLGlCQUFnQjtZQUVoQixtR0FHQztZQTRHQyxBQURGLDBDQUE2QixpQkFDSDtZQUFBLGFBQTBDOztZQUFBLGlCQUFRO1lBVXBFLEFBSkYsQUFERixBQUpGLGdDQUdDLHlCQUNrQywyQkFJOUIsZ0JBSUk7WUFBQSxvQkFBRztZQUFBLGlCQUNMO1lBQ0QsNkJBVUU7WUFrQkYsQUFqQkEsMkZBUUMsZ0hBU21CO1lBUXRCLGlCQUFrQjtZQUNsQiw4QkFHTztZQUNULGlCQUFnQjtZQVVaLEFBSkYsQUFKRiwwQ0FHQywyQkFJRSxnQkFJSTtZQUFBLGFBQTBCOztZQUFBLGlCQUM1QjtZQUNELDZCQVVFO1lBYUYsQUFYQSwyRkFPQyxnSEFJbUI7WUFLdEIsaUJBQWtCO1lBQ2xCLDhCQUdPO1lBR2IsQUFERSxBQURFLGlCQUFnQixFQUNaLEVBQ1E7Ozs7Ozs7WUFuUUosb0NBQWtCO1lBRUosZUFBeUM7WUFBekMsb0VBQXlDO1lBUTVDLGVBQW1CO1lBQW5CLDhDQUFtQjtZQWNyQyxjQUFzQztZQUF0QywyREFBc0M7WUFvQnhDLGVBQTBCO1lBQTFCLCtDQUEwQjtZQTZHSCxlQUEwQztZQUExQyxzRUFBMEM7WUFtQjFELGVBQXdDO1lBR3hDLEFBREEsQUFEQSxBQURBLDBEQUF3QyxvQ0FDVCx1Q0FDRyx1RUFDNEI7WUFLN0QsY0FHVDtZQUFBLEFBSFMsZ0ZBR1QsdUJBQ0o7WUFzQ2EsZUFBMEI7WUFBMUIsc0RBQTBCO1lBTTNCLGVBQXdDO1lBR3hDLEFBREEsQUFEQSxBQURBLDBEQUF3QyxvQ0FDVCwwQ0FDTSx1RUFDeUI7WUFNN0QsY0FHVDtZQUFBLEFBSFMsZ0ZBR1QsdUJBQ0o7NEJEeElJLFlBQVksNENBQ1osbUJBQW1CLGdMQUNuQixVQUFVLHNJQUNWLFVBQVUsb0JBQ1YsV0FBVyx3R0FDWCxXQUFXLG1EQUNYLFlBQVksMENBQ1osYUFBYSxtRUFHYixVQUFVLDJEQUNWLHFCQUFxQjs7aUZBR1oseUJBQXlCO2NBckJyQyxTQUFTOzZCQUNJLElBQUksWUFDTix3QkFBd0IsbUJBR2pCLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7b0JBQ1AsWUFBWTtvQkFDWixtQkFBbUI7b0JBQ25CLFVBQVU7b0JBQ1YsVUFBVTtvQkFDVixXQUFXO29CQUNYLFdBQVc7b0JBQ1gsWUFBWTtvQkFDWixhQUFhO29CQUNiLGdCQUFnQjtvQkFDaEIsb0JBQW9CO29CQUNwQixVQUFVO29CQUNWLHFCQUFxQjtpQkFDdEI7d0VBV0QsZ0JBQWdCO2tCQURmLEtBQUs7bUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO1lBS3pCLGdDQUFnQztrQkFEL0IsS0FBSztZQUlOLHFCQUFxQjtrQkFEcEIsS0FBSztZQUlOLG9CQUFvQjtrQkFEbkIsS0FBSztZQUlOLFdBQVc7a0JBRFYsS0FBSztZQUlGLFdBQVc7a0JBRGQsS0FBSzs7a0ZBeEJLLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEZvcm1Nb2R1bGUsXG4gIEljb25Nb2R1bGUsXG4gIElucHV0TW9kdWxlLFxuICBSYWRpb01vZHVsZSxcbiAgU2VsZWN0TW9kdWxlLFxuICBUb29sdGlwTW9kdWxlLFxuICBpc1RlbXBsYXRlUmVmLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7XG4gIFRSQU5TTEFURV9NT0RVTEUsXG4gIEVSUk9SU19NQVBQRVJfTU9EVUxFLFxuICBDb3JlTW9kdWxlLFxuICBDb2VyY2VOdW1iZXJEaXJlY3RpdmUsXG4gIFBPU0lUSVZFX0lOVF9QQVRURVJOLFxuICBpbml0R3JlYXRlclZhbGlkYXRvcixcbiAgaXNFcXVhbCxcbiAgU3RyaW5nTWFwLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxufSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmFzZVJlc291cmNlRm9ybUdyb3VwQ29tcG9uZW50IH0gZnJvbSAnbmctcmVzb3VyY2UtZm9ybS11dGlsJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBSZXNvdXJjZVNpemUsXG4gIFJlc291cmNlU2l6ZVRpcCxcbiAgUmVzb3VyY2VTcGVjaWZpY2F0aW9uLFxufSBmcm9tICcuLi8uLi90eXBlcy9yZXNvdXJjZS1leHBvcnRzJztcbmltcG9ydCB7IFJlc291cmNlUmVxdWlyZW1lbnRzIH0gZnJvbSAnLi4vLi4vdHlwZXMvcmVzb3VyY2UtaW50ZXJuYWxzJztcbmltcG9ydCB7XG4gIGZvcm1hdFJlc291cmNlLFxuICBnZXRSZXNvdXJjZVNwZWNpZmljYXRpb25NYXBwZXIsXG4gIGdldFJlc291cmNlU3BlY2lmaWNhdGlvbixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvcmVzb3VyY2UtZXhwb3J0cyc7XG5cbmNvbnN0IERFRklORURfUkVTT1VSQ0VfU1BFQ0lGSUNBVElPTjogUmVzb3VyY2VTcGVjaWZpY2F0aW9uW10gPSBbXG4gIHtcbiAgICBzaXplOiBSZXNvdXJjZVNpemUuU01BTEwsXG4gICAgbGltaXRzOiB7XG4gICAgICBjcHU6IHtcbiAgICAgICAgdmFsdWU6IDIwMCxcbiAgICAgICAgdW5pdDogJ20nLFxuICAgICAgfSxcbiAgICAgIG1lbW9yeToge1xuICAgICAgICB2YWx1ZTogMjU2LFxuICAgICAgICB1bml0OiAnTWknLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgc2l6ZTogUmVzb3VyY2VTaXplLk1FRElVTSxcbiAgICBsaW1pdHM6IHtcbiAgICAgIGNwdToge1xuICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgdW5pdDogJ2NvcmUnLFxuICAgICAgfSxcbiAgICAgIG1lbW9yeToge1xuICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgdW5pdDogJ0dpJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAge1xuICAgIHNpemU6IFJlc291cmNlU2l6ZS5MQVJHRSxcbiAgICBsaW1pdHM6IHtcbiAgICAgIGNwdToge1xuICAgICAgICB2YWx1ZTogNCxcbiAgICAgICAgdW5pdDogJ2NvcmUnLFxuICAgICAgfSxcbiAgICAgIG1lbW9yeToge1xuICAgICAgICB2YWx1ZTogMixcbiAgICAgICAgdW5pdDogJ0dpJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbl07XG5cbmludGVyZmFjZSBSZXNvdXJjZVZhbGlkYXRvckZuIHtcbiAgbGltaXRzPzoge1xuICAgIGNwdTogVmFsaWRhdG9yRm5bXTtcbiAgICBtZW1vcnk6IFZhbGlkYXRvckZuW107XG4gIH07XG4gIHJlcXVlc3RzPzoge1xuICAgIGNwdTogVmFsaWRhdG9yRm5bXTtcbiAgICBtZW1vcnk6IFZhbGlkYXRvckZuW107XG4gIH07XG59XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2FjbC1yZXNvdXJjZS1zcGVjLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ3RlbXBsYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybU1vZHVsZSxcbiAgICBJY29uTW9kdWxlLFxuICAgIElucHV0TW9kdWxlLFxuICAgIFJhZGlvTW9kdWxlLFxuICAgIFNlbGVjdE1vZHVsZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIFRSQU5TTEFURV9NT0RVTEUsXG4gICAgRVJST1JTX01BUFBFUl9NT0RVTEUsXG4gICAgQ29yZU1vZHVsZSxcbiAgICBDb2VyY2VOdW1iZXJEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJlc291cmNlU3BlY0Zvcm1Db21wb25lbnRcbiAgZXh0ZW5kcyBCYXNlUmVzb3VyY2VGb3JtR3JvdXBDb21wb25lbnQ8XG4gICAgUmVzb3VyY2VSZXF1aXJlbWVudHMsXG4gICAgUmVzb3VyY2VTcGVjaWZpY2F0aW9uXG4gID5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgLy8g6KeE5qC86K+05piOXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHJlc291cmNlU2l6ZVRpcHM6IFJlc291cmNlU2l6ZVRpcFtdO1xuXG4gIC8vIOinhOagvOaPj+i/sFxuICBASW5wdXQoKVxuICByZXNvdXJjZVNwZWNpZmljYXRpb25EZXNjcmlwdGlvbjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKVxuICByZXNvdXJjZVNwZWNpZmljYXRpb24gPSBERUZJTkVEX1JFU09VUkNFX1NQRUNJRklDQVRJT047XG5cbiAgQElucHV0KClcbiAgc2hvd1Jlc291cmNlUmVxdWVzdHMgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICB2YWxpZGF0b3JGbjogUmVzb3VyY2VWYWxpZGF0b3JGbjtcblxuICBASW5wdXQoKVxuICBzZXQgZXJyb3JNYXBwZXIoZXJyb3JNYXBwZXI6IFN0cmluZ01hcCkge1xuICAgIHRoaXMuX2Vycm9yTWFwcGVyID0ge1xuICAgICAgLi4udGhpcy5fZXJyb3JNYXBwZXIsXG4gICAgICAuLi5lcnJvck1hcHBlcixcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGVycm9yTWFwcGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9lcnJvck1hcHBlcjtcbiAgfVxuXG4gIGdldCByZXNvdXJjZVNwZWNpZmljYXRpb25NYXBwZXIoKSB7XG4gICAgcmV0dXJuIGdldFJlc291cmNlU3BlY2lmaWNhdGlvbk1hcHBlcih0aGlzLnJlc291cmNlU3BlY2lmaWNhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9lcnJvck1hcHBlcjogU3RyaW5nTWFwID0ge1xuICAgIHBhdHRlcm46IHRoaXMudHJhbnNsYXRlLmdldChQT1NJVElWRV9JTlRfUEFUVEVSTi50aXApLFxuICAgIG1lbW9yeV9tYXg6IHRoaXMudHJhbnNsYXRlLmdldCgncmVxdWVzdF9ncmVhdGVyX3RoYW5fbGltaXRzX2Vycm9yJyksXG4gICAgY3B1X21heDogdGhpcy50cmFuc2xhdGUuZ2V0KCdyZXF1ZXN0X2dyZWF0ZXJfdGhhbl9saW1pdHNfZXJyb3InKSxcbiAgfTtcblxuICBSZXNvdXJjZVNpemUgPSBSZXNvdXJjZVNpemU7XG4gIFBPU0lUSVZFX0lOVF9QQVRURVJOID0gUE9TSVRJVkVfSU5UX1BBVFRFUk47XG4gIGlzVGVtcGxhdGVSZWYgPSBpc1RlbXBsYXRlUmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGlmICh0aGlzLnNob3dSZXNvdXJjZVJlcXVlc3RzKSB7XG4gICAgICBjb25zdCBncmVhdGVyVmFsaWRhdG9yU3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgICAgaW5pdEdyZWF0ZXJWYWxpZGF0b3IoJ2NwdScsIHRoaXMuZm9ybSksXG4gICAgICAgIGluaXRHcmVhdGVyVmFsaWRhdG9yKCdtZW1vcnknLCB0aGlzLmZvcm0pLFxuICAgICAgXTtcbiAgICAgIHRoaXMuZGVzdHJveSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgZ3JlYXRlclZhbGlkYXRvclN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtLnN0YXR1c0NoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzRXF1YWwpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgW1xuICAgICAgICAgICdsaW1pdHMuY3B1LnZhbHVlJyxcbiAgICAgICAgICAnbGltaXRzLm1lbW9yeS52YWx1ZScsXG4gICAgICAgICAgLi4uKHRoaXMuc2hvd1Jlc291cmNlUmVxdWVzdHNcbiAgICAgICAgICAgID8gWydyZXF1ZXN0cy5jcHUudmFsdWUnLCAncmVxdWVzdHMubWVtb3J5LnZhbHVlJ11cbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGtleSkubWFya0FzRGlydHkoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgY29uc3QgeyBsaW1pdHMsIHJlcXVlc3RzIH0gPVxuICAgICAgdGhpcy5yZXNvdXJjZVNwZWNpZmljYXRpb25NYXBwZXJbUmVzb3VyY2VTaXplLlNNQUxMXTtcblxuICAgIGNvbnN0IHJlc291cmNlTGltaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjcHU6IHRoaXMuZmIuZ3JvdXAoXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5mYi5jb250cm9sKGxpbWl0cz8uY3B1Py52YWx1ZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgICAgICB1bml0OiB0aGlzLmZiLmNvbnRyb2wobGltaXRzPy5jcHU/LnVuaXQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsaWRhdG9yczogdGhpcy52YWxpZGF0b3JGbj8ubGltaXRzPy5jcHUgfHwgW10sXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgbWVtb3J5OiB0aGlzLmZiLmdyb3VwKFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuZmIuY29udHJvbChsaW1pdHM/Lm1lbW9yeT8udmFsdWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICAgICAgdW5pdDogdGhpcy5mYi5jb250cm9sKGxpbWl0cz8ubWVtb3J5Py51bml0KSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRvcnM6IHRoaXMudmFsaWRhdG9yRm4/LmxpbWl0cz8ubWVtb3J5IHx8IFtdLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc291cmNlUmVxdWVzdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNwdTogdGhpcy5mYi5ncm91cChcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLmZiLmNvbnRyb2wocmVxdWVzdHM/LmNwdT8udmFsdWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICAgICAgdW5pdDogdGhpcy5mYi5jb250cm9sKHJlcXVlc3RzPy5jcHU/LnVuaXQpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsaWRhdG9yczogdGhpcy52YWxpZGF0b3JGbj8ucmVxdWVzdHM/LmNwdSB8fCBbXSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgICBtZW1vcnk6IHRoaXMuZmIuZ3JvdXAoXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5mYi5jb250cm9sKHJlcXVlc3RzPy5tZW1vcnk/LnZhbHVlLCBbXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHVuaXQ6IHRoaXMuZmIuY29udHJvbChyZXF1ZXN0cz8ubWVtb3J5Py51bml0KSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbGlkYXRvcnM6IHRoaXMudmFsaWRhdG9yRm4/LnJlcXVlc3RzPy5tZW1vcnkgfHwgW10sXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgc2l6ZTogdGhpcy5mYi5jb250cm9sKFJlc291cmNlU2l6ZS5TTUFMTCksXG4gICAgICBsaW1pdHM6IHJlc291cmNlTGltaXRGb3JtLFxuICAgICAgLi4uKHRoaXMuc2hvd1Jlc291cmNlUmVxdWVzdHMgPyB7IHJlcXVlc3RzOiByZXNvdXJjZVJlcXVlc3RGb3JtIH0gOiBudWxsKSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGdldERlZmF1bHRGb3JtTW9kZWwoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6IFJlc291cmNlU2l6ZS5TTUFMTCxcbiAgICAgIGxpbWl0czogdGhpcy5yZXNvdXJjZVNwZWNpZmljYXRpb25NYXBwZXJbUmVzb3VyY2VTaXplLlNNQUxMXT8ubGltaXRzLFxuICAgICAgLi4uKHRoaXMuc2hvd1Jlc291cmNlUmVxdWVzdHNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICByZXF1ZXN0czpcbiAgICAgICAgICAgICAgdGhpcy5yZXNvdXJjZVNwZWNpZmljYXRpb25NYXBwZXJbUmVzb3VyY2VTaXplLlNNQUxMXT8ucmVxdWVzdHMsXG4gICAgICAgICAgfVxuICAgICAgICA6IG51bGwpLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBhZGFwdEZvcm1Nb2RlbChcbiAgICBmb3JtTW9kZWw6IFJlc291cmNlU3BlY2lmaWNhdGlvbixcbiAgKTogUmVzb3VyY2VSZXF1aXJlbWVudHMge1xuICAgIGNvbnN0IHsgbGltaXRzLCByZXF1ZXN0cyB9ID0gZm9ybU1vZGVsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbWl0czoge1xuICAgICAgICBjcHU6IGZvcm1hdFJlc291cmNlKGxpbWl0cy5jcHUpLFxuICAgICAgICBtZW1vcnk6IGZvcm1hdFJlc291cmNlKGxpbWl0cy5tZW1vcnkpLFxuICAgICAgfSxcbiAgICAgIC4uLih0aGlzLnNob3dSZXNvdXJjZVJlcXVlc3RzICYmIHtcbiAgICAgICAgcmVxdWVzdHM6IHtcbiAgICAgICAgICBjcHU6IGZvcm1hdFJlc291cmNlKHJlcXVlc3RzLmNwdSksXG4gICAgICAgICAgbWVtb3J5OiBmb3JtYXRSZXNvdXJjZShyZXF1ZXN0cy5tZW1vcnkpLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFkYXB0UmVzb3VyY2VNb2RlbChcbiAgICByZXNvdXJjZTogUmVzb3VyY2VSZXF1aXJlbWVudHMsXG4gICk6IFJlc291cmNlU3BlY2lmaWNhdGlvbiB7XG4gICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRSZXNvdXJjZVNwZWNpZmljYXRpb24ocmVzb3VyY2UsIHRoaXMucmVzb3VyY2VTcGVjaWZpY2F0aW9uKTtcbiAgfVxuXG4gIG9uUmVzb3VyY2VTaXplQ2hhbmdlKHNpemU6IFJlc291cmNlU2l6ZSkge1xuICAgIGNvbnN0IGxpbWl0cyA9IHRoaXMucmVzb3VyY2VTcGVjaWZpY2F0aW9uTWFwcGVyW3NpemVdPy5saW1pdHM7XG4gICAgY29uc3QgcmVzb3VyY2VMaW1pdEZvcm0gPSB0aGlzLmZvcm0uZ2V0KCdsaW1pdHMnKTtcblxuICAgIGNvbnN0IHJlcXVlc3RzID0gdGhpcy5yZXNvdXJjZVNwZWNpZmljYXRpb25NYXBwZXJbc2l6ZV0/LnJlcXVlc3RzO1xuICAgIGNvbnN0IHJlc291cmNlUmVxdWVzdEZvcm0gPSB0aGlzLmZvcm0uZ2V0KCdyZXF1ZXN0cycpO1xuXG4gICAgaWYgKCFsaW1pdHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXNvdXJjZUxpbWl0Rm9ybS5wYXRjaFZhbHVlKGxpbWl0cyk7XG4gICAgcmVzb3VyY2VSZXF1ZXN0Rm9ybT8ucGF0Y2hWYWx1ZShyZXF1ZXN0cyk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gIDxhdWktZm9ybS1pdGVtIGNsYXNzPVwic3BlYy1tb2RlbFwiPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLnNwZWNpZmljYXRpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXJhZGlvLWdyb3VwXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInNpemVcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25SZXNvdXJjZVNpemVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICByZXF1aXJlZFxuICAgID5cbiAgICAgIDxhdWktcmFkaW8tYnV0dG9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHJlc291cmNlU2l6ZVRpcHNcIlxuICAgICAgICBbdmFsdWVdPVwiaXRlbS5zaXplXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwZWMtbW9kZWxfX2xhYmVsXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHt7ICdzdG9yYWdlLicgKyBpdGVtLnNpemUgKyAnX3NjYWxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGVscFwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLnRpcCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9hdWktcmFkaW8tYnV0dG9uPlxuICAgIDwvYXVpLXJhZGlvLWdyb3VwPlxuICAgIDxhdWktaWNvblxuICAgICAgKm5nSWY9XCJyZXNvdXJjZVNwZWNpZmljYXRpb25EZXNjcmlwdGlvblwiXG4gICAgICBhdWlGb3JtSXRlbUFkZG9uXG4gICAgICBbYXVpVG9vbHRpcF09XCJkZXNjcmlwdGlvblRlbXBsYXRlXCJcbiAgICAgIGljb249XCJxdWVzdGlvbl9jaXJjbGVcIlxuICAgICAgYXVpVG9vbHRpcFBvc2l0aW9uPVwiZW5kIGJvdHRvbVwiXG4gICAgICBjbGFzcz1cImljb24tLWhlbHBcIlxuICAgID48L2F1aS1pY29uPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVzY3JpcHRpb25UZW1wbGF0ZT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJpc1RlbXBsYXRlUmVmKHJlc291cmNlU3BlY2lmaWNhdGlvbkRlc2NyaXB0aW9uKTsgZWxzZSB0ZXh0XCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVzb3VyY2VTcGVjaWZpY2F0aW9uRGVzY3JpcHRpb25cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICN0ZXh0PlxuICAgICAgICB7eyByZXNvdXJjZVNwZWNpZmljYXRpb25EZXNjcmlwdGlvbiB9fVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgPGF1aS1mb3JtLWl0ZW1cbiAgICB3aWR0aD1cImxhcmdlXCJcbiAgICAqbmdJZj1cInNob3dSZXNvdXJjZVJlcXVlc3RzXCJcbiAgPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLnJlc291cmNlX3JlcXVlc3QnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8ZGl2XG4gICAgICBmb3JtR3JvdXBOYW1lPVwicmVxdWVzdHNcIlxuICAgICAgY2xhc3M9XCJ0dy1mbGV4IHR3LWZsZXgtMSBhdWktZm9ybS1pdGVtX19jb250cm9sXCJcbiAgICA+XG4gICAgICA8YXVpLWZvcm0taXRlbSBjbGFzcz1cInR3LWZsZXgtMVwiPlxuICAgICAgICA8YXVpLWlucHV0LWdyb3VwXG4gICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgZm9ybUdyb3VwTmFtZT1cImNwdVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkJlZm9yZVxuICAgICAgICAgICAgY2xhc3M9XCJ0dy1yZXF1aXJlZC1tYXJrXCJcbiAgICAgICAgICAgID5DUFU8L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBhdWktaW5wdXRcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgIGFjbENvZXJjZU51bWJlclxuICAgICAgICAgICAgW3BhdHRlcm5dPVwiUE9TSVRJVkVfSU5UX1BBVFRFUk4ucGF0dGVyblwiXG4gICAgICAgICAgICBbYWNsRXJyb3JzTWFwcGVyXT1cImVycm9yTWFwcGVyXCJcbiAgICAgICAgICAgIFthY2xFcnJvcnNNYXBwZXJPdXRsZXRdPVwiY3B1UmVxdWVzdEVycm9yXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZm9ybS5nZXQoJ3NpemUnKS52YWx1ZSAhPT0gUmVzb3VyY2VTaXplLkNVU1RPTUlaRVwiXG4gICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxhdWktc2VsZWN0XG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBmb3JtLmdldCgnc2l6ZScpLnZhbHVlID09PSBSZXNvdXJjZVNpemUuQ1VTVE9NSVpFO1xuICAgICAgICAgICAgICBlbHNlIHJjVW5pdFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLXNwZWMtZm9ybV9fY3B1LXVuaXRcIlxuICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkFmdGVyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bml0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YXVpLW9wdGlvbiB2YWx1ZT1cIm1cIj5tPC9hdWktb3B0aW9uPlxuICAgICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICAgdmFsdWU9XCJjb3JlXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidjb3JlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdjb3JlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgICAgIDwvYXVpLXNlbGVjdD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3JjVW5pdD5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICpuZ0lmPVwiZm9ybS5nZXQoJ3JlcXVlc3RzLmNwdS51bml0JykudmFsdWUgYXMgY3B1VW5pdFwiXG4gICAgICAgICAgICAgIGF1aUlucHV0QWRkb25BZnRlclxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjcHVVbml0ID09PSAnY29yZScgPyAoJ2NvcmUnIHwgdHJhbnNsYXRlKSA6IGNwdVVuaXQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2F1aS1pbnB1dC1ncm91cD5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICAgICAgICAjY3B1UmVxdWVzdEVycm9yXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvYXVpLWZvcm0taXRlbT5cblxuICAgICAgPGF1aS1mb3JtLWl0ZW1cbiAgICAgICAgY2xhc3M9XCJ0dy1mbGV4LTEgdHctbWwtOFwiXG4gICAgICAgIHdpZHRoPVwibGFyZ2VcIlxuICAgICAgPlxuICAgICAgICA8YXVpLWlucHV0LWdyb3VwXG4gICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgZm9ybUdyb3VwTmFtZT1cIm1lbW9yeVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkJlZm9yZVxuICAgICAgICAgICAgY2xhc3M9XCJ0dy1yZXF1aXJlZC1tYXJrXCJcbiAgICAgICAgICAgID57eyAnbWVtb3J5JyB8IHRyYW5zbGF0ZSB9fTwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgYWNsQ29lcmNlTnVtYmVyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZm9ybS5nZXQoJ3NpemUnKS52YWx1ZSAhPT0gUmVzb3VyY2VTaXplLkNVU1RPTUlaRVwiXG4gICAgICAgICAgICBbcGF0dGVybl09XCJQT1NJVElWRV9JTlRfUEFUVEVSTi5wYXR0ZXJuXCJcbiAgICAgICAgICAgIFthY2xFcnJvcnNNYXBwZXJdPVwiZXJyb3JNYXBwZXJcIlxuICAgICAgICAgICAgW2FjbEVycm9yc01hcHBlck91dGxldF09XCJtZW1vcnlSZXF1aXJlZEVycm9yXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YXVpLXNlbGVjdFxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgZm9ybS5nZXQoJ3NpemUnKS52YWx1ZSA9PT0gUmVzb3VyY2VTaXplLkNVU1RPTUlaRTtcbiAgICAgICAgICAgICAgZWxzZSBybVVuaXRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBhdWlJbnB1dEFkZG9uQWZ0ZXJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVuaXRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxhdWktb3B0aW9uIHZhbHVlPVwiTWlcIj5NaTwvYXVpLW9wdGlvbj5cbiAgICAgICAgICAgIDxhdWktb3B0aW9uIHZhbHVlPVwiR2lcIj5HaTwvYXVpLW9wdGlvbj5cbiAgICAgICAgICA8L2F1aS1zZWxlY3Q+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNybVVuaXQ+XG4gICAgICAgICAgICA8c3BhbiBhdWlJbnB1dEFkZG9uQWZ0ZXI+XG4gICAgICAgICAgICAgIHt7IGZvcm0uZ2V0KCdyZXF1ZXN0cy5tZW1vcnkudW5pdCcpLnZhbHVlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9hdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgICAgICAgI21lbW9yeVJlcXVpcmVkRXJyb3JcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9hdWktZm9ybS1pdGVtPlxuICAgIDwvZGl2PlxuICA8L2F1aS1mb3JtLWl0ZW0+XG5cbiAgPGF1aS1mb3JtLWl0ZW0gd2lkdGg9XCJsYXJnZVwiPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzdG9yYWdlLnJlc291cmNlX2xpbWl0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGRpdlxuICAgICAgZm9ybUdyb3VwTmFtZT1cImxpbWl0c1wiXG4gICAgICBjbGFzcz1cInR3LWZsZXggdHctZmxleC0xIGF1aS1mb3JtLWl0ZW1fX2NvbnRyb2xcIlxuICAgID5cbiAgICAgIDxhdWktZm9ybS1pdGVtIGNsYXNzPVwidHctZmxleC0xXCI+XG4gICAgICAgIDxhdWktaW5wdXQtZ3JvdXBcbiAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICBmb3JtR3JvdXBOYW1lPVwiY3B1XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBhdWlJbnB1dEFkZG9uQmVmb3JlXG4gICAgICAgICAgICBjbGFzcz1cInR3LXJlcXVpcmVkLW1hcmtcIlxuICAgICAgICAgICAgPkNQVTwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgYWNsQ29lcmNlTnVtYmVyXG4gICAgICAgICAgICBbcGF0dGVybl09XCJQT1NJVElWRV9JTlRfUEFUVEVSTi5wYXR0ZXJuXCJcbiAgICAgICAgICAgIFthY2xFcnJvcnNNYXBwZXJdPVwiZXJyb3JNYXBwZXJcIlxuICAgICAgICAgICAgW2FjbEVycm9yc01hcHBlck91dGxldF09XCJjcHVFcnJvclwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZm9ybS5nZXQoJ3NpemUnKS52YWx1ZSAhPT0gUmVzb3VyY2VTaXplLkNVU1RPTUlaRVwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgYXVpRm9ybUl0ZW1Db250cm9sXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YXVpLXNlbGVjdFxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgZm9ybS5nZXQoJ3NpemUnKS52YWx1ZSA9PT0gUmVzb3VyY2VTaXplLkNVU1RPTUlaRTtcbiAgICAgICAgICAgICAgZWxzZSBjVW5pdFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLXNwZWMtZm9ybV9fY3B1LXVuaXRcIlxuICAgICAgICAgICAgYXVpSW5wdXRBZGRvbkFmdGVyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1bml0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YXVpLW9wdGlvbiB2YWx1ZT1cIm1cIj5tPC9hdWktb3B0aW9uPlxuICAgICAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAgICAgdmFsdWU9XCJjb3JlXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidjb3JlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdjb3JlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgICAgIDwvYXVpLXNlbGVjdD5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NVbml0PlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgKm5nSWY9XCJmb3JtLmdldCgnbGltaXRzLmNwdS51bml0JykudmFsdWUgYXMgY3B1VW5pdFwiXG4gICAgICAgICAgICAgIGF1aUlucHV0QWRkb25BZnRlclxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjcHVVbml0ID09PSAnY29yZScgPyAoJ2NvcmUnIHwgdHJhbnNsYXRlKSA6IGNwdVVuaXQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2F1aS1pbnB1dC1ncm91cD5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGF1aUZvcm1JdGVtRXJyb3JcbiAgICAgICAgICAjY3B1RXJyb3JcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9hdWktZm9ybS1pdGVtPlxuXG4gICAgICA8YXVpLWZvcm0taXRlbVxuICAgICAgICBjbGFzcz1cInR3LWZsZXgtMSB0dy1tbC04XCJcbiAgICAgICAgd2lkdGg9XCJsYXJnZVwiXG4gICAgICA+XG4gICAgICAgIDxhdWktaW5wdXQtZ3JvdXBcbiAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICBmb3JtR3JvdXBOYW1lPVwibWVtb3J5XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBhdWlJbnB1dEFkZG9uQmVmb3JlXG4gICAgICAgICAgICBjbGFzcz1cInR3LXJlcXVpcmVkLW1hcmtcIlxuICAgICAgICAgICAgPnt7ICdtZW1vcnknIHwgdHJhbnNsYXRlIH19PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgYXVpLWlucHV0XG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBhY2xDb2VyY2VOdW1iZXJcbiAgICAgICAgICAgIFtwYXR0ZXJuXT1cIlBPU0lUSVZFX0lOVF9QQVRURVJOLnBhdHRlcm5cIlxuICAgICAgICAgICAgW2FjbEVycm9yc01hcHBlcl09XCJlcnJvck1hcHBlclwiXG4gICAgICAgICAgICBbYWNsRXJyb3JzTWFwcGVyT3V0bGV0XT1cIm1lbW9yeUVycm9yXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmb3JtLmdldCgnc2l6ZScpLnZhbHVlICE9PSBSZXNvdXJjZVNpemUuQ1VTVE9NSVpFXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgPGF1aS1zZWxlY3RcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGZvcm0uZ2V0KCdzaXplJykudmFsdWUgPT09IFJlc291cmNlU2l6ZS5DVVNUT01JWkU7XG4gICAgICAgICAgICAgIGVsc2UgbVVuaXRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBhdWlJbnB1dEFkZG9uQWZ0ZXJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVuaXRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxhdWktb3B0aW9uIHZhbHVlPVwiTWlcIj5NaTwvYXVpLW9wdGlvbj5cbiAgICAgICAgICAgIDxhdWktb3B0aW9uIHZhbHVlPVwiR2lcIj5HaTwvYXVpLW9wdGlvbj5cbiAgICAgICAgICA8L2F1aS1zZWxlY3Q+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNtVW5pdD5cbiAgICAgICAgICAgIDxzcGFuIGF1aUlucHV0QWRkb25BZnRlcj5cbiAgICAgICAgICAgICAge3sgZm9ybS5nZXQoJ2xpbWl0cy5tZW1vcnkudW5pdCcpLnZhbHVlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9hdWktaW5wdXQtZ3JvdXA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhdWlGb3JtSXRlbUVycm9yXG4gICAgICAgICAgI21lbW9yeUVycm9yXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvYXVpLWZvcm0taXRlbT5cbiAgICA8L2Rpdj5cbiAgPC9hdWktZm9ybS1pdGVtPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|