@alfresco/adf-process-services-cloud 8.1.0-15488125964 → 8.1.0-15531833262
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/adf-process-services-cloud.mjs +5 -0
- package/esm2022/lib/app/app-list-cloud.module.mjs +20 -0
- package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +67 -0
- package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +126 -0
- package/esm2022/lib/app/models/application-instance.model.mjs +24 -0
- package/esm2022/lib/app/public-api.mjs +22 -0
- package/esm2022/lib/app/services/apps-process-cloud.service.mjs +97 -0
- package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +164 -0
- package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +97 -0
- package/esm2022/lib/common/index.mjs +18 -0
- package/esm2022/lib/common/interface/environment.interface.mjs +18 -0
- package/esm2022/lib/common/interface/index.mjs +18 -0
- package/esm2022/lib/common/interface/public-api.mjs +18 -0
- package/esm2022/lib/common/public-api.mjs +19 -0
- package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +57 -0
- package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +31 -0
- package/esm2022/lib/form/components/form-cloud.component.mjs +416 -0
- package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +54 -0
- package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +36 -0
- package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +250 -0
- package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +137 -0
- package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +107 -0
- package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +121 -0
- package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +122 -0
- package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +190 -0
- package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +86 -0
- package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +80 -0
- package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +464 -0
- package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +29 -0
- package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +47 -0
- package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +83 -0
- package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +92 -0
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +81 -0
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +54 -0
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +86 -0
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +117 -0
- package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +188 -0
- package/esm2022/lib/form/form-cloud.module.mjs +103 -0
- package/esm2022/lib/form/models/form-cloud-representation.model.mjs +48 -0
- package/esm2022/lib/form/models/task-variable-cloud.model.mjs +28 -0
- package/esm2022/lib/form/public-api.mjs +44 -0
- package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +120 -0
- package/esm2022/lib/form/services/display-mode.service.mjs +146 -0
- package/esm2022/lib/form/services/form-cloud.service.interface.mjs +18 -0
- package/esm2022/lib/form/services/form-cloud.service.mjs +201 -0
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +18 -0
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +51 -0
- package/esm2022/lib/form/services/form-utils.service.mjs +37 -0
- package/esm2022/lib/form/services/process-cloud-content.service.mjs +71 -0
- package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +52 -0
- package/esm2022/lib/group/components/group-cloud.component.mjs +424 -0
- package/esm2022/lib/group/group-cloud.module.mjs +33 -0
- package/esm2022/lib/group/models/identity-group.model.mjs +18 -0
- package/esm2022/lib/group/public-api.mjs +21 -0
- package/esm2022/lib/group/services/identity-group.service.mjs +89 -0
- package/esm2022/lib/models/application-version.model.mjs +21 -0
- package/esm2022/lib/models/constant-values.type.mjs +18 -0
- package/esm2022/lib/models/data-column-custom-data.mjs +18 -0
- package/esm2022/lib/models/date-cloud-filter.model.mjs +31 -0
- package/esm2022/lib/models/date-format-cloud.model.mjs +18 -0
- package/esm2022/lib/models/engine-event-cloud.model.mjs +18 -0
- package/esm2022/lib/models/filter-cloud-model.mjs +128 -0
- package/esm2022/lib/models/process-definition-cloud.model.mjs +32 -0
- package/esm2022/lib/models/process-instance-variable.model.mjs +18 -0
- package/esm2022/lib/models/process-variable-filter.model.mjs +18 -0
- package/esm2022/lib/models/task-cloud.model.mjs +23 -0
- package/esm2022/lib/models/task-list-sorting.model.mjs +40 -0
- package/esm2022/lib/models/variable-definition.mjs +18 -0
- package/esm2022/lib/people/components/people-cloud.component.mjs +499 -0
- package/esm2022/lib/people/models/identity-user.model.mjs +18 -0
- package/esm2022/lib/people/people-cloud.module.mjs +33 -0
- package/esm2022/lib/people/public-api.mjs +21 -0
- package/esm2022/lib/people/services/identity-user.service.mjs +119 -0
- package/esm2022/lib/process/process-cloud.module.mjs +40 -0
- package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +802 -0
- package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +59 -0
- package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +293 -0
- package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +170 -0
- package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +44 -0
- package/esm2022/lib/process/process-filters/public-api.mjs +23 -0
- package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +408 -0
- package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +137 -0
- package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +33 -0
- package/esm2022/lib/process/process-header/public-api.mjs +19 -0
- package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +594 -0
- package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +31 -0
- package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +18 -0
- package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +24 -0
- package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +37 -0
- package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +107 -0
- package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +40 -0
- package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +45 -0
- package/esm2022/lib/process/process-list/public-api.mjs +25 -0
- package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +253 -0
- package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +109 -0
- package/esm2022/lib/process/public-api.mjs +23 -0
- package/esm2022/lib/process/services/process-cloud.service.mjs +105 -0
- package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +481 -0
- package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +18 -0
- package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +26 -0
- package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +26 -0
- package/esm2022/lib/process/start-process/public-api.mjs +21 -0
- package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +125 -0
- package/esm2022/lib/process-services-cloud.module.mjs +91 -0
- package/esm2022/lib/rich-text-editor/editorjs-config.mjs +101 -0
- package/esm2022/lib/rich-text-editor/index.mjs +18 -0
- package/esm2022/lib/rich-text-editor/public-api.mjs +19 -0
- package/esm2022/lib/rich-text-editor/rich-text-editor.component.mjs +80 -0
- package/esm2022/lib/rich-text-editor/rich-text-editor.module.mjs +33 -0
- package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +186 -0
- package/esm2022/lib/screen/models/screen-cloud.model.mjs +18 -0
- package/esm2022/lib/screen/public-api.mjs +18 -0
- package/esm2022/lib/services/base-cloud.service.mjs +83 -0
- package/esm2022/lib/services/cloud-token.service.mjs +23 -0
- package/esm2022/lib/services/form-fields.interfaces.mjs +55 -0
- package/esm2022/lib/services/local-preference-cloud.service.mjs +122 -0
- package/esm2022/lib/services/notification-cloud.service.mjs +45 -0
- package/esm2022/lib/services/preference-cloud.interface.mjs +18 -0
- package/esm2022/lib/services/public-api.mjs +28 -0
- package/esm2022/lib/services/screen-rendering.service.mjs +30 -0
- package/esm2022/lib/services/task-list-cloud.service.interface.mjs +18 -0
- package/esm2022/lib/services/user-preference-cloud.service.mjs +105 -0
- package/esm2022/lib/services/variable-mapper.sevice.mjs +77 -0
- package/esm2022/lib/services/web-socket.service.mjs +146 -0
- package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +32 -0
- package/esm2022/lib/task/models/task-details-cloud.model.mjs +26 -0
- package/esm2022/lib/task/models/task.model.mjs +23 -0
- package/esm2022/lib/task/public-api.mjs +26 -0
- package/esm2022/lib/task/services/task-cloud.service.mjs +272 -0
- package/esm2022/lib/task/task-cloud.module.mjs +45 -0
- package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +59 -0
- package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +467 -0
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +206 -0
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +318 -0
- package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +147 -0
- package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +143 -0
- package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +73 -0
- package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +256 -0
- package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +207 -0
- package/esm2022/lib/task/task-filters/public-api.mjs +27 -0
- package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +283 -0
- package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +392 -0
- package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +56 -0
- package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +214 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +89 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +284 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +101 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +87 -0
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +79 -0
- package/esm2022/lib/task/task-form/public-api.mjs +21 -0
- package/esm2022/lib/task/task-form/task-form.module.mjs +36 -0
- package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +280 -0
- package/esm2022/lib/task/task-header/public-api.mjs +19 -0
- package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +33 -0
- package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +331 -0
- package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +116 -0
- package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +31 -0
- package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +390 -0
- package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +18 -0
- package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +18 -0
- package/esm2022/lib/task/task-list/public-api.mjs +23 -0
- package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +115 -0
- package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +178 -0
- package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +57 -0
- package/esm2022/lib/types.mjs +18 -0
- package/esm2022/public-api.mjs +40 -0
- package/fesm2022/adf-process-services-cloud.mjs +347 -346
- package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
- package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
- package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
- package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
|
18
|
+
import { Component, DestroyRef, ElementRef, EventEmitter, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
19
|
+
import { BehaviorSubject } from 'rxjs';
|
|
20
|
+
import { debounceTime, distinctUntilChanged, filter, mergeMap, switchMap, tap } from 'rxjs/operators';
|
|
21
|
+
import { FullNamePipe, InitialUsernamePipe } from '@alfresco/adf-core';
|
|
22
|
+
import { animate, state, style, transition, trigger } from '@angular/animations';
|
|
23
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
24
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
25
|
+
import { CommonModule } from '@angular/common';
|
|
26
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
27
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
28
|
+
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
29
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
30
|
+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
31
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
32
|
+
import { MatInputModule } from '@angular/material/input';
|
|
33
|
+
import { IdentityUserService } from '../services/identity-user.service';
|
|
34
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
35
|
+
import * as i0 from "@angular/core";
|
|
36
|
+
import * as i1 from "../services/identity-user.service";
|
|
37
|
+
import * as i2 from "@angular/common";
|
|
38
|
+
import * as i3 from "@ngx-translate/core";
|
|
39
|
+
import * as i4 from "@angular/material/icon";
|
|
40
|
+
import * as i5 from "@angular/material/form-field";
|
|
41
|
+
import * as i6 from "@angular/material/progress-bar";
|
|
42
|
+
import * as i7 from "@angular/material/core";
|
|
43
|
+
import * as i8 from "@angular/material/autocomplete";
|
|
44
|
+
import * as i9 from "@angular/forms";
|
|
45
|
+
import * as i10 from "@angular/material/chips";
|
|
46
|
+
import * as i11 from "@angular/material/input";
|
|
47
|
+
import * as i12 from "@angular/material/tooltip";
|
|
48
|
+
export class PeopleCloudComponent {
|
|
49
|
+
constructor(identityUserService) {
|
|
50
|
+
this.identityUserService = identityUserService;
|
|
51
|
+
/** User selection mode (single/multiple). */
|
|
52
|
+
this.mode = 'single';
|
|
53
|
+
/**
|
|
54
|
+
* This flag enables the validation on the preSelectUsers passed as input.
|
|
55
|
+
* In case the flag is true the components call the identity service to verify the validity of the information passed as input.
|
|
56
|
+
* Otherwise, no check will be done.
|
|
57
|
+
*/
|
|
58
|
+
this.validate = false;
|
|
59
|
+
/**
|
|
60
|
+
* Show the info in readonly mode
|
|
61
|
+
*/
|
|
62
|
+
this.readOnly = false;
|
|
63
|
+
/**
|
|
64
|
+
* Mark this field as required
|
|
65
|
+
*/
|
|
66
|
+
this.required = false;
|
|
67
|
+
/**
|
|
68
|
+
* Array of users to be pre-selected. All users in the
|
|
69
|
+
* array are pre-selected in multi selection mode, but only the first user
|
|
70
|
+
* is pre-selected in single selection mode.
|
|
71
|
+
* Mandatory properties are: id, email, username
|
|
72
|
+
*/
|
|
73
|
+
this.preSelectUsers = [];
|
|
74
|
+
/**
|
|
75
|
+
* Array of users to be excluded.
|
|
76
|
+
* Mandatory properties are: id, email, username
|
|
77
|
+
*/
|
|
78
|
+
this.excludedUsers = [];
|
|
79
|
+
/**
|
|
80
|
+
* Array of groups to restrict user searches.
|
|
81
|
+
* Mandatory property is group name
|
|
82
|
+
*/
|
|
83
|
+
this.groupsRestriction = [];
|
|
84
|
+
/** FormControl to list of users */
|
|
85
|
+
this.userChipsCtrl = new UntypedFormControl({ value: '', disabled: false });
|
|
86
|
+
/** FormControl to search the user */
|
|
87
|
+
this.searchUserCtrl = new UntypedFormControl({ value: '', disabled: false });
|
|
88
|
+
/**
|
|
89
|
+
* Hide the matInput associated with the chip grid when a single user is selected in single selection mode.
|
|
90
|
+
* The input will be shown again when the user is removed using the icon on the chip.
|
|
91
|
+
*/
|
|
92
|
+
this.hideInputOnSingleSelection = false;
|
|
93
|
+
/**
|
|
94
|
+
* Material form field appearance (fill / outline)
|
|
95
|
+
*/
|
|
96
|
+
this.formFieldAppearance = 'fill';
|
|
97
|
+
/**
|
|
98
|
+
* Material form field subscript sizing (fixed / dynamic)
|
|
99
|
+
*/
|
|
100
|
+
this.formFieldSubscriptSizing = 'fixed';
|
|
101
|
+
/**
|
|
102
|
+
* Show errors under the form field
|
|
103
|
+
*/
|
|
104
|
+
this.showErrors = true;
|
|
105
|
+
/**
|
|
106
|
+
* Show the full name of the user on hover in the chips
|
|
107
|
+
*/
|
|
108
|
+
this.showFullNameOnHover = false;
|
|
109
|
+
/** Emitted when a user is selected. */
|
|
110
|
+
this.selectUser = new EventEmitter();
|
|
111
|
+
/** Emitted when a selected user is removed in multi selection mode. */
|
|
112
|
+
this.removeUser = new EventEmitter();
|
|
113
|
+
/** Emitted when a user selection change. */
|
|
114
|
+
this.changedUsers = new EventEmitter();
|
|
115
|
+
/** Emitted when an warning occurs. */
|
|
116
|
+
this.warning = new EventEmitter();
|
|
117
|
+
this.searchUsers = [];
|
|
118
|
+
this.selectedUsers = [];
|
|
119
|
+
this.invalidUsers = [];
|
|
120
|
+
this.searchUsers$ = new BehaviorSubject(this.searchUsers);
|
|
121
|
+
this.subscriptAnimationState = 'enter';
|
|
122
|
+
this.touched = false;
|
|
123
|
+
this.searchedValue = '';
|
|
124
|
+
this.validationLoading = false;
|
|
125
|
+
this.searchLoading = false;
|
|
126
|
+
this.destroyRef = inject(DestroyRef);
|
|
127
|
+
}
|
|
128
|
+
ngOnInit() {
|
|
129
|
+
this.initSearch();
|
|
130
|
+
}
|
|
131
|
+
ngOnChanges(changes) {
|
|
132
|
+
if (this.hasPreselectedUsersChanged(changes) || this.hasModeChanged(changes) || this.isValidationChanged(changes)) {
|
|
133
|
+
if (this.hasPreSelectUsers()) {
|
|
134
|
+
this.loadPreSelectUsers();
|
|
135
|
+
}
|
|
136
|
+
else if (this.hasPreselectedUsersCleared(changes)) {
|
|
137
|
+
this.selectedUsers = [];
|
|
138
|
+
this.invalidUsers = [];
|
|
139
|
+
}
|
|
140
|
+
if (!this.isValidationEnabled()) {
|
|
141
|
+
this.invalidUsers = [];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (this.isReadonly() && this.searchUserCtrl.enabled) {
|
|
145
|
+
this.searchUserCtrl.disable();
|
|
146
|
+
}
|
|
147
|
+
else if (!this.isReadonly() && this.searchUserCtrl.disabled) {
|
|
148
|
+
this.searchUserCtrl.enable();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
ngAfterViewInit() {
|
|
152
|
+
if (this.hideInputOnSingleSelection) {
|
|
153
|
+
if (this.selectedUsers.length === 1 && this.isSingleMode() && this.userInput) {
|
|
154
|
+
this.userInput.nativeElement.style.display = 'none';
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
initSearch() {
|
|
159
|
+
this.initializeStream();
|
|
160
|
+
this.typingUniqueValueNotEmpty$
|
|
161
|
+
.pipe(filter((name) => name.length >= 1), switchMap((name) => this.identityUserService.search(name, { roles: this.roles, withinApplication: this.appName, groups: this.groupsRestriction })), mergeMap((users) => {
|
|
162
|
+
this.resetSearchUsers();
|
|
163
|
+
this.searchLoading = false;
|
|
164
|
+
return users;
|
|
165
|
+
}), filter((user) => !this.isUserAlreadySelected(user) && !this.isExcludedUser(user)), takeUntilDestroyed(this.destroyRef))
|
|
166
|
+
.subscribe((user) => {
|
|
167
|
+
this.searchUsers.push(user);
|
|
168
|
+
this.searchUsers$.next(this.searchUsers);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
initializeStream() {
|
|
172
|
+
const typingValueFromControl$ = this.searchUserCtrl.valueChanges;
|
|
173
|
+
const typingValueTypeSting$ = typingValueFromControl$.pipe(filter((value) => {
|
|
174
|
+
this.searchLoading = true;
|
|
175
|
+
return typeof value === 'string';
|
|
176
|
+
}));
|
|
177
|
+
const typingValueHandleErrorMessage$ = typingValueTypeSting$.pipe(tap((value) => {
|
|
178
|
+
if (value) {
|
|
179
|
+
this.setTypingError();
|
|
180
|
+
}
|
|
181
|
+
}));
|
|
182
|
+
const typingValueDebouncedUnique$ = typingValueHandleErrorMessage$.pipe(debounceTime(500), distinctUntilChanged());
|
|
183
|
+
this.typingUniqueValueNotEmpty$ = typingValueDebouncedUnique$.pipe(tap((value) => {
|
|
184
|
+
if (value.trim()) {
|
|
185
|
+
this.searchedValue = value;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
this.searchUserCtrl.markAsPristine();
|
|
189
|
+
this.searchUserCtrl.markAsUntouched();
|
|
190
|
+
}
|
|
191
|
+
}), tap(() => this.resetSearchUsers()));
|
|
192
|
+
}
|
|
193
|
+
isValidationEnabled() {
|
|
194
|
+
return this.validate === true;
|
|
195
|
+
}
|
|
196
|
+
isUserAlreadySelected(searchUser) {
|
|
197
|
+
if (this.selectedUsers && this.selectedUsers.length > 0) {
|
|
198
|
+
const result = this.selectedUsers.find((selectedUser) => this.equalsUsers(selectedUser, searchUser));
|
|
199
|
+
return !!result;
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
isExcludedUser(searchUser) {
|
|
204
|
+
if (this.excludedUsers?.length > 0) {
|
|
205
|
+
return !!this.excludedUsers.find((excludedUser) => this.equalsUsers(excludedUser, searchUser));
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
async loadPreSelectUsers() {
|
|
210
|
+
this.selectedUsers = [];
|
|
211
|
+
if (this.isSingleMode()) {
|
|
212
|
+
this.selectedUsers = [this.preSelectUsers[0]];
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
this.selectedUsers = this.removeDuplicatedUsers(this.preSelectUsers);
|
|
216
|
+
}
|
|
217
|
+
this.userChipsCtrl.setValue(this.selectedUsers[0].username);
|
|
218
|
+
if (this.isValidationEnabled()) {
|
|
219
|
+
this.validationLoading = true;
|
|
220
|
+
await this.validatePreselectUsers();
|
|
221
|
+
this.validationLoading = false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
getPreselectedUsers() {
|
|
225
|
+
if (this.isSingleMode()) {
|
|
226
|
+
return [this.preSelectUsers[0]];
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
return this.removeDuplicatedUsers(this.preSelectUsers);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async validatePreselectUsers() {
|
|
233
|
+
this.invalidUsers = [];
|
|
234
|
+
for (const user of this.getPreselectedUsers()) {
|
|
235
|
+
try {
|
|
236
|
+
const validationResult = (await this.identityUserService
|
|
237
|
+
.search(user.username, { roles: this.roles, withinApplication: this.appName, groups: this.groupsRestriction })
|
|
238
|
+
.toPromise())[0];
|
|
239
|
+
if (!this.equalsUsers(user, validationResult)) {
|
|
240
|
+
this.invalidUsers.push(user);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
this.invalidUsers.push(user);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
this.checkPreselectValidationErrors();
|
|
248
|
+
}
|
|
249
|
+
equalsUsers(preselectedUser, identityUser) {
|
|
250
|
+
if (preselectedUser && identityUser) {
|
|
251
|
+
const uniquePropertyIdentifiers = ['id', 'username', 'email'];
|
|
252
|
+
for (const property of Object.keys(preselectedUser)) {
|
|
253
|
+
if (preselectedUser[property] !== undefined && uniquePropertyIdentifiers.includes(property)) {
|
|
254
|
+
return preselectedUser[property] === identityUser[property];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
removeDuplicatedUsers(users) {
|
|
261
|
+
return users.filter((user, index, self) => index === self.findIndex((auxUser) => user.id === auxUser.id && user.username === auxUser.username && user.email === auxUser.email));
|
|
262
|
+
}
|
|
263
|
+
onSelect(user) {
|
|
264
|
+
if (user) {
|
|
265
|
+
this.selectUser.emit(user);
|
|
266
|
+
if (this.isMultipleMode()) {
|
|
267
|
+
if (!this.isUserAlreadySelected(user)) {
|
|
268
|
+
this.selectedUsers.push(user);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
this.invalidUsers = [];
|
|
273
|
+
this.selectedUsers = [user];
|
|
274
|
+
if (this.hideInputOnSingleSelection) {
|
|
275
|
+
this.userInput.nativeElement.style.display = 'none';
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
this.userInput.nativeElement.value = '';
|
|
279
|
+
this.searchUserCtrl.setValue('');
|
|
280
|
+
this.userChipsControlValue(this.selectedUsers[0].username);
|
|
281
|
+
this.changedUsers.emit(this.selectedUsers);
|
|
282
|
+
this.resetSearchUsers();
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
onRemove(userToRemove) {
|
|
286
|
+
this.removeUser.emit(userToRemove);
|
|
287
|
+
this.removeUserFromSelected(userToRemove);
|
|
288
|
+
this.changedUsers.emit(this.selectedUsers);
|
|
289
|
+
if (this.selectedUsers.length === 0) {
|
|
290
|
+
this.userChipsControlValue('');
|
|
291
|
+
if (this.hideInputOnSingleSelection) {
|
|
292
|
+
this.userInput.nativeElement.style.display = 'block';
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.userChipsControlValue(this.selectedUsers[0].username);
|
|
297
|
+
}
|
|
298
|
+
this.searchUserCtrl.markAsDirty();
|
|
299
|
+
this.searchUserCtrl.markAsTouched();
|
|
300
|
+
if (this.isValidationEnabled()) {
|
|
301
|
+
this.removeUserFromValidation(userToRemove);
|
|
302
|
+
this.checkPreselectValidationErrors();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
checkPreselectValidationErrors() {
|
|
306
|
+
this.invalidUsers = this.removeDuplicatedUsers(this.invalidUsers);
|
|
307
|
+
if (this.invalidUsers.length > 0) {
|
|
308
|
+
this.generateInvalidUsersMessage();
|
|
309
|
+
}
|
|
310
|
+
this.warning.emit({
|
|
311
|
+
message: 'INVALID_PRESELECTED_USERS',
|
|
312
|
+
users: this.invalidUsers
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
removeUserFromSelected({ id, username, email }) {
|
|
316
|
+
const indexToRemove = this.selectedUsers.findIndex((user) => user.id === id && user.username === username && user.email === email);
|
|
317
|
+
if (indexToRemove !== -1) {
|
|
318
|
+
this.selectedUsers.splice(indexToRemove, 1);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
removeUserFromValidation({ id, username, email }) {
|
|
322
|
+
const indexToRemove = this.invalidUsers.findIndex((user) => user.id === id && user.username === username && user.email === email);
|
|
323
|
+
if (indexToRemove !== -1) {
|
|
324
|
+
this.invalidUsers.splice(indexToRemove, 1);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
generateInvalidUsersMessage() {
|
|
328
|
+
this.validateUsersMessage = '';
|
|
329
|
+
this.invalidUsers.forEach((invalidUser, index) => {
|
|
330
|
+
if (index === this.invalidUsers.length - 1) {
|
|
331
|
+
this.validateUsersMessage += `${invalidUser.username} `;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
this.validateUsersMessage += `${invalidUser.username}, `;
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
hasPreselectError() {
|
|
339
|
+
return this.invalidUsers && this.invalidUsers.length > 0;
|
|
340
|
+
}
|
|
341
|
+
getDisplayName(user) {
|
|
342
|
+
return FullNamePipe.prototype.transform(user);
|
|
343
|
+
}
|
|
344
|
+
isMultipleMode() {
|
|
345
|
+
return this.mode === 'multiple';
|
|
346
|
+
}
|
|
347
|
+
isSingleMode() {
|
|
348
|
+
return this.mode === 'single';
|
|
349
|
+
}
|
|
350
|
+
isSingleSelectionReadonly() {
|
|
351
|
+
return this.isSingleMode() && this.selectedUsers.length === 1 && this.selectedUsers[0].readonly === true;
|
|
352
|
+
}
|
|
353
|
+
hasPreSelectUsers() {
|
|
354
|
+
return this.preSelectUsers && this.preSelectUsers.length > 0;
|
|
355
|
+
}
|
|
356
|
+
hasModeChanged(changes) {
|
|
357
|
+
return changes?.mode && changes.mode.currentValue !== changes.mode.previousValue;
|
|
358
|
+
}
|
|
359
|
+
isValidationChanged(changes) {
|
|
360
|
+
return changes?.validate && changes.validate.currentValue !== changes.validate.previousValue;
|
|
361
|
+
}
|
|
362
|
+
hasPreselectedUsersChanged(changes) {
|
|
363
|
+
return changes?.preSelectUsers && changes.preSelectUsers.currentValue !== changes.preSelectUsers.previousValue;
|
|
364
|
+
}
|
|
365
|
+
hasPreselectedUsersCleared(changes) {
|
|
366
|
+
return changes?.preSelectUsers?.currentValue?.length === 0;
|
|
367
|
+
}
|
|
368
|
+
resetSearchUsers() {
|
|
369
|
+
this.searchUsers = [];
|
|
370
|
+
this.searchUsers$.next(this.searchUsers);
|
|
371
|
+
}
|
|
372
|
+
setTypingError() {
|
|
373
|
+
this.searchUserCtrl.setErrors({
|
|
374
|
+
searchTypingError: true,
|
|
375
|
+
...this.searchUserCtrl.errors
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
userChipsControlValue(value) {
|
|
379
|
+
this.userChipsCtrl.setValue(value);
|
|
380
|
+
this.userChipsCtrl.markAsDirty();
|
|
381
|
+
this.userChipsCtrl.markAsTouched();
|
|
382
|
+
}
|
|
383
|
+
getSelectedUsers() {
|
|
384
|
+
return this.selectedUsers;
|
|
385
|
+
}
|
|
386
|
+
isReadonly() {
|
|
387
|
+
return this.readOnly || this.isSingleSelectionReadonly();
|
|
388
|
+
}
|
|
389
|
+
isValidationLoading() {
|
|
390
|
+
return this.isValidationEnabled() && this.validationLoading;
|
|
391
|
+
}
|
|
392
|
+
markAsTouched() {
|
|
393
|
+
this.touched = true;
|
|
394
|
+
}
|
|
395
|
+
isTouched() {
|
|
396
|
+
return this.touched;
|
|
397
|
+
}
|
|
398
|
+
isSelected() {
|
|
399
|
+
return this.selectedUsers && !!this.selectedUsers.length;
|
|
400
|
+
}
|
|
401
|
+
isDirty() {
|
|
402
|
+
return this.isTouched() && !this.isSelected();
|
|
403
|
+
}
|
|
404
|
+
setFocus(isFocused) {
|
|
405
|
+
this.isFocused = isFocused;
|
|
406
|
+
}
|
|
407
|
+
hasError() {
|
|
408
|
+
return !!this.searchUserCtrl.errors;
|
|
409
|
+
}
|
|
410
|
+
getValidationPattern() {
|
|
411
|
+
return this.searchUserCtrl.errors.pattern.requiredPattern;
|
|
412
|
+
}
|
|
413
|
+
getValidationMaxLength() {
|
|
414
|
+
return this.searchUserCtrl.errors.maxlength.requiredLength;
|
|
415
|
+
}
|
|
416
|
+
getValidationMinLength() {
|
|
417
|
+
return this.searchUserCtrl.errors.minlength.requiredLength;
|
|
418
|
+
}
|
|
419
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PeopleCloudComponent, deps: [{ token: i1.IdentityUserService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
420
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PeopleCloudComponent, isStandalone: true, selector: "adf-cloud-people", inputs: { label: "label", appName: "appName", mode: "mode", roles: "roles", validate: "validate", readOnly: "readOnly", required: "required", preSelectUsers: "preSelectUsers", excludedUsers: "excludedUsers", groupsRestriction: "groupsRestriction", userChipsCtrl: "userChipsCtrl", searchUserCtrl: "searchUserCtrl", title: "title", placeholder: "placeholder", hideInputOnSingleSelection: "hideInputOnSingleSelection", formFieldAppearance: "formFieldAppearance", formFieldSubscriptSizing: "formFieldSubscriptSizing", showErrors: "showErrors", showFullNameOnHover: "showFullNameOnHover" }, outputs: { selectUser: "selectUser", removeUser: "removeUser", changedUsers: "changedUsers", warning: "warning" }, providers: [FullNamePipe], viewQueries: [{ propertyName: "userInput", first: true, predicate: ["userInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<form>\n <mat-form-field\n [subscriptSizing]=\"formFieldSubscriptSizing\"\n [floatLabel]=\"'auto'\"\n class=\"adf-people-cloud\"\n [class.adf-invalid]=\"hasError() && isDirty()\"\n >\n <mat-label *ngIf=\"!title\">\n <span>{{label}}</span>\n <span class=\"adf-asterisk\" [style.visibility]=\"required ? 'visible' : 'hidden'\">*</span>\n </mat-label>\n <mat-label *ngIf=\"title\">{{ title | translate }}</mat-label>\n\n <mat-chip-grid #userMultipleChipList data-automation-id=\"adf-cloud-people-chip-list\">\n <mat-chip-row\n *ngFor=\"let user of selectedUsers\"\n [removable]=\"!user.readonly\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-' + user.username\"\n (removed)=\"onRemove(user)\"\n [disabled]=\"isReadonly() || isValidationLoading()\"\n title=\"{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}\"\n [matTooltip]=\"showFullNameOnHover ? (user | fullName : true) : user.email\"\n >\n {{ user | fullName }}\n <mat-icon\n matChipRemove\n *ngIf=\"!(user.readonly || readOnly)\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-remove-icon-' + user.username\"\n >\n cancel\n </mat-icon>\n </mat-chip-row>\n <input\n matInput\n [disabled]=\"isReadonly()\"\n [formControl]=\"searchUserCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"userMultipleChipList\"\n [required]=\"required\"\n [placeholder]=\"placeholder\"\n (focus)=\"setFocus(true)\"\n (blur)=\"setFocus(false); markAsTouched()\"\n class=\"adf-cloud-input\"\n data-automation-id=\"adf-people-cloud-search-input\"\n #userInput\n />\n </mat-chip-grid>\n\n <mat-autocomplete\n autoActiveFirstOption\n class=\"adf-people-cloud-list\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option.value)\"\n [displayWith]=\"getDisplayName\"\n >\n <ng-container *ngIf=\"(searchUsers$ | async)?.length; else noResults\">\n <mat-option *ngFor=\"let user of searchUsers$ | async; let i = index\" [value]=\"user\" class=\"adf-people-cloud-option-active\">\n <div class=\"adf-people-cloud-row\" id=\"adf-people-cloud-user-{{ user.username }}\" data-automation-id=\"adf-people-cloud-row\">\n <div [outerHTML]=\"user | usernameInitials : 'adf-people-cloud-pic'\"></div>\n <span class=\"adf-people-label-name\"> {{ user | fullName : true }}</span>\n </div>\n </mat-option>\n </ng-container>\n <ng-template #noResults>\n <mat-option\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !searchLoading\"\n disabled\n class=\"adf-people-cloud-option-not-active\"\n data-automation-id=\"adf-people-cloud-no-results\"\n >\n <span> {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</span>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n </mat-form-field>\n\n <mat-progress-bar *ngIf=\"validationLoading\" mode=\"indeterminate\" />\n\n <div class=\"adf-error-container adf-error-messages-container\" *ngIf=\"showErrors\">\n <mat-error *ngIf=\"hasPreselectError() && !isValidationLoading()\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: validateUsersMessage } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('pattern')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate : { pattern: getValidationPattern() } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('maxlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate : { requiredLength: getValidationMaxLength() } }}\n </div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('minlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate : { requiredLength: getValidationMinLength() } }}\n </div>\n </mat-error>\n <mat-error\n *ngIf=\"(searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()\"\n [@transitionMessages]=\"subscriptAnimationState\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}</div>\n </mat-error>\n <mat-error\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !this.isFocused\"\n [@transitionMessages]=\"subscriptAnimationState\"\n data-automation-id=\"invalid-users-typing-error\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</div>\n </mat-error>\n </div>\n</form>\n", styles: [".adf-people-cloud{width:100%}.adf-people-cloud-option-not-active:not(.adf-people-cloud:active){background:inherit;color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title{color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title--focus{color:var(--theme-primary-color)}.adf-people-cloud-list{margin:5px 0;padding:10px 0}.adf-people-cloud-option-active:not(.adf:disabled){color:var(--adf-theme-foreground-text-color)}.adf-people-cloud-option-not-active:not(.adf:active){color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-row{display:flex;align-items:center;column-gap:10px}.adf-people-cloud-pic{background:var(--theme-primary-color);display:flex;justify-content:center;align-items:center;width:40px;height:40px;border-radius:100px;text-transform:uppercase}.adf-start-task-cloud-error{margin-top:-10px;position:absolute;height:20px}.adf-start-task-cloud-error-message{padding-right:8px;height:16px;line-height:1.33;width:auto}.adf-error,.adf-error-text,.adf-error-icon{color:var(--theme-warn-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i6.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i7.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: InitialUsernamePipe, name: "usernameInitials" }, { kind: "pipe", type: FullNamePipe, name: "fullName" }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i8.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i8.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i9.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i10.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i10.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i10.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i10.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], animations: [
|
|
421
|
+
trigger('transitionMessages', [
|
|
422
|
+
state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),
|
|
423
|
+
transition('void => enter', [style({ opacity: 0, transform: 'translateY(-100%)' }), animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)')])
|
|
424
|
+
])
|
|
425
|
+
], encapsulation: i0.ViewEncapsulation.None }); }
|
|
426
|
+
}
|
|
427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PeopleCloudComponent, decorators: [{
|
|
428
|
+
type: Component,
|
|
429
|
+
args: [{ selector: 'adf-cloud-people', standalone: true, imports: [
|
|
430
|
+
CommonModule,
|
|
431
|
+
TranslateModule,
|
|
432
|
+
MatIconModule,
|
|
433
|
+
MatFormFieldModule,
|
|
434
|
+
MatProgressBarModule,
|
|
435
|
+
MatSelectModule,
|
|
436
|
+
InitialUsernamePipe,
|
|
437
|
+
FullNamePipe,
|
|
438
|
+
MatAutocompleteModule,
|
|
439
|
+
ReactiveFormsModule,
|
|
440
|
+
MatChipsModule,
|
|
441
|
+
MatInputModule,
|
|
442
|
+
MatTooltipModule
|
|
443
|
+
], providers: [FullNamePipe], animations: [
|
|
444
|
+
trigger('transitionMessages', [
|
|
445
|
+
state('enter', style({ opacity: 1, transform: 'translateY(0%)' })),
|
|
446
|
+
transition('void => enter', [style({ opacity: 0, transform: 'translateY(-100%)' }), animate('300ms cubic-bezier(0.55, 0, 0.55, 0.2)')])
|
|
447
|
+
])
|
|
448
|
+
], encapsulation: ViewEncapsulation.None, template: "<form>\n <mat-form-field\n [subscriptSizing]=\"formFieldSubscriptSizing\"\n [floatLabel]=\"'auto'\"\n class=\"adf-people-cloud\"\n [class.adf-invalid]=\"hasError() && isDirty()\"\n >\n <mat-label *ngIf=\"!title\">\n <span>{{label}}</span>\n <span class=\"adf-asterisk\" [style.visibility]=\"required ? 'visible' : 'hidden'\">*</span>\n </mat-label>\n <mat-label *ngIf=\"title\">{{ title | translate }}</mat-label>\n\n <mat-chip-grid #userMultipleChipList data-automation-id=\"adf-cloud-people-chip-list\">\n <mat-chip-row\n *ngFor=\"let user of selectedUsers\"\n [removable]=\"!user.readonly\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-' + user.username\"\n (removed)=\"onRemove(user)\"\n [disabled]=\"isReadonly() || isValidationLoading()\"\n title=\"{{ (user.readonly ? 'ADF_CLOUD_GROUPS.MANDATORY' : '') | translate }}\"\n [matTooltip]=\"showFullNameOnHover ? (user | fullName : true) : user.email\"\n >\n {{ user | fullName }}\n <mat-icon\n matChipRemove\n *ngIf=\"!(user.readonly || readOnly)\"\n [attr.data-automation-id]=\"'adf-people-cloud-chip-remove-icon-' + user.username\"\n >\n cancel\n </mat-icon>\n </mat-chip-row>\n <input\n matInput\n [disabled]=\"isReadonly()\"\n [formControl]=\"searchUserCtrl\"\n [matAutocomplete]=\"auto\"\n [matChipInputFor]=\"userMultipleChipList\"\n [required]=\"required\"\n [placeholder]=\"placeholder\"\n (focus)=\"setFocus(true)\"\n (blur)=\"setFocus(false); markAsTouched()\"\n class=\"adf-cloud-input\"\n data-automation-id=\"adf-people-cloud-search-input\"\n #userInput\n />\n </mat-chip-grid>\n\n <mat-autocomplete\n autoActiveFirstOption\n class=\"adf-people-cloud-list\"\n #auto=\"matAutocomplete\"\n (optionSelected)=\"onSelect($event.option.value)\"\n [displayWith]=\"getDisplayName\"\n >\n <ng-container *ngIf=\"(searchUsers$ | async)?.length; else noResults\">\n <mat-option *ngFor=\"let user of searchUsers$ | async; let i = index\" [value]=\"user\" class=\"adf-people-cloud-option-active\">\n <div class=\"adf-people-cloud-row\" id=\"adf-people-cloud-user-{{ user.username }}\" data-automation-id=\"adf-people-cloud-row\">\n <div [outerHTML]=\"user | usernameInitials : 'adf-people-cloud-pic'\"></div>\n <span class=\"adf-people-label-name\"> {{ user | fullName : true }}</span>\n </div>\n </mat-option>\n </ng-container>\n <ng-template #noResults>\n <mat-option\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !searchLoading\"\n disabled\n class=\"adf-people-cloud-option-not-active\"\n data-automation-id=\"adf-people-cloud-no-results\"\n >\n <span> {{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</span>\n </mat-option>\n </ng-template>\n </mat-autocomplete>\n </mat-form-field>\n\n <mat-progress-bar *ngIf=\"validationLoading\" mode=\"indeterminate\" />\n\n <div class=\"adf-error-container adf-error-messages-container\" *ngIf=\"showErrors\">\n <mat-error *ngIf=\"hasPreselectError() && !isValidationLoading()\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: validateUsersMessage } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('pattern')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_PATTERN' | translate : { pattern: getValidationPattern() } }}</div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('maxlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MAX_LENGTH' | translate : { requiredLength: getValidationMaxLength() } }}\n </div>\n </mat-error>\n <mat-error *ngIf=\"searchUserCtrl.hasError('minlength')\" [@transitionMessages]=\"subscriptAnimationState\" class=\"adf-error\">\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">\n {{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.INVALID_MIN_LENGTH' | translate : { requiredLength: getValidationMinLength() } }}\n </div>\n </mat-error>\n <mat-error\n *ngIf=\"(searchUserCtrl.hasError('required') || userChipsCtrl.hasError('required')) && isDirty()\"\n [@transitionMessages]=\"subscriptAnimationState\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_PEOPLE_GROUPS.ERROR.REQUIRED' | translate }}</div>\n </mat-error>\n <mat-error\n *ngIf=\"searchUserCtrl.hasError('searchTypingError') && !this.isFocused\"\n [@transitionMessages]=\"subscriptAnimationState\"\n data-automation-id=\"invalid-users-typing-error\"\n class=\"adf-error\"\n >\n <mat-icon class=\"adf-error-icon\">error_outline</mat-icon>\n <div class=\"adf-error-text\">{{ 'ADF_CLOUD_USERS.ERROR.NOT_FOUND' | translate : { userName: searchedValue } }}</div>\n </mat-error>\n </div>\n</form>\n", styles: [".adf-people-cloud{width:100%}.adf-people-cloud-option-not-active:not(.adf-people-cloud:active){background:inherit;color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title{color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-title--focus{color:var(--theme-primary-color)}.adf-people-cloud-list{margin:5px 0;padding:10px 0}.adf-people-cloud-option-active:not(.adf:disabled){color:var(--adf-theme-foreground-text-color)}.adf-people-cloud-option-not-active:not(.adf:active){color:var(--adf-theme-foreground-secondary-text-color)}.adf-people-cloud-row{display:flex;align-items:center;column-gap:10px}.adf-people-cloud-pic{background:var(--theme-primary-color);display:flex;justify-content:center;align-items:center;width:40px;height:40px;border-radius:100px;text-transform:uppercase}.adf-start-task-cloud-error{margin-top:-10px;position:absolute;height:20px}.adf-start-task-cloud-error-message{padding-right:8px;height:16px;line-height:1.33;width:auto}.adf-error,.adf-error-text,.adf-error-icon{color:var(--theme-warn-color)}\n"] }]
|
|
449
|
+
}], ctorParameters: () => [{ type: i1.IdentityUserService }], propDecorators: { label: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], appName: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], mode: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}], roles: [{
|
|
456
|
+
type: Input
|
|
457
|
+
}], validate: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], readOnly: [{
|
|
460
|
+
type: Input
|
|
461
|
+
}], required: [{
|
|
462
|
+
type: Input
|
|
463
|
+
}], preSelectUsers: [{
|
|
464
|
+
type: Input
|
|
465
|
+
}], excludedUsers: [{
|
|
466
|
+
type: Input
|
|
467
|
+
}], groupsRestriction: [{
|
|
468
|
+
type: Input
|
|
469
|
+
}], userChipsCtrl: [{
|
|
470
|
+
type: Input
|
|
471
|
+
}], searchUserCtrl: [{
|
|
472
|
+
type: Input
|
|
473
|
+
}], title: [{
|
|
474
|
+
type: Input
|
|
475
|
+
}], placeholder: [{
|
|
476
|
+
type: Input
|
|
477
|
+
}], hideInputOnSingleSelection: [{
|
|
478
|
+
type: Input
|
|
479
|
+
}], formFieldAppearance: [{
|
|
480
|
+
type: Input
|
|
481
|
+
}], formFieldSubscriptSizing: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], showErrors: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], showFullNameOnHover: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], selectUser: [{
|
|
488
|
+
type: Output
|
|
489
|
+
}], removeUser: [{
|
|
490
|
+
type: Output
|
|
491
|
+
}], changedUsers: [{
|
|
492
|
+
type: Output
|
|
493
|
+
}], warning: [{
|
|
494
|
+
type: Output
|
|
495
|
+
}], userInput: [{
|
|
496
|
+
type: ViewChild,
|
|
497
|
+
args: ['userInput']
|
|
498
|
+
}] } });
|
|
499
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVvcGxlLWNsb3VkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcGVvcGxlL2NvbXBvbmVudHMvcGVvcGxlLWNsb3VkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcGVvcGxlL2NvbXBvbmVudHMvcGVvcGxlLWNsb3VkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFFSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHakYsT0FBTyxFQUEwQixrQkFBa0IsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFF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UTtzQkFEUCxLQUFLO2dCQU9OLFFBQVE7c0JBRFAsS0FBSztnQkFVTixjQUFjO3NCQURiLEtBQUs7Z0JBUU4sYUFBYTtzQkFEWixLQUFLO2dCQVFOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixhQUFhO3NCQURaLEtBQUs7Z0JBS04sY0FBYztzQkFEYixLQUFLO2dCQU9OLEtBQUs7c0JBREosS0FBSztnQkFPTixXQUFXO3NCQURWLEtBQUs7Z0JBUU4sMEJBQTBCO3NCQUR6QixLQUFLO2dCQU9OLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFPTix3QkFBd0I7c0JBRHZCLEtBQUs7Z0JBT04sVUFBVTtzQkFEVCxLQUFLO2dCQU9OLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFLTixVQUFVO3NCQURULE1BQU07Z0JBS1AsVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFlBQVk7c0JBRFgsTUFBTTtnQkFLUCxPQUFPO3NCQUROLE1BQU07Z0JBSUMsU0FBUztzQkFEaEIsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1lcmdlTWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZ1bGxOYW1lUGlwZSwgSW5pdGlhbFVzZXJuYW1lUGlwZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IENvbXBvbmVudFNlbGVjdGlvbk1vZGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJNb2RlbCB9IGZyb20gJy4uL21vZGVscy9pZGVudGl0eS11c2VyLm1vZGVsJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UsIE1hdEZvcm1GaWVsZE1vZHVsZSwgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaWRlbnRpdHktdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtY2xvdWQtcGVvcGxlJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsXG4gICAgICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICAgICAgSW5pdGlhbFVzZXJuYW1lUGlwZSxcbiAgICAgICAgRnVsbE5hbWVQaXBlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdENoaXBzTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgTWF0VG9vbHRpcE1vZHVsZVxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbRnVsbE5hbWVQaXBlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGVvcGxlLWNsb3VkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9wZW9wbGUtY2xvdWQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHRyaWdnZXIoJ3RyYW5zaXRpb25NZXNzYWdlcycsIFtcbiAgICAgICAgICAgIHN0YXRlKCdlbnRlcicsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwJSknIH0pKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gZW50ZXInLCBbc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMDAlKScgfSksIGFuaW1hdGUoJzMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpJyldKVxuICAgICAgICBdKVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQZW9wbGVDbG91ZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgICAvKiogTGFiZWwgZm9yIHRoZSB1c2VyIHNlbGVjdGlvbiBjb21wb25lbnQuICovXG4gICAgQElucHV0KClcbiAgICBsYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqIE5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uLiBJZiBzcGVjaWZpZWQsIHRoaXMgc2hvd3MgdGhlIHVzZXJzIHdobyBoYXZlIGFjY2VzcyB0byB0aGUgYXBwLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXBwTmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIFVzZXIgc2VsZWN0aW9uIG1vZGUgKHNpbmdsZS9tdWx0aXBsZSkuICovXG4gICAgQElucHV0KClcbiAgICBtb2RlOiBDb21wb25lbnRTZWxlY3Rpb25Nb2RlID0gJ3NpbmdsZSc7XG5cbiAgICAvKiogUm9sZSBuYW1lcyBvZiB0aGUgdXNlcnMgdG8gYmUgbGlzdGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgcm9sZXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBmbGFnIGVuYWJsZXMgdGhlIHZhbGlkYXRpb24gb24gdGhlIHByZVNlbGVjdFVzZXJzIHBhc3NlZCBhcyBpbnB1dC5cbiAgICAgKiBJbiBjYXNlIHRoZSBmbGFnIGlzIHRydWUgdGhlIGNvbXBvbmVudHMgY2FsbCB0aGUgaWRlbnRpdHkgc2VydmljZSB0byB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgYXMgaW5wdXQuXG4gICAgICogT3RoZXJ3aXNlLCBubyBjaGVjayB3aWxsIGJlIGRvbmUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWxpZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgaW5mbyBpbiByZWFkb25seSBtb2RlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogTWFyayB0aGlzIGZpZWxkIGFzIHJlcXVpcmVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgdXNlcnMgdG8gYmUgcHJlLXNlbGVjdGVkLiBBbGwgdXNlcnMgaW4gdGhlXG4gICAgICogYXJyYXkgYXJlIHByZS1zZWxlY3RlZCBpbiBtdWx0aSBzZWxlY3Rpb24gbW9kZSwgYnV0IG9ubHkgdGhlIGZpcnN0IHVzZXJcbiAgICAgKiBpcyBwcmUtc2VsZWN0ZWQgaW4gc2luZ2xlIHNlbGVjdGlvbiBtb2RlLlxuICAgICAqIE1hbmRhdG9yeSBwcm9wZXJ0aWVzIGFyZTogaWQsIGVtYWlsLCB1c2VybmFtZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJlU2VsZWN0VXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHVzZXJzIHRvIGJlIGV4Y2x1ZGVkLlxuICAgICAqIE1hbmRhdG9yeSBwcm9wZXJ0aWVzIGFyZTogaWQsIGVtYWlsLCB1c2VybmFtZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZXhjbHVkZWRVc2VyczogSWRlbnRpdHlVc2VyTW9kZWxbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZ3JvdXBzIHRvIHJlc3RyaWN0IHVzZXIgc2VhcmNoZXMuXG4gICAgICogTWFuZGF0b3J5IHByb3BlcnR5IGlzIGdyb3VwIG5hbWVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdyb3Vwc1Jlc3RyaWN0aW9uOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLyoqIEZvcm1Db250cm9sIHRvIGxpc3Qgb2YgdXNlcnMgKi9cbiAgICBASW5wdXQoKVxuICAgIHVzZXJDaGlwc0N0cmw6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiBmYWxzZSB9KTtcblxuICAgIC8qKiBGb3JtQ29udHJvbCB0byBzZWFyY2ggdGhlIHVzZXIgKi9cbiAgICBASW5wdXQoKVxuICAgIHNlYXJjaFVzZXJDdHJsID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXG4gICAgLyoqXG4gICAgICogTGFiZWwgdHJhbnNsYXRpb24ga2V5XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUGxhY2Vob2xkZXIgZm9yIHRoZSBpbnB1dCBmaWVsZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEhpZGUgdGhlIG1hdElucHV0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2hpcCBncmlkIHdoZW4gYSBzaW5nbGUgdXNlciBpcyBzZWxlY3RlZCBpbiBzaW5nbGUgc2VsZWN0aW9uIG1vZGUuXG4gICAgICogVGhlIGlucHV0IHdpbGwgYmUgc2hvd24gYWdhaW4gd2hlbiB0aGUgdXNlciBpcyByZW1vdmVkIHVzaW5nIHRoZSBpY29uIG9uIHRoZSBjaGlwLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZUlucHV0T25TaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIE1hdGVyaWFsIGZvcm0gZmllbGQgYXBwZWFyYW5jZSAoZmlsbCAvIG91dGxpbmUpXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmb3JtRmllbGRBcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ2ZpbGwnO1xuXG4gICAgLyoqXG4gICAgICogTWF0ZXJpYWwgZm9ybSBmaWVsZCBzdWJzY3JpcHQgc2l6aW5nIChmaXhlZCAvIGR5bmFtaWMpXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBmb3JtRmllbGRTdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZyA9ICdmaXhlZCc7XG5cbiAgICAvKipcbiAgICAgKiBTaG93IGVycm9ycyB1bmRlciB0aGUgZm9ybSBmaWVsZFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0Vycm9yczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBmdWxsIG5hbWUgb2YgdGhlIHVzZXIgb24gaG92ZXIgaW4gdGhlIGNoaXBzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzaG93RnVsbE5hbWVPbkhvdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgdXNlciBpcyBzZWxlY3RlZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RVc2VyID0gbmV3IEV2ZW50RW1pdHRlcjxJZGVudGl0eVVzZXJNb2RlbD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBzZWxlY3RlZCB1c2VyIGlzIHJlbW92ZWQgaW4gbXVsdGkgc2VsZWN0aW9uIG1vZGUuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVtb3ZlVXNlciA9IG5ldyBFdmVudEVtaXR0ZXI8SWRlbnRpdHlVc2VyTW9kZWw+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgdXNlciBzZWxlY3Rpb24gY2hhbmdlLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNoYW5nZWRVc2VycyA9IG5ldyBFdmVudEVtaXR0ZXI8SWRlbnRpdHlVc2VyTW9kZWxbXT4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYW4gd2FybmluZyBvY2N1cnMuICovXG4gICAgQE91dHB1dCgpXG4gICAgd2FybmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQFZpZXdDaGlsZCgndXNlcklucHV0JylcbiAgICBwcml2YXRlIHVzZXJJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAgIHByaXZhdGUgc2VhcmNoVXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10gPSBbXTtcblxuICAgIHNlbGVjdGVkVXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10gPSBbXTtcbiAgICBpbnZhbGlkVXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10gPSBbXTtcblxuICAgIHNlYXJjaFVzZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SWRlbnRpdHlVc2VyTW9kZWxbXT4odGhpcy5zZWFyY2hVc2Vycyk7XG4gICAgc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGU6IHN0cmluZyA9ICdlbnRlcic7XG4gICAgaXNGb2N1c2VkOiBib29sZWFuO1xuICAgIHRvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHZhbGlkYXRlVXNlcnNNZXNzYWdlOiBzdHJpbmc7XG4gICAgc2VhcmNoZWRWYWx1ZSA9ICcnO1xuXG4gICAgdmFsaWRhdGlvbkxvYWRpbmcgPSBmYWxzZTtcbiAgICBzZWFyY2hMb2FkaW5nID0gZmFsc2U7XG5cbiAgICB0eXBpbmdVbmlxdWVWYWx1ZU5vdEVtcHR5JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBpZGVudGl0eVVzZXJTZXJ2aWNlOiBJZGVudGl0eVVzZXJTZXJ2aWNlKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdFNlYXJjaCgpO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzUHJlc2VsZWN0ZWRVc2Vyc0NoYW5nZWQoY2hhbmdlcykgfHwgdGhpcy5oYXNNb2RlQ2hhbmdlZChjaGFuZ2VzKSB8fCB0aGlzLmlzVmFsaWRhdGlvbkNoYW5nZWQoY2hhbmdlcykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1ByZVNlbGVjdFVzZXJzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRQcmVTZWxlY3RVc2VycygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1ByZXNlbGVjdGVkVXNlcnNDbGVhcmVkKGNoYW5nZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZFVzZXJzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1JlYWRvbmx5KCkgJiYgdGhpcy5zZWFyY2hVc2VyQ3RybC5lbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJDdHJsLmRpc2FibGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1JlYWRvbmx5KCkgJiYgdGhpcy5zZWFyY2hVc2VyQ3RybC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaGlkZUlucHV0T25TaW5nbGVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVXNlcnMubGVuZ3RoID09PSAxICYmIHRoaXMuaXNTaW5nbGVNb2RlKCkgJiYgdGhpcy51c2VySW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRTZWFyY2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0cmVhbSgpO1xuICAgICAgICB0aGlzLnR5cGluZ1VuaXF1ZVZhbHVlTm90RW1wdHkkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKG5hbWU6IHN0cmluZykgPT4gbmFtZS5sZW5ndGggPj0gMSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWRlbnRpdHlVc2VyU2VydmljZS5zZWFyY2gobmFtZSwgeyByb2xlczogdGhpcy5yb2xlcywgd2l0aGluQXBwbGljYXRpb246IHRoaXMuYXBwTmFtZSwgZ3JvdXBzOiB0aGlzLmdyb3Vwc1Jlc3RyaWN0aW9uIH0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgodXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldFNlYXJjaFVzZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlcnM7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh1c2VyKSA9PiAhdGhpcy5pc1VzZXJBbHJlYWR5U2VsZWN0ZWQodXNlcikgJiYgIXRoaXMuaXNFeGNsdWRlZFVzZXIodXNlcikpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh1c2VyOiBJZGVudGl0eVVzZXJNb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJzJC5uZXh0KHRoaXMuc2VhcmNoVXNlcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgICAgICBjb25zdCB0eXBpbmdWYWx1ZUZyb21Db250cm9sJCA9IHRoaXMuc2VhcmNoVXNlckN0cmwudmFsdWVDaGFuZ2VzO1xuXG4gICAgICAgIGNvbnN0IHR5cGluZ1ZhbHVlVHlwZVN0aW5nJCA9IHR5cGluZ1ZhbHVlRnJvbUNvbnRyb2wkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdHlwaW5nVmFsdWVIYW5kbGVFcnJvck1lc3NhZ2UkID0gdHlwaW5nVmFsdWVUeXBlU3RpbmckLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUeXBpbmdFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdHlwaW5nVmFsdWVEZWJvdW5jZWRVbmlxdWUkID0gdHlwaW5nVmFsdWVIYW5kbGVFcnJvck1lc3NhZ2UkLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gICAgICAgIHRoaXMudHlwaW5nVW5pcXVlVmFsdWVOb3RFbXB0eSQgPSB0eXBpbmdWYWx1ZURlYm91bmNlZFVuaXF1ZSQucGlwZShcbiAgICAgICAgICAgIHRhcCgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hlZFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJDdHJsLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucmVzZXRTZWFyY2hVc2VycygpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZGF0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGUgPT09IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1VzZXJBbHJlYWR5U2VsZWN0ZWQoc2VhcmNoVXNlcjogSWRlbnRpdHlVc2VyTW9kZWwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRVc2VycyAmJiB0aGlzLnNlbGVjdGVkVXNlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWxlY3RlZFVzZXJzLmZpbmQoKHNlbGVjdGVkVXNlcikgPT4gdGhpcy5lcXVhbHNVc2VycyhzZWxlY3RlZFVzZXIsIHNlYXJjaFVzZXIpKTtcblxuICAgICAgICAgICAgcmV0dXJuICEhcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRXhjbHVkZWRVc2VyKHNlYXJjaFVzZXI6IElkZW50aXR5VXNlck1vZGVsKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmV4Y2x1ZGVkVXNlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZXhjbHVkZWRVc2Vycy5maW5kKChleGNsdWRlZFVzZXIpID0+IHRoaXMuZXF1YWxzVXNlcnMoZXhjbHVkZWRVc2VyLCBzZWFyY2hVc2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFByZVNlbGVjdFVzZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVXNlcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZU1vZGUoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gW3RoaXMucHJlU2VsZWN0VXNlcnNbMF1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVkVXNlcnModGhpcy5wcmVTZWxlY3RVc2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VyQ2hpcHNDdHJsLnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRVc2Vyc1swXS51c2VybmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlUHJlc2VsZWN0VXNlcnMoKTtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJlc2VsZWN0ZWRVc2VycygpOiBJZGVudGl0eVVzZXJNb2RlbFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5wcmVTZWxlY3RVc2Vyc1swXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVEdXBsaWNhdGVkVXNlcnModGhpcy5wcmVTZWxlY3RVc2Vycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUHJlc2VsZWN0VXNlcnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcy5nZXRQcmVzZWxlY3RlZFVzZXJzKCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pZGVudGl0eVVzZXJTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2VhcmNoKHVzZXIudXNlcm5hbWUsIHsgcm9sZXM6IHRoaXMucm9sZXMsIHdpdGhpbkFwcGxpY2F0aW9uOiB0aGlzLmFwcE5hbWUsIGdyb3VwczogdGhpcy5ncm91cHNSZXN0cmljdGlvbiB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAgICAgKVswXTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lcXVhbHNVc2Vycyh1c2VyLCB2YWxpZGF0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRVc2Vycy5wdXNoKHVzZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMucHVzaCh1c2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hlY2tQcmVzZWxlY3RWYWxpZGF0aW9uRXJyb3JzKCk7XG4gICAgfVxuXG4gICAgZXF1YWxzVXNlcnMocHJlc2VsZWN0ZWRVc2VyOiBJZGVudGl0eVVzZXJNb2RlbCwgaWRlbnRpdHlVc2VyOiBJZGVudGl0eVVzZXJNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocHJlc2VsZWN0ZWRVc2VyICYmIGlkZW50aXR5VXNlcikge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlUHJvcGVydHlJZGVudGlmaWVycyA9IFsnaWQnLCAndXNlcm5hbWUnLCAnZW1haWwnXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXMocHJlc2VsZWN0ZWRVc2VyKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZWxlY3RlZFVzZXJbcHJvcGVydHldICE9PSB1bmRlZmluZWQgJiYgdW5pcXVlUHJvcGVydHlJZGVudGlmaWVycy5pbmNsdWRlcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXNlbGVjdGVkVXNlcltwcm9wZXJ0eV0gPT09IGlkZW50aXR5VXNlcltwcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZW1vdmVEdXBsaWNhdGVkVXNlcnModXNlcnM6IElkZW50aXR5VXNlck1vZGVsW10pOiBJZGVudGl0eVVzZXJNb2RlbFtdIHtcbiAgICAgICAgcmV0dXJuIHVzZXJzLmZpbHRlcihcbiAgICAgICAgICAgICh1c2VyLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgICAgICAgICBpbmRleCA9PT0gc2VsZi5maW5kSW5kZXgoKGF1eFVzZXIpID0+IHVzZXIuaWQgPT09IGF1eFVzZXIuaWQgJiYgdXNlci51c2VybmFtZSA9PT0gYXV4VXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsID09PSBhdXhVc2VyLmVtYWlsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uU2VsZWN0KHVzZXI6IElkZW50aXR5VXNlck1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFVzZXIuZW1pdCh1c2VyKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1VzZXJBbHJlYWR5U2VsZWN0ZWQodXNlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzLnB1c2godXNlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRVc2VycyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVc2VycyA9IFt1c2VyXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRlSW5wdXRPblNpbmdsZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVzZXJJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFVzZXJDdHJsLnNldFZhbHVlKCcnKTtcbiAgICAgICAgICAgIHRoaXMudXNlckNoaXBzQ29udHJvbFZhbHVlKHRoaXMuc2VsZWN0ZWRVc2Vyc1swXS51c2VybmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFVzZXJzLmVtaXQodGhpcy5zZWxlY3RlZFVzZXJzKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRTZWFyY2hVc2VycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUodXNlclRvUmVtb3ZlOiBJZGVudGl0eVVzZXJNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZVVzZXIuZW1pdCh1c2VyVG9SZW1vdmUpO1xuICAgICAgICB0aGlzLnJlbW92ZVVzZXJGcm9tU2VsZWN0ZWQodXNlclRvUmVtb3ZlKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkVXNlcnMuZW1pdCh0aGlzLnNlbGVjdGVkVXNlcnMpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVzZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy51c2VyQ2hpcHNDb250cm9sVmFsdWUoJycpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGlkZUlucHV0T25TaW5nbGVTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJJbnB1dC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51c2VyQ2hpcHNDb250cm9sVmFsdWUodGhpcy5zZWxlY3RlZFVzZXJzWzBdLnVzZXJuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaFVzZXJDdHJsLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgIHRoaXMuc2VhcmNoVXNlckN0cmwubWFya0FzVG91Y2hlZCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWRhdGlvbkVuYWJsZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VyRnJvbVZhbGlkYXRpb24odXNlclRvUmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tQcmVzZWxlY3RWYWxpZGF0aW9uRXJyb3JzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrUHJlc2VsZWN0VmFsaWRhdGlvbkVycm9ycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnZhbGlkVXNlcnMgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZWRVc2Vycyh0aGlzLmludmFsaWRVc2Vycyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaW52YWxpZFVzZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVJbnZhbGlkVXNlcnNNZXNzYWdlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhcm5pbmcuZW1pdCh7XG4gICAgICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRF9QUkVTRUxFQ1RFRF9VU0VSUycsXG4gICAgICAgICAgICB1c2VyczogdGhpcy5pbnZhbGlkVXNlcnNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVVc2VyRnJvbVNlbGVjdGVkKHsgaWQsIHVzZXJuYW1lLCBlbWFpbCB9OiBJZGVudGl0eVVzZXJNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gdGhpcy5zZWxlY3RlZFVzZXJzLmZpbmRJbmRleCgodXNlcikgPT4gdXNlci5pZCA9PT0gaWQgJiYgdXNlci51c2VybmFtZSA9PT0gdXNlcm5hbWUgJiYgdXNlci5lbWFpbCA9PT0gZW1haWwpO1xuXG4gICAgICAgIGlmIChpbmRleFRvUmVtb3ZlICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFVzZXJzLnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVXNlckZyb21WYWxpZGF0aW9uKHsgaWQsIHVzZXJuYW1lLCBlbWFpbCB9OiBJZGVudGl0eVVzZXJNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleFRvUmVtb3ZlID0gdGhpcy5pbnZhbGlkVXNlcnMuZmluZEluZGV4KCh1c2VyKSA9PiB1c2VyLmlkID09PSBpZCAmJiB1c2VyLnVzZXJuYW1lID09PSB1c2VybmFtZSAmJiB1c2VyLmVtYWlsID09PSBlbWFpbCk7XG5cbiAgICAgICAgaWYgKGluZGV4VG9SZW1vdmUgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmludmFsaWRVc2Vycy5zcGxpY2UoaW5kZXhUb1JlbW92ZSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlSW52YWxpZFVzZXJzTWVzc2FnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVVzZXJzTWVzc2FnZSA9ICcnO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZFVzZXJzLmZvckVhY2goKGludmFsaWRVc2VyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmludmFsaWRVc2Vycy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVzZXJzTWVzc2FnZSArPSBgJHtpbnZhbGlkVXNlci51c2VybmFtZX0gYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVzZXJzTWVzc2FnZSArPSBgJHtpbnZhbGlkVXNlci51c2VybmFtZX0sIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc1ByZXNlbGVjdEVycm9yKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZhbGlkVXNlcnMgJiYgdGhpcy5pbnZhbGlkVXNlcnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXREaXNwbGF5TmFtZSh1c2VyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIEZ1bGxOYW1lUGlwZS5wcm90b3R5cGUudHJhbnNmb3JtKHVzZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNdWx0aXBsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdtdWx0aXBsZSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NpbmdsZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGUgPT09ICdzaW5nbGUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTaW5nbGVTZWxlY3Rpb25SZWFkb25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTaW5nbGVNb2RlKCkgJiYgdGhpcy5zZWxlY3RlZFVzZXJzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnNlbGVjdGVkVXNlcnNbMF0ucmVhZG9ubHkgPT09IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNQcmVTZWxlY3RVc2VycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlU2VsZWN0VXNlcnMgJiYgdGhpcy5wcmVTZWxlY3RVc2Vycy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzTW9kZUNoYW5nZWQoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY2hhbmdlcz8ubW9kZSAmJiBjaGFuZ2VzLm1vZGUuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLm1vZGUucHJldmlvdXNWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRhdGlvbkNoYW5nZWQoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY2hhbmdlcz8udmFsaWRhdGUgJiYgY2hhbmdlcy52YWxpZGF0ZS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMudmFsaWRhdGUucHJldmlvdXNWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1ByZXNlbGVjdGVkVXNlcnNDaGFuZ2VkKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNoYW5nZXM/LnByZVNlbGVjdFVzZXJzICYmIGNoYW5nZXMucHJlU2VsZWN0VXNlcnMuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLnByZVNlbGVjdFVzZXJzLnByZXZpb3VzVmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNQcmVzZWxlY3RlZFVzZXJzQ2xlYXJlZChjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzPy5wcmVTZWxlY3RVc2Vycz8uY3VycmVudFZhbHVlPy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldFNlYXJjaFVzZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFVzZXJzID0gW107XG4gICAgICAgIHRoaXMuc2VhcmNoVXNlcnMkLm5leHQodGhpcy5zZWFyY2hVc2Vycyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRUeXBpbmdFcnJvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWFyY2hVc2VyQ3RybC5zZXRFcnJvcnMoe1xuICAgICAgICAgICAgc2VhcmNoVHlwaW5nRXJyb3I6IHRydWUsXG4gICAgICAgICAgICAuLi50aGlzLnNlYXJjaFVzZXJDdHJsLmVycm9yc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVzZXJDaGlwc0NvbnRyb2xWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudXNlckNoaXBzQ3RybC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudXNlckNoaXBzQ3RybC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLnVzZXJDaGlwc0N0cmwubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkVXNlcnMoKTogSWRlbnRpdHlVc2VyTW9kZWxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVXNlcnM7XG4gICAgfVxuXG4gICAgaXNSZWFkb25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE9ubHkgfHwgdGhpcy5pc1NpbmdsZVNlbGVjdGlvblJlYWRvbmx5KCk7XG4gICAgfVxuXG4gICAgaXNWYWxpZGF0aW9uTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZGF0aW9uRW5hYmxlZCgpICYmIHRoaXMudmFsaWRhdGlvbkxvYWRpbmc7XG4gICAgfVxuXG4gICAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc1RvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvdWNoZWQ7XG4gICAgfVxuXG4gICAgaXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRVc2VycyAmJiAhIXRoaXMuc2VsZWN0ZWRVc2Vycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaXNEaXJ0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUb3VjaGVkKCkgJiYgIXRoaXMuaXNTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIHNldEZvY3VzKGlzRm9jdXNlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZCA9IGlzRm9jdXNlZDtcbiAgICB9XG5cbiAgICBoYXNFcnJvcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zZWFyY2hVc2VyQ3RybC5lcnJvcnM7XG4gICAgfVxuXG4gICAgZ2V0VmFsaWRhdGlvblBhdHRlcm4oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVXNlckN0cmwuZXJyb3JzLnBhdHRlcm4ucmVxdWlyZWRQYXR0ZXJuO1xuICAgIH1cblxuICAgIGdldFZhbGlkYXRpb25NYXhMZW5ndGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVXNlckN0cmwuZXJyb3JzLm1heGxlbmd0aC5yZXF1aXJlZExlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRWYWxpZGF0aW9uTWluTGVuZ3RoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFVzZXJDdHJsLmVycm9ycy5taW5sZW5ndGgucmVxdWlyZWRMZW5ndGg7XG4gICAgfVxufVxuIiwiPGZvcm0+XG4gICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIFtzdWJzY3JpcHRTaXppbmddPVwiZm9ybUZpZWxkU3Vic2NyaXB0U2l6aW5nXCJcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwiJ2F1dG8nXCJcbiAgICAgICAgY2xhc3M9XCJhZGYtcGVvcGxlLWNsb3VkXCJcbiAgICAgICAgW2NsYXNzLmFkZi1pbnZhbGlkXT1cImhhc0Vycm9yKCkgJiYgaXNEaXJ0eSgpXCJcbiAgICA+XG4gICAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCIhdGl0bGVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7bGFiZWx9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRmLWFzdGVyaXNrXCIgW3N0eWxlLnZpc2liaWxpdHldPVwicmVxdWlyZWQgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiPio8L3NwYW4+XG4gICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LWxhYmVsICpuZ0lmPVwidGl0bGVcIj57eyB0aXRsZSB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuXG4gICAgICAgIDxtYXQtY2hpcC1ncmlkICN1c2VyTXVsdGlwbGVDaGlwTGlzdCBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtY2xvdWQtcGVvcGxlLWNoaXAtbGlzdFwiPlxuICAgICAgICAgICAgPG1hdC1jaGlwLXJvd1xuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB1c2VyIG9mIHNlbGVjdGVkVXNlcnNcIlxuICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwiIXVzZXIucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLXBlb3BsZS1jbG91ZC1jaGlwLScgKyB1c2VyLnVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJvblJlbW92ZSh1c2VyKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHkoKSB8fCBpc1ZhbGlkYXRpb25Mb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKHVzZXIucmVhZG9ubHkgPyAnQURGX0NMT1VEX0dST1VQUy5NQU5EQVRPUlknIDogJycpIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJzaG93RnVsbE5hbWVPbkhvdmVyID8gKHVzZXIgfCBmdWxsTmFtZSA6IHRydWUpIDogdXNlci5lbWFpbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdXNlciB8IGZ1bGxOYW1lIH19XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgIG1hdENoaXBSZW1vdmVcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKHVzZXIucmVhZG9ubHkgfHwgcmVhZE9ubHkpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cIidhZGYtcGVvcGxlLWNsb3VkLWNoaXAtcmVtb3ZlLWljb24tJyArIHVzZXIudXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsXG4gICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2VhcmNoVXNlckN0cmxcIlxuICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJ1c2VyTXVsdGlwbGVDaGlwTGlzdFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJzZXRGb2N1cyh0cnVlKVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwic2V0Rm9jdXMoZmFsc2UpOyBtYXJrQXNUb3VjaGVkKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLWNsb3VkLWlucHV0XCJcbiAgICAgICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJhZGYtcGVvcGxlLWNsb3VkLXNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgI3VzZXJJbnB1dFxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuXG4gICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICBhdXRvQWN0aXZlRmlyc3RPcHRpb25cbiAgICAgICAgICAgIGNsYXNzPVwiYWRmLXBlb3BsZS1jbG91ZC1saXN0XCJcbiAgICAgICAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcbiAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJvblNlbGVjdCgkZXZlbnQub3B0aW9uLnZhbHVlKVwiXG4gICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwiZ2V0RGlzcGxheU5hbWVcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHNlYXJjaFVzZXJzJCB8IGFzeW5jKT8ubGVuZ3RoOyBlbHNlIG5vUmVzdWx0c1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1c2VyIG9mIHNlYXJjaFVzZXJzJCB8IGFzeW5jOyBsZXQgaSA9IGluZGV4XCIgW3ZhbHVlXT1cInVzZXJcIiBjbGFzcz1cImFkZi1wZW9wbGUtY2xvdWQtb3B0aW9uLWFjdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLXBlb3BsZS1jbG91ZC1yb3dcIiBpZD1cImFkZi1wZW9wbGUtY2xvdWQtdXNlci17eyB1c2VyLnVzZXJuYW1lIH19XCIgZGF0YS1hdXRvbWF0aW9uLWlkPVwiYWRmLXBlb3BsZS1jbG91ZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW291dGVySFRNTF09XCJ1c2VyIHwgdXNlcm5hbWVJbml0aWFscyA6ICdhZGYtcGVvcGxlLWNsb3VkLXBpYydcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRmLXBlb3BsZS1sYWJlbC1uYW1lXCI+IHt7IHVzZXIgfCBmdWxsTmFtZSA6IHRydWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdHM+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWFyY2hVc2VyQ3RybC5oYXNFcnJvcignc2VhcmNoVHlwaW5nRXJyb3InKSAmJiAhc2VhcmNoTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLXBlb3BsZS1jbG91ZC1vcHRpb24tbm90LWFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cImFkZi1wZW9wbGUtY2xvdWQtbm8tcmVzdWx0c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgJ0FERl9DTE9VRF9VU0VSUy5FUlJPUi5OT1RfRk9VTkQnIHwgdHJhbnNsYXRlIDogeyB1c2VyTmFtZTogc2VhcmNoZWRWYWx1ZSB9IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCJ2YWxpZGF0aW9uTG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgLz5cblxuICAgIDxkaXYgY2xhc3M9XCJhZGYtZXJyb3ItY29udGFpbmVyIGFkZi1lcnJvci1tZXNzYWdlcy1jb250YWluZXJcIiAqbmdJZj1cInNob3dFcnJvcnNcIj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImhhc1ByZXNlbGVjdEVycm9yKCkgJiYgIWlzVmFsaWRhdGlvbkxvYWRpbmcoKVwiIFtAdHJhbnNpdGlvbk1lc3NhZ2VzXT1cInN1YnNjcmlwdEFuaW1hdGlvblN0YXRlXCIgY2xhc3M9XCJhZGYtZXJyb3JcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLXRleHRcIj57eyAnQURGX0NMT1VEX1VTRVJTLkVSUk9SLk5PVF9GT1VORCcgfCB0cmFuc2xhdGUgOiB7IHVzZXJOYW1lOiB2YWxpZGF0ZVVzZXJzTWVzc2FnZSB9IH19PC9kaXY+XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VhcmNoVXNlckN0cmwuaGFzRXJyb3IoJ3BhdHRlcm4nKVwiIFtAdHJhbnNpdGlvbk1lc3NhZ2VzXT1cInN1YnNjcmlwdEFuaW1hdGlvblN0YXRlXCIgY2xhc3M9XCJhZGYtZXJyb3JcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLXRleHRcIj57eyAnQURGX0NMT1VEX1BFT1BMRV9HUk9VUFMuRVJST1IuSU5WQUxJRF9QQVRURVJOJyB8IHRyYW5zbGF0ZSA6IHsgcGF0dGVybjogZ2V0VmFsaWRhdGlvblBhdHRlcm4oKSB9IH19PC9kaXY+XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwic2VhcmNoVXNlckN0cmwuaGFzRXJyb3IoJ21heGxlbmd0aCcpXCIgW0B0cmFuc2l0aW9uTWVzc2FnZXNdPVwic3Vic2NyaXB0QW5pbWF0aW9uU3RhdGVcIiBjbGFzcz1cImFkZi1lcnJvclwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRmLWVycm9yLWljb25cIj5lcnJvcl9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZXJyb3ItdGV4dFwiPlxuICAgICAgICAgICAgICAgIHt7ICdBREZfQ0xPVURfUEVPUExFX0dST1VQUy5FUlJPUi5JTlZBTElEX01BWF9MRU5HVEgnIHwgdHJhbnNsYXRlIDogeyByZXF1aXJlZExlbmd0aDogZ2V0VmFsaWRhdGlvbk1heExlbmd0aCgpIH0gfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNlYXJjaFVzZXJDdHJsLmhhc0Vycm9yKCdtaW5sZW5ndGgnKVwiIFtAdHJhbnNpdGlvbk1lc3NhZ2VzXT1cInN1YnNjcmlwdEFuaW1hdGlvblN0YXRlXCIgY2xhc3M9XCJhZGYtZXJyb3JcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLXRleHRcIj5cbiAgICAgICAgICAgICAgICB7eyAnQURGX0NMT1VEX1BFT1BMRV9HUk9VUFMuRVJST1IuSU5WQUxJRF9NSU5fTEVOR1RIJyB8IHRyYW5zbGF0ZSA6IHsgcmVxdWlyZWRMZW5ndGg6IGdldFZhbGlkYXRpb25NaW5MZW5ndGgoKSB9IH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICpuZ0lmPVwiKHNlYXJjaFVzZXJDdHJsLmhhc0Vycm9yKCdyZXF1aXJlZCcpIHx8IHVzZXJDaGlwc0N0cmwuaGFzRXJyb3IoJ3JlcXVpcmVkJykpICYmIGlzRGlydHkoKVwiXG4gICAgICAgICAgICBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJzdWJzY3JpcHRBbmltYXRpb25TdGF0ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1lcnJvclwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLXRleHRcIj57eyAnQURGX0NMT1VEX1BFT1BMRV9HUk9VUFMuRVJST1IuUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAqbmdJZj1cInNlYXJjaFVzZXJDdHJsLmhhc0Vycm9yKCdzZWFyY2hUeXBpbmdFcnJvcicpICYmICF0aGlzLmlzRm9jdXNlZFwiXG4gICAgICAgICAgICBbQHRyYW5zaXRpb25NZXNzYWdlc109XCJzdWJzY3JpcHRBbmltYXRpb25TdGF0ZVwiXG4gICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJpbnZhbGlkLXVzZXJzLXR5cGluZy1lcnJvclwiXG4gICAgICAgICAgICBjbGFzcz1cImFkZi1lcnJvclwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVycm9yLXRleHRcIj57eyAnQURGX0NMT1VEX1VTRVJTLkVSUk9SLk5PVF9GT1VORCcgfCB0cmFuc2xhdGUgOiB7IHVzZXJOYW1lOiBzZWFyY2hlZFZhbHVlIH0gfX08L2Rpdj5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
|