@valtimo/task 12.3.1 → 12.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/assign-user-to-task/assign-user-to-task.component.mjs +8 -5
- package/esm2022/lib/components/task-detail-content/task-detail-content.component.mjs +317 -0
- package/esm2022/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.mjs +144 -0
- package/esm2022/lib/components/task-detail-modal/task-detail-modal.component.mjs +53 -272
- package/esm2022/lib/components/task-list/task-list.component.mjs +3 -3
- package/esm2022/lib/models/task.model.mjs +1 -1
- package/esm2022/lib/services/index.mjs +2 -1
- package/esm2022/lib/services/task-intermediate-save.service.mjs +18 -3
- package/esm2022/lib/task.module.mjs +17 -6
- package/esm2022/public_api.mjs +9 -6
- package/fesm2022/valtimo-task.mjs +635 -403
- 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/assign-user-to-task/assign-user-to-task.component.d.ts.map +1 -1
- package/lib/components/task-detail-content/task-detail-content.component.d.ts +79 -0
- package/lib/components/task-detail-content/task-detail-content.component.d.ts.map +1 -0
- package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts +41 -0
- package/lib/components/task-detail-intermediate-save/task-detail-intermediate-save.component.d.ts.map +1 -0
- package/lib/components/task-detail-modal/task-detail-modal.component.d.ts +22 -65
- package/lib/components/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
- package/lib/models/task.model.d.ts +5 -1
- package/lib/models/task.model.d.ts.map +1 -1
- package/lib/services/index.d.ts +1 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/task-intermediate-save.service.d.ts +7 -1
- package/lib/services/task-intermediate-save.service.d.ts.map +1 -1
- package/lib/task.module.d.ts +14 -12
- package/lib/task.module.d.ts.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +8 -5
- package/public_api.d.ts.map +1 -1
|
@@ -0,0 +1,144 @@
|
|
|
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, Input, Output, signal, } from '@angular/core';
|
|
18
|
+
import { RecentlyViewed16 } from '@carbon/icons';
|
|
19
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
20
|
+
import { ConfirmationModalModule, TooltipModule } from '@valtimo/components';
|
|
21
|
+
import { ButtonModule, IconModule, ModalModule } from 'carbon-components-angular';
|
|
22
|
+
import moment from 'moment';
|
|
23
|
+
import { BehaviorSubject, combineLatest, switchMap, take } from 'rxjs';
|
|
24
|
+
import * as i0 from "@angular/core";
|
|
25
|
+
import * as i1 from "@valtimo/config";
|
|
26
|
+
import * as i2 from "carbon-components-angular";
|
|
27
|
+
import * as i3 from "@ngx-translate/core";
|
|
28
|
+
import * as i4 from "../../services";
|
|
29
|
+
import * as i5 from "ngx-toastr";
|
|
30
|
+
import * as i6 from "@angular/common";
|
|
31
|
+
import * as i7 from "@valtimo/components";
|
|
32
|
+
export class TaskDetailIntermediateSaveComponent {
|
|
33
|
+
set task(value) {
|
|
34
|
+
if (!value)
|
|
35
|
+
return;
|
|
36
|
+
this.taskService
|
|
37
|
+
.getTaskProcessLink(value.id)
|
|
38
|
+
.pipe(take(1))
|
|
39
|
+
.subscribe(res => {
|
|
40
|
+
if (res !== null && res.type === 'form-flow')
|
|
41
|
+
this.formFlowInstanceId$.next(res.properties.formFlowInstanceId);
|
|
42
|
+
});
|
|
43
|
+
this.taskValue.set(value);
|
|
44
|
+
this.page.set({
|
|
45
|
+
title: value.name,
|
|
46
|
+
subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${value.created}`,
|
|
47
|
+
});
|
|
48
|
+
this.getCurrentProgress(value);
|
|
49
|
+
}
|
|
50
|
+
constructor(configService, iconService, translateService, taskIntermediateSaveService, taskService, toastr) {
|
|
51
|
+
this.configService = configService;
|
|
52
|
+
this.iconService = iconService;
|
|
53
|
+
this.translateService = translateService;
|
|
54
|
+
this.taskIntermediateSaveService = taskIntermediateSaveService;
|
|
55
|
+
this.taskService = taskService;
|
|
56
|
+
this.toastr = toastr;
|
|
57
|
+
this.currentIntermediateSaveEvent = new EventEmitter();
|
|
58
|
+
this.showModalEvent = new EventEmitter();
|
|
59
|
+
this.formFlowInstanceId$ = new BehaviorSubject(undefined);
|
|
60
|
+
this.showConfirmationModal$ = new BehaviorSubject(false);
|
|
61
|
+
this.taskValue = signal(null);
|
|
62
|
+
this.page = signal(null);
|
|
63
|
+
this.canAssignUserToTask = signal(false);
|
|
64
|
+
this.submission$ = this.taskIntermediateSaveService.submission$;
|
|
65
|
+
this.formIoFormData$ = this.taskIntermediateSaveService.formIoFormData$;
|
|
66
|
+
this.intermediateSaveEnabled = false;
|
|
67
|
+
this.currentIntermediateSave = null;
|
|
68
|
+
this.intermediateSaveEnabled = !!this.configService.featureToggles?.enableIntermediateSave;
|
|
69
|
+
this.iconService.registerAll([RecentlyViewed16]);
|
|
70
|
+
}
|
|
71
|
+
saveCurrentProgress() {
|
|
72
|
+
combineLatest([this.submission$, this.formIoFormData$])
|
|
73
|
+
.pipe(switchMap(([submission, formIoFormData]) => {
|
|
74
|
+
const intermediateSaveRequest = {
|
|
75
|
+
submission: submission?.data ? submission.data : formIoFormData,
|
|
76
|
+
taskInstanceId: this.taskValue()?.id ?? '',
|
|
77
|
+
};
|
|
78
|
+
return this.taskIntermediateSaveService.storeIntermediateSubmission(intermediateSaveRequest);
|
|
79
|
+
}), take(1))
|
|
80
|
+
.subscribe({
|
|
81
|
+
next: intermediateSubmission => {
|
|
82
|
+
this.toastr.success(this.translateService.instant('formManagement.intermediateSave.success'));
|
|
83
|
+
this.currentIntermediateSave = this.formatIntermediateSubmission(intermediateSubmission);
|
|
84
|
+
this.currentIntermediateSaveEvent.emit(this.currentIntermediateSave);
|
|
85
|
+
},
|
|
86
|
+
error: () => {
|
|
87
|
+
this.toastr.error(this.translateService.instant('formManagement.intermediateSave.error'));
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
revertSaveClick() {
|
|
92
|
+
if (this.showModalEvent.observed) {
|
|
93
|
+
this.showModalEvent.emit();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.showConfirmationModal$.next(true);
|
|
97
|
+
}
|
|
98
|
+
clearCurrentProgress() {
|
|
99
|
+
this.taskIntermediateSaveService
|
|
100
|
+
.clearIntermediateSubmission(this.taskValue()?.id ?? '')
|
|
101
|
+
.pipe(take(1))
|
|
102
|
+
.subscribe(() => {
|
|
103
|
+
this.taskIntermediateSaveService.setSubmission({});
|
|
104
|
+
this.currentIntermediateSave = null;
|
|
105
|
+
this.currentIntermediateSaveEvent.emit(this.currentIntermediateSave);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
formatIntermediateSubmission(intermediateSubmission) {
|
|
109
|
+
intermediateSubmission.createdOn = moment(intermediateSubmission.createdOn).format('DD MMM YYYY HH:mm');
|
|
110
|
+
if (intermediateSubmission.editedOn) {
|
|
111
|
+
intermediateSubmission.editedOn = moment(new Date(intermediateSubmission.editedOn)).format('DD MMM YYYY HH:mm');
|
|
112
|
+
}
|
|
113
|
+
return intermediateSubmission;
|
|
114
|
+
}
|
|
115
|
+
getCurrentProgress(task) {
|
|
116
|
+
this.taskIntermediateSaveService
|
|
117
|
+
.getIntermediateSubmission(task.id ?? '')
|
|
118
|
+
.pipe(take(1))
|
|
119
|
+
.subscribe(intermediateSave => {
|
|
120
|
+
this.currentIntermediateSave = this.formatIntermediateSubmission(intermediateSave);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailIntermediateSaveComponent, deps: [{ token: i1.ConfigService }, { token: i2.IconService }, { token: i3.TranslateService }, { token: i4.TaskIntermediateSaveService }, { token: i4.TaskService }, { token: i5.ToastrService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
124
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TaskDetailIntermediateSaveComponent, isStandalone: true, selector: "valtimo-task-detail-intermediate-save", inputs: { task: "task" }, outputs: { currentIntermediateSaveEvent: "currentIntermediateSaveEvent", showModalEvent: "showModalEvent" }, 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@if (intermediateSaveEnabled && (formFlowInstanceId$ | async) === undefined) {\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"save\"\n [vTooltip]=\"'formManagement.intermediateSave.save' | translate\"\n (click)=\"saveCurrentProgress()\"\n ></button>\n\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"recently-viewed\"\n [disabled]=\"!currentIntermediateSave\"\n [vTooltip]=\"'formManagement.intermediateSave.clear' | translate\"\n (click)=\"revertSaveClick()\"\n ></button>\n}\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"showConfirmationModal$\"\n (confirmEvent)=\"clearCurrentProgress()\"\n (cancelEvent)=\"showConfirmationModal$.next(false)\"\n cancelButtonType=\"ghost\"\n confirmButtonTextTranslationKey=\"interface.confirm\"\n titleTranslationKey=\"formManagement.intermediateSave.clear\"\n contentTranslationKey=\"formManagement.intermediateSave.clearConfirm\"\n></valtimo-confirmation-modal>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: ConfirmationModalModule }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: ModalModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[vTooltip]", inputs: ["vTooltip", "onBottom", "tooltipDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
125
|
+
}
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TaskDetailIntermediateSaveComponent, decorators: [{
|
|
127
|
+
type: Component,
|
|
128
|
+
args: [{ selector: 'valtimo-task-detail-intermediate-save', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
129
|
+
CommonModule,
|
|
130
|
+
TranslateModule,
|
|
131
|
+
ButtonModule,
|
|
132
|
+
ConfirmationModalModule,
|
|
133
|
+
IconModule,
|
|
134
|
+
ModalModule,
|
|
135
|
+
TooltipModule,
|
|
136
|
+
], 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@if (intermediateSaveEnabled && (formFlowInstanceId$ | async) === undefined) {\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"save\"\n [vTooltip]=\"'formManagement.intermediateSave.save' | translate\"\n (click)=\"saveCurrentProgress()\"\n ></button>\n\n <button\n cdsButton=\"ghost\"\n iconOnly=\"true\"\n cdsIcon=\"recently-viewed\"\n [disabled]=\"!currentIntermediateSave\"\n [vTooltip]=\"'formManagement.intermediateSave.clear' | translate\"\n (click)=\"revertSaveClick()\"\n ></button>\n}\n\n<valtimo-confirmation-modal\n [showModalSubject$]=\"showConfirmationModal$\"\n (confirmEvent)=\"clearCurrentProgress()\"\n (cancelEvent)=\"showConfirmationModal$.next(false)\"\n cancelButtonType=\"ghost\"\n confirmButtonTextTranslationKey=\"interface.confirm\"\n titleTranslationKey=\"formManagement.intermediateSave.clear\"\n contentTranslationKey=\"formManagement.intermediateSave.clearConfirm\"\n></valtimo-confirmation-modal>\n" }]
|
|
137
|
+
}], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.IconService }, { type: i3.TranslateService }, { type: i4.TaskIntermediateSaveService }, { type: i4.TaskService }, { type: i5.ToastrService }], propDecorators: { task: [{
|
|
138
|
+
type: Input
|
|
139
|
+
}], currentIntermediateSaveEvent: [{
|
|
140
|
+
type: Output
|
|
141
|
+
}], showModalEvent: [{
|
|
142
|
+
type: Output
|
|
143
|
+
}] } });
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtaW50ZXJtZWRpYXRlLXNhdmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvY29tcG9uZW50cy90YXNrLWRldGFpbC1pbnRlcm1lZGlhdGUtc2F2ZS90YXNrLWRldGFpbC1pbnRlcm1lZGlhdGUtc2F2ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stZGV0YWlsLWludGVybWVkaWF0ZS1zYXZlL3Rhc2stZGV0YWlsLWludGVybWVkaWF0ZS1zYXZlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFM0UsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQWUsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDN0YsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQW1CckUsTUFBTSxPQUFPLG1DQUFtQztJQUM5QyxJQUFv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QUVoQyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsWUFBWTt3QkFDWix1QkFBdUI7d0JBQ3ZCLFVBQVU7d0JBQ1YsV0FBVzt3QkFDWCxhQUFhO3FCQUNkOzJPQUdtQixJQUFJO3NCQUF2QixLQUFLO2dCQWlCb0IsNEJBQTRCO3NCQUFyRCxNQUFNO2dCQUVtQixjQUFjO3NCQUF2QyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtSZWNlbnRseVZpZXdlZDE2fSBmcm9tICdAY2FyYm9uL2ljb25zJztcbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7Q29uZmlybWF0aW9uTW9kYWxNb2R1bGUsIFRvb2x0aXBNb2R1bGV9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtCdXR0b25Nb2R1bGUsIEljb25Nb2R1bGUsIEljb25TZXJ2aWNlLCBNb2RhbE1vZHVsZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1RvYXN0clNlcnZpY2V9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIHN3aXRjaE1hcCwgdGFrZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0ludGVybWVkaWF0ZVNhdmVSZXF1ZXN0LCBJbnRlcm1lZGlhdGVTdWJtaXNzaW9uLCBUYXNrfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtUYXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2UsIFRhc2tTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1kZXRhaWwtaW50ZXJtZWRpYXRlLXNhdmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzay1kZXRhaWwtaW50ZXJtZWRpYXRlLXNhdmUuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvbmZpcm1hdGlvbk1vZGFsTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgTW9kYWxNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza0RldGFpbEludGVybWVkaWF0ZVNhdmVDb21wb25lbnQge1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IHRhc2sodmFsdWU6IFRhc2sgfCBudWxsKSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMudGFza1NlcnZpY2VcbiAgICAgIC5nZXRUYXNrUHJvY2Vzc0xpbmsodmFsdWUuaWQpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9PSBudWxsICYmIHJlcy50eXBlID09PSAnZm9ybS1mbG93JylcbiAgICAgICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCQubmV4dChyZXMucHJvcGVydGllcy5mb3JtRmxvd0luc3RhbmNlSWQpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnRhc2tWYWx1ZS5zZXQodmFsdWUpO1xuICAgIHRoaXMucGFnZS5zZXQoe1xuICAgICAgdGl0bGU6IHZhbHVlLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYCR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3Rhc2tEZXRhaWwudGFza0NyZWF0ZWQnKX0gJHt2YWx1ZS5jcmVhdGVkfWAsXG4gICAgfSk7XG4gICAgdGhpcy5nZXRDdXJyZW50UHJvZ3Jlc3ModmFsdWUpO1xuICB9XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgY3VycmVudEludGVybWVkaWF0ZVNhdmVFdmVudCA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxJbnRlcm1lZGlhdGVTdWJtaXNzaW9uIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBzaG93TW9kYWxFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybUZsb3dJbnN0YW5jZUlkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgc2hvd0NvbmZpcm1hdGlvbk1vZGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0YXNrVmFsdWUgPSBzaWduYWw8VGFzayB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZSA9IHNpZ25hbDx7dGl0bGU6IHN0cmluZzsgc3VidGl0bGU6IHN0cmluZ30gfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGNhbkFzc2lnblVzZXJUb1Rhc2sgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgc3VibWlzc2lvbiQgPSB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zdWJtaXNzaW9uJDtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1Jb0Zvcm1EYXRhJCA9IHRoaXMudGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLmZvcm1Jb0Zvcm1EYXRhJDtcblxuICBwdWJsaWMgaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHVibGljIGN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlOiBJbnRlcm1lZGlhdGVTdWJtaXNzaW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvblNlcnZpY2U6IEljb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZTogVGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuaW50ZXJtZWRpYXRlU2F2ZUVuYWJsZWQgPSAhIXRoaXMuY29uZmlnU2VydmljZS5mZWF0dXJlVG9nZ2xlcz8uZW5hYmxlSW50ZXJtZWRpYXRlU2F2ZTtcbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtSZWNlbnRseVZpZXdlZDE2XSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUN1cnJlbnRQcm9ncmVzcygpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnN1Ym1pc3Npb24kLCB0aGlzLmZvcm1Jb0Zvcm1EYXRhJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChbc3VibWlzc2lvbiwgZm9ybUlvRm9ybURhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlU2F2ZVJlcXVlc3Q6IEludGVybWVkaWF0ZVNhdmVSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgc3VibWlzc2lvbjogc3VibWlzc2lvbj8uZGF0YSA/IHN1Ym1pc3Npb24uZGF0YSA6IGZvcm1Jb0Zvcm1EYXRhLFxuICAgICAgICAgICAgdGFza0luc3RhbmNlSWQ6IHRoaXMudGFza1ZhbHVlKCk/LmlkID8/ICcnLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy50YXNrSW50ZXJtZWRpYXRlU2F2ZVNlcnZpY2Uuc3RvcmVJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlU2F2ZVJlcXVlc3RcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGludGVybWVkaWF0ZVN1Ym1pc3Npb24gPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZm9ybU1hbmFnZW1lbnQuaW50ZXJtZWRpYXRlU2F2ZS5zdWNjZXNzJylcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY3VycmVudEludGVybWVkaWF0ZVNhdmUgPSB0aGlzLmZvcm1hdEludGVybWVkaWF0ZVN1Ym1pc3Npb24oaW50ZXJtZWRpYXRlU3VibWlzc2lvbik7XG4gICAgICAgICAgdGhpcy5jdXJyZW50SW50ZXJtZWRpYXRlU2F2ZUV2ZW50LmVtaXQodGhpcy5jdXJyZW50SW50ZXJtZWRpYXRlU2F2ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IodGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2Zvcm1NYW5hZ2VtZW50LmludGVybWVkaWF0ZVNhdmUuZXJyb3InKSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXZlcnRTYXZlQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd01vZGFsRXZlbnQub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMuc2hvd01vZGFsRXZlbnQuZW1pdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyQ3VycmVudFByb2dyZXNzKCk6IHZvaWQge1xuICAgIHRoaXMudGFza0ludGVybWVkaWF0ZVNhdmVTZXJ2aWNlXG4gICAgICAuY2xlYXJJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKHRoaXMudGFza1ZhbHVlKCk/LmlkID8/ICcnKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZS5zZXRTdWJtaXNzaW9uKHt9KTtcbiAgICAgICAgdGhpcy5jdXJyZW50SW50ZXJtZWRpYXRlU2F2ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudEludGVybWVkaWF0ZVNhdmVFdmVudC5lbWl0KHRoaXMuY3VycmVudEludGVybWVkaWF0ZVNhdmUpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEludGVybWVkaWF0ZVN1Ym1pc3Npb24oXG4gICAgaW50ZXJtZWRpYXRlU3VibWlzc2lvbjogSW50ZXJtZWRpYXRlU3VibWlzc2lvblxuICApOiBJbnRlcm1lZGlhdGVTdWJtaXNzaW9uIHtcbiAgICBpbnRlcm1lZGlhdGVTdWJtaXNzaW9uLmNyZWF0ZWRPbiA9IG1vbWVudChpbnRlcm1lZGlhdGVTdWJtaXNzaW9uLmNyZWF0ZWRPbikuZm9ybWF0KFxuICAgICAgJ0REIE1NTSBZWVlZIEhIOm1tJ1xuICAgICk7XG4gICAgaWYgKGludGVybWVkaWF0ZVN1Ym1pc3Npb24uZWRpdGVkT24pIHtcbiAgICAgIGludGVybWVkaWF0ZVN1Ym1pc3Npb24uZWRpdGVkT24gPSBtb21lbnQobmV3IERhdGUoaW50ZXJtZWRpYXRlU3VibWlzc2lvbi5lZGl0ZWRPbikpLmZvcm1hdChcbiAgICAgICAgJ0REIE1NTSBZWVlZIEhIOm1tJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJtZWRpYXRlU3VibWlzc2lvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFByb2dyZXNzKHRhc2s6IFRhc2spOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tJbnRlcm1lZGlhdGVTYXZlU2VydmljZVxuICAgICAgLmdldEludGVybWVkaWF0ZVN1Ym1pc3Npb24odGFzay5pZCA/PyAnJylcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKGludGVybWVkaWF0ZVNhdmUgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlID0gdGhpcy5mb3JtYXRJbnRlcm1lZGlhdGVTdWJtaXNzaW9uKGludGVybWVkaWF0ZVNhdmUpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuQGlmIChpbnRlcm1lZGlhdGVTYXZlRW5hYmxlZCAmJiAoZm9ybUZsb3dJbnN0YW5jZUlkJCB8IGFzeW5jKSA9PT0gdW5kZWZpbmVkKSB7XG4gIDxidXR0b25cbiAgICBjZHNCdXR0b249XCJnaG9zdFwiXG4gICAgaWNvbk9ubHk9XCJ0cnVlXCJcbiAgICBjZHNJY29uPVwic2F2ZVwiXG4gICAgW3ZUb29sdGlwXT1cIidmb3JtTWFuYWdlbWVudC5pbnRlcm1lZGlhdGVTYXZlLnNhdmUnIHwgdHJhbnNsYXRlXCJcbiAgICAoY2xpY2spPVwic2F2ZUN1cnJlbnRQcm9ncmVzcygpXCJcbiAgPjwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICBjZHNCdXR0b249XCJnaG9zdFwiXG4gICAgaWNvbk9ubHk9XCJ0cnVlXCJcbiAgICBjZHNJY29uPVwicmVjZW50bHktdmlld2VkXCJcbiAgICBbZGlzYWJsZWRdPVwiIWN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlXCJcbiAgICBbdlRvb2x0aXBdPVwiJ2Zvcm1NYW5hZ2VtZW50LmludGVybWVkaWF0ZVNhdmUuY2xlYXInIHwgdHJhbnNsYXRlXCJcbiAgICAoY2xpY2spPVwicmV2ZXJ0U2F2ZUNsaWNrKClcIlxuICA+PC9idXR0b24+XG59XG5cbjx2YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbFxuICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0NvbmZpcm1hdGlvbk1vZGFsJFwiXG4gIChjb25maXJtRXZlbnQpPVwiY2xlYXJDdXJyZW50UHJvZ3Jlc3MoKVwiXG4gIChjYW5jZWxFdmVudCk9XCJzaG93Q29uZmlybWF0aW9uTW9kYWwkLm5leHQoZmFsc2UpXCJcbiAgY2FuY2VsQnV0dG9uVHlwZT1cImdob3N0XCJcbiAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImludGVyZmFjZS5jb25maXJtXCJcbiAgdGl0bGVUcmFuc2xhdGlvbktleT1cImZvcm1NYW5hZ2VtZW50LmludGVybWVkaWF0ZVNhdmUuY2xlYXJcIlxuICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJmb3JtTWFuYWdlbWVudC5pbnRlcm1lZGlhdGVTYXZlLmNsZWFyQ29uZmlybVwiXG4+PC92YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbD5cbiJdfQ==
|