@yuuvis/client-framework 0.8.0 → 0.9.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/actions/lib/actions/delete-action/delete-action.d.ts +1 -0
- package/common/index.d.ts +1 -0
- package/common/lib/services/error-messages/error-messages.service.d.ts +7 -0
- package/common/lib/services/index.d.ts +1 -0
- package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +4 -10
- package/esm2022/common/index.mjs +2 -1
- package/esm2022/common/lib/directives/drag-select.directive.mjs +2 -2
- package/esm2022/common/lib/services/error-messages/error-messages.service.mjs +68 -0
- package/esm2022/common/lib/services/index.mjs +2 -0
- package/esm2022/forms/index.mjs +9 -8
- package/esm2022/forms/lib/elements/data-grid/data-grid/data-grid.component.mjs +172 -0
- package/esm2022/forms/lib/elements/data-grid/edit-table-data/edit-data.component.mjs +95 -0
- package/esm2022/forms/lib/elements/data-grid/model/data-grid.interface.mjs +9 -0
- package/esm2022/forms/lib/elements/index.mjs +11 -0
- package/esm2022/forms/lib/elements/organization/organization.component.mjs +47 -29
- package/esm2022/icons/lib/icons.mjs +3 -2
- package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +5 -4
- package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +1 -1
- package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +7 -52
- package/esm2022/object-details/index.mjs +2 -1
- package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +5 -4
- package/esm2022/object-details/lib/retention-badge/retention-badge.component.mjs +27 -0
- package/esm2022/object-form/index.mjs +1 -1
- package/esm2022/object-form/lib/object-form.component.mjs +2 -1
- package/esm2022/object-form/lib/object-form.service.mjs +5 -2
- package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +15 -13
- package/esm2022/pagination/lib/pagination.component.mjs +4 -6
- package/esm2022/sequence-list/index.mjs +1 -3
- package/esm2022/sequence-list/lib/sequence-list.component.mjs +11 -16
- package/esm2022/sequence-list/lib/sequence-list.interface.mjs +1 -1
- package/esm2022/tile-list/lib/tile/tile.component.mjs +3 -3
- package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +1 -1
- package/fesm2022/yuuvis-client-framework-actions.mjs +3 -9
- package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-common.mjs +69 -4
- package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-forms.mjs +1194 -909
- package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-icons.mjs +2 -1
- package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-metadata-form.mjs +10 -55
- package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-details.mjs +26 -5
- package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-form.mjs +5 -1
- package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-summary.mjs +14 -12
- package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-pagination.mjs +3 -5
- package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-sequence-list.mjs +17 -296
- package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +2 -2
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/forms/index.d.ts +1 -7
- package/forms/lib/elements/data-grid/data-grid/data-grid.component.d.ts +38 -0
- package/forms/lib/elements/data-grid/edit-table-data/edit-data.component.d.ts +21 -0
- package/forms/lib/elements/data-grid/model/data-grid.interface.d.ts +14 -0
- package/forms/lib/elements/index.d.ts +10 -0
- package/forms/lib/elements/organization/organization.component.d.ts +13 -4
- package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +0 -1
- package/object-details/index.d.ts +1 -0
- package/object-details/lib/retention-badge/retention-badge.component.d.ts +12 -0
- package/package.json +10 -10
- package/sequence-list/index.d.ts +0 -2
- package/sequence-list/lib/sequence-list.component.d.ts +2 -2
- package/sequence-list/lib/sequence-list.interface.d.ts +5 -4
- package/styles/client-framework.scss +55 -18
- package/esm2022/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.mjs +0 -183
- package/esm2022/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.mjs +0 -114
- package/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.d.ts +0 -52
- package/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.d.ts +0 -36
|
@@ -3,6 +3,13 @@ import { ControlValueAccessor, Validator } from '@angular/forms';
|
|
|
3
3
|
import { YuvUser } from '@yuuvis/client-core';
|
|
4
4
|
import { AutoComplete } from '@yuuvis/components/autocomplete';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
+
interface UserNode {
|
|
7
|
+
user: YuvUser;
|
|
8
|
+
state: {
|
|
9
|
+
notFound?: boolean;
|
|
10
|
+
};
|
|
11
|
+
titleString?: string;
|
|
12
|
+
}
|
|
6
13
|
/**
|
|
7
14
|
* Creates form input for organisation values.
|
|
8
15
|
* Implements `ControlValueAccessor` so it can be used within Angular forms.
|
|
@@ -16,6 +23,7 @@ export declare class OrganizationComponent implements ControlValueAccessor, Vali
|
|
|
16
23
|
#private;
|
|
17
24
|
private system;
|
|
18
25
|
private userService;
|
|
26
|
+
private translate;
|
|
19
27
|
autoCompleteInput: AutoComplete;
|
|
20
28
|
minLength: number;
|
|
21
29
|
icons: {
|
|
@@ -24,10 +32,10 @@ export declare class OrganizationComponent implements ControlValueAccessor, Vali
|
|
|
24
32
|
};
|
|
25
33
|
private isValidInput;
|
|
26
34
|
value: string | string[] | null;
|
|
27
|
-
_innerValue:
|
|
28
|
-
set innerValue(iv:
|
|
29
|
-
get innerValue():
|
|
30
|
-
autocompleteRes:
|
|
35
|
+
_innerValue: UserNode[];
|
|
36
|
+
set innerValue(iv: UserNode[]);
|
|
37
|
+
get innerValue(): UserNode[];
|
|
38
|
+
autocompleteRes: UserNode[];
|
|
31
39
|
private filterRoles;
|
|
32
40
|
onKeydownHandler(event: KeyboardEvent): void;
|
|
33
41
|
get _inputDisabled(): boolean;
|
|
@@ -91,3 +99,4 @@ export declare class OrganizationComponent implements ControlValueAccessor, Vali
|
|
|
91
99
|
static ɵfac: i0.ɵɵFactoryDeclaration<OrganizationComponent, never>;
|
|
92
100
|
static ɵcmp: i0.ɵɵComponentDeclaration<OrganizationComponent, "yuv-organization", never, { "placeholder": { "alias": "placeholder"; "required": false; }; "situation": { "alias": "situation"; "required": false; }; "multiselect": { "alias": "multiselect"; "required": false; }; "classifications": { "alias": "classifications"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "excludeMe": { "alias": "excludeMe"; "required": false; }; "withMetadata": { "alias": "withMetadata"; "required": false; "isSignal": true; }; }, { "userSelect": "userSelect"; }, never, never, true, never>;
|
|
93
101
|
}
|
|
102
|
+
export {};
|
|
@@ -24,7 +24,6 @@ export declare class MetadataFormFieldComponent implements OnInit, OnDestroy {
|
|
|
24
24
|
*/
|
|
25
25
|
situation: import("@angular/core").InputSignal<string | undefined>;
|
|
26
26
|
fetchTags(): void;
|
|
27
|
-
private _getErrorLabel;
|
|
28
27
|
ngOnInit(): void;
|
|
29
28
|
ngOnDestroy(): void;
|
|
30
29
|
static ɵfac: i0.ɵɵFactoryDeclaration<MetadataFormFieldComponent, never>;
|
|
@@ -4,3 +4,4 @@ export * from './lib/object-metadata/object-metadata.interface';
|
|
|
4
4
|
export * from './lib/object-audit/object-audit.component';
|
|
5
5
|
export * from './lib/object-metadata/object-metadata.component';
|
|
6
6
|
export * from './lib/object-details-shell/object-details-shell.component';
|
|
7
|
+
export * from './lib/retention-badge/retention-badge.component';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DmsObject, RetentionState } from '@yuuvis/client-core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class RetentionBadgeComponent {
|
|
4
|
+
#private;
|
|
5
|
+
icons: {
|
|
6
|
+
lockClosed: string;
|
|
7
|
+
};
|
|
8
|
+
dmsObject: import("@angular/core").InputSignal<DmsObject>;
|
|
9
|
+
retentionData: import("@angular/core").Signal<RetentionState>;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RetentionBadgeComponent, never>;
|
|
11
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RetentionBadgeComponent, "yuv-retention-badge", never, { "dmsObject": { "alias": "dmsObject"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yuuvis/client-framework",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@ngrx/signals": "^18.0.0",
|
|
13
|
-
"@yuuvis/client-core": "0.
|
|
14
|
-
"@yuuvis/client-shell-core": "0.
|
|
13
|
+
"@yuuvis/client-core": "0.9.0",
|
|
14
|
+
"@yuuvis/client-shell-core": "0.9.0",
|
|
15
15
|
"@yuuvis/components": "18.1.12",
|
|
16
|
-
"@yuuvis/media-viewer": "0.
|
|
16
|
+
"@yuuvis/media-viewer": "0.11.0",
|
|
17
17
|
"ag-grid-community": "^32.0.0",
|
|
18
18
|
"tslib": "^2.6.2"
|
|
19
19
|
},
|
|
@@ -59,18 +59,18 @@
|
|
|
59
59
|
"esm": "./esm2022/forms/yuuvis-client-framework-forms.mjs",
|
|
60
60
|
"default": "./fesm2022/yuuvis-client-framework-forms.mjs"
|
|
61
61
|
},
|
|
62
|
-
"./icons": {
|
|
63
|
-
"types": "./icons/index.d.ts",
|
|
64
|
-
"esm2022": "./esm2022/icons/yuuvis-client-framework-icons.mjs",
|
|
65
|
-
"esm": "./esm2022/icons/yuuvis-client-framework-icons.mjs",
|
|
66
|
-
"default": "./fesm2022/yuuvis-client-framework-icons.mjs"
|
|
67
|
-
},
|
|
68
62
|
"./list": {
|
|
69
63
|
"types": "./list/index.d.ts",
|
|
70
64
|
"esm2022": "./esm2022/list/yuuvis-client-framework-list.mjs",
|
|
71
65
|
"esm": "./esm2022/list/yuuvis-client-framework-list.mjs",
|
|
72
66
|
"default": "./fesm2022/yuuvis-client-framework-list.mjs"
|
|
73
67
|
},
|
|
68
|
+
"./icons": {
|
|
69
|
+
"types": "./icons/index.d.ts",
|
|
70
|
+
"esm2022": "./esm2022/icons/yuuvis-client-framework-icons.mjs",
|
|
71
|
+
"esm": "./esm2022/icons/yuuvis-client-framework-icons.mjs",
|
|
72
|
+
"default": "./fesm2022/yuuvis-client-framework-icons.mjs"
|
|
73
|
+
},
|
|
74
74
|
"./metadata-form": {
|
|
75
75
|
"types": "./metadata-form/index.d.ts",
|
|
76
76
|
"esm2022": "./esm2022/metadata-form/yuuvis-client-framework-metadata-form.mjs",
|
package/sequence-list/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
export * from './lib/due-date-picker/due-date-picker.component';
|
|
2
2
|
export * from './lib/sequence-list.component';
|
|
3
3
|
export * from './lib/sequence-list.interface';
|
|
4
|
-
export * from './lib/sequence-list-templates/sequence-list-templates.component';
|
|
5
|
-
export * from './lib/sequence-list-template-manage/sequence-list-template-manage.component';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ControlValueAccessor, FormArray, FormControl, FormGroup, ValidationErrors, Validator } from '@angular/forms';
|
|
2
2
|
import { OrganizationComponent } from '@yuuvis/client-framework/forms';
|
|
3
|
-
import { SequenceItem } from './sequence-list.interface';
|
|
3
|
+
import { SequenceItem, SequenceListAssignee } from './sequence-list.interface';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
type SequenceFormItem = FormGroup<{
|
|
6
6
|
title: FormControl<string>;
|
|
7
|
-
nextAssignee: FormControl<string>;
|
|
7
|
+
nextAssignee: FormControl<SequenceListAssignee | string>;
|
|
8
8
|
expiryDatetime: FormControl<any>;
|
|
9
9
|
}>;
|
|
10
10
|
type SequenceForm = FormGroup<{
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
export interface SequenceItem {
|
|
2
2
|
title: string;
|
|
3
3
|
expiryDatetime?: Date;
|
|
4
|
-
nextAssignee:
|
|
5
|
-
id: string;
|
|
6
|
-
title: string;
|
|
7
|
-
};
|
|
4
|
+
nextAssignee: SequenceListAssignee;
|
|
8
5
|
}
|
|
9
6
|
export interface SequenceListTemplate {
|
|
10
7
|
id: string;
|
|
@@ -14,3 +11,7 @@ export interface SequenceListTemplate {
|
|
|
14
11
|
export interface SequenceListTemplateSaveResponse {
|
|
15
12
|
templateName: string;
|
|
16
13
|
}
|
|
14
|
+
export interface SequenceListAssignee {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
}
|
|
@@ -6,22 +6,59 @@
|
|
|
6
6
|
@import '@yuuvis/styles/scss/yuuvis-theme-dark-high-contrast.scss';
|
|
7
7
|
|
|
8
8
|
.yuv-busy-overlay {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
9
|
+
position: absolute;
|
|
10
|
+
transition: opacity 200ms;
|
|
11
|
+
opacity: 0;
|
|
12
|
+
top: 0;
|
|
13
|
+
bottom: 0;
|
|
14
|
+
left: 0;
|
|
15
|
+
right: 0;
|
|
16
|
+
background-color: rgba(255, 255, 255, 0.8);
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-flow: column;
|
|
19
|
+
align-items: center;
|
|
20
|
+
z-index: 5;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
|
|
23
|
+
// dark mode
|
|
24
|
+
.dark & {
|
|
25
|
+
background-color: rgba(var(--color-primary-rgb), 0.85);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// custom scrollbars
|
|
30
|
+
:root {
|
|
31
|
+
--scrollbar-outer-size: 14px;
|
|
32
|
+
--scrollbar-inner-size: 4px;
|
|
33
|
+
}
|
|
34
|
+
::-webkit-scrollbar {
|
|
35
|
+
height: var(--scrollbar-outer-size);
|
|
36
|
+
width: var(--scrollbar-outer-size);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
::-webkit-scrollbar-track {
|
|
40
|
+
background-color: transparent;
|
|
41
|
+
outline: calc(var(--scrollbar-inner-size) / 2) solid var(--scrollbar-track-color);
|
|
42
|
+
outline-offset: calc((var(--scrollbar-outer-size) - var(--scrollbar-inner-size)) * -1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
::-webkit-scrollbar-thumb {
|
|
46
|
+
background-color: transparent; //var(--scrollbar-thumb-color);
|
|
47
|
+
outline: calc(var(--scrollbar-inner-size) / 2) solid var(--scrollbar-thumb-color);
|
|
48
|
+
outline-offset: calc((var(--scrollbar-outer-size) - var(--scrollbar-inner-size)) * -1);
|
|
49
|
+
transition: outline-color 200ms ease-in-out;
|
|
50
|
+
|
|
51
|
+
&:hover {
|
|
52
|
+
outline-color: var(--scrollbar-thumb-color-hover);
|
|
53
|
+
background-color: transparent;
|
|
27
54
|
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
::-webkit-scrollbar-button {
|
|
58
|
+
height: 0;
|
|
59
|
+
width: 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
::-webkit-scrollbar-corner {
|
|
63
|
+
background-color: transparent;
|
|
64
|
+
}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, inject, input, output } from '@angular/core';
|
|
3
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
5
|
-
import { BackendService, PendingChangesService, Sort, TranslateModule, TranslateService, Utils } from '@yuuvis/client-core';
|
|
6
|
-
import { FormInputComponent, StringComponent, YuvFormsModule } from '@yuuvis/client-framework/forms';
|
|
7
|
-
import { YvcCommonModule } from '@yuuvis/components/common';
|
|
8
|
-
import { YvcOverlayModule, YvcOverlayService } from '@yuuvis/components/overlay';
|
|
9
|
-
import { SequenceListComponent } from '../sequence-list.component';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "@yuuvis/client-core";
|
|
13
|
-
import * as i3 from "@angular/forms";
|
|
14
|
-
import * as i4 from "@yuuvis/components/common";
|
|
15
|
-
export class SequenceListTemplateManageComponent {
|
|
16
|
-
set selectedTemplate(s) {
|
|
17
|
-
if (!this.pendingChanges.check()) {
|
|
18
|
-
this.pendingTaskId = undefined;
|
|
19
|
-
this._selectedTemplate = s ? { ...s } : undefined;
|
|
20
|
-
if (this._selectedTemplate)
|
|
21
|
-
this.form.patchValue({
|
|
22
|
-
templateName: this._selectedTemplate.id === this.CURRENT_ENTRIES_ID ? '' : this._selectedTemplate.name,
|
|
23
|
-
sequence: [...this._selectedTemplate.sequence]
|
|
24
|
-
}, { emitEvent: false });
|
|
25
|
-
this.form.markAsPristine();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
get selectedTemplate() {
|
|
29
|
-
return this._selectedTemplate;
|
|
30
|
-
}
|
|
31
|
-
get formErrors() {
|
|
32
|
-
const errors = this.form.get('templateName')?.errors;
|
|
33
|
-
return errors ? Object.keys(errors).map((k) => this.labels.errors[k]) : [];
|
|
34
|
-
}
|
|
35
|
-
constructor() {
|
|
36
|
-
this.backend = inject(BackendService);
|
|
37
|
-
this.overlay = inject(YvcOverlayService);
|
|
38
|
-
this.pendingChanges = inject(PendingChangesService);
|
|
39
|
-
this.fb = inject(FormBuilder);
|
|
40
|
-
this.translate = inject(TranslateService);
|
|
41
|
-
this.DEFAULT_TEMPLATE_STORAGE_SECTION = 'sequencelist';
|
|
42
|
-
this.CURRENT_ENTRIES_ID = 'current';
|
|
43
|
-
this.TEMPLATE_NAME_MAX_LENGTH = 128;
|
|
44
|
-
this.disableSubmit = false;
|
|
45
|
-
this.templates = [];
|
|
46
|
-
this.filterTerm = null;
|
|
47
|
-
this.busy = false;
|
|
48
|
-
this.form = this.fb.group({
|
|
49
|
-
templateName: ['', [Validators.required, Validators.maxLength(this.TEMPLATE_NAME_MAX_LENGTH), this.forbiddenNameValidator()]],
|
|
50
|
-
sequence: [[], Validators.required]
|
|
51
|
-
});
|
|
52
|
-
/**
|
|
53
|
-
* Name of the section to store templates in user service (usersettings)
|
|
54
|
-
*/
|
|
55
|
-
this.storageSection = input(this.DEFAULT_TEMPLATE_STORAGE_SECTION);
|
|
56
|
-
this.currentEntries = input([]);
|
|
57
|
-
// emitted once a template has been selected
|
|
58
|
-
this.templateSelect = output();
|
|
59
|
-
this.cancel = output();
|
|
60
|
-
this.labels = {
|
|
61
|
-
save: this.translate.instant('yuv.sequence-list.template.button.save'),
|
|
62
|
-
saveNew: this.translate.instant('yuv.sequence-list.template.button.saveNew'),
|
|
63
|
-
headline: this.translate.instant('yuv.sequence-list.template.headline'),
|
|
64
|
-
headlineNew: this.translate.instant('yuv.sequence-list.template.headlineNew'),
|
|
65
|
-
errors: {
|
|
66
|
-
maxlength: this.translate.instant('yuv.object-form-element.error.maxlength', { maxLength: this.TEMPLATE_NAME_MAX_LENGTH }),
|
|
67
|
-
forbiddenName: this.translate.instant('yuv.sequence-list.template.errors.forbiddenName')
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
this.form.statusChanges.pipe(takeUntilDestroyed()).subscribe((res) => {
|
|
71
|
-
if (this.form.dirty && !this.pendingChanges.hasPendingTask(this.pendingTaskId || ' ')) {
|
|
72
|
-
this.pendingTaskId = this.pendingChanges.startTask(this.translate.instant('yuv.sequence-list.template.pending-changes.alert'));
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
forbiddenNameValidator() {
|
|
77
|
-
return (control) => {
|
|
78
|
-
const forbidden = this.templates
|
|
79
|
-
.filter((t) => t.id !== this.selectedTemplate.id)
|
|
80
|
-
.map((t) => t.name)
|
|
81
|
-
.includes(control.value);
|
|
82
|
-
return forbidden ? { forbiddenName: { value: control.value } } : null;
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
selectCurrentEntries() {
|
|
86
|
-
this.selectedTemplate = {
|
|
87
|
-
id: this.CURRENT_ENTRIES_ID,
|
|
88
|
-
name: this.translate.instant('yuv.sequence-list.template.headlineNew'),
|
|
89
|
-
sequence: this.currentEntries() || []
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
applyTemplate() {
|
|
93
|
-
if (this.selectedTemplate)
|
|
94
|
-
this.templateSelect.emit(this.selectedTemplate.sequence);
|
|
95
|
-
}
|
|
96
|
-
deleteTemplate() {
|
|
97
|
-
this.overlay
|
|
98
|
-
.confirm({
|
|
99
|
-
message: this.translate.instant('yuv.sequence-list.template.remove.confirm.message', {
|
|
100
|
-
template: this.selectedTemplate.name
|
|
101
|
-
})
|
|
102
|
-
})
|
|
103
|
-
.subscribe((confirmed) => {
|
|
104
|
-
if (confirmed) {
|
|
105
|
-
this.templates = this.templates.filter((t) => t.id !== this.selectedTemplate.id);
|
|
106
|
-
this.saveTemplates();
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
submit() {
|
|
111
|
-
if (this.selectedTemplate) {
|
|
112
|
-
let selectAfterSave;
|
|
113
|
-
if (this.selectedTemplate.id === this.CURRENT_ENTRIES_ID) {
|
|
114
|
-
// save current list as new template
|
|
115
|
-
const id = Utils.uuid();
|
|
116
|
-
this.templates.push({
|
|
117
|
-
id,
|
|
118
|
-
name: this.form.value.templateName,
|
|
119
|
-
sequence: this.form.value.sequence
|
|
120
|
-
});
|
|
121
|
-
selectAfterSave = id;
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
// update existing template
|
|
125
|
-
const i = this.templates.findIndex((e) => e.id === this.selectedTemplate.id);
|
|
126
|
-
if (i !== -1) {
|
|
127
|
-
this.templates[i] = {
|
|
128
|
-
id: this.selectedTemplate.id,
|
|
129
|
-
name: this.form.value.templateName,
|
|
130
|
-
sequence: this.form.value.sequence
|
|
131
|
-
};
|
|
132
|
-
selectAfterSave = this.selectedTemplate.id;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
this.saveTemplates(selectAfterSave);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
saveTemplates(templateToBeSelectedAfterSave) {
|
|
139
|
-
this.busy = true;
|
|
140
|
-
this.templates.sort(Utils.sortValues('name', Sort.ASC));
|
|
141
|
-
return this.backend.post(`/users/settings/${this.storageSection}`, { templates: this.templates }).subscribe((res) => {
|
|
142
|
-
this.busy = false;
|
|
143
|
-
this.form.markAsPristine();
|
|
144
|
-
if (this.pendingTaskId)
|
|
145
|
-
this.pendingChanges.finishTask(this.pendingTaskId);
|
|
146
|
-
if (!templateToBeSelectedAfterSave) {
|
|
147
|
-
this.selectedTemplate = undefined;
|
|
148
|
-
}
|
|
149
|
-
else if (templateToBeSelectedAfterSave !== this.selectedTemplate.id) {
|
|
150
|
-
this.selectedTemplate = this.templates.find((t) => templateToBeSelectedAfterSave === t.id);
|
|
151
|
-
}
|
|
152
|
-
}, (err) => (this.busy = false));
|
|
153
|
-
}
|
|
154
|
-
loadTemplates() {
|
|
155
|
-
this.backend.get(`/users/settings/${this.storageSection()}`).subscribe((res) => {
|
|
156
|
-
this.templates = res ? res.templates || [] : [];
|
|
157
|
-
this.templates.sort(Utils.sortValues('name', Sort.ASC));
|
|
158
|
-
this.selectCurrentEntries();
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
ngOnInit() {
|
|
162
|
-
this.loadTemplates();
|
|
163
|
-
}
|
|
164
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListTemplateManageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
165
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SequenceListTemplateManageComponent, isStandalone: true, selector: "yuv-sequence-list-template-manage", inputs: { storageSection: { classPropertyName: "storageSection", publicName: "storageSection", isSignal: true, isRequired: false, transformFunction: null }, currentEntries: { classPropertyName: "currentEntries", publicName: "currentEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { templateSelect: "templateSelect", cancel: "cancel" }, ngImport: i0, template: "<div class=\"template-list\">\n <header>{{ 'yuv.sequence-list.template-list.headline' | translate }}</header>\n\n <!-- current entries -->\n <div class=\"currententries item\" (click)=\"selectCurrentEntries()\" [ngClass]=\"{ current: selectedTemplate?.id === CURRENT_ENTRIES_ID }\">\n {{ 'yuv.sequence-list.template.headlineNew' | translate }}\n </div>\n\n <div class=\"filter\">\n <yuv-form-input [label]=\"'yuv.sequence-list.form.filter' | translate\">\n <yuv-string [(ngModel)]=\"filterTerm\"> </yuv-string>\n </yuv-form-input>\n </div>\n\n <div class=\"templates\">\n @for (tpl of templates | filter: filterTerm : 'name'; track $index) {\n <div class=\"item\" (click)=\"selectedTemplate = tpl\" [ngClass]=\"{ current: selectedTemplate?.id === tpl.id }\">\n {{ tpl.name }}\n </div>\n }\n </div>\n</div>\n\n@if (selectedTemplate) {\n <form class=\"template\" [formGroup]=\"form\">\n <header>{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.headline : labels.headlineNew }}</header>\n\n <yuv-form-input [label]=\"'yuv.sequence-list.form.templateName' | translate\" [required]=\"true\" [invalid]=\"!!formErrors.length\">\n <yuv-string [autofocus]=\"true\" [required]=\"true\" formControlName=\"templateName\"> </yuv-string>\n </yuv-form-input>\n @for (e of formErrors; track $index) {\n <div class=\"errors\">{{ e }}</div>\n }\n <yuv-sequence-list disable-duedate=\"true\" formControlName=\"sequence\"> </yuv-sequence-list>\n </form>\n}\n\n<div class=\"buttons\">\n <div class=\"left\">\n <button type=\"button\" class=\"secondary\" (click)=\"cancel.emit()\">{{ 'yuv.sequence-list.template.cancel' | translate }}</button>\n </div>\n\n @if (selectedTemplate) {\n <div class=\"right\">\n @if (selectedTemplate.id !== CURRENT_ENTRIES_ID) {\n <button class=\"secondary delete\" type=\"button\" (click)=\"deleteTemplate()\">\n {{ 'yuv.sequence-list.template.button.delete' | translate }}\n </button>\n\n <button class=\"primary apply\" type=\"button\" [disabled]=\"disableSubmit || form.invalid || form.dirty\" (click)=\"applyTemplate()\">\n {{ 'yuv.sequence-list.template.button.apply' | translate }}\n </button>\n }\n\n <!-- save -->\n <button\n class=\"{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? 'primary' : 'primary' }} save\"\n (click)=\"submit()\"\n type=\"button\"\n [disabled]=\"disableSubmit || form.invalid || form.pristine\"\n >\n {{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.save : labels.saveNew }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:grid;height:100%;grid-template-rows:1fr auto;grid-template-columns:200px 1fr;grid-template-areas:\"list template\" \"buttons buttons\"}:host header{font-weight:700;padding:var(--app-pane-padding);border-bottom:1px solid var(--panel-divider-color)}:host .template-list{grid-area:list;display:grid;height:100%;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"header\" \"current\" \"filter\" \"templates\";border-right:1px solid var(--panel-divider-color);overflow:hidden}:host .template-list header{grid-area:header}:host .template-list .filter{grid-area:filter;padding:var(--app-pane-padding);border:1px solid var(--panel-divider-color);border-width:1px 0;background-color:var(--panel-background-lightgrey)}:host .template-list .currententries{grid-area:current}:host .template-list .templates{grid-area:templates;overflow-y:auto}:host .template-list .item{padding:var(--app-pane-padding);cursor:pointer}:host .template-list .item:not(.currententries){border-bottom:1px solid var(--panel-divider-color)}:host .template-list .item:not(.current):hover{background-color:var(--item-focus-background-color)}:host .template-list .item.current{background-color:var(--item-selected-background-color)}:host .template{grid-area:template;display:grid;height:100%;overflow-y:auto;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"headline\" \"name\" \"errors\" \"sequence\"}:host .template h2{grid-area:headline}:host .template yuv-form-input{grid-area:name;margin:var(--app-pane-padding);margin-bottom:calc(var(--app-pane-padding) / 2)}:host .template .errors{grid-area:errors;margin:0 var(--app-pane-padding);color:var(--color-error)}:host .template yuv-sequence-list{grid-area:sequence;margin:var(--app-pane-padding);box-shadow:0 0 1.2em #0000001a}:host .buttons{grid-area:buttons;overflow-x:auto;display:flex;padding:calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 2 - 2px);border-top:1px solid var(--panel-divider-color)}:host .buttons .left{display:flex}:host .buttons .right{flex:1;display:flex;justify-content:flex-end}:host .buttons .right .save{order:2}:host .buttons .right .delete{order:1}:host .buttons .right .apply{order:3}:host .buttons button{margin:0 2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: YvcOverlayModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: FormInputComponent, selector: "yuv-form-input", inputs: ["label", "tag", "description", "invalid", "disabled", "required"] }, { kind: "component", type: StringComponent, selector: "yuv-string", inputs: ["multiselect", "rows", "readonly", "autofocus", "classifications", "situation", "regex", "minLength", "maxLength"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SequenceListComponent, selector: "yuv-sequence-list", inputs: ["maxLength"] }, { kind: "ngmodule", type: YuvFormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: YvcCommonModule }, { kind: "pipe", type: i4.FilterPipe, name: "filter" }] }); }
|
|
166
|
-
}
|
|
167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListTemplateManageComponent, decorators: [{
|
|
168
|
-
type: Component,
|
|
169
|
-
args: [{ selector: 'yuv-sequence-list-template-manage', standalone: true, imports: [
|
|
170
|
-
CommonModule,
|
|
171
|
-
YvcOverlayModule,
|
|
172
|
-
TranslateModule,
|
|
173
|
-
FormInputComponent,
|
|
174
|
-
StringComponent,
|
|
175
|
-
FormsModule,
|
|
176
|
-
CommonModule,
|
|
177
|
-
SequenceListComponent,
|
|
178
|
-
YuvFormsModule,
|
|
179
|
-
ReactiveFormsModule,
|
|
180
|
-
YvcCommonModule
|
|
181
|
-
], template: "<div class=\"template-list\">\n <header>{{ 'yuv.sequence-list.template-list.headline' | translate }}</header>\n\n <!-- current entries -->\n <div class=\"currententries item\" (click)=\"selectCurrentEntries()\" [ngClass]=\"{ current: selectedTemplate?.id === CURRENT_ENTRIES_ID }\">\n {{ 'yuv.sequence-list.template.headlineNew' | translate }}\n </div>\n\n <div class=\"filter\">\n <yuv-form-input [label]=\"'yuv.sequence-list.form.filter' | translate\">\n <yuv-string [(ngModel)]=\"filterTerm\"> </yuv-string>\n </yuv-form-input>\n </div>\n\n <div class=\"templates\">\n @for (tpl of templates | filter: filterTerm : 'name'; track $index) {\n <div class=\"item\" (click)=\"selectedTemplate = tpl\" [ngClass]=\"{ current: selectedTemplate?.id === tpl.id }\">\n {{ tpl.name }}\n </div>\n }\n </div>\n</div>\n\n@if (selectedTemplate) {\n <form class=\"template\" [formGroup]=\"form\">\n <header>{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.headline : labels.headlineNew }}</header>\n\n <yuv-form-input [label]=\"'yuv.sequence-list.form.templateName' | translate\" [required]=\"true\" [invalid]=\"!!formErrors.length\">\n <yuv-string [autofocus]=\"true\" [required]=\"true\" formControlName=\"templateName\"> </yuv-string>\n </yuv-form-input>\n @for (e of formErrors; track $index) {\n <div class=\"errors\">{{ e }}</div>\n }\n <yuv-sequence-list disable-duedate=\"true\" formControlName=\"sequence\"> </yuv-sequence-list>\n </form>\n}\n\n<div class=\"buttons\">\n <div class=\"left\">\n <button type=\"button\" class=\"secondary\" (click)=\"cancel.emit()\">{{ 'yuv.sequence-list.template.cancel' | translate }}</button>\n </div>\n\n @if (selectedTemplate) {\n <div class=\"right\">\n @if (selectedTemplate.id !== CURRENT_ENTRIES_ID) {\n <button class=\"secondary delete\" type=\"button\" (click)=\"deleteTemplate()\">\n {{ 'yuv.sequence-list.template.button.delete' | translate }}\n </button>\n\n <button class=\"primary apply\" type=\"button\" [disabled]=\"disableSubmit || form.invalid || form.dirty\" (click)=\"applyTemplate()\">\n {{ 'yuv.sequence-list.template.button.apply' | translate }}\n </button>\n }\n\n <!-- save -->\n <button\n class=\"{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? 'primary' : 'primary' }} save\"\n (click)=\"submit()\"\n type=\"button\"\n [disabled]=\"disableSubmit || form.invalid || form.pristine\"\n >\n {{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.save : labels.saveNew }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:grid;height:100%;grid-template-rows:1fr auto;grid-template-columns:200px 1fr;grid-template-areas:\"list template\" \"buttons buttons\"}:host header{font-weight:700;padding:var(--app-pane-padding);border-bottom:1px solid var(--panel-divider-color)}:host .template-list{grid-area:list;display:grid;height:100%;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"header\" \"current\" \"filter\" \"templates\";border-right:1px solid var(--panel-divider-color);overflow:hidden}:host .template-list header{grid-area:header}:host .template-list .filter{grid-area:filter;padding:var(--app-pane-padding);border:1px solid var(--panel-divider-color);border-width:1px 0;background-color:var(--panel-background-lightgrey)}:host .template-list .currententries{grid-area:current}:host .template-list .templates{grid-area:templates;overflow-y:auto}:host .template-list .item{padding:var(--app-pane-padding);cursor:pointer}:host .template-list .item:not(.currententries){border-bottom:1px solid var(--panel-divider-color)}:host .template-list .item:not(.current):hover{background-color:var(--item-focus-background-color)}:host .template-list .item.current{background-color:var(--item-selected-background-color)}:host .template{grid-area:template;display:grid;height:100%;overflow-y:auto;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"headline\" \"name\" \"errors\" \"sequence\"}:host .template h2{grid-area:headline}:host .template yuv-form-input{grid-area:name;margin:var(--app-pane-padding);margin-bottom:calc(var(--app-pane-padding) / 2)}:host .template .errors{grid-area:errors;margin:0 var(--app-pane-padding);color:var(--color-error)}:host .template yuv-sequence-list{grid-area:sequence;margin:var(--app-pane-padding);box-shadow:0 0 1.2em #0000001a}:host .buttons{grid-area:buttons;overflow-x:auto;display:flex;padding:calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 2 - 2px);border-top:1px solid var(--panel-divider-color)}:host .buttons .left{display:flex}:host .buttons .right{flex:1;display:flex;justify-content:flex-end}:host .buttons .right .save{order:2}:host .buttons .right .delete{order:1}:host .buttons .right .apply{order:3}:host .buttons button{margin:0 2px}\n"] }]
|
|
182
|
-
}], ctorParameters: () => [] });
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVuY2UtbGlzdC10ZW1wbGF0ZS1tYW5hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9zZXF1ZW5jZS1saXN0L3NyYy9saWIvc2VxdWVuY2UtbGlzdC10ZW1wbGF0ZS1tYW5hZ2Uvc2VxdWVuY2UtbGlzdC10ZW1wbGF0ZS1tYW5hZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWZyYW1ld29yay9zZXF1ZW5jZS1saXN0L3NyYy9saWIvc2VxdWVuY2UtbGlzdC10ZW1wbGF0ZS1tYW5hZ2Uvc2VxdWVuY2UtbGlzdC10ZW1wbGF0ZS1tYW5hZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQXVDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBbUIsV0FBVyxFQUFhLFdBQVcsRUFBRSxtQkFBbUIsRUFBaUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEosT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxN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O3dCQUNmLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixxQkFBcUI7d0JBQ3JCLGNBQWM7d0JBQ2QsbUJBQW1CO3dCQUNuQixlQUFlO3FCQUNoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmFja2VuZFNlcnZpY2UsIFBlbmRpbmdDaGFuZ2VzU2VydmljZSwgU29ydCwgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlLCBVdGlscyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgRm9ybUlucHV0Q29tcG9uZW50LCBTdHJpbmdDb21wb25lbnQsIFl1dkZvcm1zTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL2Zvcm1zJztcbmltcG9ydCB7IFl2Y0NvbW1vbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9jb21tb24nO1xuaW1wb3J0IHsgWXZjT3ZlcmxheU1vZHVsZSwgWXZjT3ZlcmxheVNlcnZpY2UgfSBmcm9tICdAeXV1dmlzL2NvbXBvbmVudHMvb3ZlcmxheSc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2VxdWVuY2VJdGVtLCBTZXF1ZW5jZUxpc3RUZW1wbGF0ZSB9IGZyb20gJy4uL3NlcXVlbmNlLWxpc3QuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlcXVlbmNlTGlzdENvbXBvbmVudCB9IGZyb20gJy4uL3NlcXVlbmNlLWxpc3QuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LXNlcXVlbmNlLWxpc3QtdGVtcGxhdGUtbWFuYWdlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBZdmNPdmVybGF5TW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBGb3JtSW5wdXRDb21wb25lbnQsXG4gICAgU3RyaW5nQ29tcG9uZW50LFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTZXF1ZW5jZUxpc3RDb21wb25lbnQsXG4gICAgWXV2Rm9ybXNNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBZdmNDb21tb25Nb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlcXVlbmNlLWxpc3QtdGVtcGxhdGUtbWFuYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VxdWVuY2UtbGlzdC10ZW1wbGF0ZS1tYW5hZ2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZUxpc3RUZW1wbGF0ZU1hbmFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgYmFja2VuZCA9IGluamVjdChCYWNrZW5kU2VydmljZSk7XG4gIHByaXZhdGUgb3ZlcmxheSA9IGluamVjdChZdmNPdmVybGF5U2VydmljZSk7XG4gIHByaXZhdGUgcGVuZGluZ0NoYW5nZXMgPSBpbmplY3QoUGVuZGluZ0NoYW5nZXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIHByaXZhdGUgREVGQVVMVF9URU1QTEFURV9TVE9SQUdFX1NFQ1RJT04gPSAnc2VxdWVuY2VsaXN0JztcbiAgQ1VSUkVOVF9FTlRSSUVTX0lEID0gJ2N1cnJlbnQnO1xuICBURU1QTEFURV9OQU1FX01BWF9MRU5HVEggPSAxMjg7XG4gIGRpc2FibGVTdWJtaXQgPSBmYWxzZTtcbiAgdGVtcGxhdGVzOiBTZXF1ZW5jZUxpc3RUZW1wbGF0ZVtdID0gW107XG4gIGZpbHRlclRlcm06IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwZW5kaW5nVGFza0lkPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgX3NlbGVjdGVkVGVtcGxhdGU/OiBTZXF1ZW5jZUxpc3RUZW1wbGF0ZTtcbiAgc2V0IHNlbGVjdGVkVGVtcGxhdGUoczogU2VxdWVuY2VMaXN0VGVtcGxhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0NoYW5nZXMuY2hlY2soKSkge1xuICAgICAgdGhpcy5wZW5kaW5nVGFza0lkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2VsZWN0ZWRUZW1wbGF0ZSA9IHMgPyB7IC4uLnMgfSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkVGVtcGxhdGUpXG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRlbXBsYXRlTmFtZTogdGhpcy5fc2VsZWN0ZWRUZW1wbGF0ZS5pZCA9PT0gdGhpcy5DVVJSRU5UX0VOVFJJRVNfSUQgPyAnJyA6IHRoaXMuX3NlbGVjdGVkVGVtcGxhdGUubmFtZSxcbiAgICAgICAgICAgIHNlcXVlbmNlOiBbLi4udGhpcy5fc2VsZWN0ZWRUZW1wbGF0ZS5zZXF1ZW5jZV1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgZW1pdEV2ZW50OiBmYWxzZSB9XG4gICAgICAgICk7XG4gICAgICB0aGlzLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHNlbGVjdGVkVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGVtcGxhdGU7XG4gIH1cblxuICBidXN5ID0gZmFsc2U7XG4gIGZvcm06IEZvcm1Hcm91cCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgIHRlbXBsYXRlTmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5URU1QTEFURV9OQU1FX01BWF9MRU5HVEgpLCB0aGlzLmZvcmJpZGRlbk5hbWVWYWxpZGF0b3IoKV1dLFxuICAgIHNlcXVlbmNlOiBbW10sIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzZWN0aW9uIHRvIHN0b3JlIHRlbXBsYXRlcyBpbiB1c2VyIHNlcnZpY2UgKHVzZXJzZXR0aW5ncylcbiAgICovXG4gIHN0b3JhZ2VTZWN0aW9uID0gaW5wdXQ8c3RyaW5nPih0aGlzLkRFRkFVTFRfVEVNUExBVEVfU1RPUkFHRV9TRUNUSU9OKTtcbiAgY3VycmVudEVudHJpZXMgPSBpbnB1dDxTZXF1ZW5jZUl0ZW1bXT4oW10pO1xuXG4gIC8vIGVtaXR0ZWQgb25jZSBhIHRlbXBsYXRlIGhhcyBiZWVuIHNlbGVjdGVkXG4gIHRlbXBsYXRlU2VsZWN0ID0gb3V0cHV0PFNlcXVlbmNlSXRlbVtdPigpO1xuICBjYW5jZWwgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBsYWJlbHMgPSB7XG4gICAgc2F2ZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LnNlcXVlbmNlLWxpc3QudGVtcGxhdGUuYnV0dG9uLnNhdmUnKSxcbiAgICBzYXZlTmV3OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS5idXR0b24uc2F2ZU5ldycpLFxuICAgIGhlYWRsaW5lOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS5oZWFkbGluZScpLFxuICAgIGhlYWRsaW5lTmV3OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS5oZWFkbGluZU5ldycpLFxuICAgIGVycm9yczoge1xuICAgICAgbWF4bGVuZ3RoOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYub2JqZWN0LWZvcm0tZWxlbWVudC5lcnJvci5tYXhsZW5ndGgnLCB7IG1heExlbmd0aDogdGhpcy5URU1QTEFURV9OQU1FX01BWF9MRU5HVEggfSksXG4gICAgICBmb3JiaWRkZW5OYW1lOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS5lcnJvcnMuZm9yYmlkZGVuTmFtZScpXG4gICAgfVxuICB9O1xuXG4gIGdldCBmb3JtRXJyb3JzKCkge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlTmFtZScpPy5lcnJvcnM7XG4gICAgcmV0dXJuIGVycm9ycyA/IE9iamVjdC5rZXlzKGVycm9ycykubWFwKChrKSA9PiAodGhpcy5sYWJlbHMuZXJyb3JzIGFzIGFueSlba10pIDogW107XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZvcm0uc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgaWYgKHRoaXMuZm9ybS5kaXJ0eSAmJiAhdGhpcy5wZW5kaW5nQ2hhbmdlcy5oYXNQZW5kaW5nVGFzayh0aGlzLnBlbmRpbmdUYXNrSWQgfHwgJyAnKSkge1xuICAgICAgICB0aGlzLnBlbmRpbmdUYXNrSWQgPSB0aGlzLnBlbmRpbmdDaGFuZ2VzLnN0YXJ0VGFzayh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS5wZW5kaW5nLWNoYW5nZXMuYWxlcnQnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZvcmJpZGRlbk5hbWVWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZm9yYmlkZGVuID0gdGhpcy50ZW1wbGF0ZXNcbiAgICAgICAgLmZpbHRlcigodCkgPT4gdC5pZCAhPT0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlIS5pZClcbiAgICAgICAgLm1hcCgodCkgPT4gdC5uYW1lKVxuICAgICAgICAuaW5jbHVkZXMoY29udHJvbC52YWx1ZSk7XG4gICAgICByZXR1cm4gZm9yYmlkZGVuID8geyBmb3JiaWRkZW5OYW1lOiB7IHZhbHVlOiBjb250cm9sLnZhbHVlIH0gfSA6IG51bGw7XG4gICAgfTtcbiAgfVxuXG4gIHNlbGVjdEN1cnJlbnRFbnRyaWVzKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHtcbiAgICAgIGlkOiB0aGlzLkNVUlJFTlRfRU5UUklFU19JRCxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5zZXF1ZW5jZS1saXN0LnRlbXBsYXRlLmhlYWRsaW5lTmV3JyksXG4gICAgICBzZXF1ZW5jZTogdGhpcy5jdXJyZW50RW50cmllcygpIHx8IFtdXG4gICAgfTtcbiAgfVxuXG4gIGFwcGx5VGVtcGxhdGUoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkgdGhpcy50ZW1wbGF0ZVNlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5zZXF1ZW5jZSk7XG4gIH1cblxuICBkZWxldGVUZW1wbGF0ZSgpIHtcbiAgICB0aGlzLm92ZXJsYXlcbiAgICAgIC5jb25maXJtKHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LnNlcXVlbmNlLWxpc3QudGVtcGxhdGUucmVtb3ZlLmNvbmZpcm0ubWVzc2FnZScsIHtcbiAgICAgICAgICB0ZW1wbGF0ZTogdGhpcy5zZWxlY3RlZFRlbXBsYXRlIS5uYW1lXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSgoY29uZmlybWVkOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlcyA9IHRoaXMudGVtcGxhdGVzLmZpbHRlcigodCkgPT4gdC5pZCAhPT0gdGhpcy5zZWxlY3RlZFRlbXBsYXRlIS5pZCk7XG4gICAgICAgICAgdGhpcy5zYXZlVGVtcGxhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICAgIGxldCBzZWxlY3RBZnRlclNhdmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGVtcGxhdGUuaWQgPT09IHRoaXMuQ1VSUkVOVF9FTlRSSUVTX0lEKSB7XG4gICAgICAgIC8vIHNhdmUgY3VycmVudCBsaXN0IGFzIG5ldyB0ZW1wbGF0ZVxuICAgICAgICBjb25zdCBpZCA9IFV0aWxzLnV1aWQoKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXMucHVzaCh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbmFtZTogdGhpcy5mb3JtLnZhbHVlLnRlbXBsYXRlTmFtZSxcbiAgICAgICAgICBzZXF1ZW5jZTogdGhpcy5mb3JtLnZhbHVlLnNlcXVlbmNlXG4gICAgICAgIH0pO1xuICAgICAgICBzZWxlY3RBZnRlclNhdmUgPSBpZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVwZGF0ZSBleGlzdGluZyB0ZW1wbGF0ZVxuICAgICAgICBjb25zdCBpID0gdGhpcy50ZW1wbGF0ZXMuZmluZEluZGV4KChlKSA9PiBlLmlkID09PSB0aGlzLnNlbGVjdGVkVGVtcGxhdGUhLmlkKTtcbiAgICAgICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy50ZW1wbGF0ZXNbaV0gPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5zZWxlY3RlZFRlbXBsYXRlLmlkLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5mb3JtLnZhbHVlLnRlbXBsYXRlTmFtZSxcbiAgICAgICAgICAgIHNlcXVlbmNlOiB0aGlzLmZvcm0udmFsdWUuc2VxdWVuY2VcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNlbGVjdEFmdGVyU2F2ZSA9IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZS5pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zYXZlVGVtcGxhdGVzKHNlbGVjdEFmdGVyU2F2ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlVGVtcGxhdGVzKHRlbXBsYXRlVG9CZVNlbGVjdGVkQWZ0ZXJTYXZlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICB0aGlzLnRlbXBsYXRlcy5zb3J0KFV0aWxzLnNvcnRWYWx1ZXMoJ25hbWUnLCBTb3J0LkFTQykpO1xuICAgIHJldHVybiB0aGlzLmJhY2tlbmQucG9zdChgL3VzZXJzL3NldHRpbmdzLyR7dGhpcy5zdG9yYWdlU2VjdGlvbn1gLCB7IHRlbXBsYXRlczogdGhpcy50ZW1wbGF0ZXMgfSkuc3Vic2NyaWJlKFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdUYXNrSWQpIHRoaXMucGVuZGluZ0NoYW5nZXMuZmluaXNoVGFzayh0aGlzLnBlbmRpbmdUYXNrSWQpO1xuXG4gICAgICAgIGlmICghdGVtcGxhdGVUb0JlU2VsZWN0ZWRBZnRlclNhdmUpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGVUb0JlU2VsZWN0ZWRBZnRlclNhdmUgIT09IHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSEuaWQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlcy5maW5kKCh0KSA9PiB0ZW1wbGF0ZVRvQmVTZWxlY3RlZEFmdGVyU2F2ZSA9PT0gdC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiAodGhpcy5idXN5ID0gZmFsc2UpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRlbXBsYXRlcygpIHtcbiAgICB0aGlzLmJhY2tlbmQuZ2V0KGAvdXNlcnMvc2V0dGluZ3MvJHt0aGlzLnN0b3JhZ2VTZWN0aW9uKCl9YCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVzID0gcmVzID8gcmVzLnRlbXBsYXRlcyB8fCBbXSA6IFtdO1xuICAgICAgdGhpcy50ZW1wbGF0ZXMuc29ydChVdGlscy5zb3J0VmFsdWVzKCduYW1lJywgU29ydC5BU0MpKTtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudEVudHJpZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZFRlbXBsYXRlcygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGVtcGxhdGUtbGlzdFwiPlxuICA8aGVhZGVyPnt7ICd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS1saXN0LmhlYWRsaW5lJyB8IHRyYW5zbGF0ZSB9fTwvaGVhZGVyPlxuXG4gIDwhLS0gY3VycmVudCBlbnRyaWVzIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3VycmVudGVudHJpZXMgaXRlbVwiIChjbGljayk9XCJzZWxlY3RDdXJyZW50RW50cmllcygpXCIgW25nQ2xhc3NdPVwieyBjdXJyZW50OiBzZWxlY3RlZFRlbXBsYXRlPy5pZCA9PT0gQ1VSUkVOVF9FTlRSSUVTX0lEIH1cIj5cbiAgICB7eyAneXV2LnNlcXVlbmNlLWxpc3QudGVtcGxhdGUuaGVhZGxpbmVOZXcnIHwgdHJhbnNsYXRlIH19XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXJcIj5cbiAgICA8eXV2LWZvcm0taW5wdXQgW2xhYmVsXT1cIid5dXYuc2VxdWVuY2UtbGlzdC5mb3JtLmZpbHRlcicgfCB0cmFuc2xhdGVcIj5cbiAgICAgIDx5dXYtc3RyaW5nIFsobmdNb2RlbCldPVwiZmlsdGVyVGVybVwiPiA8L3l1di1zdHJpbmc+XG4gICAgPC95dXYtZm9ybS1pbnB1dD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInRlbXBsYXRlc1wiPlxuICAgIEBmb3IgKHRwbCBvZiB0ZW1wbGF0ZXMgfCBmaWx0ZXI6IGZpbHRlclRlcm0gOiAnbmFtZSc7IHRyYWNrICRpbmRleCkge1xuICAgICAgPGRpdiBjbGFzcz1cIml0ZW1cIiAoY2xpY2spPVwic2VsZWN0ZWRUZW1wbGF0ZSA9IHRwbFwiIFtuZ0NsYXNzXT1cInsgY3VycmVudDogc2VsZWN0ZWRUZW1wbGF0ZT8uaWQgPT09IHRwbC5pZCB9XCI+XG4gICAgICAgIHt7IHRwbC5uYW1lIH19XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG5cbkBpZiAoc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICA8Zm9ybSBjbGFzcz1cInRlbXBsYXRlXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gICAgPGhlYWRlcj57eyBzZWxlY3RlZFRlbXBsYXRlLmlkICE9PSBDVVJSRU5UX0VOVFJJRVNfSUQgPyBsYWJlbHMuaGVhZGxpbmUgOiBsYWJlbHMuaGVhZGxpbmVOZXcgfX08L2hlYWRlcj5cblxuICAgIDx5dXYtZm9ybS1pbnB1dCBbbGFiZWxdPVwiJ3l1di5zZXF1ZW5jZS1saXN0LmZvcm0udGVtcGxhdGVOYW1lJyB8IHRyYW5zbGF0ZVwiIFtyZXF1aXJlZF09XCJ0cnVlXCIgW2ludmFsaWRdPVwiISFmb3JtRXJyb3JzLmxlbmd0aFwiPlxuICAgICAgPHl1di1zdHJpbmcgW2F1dG9mb2N1c109XCJ0cnVlXCIgW3JlcXVpcmVkXT1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0ZW1wbGF0ZU5hbWVcIj4gPC95dXYtc3RyaW5nPlxuICAgIDwveXV2LWZvcm0taW5wdXQ+XG4gICAgQGZvciAoZSBvZiBmb3JtRXJyb3JzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJlcnJvcnNcIj57eyBlIH19PC9kaXY+XG4gICAgfVxuICAgIDx5dXYtc2VxdWVuY2UtbGlzdCBkaXNhYmxlLWR1ZWRhdGU9XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPVwic2VxdWVuY2VcIj4gPC95dXYtc2VxdWVuY2UtbGlzdD5cbiAgPC9mb3JtPlxufVxuXG48ZGl2IGNsYXNzPVwiYnV0dG9uc1wiPlxuICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNhbmNlbC5lbWl0KClcIj57eyAneXV2LnNlcXVlbmNlLWxpc3QudGVtcGxhdGUuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICBAaWYgKHNlbGVjdGVkVGVtcGxhdGUpIHtcbiAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgIEBpZiAoc2VsZWN0ZWRUZW1wbGF0ZS5pZCAhPT0gQ1VSUkVOVF9FTlRSSUVTX0lEKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWNvbmRhcnkgZGVsZXRlXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWxldGVUZW1wbGF0ZSgpXCI+XG4gICAgICAgICAge3sgJ3l1di5zZXF1ZW5jZS1saXN0LnRlbXBsYXRlLmJ1dHRvbi5kZWxldGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwcmltYXJ5IGFwcGx5XCIgdHlwZT1cImJ1dHRvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlU3VibWl0IHx8IGZvcm0uaW52YWxpZCB8fCBmb3JtLmRpcnR5XCIgKGNsaWNrKT1cImFwcGx5VGVtcGxhdGUoKVwiPlxuICAgICAgICAgIHt7ICd5dXYuc2VxdWVuY2UtbGlzdC50ZW1wbGF0ZS5idXR0b24uYXBwbHknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuXG4gICAgICA8IS0tIHNhdmUgLS0+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwie3sgc2VsZWN0ZWRUZW1wbGF0ZS5pZCAhPT0gQ1VSUkVOVF9FTlRSSUVTX0lEID8gJ3ByaW1hcnknIDogJ3ByaW1hcnknIH19IHNhdmVcIlxuICAgICAgICAoY2xpY2spPVwic3VibWl0KClcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVTdWJtaXQgfHwgZm9ybS5pbnZhbGlkIHx8IGZvcm0ucHJpc3RpbmVcIlxuICAgICAgPlxuICAgICAgICB7eyBzZWxlY3RlZFRlbXBsYXRlLmlkICE9PSBDVVJSRU5UX0VOVFJJRVNfSUQgPyBsYWJlbHMuc2F2ZSA6IGxhYmVscy5zYXZlTmV3IH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
|