@ieeesa-npm/tenants 0.4.4 → 0.5.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/esm2022/ieeesa-npm-tenants.mjs +5 -0
- package/esm2022/lib/assets/constants.json +454 -0
- package/esm2022/lib/assets/tenant-validations.mjs +17 -0
- package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +476 -0
- package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +279 -0
- package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +512 -0
- package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +391 -0
- package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +94 -0
- package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +733 -0
- package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +194 -0
- package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +335 -0
- package/esm2022/lib/models/app-type-config.model.mjs +2 -0
- package/esm2022/lib/models/app-type.model.mjs +7 -0
- package/esm2022/lib/models/create-group-type-config.model.mjs +22 -0
- package/esm2022/lib/models/create-group-type.model.mjs +2 -0
- package/esm2022/lib/models/feature-permission-id.model.mjs +8 -0
- package/esm2022/lib/models/features.model.mjs +2 -0
- package/esm2022/lib/models/permission-type.model.mjs +12 -0
- package/esm2022/lib/models/role-menu-action.model.mjs +7 -0
- package/esm2022/lib/models/role-type.model.mjs +2 -0
- package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +7 -0
- package/esm2022/lib/models/roles-and-permissions.model.mjs +2 -0
- package/esm2022/lib/models/route-config.model.mjs +2 -0
- package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +16 -0
- package/esm2022/lib/models/tenant-function-type.model.mjs +12 -0
- package/esm2022/lib/models/tenant.model.mjs +2 -0
- package/esm2022/lib/models/tenants-permission.model.mjs +2 -0
- package/esm2022/lib/models/update-tenant-status.model.mjs +2 -0
- package/esm2022/lib/models/view-tenant-group-types.model.mjs +11 -0
- package/esm2022/lib/services/tenant-applications.service.mjs +618 -0
- package/esm2022/lib/services/tenant-permissions-map.service.mjs +36 -0
- package/esm2022/lib/services/tenant-permissions.service.mjs +38 -0
- package/esm2022/lib/tenant-applications.component.mjs +14 -0
- package/esm2022/lib/tenant-applications.module.mjs +16 -0
- package/esm2022/public-api.mjs +36 -0
- package/fesm2022/ieeesa-npm-tenants.mjs +4233 -0
- package/fesm2022/ieeesa-npm-tenants.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/assets/tenant-validations.d.ts +15 -0
- package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +129 -0
- package/lib/components/create-modify-role/create-modify-role.component.d.ts +103 -0
- package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +128 -0
- package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +106 -0
- package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +471 -0
- package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +223 -0
- package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +63 -0
- package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +134 -0
- package/lib/models/app-type-config.model.d.ts +14 -0
- package/lib/models/app-type.model.d.ts +4 -0
- package/lib/models/create-group-type-config.model.d.ts +16 -0
- package/lib/models/create-group-type.model.d.ts +49 -0
- package/lib/models/feature-permission-id.model.d.ts +4 -0
- package/lib/models/features.model.d.ts +15 -0
- package/lib/models/permission-type.model.d.ts +8 -0
- package/lib/models/role-menu-action.model.d.ts +4 -0
- package/lib/models/role-type.model.d.ts +27 -0
- package/lib/models/roles-and-permissions-table-type.model.d.ts +4 -0
- package/lib/models/roles-and-permissions.model.d.ts +119 -0
- package/lib/models/route-config.model.d.ts +4 -0
- package/lib/models/table-column-schema-view-tenant-list.model.d.ts +20 -0
- package/lib/models/tenant-function-type.model.d.ts +9 -0
- package/lib/models/tenant.model.d.ts +51 -0
- package/lib/models/tenants-permission.model.d.ts +9 -0
- package/lib/models/update-tenant-status.model.d.ts +14 -0
- package/lib/models/view-tenant-group-types.model.d.ts +29 -0
- package/lib/services/tenant-applications.service.d.ts +399 -0
- package/lib/services/tenant-permissions-map.service.d.ts +13 -0
- package/lib/services/tenant-permissions.service.d.ts +22 -0
- package/lib/tenant-applications.component.d.ts +5 -0
- package/lib/tenant-applications.module.d.ts +6 -0
- package/package.json +25 -12
- package/{src/public-api.ts → public-api.d.ts} +32 -40
- package/.eslintrc.json +0 -31
- package/ng-package.json +0 -8
- package/src/lib/assets/constants.json +0 -454
- package/src/lib/assets/tenant-validations.ts +0 -18
- package/src/lib/assets/tenants-mock.ts +0 -1240
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +0 -15
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +0 -44
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +0 -574
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +0 -602
- package/src/lib/components/create-modify-role/create-modify-role.component.html +0 -15
- package/src/lib/components/create-modify-role/create-modify-role.component.scss +0 -83
- package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +0 -346
- package/src/lib/components/create-modify-role/create-modify-role.component.ts +0 -321
- package/src/lib/components/create-tenant-application/create-tenant-application.component.html +0 -18
- package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +0 -73
- package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +0 -775
- package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +0 -638
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +0 -22
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +0 -79
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +0 -716
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +0 -504
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +0 -44
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +0 -16
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +0 -115
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +0 -109
- package/src/lib/components/view-tenant-details/view-tenant-details.component.html +0 -195
- package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +0 -163
- package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +0 -1221
- package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +0 -876
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +0 -10
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +0 -44
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +0 -410
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +0 -219
- package/src/lib/components/view-tenants-list/view-tenants-list.component.html +0 -32
- package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +0 -35
- package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +0 -464
- package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +0 -388
- package/src/lib/models/app-type-config.model.ts +0 -14
- package/src/lib/models/app-type.model.ts +0 -5
- package/src/lib/models/create-group-type-config.model.ts +0 -18
- package/src/lib/models/create-group-type.model.ts +0 -46
- package/src/lib/models/feature-permission-id.model.ts +0 -6
- package/src/lib/models/features.model.ts +0 -15
- package/src/lib/models/form-status.model.ts +0 -5
- package/src/lib/models/permission-type.model.ts +0 -9
- package/src/lib/models/role-menu-action.model.ts +0 -5
- package/src/lib/models/role-type.model.ts +0 -34
- package/src/lib/models/roles-and-permissions-table-type.model.ts +0 -5
- package/src/lib/models/roles-and-permissions.model.ts +0 -113
- package/src/lib/models/route-config.model.ts +0 -4
- package/src/lib/models/table-column-schema-view-tenant-list.model.ts +0 -21
- package/src/lib/models/tenant-function-type.model.ts +0 -10
- package/src/lib/models/tenant.model.ts +0 -47
- package/src/lib/models/tenants-permission.model.ts +0 -9
- package/src/lib/models/update-tenant-status.model.ts +0 -12
- package/src/lib/models/view-tenant-group-types.model.ts +0 -34
- package/src/lib/services/tenant-applications.service.spec.ts +0 -1245
- package/src/lib/services/tenant-applications.service.ts +0 -798
- package/src/lib/services/tenant-permissions-map.service.spec.ts +0 -25
- package/src/lib/services/tenant-permissions-map.service.ts +0 -28
- package/src/lib/services/tenant-permissions.service.spec.ts +0 -62
- package/src/lib/services/tenant-permissions.service.ts +0 -49
- package/src/lib/tenant-applications.component.html +0 -0
- package/src/lib/tenant-applications.component.scss +0 -0
- package/src/lib/tenant-applications.component.spec.ts +0 -28
- package/src/lib/tenant-applications.component.ts +0 -12
- package/src/lib/tenant-applications.module.ts +0 -8
- package/tsconfig.lib.json +0 -14
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -14
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
+
import { AlignType, FormControlType, DynamicFormComponent, DataTableComponent, TableColumnType, } from '@ieeesa-npm/presentation';
|
|
5
|
+
import { AlertType } from '@ieeesa-npm/models';
|
|
6
|
+
import { RoleAndPermissionsTableType } from '../../models/roles-and-permissions-table-type.model';
|
|
7
|
+
import * as screenText from '../../assets/constants.json';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../../services/tenant-applications.service";
|
|
10
|
+
import * as i2 from "@ieeesa-npm/shared";
|
|
11
|
+
import * as i3 from "@angular/common";
|
|
12
|
+
export class RolesAndPermissionsMappingComponent {
|
|
13
|
+
constructor(
|
|
14
|
+
// eslint-disable-next-line no-unused-vars, no-empty-function, @typescript-eslint/no-unused-vars
|
|
15
|
+
tenantAppService,
|
|
16
|
+
// eslint-disable-next-line no-unused-vars
|
|
17
|
+
sharedService,
|
|
18
|
+
// eslint-disable-next-line no-unused-vars
|
|
19
|
+
elementRef,
|
|
20
|
+
// eslint-disable-next-line no-unused-vars
|
|
21
|
+
formUtilityService // eslint-disable-next-line no-empty-function
|
|
22
|
+
) {
|
|
23
|
+
this.tenantAppService = tenantAppService;
|
|
24
|
+
this.sharedService = sharedService;
|
|
25
|
+
this.elementRef = elementRef;
|
|
26
|
+
this.formUtilityService = formUtilityService;
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
this.constants = screenText;
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
this.mapRolesAndPermissionsScreenTexts = this.constants?.mapRolesAndPermissions;
|
|
31
|
+
this.colWidth = { xs: 12, xl: 6, sm: 12, md: 12, lg: 6 };
|
|
32
|
+
this.actionButtonAlign = AlignType.MIDDLE;
|
|
33
|
+
this.leftButtonLabel = this.mapRolesAndPermissionsScreenTexts?.label?.leftButtonLabel;
|
|
34
|
+
this.rightButtonLabel = this.mapRolesAndPermissionsScreenTexts?.label?.rightButtonLabel;
|
|
35
|
+
this.roles = [];
|
|
36
|
+
this.permissions = [];
|
|
37
|
+
this.destroy$ = new Subject();
|
|
38
|
+
this.tableColumnSchema = [];
|
|
39
|
+
this.tableData = [];
|
|
40
|
+
this.modifiedRolesAndPermissionsMapping = [];
|
|
41
|
+
this.tableHeading = '';
|
|
42
|
+
this.rolePermissionMappingPayload = {
|
|
43
|
+
payload: {
|
|
44
|
+
appId: '',
|
|
45
|
+
permissionId: null,
|
|
46
|
+
roleId: null,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
this.formCancel = new EventEmitter();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Initializes form group and all the page defaults.
|
|
53
|
+
* @memberof MapPermissionsRolesComponent
|
|
54
|
+
* @returns {void}
|
|
55
|
+
*/
|
|
56
|
+
ngOnInit() {
|
|
57
|
+
this.appId = this.tenantAppService.getSelectedTenantInformation()
|
|
58
|
+
?.appId;
|
|
59
|
+
this.formGroup = {
|
|
60
|
+
formGroup: [
|
|
61
|
+
{
|
|
62
|
+
legend: this.mapRolesAndPermissionsScreenTexts?.legend,
|
|
63
|
+
controls: [
|
|
64
|
+
{
|
|
65
|
+
controlName: 'role',
|
|
66
|
+
label: this.mapRolesAndPermissionsScreenTexts?.label?.role,
|
|
67
|
+
type: FormControlType.SELECT,
|
|
68
|
+
dropdownOptions: this.roles,
|
|
69
|
+
supportMessage: this.mapRolesAndPermissionsScreenTexts?.supportText?.role,
|
|
70
|
+
ariaLabel: this.mapRolesAndPermissionsScreenTexts?.label?.ariaLabel?.role,
|
|
71
|
+
ariaDescribedById: this.mapRolesAndPermissionsScreenTexts?.label?.ariaDescribedById
|
|
72
|
+
?.role,
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
controlName: 'permission',
|
|
76
|
+
label: this.mapRolesAndPermissionsScreenTexts?.label?.permission,
|
|
77
|
+
type: FormControlType.SELECT,
|
|
78
|
+
dropdownOptions: this.permissions,
|
|
79
|
+
supportMessage: this.mapRolesAndPermissionsScreenTexts?.supportText?.permission,
|
|
80
|
+
ariaLabel: this.mapRolesAndPermissionsScreenTexts?.label?.ariaLabel
|
|
81
|
+
?.permission,
|
|
82
|
+
ariaDescribedById: this.mapRolesAndPermissionsScreenTexts?.label?.ariaDescribedById
|
|
83
|
+
?.permission,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
this.getRoles();
|
|
90
|
+
this.getPermissions();
|
|
91
|
+
this.sharedService.isAlertClosed
|
|
92
|
+
.pipe(takeUntil(this.destroy$))
|
|
93
|
+
.subscribe(() => {
|
|
94
|
+
const alertModals = document.querySelectorAll('.cdk-overlay-container ieeesa-alert');
|
|
95
|
+
if (alertModals.length) {
|
|
96
|
+
document.querySelector('.cdk-overlay-container .mat-mdc-dialog-content .ieeesa-alert-box__close-button')?.focus();
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.elementRef.nativeElement.querySelector('.cdk-overlay-container .mat-mdc-dialog-content .ieeesa-select-field mat-select')?.focus();
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Constructs the role or permission table schema to display the associated mapping in a table view.
|
|
105
|
+
* @param {FormGroup[]} formGroups
|
|
106
|
+
* @memberof MapPermissionsRolesComponent
|
|
107
|
+
* @returns {void}
|
|
108
|
+
*/
|
|
109
|
+
onRoleOrPermissionSelected(formGroups) {
|
|
110
|
+
this.tableColumnSchema = [];
|
|
111
|
+
this.modifiedRolesAndPermissionsMapping = [];
|
|
112
|
+
const formGroup = formGroups[0];
|
|
113
|
+
const role = formGroup.get('role')?.value;
|
|
114
|
+
const permission = formGroup.get('permission')?.value;
|
|
115
|
+
if (role) {
|
|
116
|
+
this.selectedRole = {
|
|
117
|
+
roleId: role.id,
|
|
118
|
+
roleName: role.name,
|
|
119
|
+
};
|
|
120
|
+
this.rolePermissionMappingPayload.payload.roleId = role?.id;
|
|
121
|
+
}
|
|
122
|
+
if (permission) {
|
|
123
|
+
this.selectedPermission = {
|
|
124
|
+
permissionId: permission.id,
|
|
125
|
+
permissionName: permission.name,
|
|
126
|
+
};
|
|
127
|
+
this.rolePermissionMappingPayload.payload.permissionId = permission?.id;
|
|
128
|
+
}
|
|
129
|
+
this.rolePermissionMappingPayload.payload.appId = this.appId;
|
|
130
|
+
if ((role && permission) || role) {
|
|
131
|
+
this.tableHeading = `${this.mapRolesAndPermissionsScreenTexts?.roleTableCaption}<strong>${role?.name}</strong>`;
|
|
132
|
+
this.tableColumnSchema.push({
|
|
133
|
+
id: 1,
|
|
134
|
+
columnDef: 'permission',
|
|
135
|
+
heading: this.mapRolesAndPermissionsScreenTexts.tableColumns.permission,
|
|
136
|
+
columnType: TableColumnType.TEXT,
|
|
137
|
+
cellData: (permissionMapping) => permissionMapping?.roleOrPermissionName,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this.tableColumnSchema.push({
|
|
142
|
+
id: 1,
|
|
143
|
+
columnDef: 'role',
|
|
144
|
+
heading: this.mapRolesAndPermissionsScreenTexts.tableColumns.role,
|
|
145
|
+
columnType: TableColumnType.TEXT,
|
|
146
|
+
cellData: (roleMapping) => roleMapping?.roleOrPermissionName,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (permission) {
|
|
150
|
+
const permissionHeading = `${this.mapRolesAndPermissionsScreenTexts?.permissionTableCaption}<strong>${permission?.name}</strong>`;
|
|
151
|
+
this.tableHeading = role
|
|
152
|
+
? this.tableHeading + `</br>` + permissionHeading
|
|
153
|
+
: permissionHeading;
|
|
154
|
+
}
|
|
155
|
+
this.tableColumnSchema.push({
|
|
156
|
+
id: 2,
|
|
157
|
+
columnDef: 'slideToggle',
|
|
158
|
+
heading: this.mapRolesAndPermissionsScreenTexts.tableColumns.status,
|
|
159
|
+
columnType: TableColumnType.SLIDE_TOGGLE,
|
|
160
|
+
cellData: (roleMapping) => {
|
|
161
|
+
return {
|
|
162
|
+
id: Math.floor(Math.random() * 1000) + 1,
|
|
163
|
+
label: '',
|
|
164
|
+
ariaLabel: roleMapping.roleOrPermissionName,
|
|
165
|
+
checked: roleMapping.status,
|
|
166
|
+
};
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
this.dynamicFormComponent.isSubmitButtonDisabled = true;
|
|
170
|
+
this.getRolePermissionMapping(this.rolePermissionMappingPayload);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Gets the list of roles and displayed in the role dropdown.
|
|
174
|
+
* @memberof MapPermissionsRolesComponent
|
|
175
|
+
* @returns {void}
|
|
176
|
+
*/
|
|
177
|
+
getRoles() {
|
|
178
|
+
this.tenantAppService
|
|
179
|
+
.getRoles(this.appId)
|
|
180
|
+
.pipe(takeUntil(this.destroy$))
|
|
181
|
+
.subscribe({
|
|
182
|
+
next: (response) => {
|
|
183
|
+
if (response?.status) {
|
|
184
|
+
const rolesList = response?.body;
|
|
185
|
+
rolesList.map((role) => {
|
|
186
|
+
this.roles.push({
|
|
187
|
+
id: role.roleId,
|
|
188
|
+
name: role.roleName,
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
this.formUtilityService.updateFormControlOptions('role', 'dropdownOptions', this.roles, this.dynamicFormComponent);
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
error: (error) => {
|
|
195
|
+
this.sharedService.handleErrors(error, this.mapRolesAndPermissionsScreenTexts.errors);
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Gets the list of permissions and displayed in the permission dropdown.
|
|
201
|
+
* @memberof MapPermissionsRolesComponent
|
|
202
|
+
* @returns {void}
|
|
203
|
+
*/
|
|
204
|
+
getPermissions() {
|
|
205
|
+
this.tenantAppService
|
|
206
|
+
.getPermissions(this.appId)
|
|
207
|
+
.pipe(takeUntil(this.destroy$))
|
|
208
|
+
.subscribe({
|
|
209
|
+
next: (response) => {
|
|
210
|
+
if (response?.status) {
|
|
211
|
+
const permissionsList = response?.body;
|
|
212
|
+
permissionsList.map((permission) => {
|
|
213
|
+
this.permissions.push({
|
|
214
|
+
id: permission.permissionId,
|
|
215
|
+
name: permission.permissionName,
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
this.formUtilityService.updateFormControlOptions('permission', 'dropdownOptions', this.permissions, this.dynamicFormComponent);
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
error: (error) => {
|
|
222
|
+
this.sharedService.handleErrors(error, this.mapRolesAndPermissionsScreenTexts.errors);
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Gets the list of mapped roles/permissions from the backend api.
|
|
228
|
+
* @param {RolePermissionMappingRequestPayload} payload
|
|
229
|
+
* @memberof MapPermissionsRolesComponent
|
|
230
|
+
* @returns {void}
|
|
231
|
+
*/
|
|
232
|
+
getRolePermissionMapping(payload) {
|
|
233
|
+
this.tableData = [];
|
|
234
|
+
this.tenantAppService
|
|
235
|
+
.getRolePermissionMapping(payload)
|
|
236
|
+
.pipe(takeUntil(this.destroy$))
|
|
237
|
+
.subscribe({
|
|
238
|
+
next: (response) => {
|
|
239
|
+
const payloadInfo = payload.payload;
|
|
240
|
+
if (payloadInfo?.roleId && payloadInfo?.permissionId) {
|
|
241
|
+
this.tableData.push({
|
|
242
|
+
roleOrPermissionName: this.selectedPermission?.permissionName,
|
|
243
|
+
roleOrPermissionId: this.selectedPermission?.permissionId,
|
|
244
|
+
status: true,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
else if (payloadInfo?.roleId) {
|
|
248
|
+
this.setTableData(this.permissions, response.body, RoleAndPermissionsTableType.PERMISSION);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
this.setTableData(this.roles, response.body, RoleAndPermissionsTableType.ROLE);
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
error: (error) => {
|
|
255
|
+
const errorCodes = error?.error?.body?.errorCodes;
|
|
256
|
+
// Returns error code 3020 when mapped roles does not exist for given permission id.
|
|
257
|
+
if (errorCodes.includes('3020')) {
|
|
258
|
+
this.setTableData(this.roles, [], RoleAndPermissionsTableType.ROLE);
|
|
259
|
+
}
|
|
260
|
+
// Returns error code 3021 when mapped permissions does not exist for given role id.
|
|
261
|
+
else if (errorCodes.includes('3021')) {
|
|
262
|
+
this.setTableData(this.permissions, [], RoleAndPermissionsTableType.PERMISSION);
|
|
263
|
+
}
|
|
264
|
+
// Returns error code 3017 when role permission mapping does not exist for given role id.
|
|
265
|
+
else if (errorCodes.includes('3017')) {
|
|
266
|
+
this.tableData.push({
|
|
267
|
+
roleOrPermissionName: this.selectedPermission?.permissionName,
|
|
268
|
+
roleOrPermissionId: this.selectedPermission?.permissionId,
|
|
269
|
+
status: false,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
else
|
|
273
|
+
this.sharedService.handleErrors(error, this.mapRolesAndPermissionsScreenTexts.errors);
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Displaying the mapped roles and permissions data into the data table.
|
|
279
|
+
* @param {SelectOption[]} roleOrPermissions
|
|
280
|
+
* @param {RoleDetails[] | Permission[]} mappedRoleOrPermissions
|
|
281
|
+
* @param {RoleAndPermissionsTableType} tableType
|
|
282
|
+
* @memberof MapPermissionsRolesComponent
|
|
283
|
+
* @returns {void}
|
|
284
|
+
*/
|
|
285
|
+
setTableData(roleOrPermissions, mappedRoleOrPermissions, tableType) {
|
|
286
|
+
roleOrPermissions.map((roleOrPermission) => {
|
|
287
|
+
this.tableData.push({
|
|
288
|
+
roleOrPermissionName: roleOrPermission.name,
|
|
289
|
+
roleOrPermissionId: roleOrPermission.id,
|
|
290
|
+
status: tableType === RoleAndPermissionsTableType.ROLE
|
|
291
|
+
? mappedRoleOrPermissions.length > 0 &&
|
|
292
|
+
mappedRoleOrPermissions.some((mappedRoleOrPermission) => mappedRoleOrPermission.roleId === roleOrPermission.id)
|
|
293
|
+
: mappedRoleOrPermissions.length > 0 &&
|
|
294
|
+
mappedRoleOrPermissions.some((mappedRoleOrPermission) => mappedRoleOrPermission.permissionId === roleOrPermission.id),
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Constructs the payload based on the roles and permissions mapping (selection or deselection).
|
|
300
|
+
* @param roleOrPermissionStatus
|
|
301
|
+
* @memberof MapPermissionsRolesComponent
|
|
302
|
+
* @returns {void}
|
|
303
|
+
*/
|
|
304
|
+
roleOrPermissionStatusChange(roleOrPermissionStatus) {
|
|
305
|
+
if ((this.selectedRole?.roleId && this.selectedPermission?.permissionId) ||
|
|
306
|
+
this.selectedRole?.roleId) {
|
|
307
|
+
if (this.modifiedRolesAndPermissionsMapping.find((permission) => permission.permissionId ===
|
|
308
|
+
roleOrPermissionStatus.rowData.roleOrPermissionId)) {
|
|
309
|
+
this.modifiedRolesAndPermissionsMapping.splice(this.modifiedRolesAndPermissionsMapping.findIndex((permission) => permission.permissionId ===
|
|
310
|
+
roleOrPermissionStatus.rowData.roleOrPermissionId), 1);
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.modifiedRolesAndPermissionsMapping.push({
|
|
314
|
+
roleId: this.selectedRole.roleId,
|
|
315
|
+
permissionId: roleOrPermissionStatus.rowData.roleOrPermissionId,
|
|
316
|
+
appId: this.appId,
|
|
317
|
+
status: roleOrPermissionStatus.slideToggle.checked,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
else if (this.selectedPermission?.permissionId) {
|
|
322
|
+
if (this.modifiedRolesAndPermissionsMapping.find((role) => role.roleId === roleOrPermissionStatus.rowData.roleOrPermissionId)) {
|
|
323
|
+
this.modifiedRolesAndPermissionsMapping.splice(this.modifiedRolesAndPermissionsMapping.findIndex((role) => role.roleId === roleOrPermissionStatus.rowData.roleOrPermissionId), 1);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
this.modifiedRolesAndPermissionsMapping.push({
|
|
327
|
+
roleId: roleOrPermissionStatus.rowData.roleOrPermissionId,
|
|
328
|
+
permissionId: this.selectedPermission.permissionId,
|
|
329
|
+
appId: this.appId,
|
|
330
|
+
status: roleOrPermissionStatus.slideToggle.checked,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
this.dynamicFormComponent.isSubmitButtonDisabled =
|
|
335
|
+
!this.modifiedRolesAndPermissionsMapping.length;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Submits the roles and permissions mappings to the server.
|
|
339
|
+
* @memberof MapPermissionsRolesComponent
|
|
340
|
+
* @returns {void}
|
|
341
|
+
*/
|
|
342
|
+
onMapAndPermissionsFormSubmit() {
|
|
343
|
+
const payload = {
|
|
344
|
+
payload: this.modifiedRolesAndPermissionsMapping,
|
|
345
|
+
};
|
|
346
|
+
this.dynamicFormComponent.isSubmitButtonDisabled = true;
|
|
347
|
+
this.modifiedRolesAndPermissionsMapping = [];
|
|
348
|
+
this.tenantAppService
|
|
349
|
+
.saveRolePermissionMapping(payload)
|
|
350
|
+
.pipe(takeUntil(this.destroy$))
|
|
351
|
+
.subscribe({
|
|
352
|
+
next: (response) => {
|
|
353
|
+
if (response?.status) {
|
|
354
|
+
this.sharedService.showAlertMessage(AlertType.SUCCESS, this.mapRolesAndPermissionsScreenTexts.message.success
|
|
355
|
+
.rolesAndPermissionsSubmission);
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
error: (error) => {
|
|
359
|
+
this.sharedService.handleErrors(error, this.mapRolesAndPermissionsScreenTexts.errors);
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Closes the map and permissions modal.
|
|
365
|
+
* @memberof MapPermissionsRolesComponent
|
|
366
|
+
* @returns {void}
|
|
367
|
+
*/
|
|
368
|
+
onMapAndPermissionsFormCancel() {
|
|
369
|
+
this.formCancel.emit();
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.
|
|
373
|
+
* @memberof ViewTenantDetailsComponent
|
|
374
|
+
*/
|
|
375
|
+
ngOnDestroy() {
|
|
376
|
+
this.destroy$?.next(true);
|
|
377
|
+
this.destroy$?.unsubscribe();
|
|
378
|
+
}
|
|
379
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RolesAndPermissionsMappingComponent, deps: [{ token: i1.TenantApplicationsService }, { token: i2.SharedService }, { token: i0.ElementRef }, { token: i2.FormUtilityService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
380
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RolesAndPermissionsMappingComponent, isStandalone: true, selector: "ieeesa-roles-and-permissions-mapping", outputs: { formCancel: "formCancel" }, viewQueries: [{ propertyName: "dynamicFormComponent", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<ieeesa-dynamic-form\r\n [formGroups]=\"formGroup\"\r\n [colWidth]=\"colWidth\"\r\n [isSubmitButtonDisabled]=\"true\"\r\n [isLegendVisible]=\"true\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLeftButtonNeeded]=\"true\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n (dropdownChange)=\"onRoleOrPermissionSelected($event)\"\r\n (formSubmit)=\"onMapAndPermissionsFormSubmit()\"\r\n (formLeftButtonClicked)=\"onMapAndPermissionsFormCancel()\"\r\n>\r\n <ieeesa-data-table\r\n component\r\n *ngIf=\"tableData.length\"\r\n [columnSchemaInfo]=\"tableColumnSchema\"\r\n [tableColumnsHeaderText]=\"tableHeading\"\r\n [tableDataInfo]=\"tableData\"\r\n (rowSlideToggle)=\"roleOrPermissionStatusChange($event)\"\r\n ></ieeesa-data-table>\r\n</ieeesa-dynamic-form>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-map-permissions-and-roles{max-width:50vw!important}.ieeesa-map-permissions-and-roles .mat-mdc-dialog-container{box-shadow:none}.ieeesa-map-permissions-and-roles .mat-mdc-dialog-surface{border-radius:0}.ieeesa-map-permissions-and-roles .ieeesa-modal{box-shadow:0 3px #00b5e2 inset,0 4px 24px #00000080}.ieeesa-map-permissions-and-roles .ieeesa-modal-title__heading{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:.03125em}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .row{margin:0;padding:0 12px}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__legend{text-align:center;margin-bottom:0;font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__form-field{padding-top:4px!important}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__form-field .mat-mdc-form-field-subscript-wrapper{display:none}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__actions{flex-direction:row-reverse;gap:24px;padding-top:48px!important}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table{width:33vw;padding-top:48px}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table__columns-header-text{font-size:16px;padding:0}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table .mat-colum-role,.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table .mat-column-permission{padding:16px}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table__content{padding-top:12px}@media (max-width: 767px){.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table{width:auto}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__form-field{padding-top:24px!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DynamicFormComponent, selector: "ieeesa-dynamic-form", inputs: ["formGroups", "submitResponse", "searchResponse", "fileUploadStatus", "colWidth", "isLegendVisible", "rightButtonLabel", "leftButtonLabel", "isSubmitButtonDisabled", "isLeftButtonDisabled", "isLeftButtonNeeded", "isRightButtonNeeded", "actionButtonAlign", "fileDownloadAndDeleteConfig"], outputs: ["formSubmit", "formChange", "formInput", "formLeftButtonClicked", "formSearchApply", "formGroupsReference", "dropdownChange", "formCheckboxSelection", "formDateSelected", "formSelectSearch", "formControlChange", "formAutoCompleteSearch", "formAutoCompleteClearSearchValue", "autoCompleteOptionSelected", "formAfterContentInit", "formSelectedDateRange", "addFormGroup", "formTimeSelected", "supportTextLinkClick", "formSlideToggleChange", "formFileUpload", "dropdownOpenedChange", "formColorPickerChange", "formRadioOptionSelected", "ctaButtonClick", "formMultiSelectAutoCompleteSearch", "formMultiSelectAutoCompleteClearSearchValue", "multiSelectAutoCompleteOptionsSelected", "formRichTextEditorContentChange"], exportAs: ["dynamicForm"] }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
381
|
+
}
|
|
382
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RolesAndPermissionsMappingComponent, decorators: [{
|
|
383
|
+
type: Component,
|
|
384
|
+
args: [{ selector: 'ieeesa-roles-and-permissions-mapping', standalone: true, imports: [CommonModule, DynamicFormComponent, DataTableComponent], encapsulation: ViewEncapsulation.None, template: "<ieeesa-dynamic-form\r\n [formGroups]=\"formGroup\"\r\n [colWidth]=\"colWidth\"\r\n [isSubmitButtonDisabled]=\"true\"\r\n [isLegendVisible]=\"true\"\r\n [leftButtonLabel]=\"leftButtonLabel\"\r\n [rightButtonLabel]=\"rightButtonLabel\"\r\n [isLeftButtonNeeded]=\"true\"\r\n [actionButtonAlign]=\"actionButtonAlign\"\r\n (dropdownChange)=\"onRoleOrPermissionSelected($event)\"\r\n (formSubmit)=\"onMapAndPermissionsFormSubmit()\"\r\n (formLeftButtonClicked)=\"onMapAndPermissionsFormCancel()\"\r\n>\r\n <ieeesa-data-table\r\n component\r\n *ngIf=\"tableData.length\"\r\n [columnSchemaInfo]=\"tableColumnSchema\"\r\n [tableColumnsHeaderText]=\"tableHeading\"\r\n [tableDataInfo]=\"tableData\"\r\n (rowSlideToggle)=\"roleOrPermissionStatusChange($event)\"\r\n ></ieeesa-data-table>\r\n</ieeesa-dynamic-form>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-map-permissions-and-roles{max-width:50vw!important}.ieeesa-map-permissions-and-roles .mat-mdc-dialog-container{box-shadow:none}.ieeesa-map-permissions-and-roles .mat-mdc-dialog-surface{border-radius:0}.ieeesa-map-permissions-and-roles .ieeesa-modal{box-shadow:0 3px #00b5e2 inset,0 4px 24px #00000080}.ieeesa-map-permissions-and-roles .ieeesa-modal-title__heading{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:.03125em}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .row{margin:0;padding:0 12px}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__legend{text-align:center;margin-bottom:0;font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__form-field{padding-top:4px!important}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__form-field .mat-mdc-form-field-subscript-wrapper{display:none}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__actions{flex-direction:row-reverse;gap:24px;padding-top:48px!important}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table{width:33vw;padding-top:48px}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table__columns-header-text{font-size:16px;padding:0}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table .mat-colum-role,.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table .mat-column-permission{padding:16px}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table__content{padding-top:12px}@media (max-width: 767px){.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form .ieeesa-data-table{width:auto}.ieeesa-map-permissions-and-roles .ieeesa-dynamic-form__form-field{padding-top:24px!important}}\n"] }]
|
|
385
|
+
}], ctorParameters: function () { return [{ type: i1.TenantApplicationsService }, { type: i2.SharedService }, { type: i0.ElementRef }, { type: i2.FormUtilityService }]; }, propDecorators: { formCancel: [{
|
|
386
|
+
type: Output
|
|
387
|
+
}], dynamicFormComponent: [{
|
|
388
|
+
type: ViewChild,
|
|
389
|
+
args: [DynamicFormComponent]
|
|
390
|
+
}] } });
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMtYW5kLXBlcm1pc3Npb25zLW1hcHBpbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL2NvbXBvbmVudHMvcm9sZXMtYW5kLXBlcm1pc3Npb25zLW1hcHBpbmcvcm9sZXMtYW5kLXBlcm1pc3Npb25zLW1hcHBpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL2NvbXBvbmVudHMvcm9sZXMtYW5kLXBlcm1pc3Npb25zLW1hcHBpbmcvcm9sZXMtYW5kLXBlcm1pc3Npb25zLW1hcHBpbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBR1osTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFDTCxTQUFTLEVBS1QsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsRUFFbEIsZUFBZSxHQUNoQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVcvQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUNsRyxPQUFPLEtBQUssVUFBVSxNQUFNLDZCQUE2QixDQUFDOzs7OztBQVcxRCxNQUFNLE9BQU8sbUNBQW1DO0lBZ0M5QztJQUNFLGdHQUFnRztJQUN4RixnQkFBMkM7SUFDbkQsMENBQTBDO0lBQ2xDLGFBQTRCO0lBQ3BDLDBDQUEwQztJQUNuQyxVQUFzQjtJQUM3QiwwQ0FBMEM7SUFDbEMsa0JB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QUFDLFlBQVksQ0FDN0IsS0FBSyxFQUNMLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLENBQzlDLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCw2QkFBNkI7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDL0IsQ0FBQzsrR0F0Y1UsbUNBQW1DO21HQUFuQyxtQ0FBbUMsNkxBK0JuQyxvQkFBb0IsZ0RDL0VqQyx3MEJBc0JBLHlvVkRxQlksWUFBWSxtSUFBRSxvQkFBb0Isc2xDQUFFLGtCQUFrQjs7NEZBS3JELG1DQUFtQztrQkFSL0MsU0FBUzsrQkFDRSxzQ0FBc0MsY0FDcEMsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLGlCQUdsRCxpQkFBaUIsQ0FBQyxJQUFJO3NNQWdDM0IsVUFBVTtzQkFBbkIsTUFBTTtnQkFDMEIsb0JBQW9CO3NCQUFwRCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBBbGlnblR5cGUsXHJcbiAgRm9ybUdyaWQsXHJcbiAgRm9ybU1vZGVsLFxyXG4gIFNlbGVjdE9wdGlvbixcclxuICBTbGlkZVRvZ2dsZU9wdGlvbixcclxuICBGb3JtQ29udHJvbFR5cGUsXHJcbiAgRHluYW1pY0Zvcm1Db21wb25lbnQsXHJcbiAgRGF0YVRhYmxlQ29tcG9uZW50LFxyXG4gIFRhYmxlQ29sdW1uU2NoZW1hLFxyXG4gIFRhYmxlQ29sdW1uVHlwZSxcclxufSBmcm9tICdAaWVlZXNhLW5wbS9wcmVzZW50YXRpb24nO1xyXG5pbXBvcnQgeyBBbGVydFR5cGUgfSBmcm9tICdAaWVlZXNhLW5wbS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVuYW50LWFwcGxpY2F0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBQZXJtaXNzaW9uLFxyXG4gIE1vZGlmaWVkUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmcsXHJcbiAgUm9sZXNBbmRQZXJtaXNzaW9uc1JlcXVlc3RQYXlsb2FkLFxyXG4gIFJvbGUsXHJcbiAgUm9sZURldGFpbHMsXHJcbiAgUm9sZU9yUGVybWlzc2lvbk1hcHBpbmcsXHJcbiAgUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWQsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IFJvbGVBbmRQZXJtaXNzaW9uc1RhYmxlVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9yb2xlcy1hbmQtcGVybWlzc2lvbnMtdGFibGUtdHlwZS5tb2RlbCc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHQgZnJvbSAnLi4vLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgRm9ybVV0aWxpdHlTZXJ2aWNlLCBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnQGllZWVzYS1ucG0vc2hhcmVkJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWVlZXNhLXJvbGVzLWFuZC1wZXJtaXNzaW9ucy1tYXBwaW5nJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIER5bmFtaWNGb3JtQ29tcG9uZW50LCBEYXRhVGFibGVDb21wb25lbnRdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xlcy1hbmQtcGVybWlzc2lvbnMtbWFwcGluZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcm9sZXMtYW5kLXBlcm1pc3Npb25zLW1hcHBpbmcuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjb25zdGFudHM6IGFueSA9IHNjcmVlblRleHQ7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBtYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHM6IGFueSA9XHJcbiAgICB0aGlzLmNvbnN0YW50cz8ubWFwUm9sZXNBbmRQZXJtaXNzaW9ucztcclxuICBmb3JtR3JvdXAhOiBGb3JtTW9kZWw7XHJcbiAgY29sV2lkdGg6IEZvcm1HcmlkID0geyB4czogMTIsIHhsOiA2LCBzbTogMTIsIG1kOiAxMiwgbGc6IDYgfTtcclxuICBhY3Rpb25CdXR0b25BbGlnbiA9IEFsaWduVHlwZS5NSURETEU7XHJcbiAgbGVmdEJ1dHRvbkxhYmVsID1cclxuICAgIHRoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzPy5sYWJlbD8ubGVmdEJ1dHRvbkxhYmVsO1xyXG4gIHJpZ2h0QnV0dG9uTGFiZWwgPVxyXG4gICAgdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHM/LmxhYmVsPy5yaWdodEJ1dHRvbkxhYmVsO1xyXG4gIHJvbGVzOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xyXG4gIHBlcm1pc3Npb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xyXG4gIGFwcElkITogc3RyaW5nO1xyXG4gIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICB0YWJsZUNvbHVtblNjaGVtYTogVGFibGVDb2x1bW5TY2hlbWFbXSA9IFtdO1xyXG4gIHRhYmxlRGF0YTogUm9sZU9yUGVybWlzc2lvbk1hcHBpbmdbXSA9IFtdO1xyXG4gIHNlbGVjdGVkUm9sZSE6IFJvbGVEZXRhaWxzO1xyXG4gIHNlbGVjdGVkUGVybWlzc2lvbiE6IFBlcm1pc3Npb247XHJcbiAgbW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZzogTW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZ1tdID0gW107XHJcbiAgdGFibGVIZWFkaW5nID0gJyc7XHJcbiAgcm9sZVBlcm1pc3Npb25NYXBwaW5nUGF5bG9hZDogUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWQgPSB7XHJcbiAgICBwYXlsb2FkOiB7XHJcbiAgICAgIGFwcElkOiAnJyxcclxuICAgICAgcGVybWlzc2lvbklkOiBudWxsLFxyXG4gICAgICByb2xlSWQ6IG51bGwsXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgQE91dHB1dCgpIGZvcm1DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZChEeW5hbWljRm9ybUNvbXBvbmVudCkgZHluYW1pY0Zvcm1Db21wb25lbnQhOiBEeW5hbWljRm9ybUNvbXBvbmVudDtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycywgbm8tZW1wdHktZnVuY3Rpb24sIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSB0ZW5hbnRBcHBTZXJ2aWNlOiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGZvcm1VdGlsaXR5U2VydmljZTogRm9ybVV0aWxpdHlTZXJ2aWNlIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eS1mdW5jdGlvblxyXG4gICkge31cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyBmb3JtIGdyb3VwIGFuZCBhbGwgdGhlIHBhZ2UgZGVmYXVsdHMuXHJcbiAgICogQG1lbWJlcm9mIE1hcFBlcm1pc3Npb25zUm9sZXNDb21wb25lbnRcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwSWQgPSB0aGlzLnRlbmFudEFwcFNlcnZpY2UuZ2V0U2VsZWN0ZWRUZW5hbnRJbmZvcm1hdGlvbigpXHJcbiAgICAgID8uYXBwSWQgYXMgc3RyaW5nO1xyXG4gICAgdGhpcy5mb3JtR3JvdXAgPSB7XHJcbiAgICAgIGZvcm1Hcm91cDogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxlZ2VuZDogdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHM/LmxlZ2VuZCxcclxuICAgICAgICAgIGNvbnRyb2xzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250cm9sTmFtZTogJ3JvbGUnLFxyXG4gICAgICAgICAgICAgIGxhYmVsOiB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cz8ubGFiZWw/LnJvbGUsXHJcbiAgICAgICAgICAgICAgdHlwZTogRm9ybUNvbnRyb2xUeXBlLlNFTEVDVCxcclxuICAgICAgICAgICAgICBkcm9wZG93bk9wdGlvbnM6IHRoaXMucm9sZXMsXHJcbiAgICAgICAgICAgICAgc3VwcG9ydE1lc3NhZ2U6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cz8uc3VwcG9ydFRleHQ/LnJvbGUsXHJcbiAgICAgICAgICAgICAgYXJpYUxhYmVsOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHM/LmxhYmVsPy5hcmlhTGFiZWw/LnJvbGUsXHJcbiAgICAgICAgICAgICAgYXJpYURlc2NyaWJlZEJ5SWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cz8ubGFiZWw/LmFyaWFEZXNjcmliZWRCeUlkXHJcbiAgICAgICAgICAgICAgICAgID8ucm9sZSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRyb2xOYW1lOiAncGVybWlzc2lvbicsXHJcbiAgICAgICAgICAgICAgbGFiZWw6IHRoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzPy5sYWJlbD8ucGVybWlzc2lvbixcclxuICAgICAgICAgICAgICB0eXBlOiBGb3JtQ29udHJvbFR5cGUuU0VMRUNULFxyXG4gICAgICAgICAgICAgIGRyb3Bkb3duT3B0aW9uczogdGhpcy5wZXJtaXNzaW9ucyxcclxuICAgICAgICAgICAgICBzdXBwb3J0TWVzc2FnZTpcclxuICAgICAgICAgICAgICAgIHRoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzPy5zdXBwb3J0VGV4dD8ucGVybWlzc2lvbixcclxuICAgICAgICAgICAgICBhcmlhTGFiZWw6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cz8ubGFiZWw/LmFyaWFMYWJlbFxyXG4gICAgICAgICAgICAgICAgICA/LnBlcm1pc3Npb24sXHJcbiAgICAgICAgICAgICAgYXJpYURlc2NyaWJlZEJ5SWQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cz8ubGFiZWw/LmFyaWFEZXNjcmliZWRCeUlkXHJcbiAgICAgICAgICAgICAgICAgID8ucGVybWlzc2lvbixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH07XHJcbiAgICB0aGlzLmdldFJvbGVzKCk7XHJcbiAgICB0aGlzLmdldFBlcm1pc3Npb25zKCk7XHJcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaXNBbGVydENsb3NlZFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFsZXJ0TW9kYWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcclxuICAgICAgICAgICcuY2RrLW92ZXJsYXktY29udGFpbmVyIGllZWVzYS1hbGVydCdcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChhbGVydE1vZGFscy5sZW5ndGgpIHtcclxuICAgICAgICAgIChcclxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICAgICAnLmNkay1vdmVybGF5LWNvbnRhaW5lciAubWF0LW1kYy1kaWFsb2ctY29udGVudCAuaWVlZXNhLWFsZXJ0LWJveF9fY2xvc2UtYnV0dG9uJ1xyXG4gICAgICAgICAgICApIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICApPy5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAoXHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgJy5jZGstb3ZlcmxheS1jb250YWluZXIgLm1hdC1tZGMtZGlhbG9nLWNvbnRlbnQgLmllZWVzYS1zZWxlY3QtZmllbGQgbWF0LXNlbGVjdCdcclxuICAgICAgICAgICAgKSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgKT8uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSByb2xlIG9yIHBlcm1pc3Npb24gdGFibGUgc2NoZW1hIHRvIGRpc3BsYXkgdGhlIGFzc29jaWF0ZWQgbWFwcGluZyBpbiBhIHRhYmxlIHZpZXcuXHJcbiAgICogQHBhcmFtIHtGb3JtR3JvdXBbXX0gZm9ybUdyb3Vwc1xyXG4gICAqIEBtZW1iZXJvZiBNYXBQZXJtaXNzaW9uc1JvbGVzQ29tcG9uZW50XHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgb25Sb2xlT3JQZXJtaXNzaW9uU2VsZWN0ZWQoZm9ybUdyb3VwczogRm9ybUdyb3VwW10pOiB2b2lkIHtcclxuICAgIHRoaXMudGFibGVDb2x1bW5TY2hlbWEgPSBbXTtcclxuICAgIHRoaXMubW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZyA9IFtdO1xyXG4gICAgY29uc3QgZm9ybUdyb3VwID0gZm9ybUdyb3Vwc1swXTtcclxuICAgIGNvbnN0IHJvbGUgPSBmb3JtR3JvdXAuZ2V0KCdyb2xlJyk/LnZhbHVlO1xyXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IGZvcm1Hcm91cC5nZXQoJ3Blcm1pc3Npb24nKT8udmFsdWU7XHJcbiAgICBpZiAocm9sZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUm9sZSA9IHtcclxuICAgICAgICByb2xlSWQ6IHJvbGUuaWQsXHJcbiAgICAgICAgcm9sZU5hbWU6IHJvbGUubmFtZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5yb2xlUGVybWlzc2lvbk1hcHBpbmdQYXlsb2FkLnBheWxvYWQucm9sZUlkID0gcm9sZT8uaWQ7XHJcbiAgICB9XHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUGVybWlzc2lvbiA9IHtcclxuICAgICAgICBwZXJtaXNzaW9uSWQ6IHBlcm1pc3Npb24uaWQsXHJcbiAgICAgICAgcGVybWlzc2lvbk5hbWU6IHBlcm1pc3Npb24ubmFtZSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5yb2xlUGVybWlzc2lvbk1hcHBpbmdQYXlsb2FkLnBheWxvYWQucGVybWlzc2lvbklkID0gcGVybWlzc2lvbj8uaWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvbGVQZXJtaXNzaW9uTWFwcGluZ1BheWxvYWQucGF5bG9hZC5hcHBJZCA9IHRoaXMuYXBwSWQ7XHJcbiAgICBpZiAoKHJvbGUgJiYgcGVybWlzc2lvbikgfHwgcm9sZSkge1xyXG4gICAgICB0aGlzLnRhYmxlSGVhZGluZyA9IGAke3RoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzPy5yb2xlVGFibGVDYXB0aW9ufTxzdHJvbmc+JHtyb2xlPy5uYW1lfTwvc3Ryb25nPmA7XHJcbiAgICAgIHRoaXMudGFibGVDb2x1bW5TY2hlbWEucHVzaCh7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgICAgY29sdW1uRGVmOiAncGVybWlzc2lvbicsXHJcbiAgICAgICAgaGVhZGluZzogdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHMudGFibGVDb2x1bW5zLnBlcm1pc3Npb24sXHJcbiAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlRFWFQsXHJcbiAgICAgICAgY2VsbERhdGE6IChwZXJtaXNzaW9uTWFwcGluZzogUm9sZU9yUGVybWlzc2lvbk1hcHBpbmcpID0+XHJcbiAgICAgICAgICBwZXJtaXNzaW9uTWFwcGluZz8ucm9sZU9yUGVybWlzc2lvbk5hbWUsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50YWJsZUNvbHVtblNjaGVtYS5wdXNoKHtcclxuICAgICAgICBpZDogMSxcclxuICAgICAgICBjb2x1bW5EZWY6ICdyb2xlJyxcclxuICAgICAgICBoZWFkaW5nOiB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cy50YWJsZUNvbHVtbnMucm9sZSxcclxuICAgICAgICBjb2x1bW5UeXBlOiBUYWJsZUNvbHVtblR5cGUuVEVYVCxcclxuICAgICAgICBjZWxsRGF0YTogKHJvbGVNYXBwaW5nOiBSb2xlT3JQZXJtaXNzaW9uTWFwcGluZykgPT5cclxuICAgICAgICAgIHJvbGVNYXBwaW5nPy5yb2xlT3JQZXJtaXNzaW9uTmFtZSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICBjb25zdCBwZXJtaXNzaW9uSGVhZGluZyA9IGAke3RoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzPy5wZXJtaXNzaW9uVGFibGVDYXB0aW9ufTxzdHJvbmc+JHtwZXJtaXNzaW9uPy5uYW1lfTwvc3Ryb25nPmA7XHJcbiAgICAgIHRoaXMudGFibGVIZWFkaW5nID0gcm9sZVxyXG4gICAgICAgID8gdGhpcy50YWJsZUhlYWRpbmcgKyBgPC9icj5gICsgcGVybWlzc2lvbkhlYWRpbmdcclxuICAgICAgICA6IHBlcm1pc3Npb25IZWFkaW5nO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWJsZUNvbHVtblNjaGVtYS5wdXNoKHtcclxuICAgICAgaWQ6IDIsXHJcbiAgICAgIGNvbHVtbkRlZjogJ3NsaWRlVG9nZ2xlJyxcclxuICAgICAgaGVhZGluZzogdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHMudGFibGVDb2x1bW5zLnN0YXR1cyxcclxuICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlNMSURFX1RPR0dMRSxcclxuICAgICAgY2VsbERhdGE6IChyb2xlTWFwcGluZzogUm9sZU9yUGVybWlzc2lvbk1hcHBpbmcpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDApICsgMSxcclxuICAgICAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgICAgIGFyaWFMYWJlbDogcm9sZU1hcHBpbmcucm9sZU9yUGVybWlzc2lvbk5hbWUsXHJcbiAgICAgICAgICBjaGVja2VkOiByb2xlTWFwcGluZy5zdGF0dXMsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5keW5hbWljRm9ybUNvbXBvbmVudC5pc1N1Ym1pdEJ1dHRvbkRpc2FibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0Um9sZVBlcm1pc3Npb25NYXBwaW5nKHRoaXMucm9sZVBlcm1pc3Npb25NYXBwaW5nUGF5bG9hZCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygcm9sZXMgYW5kIGRpc3BsYXllZCBpbiB0aGUgcm9sZSBkcm9wZG93bi5cclxuICAgKiBAbWVtYmVyb2YgTWFwUGVybWlzc2lvbnNSb2xlc0NvbXBvbmVudFxyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxyXG4gICAqL1xyXG4gIGdldFJvbGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlXHJcbiAgICAgIC5nZXRSb2xlcyh0aGlzLmFwcElkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgcm9sZXNMaXN0ID0gcmVzcG9uc2U/LmJvZHkgYXMgUm9sZVtdO1xyXG4gICAgICAgICAgICByb2xlc0xpc3QubWFwKChyb2xlOiBSb2xlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yb2xlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGlkOiByb2xlLnJvbGVJZCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHJvbGUucm9sZU5hbWUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1VdGlsaXR5U2VydmljZS51cGRhdGVGb3JtQ29udHJvbE9wdGlvbnMoXHJcbiAgICAgICAgICAgICAgJ3JvbGUnLFxyXG4gICAgICAgICAgICAgICdkcm9wZG93bk9wdGlvbnMnLFxyXG4gICAgICAgICAgICAgIHRoaXMucm9sZXMsXHJcbiAgICAgICAgICAgICAgdGhpcy5keW5hbWljRm9ybUNvbXBvbmVudFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhhbmRsZUVycm9ycyhcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIHRoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzLmVycm9yc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBwZXJtaXNzaW9ucyBhbmQgZGlzcGxheWVkIGluIHRoZSBwZXJtaXNzaW9uIGRyb3Bkb3duLlxyXG4gICAqIEBtZW1iZXJvZiBNYXBQZXJtaXNzaW9uc1JvbGVzQ29tcG9uZW50XHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgZ2V0UGVybWlzc2lvbnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLmdldFBlcm1pc3Npb25zKHRoaXMuYXBwSWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uc0xpc3QgPSByZXNwb25zZT8uYm9keSBhcyBQZXJtaXNzaW9uW107XHJcbiAgICAgICAgICAgIHBlcm1pc3Npb25zTGlzdC5tYXAoKHBlcm1pc3Npb246IFBlcm1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaWQ6IHBlcm1pc3Npb24ucGVybWlzc2lvbklkLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogcGVybWlzc2lvbi5wZXJtaXNzaW9uTmFtZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybVV0aWxpdHlTZXJ2aWNlLnVwZGF0ZUZvcm1Db250cm9sT3B0aW9ucyhcclxuICAgICAgICAgICAgICAncGVybWlzc2lvbicsXHJcbiAgICAgICAgICAgICAgJ2Ryb3Bkb3duT3B0aW9ucycsXHJcbiAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyxcclxuICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtQ29tcG9uZW50XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHMuZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1hcHBlZCByb2xlcy9wZXJtaXNzaW9ucyBmcm9tIHRoZSBiYWNrZW5kIGFwaS5cclxuICAgKiBAcGFyYW0ge1JvbGVQZXJtaXNzaW9uTWFwcGluZ1JlcXVlc3RQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQG1lbWJlcm9mIE1hcFBlcm1pc3Npb25zUm9sZXNDb21wb25lbnRcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBnZXRSb2xlUGVybWlzc2lvbk1hcHBpbmcocGF5bG9hZDogUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWQpOiB2b2lkIHtcclxuICAgIHRoaXMudGFibGVEYXRhID0gW107XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLmdldFJvbGVQZXJtaXNzaW9uTWFwcGluZyhwYXlsb2FkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGF5bG9hZEluZm8gPSBwYXlsb2FkLnBheWxvYWQ7XHJcbiAgICAgICAgICBpZiAocGF5bG9hZEluZm8/LnJvbGVJZCAmJiBwYXlsb2FkSW5mbz8ucGVybWlzc2lvbklkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgIHJvbGVPclBlcm1pc3Npb25OYW1lOiB0aGlzLnNlbGVjdGVkUGVybWlzc2lvbj8ucGVybWlzc2lvbk5hbWUsXHJcbiAgICAgICAgICAgICAgcm9sZU9yUGVybWlzc2lvbklkOiB0aGlzLnNlbGVjdGVkUGVybWlzc2lvbj8ucGVybWlzc2lvbklkLFxyXG4gICAgICAgICAgICAgIHN0YXR1czogdHJ1ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRJbmZvPy5yb2xlSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUYWJsZURhdGEoXHJcbiAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyxcclxuICAgICAgICAgICAgICByZXNwb25zZS5ib2R5IGFzIFBlcm1pc3Npb25bXSxcclxuICAgICAgICAgICAgICBSb2xlQW5kUGVybWlzc2lvbnNUYWJsZVR5cGUuUEVSTUlTU0lPTlxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUYWJsZURhdGEoXHJcbiAgICAgICAgICAgICAgdGhpcy5yb2xlcyxcclxuICAgICAgICAgICAgICByZXNwb25zZS5ib2R5IGFzIFJvbGVEZXRhaWxzW10sXHJcbiAgICAgICAgICAgICAgUm9sZUFuZFBlcm1pc3Npb25zVGFibGVUeXBlLlJPTEVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGVycm9yQ29kZXMgPSBlcnJvcj8uZXJyb3I/LmJvZHk/LmVycm9yQ29kZXM7XHJcbiAgICAgICAgICAvLyBSZXR1cm5zIGVycm9yIGNvZGUgMzAyMCB3aGVuIG1hcHBlZCByb2xlcyBkb2VzIG5vdCBleGlzdCBmb3IgZ2l2ZW4gcGVybWlzc2lvbiBpZC5cclxuICAgICAgICAgIGlmIChlcnJvckNvZGVzLmluY2x1ZGVzKCczMDIwJykpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRUYWJsZURhdGEodGhpcy5yb2xlcywgW10sIFJvbGVBbmRQZXJtaXNzaW9uc1RhYmxlVHlwZS5ST0xFKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFJldHVybnMgZXJyb3IgY29kZSAzMDIxIHdoZW4gbWFwcGVkIHBlcm1pc3Npb25zIGRvZXMgbm90IGV4aXN0IGZvciBnaXZlbiByb2xlIGlkLlxyXG4gICAgICAgICAgZWxzZSBpZiAoZXJyb3JDb2Rlcy5pbmNsdWRlcygnMzAyMScpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGFibGVEYXRhKFxyXG4gICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMsXHJcbiAgICAgICAgICAgICAgW10sXHJcbiAgICAgICAgICAgICAgUm9sZUFuZFBlcm1pc3Npb25zVGFibGVUeXBlLlBFUk1JU1NJT05cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIFJldHVybnMgZXJyb3IgY29kZSAzMDE3IHdoZW4gcm9sZSBwZXJtaXNzaW9uIG1hcHBpbmcgZG9lcyBub3QgZXhpc3QgZm9yIGdpdmVuIHJvbGUgaWQuXHJcbiAgICAgICAgICBlbHNlIGlmIChlcnJvckNvZGVzLmluY2x1ZGVzKCczMDE3JykpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZURhdGEucHVzaCh7XHJcbiAgICAgICAgICAgICAgcm9sZU9yUGVybWlzc2lvbk5hbWU6IHRoaXMuc2VsZWN0ZWRQZXJtaXNzaW9uPy5wZXJtaXNzaW9uTmFtZSxcclxuICAgICAgICAgICAgICByb2xlT3JQZXJtaXNzaW9uSWQ6IHRoaXMuc2VsZWN0ZWRQZXJtaXNzaW9uPy5wZXJtaXNzaW9uSWQsXHJcbiAgICAgICAgICAgICAgc3RhdHVzOiBmYWxzZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhhbmRsZUVycm9ycyhcclxuICAgICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgICB0aGlzLm1hcFJvbGVzQW5kUGVybWlzc2lvbnNTY3JlZW5UZXh0cy5lcnJvcnNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogRGlzcGxheWluZyB0aGUgbWFwcGVkIHJvbGVzIGFuZCBwZXJtaXNzaW9ucyBkYXRhIGludG8gdGhlIGRhdGEgdGFibGUuXHJcbiAgICogQHBhcmFtIHtTZWxlY3RPcHRpb25bXX0gcm9sZU9yUGVybWlzc2lvbnNcclxuICAgKiBAcGFyYW0ge1JvbGVEZXRhaWxzW10gfCBQZXJtaXNzaW9uW119IG1hcHBlZFJvbGVPclBlcm1pc3Npb25zXHJcbiAgICogQHBhcmFtIHtSb2xlQW5kUGVybWlzc2lvbnNUYWJsZVR5cGV9IHRhYmxlVHlwZVxyXG4gICAqIEBtZW1iZXJvZiBNYXBQZXJtaXNzaW9uc1JvbGVzQ29tcG9uZW50XHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgc2V0VGFibGVEYXRhKFxyXG4gICAgcm9sZU9yUGVybWlzc2lvbnM6IFNlbGVjdE9wdGlvbltdLFxyXG4gICAgbWFwcGVkUm9sZU9yUGVybWlzc2lvbnM6IFJvbGVEZXRhaWxzW10gfCBQZXJtaXNzaW9uW10sXHJcbiAgICB0YWJsZVR5cGU6IFJvbGVBbmRQZXJtaXNzaW9uc1RhYmxlVHlwZVxyXG4gICk6IHZvaWQge1xyXG4gICAgcm9sZU9yUGVybWlzc2lvbnMubWFwKChyb2xlT3JQZXJtaXNzaW9uKSA9PiB7XHJcbiAgICAgIHRoaXMudGFibGVEYXRhLnB1c2goe1xyXG4gICAgICAgIHJvbGVPclBlcm1pc3Npb25OYW1lOiByb2xlT3JQZXJtaXNzaW9uLm5hbWUsXHJcbiAgICAgICAgcm9sZU9yUGVybWlzc2lvbklkOiByb2xlT3JQZXJtaXNzaW9uLmlkIGFzIHN0cmluZyxcclxuICAgICAgICBzdGF0dXM6XHJcbiAgICAgICAgICB0YWJsZVR5cGUgPT09IFJvbGVBbmRQZXJtaXNzaW9uc1RhYmxlVHlwZS5ST0xFXHJcbiAgICAgICAgICAgID8gbWFwcGVkUm9sZU9yUGVybWlzc2lvbnMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAgIChtYXBwZWRSb2xlT3JQZXJtaXNzaW9ucyBhcyBSb2xlRGV0YWlsc1tdKS5zb21lKFxyXG4gICAgICAgICAgICAgICAgKG1hcHBlZFJvbGVPclBlcm1pc3Npb246IFJvbGVEZXRhaWxzKSA9PlxyXG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb2xlT3JQZXJtaXNzaW9uLnJvbGVJZCA9PT0gcm9sZU9yUGVybWlzc2lvbi5pZFxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgOiBtYXBwZWRSb2xlT3JQZXJtaXNzaW9ucy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgKG1hcHBlZFJvbGVPclBlcm1pc3Npb25zIGFzIFBlcm1pc3Npb25bXSkuc29tZShcclxuICAgICAgICAgICAgICAgIChtYXBwZWRSb2xlT3JQZXJtaXNzaW9uKSA9PlxyXG4gICAgICAgICAgICAgICAgICBtYXBwZWRSb2xlT3JQZXJtaXNzaW9uLnBlcm1pc3Npb25JZCA9PT0gcm9sZU9yUGVybWlzc2lvbi5pZFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgdGhlIHBheWxvYWQgYmFzZWQgb24gdGhlIHJvbGVzIGFuZCBwZXJtaXNzaW9ucyBtYXBwaW5nIChzZWxlY3Rpb24gb3IgZGVzZWxlY3Rpb24pLlxyXG4gICAqIEBwYXJhbSByb2xlT3JQZXJtaXNzaW9uU3RhdHVzXHJcbiAgICogQG1lbWJlcm9mIE1hcFBlcm1pc3Npb25zUm9sZXNDb21wb25lbnRcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICByb2xlT3JQZXJtaXNzaW9uU3RhdHVzQ2hhbmdlKHJvbGVPclBlcm1pc3Npb25TdGF0dXM6IHtcclxuICAgIHNsaWRlVG9nZ2xlOiBTbGlkZVRvZ2dsZU9wdGlvbjtcclxuICAgIHJvd0RhdGE6IFJvbGVPclBlcm1pc3Npb25NYXBwaW5nO1xyXG4gIH0pOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgKHRoaXMuc2VsZWN0ZWRSb2xlPy5yb2xlSWQgJiYgdGhpcy5zZWxlY3RlZFBlcm1pc3Npb24/LnBlcm1pc3Npb25JZCkgfHxcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvbGU/LnJvbGVJZFxyXG4gICAgKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLm1vZGlmaWVkUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmcuZmluZChcclxuICAgICAgICAgIChwZXJtaXNzaW9uKSA9PlxyXG4gICAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25JZCA9PT1cclxuICAgICAgICAgICAgcm9sZU9yUGVybWlzc2lvblN0YXR1cy5yb3dEYXRhLnJvbGVPclBlcm1pc3Npb25JZFxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5tb2RpZmllZFJvbGVzQW5kUGVybWlzc2lvbnNNYXBwaW5nLnNwbGljZShcclxuICAgICAgICAgIHRoaXMubW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZy5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgIChwZXJtaXNzaW9uKSA9PlxyXG4gICAgICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbklkID09PVxyXG4gICAgICAgICAgICAgIHJvbGVPclBlcm1pc3Npb25TdGF0dXMucm93RGF0YS5yb2xlT3JQZXJtaXNzaW9uSWRcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICAxXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1vZGlmaWVkUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmcucHVzaCh7XHJcbiAgICAgICAgICByb2xlSWQ6IHRoaXMuc2VsZWN0ZWRSb2xlLnJvbGVJZCxcclxuICAgICAgICAgIHBlcm1pc3Npb25JZDogcm9sZU9yUGVybWlzc2lvblN0YXR1cy5yb3dEYXRhLnJvbGVPclBlcm1pc3Npb25JZCxcclxuICAgICAgICAgIGFwcElkOiB0aGlzLmFwcElkLFxyXG4gICAgICAgICAgc3RhdHVzOiByb2xlT3JQZXJtaXNzaW9uU3RhdHVzLnNsaWRlVG9nZ2xlLmNoZWNrZWQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFBlcm1pc3Npb24/LnBlcm1pc3Npb25JZCkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5tb2RpZmllZFJvbGVzQW5kUGVybWlzc2lvbnNNYXBwaW5nLmZpbmQoXHJcbiAgICAgICAgICAocm9sZSkgPT5cclxuICAgICAgICAgICAgcm9sZS5yb2xlSWQgPT09IHJvbGVPclBlcm1pc3Npb25TdGF0dXMucm93RGF0YS5yb2xlT3JQZXJtaXNzaW9uSWRcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMubW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZy5zcGxpY2UoXHJcbiAgICAgICAgICB0aGlzLm1vZGlmaWVkUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmcuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAocm9sZSkgPT5cclxuICAgICAgICAgICAgICByb2xlLnJvbGVJZCA9PT0gcm9sZU9yUGVybWlzc2lvblN0YXR1cy5yb3dEYXRhLnJvbGVPclBlcm1pc3Npb25JZFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIDFcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZy5wdXNoKHtcclxuICAgICAgICAgIHJvbGVJZDogcm9sZU9yUGVybWlzc2lvblN0YXR1cy5yb3dEYXRhLnJvbGVPclBlcm1pc3Npb25JZCxcclxuICAgICAgICAgIHBlcm1pc3Npb25JZDogdGhpcy5zZWxlY3RlZFBlcm1pc3Npb24ucGVybWlzc2lvbklkLFxyXG4gICAgICAgICAgYXBwSWQ6IHRoaXMuYXBwSWQsXHJcbiAgICAgICAgICBzdGF0dXM6IHJvbGVPclBlcm1pc3Npb25TdGF0dXMuc2xpZGVUb2dnbGUuY2hlY2tlZCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5keW5hbWljRm9ybUNvbXBvbmVudC5pc1N1Ym1pdEJ1dHRvbkRpc2FibGVkID1cclxuICAgICAgIXRoaXMubW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZy5sZW5ndGg7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFN1Ym1pdHMgdGhlIHJvbGVzIGFuZCBwZXJtaXNzaW9ucyBtYXBwaW5ncyB0byB0aGUgc2VydmVyLlxyXG4gICAqIEBtZW1iZXJvZiBNYXBQZXJtaXNzaW9uc1JvbGVzQ29tcG9uZW50XHJcbiAgICogQHJldHVybnMge3ZvaWR9XHJcbiAgICovXHJcbiAgb25NYXBBbmRQZXJtaXNzaW9uc0Zvcm1TdWJtaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYXlsb2FkOiBSb2xlc0FuZFBlcm1pc3Npb25zUmVxdWVzdFBheWxvYWQgPSB7XHJcbiAgICAgIHBheWxvYWQ6IHRoaXMubW9kaWZpZWRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZyxcclxuICAgIH07XHJcbiAgICB0aGlzLmR5bmFtaWNGb3JtQ29tcG9uZW50LmlzU3VibWl0QnV0dG9uRGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5tb2RpZmllZFJvbGVzQW5kUGVybWlzc2lvbnNNYXBwaW5nID0gW107XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLnNhdmVSb2xlUGVybWlzc2lvbk1hcHBpbmcocGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5zaG93QWxlcnRNZXNzYWdlKFxyXG4gICAgICAgICAgICAgIEFsZXJ0VHlwZS5TVUNDRVNTLFxyXG4gICAgICAgICAgICAgIHRoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzLm1lc3NhZ2Uuc3VjY2Vzc1xyXG4gICAgICAgICAgICAgICAgLnJvbGVzQW5kUGVybWlzc2lvbnNTdWJtaXNzaW9uXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5tYXBSb2xlc0FuZFBlcm1pc3Npb25zU2NyZWVuVGV4dHMuZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDbG9zZXMgdGhlIG1hcCBhbmQgcGVybWlzc2lvbnMgbW9kYWwuXHJcbiAgICogQG1lbWJlcm9mIE1hcFBlcm1pc3Npb25zUm9sZXNDb21wb25lbnRcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBvbk1hcEFuZFBlcm1pc3Npb25zRm9ybUNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybUNhbmNlbC5lbWl0KCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBlcmZvcm1zIG5lY2Vzc2FyeSBjbGVhbnVwIHRhc2tzLCBzdWNoIGFzIHVuc3Vic2NyaWJpbmcgZnJvbSBzdWJzY3JpcHRpb24gd2hlbiB0aGUgY29tcG9uZW50IGlzIGJlaW5nIGRlc3Ryb3llZC5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveSQ/Lm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8aWVlZXNhLWR5bmFtaWMtZm9ybVxyXG4gIFtmb3JtR3JvdXBzXT1cImZvcm1Hcm91cFwiXHJcbiAgW2NvbFdpZHRoXT1cImNvbFdpZHRoXCJcclxuICBbaXNTdWJtaXRCdXR0b25EaXNhYmxlZF09XCJ0cnVlXCJcclxuICBbaXNMZWdlbmRWaXNpYmxlXT1cInRydWVcIlxyXG4gIFtsZWZ0QnV0dG9uTGFiZWxdPVwibGVmdEJ1dHRvbkxhYmVsXCJcclxuICBbcmlnaHRCdXR0b25MYWJlbF09XCJyaWdodEJ1dHRvbkxhYmVsXCJcclxuICBbaXNMZWZ0QnV0dG9uTmVlZGVkXT1cInRydWVcIlxyXG4gIFthY3Rpb25CdXR0b25BbGlnbl09XCJhY3Rpb25CdXR0b25BbGlnblwiXHJcbiAgKGRyb3Bkb3duQ2hhbmdlKT1cIm9uUm9sZU9yUGVybWlzc2lvblNlbGVjdGVkKCRldmVudClcIlxyXG4gIChmb3JtU3VibWl0KT1cIm9uTWFwQW5kUGVybWlzc2lvbnNGb3JtU3VibWl0KClcIlxyXG4gIChmb3JtTGVmdEJ1dHRvbkNsaWNrZWQpPVwib25NYXBBbmRQZXJtaXNzaW9uc0Zvcm1DYW5jZWwoKVwiXHJcbj5cclxuICA8aWVlZXNhLWRhdGEtdGFibGVcclxuICAgIGNvbXBvbmVudFxyXG4gICAgKm5nSWY9XCJ0YWJsZURhdGEubGVuZ3RoXCJcclxuICAgIFtjb2x1bW5TY2hlbWFJbmZvXT1cInRhYmxlQ29sdW1uU2NoZW1hXCJcclxuICAgIFt0YWJsZUNvbHVtbnNIZWFkZXJUZXh0XT1cInRhYmxlSGVhZGluZ1wiXHJcbiAgICBbdGFibGVEYXRhSW5mb109XCJ0YWJsZURhdGFcIlxyXG4gICAgKHJvd1NsaWRlVG9nZ2xlKT1cInJvbGVPclBlcm1pc3Npb25TdGF0dXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgPjwvaWVlZXNhLWRhdGEtdGFibGU+XHJcbjwvaWVlZXNhLWR5bmFtaWMtZm9ybT5cclxuIl19
|