@alauda-fe/common 1.4.6 → 1.4.7
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/business/resource-select/{internals → exports}/icon/component.d.ts +1 -1
- package/business/resource-select/module.d.ts +16 -16
- package/business/resource-select/public-api.d.ts +4 -0
- package/esm2022/business/resource-select/exports/cluster-list/component.mjs +75 -0
- package/esm2022/business/resource-select/{internals → exports}/icon/component.mjs +2 -2
- package/esm2022/business/resource-select/exports/namespace-list/component.mjs +477 -0
- package/esm2022/business/resource-select/exports/project-list/component.mjs +76 -0
- package/esm2022/business/resource-select/module.mjs +40 -39
- package/esm2022/business/resource-select/public-api.mjs +5 -1
- package/package.json +1 -1
- package/esm2022/business/resource-select/internals/cluster-list/component.mjs +0 -75
- package/esm2022/business/resource-select/internals/namespace-list/component.mjs +0 -477
- package/esm2022/business/resource-select/internals/project-list/component.mjs +0 -76
- /package/business/resource-select/{internals → exports}/cluster-list/component.d.ts +0 -0
- /package/business/resource-select/{internals → exports}/namespace-list/component.d.ts +0 -0
- /package/business/resource-select/{internals → exports}/project-list/component.d.ts +0 -0
|
@@ -1,477 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
|
|
3
|
-
import { memoize, partition, uniq } from 'lodash-es';
|
|
4
|
-
import { ReplaySubject, combineLatest, forkJoin, of, catchError, finalize, map, startWith, switchMap, takeUntil, tap, } from 'rxjs';
|
|
5
|
-
import { API_GATEWAY, K8sUtilService, publishRef, getDomainAnnotation, DISPLAY_NAME, } from '../../../../core/public-api';
|
|
6
|
-
import { CommonLayoutContextService } from '../../../../page-scaffold/public-api';
|
|
7
|
-
import { ResourceListBase } from '../../base-list';
|
|
8
|
-
import { ResourceSelectContextService } from '../../context.service';
|
|
9
|
-
import { getDisplayArch, getWorkspaceParams } from '../../utils';
|
|
10
|
-
import { K8sApiService } from './../../../../api/public-api';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "../../../../page-scaffold/public-api";
|
|
13
|
-
import * as i2 from "./../../../../api/public-api";
|
|
14
|
-
import * as i3 from "@angular/common/http";
|
|
15
|
-
import * as i4 from "../../context.service";
|
|
16
|
-
import * as i5 from "../../../../core/public-api";
|
|
17
|
-
const _c0 = ["*"];
|
|
18
|
-
const _c1 = () => [];
|
|
19
|
-
const _c2 = (a0, a1) => ({ name: a0, displayName: a1 });
|
|
20
|
-
function NamespaceListComponent_aui_option_6_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
-
i0.ɵɵelementStart(0, "aui-option", 7);
|
|
22
|
-
i0.ɵɵpipe(1, "aclUnionDisplayName");
|
|
23
|
-
i0.ɵɵtext(2);
|
|
24
|
-
i0.ɵɵpipe(3, "aclUnionDisplayName");
|
|
25
|
-
i0.ɵɵelementEnd();
|
|
26
|
-
} if (rf & 2) {
|
|
27
|
-
const project_r2 = ctx.$implicit;
|
|
28
|
-
i0.ɵɵproperty("value", project_r2)("label", i0.ɵɵpipeBind1(1, 3, project_r2));
|
|
29
|
-
i0.ɵɵadvance(2);
|
|
30
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, project_r2), " ");
|
|
31
|
-
} }
|
|
32
|
-
function NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template(rf, ctx) { if (rf & 1) {
|
|
33
|
-
i0.ɵɵelementContainerStart(0);
|
|
34
|
-
i0.ɵɵtext(1);
|
|
35
|
-
i0.ɵɵelementContainerEnd();
|
|
36
|
-
} if (rf & 2) {
|
|
37
|
-
const mesh_r5 = i0.ɵɵnextContext().$implicit;
|
|
38
|
-
i0.ɵɵadvance();
|
|
39
|
-
i0.ɵɵtextInterpolate1(" (Istio ", mesh_r5.spec.istioVersion, ") ");
|
|
40
|
-
} }
|
|
41
|
-
function NamespaceListComponent_aui_form_item_10_aui_option_5_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
-
i0.ɵɵelementStart(0, "aui-option", 7);
|
|
43
|
-
i0.ɵɵpipe(1, "aclName");
|
|
44
|
-
i0.ɵɵtext(2);
|
|
45
|
-
i0.ɵɵpipe(3, "aclName");
|
|
46
|
-
i0.ɵɵtemplate(4, NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template, 2, 1, "ng-container", 5);
|
|
47
|
-
i0.ɵɵelementEnd();
|
|
48
|
-
} if (rf & 2) {
|
|
49
|
-
const mesh_r5 = ctx.$implicit;
|
|
50
|
-
i0.ɵɵproperty("value", mesh_r5)("label", i0.ɵɵpipeBind1(1, 4, mesh_r5) + ((mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion) ? " (Istio " + mesh_r5.spec.istioVersion + ")" : ""));
|
|
51
|
-
i0.ɵɵadvance(2);
|
|
52
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 6, mesh_r5), " ");
|
|
53
|
-
i0.ɵɵadvance(2);
|
|
54
|
-
i0.ɵɵproperty("ngIf", mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion);
|
|
55
|
-
} }
|
|
56
|
-
function NamespaceListComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
-
const _r3 = i0.ɵɵgetCurrentView();
|
|
58
|
-
i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 2);
|
|
59
|
-
i0.ɵɵtext(2);
|
|
60
|
-
i0.ɵɵpipe(3, "translate");
|
|
61
|
-
i0.ɵɵelementEnd();
|
|
62
|
-
i0.ɵɵelementStart(4, "aui-select", 11);
|
|
63
|
-
i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r3.selectedServiceMesh, $event) || (ctx_r3.selectedServiceMesh = $event); return i0.ɵɵresetView($event); });
|
|
64
|
-
i0.ɵɵlistener("valueChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_valueChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.selectServiceMesh($event)); });
|
|
65
|
-
i0.ɵɵtemplate(5, NamespaceListComponent_aui_form_item_10_aui_option_5_Template, 5, 8, "aui-option", 4);
|
|
66
|
-
i0.ɵɵelementStart(6, "aui-option-placeholder");
|
|
67
|
-
i0.ɵɵtext(7);
|
|
68
|
-
i0.ɵɵpipe(8, "translate");
|
|
69
|
-
i0.ɵɵelementEnd()()();
|
|
70
|
-
} if (rf & 2) {
|
|
71
|
-
const ctx_r3 = i0.ɵɵnextContext();
|
|
72
|
-
i0.ɵɵadvance(2);
|
|
73
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "service_mesh"));
|
|
74
|
-
i0.ɵɵadvance(2);
|
|
75
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r3.selectedServiceMesh);
|
|
76
|
-
i0.ɵɵproperty("trackFn", ctx_r3.serviceMeshTrackFn)("loading", !ctx_r3.projects.length && ctx_r3.projectsLoading);
|
|
77
|
-
i0.ɵɵadvance();
|
|
78
|
-
i0.ɵɵproperty("ngForOf", ctx_r3.projectServiceMeshes);
|
|
79
|
-
i0.ɵɵadvance(2);
|
|
80
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 8, "no_data"), " ");
|
|
81
|
-
} }
|
|
82
|
-
function NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
-
i0.ɵɵelementContainer(0);
|
|
84
|
-
} }
|
|
85
|
-
function NamespaceListComponent_ng_container_20_aui_option_1_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
-
i0.ɵɵelementStart(0, "aui-option", 13);
|
|
87
|
-
i0.ɵɵpipe(1, "pure");
|
|
88
|
-
i0.ɵɵpipe(2, "async");
|
|
89
|
-
i0.ɵɵpipe(3, "translate");
|
|
90
|
-
i0.ɵɵpipe(4, "pure");
|
|
91
|
-
i0.ɵɵpipe(5, "async");
|
|
92
|
-
i0.ɵɵtemplate(6, NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template, 1, 0, "ng-container", 14);
|
|
93
|
-
i0.ɵɵelementEnd();
|
|
94
|
-
} if (rf & 2) {
|
|
95
|
-
const cluster_r6 = ctx.declare;
|
|
96
|
-
const clusterName_r7 = i0.ɵɵnextContext().$implicit;
|
|
97
|
-
const ctx_r3 = i0.ɵɵnextContext();
|
|
98
|
-
const clusterLabel_r8 = i0.ɵɵreference(25);
|
|
99
|
-
i0.ɵɵproperty("value", clusterName_r7)("label", clusterLabel_r8)("labelContext", cluster_r6)("disabled", i0.ɵɵpipeBind1(2, 11, i0.ɵɵpipeBind2(1, 8, clusterName_r7, ctx_r3.checkClusterError$)))("auiTooltip", i0.ɵɵpipeBind1(3, 13, "current_cluster_status_abnormal"))("auiTooltipDisabled", !i0.ɵɵpipeBind1(5, 18, i0.ɵɵpipeBind2(4, 15, clusterName_r7, ctx_r3.checkClusterError$)));
|
|
100
|
-
i0.ɵɵadvance(6);
|
|
101
|
-
i0.ɵɵproperty("ngTemplateOutlet", clusterLabel_r8)("ngTemplateOutletContext", cluster_r6);
|
|
102
|
-
} }
|
|
103
|
-
function NamespaceListComponent_ng_container_20_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
-
i0.ɵɵelementContainerStart(0);
|
|
105
|
-
i0.ɵɵtemplate(1, NamespaceListComponent_ng_container_20_aui_option_1_Template, 7, 20, "aui-option", 12);
|
|
106
|
-
i0.ɵɵpipe(2, "pure");
|
|
107
|
-
i0.ɵɵpipe(3, "async");
|
|
108
|
-
i0.ɵɵelementContainerEnd();
|
|
109
|
-
} if (rf & 2) {
|
|
110
|
-
const clusterName_r7 = ctx.$implicit;
|
|
111
|
-
const ctx_r3 = i0.ɵɵnextContext();
|
|
112
|
-
i0.ɵɵadvance();
|
|
113
|
-
i0.ɵɵproperty("declare", i0.ɵɵpureFunction2(6, _c2, clusterName_r7, i0.ɵɵpipeBind1(3, 4, i0.ɵɵpipeBind2(2, 1, clusterName_r7, ctx_r3.getClusterDisplayName$))));
|
|
114
|
-
} }
|
|
115
|
-
function NamespaceListComponent_ng_template_24_ng_container_1_Template(rf, ctx) { if (rf & 1) {
|
|
116
|
-
i0.ɵɵelementContainerStart(0);
|
|
117
|
-
i0.ɵɵtext(1);
|
|
118
|
-
i0.ɵɵelementContainerEnd();
|
|
119
|
-
} if (rf & 2) {
|
|
120
|
-
const displayName_r9 = i0.ɵɵnextContext().displayName;
|
|
121
|
-
i0.ɵɵadvance();
|
|
122
|
-
i0.ɵɵtextInterpolate1("(", displayName_r9, ")");
|
|
123
|
-
} }
|
|
124
|
-
function NamespaceListComponent_ng_template_24_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
-
i0.ɵɵtext(0);
|
|
126
|
-
i0.ɵɵtemplate(1, NamespaceListComponent_ng_template_24_ng_container_1_Template, 2, 1, "ng-container", 5);
|
|
127
|
-
} if (rf & 2) {
|
|
128
|
-
const name_r10 = ctx.name;
|
|
129
|
-
const displayName_r9 = ctx.displayName;
|
|
130
|
-
i0.ɵɵtextInterpolate1(" ", name_r10, " ");
|
|
131
|
-
i0.ɵɵadvance();
|
|
132
|
-
i0.ɵɵproperty("ngIf", displayName_r9);
|
|
133
|
-
} }
|
|
134
|
-
export class NamespaceListComponent extends ResourceListBase {
|
|
135
|
-
constructor(commonLayoutService, k8sService, http, contextService, cdr, k8sUtil) {
|
|
136
|
-
super(cdr, k8sUtil, contextService);
|
|
137
|
-
this.commonLayoutService = commonLayoutService;
|
|
138
|
-
this.k8sService = k8sService;
|
|
139
|
-
this.http = http;
|
|
140
|
-
this.displayServiceMesh = false;
|
|
141
|
-
this.clusterChange = new EventEmitter();
|
|
142
|
-
this.projectChange = new EventEmitter();
|
|
143
|
-
this.projects = [];
|
|
144
|
-
this.clusters = [];
|
|
145
|
-
this.projectsLoading = true;
|
|
146
|
-
this.serviceMeshes = [];
|
|
147
|
-
this.projectServiceMeshes = [];
|
|
148
|
-
this.type = 'namespace';
|
|
149
|
-
this.displayedData = [];
|
|
150
|
-
this.namespaceClusterMap = {};
|
|
151
|
-
this.gridStateMap = {};
|
|
152
|
-
this.load$$ = new ReplaySubject(1);
|
|
153
|
-
this.serviceMeshes$ = this.k8sService
|
|
154
|
-
.getGlobalResourceList({
|
|
155
|
-
definition: {
|
|
156
|
-
apiGroup: 'asm.alauda.io',
|
|
157
|
-
apiVersion: 'v1alpha1',
|
|
158
|
-
type: 'servicemeshgroups',
|
|
159
|
-
},
|
|
160
|
-
namespaced: true,
|
|
161
|
-
})
|
|
162
|
-
.pipe(map(res => res.items));
|
|
163
|
-
this.clusters$ = this.http
|
|
164
|
-
.get(`${API_GATEWAY}/auth/v1/clusters?availableClusters=false`)
|
|
165
|
-
.pipe(map(res => res?.items), catchError(() => of([])), publishRef());
|
|
166
|
-
this.getClusterDisplayName$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.k8sUtil.getDisplayName(clusters.find(i => this.k8sUtil.getName(i) === cluster)))));
|
|
167
|
-
this.checkClusterError$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.checkClusterError(clusters, cluster))));
|
|
168
|
-
this.namespaces$ = combineLatest([
|
|
169
|
-
this.load$$,
|
|
170
|
-
this.reload$$.pipe(startWith(null)),
|
|
171
|
-
]).pipe(switchMap(([{ project, cluster }]) => {
|
|
172
|
-
if (!project || !cluster) {
|
|
173
|
-
return of([]);
|
|
174
|
-
}
|
|
175
|
-
const clusters = cluster === '__all' ? this.clusters : [cluster];
|
|
176
|
-
return clusters.length
|
|
177
|
-
? forkJoin(clusters.map(cluster => this.commonLayoutService
|
|
178
|
-
.getClusterNamespaces(project.metadata.name, cluster)
|
|
179
|
-
.pipe(catchError(() => of([]))))).pipe(tap(lists => {
|
|
180
|
-
this.namespaceClusterMap = lists.reduce((acc, cur, i) => ({
|
|
181
|
-
...acc,
|
|
182
|
-
...cur.reduce((subAcc, subCurr) => ({
|
|
183
|
-
...subAcc,
|
|
184
|
-
[subCurr.metadata.uid]: clusters[i],
|
|
185
|
-
}), {}),
|
|
186
|
-
}), {});
|
|
187
|
-
}), map((lists) => lists.flat()))
|
|
188
|
-
: of([]);
|
|
189
|
-
}), takeUntil(this.destroy$$), publishRef());
|
|
190
|
-
this.projectFilterFn = (keyword = '', option) => {
|
|
191
|
-
const k = keyword.toLowerCase();
|
|
192
|
-
return (option.value.metadata.name.includes(k) ||
|
|
193
|
-
getDomainAnnotation(DISPLAY_NAME, option.value)
|
|
194
|
-
?.toLowerCase()
|
|
195
|
-
?.includes(k));
|
|
196
|
-
};
|
|
197
|
-
this.clusterFilterFn = (keyword = '', option) => {
|
|
198
|
-
const k = keyword.toLowerCase();
|
|
199
|
-
if (option.value === '__all') {
|
|
200
|
-
return option.label.toLowerCase().includes(k);
|
|
201
|
-
}
|
|
202
|
-
const { name, displayName } = option.labelContext;
|
|
203
|
-
return name.includes(k) || displayName?.toLowerCase()?.includes(k);
|
|
204
|
-
};
|
|
205
|
-
this.serviceMeshFilterFn = (keyword = '', option) => {
|
|
206
|
-
const k = keyword.toLowerCase();
|
|
207
|
-
const version = option.value.spec?.istioVersion
|
|
208
|
-
? `Istio ${option.value.spec.istioVersion}`
|
|
209
|
-
: '';
|
|
210
|
-
return (option.value.metadata.name.includes(k) ||
|
|
211
|
-
version.toLowerCase()?.includes(k));
|
|
212
|
-
};
|
|
213
|
-
this.projectTrackFn = (project) => project?.metadata.name;
|
|
214
|
-
this.serviceMeshTrackFn = (mesh) => mesh?.metadata.name;
|
|
215
|
-
this.mapResource = (list, { isMultiArch, clusters, }) => list.map(item => {
|
|
216
|
-
const cluster = this.namespaceClusterMap[item.metadata.uid];
|
|
217
|
-
const itemDisabled = this.disableFn ? this.disableFn(item) : null;
|
|
218
|
-
const cachedItem = this.displayedData.find(ns => ns.__origin.metadata.uid === item.metadata.uid);
|
|
219
|
-
const servicemesh = this.serviceMeshes.find(item => item.spec.clusters.includes(cachedItem?.cluster || cluster));
|
|
220
|
-
return {
|
|
221
|
-
name: this.k8sUtil.getName(item),
|
|
222
|
-
displayName: this.k8sUtil.getDisplayName(item),
|
|
223
|
-
cluster: cachedItem?.cluster || cluster,
|
|
224
|
-
clusterDisplayName: cachedItem?.clusterDisplayName ||
|
|
225
|
-
this.k8sUtil.getDisplayName(clusters.find(c => c.metadata.name === cluster)),
|
|
226
|
-
clusterArch: cachedItem?.clusterArch || isMultiArch
|
|
227
|
-
? this.getClusterArch(clusters.find(c => c.metadata.name === cluster))
|
|
228
|
-
: null,
|
|
229
|
-
serviceMeshName: servicemesh ? this.k8sUtil.getName(servicemesh) : '',
|
|
230
|
-
serviceMeshClusters: servicemesh ? servicemesh.spec.clusters : [],
|
|
231
|
-
serviceMeshIstioVersion: servicemesh
|
|
232
|
-
? servicemesh.spec.istioVersion
|
|
233
|
-
: '',
|
|
234
|
-
admin: cachedItem?.admin || '-',
|
|
235
|
-
timestamp: this.k8sUtil.getCreationTimestamp(item),
|
|
236
|
-
state: {
|
|
237
|
-
disabled: this.gridStateMap[cluster]?.disabled ||
|
|
238
|
-
itemDisabled?.disabled ||
|
|
239
|
-
this.checkClusterError(clusters, cachedItem?.cluster || cluster) ||
|
|
240
|
-
false,
|
|
241
|
-
tooltip: this.gridStateMap[cluster]?.disabled
|
|
242
|
-
? this.gridStateMap[cluster]?.tooltip || ''
|
|
243
|
-
: itemDisabled?.tooltip,
|
|
244
|
-
},
|
|
245
|
-
__origin: item,
|
|
246
|
-
};
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
ngOnInit() {
|
|
250
|
-
// From cache
|
|
251
|
-
this.projects = this.contextService.cachedProjectResources;
|
|
252
|
-
this.serviceMeshes = this.contextService.cachedServiceMeshGroupResources;
|
|
253
|
-
if (this.projects.length) {
|
|
254
|
-
this.initProject(this.projects);
|
|
255
|
-
}
|
|
256
|
-
// Get latest data in the background
|
|
257
|
-
forkJoin([
|
|
258
|
-
this.commonLayoutService
|
|
259
|
-
.getProjects()
|
|
260
|
-
.pipe(catchError(() => of([]))),
|
|
261
|
-
this.displayServiceMesh
|
|
262
|
-
? this.serviceMeshes$
|
|
263
|
-
: of([]),
|
|
264
|
-
])
|
|
265
|
-
.pipe(finalize(() => {
|
|
266
|
-
this.projectsLoading = false;
|
|
267
|
-
this.cdr.markForCheck();
|
|
268
|
-
}), takeUntil(this.destroy$$))
|
|
269
|
-
.subscribe(([projects, serviceMeshes]) => {
|
|
270
|
-
if (this.displayServiceMesh) {
|
|
271
|
-
this.serviceMeshes = serviceMeshes;
|
|
272
|
-
this.contextService.cachedServiceMeshGroupResources = serviceMeshes;
|
|
273
|
-
}
|
|
274
|
-
this.projects = projects;
|
|
275
|
-
if (!this.contextService.cachedProjectResources?.length) {
|
|
276
|
-
this.initProject(projects);
|
|
277
|
-
}
|
|
278
|
-
this.contextService.cachedProjectResources = this.projects;
|
|
279
|
-
});
|
|
280
|
-
combineLatest([this.clusters$, this.namespaces$]).subscribe(([clusters, data]) => {
|
|
281
|
-
const isMultiArch = uniq(clusters.map(c => this.k8sUtil.getLabel(c, 'arch'))).length > 1;
|
|
282
|
-
this.displayedData = this.mapResource(data, {
|
|
283
|
-
clusters,
|
|
284
|
-
isMultiArch,
|
|
285
|
-
}).filter(ns => this.context === 'page' || !ns.state?.disabled);
|
|
286
|
-
this.setSelectedNamespace(this.displayedData);
|
|
287
|
-
if (this.selectedUid) {
|
|
288
|
-
this.displayedData = this.getSortedNamespace(this.displayedData, this.value.name);
|
|
289
|
-
}
|
|
290
|
-
this.loading = false;
|
|
291
|
-
this.forceLoading = false;
|
|
292
|
-
this.storeNamespaces();
|
|
293
|
-
this.cdr.markForCheck();
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
getSortedNamespace(rawData, namespace) {
|
|
297
|
-
if (!namespace) {
|
|
298
|
-
return rawData;
|
|
299
|
-
}
|
|
300
|
-
const [selected, others] = partition(this.displayedData, item => item.name === namespace);
|
|
301
|
-
return [...selected, ...others];
|
|
302
|
-
}
|
|
303
|
-
storeNamespaces() {
|
|
304
|
-
if (!this.selectedProject) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
if (this.selectedCluster === '__all') {
|
|
308
|
-
for (const cluster of this.clusters) {
|
|
309
|
-
this.contextService.storeNamespaces(this.selectedProject.metadata.name, cluster, this.displayedData.filter(item => item.cluster === cluster));
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
this.contextService.storeNamespaces(this.selectedProject.metadata.name, this.selectedCluster, this.displayedData);
|
|
313
|
-
}
|
|
314
|
-
initProject(projects) {
|
|
315
|
-
this.selectProject((projects || []).length
|
|
316
|
-
? projects.find(item => item.metadata.name === this.value?.project) ||
|
|
317
|
-
projects[0]
|
|
318
|
-
: null, true);
|
|
319
|
-
this.load.emit({
|
|
320
|
-
project: projects.length,
|
|
321
|
-
cluster: uniq(projects.reduce((acc, cur) => [...acc, ...(cur.spec.clusters || []).map(c => c.name)], [])).length,
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
selectServiceMesh(serviceMesh) {
|
|
325
|
-
this.selectedServiceMesh = serviceMesh;
|
|
326
|
-
this.clusters = (this.selectedProject.spec.clusters || [])
|
|
327
|
-
.map(c => c.name)
|
|
328
|
-
.filter(cluster => this.serviceMeshes
|
|
329
|
-
.find(mesh => this.k8sUtil.getName(mesh) === this.k8sUtil.getName(serviceMesh))
|
|
330
|
-
.spec.clusters.includes(cluster));
|
|
331
|
-
this.selectCluster('__all');
|
|
332
|
-
}
|
|
333
|
-
selectProject(project, initial = false) {
|
|
334
|
-
this.projectChange.emit(project?.metadata.name);
|
|
335
|
-
this.selectedProject = project;
|
|
336
|
-
this.clusters = project
|
|
337
|
-
? (project.spec.clusters || []).map(c => c.name)
|
|
338
|
-
: [];
|
|
339
|
-
if (this.displayServiceMesh) {
|
|
340
|
-
this.projectServiceMeshes = this.serviceMeshes.filter(mesh => mesh.spec.clusters.some(cluster => this.clusters.includes(cluster)));
|
|
341
|
-
if (this.projectServiceMeshes?.length) {
|
|
342
|
-
let meshName = this.value?.servicemesh;
|
|
343
|
-
if (!meshName) {
|
|
344
|
-
this.auth.getAccountInfo().subscribe(({ email }) => {
|
|
345
|
-
meshName = getWorkspaceParams(email)?.servicemesh;
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
const selectedServiceMesh = this.projectServiceMeshes.find(mesh => this.k8sUtil.getName(mesh) === meshName) || this.projectServiceMeshes[0];
|
|
349
|
-
this.selectServiceMesh(selectedServiceMesh);
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
this.selectedServiceMesh = null;
|
|
353
|
-
this.clusters = [];
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
this.selectCluster('__all', initial);
|
|
357
|
-
}
|
|
358
|
-
selectCluster(clusterName, initial = false) {
|
|
359
|
-
this.selectedCluster = clusterName;
|
|
360
|
-
const displayedData = this.contextService.getCachedNamespaces(this.selectedProject?.metadata.name, this.selectedCluster) || [];
|
|
361
|
-
this.displayedData = this.getSortedNamespace(displayedData, initial ? this.value?.name : null);
|
|
362
|
-
this.setSelectedNamespace(this.displayedData);
|
|
363
|
-
this.clusterChange.emit(this.selectedCluster === '__all' ? null : clusterName);
|
|
364
|
-
this.loading = true;
|
|
365
|
-
this.load$$.next({
|
|
366
|
-
project: this.selectedProject,
|
|
367
|
-
cluster: clusterName,
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
setSelectedNamespace(data) {
|
|
371
|
-
const selectedNamespace = this.value
|
|
372
|
-
? data.find(item => item.name === this.value.name &&
|
|
373
|
-
this.value.cluster === item.cluster)
|
|
374
|
-
: null;
|
|
375
|
-
this.selectedUid = selectedNamespace
|
|
376
|
-
? selectedNamespace.__origin.metadata.uid
|
|
377
|
-
: null;
|
|
378
|
-
}
|
|
379
|
-
getClusterArch(cluster) {
|
|
380
|
-
return getDisplayArch(this.k8sUtil.getLabel(cluster, 'arch'));
|
|
381
|
-
}
|
|
382
|
-
checkClusterError(clusters, cluster) {
|
|
383
|
-
return (clusters
|
|
384
|
-
.find(i => this.k8sUtil.getName(i) === cluster)
|
|
385
|
-
?.status.conditions.find(c => c.type === 'NodeNotReady')?.status !==
|
|
386
|
-
'False');
|
|
387
|
-
}
|
|
388
|
-
static { this.ɵfac = function NamespaceListComponent_Factory(t) { return new (t || NamespaceListComponent)(i0.ɵɵdirectiveInject(i1.CommonLayoutContextService), i0.ɵɵdirectiveInject(i2.K8sApiService), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i4.ResourceSelectContextService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i5.K8sUtilService)); }; }
|
|
389
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NamespaceListComponent, selectors: [["acl-namespace-list"]], inputs: { actionTemplateRef: "actionTemplateRef", disableFn: "disableFn", value: "value", displayServiceMesh: "displayServiceMesh" }, outputs: { clusterChange: "clusterChange", projectChange: "projectChange" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 29, vars: 38, consts: [["clusterLabel", ""], [1, "filter"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", "name", "project", 3, "ngModelChange", "valueChange", "ngClass", "ngModel", "filterFn", "trackFn", "loading"], [3, "value", "label", 4, "ngFor", "ngForOf"], [4, "ngIf"], ["auiFormItemControl", "", "name", "cluster", 3, "ngModelChange", "valueChange", "ngClass", "filterFn", "loading", "ngModel"], [3, "value", "label"], [4, "ngFor", "ngForOf"], [3, "selectItem", "reload", "data", "fields", "context", "actionTemplateRef", "selectedUid", "loading"], ["aclResourceGridHeader", ""], ["auiFormItemControl", "", "name", "serviceMeshProject", 1, "lang-not-zh:!tw-w-[230px]", 3, "ngModelChange", "valueChange", "ngModel", "trackFn", "loading"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled", 4, "declare"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function NamespaceListComponent_Template(rf, ctx) { if (rf & 1) {
|
|
390
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
391
|
-
i0.ɵɵprojectionDef();
|
|
392
|
-
i0.ɵɵelementStart(0, "div", 1)(1, "aui-form-item")(2, "label", 2);
|
|
393
|
-
i0.ɵɵtext(3);
|
|
394
|
-
i0.ɵɵpipe(4, "translate");
|
|
395
|
-
i0.ɵɵelementEnd();
|
|
396
|
-
i0.ɵɵelementStart(5, "aui-select", 3);
|
|
397
|
-
i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedProject, $event) || (ctx.selectedProject = $event); return i0.ɵɵresetView($event); });
|
|
398
|
-
i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectProject($event)); });
|
|
399
|
-
i0.ɵɵtemplate(6, NamespaceListComponent_aui_option_6_Template, 4, 7, "aui-option", 4);
|
|
400
|
-
i0.ɵɵelementStart(7, "aui-option-placeholder");
|
|
401
|
-
i0.ɵɵtext(8);
|
|
402
|
-
i0.ɵɵpipe(9, "translate");
|
|
403
|
-
i0.ɵɵelementEnd()()();
|
|
404
|
-
i0.ɵɵtemplate(10, NamespaceListComponent_aui_form_item_10_Template, 9, 10, "aui-form-item", 5);
|
|
405
|
-
i0.ɵɵelementStart(11, "aui-form-item")(12, "label", 2);
|
|
406
|
-
i0.ɵɵtext(13);
|
|
407
|
-
i0.ɵɵpipe(14, "translate");
|
|
408
|
-
i0.ɵɵelementEnd();
|
|
409
|
-
i0.ɵɵelementStart(15, "aui-select", 6);
|
|
410
|
-
i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedCluster, $event) || (ctx.selectedCluster = $event); return i0.ɵɵresetView($event); });
|
|
411
|
-
i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectCluster($event)); });
|
|
412
|
-
i0.ɵɵelementStart(16, "aui-option", 7);
|
|
413
|
-
i0.ɵɵpipe(17, "translate");
|
|
414
|
-
i0.ɵɵtext(18);
|
|
415
|
-
i0.ɵɵpipe(19, "translate");
|
|
416
|
-
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵtemplate(20, NamespaceListComponent_ng_container_20_Template, 4, 9, "ng-container", 8);
|
|
418
|
-
i0.ɵɵelementStart(21, "aui-option-placeholder");
|
|
419
|
-
i0.ɵɵtext(22);
|
|
420
|
-
i0.ɵɵpipe(23, "translate");
|
|
421
|
-
i0.ɵɵelementEnd();
|
|
422
|
-
i0.ɵɵtemplate(24, NamespaceListComponent_ng_template_24_Template, 2, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
|
|
423
|
-
i0.ɵɵelementEnd()()();
|
|
424
|
-
i0.ɵɵelementStart(26, "acl-resource-data-grid", 9);
|
|
425
|
-
i0.ɵɵlistener("selectItem", function NamespaceListComponent_Template_acl_resource_data_grid_selectItem_26_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelect($event)); })("reload", function NamespaceListComponent_Template_acl_resource_data_grid_reload_26_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.reload()); });
|
|
426
|
-
i0.ɵɵelementContainerStart(27, 10);
|
|
427
|
-
i0.ɵɵprojection(28);
|
|
428
|
-
i0.ɵɵelementContainerEnd();
|
|
429
|
-
i0.ɵɵelementEnd();
|
|
430
|
-
} if (rf & 2) {
|
|
431
|
-
i0.ɵɵadvance(3);
|
|
432
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 25, "project"));
|
|
433
|
-
i0.ɵɵadvance(2);
|
|
434
|
-
i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "");
|
|
435
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.selectedProject);
|
|
436
|
-
i0.ɵɵproperty("filterFn", ctx.projectFilterFn)("trackFn", ctx.projectTrackFn)("loading", !ctx.projects.length && ctx.projectsLoading);
|
|
437
|
-
i0.ɵɵadvance();
|
|
438
|
-
i0.ɵɵproperty("ngForOf", ctx.projects);
|
|
439
|
-
i0.ɵɵadvance(2);
|
|
440
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 27, "no_data"), " ");
|
|
441
|
-
i0.ɵɵadvance(2);
|
|
442
|
-
i0.ɵɵproperty("ngIf", ctx.displayServiceMesh);
|
|
443
|
-
i0.ɵɵadvance(3);
|
|
444
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 29, "cluster"));
|
|
445
|
-
i0.ɵɵadvance(2);
|
|
446
|
-
i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "")("filterFn", ctx.clusterFilterFn)("loading", !ctx.projects.length && ctx.projectsLoading);
|
|
447
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx.selectedCluster);
|
|
448
|
-
i0.ɵɵadvance();
|
|
449
|
-
i0.ɵɵproperty("value", "__all")("label", i0.ɵɵpipeBind1(17, 31, "all"));
|
|
450
|
-
i0.ɵɵadvance(2);
|
|
451
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(19, 33, "all"), " ");
|
|
452
|
-
i0.ɵɵadvance(2);
|
|
453
|
-
i0.ɵɵproperty("ngForOf", ctx.clusters);
|
|
454
|
-
i0.ɵɵadvance(2);
|
|
455
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 35, "no_data"), " ");
|
|
456
|
-
i0.ɵɵadvance(4);
|
|
457
|
-
i0.ɵɵproperty("data", ctx.displayedData || i0.ɵɵpureFunction0(37, _c1))("fields", ctx.fields)("context", ctx.context)("actionTemplateRef", ctx.actionTemplateRef)("selectedUid", ctx.selectedUid)("loading", ctx.forceLoading || !(ctx.displayedData == null ? null : ctx.displayedData.length) && ctx.loading);
|
|
458
|
-
} }, styles: ["[_nghost-%COMP%]{display:flex;flex:1;flex-direction:column}.filter[_ngcontent-%COMP%]{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%]{margin-right:20px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item__label-wrapper{width:auto!important}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-input{color:rgb(var(--aui-color-n-2))}.filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-weight:500}.filter[_ngcontent-%COMP%] aui-select[_ngcontent-%COMP%]{width:260px}"], changeDetection: 0 }); }
|
|
459
|
-
}
|
|
460
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceListComponent, [{
|
|
461
|
-
type: Component,
|
|
462
|
-
args: [{ selector: 'acl-namespace-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"filter\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'project' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"project\"\n [(ngModel)]=\"selectedProject\"\n [filterFn]=\"projectFilterFn\"\n [trackFn]=\"projectTrackFn\"\n (valueChange)=\"selectProject($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let project of projects\"\n [value]=\"project\"\n [label]=\"project | aclUnionDisplayName\"\n >\n {{ project | aclUnionDisplayName }}\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <!-- ASM \u9009\u62E9\u7F51\u683C\u8FC7\u6EE4\u96C6\u7FA4\u9009\u9879 -->\n <aui-form-item *ngIf=\"displayServiceMesh\">\n <label auiFormItemLabel>{{ 'service_mesh' | translate }}</label>\n <aui-select\n class=\"lang-not-zh:!tw-w-[230px]\"\n auiFormItemControl\n name=\"serviceMeshProject\"\n [(ngModel)]=\"selectedServiceMesh\"\n [trackFn]=\"serviceMeshTrackFn\"\n (valueChange)=\"selectServiceMesh($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let mesh of projectServiceMeshes\"\n [value]=\"mesh\"\n [label]=\"\n (mesh | aclName) +\n (mesh.spec?.istioVersion\n ? ' (Istio ' + mesh.spec.istioVersion + ')'\n : '')\n \"\n >\n {{ mesh | aclName }}\n <ng-container *ngIf=\"mesh.spec?.istioVersion\">\n (Istio {{ mesh.spec.istioVersion }})\n </ng-container>\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <aui-form-item>\n <label auiFormItemLabel>{{ 'cluster' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"cluster\"\n [filterFn]=\"clusterFilterFn\"\n [loading]=\"!projects.length && projectsLoading\"\n [(ngModel)]=\"selectedCluster\"\n (valueChange)=\"selectCluster($event)\"\n >\n <aui-option\n [value]=\"'__all'\"\n [label]=\"'all' | translate\"\n >\n {{ 'all' | translate }}\n </aui-option>\n <ng-container *ngFor=\"let clusterName of clusters\">\n <aui-option\n *declare=\"{\n name: clusterName,\n displayName: clusterName | pure: getClusterDisplayName$ | async\n } as cluster\"\n [value]=\"clusterName\"\n [label]=\"clusterLabel\"\n [labelContext]=\"cluster\"\n [disabled]=\"clusterName | pure: checkClusterError$ | async\"\n [auiTooltip]=\"'current_cluster_status_abnormal' | translate\"\n [auiTooltipDisabled]=\"\n !(clusterName | pure: checkClusterError$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"clusterLabel; context: cluster\"\n ></ng-container>\n </aui-option>\n </ng-container>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n <ng-template\n #clusterLabel\n let-name=\"name\"\n let-displayName=\"displayName\"\n >\n {{ name }}\n <ng-container *ngIf=\"displayName\">({{ displayName }})</ng-container>\n </ng-template>\n </aui-select>\n </aui-form-item>\n</div>\n<acl-resource-data-grid\n [data]=\"displayedData || []\"\n [fields]=\"fields\"\n [context]=\"context\"\n (selectItem)=\"onSelect($event)\"\n [actionTemplateRef]=\"actionTemplateRef\"\n [selectedUid]=\"selectedUid\"\n [loading]=\"forceLoading || (!displayedData?.length && loading)\"\n (reload)=\"reload()\"\n>\n <ng-container aclResourceGridHeader>\n <ng-content></ng-content>\n </ng-container>\n</acl-resource-data-grid>\n", styles: [":host{display:flex;flex:1;flex-direction:column}.filter{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter aui-form-item{margin-right:20px}.filter aui-form-item ::ng-deep .aui-form-item{margin-bottom:0}.filter aui-form-item ::ng-deep .aui-form-item__label-wrapper{width:auto!important}.filter aui-form-item ::ng-deep .aui-input{color:rgb(var(--aui-color-n-2))}.filter label{font-weight:500}.filter aui-select{width:260px}\n"] }]
|
|
463
|
-
}], () => [{ type: i1.CommonLayoutContextService }, { type: i2.K8sApiService }, { type: i3.HttpClient }, { type: i4.ResourceSelectContextService }, { type: i0.ChangeDetectorRef }, { type: i5.K8sUtilService }], { actionTemplateRef: [{
|
|
464
|
-
type: Input
|
|
465
|
-
}], disableFn: [{
|
|
466
|
-
type: Input
|
|
467
|
-
}], value: [{
|
|
468
|
-
type: Input
|
|
469
|
-
}], displayServiceMesh: [{
|
|
470
|
-
type: Input
|
|
471
|
-
}], clusterChange: [{
|
|
472
|
-
type: Output
|
|
473
|
-
}], projectChange: [{
|
|
474
|
-
type: Output
|
|
475
|
-
}] }); })();
|
|
476
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NamespaceListComponent, { className: "NamespaceListComponent", filePath: "business/resource-select/internals/namespace-list/component.ts", lineNumber: 60 }); })();
|
|
477
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9pbnRlcm5hbHMvbmFtZXNwYWNlLWxpc3QvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9pbnRlcm5hbHMvbmFtZXNwYWNlLWxpc3QvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLEVBQUUsRUFDRixVQUFVLEVBQ1YsUUFBUSxFQUNSLEdBQUcsRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0wsV0FBVyxFQUVYLGNBQWMsRUFFZCxVQUFVLEVBSVYsbUJBQW1CLEVBQ25CLFlBQVksR0FDYixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtC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RFIsS0FBSztZQUlOLEtBQUs7a0JBREosS0FBSztZQUlOLGtCQUFrQjtrQkFEakIsS0FBSztZQUlOLGFBQWE7a0JBRFosTUFBTTtZQUlQLGFBQWE7a0JBRFosTUFBTTs7a0ZBbkJJLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdEZpbHRlck9wdGlvbiB9IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtZW1vaXplLCBwYXJ0aXRpb24sIHVuaXEgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgUmVwbGF5U3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZm9ya0pvaW4sXG4gIG9mLFxuICBjYXRjaEVycm9yLFxuICBmaW5hbGl6ZSxcbiAgbWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBBUElfR0FURVdBWSxcbiAgQ2x1c3RlcixcbiAgSzhzVXRpbFNlcnZpY2UsXG4gIFByb2plY3QsXG4gIHB1Ymxpc2hSZWYsXG4gIFNlcnZpY2VNZXNoR3JvdXAsXG4gIEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgS3ViZXJuZXRlc1Jlc291cmNlTGlzdCxcbiAgZ2V0RG9tYWluQW5ub3RhdGlvbixcbiAgRElTUExBWV9OQU1FLFxufSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQ29tbW9uTGF5b3V0Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9wYWdlLXNjYWZmb2xkL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgUmVzb3VyY2VMaXN0QmFzZSB9IGZyb20gJy4uLy4uL2Jhc2UtbGlzdCc7XG5pbXBvcnQgeyBSZXNvdXJjZVNlbGVjdENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldERpc3BsYXlBcmNoLCBnZXRXb3Jrc3BhY2VQYXJhbXMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmltcG9ydCB7IEs4c0FwaVNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uLy4uL2FwaS9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIENsdXN0ZXJBcmNoLFxuICBEaXNhYmxlRm4sXG4gIE5hbWVzcGFjZURhdGFJdGVtLFxuICBTZWxlY3RlZE5hbWVzcGFjZVZhbHVlLFxufSBmcm9tICcuLy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLW5hbWVzcGFjZS1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOYW1lc3BhY2VMaXN0Q29tcG9uZW50XG4gIGV4dGVuZHMgUmVzb3VyY2VMaXN0QmFzZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIGFjdGlvblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVGbjogRGlzYWJsZUZuO1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBTZWxlY3RlZE5hbWVzcGFjZVZhbHVlO1xuXG4gIEBJbnB1dCgpXG4gIGRpc3BsYXlTZXJ2aWNlTWVzaCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBjbHVzdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHByb2plY3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcm9qZWN0czogUHJvamVjdFtdID0gW107XG5cbiAgc2VsZWN0ZWRQcm9qZWN0OiBQcm9qZWN0O1xuICBzZWxlY3RlZENsdXN0ZXI6IHN0cmluZztcbiAgY2x1c3RlcnM6IHN0cmluZ1tdID0gW107XG4gIHByb2plY3RzTG9hZGluZyA9IHRydWU7XG5cbiAgc2VydmljZU1lc2hlczogU2VydmljZU1lc2hHcm91cFtdID0gW107XG4gIHByb2plY3RTZXJ2aWNlTWVzaGVzOiBTZXJ2aWNlTWVzaEdyb3VwW10gPSBbXTtcbiAgc2VsZWN0ZWRTZXJ2aWNlTWVzaDogU2VydmljZU1lc2hHcm91cDtcblxuICB0eXBlID0gJ25hbWVzcGFjZSc7XG5cbiAgZGlzcGxheWVkRGF0YTogTmFtZXNwYWNlRGF0YUl0ZW1bXSA9IFtdO1xuXG4gIG5hbWVzcGFjZUNsdXN0ZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBncmlkU3RhdGVNYXA6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8RGlzYWJsZUZuPj4gPSB7fTtcblxuICBzZWxlY3RlZFVpZDogc3RyaW5nO1xuXG4gIGxvYWQkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHsgcHJvamVjdDogUHJvamVjdDsgY2x1c3Rlcjogc3RyaW5nIH0+KDEpO1xuXG4gIHNlcnZpY2VNZXNoZXMkID0gdGhpcy5rOHNTZXJ2aWNlXG4gICAgLmdldEdsb2JhbFJlc291cmNlTGlzdDxTZXJ2aWNlTWVzaEdyb3VwPih7XG4gICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgIGFwaUdyb3VwOiAnYXNtLmFsYXVkYS5pbycsXG4gICAgICAgIGFwaVZlcnNpb246ICd2MWFscGhhMScsXG4gICAgICAgIHR5cGU6ICdzZXJ2aWNlbWVzaGdyb3VwcycsXG4gICAgICB9LFxuICAgICAgbmFtZXNwYWNlZDogdHJ1ZSxcbiAgICB9KVxuICAgIC5waXBlKG1hcChyZXMgPT4gcmVzLml0ZW1zKSk7XG5cbiAgY2x1c3RlcnMkID0gdGhpcy5odHRwXG4gICAgLmdldDxLdWJlcm5ldGVzUmVzb3VyY2VMaXN0PENsdXN0ZXI+PihcbiAgICAgIGAke0FQSV9HQVRFV0FZfS9hdXRoL3YxL2NsdXN0ZXJzP2F2YWlsYWJsZUNsdXN0ZXJzPWZhbHNlYCxcbiAgICApXG4gICAgLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcz8uaXRlbXMpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBDbHVzdGVyW10pKSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuXG4gIGdldENsdXN0ZXJEaXNwbGF5TmFtZSQgPSBtZW1vaXplKChjbHVzdGVyOiBzdHJpbmcpID0+XG4gICAgdGhpcy5jbHVzdGVycyQucGlwZShcbiAgICAgIG1hcChjbHVzdGVycyA9PlxuICAgICAgICB0aGlzLms4c1V0aWwuZ2V0RGlzcGxheU5hbWUoXG4gICAgICAgICAgY2x1c3RlcnMuZmluZChpID0+IHRoaXMuazhzVXRpbC5nZXROYW1lKGkpID09PSBjbHVzdGVyKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBjaGVja0NsdXN0ZXJFcnJvciQgPSBtZW1vaXplKChjbHVzdGVyOiBzdHJpbmcpID0+XG4gICAgdGhpcy5jbHVzdGVycyQucGlwZShcbiAgICAgIG1hcChjbHVzdGVycyA9PiB0aGlzLmNoZWNrQ2x1c3RlckVycm9yKGNsdXN0ZXJzLCBjbHVzdGVyKSksXG4gICAgKSxcbiAgKTtcblxuICBuYW1lc3BhY2VzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMubG9hZCQkLFxuICAgIHRoaXMucmVsb2FkJCQucGlwZShzdGFydFdpdGgobnVsbCBhcyB2b2lkKSksXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbeyBwcm9qZWN0LCBjbHVzdGVyIH1dKSA9PiB7XG4gICAgICBpZiAoIXByb2plY3QgfHwgIWNsdXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIG9mKFtdIGFzIEt1YmVybmV0ZXNSZXNvdXJjZVtdKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3RlciA9PT0gJ19fYWxsJyA/IHRoaXMuY2x1c3RlcnMgOiBbY2x1c3Rlcl07XG4gICAgICByZXR1cm4gY2x1c3RlcnMubGVuZ3RoXG4gICAgICAgID8gZm9ya0pvaW4oXG4gICAgICAgICAgICBjbHVzdGVycy5tYXAoY2x1c3RlciA9PlxuICAgICAgICAgICAgICB0aGlzLmNvbW1vbkxheW91dFNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0Q2x1c3Rlck5hbWVzcGFjZXMocHJvamVjdC5tZXRhZGF0YS5uYW1lLCBjbHVzdGVyKVxuICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcChsaXN0cyA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlQ2x1c3Rlck1hcCA9IGxpc3RzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoYWNjLCBjdXIsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgICAuLi5jdXIucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAoc3ViQWNjLCBzdWJDdXJyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnN1YkFjYyxcbiAgICAgICAgICAgICAgICAgICAgICBbc3ViQ3Vyci5tZXRhZGF0YS51aWRdOiBjbHVzdGVyc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKChsaXN0czogS3ViZXJuZXRlc1Jlc291cmNlW11bXSkgPT4gbGlzdHMuZmxhdCgpKSxcbiAgICAgICAgICApXG4gICAgICAgIDogb2YoW10gYXMgS3ViZXJuZXRlc1Jlc291cmNlW10pO1xuICAgIH0pLFxuICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJCksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbW9uTGF5b3V0U2VydmljZTogQ29tbW9uTGF5b3V0Q29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNTZXJ2aWNlOiBLOHNBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICBjb250ZXh0U2VydmljZTogUmVzb3VyY2VTZWxlY3RDb250ZXh0U2VydmljZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGs4c1V0aWw6IEs4c1V0aWxTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcihjZHIsIGs4c1V0aWwsIGNvbnRleHRTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEZyb20gY2FjaGVcbiAgICB0aGlzLnByb2plY3RzID0gdGhpcy5jb250ZXh0U2VydmljZS5jYWNoZWRQcm9qZWN0UmVzb3VyY2VzO1xuICAgIHRoaXMuc2VydmljZU1lc2hlcyA9IHRoaXMuY29udGV4dFNlcnZpY2UuY2FjaGVkU2VydmljZU1lc2hHcm91cFJlc291cmNlcztcbiAgICBpZiAodGhpcy5wcm9qZWN0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaW5pdFByb2plY3QodGhpcy5wcm9qZWN0cyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGxhdGVzdCBkYXRhIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgZm9ya0pvaW4oW1xuICAgICAgdGhpcy5jb21tb25MYXlvdXRTZXJ2aWNlXG4gICAgICAgIC5nZXRQcm9qZWN0cygpXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgUHJvamVjdFtdKSkpLFxuICAgICAgdGhpcy5kaXNwbGF5U2VydmljZU1lc2hcbiAgICAgICAgPyB0aGlzLnNlcnZpY2VNZXNoZXMkXG4gICAgICAgIDogb2YoW10gYXMgU2VydmljZU1lc2hHcm91cFtdKSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2plY3RzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFtwcm9qZWN0cywgc2VydmljZU1lc2hlc10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVNlcnZpY2VNZXNoKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlTWVzaGVzID0gc2VydmljZU1lc2hlcztcbiAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFNlcnZpY2VNZXNoR3JvdXBSZXNvdXJjZXMgPSBzZXJ2aWNlTWVzaGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvamVjdHMgPSBwcm9qZWN0cztcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFByb2plY3RSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW5pdFByb2plY3QocHJvamVjdHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY2FjaGVkUHJvamVjdFJlc291cmNlcyA9IHRoaXMucHJvamVjdHM7XG4gICAgICB9KTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuY2x1c3RlcnMkLCB0aGlzLm5hbWVzcGFjZXMkXSkuc3Vic2NyaWJlKFxuICAgICAgKFtjbHVzdGVycywgZGF0YV0pID0+IHtcbiAgICAgICAgY29uc3QgaXNNdWx0aUFyY2ggPVxuICAgICAgICAgIHVuaXEoY2x1c3RlcnMubWFwKGMgPT4gdGhpcy5rOHNVdGlsLmdldExhYmVsKGMsICdhcmNoJykpKS5sZW5ndGggPiAxO1xuICAgICAgICB0aGlzLmRpc3BsYXllZERhdGEgPSB0aGlzLm1hcFJlc291cmNlKGRhdGEsIHtcbiAgICAgICAgICBjbHVzdGVycyxcbiAgICAgICAgICBpc011bHRpQXJjaCxcbiAgICAgICAgfSkuZmlsdGVyKG5zID0+IHRoaXMuY29udGV4dCA9PT0gJ3BhZ2UnIHx8ICFucy5zdGF0ZT8uZGlzYWJsZWQpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkTmFtZXNwYWNlKHRoaXMuZGlzcGxheWVkRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVWlkKSB7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5nZXRTb3J0ZWROYW1lc3BhY2UoXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZERhdGEsXG4gICAgICAgICAgICB0aGlzLnZhbHVlLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JjZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdG9yZU5hbWVzcGFjZXMoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBnZXRTb3J0ZWROYW1lc3BhY2UocmF3RGF0YTogTmFtZXNwYWNlRGF0YUl0ZW1bXSwgbmFtZXNwYWNlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFuYW1lc3BhY2UpIHtcbiAgICAgIHJldHVybiByYXdEYXRhO1xuICAgIH1cbiAgICBjb25zdCBbc2VsZWN0ZWQsIG90aGVyc10gPSBwYXJ0aXRpb24oXG4gICAgICB0aGlzLmRpc3BsYXllZERhdGEsXG4gICAgICBpdGVtID0+IGl0ZW0ubmFtZSA9PT0gbmFtZXNwYWNlLFxuICAgICk7XG4gICAgcmV0dXJuIFsuLi5zZWxlY3RlZCwgLi4ub3RoZXJzXTtcbiAgfVxuXG4gIHN0b3JlTmFtZXNwYWNlcygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQcm9qZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2x1c3RlciA9PT0gJ19fYWxsJykge1xuICAgICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIHRoaXMuY2x1c3RlcnMpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5zdG9yZU5hbWVzcGFjZXMoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFByb2plY3QubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgIHRoaXMuZGlzcGxheWVkRGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLmNsdXN0ZXIgPT09IGNsdXN0ZXIpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnN0b3JlTmFtZXNwYWNlcyhcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0Lm1ldGFkYXRhLm5hbWUsXG4gICAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlcixcbiAgICAgIHRoaXMuZGlzcGxheWVkRGF0YSxcbiAgICApO1xuICB9XG5cbiAgcHJvamVjdEZpbHRlckZuID0gKGtleXdvcmQgPSAnJywgb3B0aW9uOiBTZWxlY3RGaWx0ZXJPcHRpb248UHJvamVjdD4pID0+IHtcbiAgICBjb25zdCBrID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBvcHRpb24udmFsdWUubWV0YWRhdGEubmFtZS5pbmNsdWRlcyhrKSB8fFxuICAgICAgZ2V0RG9tYWluQW5ub3RhdGlvbihESVNQTEFZX05BTUUsIG9wdGlvbi52YWx1ZSlcbiAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgID8uaW5jbHVkZXMoaylcbiAgICApO1xuICB9O1xuXG4gIGNsdXN0ZXJGaWx0ZXJGbiA9IChrZXl3b3JkID0gJycsIG9wdGlvbjogU2VsZWN0RmlsdGVyT3B0aW9uPHN0cmluZz4pID0+IHtcbiAgICBjb25zdCBrID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcHRpb24udmFsdWUgPT09ICdfX2FsbCcpIHtcbiAgICAgIHJldHVybiAob3B0aW9uLmxhYmVsIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhrKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5hbWUsIGRpc3BsYXlOYW1lIH0gPSBvcHRpb24ubGFiZWxDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICByZXR1cm4gbmFtZS5pbmNsdWRlcyhrKSB8fCBkaXNwbGF5TmFtZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoayk7XG4gIH07XG5cbiAgc2VydmljZU1lc2hGaWx0ZXJGbiA9IChcbiAgICBrZXl3b3JkID0gJycsXG4gICAgb3B0aW9uOiBTZWxlY3RGaWx0ZXJPcHRpb248U2VydmljZU1lc2hHcm91cD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IGsgPSBrZXl3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IG9wdGlvbi52YWx1ZS5zcGVjPy5pc3Rpb1ZlcnNpb25cbiAgICAgID8gYElzdGlvICR7b3B0aW9uLnZhbHVlLnNwZWMuaXN0aW9WZXJzaW9ufWBcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wdGlvbi52YWx1ZS5tZXRhZGF0YS5uYW1lLmluY2x1ZGVzKGspIHx8XG4gICAgICB2ZXJzaW9uLnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKGspXG4gICAgKTtcbiAgfTtcblxuICBwcm9qZWN0VHJhY2tGbiA9IChwcm9qZWN0OiBQcm9qZWN0KSA9PiBwcm9qZWN0Py5tZXRhZGF0YS5uYW1lO1xuXG4gIHNlcnZpY2VNZXNoVHJhY2tGbiA9IChtZXNoOiBTZXJ2aWNlTWVzaEdyb3VwKSA9PiBtZXNoPy5tZXRhZGF0YS5uYW1lO1xuXG4gIHByaXZhdGUgaW5pdFByb2plY3QocHJvamVjdHM6IFByb2plY3RbXSkge1xuICAgIHRoaXMuc2VsZWN0UHJvamVjdChcbiAgICAgIChwcm9qZWN0cyB8fCBbXSkubGVuZ3RoXG4gICAgICAgID8gcHJvamVjdHMuZmluZChpdGVtID0+IGl0ZW0ubWV0YWRhdGEubmFtZSA9PT0gdGhpcy52YWx1ZT8ucHJvamVjdCkgfHxcbiAgICAgICAgICAgIHByb2plY3RzWzBdXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICB0aGlzLmxvYWQuZW1pdCh7XG4gICAgICBwcm9qZWN0OiBwcm9qZWN0cy5sZW5ndGgsXG4gICAgICBjbHVzdGVyOiB1bmlxKFxuICAgICAgICBwcm9qZWN0cy5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VyKSA9PiBbLi4uYWNjLCAuLi4oY3VyLnNwZWMuY2x1c3RlcnMgfHwgW10pLm1hcChjID0+IGMubmFtZSldLFxuICAgICAgICAgIFtdLFxuICAgICAgICApLFxuICAgICAgKS5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RTZXJ2aWNlTWVzaChzZXJ2aWNlTWVzaDogU2VydmljZU1lc2hHcm91cCkge1xuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTWVzaCA9IHNlcnZpY2VNZXNoO1xuICAgIHRoaXMuY2x1c3RlcnMgPSAodGhpcy5zZWxlY3RlZFByb2plY3Quc3BlYy5jbHVzdGVycyB8fCBbXSlcbiAgICAgIC5tYXAoYyA9PiBjLm5hbWUpXG4gICAgICAuZmlsdGVyKGNsdXN0ZXIgPT5cbiAgICAgICAgdGhpcy5zZXJ2aWNlTWVzaGVzXG4gICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICBtZXNoID0+XG4gICAgICAgICAgICAgIHRoaXMuazhzVXRpbC5nZXROYW1lKG1lc2gpID09PSB0aGlzLms4c1V0aWwuZ2V0TmFtZShzZXJ2aWNlTWVzaCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zcGVjLmNsdXN0ZXJzLmluY2x1ZGVzKGNsdXN0ZXIpLFxuICAgICAgKTtcbiAgICB0aGlzLnNlbGVjdENsdXN0ZXIoJ19fYWxsJyk7XG4gIH1cblxuICBzZWxlY3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGluaXRpYWwgPSBmYWxzZSkge1xuICAgIHRoaXMucHJvamVjdENoYW5nZS5lbWl0KHByb2plY3Q/Lm1ldGFkYXRhLm5hbWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB0aGlzLmNsdXN0ZXJzID0gcHJvamVjdFxuICAgICAgPyAocHJvamVjdC5zcGVjLmNsdXN0ZXJzIHx8IFtdKS5tYXAoYyA9PiBjLm5hbWUpXG4gICAgICA6IFtdO1xuICAgIGlmICh0aGlzLmRpc3BsYXlTZXJ2aWNlTWVzaCkge1xuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZU1lc2hlcyA9IHRoaXMuc2VydmljZU1lc2hlcy5maWx0ZXIobWVzaCA9PlxuICAgICAgICBtZXNoLnNwZWMuY2x1c3RlcnMuc29tZShjbHVzdGVyID0+IHRoaXMuY2x1c3RlcnMuaW5jbHVkZXMoY2x1c3RlcikpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnByb2plY3RTZXJ2aWNlTWVzaGVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG1lc2hOYW1lID0gdGhpcy52YWx1ZT8uc2VydmljZW1lc2g7XG5cbiAgICAgICAgaWYgKCFtZXNoTmFtZSkge1xuICAgICAgICAgIHRoaXMuYXV0aC5nZXRBY2NvdW50SW5mbygpLnN1YnNjcmliZSgoeyBlbWFpbCB9KSA9PiB7XG4gICAgICAgICAgICBtZXNoTmFtZSA9IGdldFdvcmtzcGFjZVBhcmFtcyhlbWFpbCk/LnNlcnZpY2VtZXNoO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTZXJ2aWNlTWVzaCA9XG4gICAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZU1lc2hlcy5maW5kKFxuICAgICAgICAgICAgbWVzaCA9PiB0aGlzLms4c1V0aWwuZ2V0TmFtZShtZXNoKSA9PT0gbWVzaE5hbWUsXG4gICAgICAgICAgKSB8fCB0aGlzLnByb2plY3RTZXJ2aWNlTWVzaGVzWzBdO1xuICAgICAgICB0aGlzLnNlbGVjdFNlcnZpY2VNZXNoKHNlbGVjdGVkU2VydmljZU1lc2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2VNZXNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbHVzdGVycyA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdENsdXN0ZXIoJ19fYWxsJywgaW5pdGlhbCk7XG4gIH1cblxuICBzZWxlY3RDbHVzdGVyKGNsdXN0ZXJOYW1lOiBzdHJpbmcsIGluaXRpYWwgPSBmYWxzZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDbHVzdGVyID0gY2x1c3Rlck5hbWU7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YSA9XG4gICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldENhY2hlZE5hbWVzcGFjZXMoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0Py5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlcixcbiAgICAgICkgfHwgW107XG4gICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5nZXRTb3J0ZWROYW1lc3BhY2UoXG4gICAgICBkaXNwbGF5ZWREYXRhLFxuICAgICAgaW5pdGlhbCA/IHRoaXMudmFsdWU/Lm5hbWUgOiBudWxsLFxuICAgICk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZE5hbWVzcGFjZSh0aGlzLmRpc3BsYXllZERhdGEpO1xuXG4gICAgdGhpcy5jbHVzdGVyQ2hhbmdlLmVtaXQoXG4gICAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlciA9PT0gJ19fYWxsJyA/IG51bGwgOiBjbHVzdGVyTmFtZSxcbiAgICApO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5sb2FkJCQubmV4dCh7XG4gICAgICBwcm9qZWN0OiB0aGlzLnNlbGVjdGVkUHJvamVjdCxcbiAgICAgIGNsdXN0ZXI6IGNsdXN0ZXJOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZE5hbWVzcGFjZShkYXRhOiBOYW1lc3BhY2VEYXRhSXRlbVtdKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lc3BhY2UgPSB0aGlzLnZhbHVlXG4gICAgICA/IGRhdGEuZmluZChcbiAgICAgICAgICBpdGVtID0+XG4gICAgICAgICAgICBpdGVtLm5hbWUgPT09IHRoaXMudmFsdWUubmFtZSAmJlxuICAgICAgICAgICAgdGhpcy52YWx1ZS5jbHVzdGVyID09PSBpdGVtLmNsdXN0ZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkVWlkID0gc2VsZWN0ZWROYW1lc3BhY2VcbiAgICAgID8gc2VsZWN0ZWROYW1lc3BhY2UuX19vcmlnaW4ubWV0YWRhdGEudWlkXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBtYXBSZXNvdXJjZSA9IChcbiAgICBsaXN0OiBLdWJlcm5ldGVzUmVzb3VyY2VbXSxcbiAgICB7XG4gICAgICBpc011bHRpQXJjaCxcbiAgICAgIGNsdXN0ZXJzLFxuICAgIH06IHtcbiAgICAgIGlzTXVsdGlBcmNoOiBib29sZWFuO1xuICAgICAgY2x1c3RlcnM6IENsdXN0ZXJbXTtcbiAgICB9LFxuICApOiBOYW1lc3BhY2VEYXRhSXRlbVtdID0+XG4gICAgbGlzdC5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCBjbHVzdGVyID0gdGhpcy5uYW1lc3BhY2VDbHVzdGVyTWFwW2l0ZW0ubWV0YWRhdGEudWlkXTtcbiAgICAgIGNvbnN0IGl0ZW1EaXNhYmxlZCA9IHRoaXMuZGlzYWJsZUZuID8gdGhpcy5kaXNhYmxlRm4oaXRlbSkgOiBudWxsO1xuICAgICAgY29uc3QgY2FjaGVkSXRlbSA9IHRoaXMuZGlzcGxheWVkRGF0YS5maW5kKFxuICAgICAgICBucyA9PiBucy5fX29yaWdpbi5tZXRhZGF0YS51aWQgPT09IGl0ZW0ubWV0YWRhdGEudWlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VtZXNoID0gdGhpcy5zZXJ2aWNlTWVzaGVzLmZpbmQoaXRlbSA9PlxuICAgICAgICBpdGVtLnNwZWMuY2x1c3RlcnMuaW5jbHVkZXMoY2FjaGVkSXRlbT8uY2x1c3RlciB8fCBjbHVzdGVyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0aGlzLms4c1V0aWwuZ2V0TmFtZShpdGVtKSxcbiAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuazhzVXRpbC5nZXREaXNwbGF5TmFtZShpdGVtKSxcbiAgICAgICAgY2x1c3RlcjogY2FjaGVkSXRlbT8uY2x1c3RlciB8fCBjbHVzdGVyLFxuICAgICAgICBjbHVzdGVyRGlzcGxheU5hbWU6XG4gICAgICAgICAgY2FjaGVkSXRlbT8uY2x1c3RlckRpc3BsYXlOYW1lIHx8XG4gICAgICAgICAgdGhpcy5rOHNVdGlsLmdldERpc3BsYXlOYW1lKFxuICAgICAgICAgICAgY2x1c3RlcnMuZmluZChjID0+IGMubWV0YWRhdGEubmFtZSA9PT0gY2x1c3RlciksXG4gICAgICAgICAgKSxcbiAgICAgICAgY2x1c3RlckFyY2g6XG4gICAgICAgICAgY2FjaGVkSXRlbT8uY2x1c3RlckFyY2ggfHwgaXNNdWx0aUFyY2hcbiAgICAgICAgICAgID8gdGhpcy5nZXRDbHVzdGVyQXJjaChcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5maW5kKGMgPT4gYy5tZXRhZGF0YS5uYW1lID09PSBjbHVzdGVyKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBzZXJ2aWNlTWVzaE5hbWU6IHNlcnZpY2VtZXNoID8gdGhpcy5rOHNVdGlsLmdldE5hbWUoc2VydmljZW1lc2gpIDogJycsXG4gICAgICAgIHNlcnZpY2VNZXNoQ2x1c3RlcnM6IHNlcnZpY2VtZXNoID8gc2VydmljZW1lc2guc3BlYy5jbHVzdGVycyA6IFtdLFxuICAgICAgICBzZXJ2aWNlTWVzaElzdGlvVmVyc2lvbjogc2VydmljZW1lc2hcbiAgICAgICAgICA/IHNlcnZpY2VtZXNoLnNwZWMuaXN0aW9WZXJzaW9uXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgYWRtaW46IGNhY2hlZEl0ZW0/LmFkbWluIHx8ICctJyxcbiAgICAgICAgdGltZXN0YW1wOiB0aGlzLms4c1V0aWwuZ2V0Q3JlYXRpb25UaW1lc3RhbXAoaXRlbSksXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgZGlzYWJsZWQ6XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hcFtjbHVzdGVyXT8uZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIGl0ZW1EaXNhYmxlZD8uZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbHVzdGVyRXJyb3IoY2x1c3RlcnMsIGNhY2hlZEl0ZW0/LmNsdXN0ZXIgfHwgY2x1c3RlcikgfHxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRvb2x0aXA6IHRoaXMuZ3JpZFN0YXRlTWFwW2NsdXN0ZXJdPy5kaXNhYmxlZFxuICAgICAgICAgICAgPyB0aGlzLmdyaWRTdGF0ZU1hcFtjbHVzdGVyXT8udG9vbHRpcCB8fCAnJ1xuICAgICAgICAgICAgOiBpdGVtRGlzYWJsZWQ/LnRvb2x0aXAsXG4gICAgICAgIH0sXG4gICAgICAgIF9fb3JpZ2luOiBpdGVtLFxuICAgICAgfTtcbiAgICB9KTtcblxuICBwcml2YXRlIGdldENsdXN0ZXJBcmNoKGNsdXN0ZXI6IENsdXN0ZXIpIHtcbiAgICByZXR1cm4gZ2V0RGlzcGxheUFyY2goXG4gICAgICB0aGlzLms4c1V0aWwuZ2V0TGFiZWwoY2x1c3RlciwgJ2FyY2gnKSxcbiAgICApIGFzIENsdXN0ZXJBcmNoO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0NsdXN0ZXJFcnJvcihjbHVzdGVyczogQ2x1c3RlcltdLCBjbHVzdGVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2x1c3RlcnNcbiAgICAgICAgLmZpbmQoaSA9PiB0aGlzLms4c1V0aWwuZ2V0TmFtZShpKSA9PT0gY2x1c3RlcilcbiAgICAgICAgPy5zdGF0dXMuY29uZGl0aW9ucy5maW5kKGMgPT4gYy50eXBlID09PSAnTm9kZU5vdFJlYWR5Jyk/LnN0YXR1cyAhPT1cbiAgICAgICdGYWxzZSdcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsdGVyXCI+XG4gIDxhdWktZm9ybS1pdGVtPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdwcm9qZWN0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGF1aS1zZWxlY3RcbiAgICAgIFtuZ0NsYXNzXT1cImRpc3BsYXlTZXJ2aWNlTWVzaCA/ICdsYW5nLW5vdC16aDohdHctdy1bMjMwcHhdJyA6ICcnXCJcbiAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgbmFtZT1cInByb2plY3RcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFByb2plY3RcIlxuICAgICAgW2ZpbHRlckZuXT1cInByb2plY3RGaWx0ZXJGblwiXG4gICAgICBbdHJhY2tGbl09XCJwcm9qZWN0VHJhY2tGblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwic2VsZWN0UHJvamVjdCgkZXZlbnQpXCJcbiAgICAgIFtsb2FkaW5nXT1cIiFwcm9qZWN0cy5sZW5ndGggJiYgcHJvamVjdHNMb2FkaW5nXCJcbiAgICA+XG4gICAgICA8YXVpLW9wdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgcHJvamVjdCBvZiBwcm9qZWN0c1wiXG4gICAgICAgIFt2YWx1ZV09XCJwcm9qZWN0XCJcbiAgICAgICAgW2xhYmVsXT1cInByb2plY3QgfCBhY2xVbmlvbkRpc3BsYXlOYW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgcHJvamVjdCB8IGFjbFVuaW9uRGlzcGxheU5hbWUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgICAgICB7eyAnbm9fZGF0YScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2F1aS1zZWxlY3Q+XG4gIDwvYXVpLWZvcm0taXRlbT5cbiAgPCEtLSBBU00g6YCJ5oup572R5qC86L+H5ruk6ZuG576k6YCJ6aG5IC0tPlxuICA8YXVpLWZvcm0taXRlbSAqbmdJZj1cImRpc3BsYXlTZXJ2aWNlTWVzaFwiPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzZXJ2aWNlX21lc2gnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXNlbGVjdFxuICAgICAgY2xhc3M9XCJsYW5nLW5vdC16aDohdHctdy1bMjMwcHhdXCJcbiAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgbmFtZT1cInNlcnZpY2VNZXNoUHJvamVjdFwiXG4gICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU2VydmljZU1lc2hcIlxuICAgICAgW3RyYWNrRm5dPVwic2VydmljZU1lc2hUcmFja0ZuXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3RTZXJ2aWNlTWVzaCgkZXZlbnQpXCJcbiAgICAgIFtsb2FkaW5nXT1cIiFwcm9qZWN0cy5sZW5ndGggJiYgcHJvamVjdHNMb2FkaW5nXCJcbiAgICA+XG4gICAgICA8YXVpLW9wdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgbWVzaCBvZiBwcm9qZWN0U2VydmljZU1lc2hlc1wiXG4gICAgICAgIFt2YWx1ZV09XCJtZXNoXCJcbiAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgIChtZXNoIHwgYWNsTmFtZSkgK1xuICAgICAgICAgIChtZXNoLnNwZWM/LmlzdGlvVmVyc2lvblxuICAgICAgICAgICAgPyAnIChJc3RpbyAnICsgbWVzaC5zcGVjLmlzdGlvVmVyc2lvbiArICcpJ1xuICAgICAgICAgICAgOiAnJylcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzaCB8IGFjbE5hbWUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc2guc3BlYz8uaXN0aW9WZXJzaW9uXCI+XG4gICAgICAgICAgKElzdGlvIHt7IG1lc2guc3BlYy5pc3Rpb1ZlcnNpb24gfX0pXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgPGF1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIHt7ICdub19kYXRhJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9hdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgIDwvYXVpLXNlbGVjdD5cbiAgPC9hdWktZm9ybS1pdGVtPlxuICA8YXVpLWZvcm0taXRlbT5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnY2x1c3RlcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxhdWktc2VsZWN0XG4gICAgICBbbmdDbGFzc109XCJkaXNwbGF5U2VydmljZU1lc2ggPyAnbGFuZy1ub3Qtemg6IXR3LXctWzIzMHB4XScgOiAnJ1wiXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIG5hbWU9XCJjbHVzdGVyXCJcbiAgICAgIFtmaWx0ZXJGbl09XCJjbHVzdGVyRmlsdGVyRm5cIlxuICAgICAgW2xvYWRpbmddPVwiIXByb2plY3RzLmxlbmd0aCAmJiBwcm9qZWN0c0xvYWRpbmdcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENsdXN0ZXJcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdENsdXN0ZXIoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgW3ZhbHVlXT1cIidfX2FsbCdcIlxuICAgICAgICBbbGFiZWxdPVwiJ2FsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgPlxuICAgICAgICB7eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2x1c3Rlck5hbWUgb2YgY2x1c3RlcnNcIj5cbiAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAqZGVjbGFyZT1cIntcbiAgICAgICAgICAgIG5hbWU6IGNsdXN0ZXJOYW1lLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGNsdXN0ZXJOYW1lIHwgcHVyZTogZ2V0Q2x1c3RlckRpc3BsYXlOYW1lJCB8IGFzeW5jXG4gICAgICAgICAgfSBhcyBjbHVzdGVyXCJcbiAgICAgICAgICBbdmFsdWVdPVwiY2x1c3Rlck5hbWVcIlxuICAgICAgICAgIFtsYWJlbF09XCJjbHVzdGVyTGFiZWxcIlxuICAgICAgICAgIFtsYWJlbENvbnRleHRdPVwiY2x1c3RlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImNsdXN0ZXJOYW1lIHwgcHVyZTogY2hlY2tDbHVzdGVyRXJyb3IkIHwgYXN5bmNcIlxuICAgICAgICAgIFthdWlUb29sdGlwXT1cIidjdXJyZW50X2NsdXN0ZXJfc3RhdHVzX2Fibm9ybWFsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2F1aVRvb2x0aXBEaXNhYmxlZF09XCJcbiAgICAgICAgICAgICEoY2x1c3Rlck5hbWUgfCBwdXJlOiBjaGVja0NsdXN0ZXJFcnJvciQgfCBhc3luYylcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbHVzdGVyTGFiZWw7IGNvbnRleHQ6IGNsdXN0ZXJcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8YXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAge3sgJ25vX2RhdGEnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgI2NsdXN0ZXJMYWJlbFxuICAgICAgICBsZXQtbmFtZT1cIm5hbWVcIlxuICAgICAgICBsZXQtZGlzcGxheU5hbWU9XCJkaXNwbGF5TmFtZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG5hbWUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlOYW1lXCI+KHt7IGRpc3BsYXlOYW1lIH19KTwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2F1aS1zZWxlY3Q+XG4gIDwvYXVpLWZvcm0taXRlbT5cbjwvZGl2PlxuPGFjbC1yZXNvdXJjZS1kYXRhLWdyaWRcbiAgW2RhdGFdPVwiZGlzcGxheWVkRGF0YSB8fCBbXVwiXG4gIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gIChzZWxlY3RJdGVtKT1cIm9uU2VsZWN0KCRldmVudClcIlxuICBbYWN0aW9uVGVtcGxhdGVSZWZdPVwiYWN0aW9uVGVtcGxhdGVSZWZcIlxuICBbc2VsZWN0ZWRVaWRdPVwic2VsZWN0ZWRVaWRcIlxuICBbbG9hZGluZ109XCJmb3JjZUxvYWRpbmcgfHwgKCFkaXNwbGF5ZWREYXRhPy5sZW5ndGggJiYgbG9hZGluZylcIlxuICAocmVsb2FkKT1cInJlbG9hZCgpXCJcbj5cbiAgPG5nLWNvbnRhaW5lciBhY2xSZXNvdXJjZUdyaWRIZWFkZXI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvYWNsLXJlc291cmNlLWRhdGEtZ3JpZD5cbiJdfQ==
|