@valtimo/task 12.14.0 → 13.0.0
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/fesm2022/valtimo-task.mjs +218 -173
- package/fesm2022/valtimo-task.mjs.map +1 -1
- package/lib/components/assign-user-to-task/assign-user-to-task.component.d.ts +1 -1
- package/lib/components/task-detail-content/task-detail-content.component.d.ts +3 -4
- package/lib/components/task-detail-content/task-detail-content.component.d.ts.map +1 -1
- package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts +5 -6
- package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts.map +1 -1
- package/lib/components/task-detail-modal/task-detail-modal.component.d.ts +10 -4
- package/lib/components/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
- package/lib/components/task-list/task-list.component.d.ts +8 -4
- package/lib/components/task-list/task-list.component.d.ts.map +1 -1
- package/lib/models/index.d.ts +1 -0
- package/lib/models/index.d.ts.map +1 -1
- package/lib/models/task-list.model.d.ts +2 -2
- package/lib/models/task-list.model.d.ts.map +1 -1
- package/lib/models/task-sse-event.model.d.ts +8 -0
- package/lib/models/task-sse-event.model.d.ts.map +1 -0
- package/lib/models/task.model.d.ts +1 -1
- package/lib/services/task-intermediate-save.service.d.ts +1 -1
- package/lib/services/task-intermediate-save.service.d.ts.map +1 -1
- package/lib/services/task-list-pagination.service.d.ts +1 -1
- package/lib/services/task-list-search.service.d.ts +1 -1
- package/lib/services/task-list-sort.service.d.ts +1 -1
- package/lib/services/task-list.service.d.ts +4 -7
- package/lib/services/task-list.service.d.ts.map +1 -1
- package/lib/services/task.service.d.ts +4 -4
- package/lib/services/task.service.d.ts.map +1 -1
- package/lib/task-permissions.d.ts +1 -1
- package/lib/task-permissions.d.ts.map +1 -1
- package/lib/task.module.d.ts +9 -10
- package/lib/task.module.d.ts.map +1 -1
- package/package.json +4 -7
- package/esm2022/lib/components/assign-user-to-task/assign-user-to-task.component.mjs +0 -210
- package/esm2022/lib/components/set-task-due-date/set-task-due-date.component.mjs +0 -128
- package/esm2022/lib/components/task-detail-content/task-detail-content.component.mjs +0 -398
- package/esm2022/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.mjs +0 -168
- package/esm2022/lib/components/task-detail-modal/task-detail-modal.component.mjs +0 -151
- package/esm2022/lib/components/task-list/task-list.component.mjs +0 -361
- package/esm2022/lib/constants/index.mjs +0 -17
- package/esm2022/lib/constants/task-list.constants.mjs +0 -22
- package/esm2022/lib/models/index.mjs +0 -21
- package/esm2022/lib/models/task-definition.model.mjs +0 -17
- package/esm2022/lib/models/task-intermediate-save.model.mjs +0 -17
- package/esm2022/lib/models/task-list-search-field.model.mjs +0 -43
- package/esm2022/lib/models/task-list.model.mjs +0 -22
- package/esm2022/lib/models/task.model.mjs +0 -17
- package/esm2022/lib/services/index.mjs +0 -23
- package/esm2022/lib/services/task-intermediate-save.service.mjs +0 -73
- package/esm2022/lib/services/task-list-column.service.mjs +0 -193
- package/esm2022/lib/services/task-list-pagination.service.mjs +0 -74
- package/esm2022/lib/services/task-list-query-param.service.mjs +0 -53
- package/esm2022/lib/services/task-list-search.service.mjs +0 -99
- package/esm2022/lib/services/task-list-sort.service.mjs +0 -116
- package/esm2022/lib/services/task-list.service.mjs +0 -60
- package/esm2022/lib/services/task.service.mjs +0 -104
- package/esm2022/lib/task-permissions.mjs +0 -44
- package/esm2022/lib/task-routing.module.mjs +0 -45
- package/esm2022/lib/task.module.mjs +0 -158
- package/esm2022/public_api.mjs +0 -31
- package/esm2022/valtimo-task.mjs +0 -5
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2015-2024 Ritense BV, the Netherlands.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under EUPL, Version 1.2 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
import { CommonModule } from '@angular/common';
|
|
17
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional, Output, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
18
|
-
import { RecentlyViewed16 } from '@carbon/icons';
|
|
19
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
20
|
-
import { FormIoModule, FormioOptionsImpl, } from '@valtimo/components';
|
|
21
|
-
import { FORM_VIEW_MODEL_TOKEN } from '@valtimo/config';
|
|
22
|
-
import { FORM_CUSTOM_COMPONENT_TOKEN, ProcessLinkModule, } from '@valtimo/process-link';
|
|
23
|
-
import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, Subscription, switchMap, take, } from 'rxjs';
|
|
24
|
-
import { CAN_ASSIGN_TASK_PERMISSION, TASK_DETAIL_PERMISSION_RESOURCE } from '../../task-permissions';
|
|
25
|
-
import * as i0 from "@angular/core";
|
|
26
|
-
import * as i1 from "@valtimo/config";
|
|
27
|
-
import * as i2 from "@valtimo/document";
|
|
28
|
-
import * as i3 from "carbon-components-angular";
|
|
29
|
-
import * as i4 from "ngx-logger";
|
|
30
|
-
import * as i5 from "@valtimo/components";
|
|
31
|
-
import * as i6 from "@valtimo/access-control";
|
|
32
|
-
import * as i7 from "@valtimo/process-link";
|
|
33
|
-
import * as i8 from "@angular/router";
|
|
34
|
-
import * as i9 from "../../services";
|
|
35
|
-
import * as i10 from "ngx-toastr";
|
|
36
|
-
import * as i11 from "@ngx-translate/core";
|
|
37
|
-
import * as i12 from "@angular/common";
|
|
38
|
-
export class TaskDetailContentComponent {
|
|
39
|
-
set task(value) {
|
|
40
|
-
if (!value)
|
|
41
|
-
return;
|
|
42
|
-
this.loadTaskDetails(value);
|
|
43
|
-
}
|
|
44
|
-
set taskAndProcessLink(value) {
|
|
45
|
-
if (!value)
|
|
46
|
-
return;
|
|
47
|
-
this.loadTaskDetails(value.task, value.processLinkActivityResult);
|
|
48
|
-
}
|
|
49
|
-
set modalClosed(closed) {
|
|
50
|
-
// save form flow data on modal closed
|
|
51
|
-
if (this.formFlow)
|
|
52
|
-
this.formFlow.saveData();
|
|
53
|
-
if (closed) {
|
|
54
|
-
this.closeModalEvent.emit();
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
get viewInitialized$() {
|
|
58
|
-
return this._viewInitialized$.pipe(filter(initialized => initialized));
|
|
59
|
-
}
|
|
60
|
-
constructor(configService, documentService, iconService, logger, modalService, permissionService, processLinkService, router, stateService, taskIntermediateSaveService, taskService, toastr, translateService, formViewModel, formCustomComponentConfig, urlResolverService) {
|
|
61
|
-
this.configService = configService;
|
|
62
|
-
this.documentService = documentService;
|
|
63
|
-
this.iconService = iconService;
|
|
64
|
-
this.logger = logger;
|
|
65
|
-
this.modalService = modalService;
|
|
66
|
-
this.permissionService = permissionService;
|
|
67
|
-
this.processLinkService = processLinkService;
|
|
68
|
-
this.router = router;
|
|
69
|
-
this.stateService = stateService;
|
|
70
|
-
this.taskIntermediateSaveService = taskIntermediateSaveService;
|
|
71
|
-
this.taskService = taskService;
|
|
72
|
-
this.toastr = toastr;
|
|
73
|
-
this.translateService = translateService;
|
|
74
|
-
this.formViewModel = formViewModel;
|
|
75
|
-
this.formCustomComponentConfig = formCustomComponentConfig;
|
|
76
|
-
this.urlResolverService = urlResolverService;
|
|
77
|
-
this.closeModalEvent = new EventEmitter();
|
|
78
|
-
this.formSubmit = new EventEmitter();
|
|
79
|
-
this.activeChange = new EventEmitter();
|
|
80
|
-
this.canAssignUserToTask$ = new BehaviorSubject(false);
|
|
81
|
-
this.errorMessage$ = new BehaviorSubject(null);
|
|
82
|
-
this.formDefinition$ = new BehaviorSubject(null);
|
|
83
|
-
this.formDefinitionId$ = new BehaviorSubject(null);
|
|
84
|
-
this.formFlowInstanceId$ = new BehaviorSubject(null);
|
|
85
|
-
this.formioOptions$ = new BehaviorSubject(null);
|
|
86
|
-
this.formIoFormData$ = new BehaviorSubject(null);
|
|
87
|
-
this.formName$ = new BehaviorSubject(null);
|
|
88
|
-
this.loading$ = new BehaviorSubject(true);
|
|
89
|
-
this.page$ = new BehaviorSubject(null);
|
|
90
|
-
this.submission$ = this.taskIntermediateSaveService.submission$;
|
|
91
|
-
this.task$ = new BehaviorSubject(null);
|
|
92
|
-
this.taskInstanceId$ = new BehaviorSubject(null);
|
|
93
|
-
this.intermediateSaveEnabled = false;
|
|
94
|
-
this._taskProcessLinkType$ = new BehaviorSubject(null);
|
|
95
|
-
this.processLinkIsForm$ = this._taskProcessLinkType$.pipe(map((type) => type === 'form'));
|
|
96
|
-
this.processLinkIsFormViewModel$ = this._taskProcessLinkType$.pipe(map((type) => type === 'form-view-model'));
|
|
97
|
-
this.processLinkIsFormFlow$ = this._taskProcessLinkType$.pipe(map((type) => type === 'form-flow'));
|
|
98
|
-
this.processLinkIsUiComponent$ = this._taskProcessLinkType$.pipe(map((type) => type === 'ui-component'));
|
|
99
|
-
this._processLinkId$ = new BehaviorSubject(null);
|
|
100
|
-
this._subscriptions = new Subscription();
|
|
101
|
-
this._formCustomComponentConfig$ = new BehaviorSubject({});
|
|
102
|
-
this._viewInitialized$ = new BehaviorSubject(false);
|
|
103
|
-
this.intermediateSaveEnabled = !!this.configService.featureToggles?.enableIntermediateSave;
|
|
104
|
-
this.iconService.registerAll([RecentlyViewed16]);
|
|
105
|
-
const options = new FormioOptionsImpl();
|
|
106
|
-
options.disableAlerts = true;
|
|
107
|
-
this.formioOptions$.next(options);
|
|
108
|
-
this._formCustomComponentConfig$.next(formCustomComponentConfig);
|
|
109
|
-
}
|
|
110
|
-
ngOnInit() {
|
|
111
|
-
this.openPermissionSubscription();
|
|
112
|
-
}
|
|
113
|
-
ngOnDestroy() {
|
|
114
|
-
this._subscriptions.unsubscribe();
|
|
115
|
-
this.taskIntermediateSaveService.setSubmission({});
|
|
116
|
-
this._viewInitialized$.next(false);
|
|
117
|
-
}
|
|
118
|
-
ngAfterViewInit() {
|
|
119
|
-
this._viewInitialized$.next(true);
|
|
120
|
-
}
|
|
121
|
-
onSubmit(submission) {
|
|
122
|
-
if (submission.data) {
|
|
123
|
-
this.taskIntermediateSaveService.setFormIoFormData(submission.data);
|
|
124
|
-
this.formIoFormData$.next(submission.data);
|
|
125
|
-
}
|
|
126
|
-
combineLatest([this._processLinkId$, this._taskProcessLinkType$, this.task$])
|
|
127
|
-
.pipe(take(1))
|
|
128
|
-
.subscribe(([processLinkId, taskProcessLinkType, task]) => {
|
|
129
|
-
if (taskProcessLinkType === 'form') {
|
|
130
|
-
if (processLinkId) {
|
|
131
|
-
this.processLinkService
|
|
132
|
-
.submitForm(processLinkId, submission.data, task?.businessKey, task?.id)
|
|
133
|
-
.subscribe({
|
|
134
|
-
next: (_) => {
|
|
135
|
-
this.completeTask(task);
|
|
136
|
-
},
|
|
137
|
-
error: errors => {
|
|
138
|
-
this.form.showErrors(errors);
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
else if (taskProcessLinkType === 'form-view-model') {
|
|
144
|
-
this.completeTask(task);
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
completeTask(task) {
|
|
149
|
-
if (!task)
|
|
150
|
-
return;
|
|
151
|
-
this.toastr.success(`${task.name} ${this.translateService.instant('taskDetail.taskCompleted')}`);
|
|
152
|
-
this.task$.next(null);
|
|
153
|
-
this.formSubmit.emit();
|
|
154
|
-
this.closeModalEvent.emit();
|
|
155
|
-
this.activeChange.emit(false);
|
|
156
|
-
if (this.formFlow)
|
|
157
|
-
this.formFlow.saveData();
|
|
158
|
-
}
|
|
159
|
-
onChange(event) {
|
|
160
|
-
if (event.data) {
|
|
161
|
-
this.taskIntermediateSaveService.setFormIoFormData(event.data);
|
|
162
|
-
this.formIoFormData$.next(event.data);
|
|
163
|
-
this.activeChange.emit(true);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
onFormFlowChangeEvent() {
|
|
167
|
-
this.activeChange.emit(true);
|
|
168
|
-
}
|
|
169
|
-
loadTaskDetails(task, processLink) {
|
|
170
|
-
this.resetTaskProcessLinkType();
|
|
171
|
-
this.resetFormDefinition();
|
|
172
|
-
this.taskInstanceId$.next(task.id);
|
|
173
|
-
if (!processLink) {
|
|
174
|
-
this.getTaskProcessLink(task.id);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
this.setTaskProcessLink(processLink);
|
|
178
|
-
}
|
|
179
|
-
this.setDocumentDefinitionNameInService(task);
|
|
180
|
-
const documentId = task.businessKey;
|
|
181
|
-
this.stateService.setDocumentId(documentId);
|
|
182
|
-
this.task$.next(task);
|
|
183
|
-
this.page$.next({
|
|
184
|
-
title: task.name,
|
|
185
|
-
subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${task.created}`,
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
getCurrentProgress(formViewModelComponentRef) {
|
|
189
|
-
this.taskInstanceId$
|
|
190
|
-
.pipe(filter(value => !!value), take(1), switchMap((taskInstanceId) => this.taskIntermediateSaveService.getIntermediateSubmission(taskInstanceId ?? '')))
|
|
191
|
-
.subscribe({
|
|
192
|
-
next: (intermediateSubmission) => {
|
|
193
|
-
this.taskIntermediateSaveService.setSubmission({
|
|
194
|
-
data: intermediateSubmission?.submission || {},
|
|
195
|
-
});
|
|
196
|
-
if (formViewModelComponentRef) {
|
|
197
|
-
formViewModelComponentRef.instance.submission = {
|
|
198
|
-
data: intermediateSubmission.submission,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
},
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
getTaskProcessLink(taskId) {
|
|
205
|
-
this.taskService.getTaskProcessLink(taskId).subscribe({
|
|
206
|
-
next: res => {
|
|
207
|
-
this.setTaskProcessLink(res);
|
|
208
|
-
},
|
|
209
|
-
error: _ => {
|
|
210
|
-
this.loading$.next(false);
|
|
211
|
-
},
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
setTaskProcessLink(processLinkResult) {
|
|
215
|
-
if (processLinkResult !== null) {
|
|
216
|
-
switch (processLinkResult?.type) {
|
|
217
|
-
case 'form':
|
|
218
|
-
this._taskProcessLinkType$.next('form');
|
|
219
|
-
this._processLinkId$.next(processLinkResult.processLinkId);
|
|
220
|
-
if (this.intermediateSaveEnabled)
|
|
221
|
-
this.getCurrentProgress();
|
|
222
|
-
this.setFormDefinition(processLinkResult.properties.prefilledForm);
|
|
223
|
-
break;
|
|
224
|
-
case 'form-flow':
|
|
225
|
-
this._taskProcessLinkType$.next('form-flow');
|
|
226
|
-
this.formFlowInstanceId$.next(processLinkResult.properties.formFlowInstanceId ?? '');
|
|
227
|
-
break;
|
|
228
|
-
case 'form-view-model':
|
|
229
|
-
this._taskProcessLinkType$.next('form-view-model');
|
|
230
|
-
this._processLinkId$.next(processLinkResult.processLinkId);
|
|
231
|
-
this.formDefinition$.next(processLinkResult.properties.formDefinition);
|
|
232
|
-
this.formName$.next(processLinkResult.properties.formName ?? '');
|
|
233
|
-
this.setFormViewModelComponent();
|
|
234
|
-
break;
|
|
235
|
-
case 'url':
|
|
236
|
-
this._taskProcessLinkType$.next('url');
|
|
237
|
-
this._processLinkId$.next(processLinkResult.processLinkId);
|
|
238
|
-
combineLatest([this.processLinkService.getVariables(), this.task$])
|
|
239
|
-
.pipe(take(1))
|
|
240
|
-
.subscribe(([variables, task]) => {
|
|
241
|
-
let url = this.urlResolverService.resolveUrlVariables(processLinkResult.properties.url, variables.variables);
|
|
242
|
-
window.open(url, '_blank').focus();
|
|
243
|
-
this.processLinkService
|
|
244
|
-
.submitURLProcessLink(processLinkResult.processLinkId, task.businessKey, task.id)
|
|
245
|
-
.subscribe(() => {
|
|
246
|
-
this.completeTask(task);
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
break;
|
|
250
|
-
case 'ui-component':
|
|
251
|
-
this._taskProcessLinkType$.next('ui-component');
|
|
252
|
-
this._processLinkId$.next(processLinkResult.processLinkId);
|
|
253
|
-
this.formDefinition$.next(null);
|
|
254
|
-
this.formName$.next('');
|
|
255
|
-
this.setFormCustomComponent(processLinkResult.properties.componentKey);
|
|
256
|
-
break;
|
|
257
|
-
}
|
|
258
|
-
this.loading$.next(false);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
openPermissionSubscription() {
|
|
262
|
-
this._subscriptions.add(this.task$.subscribe(task => {
|
|
263
|
-
if (task) {
|
|
264
|
-
this.logger.debug('Checking if user allowed to assign a user to Task with id:', task.id);
|
|
265
|
-
this.permissionService
|
|
266
|
-
.requestPermission(CAN_ASSIGN_TASK_PERMISSION, {
|
|
267
|
-
resource: TASK_DETAIL_PERMISSION_RESOURCE.task,
|
|
268
|
-
identifier: task.id,
|
|
269
|
-
})
|
|
270
|
-
.subscribe((allowed) => {
|
|
271
|
-
this.canAssignUserToTask$.next(allowed);
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
this.logger.debug('Reset is user allowed to assign a user to Task as task is null');
|
|
276
|
-
this.canAssignUserToTask$.next(false);
|
|
277
|
-
}
|
|
278
|
-
}));
|
|
279
|
-
}
|
|
280
|
-
setFormDefinition(formDefinition) {
|
|
281
|
-
this._taskProcessLinkType$.next('form');
|
|
282
|
-
this.formDefinition$.next(formDefinition);
|
|
283
|
-
}
|
|
284
|
-
setFormViewModelComponent() {
|
|
285
|
-
combineLatest([this._viewInitialized$, this.processLinkIsFormViewModel$]).subscribe(([viewInitialized, isFvm]) => {
|
|
286
|
-
if (viewInitialized && isFvm) {
|
|
287
|
-
this.formViewModelDynamicContainer.clear();
|
|
288
|
-
if (!this.formViewModel) {
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
const formViewModelComponent = this.formViewModelDynamicContainer.createComponent(this.formViewModel.component);
|
|
292
|
-
formViewModelComponent.instance.form = this.formDefinition$.getValue();
|
|
293
|
-
formViewModelComponent.instance.formName = this.formName$.getValue();
|
|
294
|
-
formViewModelComponent.instance.taskInstanceId = this.taskInstanceId$.getValue();
|
|
295
|
-
formViewModelComponent.instance.isStartForm = false;
|
|
296
|
-
formViewModelComponent.instance.formSubmit
|
|
297
|
-
.pipe(switchMap(() => this.task$), take(1))
|
|
298
|
-
.subscribe((task) => {
|
|
299
|
-
this.completeTask(task);
|
|
300
|
-
});
|
|
301
|
-
if (this.intermediateSaveEnabled) {
|
|
302
|
-
this._subscriptions.add(formViewModelComponent.instance.submission$.subscribe(submission => {
|
|
303
|
-
this.taskIntermediateSaveService.setSubmission(submission);
|
|
304
|
-
}));
|
|
305
|
-
this._subscriptions.add(this.submission$.pipe(distinctUntilChanged()).subscribe((submission) => {
|
|
306
|
-
if (submission?.data && Object.keys(submission.data).length === 0) {
|
|
307
|
-
formViewModelComponent.instance.submission = { data: {} };
|
|
308
|
-
}
|
|
309
|
-
}));
|
|
310
|
-
this.getCurrentProgress(formViewModelComponent);
|
|
311
|
-
}
|
|
312
|
-
this._subscriptions.add(this.closeModalEvent.subscribe(() => {
|
|
313
|
-
formViewModelComponent.destroy();
|
|
314
|
-
}));
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
setFormCustomComponent(formCustomComponentKey) {
|
|
319
|
-
combineLatest([this._viewInitialized$, this.processLinkIsUiComponent$]).subscribe(([viewInitialized, isUiComponent]) => {
|
|
320
|
-
if (viewInitialized && isUiComponent) {
|
|
321
|
-
this.formCustomComponentDynamicContainer.clear();
|
|
322
|
-
if (!this.formCustomComponentConfig) {
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
let renderedComponent;
|
|
326
|
-
this._subscriptions.add(this._formCustomComponentConfig$.subscribe(formCustomComponentConfig => {
|
|
327
|
-
const customComponent = formCustomComponentConfig[formCustomComponentKey];
|
|
328
|
-
renderedComponent = this.formCustomComponentDynamicContainer.createComponent(customComponent);
|
|
329
|
-
renderedComponent.instance.taskInstanceId = this.taskInstanceId$.value;
|
|
330
|
-
renderedComponent.instance.submittedEvent.subscribe(() => {
|
|
331
|
-
this.closeModalEvent.emit();
|
|
332
|
-
});
|
|
333
|
-
}));
|
|
334
|
-
this._subscriptions.add(this.closeModalEvent.subscribe(() => {
|
|
335
|
-
renderedComponent.destroy();
|
|
336
|
-
}));
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
resetFormDefinition() {
|
|
341
|
-
this.formDefinition$.next(null);
|
|
342
|
-
this.loading$.next(true);
|
|
343
|
-
}
|
|
344
|
-
resetTaskProcessLinkType() {
|
|
345
|
-
this._taskProcessLinkType$.next(null);
|
|
346
|
-
this._processLinkId$.next(null);
|
|
347
|
-
}
|
|
348
|
-
setDocumentDefinitionNameInService(task) {
|
|
349
|
-
this.documentService
|
|
350
|
-
.getProcessDocumentDefinitionFromProcessInstanceId(task.processInstanceId)
|
|
351
|
-
.subscribe(processDocumentDefinition => {
|
|
352
|
-
const documentDefinitionName = processDocumentDefinition.id.documentDefinitionId.name;
|
|
353
|
-
this.modalService.setDocumentDefinitionName(documentDefinitionName);
|
|
354
|
-
this.stateService.setDocumentDefinitionName(documentDefinitionName);
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailContentComponent, deps: [{ token: i1.ConfigService }, { token: i2.DocumentService }, { token: i3.IconService }, { token: i4.NGXLogger }, { token: i5.ValtimoModalService }, { token: i6.PermissionService }, { token: i7.ProcessLinkService }, { token: i8.Router }, { token: i5.FormIoStateService }, { token: i9.TaskIntermediateSaveService }, { token: i9.TaskService }, { token: i10.ToastrService }, { token: i11.TranslateService }, { token: FORM_VIEW_MODEL_TOKEN, optional: true }, { token: FORM_CUSTOM_COMPONENT_TOKEN, optional: true }, { token: i7.UrlResolverService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
358
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TaskDetailContentComponent, isStandalone: true, selector: "valtimo-task-detail-content", inputs: { task: "task", taskAndProcessLink: "taskAndProcessLink", modalClosed: "modalClosed" }, outputs: { closeModalEvent: "closeModalEvent", formSubmit: "formSubmit", activeChange: "activeChange" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "formViewModelDynamicContainer", first: true, predicate: ["formViewModelComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "formFlow", first: true, predicate: ["formFlow"], descendants: true }, { propertyName: "formCustomComponentDynamicContainer", first: true, predicate: ["formCustomComponent"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n loading: loading$ | async,\n page: page$ | async,\n task: task$ | async,\n taskId: taskInstanceId$ | async,\n formDefinition: formDefinition$ | async,\n formDefinitionId: formDefinitionId$ | async,\n formName: formName$ | async,\n formIoFormData: formIoFormData$ | async,\n submission: submission$ | async,\n processLinkIsForm: processLinkIsForm$ | async,\n processLinkIsFormViewModel: processLinkIsFormViewModel$ | async,\n processLinkIsUiComponent: processLinkIsUiComponent$ | async,\n formioOptions: formioOptions$ | async,\n processLinkIsFormFlow: processLinkIsFormFlow$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n errorMessage: errorMessage$ | async,\n canAssignUserToTask: canAssignUserToTask$ | async,\n } as obs\"\n>\n <valtimo-form-io\n #form\n *ngIf=\"obs.formDefinition && obs.processLinkIsForm && !obs.processLinkIsUiComponent && !obs.processLinkIsFormViewModel\"\n [form]=\"obs.formDefinition\"\n [submission]=\"obs.submission\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"obs.formioOptions\"\n ></valtimo-form-io>\n\n <valtimo-form-flow\n #formFlow\n *ngIf=\"obs.processLinkIsFormFlow\"\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n (formFlowComplete)=\"completeTask(obs.task)\"\n (formFlowChange)=\"onFormFlowChangeEvent()\"\n ></valtimo-form-flow>\n\n <div *ngIf=\"obs.loading\" class=\"text-black mb-0 p-3 text-center\">\n {{ 'formManagement.loading' | translate }}\n </div>\n\n <div\n *ngIf=\"\n obs.loading === false &&\n !obs.formDefinition &&\n !obs.formFlowInstanceId &&\n !obs.errorMessage &&\n !obs.processLinkIsUiComponent\n \"\n class=\"bg-warning text-black mb-0 p-3 text-center\"\n >\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n\n <div *ngIf=\"obs.errorMessage\" class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ obs.errorMessage }}\n </div>\n\n <div class=\"m-2\">\n <ng-template #formViewModelComponent></ng-template>\n <ng-template #formCustomComponent></ng-template>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormIoModule }, { kind: "component", type: i5.FormioComponent, selector: "valtimo-form-io", inputs: ["options", "submission", "form", "readOnly", "formRefresh$"], outputs: ["submit", "change", "event"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ProcessLinkModule }, { kind: "component", type: i7.FormFlowComponent, selector: "valtimo-form-flow", inputs: ["formIoFormData", "formFlowInstanceId"], outputs: ["formFlowComplete", "formFlowChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
359
|
-
}
|
|
360
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailContentComponent, decorators: [{
|
|
361
|
-
type: Component,
|
|
362
|
-
args: [{ selector: 'valtimo-task-detail-content', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, FormIoModule, TranslateModule, ProcessLinkModule], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n loading: loading$ | async,\n page: page$ | async,\n task: task$ | async,\n taskId: taskInstanceId$ | async,\n formDefinition: formDefinition$ | async,\n formDefinitionId: formDefinitionId$ | async,\n formName: formName$ | async,\n formIoFormData: formIoFormData$ | async,\n submission: submission$ | async,\n processLinkIsForm: processLinkIsForm$ | async,\n processLinkIsFormViewModel: processLinkIsFormViewModel$ | async,\n processLinkIsUiComponent: processLinkIsUiComponent$ | async,\n formioOptions: formioOptions$ | async,\n processLinkIsFormFlow: processLinkIsFormFlow$ | async,\n formFlowInstanceId: formFlowInstanceId$ | async,\n errorMessage: errorMessage$ | async,\n canAssignUserToTask: canAssignUserToTask$ | async,\n } as obs\"\n>\n <valtimo-form-io\n #form\n *ngIf=\"obs.formDefinition && obs.processLinkIsForm && !obs.processLinkIsUiComponent && !obs.processLinkIsFormViewModel\"\n [form]=\"obs.formDefinition\"\n [submission]=\"obs.submission\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"obs.formioOptions\"\n ></valtimo-form-io>\n\n <valtimo-form-flow\n #formFlow\n *ngIf=\"obs.processLinkIsFormFlow\"\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"obs.formFlowInstanceId\"\n (formFlowComplete)=\"completeTask(obs.task)\"\n (formFlowChange)=\"onFormFlowChangeEvent()\"\n ></valtimo-form-flow>\n\n <div *ngIf=\"obs.loading\" class=\"text-black mb-0 p-3 text-center\">\n {{ 'formManagement.loading' | translate }}\n </div>\n\n <div\n *ngIf=\"\n obs.loading === false &&\n !obs.formDefinition &&\n !obs.formFlowInstanceId &&\n !obs.errorMessage &&\n !obs.processLinkIsUiComponent\n \"\n class=\"bg-warning text-black mb-0 p-3 text-center\"\n >\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n\n <div *ngIf=\"obs.errorMessage\" class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ obs.errorMessage }}\n </div>\n\n <div class=\"m-2\">\n <ng-template #formViewModelComponent></ng-template>\n <ng-template #formCustomComponent></ng-template>\n </div>\n</ng-container>\n" }]
|
|
363
|
-
}], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.DocumentService }, { type: i3.IconService }, { type: i4.NGXLogger }, { type: i5.ValtimoModalService }, { type: i6.PermissionService }, { type: i7.ProcessLinkService }, { type: i8.Router }, { type: i5.FormIoStateService }, { type: i9.TaskIntermediateSaveService }, { type: i9.TaskService }, { type: i10.ToastrService }, { type: i11.TranslateService }, { type: undefined, decorators: [{
|
|
364
|
-
type: Optional
|
|
365
|
-
}, {
|
|
366
|
-
type: Inject,
|
|
367
|
-
args: [FORM_VIEW_MODEL_TOKEN]
|
|
368
|
-
}] }, { type: undefined, decorators: [{
|
|
369
|
-
type: Optional
|
|
370
|
-
}, {
|
|
371
|
-
type: Inject,
|
|
372
|
-
args: [FORM_CUSTOM_COMPONENT_TOKEN]
|
|
373
|
-
}] }, { type: i7.UrlResolverService }], propDecorators: { form: [{
|
|
374
|
-
type: ViewChild,
|
|
375
|
-
args: ['form']
|
|
376
|
-
}], formViewModelDynamicContainer: [{
|
|
377
|
-
type: ViewChild,
|
|
378
|
-
args: ['formViewModelComponent', { static: false, read: ViewContainerRef }]
|
|
379
|
-
}], formFlow: [{
|
|
380
|
-
type: ViewChild,
|
|
381
|
-
args: ['formFlow']
|
|
382
|
-
}], formCustomComponentDynamicContainer: [{
|
|
383
|
-
type: ViewChild,
|
|
384
|
-
args: ['formCustomComponent', { static: false, read: ViewContainerRef }]
|
|
385
|
-
}], task: [{
|
|
386
|
-
type: Input
|
|
387
|
-
}], taskAndProcessLink: [{
|
|
388
|
-
type: Input
|
|
389
|
-
}], modalClosed: [{
|
|
390
|
-
type: Input
|
|
391
|
-
}], closeModalEvent: [{
|
|
392
|
-
type: Output
|
|
393
|
-
}], formSubmit: [{
|
|
394
|
-
type: Output
|
|
395
|
-
}], activeChange: [{
|
|
396
|
-
type: Output
|
|
397
|
-
}] } });
|
|
398
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stZGV0YWlsLWNvbnRlbnQvdGFzay1kZXRhaWwtY29udGVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stZGV0YWlsLWNvbnRlbnQvdGFzay1kZXRhaWwtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE9BQU8sRUFBQyxlQUFlLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFFdEUsT0FBTyxFQUVMLFlBQVksRUFDWixpQkFBaUIsR0FLbEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQWdCLHFCQUFxQixFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFDTCwyQkFBMkIsRUFLM0IsaUJBQWlCLEdBTWxCLE1BQU0sdUJBQXVCLENBQUM7QUFJL0IsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBYyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRSxNQUFNLE1BQU0sQ0FBQztBQUdu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NE5BR25CLGdCQUFnQiw2QkNoRjFFLHE4RkFzRkEsMkNEYlksWUFBWSx5TEFBRSxZQUFZLDJOQUFFLGVBQWUsNEZBQUUsaUJBQWlCOzs0RkFFN0QsMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNFLDZCQUE2QixjQUUzQixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQzs7MEJBc0Z0RSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQ3hDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMkJBQTJCOzBFQXBGOUIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNO2dCQUVWLDZCQUE2QjtzQkFEbkMsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFDO2dCQUU5QyxRQUFRO3NCQUFyQyxTQUFTO3VCQUFDLFVBQVU7Z0JBRWQsbUNBQW1DO3NCQUR6QyxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUM7Z0JBRXJELElBQUk7c0JBQXZCLEtBQUs7Z0JBS2Msa0JBQWtCO3NCQUFyQyxLQUFLO2dCQUtjLFdBQVc7c0JBQTlCLEtBQUs7Z0JBUW9CLGVBQWU7c0JBQXhDLE1BQU07Z0JBQ21CLFVBQVU7c0JBQW5DLE1BQU07Z0JBQ21CLFlBQVk7c0JBQXJDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7UmVjZW50bHlWaWV3ZWQxNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge0Zvcm1pb0Zvcm19IGZyb20gJ0Bmb3JtaW8vYW5ndWxhcic7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1Blcm1pc3Npb25TZXJ2aWNlfSBmcm9tICdAdmFsdGltby9hY2Nlc3MtY29udHJvbCc7XG5pbXBvcnQge1xuICBGb3JtaW9Db21wb25lbnQsXG4gIEZvcm1Jb01vZHVsZSxcbiAgRm9ybWlvT3B0aW9uc0ltcGwsXG4gIEZvcm1Jb1N0YXRlU2VydmljZSxcbiAgRm9ybWlvU3VibWlzc2lvbixcbiAgVmFsdGltb0Zvcm1pb09wdGlvbnMsXG4gIFZhbHRpbW9Nb2RhbFNlcnZpY2UsXG59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlLCBGT1JNX1ZJRVdfTU9ERUxfVE9LRU4sIEZvcm1WaWV3TW9kZWx9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge0RvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtcbiAgRk9STV9DVVNUT01fQ09NUE9ORU5UX1RPS0VOLFxuICBGb3JtQ3VzdG9tQ29tcG9uZW50LFxuICBGb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnLFxuICBGb3JtRmxvd0NvbXBvbmVudCxcbiAgRm9ybVN1Ym1pc3Npb25SZXN1bHQsXG4gIFByb2Nlc3NMaW5rTW9kdWxlLFxuICBQcm9jZXNzTGlua1NlcnZpY2UsXG4gIFRhc2tQcm9jZXNzTGlua1Jlc3VsdCxcbiAgVGFza1Byb2Nlc3NMaW5rVHlwZSxcbiAgVGFza1dpdGhQcm9jZXNzTGluayxcbiAgVXJsUmVzb2x2ZXJTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9wcm9jZXNzLWxpbmsnO1xuaW1wb3J0IHtJY29uU2VydmljZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge05HWExvZ2dlcn0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQge1RvYXN0clNlcnZpY2V9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBzd2l0Y2hNYXAsIHRha2UsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SW50ZXJtZWRpYXRlU3VibWlzc2lvbiwgVGFza30gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7VGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLCBUYXNrU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtDQU5fQVNTSUdOX1RBU0tfUEVSTUlTU0lPTiwgVEFTS19ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRX0gZnJvbSAnLi4vLi4vdGFzay1wZXJtaXNzaW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1kZXRhaWwtY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXNrLWRldGFpbC1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1Jb01vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBQcm9jZXNzTGlua01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tEZXRhaWxDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdmb3JtJykgZm9ybTogRm9ybWlvQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdmb3JtVmlld01vZGVsQ29tcG9uZW50Jywge3N0YXRpYzogZmFsc2UsIHJlYWQ6IFZpZXdDb250YWluZXJSZWZ9KVxuICBwdWJsaWMgZm9ybVZpZXdNb2RlbER5bmFtaWNDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Zvcm1GbG93JykgcHVibGljIGZvcm1GbG93OiBGb3JtRmxvd0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZm9ybUN1c3RvbUNvbXBvbmVudCcsIHtzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcbiAgcHVibGljIGZvcm1DdXN0b21Db21wb25lbnREeW5hbWljQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IHRhc2sodmFsdWU6IFRhc2sgfCBudWxsKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuXG4gICAgdGhpcy5sb2FkVGFza0RldGFpbHModmFsdWUpO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdGFza0FuZFByb2Nlc3NMaW5rKHZhbHVlOiBUYXNrV2l0aFByb2Nlc3NMaW5rIHwgbnVsbCkge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgIHRoaXMubG9hZFRhc2tEZXRhaWxzKHZhbHVlLnRhc2sgYXMgYW55LCB2YWx1ZS5wcm9jZXNzTGlua0FjdGl2aXR5UmVzdWx0KTtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IG1vZGFsQ2xvc2VkKGNsb3NlZDogYm9vbGVhbikge1xuICAgIC8vIHNhdmUgZm9ybSBmbG93IGRhdGEgb24gbW9kYWwgY2xvc2VkXG4gICAgaWYgKHRoaXMuZm9ybUZsb3cpIHRoaXMuZm9ybUZsb3cuc2F2ZURhdGEoKTtcblxuICAgIGlmIChjbG9zZWQpIHtcbiAgICAgIHRoaXMuY2xvc2VNb2RhbEV2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBjbG9zZU1vZGFsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhbkFzc2lnblVzZXJUb1Rhc2skID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBlcnJvck1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1EZWZpbml0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybWlvRm9ybSB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybURlZmluaXRpb25JZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUZsb3dJbnN0YW5jZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtaW9PcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VmFsdGltb0Zvcm1pb09wdGlvbnMgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1Jb0Zvcm1EYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHN1Ym1pc3Npb24kID0gdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc3VibWlzc2lvbiQ7XG4gIHB1YmxpYyByZWFkb25seSB0YXNrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFzayB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFza0luc3RhbmNlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcHVibGljIGludGVybWVkaWF0ZVNhdmVFbmFibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGFza1Byb2Nlc3NMaW5rVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhc2tQcm9jZXNzTGlua1R5cGUgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHByb2Nlc3NMaW5rSXNGb3JtJCA9IHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUoXG4gICAgbWFwKCh0eXBlOiBzdHJpbmcgfCBudWxsKSA9PiB0eXBlID09PSAnZm9ybScpXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwcm9jZXNzTGlua0lzRm9ybVZpZXdNb2RlbCQgPSB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5waXBlKFxuICAgIG1hcCgodHlwZTogc3RyaW5nIHwgbnVsbCkgPT4gdHlwZSA9PT0gJ2Zvcm0tdmlldy1tb2RlbCcpXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBwcm9jZXNzTGlua0lzRm9ybUZsb3ckID0gdGhpcy5fdGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShcbiAgICBtYXAoKHR5cGU6IHN0cmluZyB8IG51bGwpID0+IHR5cGUgPT09ICdmb3JtLWZsb3cnKVxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvY2Vzc0xpbmtJc1VpQ29tcG9uZW50JCA9IHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLnBpcGUoXG4gICAgbWFwKCh0eXBlOiBzdHJpbmcgfCBudWxsKSA9PiB0eXBlID09PSAndWktY29tcG9uZW50JylcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9wcm9jZXNzTGlua0lkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1DdXN0b21Db21wb25lbnRDb25maWckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBGb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnIHwge31cbiAgPih7fSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdmlld0luaXRpYWxpemVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyBnZXQgdmlld0luaXRpYWxpemVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fdmlld0luaXRpYWxpemVkJC5waXBlKGZpbHRlcihpbml0aWFsaXplZCA9PiBpbml0aWFsaXplZCkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VydmljZTogSWNvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IE5HWExvZ2dlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogVmFsdGltb01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2Nlc3NMaW5rU2VydmljZTogUHJvY2Vzc0xpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IEZvcm1Jb1N0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZTogVGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZPUk1fVklFV19NT0RFTF9UT0tFTikgcHJpdmF0ZSByZWFkb25seSBmb3JtVmlld01vZGVsOiBGb3JtVmlld01vZGVsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRk9STV9DVVNUT01fQ09NUE9ORU5UX1RPS0VOKSBwcml2YXRlIHJlYWRvbmx5IGZvcm1DdXN0b21Db21wb25lbnRDb25maWc6IEZvcm1DdXN0b21Db21wb25lbnRDb25maWcsXG4gICAgcHJpdmF0ZSByZWFkb25seSB1cmxSZXNvbHZlclNlcnZpY2U6IFVybFJlc29sdmVyU2VydmljZVxuICApIHtcbiAgICB0aGlzLmludGVybWVkaWF0ZVNhdmVFbmFibGVkID0gISF0aGlzLmNvbmZpZ1NlcnZpY2UuZmVhdHVyZVRvZ2dsZXM/LmVuYWJsZUludGVybWVkaWF0ZVNhdmU7XG5cbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtSZWNlbnRseVZpZXdlZDE2XSk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gbmV3IEZvcm1pb09wdGlvbnNJbXBsKCk7XG4gICAgb3B0aW9ucy5kaXNhYmxlQWxlcnRzID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1pb09wdGlvbnMkLm5leHQob3B0aW9ucyk7XG4gICAgdGhpcy5fZm9ybUN1c3RvbUNvbXBvbmVudENvbmZpZyQubmV4dChmb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnKTtcbiAgfVxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGVybWlzc2lvblN1YnNjcmlwdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zZXRTdWJtaXNzaW9uKHt9KTtcbiAgICB0aGlzLl92aWV3SW5pdGlhbGl6ZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3SW5pdGlhbGl6ZWQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25TdWJtaXQoc3VibWlzc2lvbjogRm9ybWlvU3VibWlzc2lvbik6IHZvaWQge1xuICAgIGlmIChzdWJtaXNzaW9uLmRhdGEpIHtcbiAgICAgIHRoaXMudGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLnNldEZvcm1Jb0Zvcm1EYXRhKHN1Ym1pc3Npb24uZGF0YSk7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KHN1Ym1pc3Npb24uZGF0YSk7XG4gICAgfVxuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5fcHJvY2Vzc0xpbmtJZCQsIHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLCB0aGlzLnRhc2skXSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJvY2Vzc0xpbmtJZCwgdGFza1Byb2Nlc3NMaW5rVHlwZSwgdGFza10pID0+IHtcbiAgICAgICAgaWYgKHRhc2tQcm9jZXNzTGlua1R5cGUgPT09ICdmb3JtJykge1xuICAgICAgICAgIGlmIChwcm9jZXNzTGlua0lkKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMaW5rU2VydmljZVxuICAgICAgICAgICAgICAuc3VibWl0Rm9ybShwcm9jZXNzTGlua0lkLCBzdWJtaXNzaW9uLmRhdGEsIHRhc2s/LmJ1c2luZXNzS2V5LCB0YXNrPy5pZClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKF86IEZvcm1TdWJtaXNzaW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcnMgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGFza1Byb2Nlc3NMaW5rVHlwZSA9PT0gJ2Zvcm0tdmlldy1tb2RlbCcpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY29tcGxldGVUYXNrKHRhc2s6IFRhc2sgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0YXNrKSByZXR1cm47XG5cbiAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFxuICAgICAgYCR7dGFzay5uYW1lfSAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd0YXNrRGV0YWlsLnRhc2tDb21wbGV0ZWQnKX1gXG4gICAgKTtcbiAgICB0aGlzLnRhc2skLm5leHQobnVsbCk7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoKTtcbiAgICB0aGlzLmNsb3NlTW9kYWxFdmVudC5lbWl0KCk7XG4gICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5mb3JtRmxvdykgdGhpcy5mb3JtRmxvdy5zYXZlRGF0YSgpO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuZGF0YSkge1xuICAgICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc2V0Rm9ybUlvRm9ybURhdGEoZXZlbnQuZGF0YSk7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KGV2ZW50LmRhdGEpO1xuICAgICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Gb3JtRmxvd0NoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRUYXNrRGV0YWlscyh0YXNrOiBUYXNrLCBwcm9jZXNzTGluaz86IFRhc2tQcm9jZXNzTGlua1Jlc3VsdCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRUYXNrUHJvY2Vzc0xpbmtUeXBlKCk7XG4gICAgdGhpcy5yZXNldEZvcm1EZWZpbml0aW9uKCk7XG5cbiAgICB0aGlzLnRhc2tJbnN0YW5jZUlkJC5uZXh0KHRhc2suaWQpO1xuXG4gICAgaWYgKCFwcm9jZXNzTGluaykge1xuICAgICAgdGhpcy5nZXRUYXNrUHJvY2Vzc0xpbmsodGFzay5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0VGFza1Byb2Nlc3NMaW5rKHByb2Nlc3NMaW5rKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzayk7XG4gICAgY29uc3QgZG9jdW1lbnRJZCA9IHRhc2suYnVzaW5lc3NLZXk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RG9jdW1lbnRJZChkb2N1bWVudElkKTtcblxuICAgIHRoaXMudGFzayQubmV4dCh0YXNrKTtcbiAgICB0aGlzLnBhZ2UkLm5leHQoe1xuICAgICAgdGl0bGU6IHRhc2submFtZSxcbiAgICAgIHN1YnRpdGxlOiBgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndGFza0RldGFpbC50YXNrQ3JlYXRlZCcpfSAke3Rhc2suY3JlYXRlZH1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50UHJvZ3Jlc3MoZm9ybVZpZXdNb2RlbENvbXBvbmVudFJlZj86IENvbXBvbmVudFJlZjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy50YXNrSW5zdGFuY2VJZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIodmFsdWUgPT4gISF2YWx1ZSksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodGFza0luc3RhbmNlSWQ6IHN0cmluZyB8IG51bGwpID0+XG4gICAgICAgICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2UuZ2V0SW50ZXJtZWRpYXRlU3VibWlzc2lvbih0YXNrSW5zdGFuY2VJZCA/PyAnJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChpbnRlcm1lZGlhdGVTdWJtaXNzaW9uOiBJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKSA9PiB7XG4gICAgICAgICAgdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc2V0U3VibWlzc2lvbih7XG4gICAgICAgICAgICBkYXRhOiBpbnRlcm1lZGlhdGVTdWJtaXNzaW9uPy5zdWJtaXNzaW9uIHx8IHt9LFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGZvcm1WaWV3TW9kZWxDb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIGZvcm1WaWV3TW9kZWxDb21wb25lbnRSZWYuaW5zdGFuY2Uuc3VibWlzc2lvbiA9IHtcbiAgICAgICAgICAgICAgZGF0YTogaW50ZXJtZWRpYXRlU3VibWlzc2lvbi5zdWJtaXNzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFza1Byb2Nlc3NMaW5rKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50YXNrU2VydmljZS5nZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogcmVzID0+IHtcbiAgICAgICAgdGhpcy5zZXRUYXNrUHJvY2Vzc0xpbmsocmVzKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogXyA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUYXNrUHJvY2Vzc0xpbmsocHJvY2Vzc0xpbmtSZXN1bHQ6IFRhc2tQcm9jZXNzTGlua1Jlc3VsdCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocHJvY2Vzc0xpbmtSZXN1bHQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocHJvY2Vzc0xpbmtSZXN1bHQ/LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgdGhpcy5fdGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NMaW5rSWQkLm5leHQocHJvY2Vzc0xpbmtSZXN1bHQucHJvY2Vzc0xpbmtJZCk7XG4gICAgICAgICAgaWYgKHRoaXMuaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQpIHRoaXMuZ2V0Q3VycmVudFByb2dyZXNzKCk7XG4gICAgICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbihwcm9jZXNzTGlua1Jlc3VsdC5wcm9wZXJ0aWVzLnByZWZpbGxlZEZvcm0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmb3JtLWZsb3cnOlxuICAgICAgICAgIHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0tZmxvdycpO1xuICAgICAgICAgIHRoaXMuZm9ybUZsb3dJbnN0YW5jZUlkJC5uZXh0KHByb2Nlc3NMaW5rUmVzdWx0LnByb3BlcnRpZXMuZm9ybUZsb3dJbnN0YW5jZUlkID8/ICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZm9ybS12aWV3LW1vZGVsJzpcbiAgICAgICAgICB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtLXZpZXctbW9kZWwnKTtcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzTGlua0lkJC5uZXh0KHByb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rSWQpO1xuICAgICAgICAgIHRoaXMuZm9ybURlZmluaXRpb24kLm5leHQocHJvY2Vzc0xpbmtSZXN1bHQucHJvcGVydGllcy5mb3JtRGVmaW5pdGlvbik7XG4gICAgICAgICAgdGhpcy5mb3JtTmFtZSQubmV4dChwcm9jZXNzTGlua1Jlc3VsdC5wcm9wZXJ0aWVzLmZvcm1OYW1lID8/ICcnKTtcbiAgICAgICAgICB0aGlzLnNldEZvcm1WaWV3TW9kZWxDb21wb25lbnQoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgICB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCd1cmwnKTtcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzTGlua0lkJC5uZXh0KHByb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rSWQpO1xuICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMucHJvY2Vzc0xpbmtTZXJ2aWNlLmdldFZhcmlhYmxlcygpLCB0aGlzLnRhc2skXSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbdmFyaWFibGVzLCB0YXNrXSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgdXJsID0gdGhpcy51cmxSZXNvbHZlclNlcnZpY2UucmVzb2x2ZVVybFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBwcm9jZXNzTGlua1Jlc3VsdC5wcm9wZXJ0aWVzLnVybCxcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXMudmFyaWFibGVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpLmZvY3VzKCk7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpbmtTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnN1Ym1pdFVSTFByb2Nlc3NMaW5rKHByb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rSWQsIHRhc2suYnVzaW5lc3NLZXksIHRhc2suaWQpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd1aS1jb21wb25lbnQnOlxuICAgICAgICAgIHRoaXMuX3Rhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ3VpLWNvbXBvbmVudCcpO1xuICAgICAgICAgIHRoaXMuX3Byb2Nlc3NMaW5rSWQkLm5leHQocHJvY2Vzc0xpbmtSZXN1bHQucHJvY2Vzc0xpbmtJZCk7XG4gICAgICAgICAgdGhpcy5mb3JtRGVmaW5pdGlvbiQubmV4dChudWxsKTtcbiAgICAgICAgICB0aGlzLmZvcm1OYW1lJC5uZXh0KCcnKTtcbiAgICAgICAgICB0aGlzLnNldEZvcm1DdXN0b21Db21wb25lbnQocHJvY2Vzc0xpbmtSZXN1bHQucHJvcGVydGllcy5jb21wb25lbnRLZXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlblBlcm1pc3Npb25TdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc2skLnN1YnNjcmliZSh0YXNrID0+IHtcbiAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgaWYgdXNlciBhbGxvd2VkIHRvIGFzc2lnbiBhIHVzZXIgdG8gVGFzayB3aXRoIGlkOicsIHRhc2suaWQpO1xuICAgICAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2VcbiAgICAgICAgICAgIC5yZXF1ZXN0UGVybWlzc2lvbihDQU5fQVNTSUdOX1RBU0tfUEVSTUlTU0lPTiwge1xuICAgICAgICAgICAgICByZXNvdXJjZTogVEFTS19ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRS50YXNrLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyOiB0YXNrLmlkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFsbG93ZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5jYW5Bc3NpZ25Vc2VyVG9UYXNrJC5uZXh0KGFsbG93ZWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1Jlc2V0IGlzIHVzZXIgYWxsb3dlZCB0byBhc3NpZ24gYSB1c2VyIHRvIFRhc2sgYXMgdGFzayBpcyBudWxsJyk7XG4gICAgICAgICAgdGhpcy5jYW5Bc3NpZ25Vc2VyVG9UYXNrJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtRGVmaW5pdGlvbihmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgIHRoaXMuZm9ybURlZmluaXRpb24kLm5leHQoZm9ybURlZmluaXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtVmlld01vZGVsQ29tcG9uZW50KCkge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX3ZpZXdJbml0aWFsaXplZCQsIHRoaXMucHJvY2Vzc0xpbmtJc0Zvcm1WaWV3TW9kZWwkXSkuc3Vic2NyaWJlKFxuICAgICAgKFt2aWV3SW5pdGlhbGl6ZWQsIGlzRnZtXSkgPT4ge1xuICAgICAgICBpZiAodmlld0luaXRpYWxpemVkICYmIGlzRnZtKSB7XG4gICAgICAgICAgdGhpcy5mb3JtVmlld01vZGVsRHluYW1pY0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgIGlmICghdGhpcy5mb3JtVmlld01vZGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZvcm1WaWV3TW9kZWxDb21wb25lbnQgPSB0aGlzLmZvcm1WaWV3TW9kZWxEeW5hbWljQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChcbiAgICAgICAgICAgIHRoaXMuZm9ybVZpZXdNb2RlbC5jb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcm1WaWV3TW9kZWxDb21wb25lbnQuaW5zdGFuY2UuZm9ybSA9IHRoaXMuZm9ybURlZmluaXRpb24kLmdldFZhbHVlKCk7XG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS5mb3JtTmFtZSA9IHRoaXMuZm9ybU5hbWUkLmdldFZhbHVlKCk7XG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS50YXNrSW5zdGFuY2VJZCA9IHRoaXMudGFza0luc3RhbmNlSWQkLmdldFZhbHVlKCk7XG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS5pc1N0YXJ0Rm9ybSA9IGZhbHNlO1xuXG4gICAgICAgICAgZm9ybVZpZXdNb2RlbENvbXBvbmVudC5pbnN0YW5jZS5mb3JtU3VibWl0XG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMudGFzayQpLFxuICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh0YXNrOiBUYXNrIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzayh0YXNrKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgICBmb3JtVmlld01vZGVsQ29tcG9uZW50Lmluc3RhbmNlLnN1Ym1pc3Npb24kLnN1YnNjcmliZShzdWJtaXNzaW9uID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zZXRTdWJtaXNzaW9uKHN1Ym1pc3Npb24pO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKChzdWJtaXNzaW9uPykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdWJtaXNzaW9uPy5kYXRhICYmIE9iamVjdC5rZXlzKHN1Ym1pc3Npb24uZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICBmb3JtVmlld01vZGVsQ29tcG9uZW50Lmluc3RhbmNlLnN1Ym1pc3Npb24gPSB7ZGF0YToge319O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmdldEN1cnJlbnRQcm9ncmVzcyhmb3JtVmlld01vZGVsQ29tcG9uZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGZvcm1WaWV3TW9kZWxDb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Rm9ybUN1c3RvbUNvbXBvbmVudChmb3JtQ3VzdG9tQ29tcG9uZW50S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLl92aWV3SW5pdGlhbGl6ZWQkLCB0aGlzLnByb2Nlc3NMaW5rSXNVaUNvbXBvbmVudCRdKS5zdWJzY3JpYmUoXG4gICAgICAoW3ZpZXdJbml0aWFsaXplZCwgaXNVaUNvbXBvbmVudF0pID0+IHtcbiAgICAgICAgaWYgKHZpZXdJbml0aWFsaXplZCAmJiBpc1VpQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50RHluYW1pY0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgIGlmICghdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZW5kZXJlZENvbXBvbmVudDpDb21wb25lbnRSZWY8Rm9ybUN1c3RvbUNvbXBvbmVudD47XG4gICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgICAgICB0aGlzLl9mb3JtQ3VzdG9tQ29tcG9uZW50Q29uZmlnJC5zdWJzY3JpYmUoZm9ybUN1c3RvbUNvbXBvbmVudENvbmZpZyA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUNvbXBvbmVudCA9IGZvcm1DdXN0b21Db21wb25lbnRDb25maWdbZm9ybUN1c3RvbUNvbXBvbmVudEtleV07XG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50ID0gdGhpcy5mb3JtQ3VzdG9tQ29tcG9uZW50RHluYW1pY0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50XG4gICAgICAgICAgICAgICkgYXMgQ29tcG9uZW50UmVmPEZvcm1DdXN0b21Db21wb25lbnQ+O1xuXG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50Lmluc3RhbmNlLnRhc2tJbnN0YW5jZUlkID0gdGhpcy50YXNrSW5zdGFuY2VJZCQudmFsdWU7XG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50Lmluc3RhbmNlLnN1Ym1pdHRlZEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZU1vZGFsRXZlbnQuZW1pdCgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbEV2ZW50LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlbmRlcmVkQ29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybURlZmluaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtRGVmaW5pdGlvbiQubmV4dChudWxsKTtcbiAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGFza1Byb2Nlc3NMaW5rVHlwZSgpOiB2b2lkIHtcbiAgICB0aGlzLl90YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3Byb2Nlc3NMaW5rSWQkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzazogVGFzayk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlXG4gICAgICAuZ2V0UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbkZyb21Qcm9jZXNzSW5zdGFuY2VJZCh0YXNrLnByb2Nlc3NJbnN0YW5jZUlkKVxuICAgICAgLnN1YnNjcmliZShwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9IHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24uaWQuZG9jdW1lbnREZWZpbml0aW9uSWQubmFtZTtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2V0RG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lKTtcbiAgICAgICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgbG9hZGluZzogbG9hZGluZyQgfCBhc3luYyxcbiAgICBwYWdlOiBwYWdlJCB8IGFzeW5jLFxuICAgIHRhc2s6IHRhc2skIHwgYXN5bmMsXG4gICAgdGFza0lkOiB0YXNrSW5zdGFuY2VJZCQgfCBhc3luYyxcbiAgICBmb3JtRGVmaW5pdGlvbjogZm9ybURlZmluaXRpb24kIHwgYXN5bmMsXG4gICAgZm9ybURlZmluaXRpb25JZDogZm9ybURlZmluaXRpb25JZCQgfCBhc3luYyxcbiAgICBmb3JtTmFtZTogZm9ybU5hbWUkIHwgYXN5bmMsXG4gICAgZm9ybUlvRm9ybURhdGE6IGZvcm1Jb0Zvcm1EYXRhJCB8IGFzeW5jLFxuICAgIHN1Ym1pc3Npb246IHN1Ym1pc3Npb24kIHwgYXN5bmMsXG4gICAgcHJvY2Vzc0xpbmtJc0Zvcm06IHByb2Nlc3NMaW5rSXNGb3JtJCB8IGFzeW5jLFxuICAgIHByb2Nlc3NMaW5rSXNGb3JtVmlld01vZGVsOiBwcm9jZXNzTGlua0lzRm9ybVZpZXdNb2RlbCQgfCBhc3luYyxcbiAgICBwcm9jZXNzTGlua0lzVWlDb21wb25lbnQ6IHByb2Nlc3NMaW5rSXNVaUNvbXBvbmVudCQgfCBhc3luYyxcbiAgICBmb3JtaW9PcHRpb25zOiBmb3JtaW9PcHRpb25zJCB8IGFzeW5jLFxuICAgIHByb2Nlc3NMaW5rSXNGb3JtRmxvdzogcHJvY2Vzc0xpbmtJc0Zvcm1GbG93JCB8IGFzeW5jLFxuICAgIGZvcm1GbG93SW5zdGFuY2VJZDogZm9ybUZsb3dJbnN0YW5jZUlkJCB8IGFzeW5jLFxuICAgIGVycm9yTWVzc2FnZTogZXJyb3JNZXNzYWdlJCB8IGFzeW5jLFxuICAgIGNhbkFzc2lnblVzZXJUb1Rhc2s6IGNhbkFzc2lnblVzZXJUb1Rhc2skIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPHZhbHRpbW8tZm9ybS1pb1xuICAgICNmb3JtXG4gICAgKm5nSWY9XCJvYnMuZm9ybURlZmluaXRpb24gJiYgb2JzLnByb2Nlc3NMaW5rSXNGb3JtICYmICFvYnMucHJvY2Vzc0xpbmtJc1VpQ29tcG9uZW50ICYmICFvYnMucHJvY2Vzc0xpbmtJc0Zvcm1WaWV3TW9kZWxcIlxuICAgIFtmb3JtXT1cIm9icy5mb3JtRGVmaW5pdGlvblwiXG4gICAgW3N1Ym1pc3Npb25dPVwib2JzLnN1Ym1pc3Npb25cIlxuICAgIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICBbb3B0aW9uc109XCJvYnMuZm9ybWlvT3B0aW9uc1wiXG4gID48L3ZhbHRpbW8tZm9ybS1pbz5cblxuICA8dmFsdGltby1mb3JtLWZsb3dcbiAgICAjZm9ybUZsb3dcbiAgICAqbmdJZj1cIm9icy5wcm9jZXNzTGlua0lzRm9ybUZsb3dcIlxuICAgIFtmb3JtSW9Gb3JtRGF0YV09XCJmb3JtSW9Gb3JtRGF0YSRcIlxuICAgIFtmb3JtRmxvd0luc3RhbmNlSWRdPVwib2JzLmZvcm1GbG93SW5zdGFuY2VJZFwiXG4gICAgKGZvcm1GbG93Q29tcGxldGUpPVwiY29tcGxldGVUYXNrKG9icy50YXNrKVwiXG4gICAgKGZvcm1GbG93Q2hhbmdlKT1cIm9uRm9ybUZsb3dDaGFuZ2VFdmVudCgpXCJcbiAgPjwvdmFsdGltby1mb3JtLWZsb3c+XG5cbiAgPGRpdiAqbmdJZj1cIm9icy5sb2FkaW5nXCIgY2xhc3M9XCJ0ZXh0LWJsYWNrIG1iLTAgcC0zIHRleHQtY2VudGVyXCI+XG4gICAge3sgJ2Zvcm1NYW5hZ2VtZW50LmxvYWRpbmcnIHwgdHJhbnNsYXRlIH19XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cIlxuICAgICAgb2JzLmxvYWRpbmcgPT09IGZhbHNlICYmXG4gICAgICAhb2JzLmZvcm1EZWZpbml0aW9uICYmXG4gICAgICAhb2JzLmZvcm1GbG93SW5zdGFuY2VJZCAmJlxuICAgICAgIW9icy5lcnJvck1lc3NhZ2UgJiZcbiAgICAgICFvYnMucHJvY2Vzc0xpbmtJc1VpQ29tcG9uZW50XG4gICAgXCJcbiAgICBjbGFzcz1cImJnLXdhcm5pbmcgdGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiXG4gID5cbiAgICB7e1xuICAgICAgKGlzQWRtaW4kIHwgYXN5bmMpXG4gICAgICAgID8gKCdmb3JtTWFuYWdlbWVudC5ub0Zvcm1EZWZpbml0aW9uRm91bmRBZG1pbicgfCB0cmFuc2xhdGUpXG4gICAgICAgIDogKCdmb3JtTWFuYWdlbWVudC5ub0Zvcm1EZWZpbml0aW9uRm91bmRVc2VyJyB8IHRyYW5zbGF0ZSlcbiAgICB9fVxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwib2JzLmVycm9yTWVzc2FnZVwiIGNsYXNzPVwiYmctZGFuZ2VyIHRleHQtYmxhY2sgbWItMCBwLTMgdGV4dC1jZW50ZXJcIj5cbiAgICB7eyBvYnMuZXJyb3JNZXNzYWdlIH19XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICA8bmctdGVtcGxhdGUgI2Zvcm1WaWV3TW9kZWxDb21wb25lbnQ+PC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2Zvcm1DdXN0b21Db21wb25lbnQ+PC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|