@ieeesa-npm/tenants 0.4.3 → 0.4.4
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/.eslintrc.json +31 -0
- package/ng-package.json +8 -0
- package/package.json +12 -25
- package/src/lib/assets/constants.json +454 -0
- package/src/lib/assets/tenant-validations.ts +18 -0
- package/src/lib/assets/tenants-mock.ts +1240 -0
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +15 -0
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +44 -0
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +574 -0
- package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +602 -0
- package/src/lib/components/create-modify-role/create-modify-role.component.html +15 -0
- package/src/lib/components/create-modify-role/create-modify-role.component.scss +83 -0
- package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +346 -0
- package/src/lib/components/create-modify-role/create-modify-role.component.ts +321 -0
- package/src/lib/components/create-tenant-application/create-tenant-application.component.html +18 -0
- package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +73 -0
- package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +775 -0
- package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +638 -0
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +22 -0
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +79 -0
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +716 -0
- package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +504 -0
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +44 -0
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +16 -0
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +115 -0
- package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +109 -0
- package/src/lib/components/view-tenant-details/view-tenant-details.component.html +195 -0
- package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +163 -0
- package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +1221 -0
- package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +876 -0
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +10 -0
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +44 -0
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +410 -0
- package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +219 -0
- package/src/lib/components/view-tenants-list/view-tenants-list.component.html +32 -0
- package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +35 -0
- package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +464 -0
- package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +388 -0
- package/src/lib/models/app-type-config.model.ts +14 -0
- package/src/lib/models/app-type.model.ts +5 -0
- package/src/lib/models/create-group-type-config.model.ts +18 -0
- package/src/lib/models/create-group-type.model.ts +46 -0
- package/src/lib/models/feature-permission-id.model.ts +6 -0
- package/src/lib/models/features.model.ts +15 -0
- package/src/lib/models/form-status.model.ts +5 -0
- package/src/lib/models/permission-type.model.ts +9 -0
- package/src/lib/models/role-menu-action.model.ts +5 -0
- package/src/lib/models/role-type.model.ts +34 -0
- package/src/lib/models/roles-and-permissions-table-type.model.ts +5 -0
- package/src/lib/models/roles-and-permissions.model.ts +113 -0
- package/src/lib/models/route-config.model.ts +4 -0
- package/src/lib/models/table-column-schema-view-tenant-list.model.ts +21 -0
- package/src/lib/models/tenant-function-type.model.ts +10 -0
- package/src/lib/models/tenant.model.ts +47 -0
- package/src/lib/models/tenants-permission.model.ts +9 -0
- package/src/lib/models/update-tenant-status.model.ts +12 -0
- package/src/lib/models/view-tenant-group-types.model.ts +34 -0
- package/src/lib/services/tenant-applications.service.spec.ts +1245 -0
- package/src/lib/services/tenant-applications.service.ts +798 -0
- package/src/lib/services/tenant-permissions-map.service.spec.ts +25 -0
- package/src/lib/services/tenant-permissions-map.service.ts +28 -0
- package/src/lib/services/tenant-permissions.service.spec.ts +62 -0
- package/src/lib/services/tenant-permissions.service.ts +49 -0
- 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 +28 -0
- package/src/lib/tenant-applications.component.ts +12 -0
- package/src/lib/tenant-applications.module.ts +8 -0
- package/{public-api.d.ts → src/public-api.ts} +40 -33
- package/tsconfig.lib.json +14 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +14 -0
- package/esm2022/ieeesa-npm-tenants.mjs +0 -5
- package/esm2022/lib/assets/constants.json +0 -454
- package/esm2022/lib/assets/tenant-validations.mjs +0 -17
- package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +0 -477
- package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +0 -280
- package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +0 -512
- package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +0 -391
- package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +0 -95
- package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +0 -732
- package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +0 -194
- package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +0 -334
- package/esm2022/lib/models/app-type-config.model.mjs +0 -2
- package/esm2022/lib/models/app-type.model.mjs +0 -7
- package/esm2022/lib/models/create-group-type-config.model.mjs +0 -22
- package/esm2022/lib/models/create-group-type.model.mjs +0 -2
- package/esm2022/lib/models/feature-permission-id.model.mjs +0 -8
- package/esm2022/lib/models/features.model.mjs +0 -2
- package/esm2022/lib/models/form-status.model.mjs +0 -7
- package/esm2022/lib/models/permission-type.model.mjs +0 -12
- package/esm2022/lib/models/role-menu-action.model.mjs +0 -7
- package/esm2022/lib/models/role-type.model.mjs +0 -2
- package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +0 -7
- package/esm2022/lib/models/roles-and-permissions.model.mjs +0 -2
- package/esm2022/lib/models/route-config.model.mjs +0 -2
- package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +0 -16
- package/esm2022/lib/models/tenant-function-type.model.mjs +0 -12
- package/esm2022/lib/models/tenant.model.mjs +0 -2
- package/esm2022/lib/models/tenants-permission.model.mjs +0 -2
- package/esm2022/lib/models/update-tenant-status.model.mjs +0 -2
- package/esm2022/lib/models/view-tenant-group-types.model.mjs +0 -11
- package/esm2022/lib/services/tenant-applications.service.mjs +0 -618
- package/esm2022/lib/services/tenant-permissions-map.service.mjs +0 -36
- package/esm2022/lib/services/tenant-permissions.service.mjs +0 -38
- package/esm2022/lib/tenant-applications.component.mjs +0 -14
- package/esm2022/lib/tenant-applications.module.mjs +0 -16
- package/esm2022/public-api.mjs +0 -37
- package/fesm2022/ieeesa-npm-tenants.mjs +0 -4241
- package/fesm2022/ieeesa-npm-tenants.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/assets/tenant-validations.d.ts +0 -15
- package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +0 -129
- package/lib/components/create-modify-role/create-modify-role.component.d.ts +0 -103
- package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +0 -128
- package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +0 -106
- package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +0 -472
- package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +0 -223
- package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +0 -63
- package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +0 -134
- package/lib/models/app-type-config.model.d.ts +0 -14
- package/lib/models/app-type.model.d.ts +0 -4
- package/lib/models/create-group-type-config.model.d.ts +0 -16
- package/lib/models/create-group-type.model.d.ts +0 -49
- package/lib/models/feature-permission-id.model.d.ts +0 -4
- package/lib/models/features.model.d.ts +0 -15
- package/lib/models/form-status.model.d.ts +0 -4
- package/lib/models/permission-type.model.d.ts +0 -8
- package/lib/models/role-menu-action.model.d.ts +0 -4
- package/lib/models/role-type.model.d.ts +0 -27
- package/lib/models/roles-and-permissions-table-type.model.d.ts +0 -4
- package/lib/models/roles-and-permissions.model.d.ts +0 -119
- package/lib/models/route-config.model.d.ts +0 -4
- package/lib/models/table-column-schema-view-tenant-list.model.d.ts +0 -20
- package/lib/models/tenant-function-type.model.d.ts +0 -9
- package/lib/models/tenant.model.d.ts +0 -51
- package/lib/models/tenants-permission.model.d.ts +0 -9
- package/lib/models/update-tenant-status.model.d.ts +0 -14
- package/lib/models/view-tenant-group-types.model.d.ts +0 -29
- package/lib/services/tenant-applications.service.d.ts +0 -398
- package/lib/services/tenant-permissions-map.service.d.ts +0 -13
- package/lib/services/tenant-permissions.service.d.ts +0 -22
- package/lib/tenant-applications.component.d.ts +0 -5
- package/lib/tenant-applications.module.d.ts +0 -6
|
@@ -1,618 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Subject, catchError, map } from 'rxjs';
|
|
3
|
-
import * as screenTexts from '../assets/constants.json';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@ieeesa-npm/utility";
|
|
6
|
-
import * as i2 from "./tenant-permissions.service";
|
|
7
|
-
import * as i3 from "./tenant-permissions-map.service";
|
|
8
|
-
export class TenantApplicationsService {
|
|
9
|
-
constructor(
|
|
10
|
-
// eslint-disable-next-line no-unused-vars
|
|
11
|
-
httpService,
|
|
12
|
-
// eslint-disable-next-line no-unused-vars
|
|
13
|
-
tenantPermissionsService,
|
|
14
|
-
// eslint-disable-next-line no-unused-vars
|
|
15
|
-
tenantPermissionsMapService // eslint-disable-next-line no-empty-function
|
|
16
|
-
) {
|
|
17
|
-
this.httpService = httpService;
|
|
18
|
-
this.tenantPermissionsService = tenantPermissionsService;
|
|
19
|
-
this.tenantPermissionsMapService = tenantPermissionsMapService;
|
|
20
|
-
this.tenantsText = screenTexts?.viewTenants?.errors;
|
|
21
|
-
this.createTenantsText = screenTexts?.createTenant?.errors;
|
|
22
|
-
this.radioOptions = [];
|
|
23
|
-
this.checkBoxOptions = [];
|
|
24
|
-
this.appTypeInfo = [];
|
|
25
|
-
this.featureList = [];
|
|
26
|
-
this.roleTypeOptions = [];
|
|
27
|
-
this.isGroupTypeAddedOrModified = new Subject();
|
|
28
|
-
}
|
|
29
|
-
setAppConfig(apiBaseUrl, userPermission) {
|
|
30
|
-
this.apiBaseUrl = apiBaseUrl;
|
|
31
|
-
this.userPermission = userPermission;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Gets tenant details from server using HttpService
|
|
35
|
-
* @param {string} appId
|
|
36
|
-
* @return {Observable<TenantDetailsResponse>}
|
|
37
|
-
* @memberof TenantApplicationsService
|
|
38
|
-
*/
|
|
39
|
-
getTenantDetails(appId) {
|
|
40
|
-
return this.httpService
|
|
41
|
-
.getData(`${this.apiBaseUrl}/configurations/app/details/${appId}`)
|
|
42
|
-
.pipe(map((response) => {
|
|
43
|
-
return response;
|
|
44
|
-
}), catchError((error) => {
|
|
45
|
-
throw error;
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Sets the user tenants permissions
|
|
50
|
-
* @param {TenantsPermissions[]} TenantsPermissions
|
|
51
|
-
* @memberof TenantApplicationsService
|
|
52
|
-
*/
|
|
53
|
-
setUserTenantsPermissions(userTenantsPermissions) {
|
|
54
|
-
this.userTenantsPermissions = userTenantsPermissions;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Returns the user tenants permissions
|
|
58
|
-
* @return {TenantsPermissions[]}
|
|
59
|
-
* @memberof TenantApplicationsService
|
|
60
|
-
*/
|
|
61
|
-
getUserTenantsPermissions() {
|
|
62
|
-
return this.userTenantsPermissions;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Sets the user tenants information
|
|
66
|
-
* @param {TenantBasicInfo} tenantInfo
|
|
67
|
-
* @memberof TenantApplicationsService
|
|
68
|
-
*/
|
|
69
|
-
setSelectedTenantInformation(tenantInfo) {
|
|
70
|
-
this.selectedTenantInfo = tenantInfo;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Returns the tenants information
|
|
74
|
-
* @return {TenantBasicInfo}
|
|
75
|
-
* @memberof TenantApplicationsService
|
|
76
|
-
*/
|
|
77
|
-
getSelectedTenantInformation() {
|
|
78
|
-
return this.selectedTenantInfo;
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Sets the roles informations
|
|
82
|
-
* @param {Role} roles
|
|
83
|
-
* @memberof TenantApplicationsService
|
|
84
|
-
*/
|
|
85
|
-
setRolesInfo(roles) {
|
|
86
|
-
this.roles = roles;
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Returns the roles information
|
|
90
|
-
* @return {Role}
|
|
91
|
-
* @memberof TenantApplicationsService
|
|
92
|
-
*/
|
|
93
|
-
getRolesInfo() {
|
|
94
|
-
return this.roles;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Sets the selected role information.
|
|
98
|
-
* @param {RoleDetails} roleInfo
|
|
99
|
-
* @memberof TenantApplicationsService
|
|
100
|
-
*/
|
|
101
|
-
setSelectedRoleInformation(roleInfo) {
|
|
102
|
-
this.selectedRoleInfo = roleInfo;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Returns the selected role information.
|
|
106
|
-
* @return {RoleDetails}
|
|
107
|
-
* @memberof TenantApplicationsService
|
|
108
|
-
*/
|
|
109
|
-
getSelectedRoleInformation() {
|
|
110
|
-
return this.selectedRoleInfo;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Sets the tenant role type options.
|
|
114
|
-
* @param {RoleTypeOption} roleTypeOptions
|
|
115
|
-
* @memberof TenantApplicationsService
|
|
116
|
-
*/
|
|
117
|
-
setRoleTypeOption(roleTypeOptions) {
|
|
118
|
-
this.roleTypeOption = roleTypeOptions;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Returns the tenant role type options.
|
|
122
|
-
* @return {RoleTypeOption}
|
|
123
|
-
* @memberof TenantApplicationsService
|
|
124
|
-
*/
|
|
125
|
-
getRoleTypeOption() {
|
|
126
|
-
return this.roleTypeOption;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Sets the list of application type information
|
|
130
|
-
* @param {RadioOption} appTypeInfo
|
|
131
|
-
* @memberof TenantApplicationsService
|
|
132
|
-
*/
|
|
133
|
-
setApplicationType(appTypeInfo) {
|
|
134
|
-
this.appTypeInfo = appTypeInfo;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Returns the list of application type information
|
|
138
|
-
* @return {RadioOption}
|
|
139
|
-
* @memberof TenantApplicationsService
|
|
140
|
-
*/
|
|
141
|
-
getApplicationType() {
|
|
142
|
-
return this.appTypeInfo;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Filter permissions
|
|
146
|
-
* @param usersPermissions
|
|
147
|
-
* @returns @memberof TenantApplicationsService
|
|
148
|
-
*/
|
|
149
|
-
filterPermission(usersPermissions) {
|
|
150
|
-
return this.tenantPermissionsService?.filterTenantsPermissions(usersPermissions, this.tenantPermissionsMapService?.getGlobalTenantsPermissions());
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Validating access for tenants
|
|
154
|
-
* @param permissionType Permission Type to validate permission
|
|
155
|
-
* @param mappedUserPermissions Permission which are mapped with tenants
|
|
156
|
-
* @returns true if permission is granted
|
|
157
|
-
*/
|
|
158
|
-
validateAccess(permissionType, permissions) {
|
|
159
|
-
return this.tenantPermissionsService.validateAccessPermission(permissionType, permissions);
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Gets the tenants.
|
|
163
|
-
* @param {GetTenantsPayload} payload
|
|
164
|
-
* @return {Observable<GetTenantsResponse>}
|
|
165
|
-
* @memberof TenantApplicationsService
|
|
166
|
-
*/
|
|
167
|
-
getTenantsList(payload) {
|
|
168
|
-
return this.httpService
|
|
169
|
-
.postData(`${this.apiBaseUrl}/configurations/app/config`, payload)
|
|
170
|
-
.pipe(map((response) => {
|
|
171
|
-
return response;
|
|
172
|
-
}), catchError((error) => {
|
|
173
|
-
throw error;
|
|
174
|
-
}));
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Gets list of features from server using HttpService.
|
|
178
|
-
* @return {Observable<GetFeaturesResponse>}
|
|
179
|
-
* @memberof TenantApplicationsService
|
|
180
|
-
*/
|
|
181
|
-
getFeatures() {
|
|
182
|
-
return this.httpService
|
|
183
|
-
.getData(`${this.apiBaseUrl}/configurations/app/features`)
|
|
184
|
-
.pipe(map((response) => {
|
|
185
|
-
return response;
|
|
186
|
-
}), catchError((error) => {
|
|
187
|
-
throw error;
|
|
188
|
-
}));
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Gets list of roles from server using HttpService.
|
|
192
|
-
* @param {string} appId
|
|
193
|
-
* @return {*} {Observable<GetRolesResponse>}
|
|
194
|
-
* @memberof TenantApplicationsService
|
|
195
|
-
*/
|
|
196
|
-
getRoles(appId) {
|
|
197
|
-
return this.httpService
|
|
198
|
-
.getData(`${this.apiBaseUrl}/groups/role/${appId}`)
|
|
199
|
-
.pipe(map((response) => {
|
|
200
|
-
return response;
|
|
201
|
-
}), catchError((error) => {
|
|
202
|
-
throw error;
|
|
203
|
-
}));
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Gets the list of permissions based on the appId and return the success or error response as Observable.
|
|
207
|
-
* @param {string} appId
|
|
208
|
-
* @return {Observable<GetPermissionsResponse>}
|
|
209
|
-
* @memberof TenantApplicationsService
|
|
210
|
-
*/
|
|
211
|
-
getPermissions(appId) {
|
|
212
|
-
return this.httpService
|
|
213
|
-
.getData(`${this.apiBaseUrl}/groups/permissions/${appId}`)
|
|
214
|
-
.pipe(map((response) => {
|
|
215
|
-
return response;
|
|
216
|
-
}), catchError((error) => {
|
|
217
|
-
throw error;
|
|
218
|
-
}));
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Gets the list of roles or permissions based on the roleId or permissionId in the payload and return the success or error response as Observable.
|
|
222
|
-
* @param {RolePermissionMappingRequestPayload} payload
|
|
223
|
-
* @returns {Observable<RolePermissionMappingResponse>}
|
|
224
|
-
* @memberof TenantApplicationsService
|
|
225
|
-
*/
|
|
226
|
-
getRolePermissionMapping(payload) {
|
|
227
|
-
return this.httpService
|
|
228
|
-
.postData(`${this.apiBaseUrl}/groups/users/rolePermissionMapping`, payload)
|
|
229
|
-
.pipe(map((response) => {
|
|
230
|
-
return response;
|
|
231
|
-
}), catchError((error) => {
|
|
232
|
-
throw error;
|
|
233
|
-
}));
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Submit the new mappings of roles to permissions to the server.
|
|
237
|
-
* @param {RolesAndPermissionsRequestPayload} payload
|
|
238
|
-
* @returns {Observable<RolesAndPermissionsResponse>}
|
|
239
|
-
* @memberof TenantApplicationsService
|
|
240
|
-
*/
|
|
241
|
-
saveRolePermissionMapping(payload) {
|
|
242
|
-
return this.httpService
|
|
243
|
-
.postData(`${this.apiBaseUrl}/groups/users/rolePermission`, payload)
|
|
244
|
-
.pipe(map((response) => {
|
|
245
|
-
return response;
|
|
246
|
-
}), catchError((error) => {
|
|
247
|
-
throw error;
|
|
248
|
-
}));
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Gets list of roles and permissions mappings from server using HttpService.
|
|
252
|
-
* @param {string} appId
|
|
253
|
-
* @param {GetRolesAndPermissionsPayload} payload
|
|
254
|
-
* @return {*} {Observable<GetRolesAndPermissionsResponse>}
|
|
255
|
-
* @memberof TenantApplicationsService
|
|
256
|
-
*/
|
|
257
|
-
getRolesAndPermissionsMappings(appId, payload) {
|
|
258
|
-
return this.httpService
|
|
259
|
-
.postData(`${this.apiBaseUrl}/groups/roleBasedPermissions/${appId}`, payload)
|
|
260
|
-
.pipe(map((response) => {
|
|
261
|
-
return response;
|
|
262
|
-
}), catchError((error) => {
|
|
263
|
-
throw error;
|
|
264
|
-
}));
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Gets list of application types from server using HttpService.
|
|
268
|
-
* @return {Observable<GetAppTypesResponse>}
|
|
269
|
-
* @memberof TenantApplicationsService
|
|
270
|
-
*/
|
|
271
|
-
getApplicationTypes() {
|
|
272
|
-
return this.httpService
|
|
273
|
-
.getData(`${this.apiBaseUrl}/configurations/config/app_type`)
|
|
274
|
-
.pipe(map((response) => {
|
|
275
|
-
return response;
|
|
276
|
-
}), catchError((error) => {
|
|
277
|
-
throw error;
|
|
278
|
-
}));
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Posts create role form data to server using HttpService to create a new role.
|
|
282
|
-
* @param {CreateModifyRoleRequestPayload} createModifyRolePayload
|
|
283
|
-
* @return {Observable<CreateModifyRoleResponse>}
|
|
284
|
-
* @memberof TenantApplicationsService
|
|
285
|
-
*/
|
|
286
|
-
createRole(createModifyRolePayload) {
|
|
287
|
-
return this.httpService
|
|
288
|
-
.postData(`${this.apiBaseUrl}/groups/role`, createModifyRolePayload)
|
|
289
|
-
.pipe(map((response) => {
|
|
290
|
-
return response;
|
|
291
|
-
}), catchError((error) => {
|
|
292
|
-
throw error;
|
|
293
|
-
}));
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Posts the edited role form data to server using HttpService for updating the role information.
|
|
297
|
-
* @param {CreateModifyRoleRequestPayload} createModifyRolePayload
|
|
298
|
-
* @return {Observable<CreateModifyRoleResponse>}
|
|
299
|
-
* @memberof TenantApplicationsService
|
|
300
|
-
*/
|
|
301
|
-
editRole(createModifyRolePayload) {
|
|
302
|
-
return this.httpService
|
|
303
|
-
.putData(`${this.apiBaseUrl}/groups/role`, createModifyRolePayload)
|
|
304
|
-
.pipe(map((response) => {
|
|
305
|
-
return response;
|
|
306
|
-
}), catchError((error) => {
|
|
307
|
-
throw error;
|
|
308
|
-
}));
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Gets list of role types from server using HttpService.
|
|
312
|
-
* @param {GetRoleTypesPayload} payload
|
|
313
|
-
* @return {Observable<RoleTypeResponse>}
|
|
314
|
-
* @memberof TenantApplicationsService
|
|
315
|
-
*/
|
|
316
|
-
getRoleTypes(payload) {
|
|
317
|
-
return this.httpService
|
|
318
|
-
.postData(`${this.apiBaseUrl}/configurations/config/configField`, payload)
|
|
319
|
-
.pipe(map((response) => {
|
|
320
|
-
return response;
|
|
321
|
-
}), catchError((error) => {
|
|
322
|
-
throw error;
|
|
323
|
-
}));
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Constructs the select/dropdown options from the role types received from server.
|
|
327
|
-
* @param {RoleTypeConfiguration[]} roleTypeResponse
|
|
328
|
-
* @return {RoleTypeOption[]}
|
|
329
|
-
* @memberof TenantApplicationsService
|
|
330
|
-
*/
|
|
331
|
-
getRoleTypeOptions(roleTypeResponse) {
|
|
332
|
-
this.roleTypeOptions = [];
|
|
333
|
-
roleTypeResponse.forEach((item) => {
|
|
334
|
-
this.roleTypeOptions?.push({
|
|
335
|
-
id: item?.configFieldId,
|
|
336
|
-
name: item?.configFieldValue?.roleTypeName,
|
|
337
|
-
order: item?.configFieldValue?.viewOrder,
|
|
338
|
-
});
|
|
339
|
-
});
|
|
340
|
-
this.roleTypeOptions.sort((a, b) => a.order - b.order);
|
|
341
|
-
return this.roleTypeOptions;
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Posts tenant application form data to server using HttpService for creating new tenant application.
|
|
345
|
-
* @param {CreateTenantPayload} createTenantPayload
|
|
346
|
-
* @return {Observable<CreateTenantResponse>}
|
|
347
|
-
* @memberof TenantApplicationsService
|
|
348
|
-
*/
|
|
349
|
-
createTenant(createTenantPayload) {
|
|
350
|
-
return this.httpService
|
|
351
|
-
.postData(`${this.apiBaseUrl}/configurations/app/createTenant`, createTenantPayload)
|
|
352
|
-
.pipe(map((response) => {
|
|
353
|
-
return response;
|
|
354
|
-
}), catchError((error) => {
|
|
355
|
-
throw error;
|
|
356
|
-
}));
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Constructs the checkbox options from features list from server.
|
|
360
|
-
* @param {FeaturesList[]} features
|
|
361
|
-
* @returns {CheckboxOption[]}
|
|
362
|
-
*/
|
|
363
|
-
getFeatureOptions(features) {
|
|
364
|
-
this.checkBoxOptions = [];
|
|
365
|
-
features?.forEach((feature) => {
|
|
366
|
-
this.checkBoxOptions?.push({
|
|
367
|
-
id: feature?.featureId,
|
|
368
|
-
name: feature?.featureName,
|
|
369
|
-
checked: feature?.isDefault,
|
|
370
|
-
disabled: feature?.isDefault,
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
return this.checkBoxOptions;
|
|
374
|
-
}
|
|
375
|
-
/**
|
|
376
|
-
* Constructs the radio options from application types from server.
|
|
377
|
-
* @param {AppTypeConfig[]} appTypeOptions
|
|
378
|
-
* @returns {RadioOption[]}
|
|
379
|
-
*/
|
|
380
|
-
getApplicationTypeOptions(appTypeOptions) {
|
|
381
|
-
this.radioOptions = [];
|
|
382
|
-
appTypeOptions?.forEach((appType) => {
|
|
383
|
-
this.radioOptions?.push({
|
|
384
|
-
id: appType?.configFieldId,
|
|
385
|
-
label: appType?.configFieldValue?.type,
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
return this.radioOptions;
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Constructs the selected features id's.
|
|
392
|
-
* @param {CheckboxOption[]} featureOptions
|
|
393
|
-
* @returns {FeatureId[]}
|
|
394
|
-
*/
|
|
395
|
-
getFeatureIds(featureOptions) {
|
|
396
|
-
const featureIds = [];
|
|
397
|
-
featureOptions?.forEach((featureOption) => {
|
|
398
|
-
if (featureOption?.checked) {
|
|
399
|
-
featureIds.push({
|
|
400
|
-
featureId: featureOption.id,
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
});
|
|
404
|
-
return featureIds;
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Sets the newly created tenant information.
|
|
408
|
-
* @param {NewTenantInfo} newTenantInfo
|
|
409
|
-
*/
|
|
410
|
-
setNewTenantInfo(newTenantInfo) {
|
|
411
|
-
this.newTenantInfo = newTenantInfo;
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Returns the newly created tenant information.
|
|
415
|
-
*/
|
|
416
|
-
get getNewTenantInfo() {
|
|
417
|
-
return this.newTenantInfo;
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Sets tenant function type.
|
|
421
|
-
* @param {TenantFunctionType} tenantFunctionType -tenant function type.
|
|
422
|
-
*/
|
|
423
|
-
setTenantFunctionType(tenantFunctionType) {
|
|
424
|
-
this.tenantFunctionType = tenantFunctionType;
|
|
425
|
-
}
|
|
426
|
-
/**
|
|
427
|
-
* Returns tenant function type.
|
|
428
|
-
* @return {TenantFunctionType} -tenant function type.
|
|
429
|
-
*/
|
|
430
|
-
getTenantFunctionType() {
|
|
431
|
-
return this.tenantFunctionType;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Stores the newly created role information.
|
|
435
|
-
* @param {RoleInfo} newlyCreatedRole -create role information.
|
|
436
|
-
*/
|
|
437
|
-
setNewlyCreatedRoleInfo(newlyCreatedRole) {
|
|
438
|
-
this.newlyCreatedRole = newlyCreatedRole;
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Returns the newly created role information.
|
|
442
|
-
* @return {RoleInfo} -create role information.
|
|
443
|
-
*/
|
|
444
|
-
getNewlyCreatedRoleInfo() {
|
|
445
|
-
return this.newlyCreatedRole;
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Stores the newly created group type information.
|
|
449
|
-
* @param {CreatedOrModifiedGroupTypeInfo} newlyCreatedGroupType
|
|
450
|
-
* @memberof TenantApplicationsService
|
|
451
|
-
*/
|
|
452
|
-
setNewlyCreatedGroupTypeInfo(newlyCreatedGroupType) {
|
|
453
|
-
this.newlyCreatedGroupType = newlyCreatedGroupType;
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Returns the newly created group type information.
|
|
457
|
-
* @return {*} {CreatedOrModifiedGroupTypeInfo}
|
|
458
|
-
* @memberof TenantApplicationsService
|
|
459
|
-
*/
|
|
460
|
-
getNewlyCreatedGroupTypeInfo() {
|
|
461
|
-
return this.newlyCreatedGroupType;
|
|
462
|
-
}
|
|
463
|
-
/**
|
|
464
|
-
* Posts the edited tenant application form data to server using HttpService for updating the tenant information.
|
|
465
|
-
* @param {CreateTenantPayload} editTenantPayload
|
|
466
|
-
* @return {Observable<CreateTenantResponse>}
|
|
467
|
-
* @memberof TenantApplicationsService
|
|
468
|
-
*/
|
|
469
|
-
editTenant(editTenantPayload) {
|
|
470
|
-
return this.httpService
|
|
471
|
-
.putData(`${this.apiBaseUrl}/configurations/app/editTenant`, editTenantPayload)
|
|
472
|
-
.pipe(map((response) => {
|
|
473
|
-
return response;
|
|
474
|
-
}), catchError((error) => {
|
|
475
|
-
throw error;
|
|
476
|
-
}));
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Sends update request to the server to update the tenant application status to active/inactive using HttpService and returns the success or failure response.
|
|
480
|
-
* @param {UpdateTenantStatusRequestPayload} updateTenantStatusPayload
|
|
481
|
-
* @return {Observable<UpdateTenantStatusResponse>}
|
|
482
|
-
* @memberof TenantApplicationsService
|
|
483
|
-
*/
|
|
484
|
-
updateTenantStatus(updateTenantStatusPayload) {
|
|
485
|
-
return this.httpService
|
|
486
|
-
.putData(`${this.apiBaseUrl}/configurations/app/updateStatus`, updateTenantStatusPayload)
|
|
487
|
-
.pipe(map((response) => {
|
|
488
|
-
return response;
|
|
489
|
-
}), catchError((error) => {
|
|
490
|
-
throw error;
|
|
491
|
-
}));
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* It generates Feature list from checkbox options generated in form array.
|
|
495
|
-
* @param {CheckboxOption[]} features
|
|
496
|
-
* @return {Features[]}
|
|
497
|
-
* @memberof TenantApplicationsService
|
|
498
|
-
*/
|
|
499
|
-
getFeaturesList(features) {
|
|
500
|
-
this.featureList = [];
|
|
501
|
-
features?.forEach((feature) => {
|
|
502
|
-
if (feature.checked)
|
|
503
|
-
this.featureList?.push({
|
|
504
|
-
featureId: feature?.id,
|
|
505
|
-
featureName: feature?.name,
|
|
506
|
-
isDefault: feature?.checked,
|
|
507
|
-
});
|
|
508
|
-
});
|
|
509
|
-
return this.featureList;
|
|
510
|
-
}
|
|
511
|
-
/**
|
|
512
|
-
* Gets roster type from server using HttpService.
|
|
513
|
-
* @return {*} {Observable<GetRosterTypeOrSettingsResponse>}
|
|
514
|
-
* @memberof TenantApplicationsService
|
|
515
|
-
*/
|
|
516
|
-
getRosterType() {
|
|
517
|
-
return this.httpService
|
|
518
|
-
.getData(`${this.apiBaseUrl}/configurations/lookup/RosterType`)
|
|
519
|
-
.pipe(map((response) => {
|
|
520
|
-
return response;
|
|
521
|
-
}), catchError((error) => {
|
|
522
|
-
throw error;
|
|
523
|
-
}));
|
|
524
|
-
}
|
|
525
|
-
/**
|
|
526
|
-
* Gets group type settings from server using HttpService.
|
|
527
|
-
* @return {*} {Observable<GetRosterTypeOrSettingsResponse>}
|
|
528
|
-
* @memberof TenantApplicationsService
|
|
529
|
-
*/
|
|
530
|
-
getGroupTypeSettings() {
|
|
531
|
-
return this.httpService
|
|
532
|
-
.getData(`${this.apiBaseUrl}/configurations/lookup/GT_Settings`)
|
|
533
|
-
.pipe(map((response) => {
|
|
534
|
-
return response;
|
|
535
|
-
}), catchError((error) => {
|
|
536
|
-
throw error;
|
|
537
|
-
}));
|
|
538
|
-
}
|
|
539
|
-
/**
|
|
540
|
-
* Posts the group type details to server using HttpService to create new group type.
|
|
541
|
-
* @param {CreateGroupTypeRequestPayload} createGroupTypePayload
|
|
542
|
-
* @return {*} {Observable<CreateGroupTypeResponse>}
|
|
543
|
-
* @memberof TenantApplicationsService
|
|
544
|
-
*/
|
|
545
|
-
createGroupType(createGroupTypePayload) {
|
|
546
|
-
return this.httpService
|
|
547
|
-
.postData(`${this.apiBaseUrl}/configurations/config/groupType`, createGroupTypePayload)
|
|
548
|
-
.pipe(map((response) => {
|
|
549
|
-
return response;
|
|
550
|
-
}), catchError((error) => {
|
|
551
|
-
throw error;
|
|
552
|
-
}));
|
|
553
|
-
}
|
|
554
|
-
/**
|
|
555
|
-
* Returns sorted role list data.
|
|
556
|
-
* @param {Role[]} roleList
|
|
557
|
-
* @return {Role[]}
|
|
558
|
-
* @memberof TenantApplicationsService
|
|
559
|
-
*/
|
|
560
|
-
sortRolesByRoleType(roleList) {
|
|
561
|
-
return roleList.sort((a, b) => a?.viewOrder - b?.viewOrder);
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* Posts the role details to server using HttpService for deleting the role.
|
|
565
|
-
* @param {DeleteRoleRequestPayload} deleteRoleRequestPayload
|
|
566
|
-
* @return {Observable<DeleteRoleResponse>}
|
|
567
|
-
* @memberof TenantApplicationsService
|
|
568
|
-
*/
|
|
569
|
-
deleteRole(deleteRolePayload) {
|
|
570
|
-
return this.httpService
|
|
571
|
-
.putData(`${this.apiBaseUrl}/groups/role/deleteRole`, deleteRolePayload)
|
|
572
|
-
.pipe(map((response) => {
|
|
573
|
-
return response;
|
|
574
|
-
}), catchError((error) => {
|
|
575
|
-
throw error;
|
|
576
|
-
}));
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* Gets group types from server using HttpService.
|
|
580
|
-
* @param {string} appId
|
|
581
|
-
* @return {Observable<ViewGroupTypeResponse>}
|
|
582
|
-
* @memberof TenantApplicationsService
|
|
583
|
-
*/
|
|
584
|
-
getGroupTypes(appId) {
|
|
585
|
-
return this.httpService
|
|
586
|
-
.getData(`${this.apiBaseUrl}/configurations/config/appGroupTypeDetails/${appId}`)
|
|
587
|
-
.pipe(map((response) => {
|
|
588
|
-
return response;
|
|
589
|
-
}), catchError((error) => {
|
|
590
|
-
throw error;
|
|
591
|
-
}));
|
|
592
|
-
}
|
|
593
|
-
/**
|
|
594
|
-
* Sets group type details.
|
|
595
|
-
* @param {ViewGroupTypeResponse} groupTypes
|
|
596
|
-
* @memberof TenantApplicationsService
|
|
597
|
-
*/
|
|
598
|
-
setGroupTypeDetails(groupTypes) {
|
|
599
|
-
this.groupTypes = groupTypes;
|
|
600
|
-
}
|
|
601
|
-
/**
|
|
602
|
-
* Returns group type details.
|
|
603
|
-
* @return {ViewGroupTypeResponse}
|
|
604
|
-
* @memberof TenantApplicationsService
|
|
605
|
-
*/
|
|
606
|
-
getGroupTypeDetails() {
|
|
607
|
-
return this.groupTypes;
|
|
608
|
-
}
|
|
609
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, deps: [{ token: i1.HttpService }, { token: i2.TenantPermissionsService }, { token: i3.TenantPermissionsMapService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
610
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, providedIn: 'root' }); }
|
|
611
|
-
}
|
|
612
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TenantApplicationsService, decorators: [{
|
|
613
|
-
type: Injectable,
|
|
614
|
-
args: [{
|
|
615
|
-
providedIn: 'root',
|
|
616
|
-
}]
|
|
617
|
-
}], ctorParameters: function () { return [{ type: i1.HttpService }, { type: i2.TenantPermissionsService }, { type: i3.TenantPermissionsMapService }]; } });
|
|
618
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWFwcGxpY2F0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL3NlcnZpY2VzL3RlbmFudC1hcHBsaWNhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWlFeEQsTUFBTSxPQUFPLHlCQUF5QjtJQXFCcEM7SUFDRSwwQ0FBMEM7SUFDbEMsV0FBd0I7SUFDaEMsMENBQTBDO0lBQ2xDLHdCQUFrRDtJQUMxRCwwQ0FBMEM7SUFDbEMsMkJBQXdELENBQUMsNkNBQTZDOztRQUp0RyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUV4Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBRWxELGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUExQmxFLGdCQUFXLEdBQUcsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFLL0Msc0JBQWlCLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7UUFHdEQsaUJBQVksR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUN2QyxnQkFBVyxHQUFrQixFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBZSxFQUFFLENBQUM7UUFDN0Isb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBT3ZDLCtCQUEwQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7SUFRakQsQ0FBQztJQUNKLFlBQVksQ0FBQyxVQUFrQixFQUFFLGNBQWdDO1FBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElB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Ozs7T0FLRztJQUNILFVBQVUsQ0FDUixpQkFBMkM7UUFFM0MsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNwQixPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSx5QkFBeUIsRUFBRSxpQkFBaUIsQ0FBQzthQUN2RSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsS0FBYTtRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXO2FBQ3BCLE9BQU8sQ0FDTixHQUFHLElBQUksQ0FBQyxVQUFVLDhDQUE4QyxLQUFLLEVBQUUsQ0FDeEU7YUFDQSxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDZixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLFVBQWlDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOytHQXh0QlUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICdAaWVlZXNhLW5wbS91dGlsaXR5JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHRzIGZyb20gJy4uL2Fzc2V0cy9jb25zdGFudHMuanNvbic7XHJcbmltcG9ydCB7IEdldFRlbmFudHNQYXlsb2FkIH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLWNvbHVtbi1zY2hlbWEtdmlldy10ZW5hbnQtbGlzdC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgVGVuYW50c1Blcm1pc3Npb25zLFxyXG4gIFVzZXJQZXJtaXNzaW9uLFxyXG59IGZyb20gJy4uL21vZGVscy90ZW5hbnRzLXBlcm1pc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9wZXJtaXNzaW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBUZW5hbnRQZXJtaXNzaW9uc01hcFNlcnZpY2UgfSBmcm9tICcuL3RlbmFudC1wZXJtaXNzaW9ucy1tYXAuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ3JlYXRlVGVuYW50UmVxdWVzdFBheWxvYWQsXHJcbiAgQ3JlYXRlVGVuYW50UmVzcG9uc2UsXHJcbiAgR2V0VGVuYW50c1Jlc3BvbnNlLFxyXG4gIE5ld1RlbmFudEluZm8sXHJcbiAgVGVuYW50QmFzaWNJbmZvLFxyXG4gIFRlbmFudERldGFpbHNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvdGVuYW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ2hlY2tib3hPcHRpb24sIFJhZGlvT3B0aW9uIH0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0IHtcclxuICBGZWF0dXJlSWQsXHJcbiAgRmVhdHVyZXMsXHJcbiAgR2V0RmVhdHVyZXNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvZmVhdHVyZXMubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIEFwcFR5cGVDb25maWcsXHJcbiAgR2V0QXBwVHlwZXNSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvYXBwLXR5cGUtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgVGVuYW50UGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi90ZW5hbnQtcGVybWlzc2lvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFRlbmFudEZ1bmN0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy90ZW5hbnQtZnVuY3Rpb24tdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1BheWxvYWQsXHJcbiAgR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxyXG4gIEdldFJvbGVzUmVzcG9uc2UsXHJcbiAgUm9sZUluZm8sXHJcbiAgRGVsZXRlUm9sZVJlcXVlc3RQYXlsb2FkLFxyXG4gIERlbGV0ZVJvbGVSZXNwb25zZSxcclxuICBSb2xlLFxyXG4gIEdldFBlcm1pc3Npb25zUmVzcG9uc2UsXHJcbiAgUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWQsXHJcbiAgUm9sZVBlcm1pc3Npb25NYXBwaW5nUmVzcG9uc2UsXHJcbiAgUm9sZXNBbmRQZXJtaXNzaW9uc1JlcXVlc3RQYXlsb2FkLFxyXG4gIFJvbGVzQW5kUGVybWlzc2lvbnNSZXNwb25zZSxcclxuICBSb2xlRGV0YWlscyxcclxuICBDcmVhdGVNb2RpZnlSb2xlUmVxdWVzdFBheWxvYWQsXHJcbiAgQ3JlYXRlTW9kaWZ5Um9sZVJlc3BvbnNlLFxyXG59IGZyb20gJy4uL21vZGVscy9yb2xlcy1hbmQtcGVybWlzc2lvbnMubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIFVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkLFxyXG4gIFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlLFxyXG59IGZyb20gJy4uL21vZGVscy91cGRhdGUtdGVuYW50LXN0YXR1cy5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgR2V0Um9sZVR5cGVzUGF5bG9hZCxcclxuICBSb2xlVHlwZUNvbmZpZ3VyYXRpb24sXHJcbiAgUm9sZVR5cGVPcHRpb24sXHJcbiAgUm9sZVR5cGVSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvcm9sZS10eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgVmlld0dyb3VwVHlwZVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3ZpZXctdGVuYW50LWdyb3VwLXR5cGVzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBDcmVhdGVHcm91cFR5cGVSZXF1ZXN0UGF5bG9hZCxcclxuICBDcmVhdGVHcm91cFR5cGVSZXNwb25zZSxcclxuICBDcmVhdGVkT3JNb2RpZmllZEdyb3VwVHlwZUluZm8sXHJcbiAgR2V0Um9zdGVyVHlwZU9yU2V0dGluZ3NSZXNwb25zZSxcclxufSBmcm9tICcuLi9tb2RlbHMvY3JlYXRlLWdyb3VwLXR5cGUubW9kZWwnO1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGVuYW50QXBwbGljYXRpb25zU2VydmljZSB7XHJcbiAgdGVuYW50c1RleHQgPSBzY3JlZW5UZXh0cz8udmlld1RlbmFudHM/LmVycm9ycztcclxuICBhcGlCYXNlVXJsITogc3RyaW5nO1xyXG4gIHVzZXJQZXJtaXNzaW9uITogVXNlclBlcm1pc3Npb25bXTtcclxuICBzZWxlY3RlZFRlbmFudEluZm8hOiBUZW5hbnRCYXNpY0luZm8gfCB1bmRlZmluZWQ7XHJcbiAgdXNlclRlbmFudHNQZXJtaXNzaW9ucyE6IFRlbmFudHNQZXJtaXNzaW9uc1tdO1xyXG4gIGNyZWF0ZVRlbmFudHNUZXh0ID0gc2NyZWVuVGV4dHM/LmNyZWF0ZVRlbmFudD8uZXJyb3JzO1xyXG4gIG5ld1RlbmFudEluZm8hOiBOZXdUZW5hbnRJbmZvO1xyXG4gIHRlbmFudEZ1bmN0aW9uVHlwZSE6IFRlbmFudEZ1bmN0aW9uVHlwZTtcclxuICByYWRpb09wdGlvbnM6IFJhZGlvT3B0aW9uW10gPSBbXTtcclxuICBjaGVja0JveE9wdGlvbnM6IENoZWNrYm94T3B0aW9uW10gPSBbXTtcclxuICBhcHBUeXBlSW5mbzogUmFkaW9PcHRpb25bXSA9IFtdO1xyXG4gIGZlYXR1cmVMaXN0OiBGZWF0dXJlc1tdID0gW107XHJcbiAgcm9sZVR5cGVPcHRpb25zOiBSb2xlVHlwZU9wdGlvbltdID0gW107XHJcbiAgbmV3bHlDcmVhdGVkUm9sZSE6IFJvbGVJbmZvO1xyXG4gIHJvbGVUeXBlT3B0aW9uITogUm9sZVR5cGVPcHRpb25bXTtcclxuICBzZWxlY3RlZFJvbGVJbmZvITogUm9sZURldGFpbHM7XHJcbiAgcm9sZXMhOiBSb2xlW107XHJcbiAgZ3JvdXBUeXBlcyE6IFZpZXdHcm91cFR5cGVSZXNwb25zZTtcclxuICBuZXdseUNyZWF0ZWRHcm91cFR5cGUhOiBDcmVhdGVkT3JNb2RpZmllZEdyb3VwVHlwZUluZm87XHJcbiAgaXNHcm91cFR5cGVBZGRlZE9yTW9kaWZpZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSB0ZW5hbnRQZXJtaXNzaW9uc1NlcnZpY2U6IFRlbmFudFBlcm1pc3Npb25zU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSB0ZW5hbnRQZXJtaXNzaW9uc01hcFNlcnZpY2U6IFRlbmFudFBlcm1pc3Npb25zTWFwU2VydmljZSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cclxuICApIHt9XHJcbiAgc2V0QXBwQ29uZmlnKGFwaUJhc2VVcmw6IHN0cmluZywgdXNlclBlcm1pc3Npb246IFVzZXJQZXJtaXNzaW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMuYXBpQmFzZVVybCA9IGFwaUJhc2VVcmw7XHJcbiAgICB0aGlzLnVzZXJQZXJtaXNzaW9uID0gdXNlclBlcm1pc3Npb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRlbmFudCBkZXRhaWxzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcElkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxUZW5hbnREZXRhaWxzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0VGVuYW50RGV0YWlscyhhcHBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxUZW5hbnREZXRhaWxzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvYXBwL2RldGFpbHMvJHthcHBJZH1gKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHVzZXIgdGVuYW50cyBwZXJtaXNzaW9uc1xyXG4gICAqIEBwYXJhbSB7VGVuYW50c1Blcm1pc3Npb25zW119IFRlbmFudHNQZXJtaXNzaW9uc1xyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0VXNlclRlbmFudHNQZXJtaXNzaW9ucyh1c2VyVGVuYW50c1Blcm1pc3Npb25zOiBUZW5hbnRzUGVybWlzc2lvbnNbXSkge1xyXG4gICAgdGhpcy51c2VyVGVuYW50c1Blcm1pc3Npb25zID0gdXNlclRlbmFudHNQZXJtaXNzaW9ucztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdXNlciB0ZW5hbnRzIHBlcm1pc3Npb25zXHJcbiAgICogQHJldHVybiB7VGVuYW50c1Blcm1pc3Npb25zW119XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRVc2VyVGVuYW50c1Blcm1pc3Npb25zKCk6IFRlbmFudHNQZXJtaXNzaW9uc1tdIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJUZW5hbnRzUGVybWlzc2lvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSB1c2VyIHRlbmFudHMgaW5mb3JtYXRpb25cclxuICAgKiBAcGFyYW0ge1RlbmFudEJhc2ljSW5mb30gdGVuYW50SW5mb1xyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0U2VsZWN0ZWRUZW5hbnRJbmZvcm1hdGlvbih0ZW5hbnRJbmZvOiBUZW5hbnRCYXNpY0luZm8pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUZW5hbnRJbmZvID0gdGVuYW50SW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGVuYW50cyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge1RlbmFudEJhc2ljSW5mb31cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkVGVuYW50SW5mb3JtYXRpb24oKTogVGVuYW50QmFzaWNJbmZvIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVGVuYW50SW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgcm9sZXMgaW5mb3JtYXRpb25zXHJcbiAgICogQHBhcmFtIHtSb2xlfSByb2xlc1xyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0Um9sZXNJbmZvKHJvbGVzOiBSb2xlW10pOiB2b2lkIHtcclxuICAgIHRoaXMucm9sZXMgPSByb2xlcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgcm9sZXMgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtSb2xlfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZXNJbmZvKCk6IFJvbGVbXSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5yb2xlcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgc2VsZWN0ZWQgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge1JvbGVEZXRhaWxzfSByb2xlSW5mb1xyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0U2VsZWN0ZWRSb2xlSW5mb3JtYXRpb24ocm9sZUluZm86IFJvbGVEZXRhaWxzKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkUm9sZUluZm8gPSByb2xlSW5mbztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcmV0dXJuIHtSb2xlRGV0YWlsc31cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFNlbGVjdGVkUm9sZUluZm9ybWF0aW9uKCk6IFJvbGVEZXRhaWxzIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm9sZUluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRlbmFudCByb2xlIHR5cGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge1JvbGVUeXBlT3B0aW9ufSByb2xlVHlwZU9wdGlvbnNcclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldFJvbGVUeXBlT3B0aW9uKHJvbGVUeXBlT3B0aW9uczogUm9sZVR5cGVPcHRpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5yb2xlVHlwZU9wdGlvbiA9IHJvbGVUeXBlT3B0aW9ucztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGVuYW50IHJvbGUgdHlwZSBvcHRpb25zLlxyXG4gICAqIEByZXR1cm4ge1JvbGVUeXBlT3B0aW9ufVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZVR5cGVPcHRpb24oKTogUm9sZVR5cGVPcHRpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb2xlVHlwZU9wdGlvbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiB0eXBlIGluZm9ybWF0aW9uXHJcbiAgICogQHBhcmFtIHtSYWRpb09wdGlvbn0gYXBwVHlwZUluZm9cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIHNldEFwcGxpY2F0aW9uVHlwZShhcHBUeXBlSW5mbzogUmFkaW9PcHRpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHBUeXBlSW5mbyA9IGFwcFR5cGVJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uIHR5cGUgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtSYWRpb09wdGlvbn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEFwcGxpY2F0aW9uVHlwZSgpOiBSYWRpb09wdGlvbltdIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmFwcFR5cGVJbmZvO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBGaWx0ZXIgcGVybWlzc2lvbnNcclxuICAgKiBAcGFyYW0gdXNlcnNQZXJtaXNzaW9uc1xyXG4gICAqIEByZXR1cm5zIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZmlsdGVyUGVybWlzc2lvbih1c2Vyc1Blcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbltdKTogVGVuYW50c1Blcm1pc3Npb25zW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVuYW50UGVybWlzc2lvbnNTZXJ2aWNlPy5maWx0ZXJUZW5hbnRzUGVybWlzc2lvbnMoXHJcbiAgICAgIHVzZXJzUGVybWlzc2lvbnMsXHJcbiAgICAgIHRoaXMudGVuYW50UGVybWlzc2lvbnNNYXBTZXJ2aWNlPy5nZXRHbG9iYWxUZW5hbnRzUGVybWlzc2lvbnMoKVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGluZyBhY2Nlc3MgZm9yIHRlbmFudHNcclxuICAgKiBAcGFyYW0gcGVybWlzc2lvblR5cGUgUGVybWlzc2lvbiBUeXBlIHRvIHZhbGlkYXRlIHBlcm1pc3Npb25cclxuICAgKiBAcGFyYW0gbWFwcGVkVXNlclBlcm1pc3Npb25zIFBlcm1pc3Npb24gd2hpY2ggYXJlIG1hcHBlZCB3aXRoIHRlbmFudHNcclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlQWNjZXNzKFxyXG4gICAgcGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlLFxyXG4gICAgcGVybWlzc2lvbnM6IFRlbmFudHNQZXJtaXNzaW9uc1tdXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW5hbnRQZXJtaXNzaW9uc1NlcnZpY2UudmFsaWRhdGVBY2Nlc3NQZXJtaXNzaW9uKFxyXG4gICAgICBwZXJtaXNzaW9uVHlwZSxcclxuICAgICAgcGVybWlzc2lvbnNcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIHRlbmFudHMuXHJcbiAgICogQHBhcmFtIHtHZXRUZW5hbnRzUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0VGVuYW50c1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFRlbmFudHNMaXN0KHBheWxvYWQ6IEdldFRlbmFudHNQYXlsb2FkKTogT2JzZXJ2YWJsZTxHZXRUZW5hbnRzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9jb25maWdgLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiBmZWF0dXJlcyBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldEZlYXR1cmVzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0RmVhdHVyZXMoKTogT2JzZXJ2YWJsZTxHZXRGZWF0dXJlc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAuZ2V0RGF0YShgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9mZWF0dXJlc2ApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBsaXN0IG9mIHJvbGVzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxHZXRSb2xlc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVzKGFwcElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEdldFJvbGVzUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3JvbGUvJHthcHBJZH1gKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIGFwcElkIGFuZCByZXR1cm4gdGhlIHN1Y2Nlc3Mgb3IgZXJyb3IgcmVzcG9uc2UgYXMgT2JzZXJ2YWJsZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwSWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPEdldFBlcm1pc3Npb25zUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0UGVybWlzc2lvbnMoYXBwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8R2V0UGVybWlzc2lvbnNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvcGVybWlzc2lvbnMvJHthcHBJZH1gKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGxpc3Qgb2Ygcm9sZXMgb3IgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIHJvbGVJZCBvciBwZXJtaXNzaW9uSWQgaW4gdGhlIHBheWxvYWQgYW5kIHJldHVybiB0aGUgc3VjY2VzcyBvciBlcnJvciByZXNwb25zZSBhcyBPYnNlcnZhYmxlLlxyXG4gICAqIEBwYXJhbSB7Um9sZVBlcm1pc3Npb25NYXBwaW5nUmVxdWVzdFBheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxSb2xlUGVybWlzc2lvbk1hcHBpbmdSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb2xlUGVybWlzc2lvbk1hcHBpbmcoXHJcbiAgICBwYXlsb2FkOiBSb2xlUGVybWlzc2lvbk1hcHBpbmdSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Um9sZVBlcm1pc3Npb25NYXBwaW5nUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy91c2Vycy9yb2xlUGVybWlzc2lvbk1hcHBpbmdgLFxyXG4gICAgICAgIHBheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFN1Ym1pdCB0aGUgbmV3IG1hcHBpbmdzIG9mIHJvbGVzIHRvIHBlcm1pc3Npb25zIHRvIHRoZSBzZXJ2ZXIuXHJcbiAgICogQHBhcmFtIHtSb2xlc0FuZFBlcm1pc3Npb25zUmVxdWVzdFBheWxvYWR9IHBheWxvYWRcclxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxSb2xlc0FuZFBlcm1pc3Npb25zUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2F2ZVJvbGVQZXJtaXNzaW9uTWFwcGluZyhcclxuICAgIHBheWxvYWQ6IFJvbGVzQW5kUGVybWlzc2lvbnNSZXF1ZXN0UGF5bG9hZFxyXG4gICk6IE9ic2VydmFibGU8Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9ncm91cHMvdXNlcnMvcm9sZVBlcm1pc3Npb25gLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGlzdCBvZiByb2xlcyBhbmQgcGVybWlzc2lvbnMgbWFwcGluZ3MgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcElkXHJcbiAgICogQHBhcmFtIHtHZXRSb2xlc0FuZFBlcm1pc3Npb25zUGF5bG9hZH0gcGF5bG9hZFxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxHZXRSb2xlc0FuZFBlcm1pc3Npb25zUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0Um9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmdzKFxyXG4gICAgYXBwSWQ6IHN0cmluZyxcclxuICAgIHBheWxvYWQ6IEdldFJvbGVzQW5kUGVybWlzc2lvbnNQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRSb2xlc0FuZFBlcm1pc3Npb25zUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wb3N0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2dyb3Vwcy9yb2xlQmFzZWRQZXJtaXNzaW9ucy8ke2FwcElkfWAsXHJcbiAgICAgICAgcGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBsaXN0IG9mIGFwcGxpY2F0aW9uIHR5cGVzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8R2V0QXBwVHlwZXNSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRBcHBsaWNhdGlvblR5cGVzKCk6IE9ic2VydmFibGU8R2V0QXBwVHlwZXNSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9jb25maWcvYXBwX3R5cGVgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIGNyZWF0ZSByb2xlIGZvcm0gZGF0YSB0byBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UgdG8gY3JlYXRlIGEgbmV3IHJvbGUuXHJcbiAgICogQHBhcmFtIHtDcmVhdGVNb2RpZnlSb2xlUmVxdWVzdFBheWxvYWR9IGNyZWF0ZU1vZGlmeVJvbGVQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDcmVhdGVNb2RpZnlSb2xlUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgY3JlYXRlUm9sZShcclxuICAgIGNyZWF0ZU1vZGlmeVJvbGVQYXlsb2FkOiBDcmVhdGVNb2RpZnlSb2xlUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPENyZWF0ZU1vZGlmeVJvbGVSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3JvbGVgLCBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyB0aGUgZWRpdGVkIHJvbGUgZm9ybSBkYXRhIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSBmb3IgdXBkYXRpbmcgdGhlIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHBhcmFtIHtDcmVhdGVNb2RpZnlSb2xlUmVxdWVzdFBheWxvYWR9IGNyZWF0ZU1vZGlmeVJvbGVQYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxDcmVhdGVNb2RpZnlSb2xlUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZWRpdFJvbGUoXHJcbiAgICBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZDogQ3JlYXRlTW9kaWZ5Um9sZVJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVNb2RpZnlSb2xlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3JvbGVgLCBjcmVhdGVNb2RpZnlSb2xlUGF5bG9hZClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBsaXN0IG9mIHJvbGUgdHlwZXMgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHBhcmFtIHtHZXRSb2xlVHlwZXNQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxSb2xlVHlwZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldFJvbGVUeXBlcyhwYXlsb2FkOiBHZXRSb2xlVHlwZXNQYXlsb2FkKTogT2JzZXJ2YWJsZTxSb2xlVHlwZVJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucG9zdERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9jb25maWcvY29uZmlnRmllbGRgLCBwYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgdGhlIHNlbGVjdC9kcm9wZG93biBvcHRpb25zIGZyb20gdGhlIHJvbGUgdHlwZXMgcmVjZWl2ZWQgZnJvbSBzZXJ2ZXIuXHJcbiAgICogQHBhcmFtIHtSb2xlVHlwZUNvbmZpZ3VyYXRpb25bXX0gcm9sZVR5cGVSZXNwb25zZVxyXG4gICAqIEByZXR1cm4ge1JvbGVUeXBlT3B0aW9uW119XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb2xlVHlwZU9wdGlvbnMoXHJcbiAgICByb2xlVHlwZVJlc3BvbnNlOiBSb2xlVHlwZUNvbmZpZ3VyYXRpb25bXVxyXG4gICk6IFJvbGVUeXBlT3B0aW9uW10ge1xyXG4gICAgdGhpcy5yb2xlVHlwZU9wdGlvbnMgPSBbXTtcclxuICAgIHJvbGVUeXBlUmVzcG9uc2UuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICB0aGlzLnJvbGVUeXBlT3B0aW9ucz8ucHVzaCh7XHJcbiAgICAgICAgaWQ6IGl0ZW0/LmNvbmZpZ0ZpZWxkSWQsXHJcbiAgICAgICAgbmFtZTogaXRlbT8uY29uZmlnRmllbGRWYWx1ZT8ucm9sZVR5cGVOYW1lLFxyXG4gICAgICAgIG9yZGVyOiBpdGVtPy5jb25maWdGaWVsZFZhbHVlPy52aWV3T3JkZXIsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvbGVUeXBlT3B0aW9ucy5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XHJcbiAgICByZXR1cm4gdGhpcy5yb2xlVHlwZU9wdGlvbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQb3N0cyB0ZW5hbnQgYXBwbGljYXRpb24gZm9ybSBkYXRhIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSBmb3IgY3JlYXRpbmcgbmV3IHRlbmFudCBhcHBsaWNhdGlvbi5cclxuICAgKiBAcGFyYW0ge0NyZWF0ZVRlbmFudFBheWxvYWR9IGNyZWF0ZVRlbmFudFBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENyZWF0ZVRlbmFudFJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGNyZWF0ZVRlbmFudChcclxuICAgIGNyZWF0ZVRlbmFudFBheWxvYWQ6IENyZWF0ZVRlbmFudFJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVUZW5hbnRSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKFxyXG4gICAgICAgIGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvYXBwL2NyZWF0ZVRlbmFudGAsXHJcbiAgICAgICAgY3JlYXRlVGVuYW50UGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgdGhlIGNoZWNrYm94IG9wdGlvbnMgZnJvbSBmZWF0dXJlcyBsaXN0IGZyb20gc2VydmVyLlxyXG4gICAqIEBwYXJhbSB7RmVhdHVyZXNMaXN0W119IGZlYXR1cmVzXHJcbiAgICogQHJldHVybnMge0NoZWNrYm94T3B0aW9uW119XHJcbiAgICovXHJcbiAgZ2V0RmVhdHVyZU9wdGlvbnMoZmVhdHVyZXM6IEZlYXR1cmVzW10pOiBDaGVja2JveE9wdGlvbltdIHtcclxuICAgIHRoaXMuY2hlY2tCb3hPcHRpb25zID0gW107XHJcbiAgICBmZWF0dXJlcz8uZm9yRWFjaCgoZmVhdHVyZTogRmVhdHVyZXMpID0+IHtcclxuICAgICAgdGhpcy5jaGVja0JveE9wdGlvbnM/LnB1c2goe1xyXG4gICAgICAgIGlkOiBmZWF0dXJlPy5mZWF0dXJlSWQsXHJcbiAgICAgICAgbmFtZTogZmVhdHVyZT8uZmVhdHVyZU5hbWUsXHJcbiAgICAgICAgY2hlY2tlZDogZmVhdHVyZT8uaXNEZWZhdWx0LFxyXG4gICAgICAgIGRpc2FibGVkOiBmZWF0dXJlPy5pc0RlZmF1bHQsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5jaGVja0JveE9wdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgdGhlIHJhZGlvIG9wdGlvbnMgZnJvbSBhcHBsaWNhdGlvbiB0eXBlcyBmcm9tIHNlcnZlci5cclxuICAgKiBAcGFyYW0ge0FwcFR5cGVDb25maWdbXX0gYXBwVHlwZU9wdGlvbnNcclxuICAgKiBAcmV0dXJucyB7UmFkaW9PcHRpb25bXX1cclxuICAgKi9cclxuICBnZXRBcHBsaWNhdGlvblR5cGVPcHRpb25zKGFwcFR5cGVPcHRpb25zOiBBcHBUeXBlQ29uZmlnW10pOiBSYWRpb09wdGlvbltdIHtcclxuICAgIHRoaXMucmFkaW9PcHRpb25zID0gW107XHJcbiAgICBhcHBUeXBlT3B0aW9ucz8uZm9yRWFjaCgoYXBwVHlwZTogQXBwVHlwZUNvbmZpZykgPT4ge1xyXG4gICAgICB0aGlzLnJhZGlvT3B0aW9ucz8ucHVzaCh7XHJcbiAgICAgICAgaWQ6IGFwcFR5cGU/LmNvbmZpZ0ZpZWxkSWQsXHJcbiAgICAgICAgbGFiZWw6IGFwcFR5cGU/LmNvbmZpZ0ZpZWxkVmFsdWU/LnR5cGUsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5yYWRpb09wdGlvbnM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgdGhlIHNlbGVjdGVkIGZlYXR1cmVzIGlkJ3MuXHJcbiAgICogQHBhcmFtIHtDaGVja2JveE9wdGlvbltdfSBmZWF0dXJlT3B0aW9uc1xyXG4gICAqIEByZXR1cm5zIHtGZWF0dXJlSWRbXX1cclxuICAgKi9cclxuICBnZXRGZWF0dXJlSWRzKGZlYXR1cmVPcHRpb25zOiBDaGVja2JveE9wdGlvbltdKTogRmVhdHVyZUlkW10ge1xyXG4gICAgY29uc3QgZmVhdHVyZUlkczogRmVhdHVyZUlkW10gPSBbXTtcclxuICAgIGZlYXR1cmVPcHRpb25zPy5mb3JFYWNoKChmZWF0dXJlT3B0aW9uOiBDaGVja2JveE9wdGlvbikgPT4ge1xyXG4gICAgICBpZiAoZmVhdHVyZU9wdGlvbj8uY2hlY2tlZCkge1xyXG4gICAgICAgIGZlYXR1cmVJZHMucHVzaCh7XHJcbiAgICAgICAgICBmZWF0dXJlSWQ6IGZlYXR1cmVPcHRpb24uaWQgYXMgc3RyaW5nLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmZWF0dXJlSWRzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBuZXdseSBjcmVhdGVkIHRlbmFudCBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge05ld1RlbmFudEluZm99IG5ld1RlbmFudEluZm9cclxuICAgKi9cclxuICBzZXROZXdUZW5hbnRJbmZvKG5ld1RlbmFudEluZm86IE5ld1RlbmFudEluZm8pOiB2b2lkIHtcclxuICAgIHRoaXMubmV3VGVuYW50SW5mbyA9IG5ld1RlbmFudEluZm87XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgdGVuYW50IGluZm9ybWF0aW9uLlxyXG4gICAqL1xyXG4gIGdldCBnZXROZXdUZW5hbnRJbmZvKCk6IE5ld1RlbmFudEluZm8ge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3VGVuYW50SW5mbztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGVuYW50IGZ1bmN0aW9uIHR5cGUuXHJcbiAgICogQHBhcmFtIHtUZW5hbnRGdW5jdGlvblR5cGV9IHRlbmFudEZ1bmN0aW9uVHlwZSAtdGVuYW50IGZ1bmN0aW9uIHR5cGUuXHJcbiAgICovXHJcbiAgc2V0VGVuYW50RnVuY3Rpb25UeXBlKHRlbmFudEZ1bmN0aW9uVHlwZTogVGVuYW50RnVuY3Rpb25UeXBlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEZ1bmN0aW9uVHlwZSA9IHRlbmFudEZ1bmN0aW9uVHlwZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGVuYW50IGZ1bmN0aW9uIHR5cGUuXHJcbiAgICogQHJldHVybiB7VGVuYW50RnVuY3Rpb25UeXBlfSAtdGVuYW50IGZ1bmN0aW9uIHR5cGUuXHJcbiAgICovXHJcbiAgZ2V0VGVuYW50RnVuY3Rpb25UeXBlKCk6IFRlbmFudEZ1bmN0aW9uVHlwZSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW5hbnRGdW5jdGlvblR5cGU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyB0aGUgbmV3bHkgY3JlYXRlZCByb2xlIGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB7Um9sZUluZm99IG5ld2x5Q3JlYXRlZFJvbGUgLWNyZWF0ZSByb2xlIGluZm9ybWF0aW9uLlxyXG4gICAqL1xyXG4gIHNldE5ld2x5Q3JlYXRlZFJvbGVJbmZvKG5ld2x5Q3JlYXRlZFJvbGU6IFJvbGVJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld2x5Q3JlYXRlZFJvbGUgPSBuZXdseUNyZWF0ZWRSb2xlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBuZXdseSBjcmVhdGVkIHJvbGUgaW5mb3JtYXRpb24uXHJcbiAgICogQHJldHVybiB7Um9sZUluZm99IC1jcmVhdGUgcm9sZSBpbmZvcm1hdGlvbi5cclxuICAgKi9cclxuICBnZXROZXdseUNyZWF0ZWRSb2xlSW5mbygpOiBSb2xlSW5mbyB7XHJcbiAgICByZXR1cm4gdGhpcy5uZXdseUNyZWF0ZWRSb2xlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdG9yZXMgdGhlIG5ld2x5IGNyZWF0ZWQgZ3JvdXAgdHlwZSBpbmZvcm1hdGlvbi5cclxuICAgKiBAcGFyYW0ge0NyZWF0ZWRPck1vZGlmaWVkR3JvdXBUeXBlSW5mb30gbmV3bHlDcmVhdGVkR3JvdXBUeXBlXHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBzZXROZXdseUNyZWF0ZWRHcm91cFR5cGVJbmZvKG5ld2x5Q3JlYXRlZEdyb3VwVHlwZTogQ3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld2x5Q3JlYXRlZEdyb3VwVHlwZSA9IG5ld2x5Q3JlYXRlZEdyb3VwVHlwZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBncm91cCB0eXBlIGluZm9ybWF0aW9uLlxyXG4gICAqIEByZXR1cm4geyp9ICB7Q3JlYXRlZE9yTW9kaWZpZWRHcm91cFR5cGVJbmZvfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0TmV3bHlDcmVhdGVkR3JvdXBUeXBlSW5mbygpOiBDcmVhdGVkT3JNb2RpZmllZEdyb3VwVHlwZUluZm8ge1xyXG4gICAgcmV0dXJuIHRoaXMubmV3bHlDcmVhdGVkR3JvdXBUeXBlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyB0aGUgZWRpdGVkIHRlbmFudCBhcHBsaWNhdGlvbiBmb3JtIGRhdGEgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlIGZvciB1cGRhdGluZyB0aGUgdGVuYW50IGluZm9ybWF0aW9uLlxyXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGVuYW50UGF5bG9hZH0gZWRpdFRlbmFudFBheWxvYWRcclxuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPENyZWF0ZVRlbmFudFJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGVkaXRUZW5hbnQoXHJcbiAgICBlZGl0VGVuYW50UGF5bG9hZDogQ3JlYXRlVGVuYW50UmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPENyZWF0ZVRlbmFudFJlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC9lZGl0VGVuYW50YCxcclxuICAgICAgICBlZGl0VGVuYW50UGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2VuZHMgdXBkYXRlIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0byB1cGRhdGUgdGhlIHRlbmFudCBhcHBsaWNhdGlvbiBzdGF0dXMgdG8gYWN0aXZlL2luYWN0aXZlIHVzaW5nIEh0dHBTZXJ2aWNlIGFuZCByZXR1cm5zIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgcmVzcG9uc2UuXHJcbiAgICogQHBhcmFtIHtVcGRhdGVUZW5hbnRTdGF0dXNSZXF1ZXN0UGF5bG9hZH0gdXBkYXRlVGVuYW50U3RhdHVzUGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8VXBkYXRlVGVuYW50U3RhdHVzUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgdXBkYXRlVGVuYW50U3RhdHVzKFxyXG4gICAgdXBkYXRlVGVuYW50U3RhdHVzUGF5bG9hZDogVXBkYXRlVGVuYW50U3RhdHVzUmVxdWVzdFBheWxvYWRcclxuICApOiBPYnNlcnZhYmxlPFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZVxyXG4gICAgICAucHV0RGF0YShcclxuICAgICAgICBgJHt0aGlzLmFwaUJhc2VVcmx9L2NvbmZpZ3VyYXRpb25zL2FwcC91cGRhdGVTdGF0dXNgLFxyXG4gICAgICAgIHVwZGF0ZVRlbmFudFN0YXR1c1BheWxvYWRcclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEl0IGdlbmVyYXRlcyBGZWF0dXJlIGxpc3QgZnJvbSBjaGVja2JveCBvcHRpb25zIGdlbmVyYXRlZCBpbiBmb3JtIGFycmF5LlxyXG4gICAqIEBwYXJhbSB7Q2hlY2tib3hPcHRpb25bXX0gZmVhdHVyZXNcclxuICAgKiBAcmV0dXJuIHtGZWF0dXJlc1tdfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0RmVhdHVyZXNMaXN0KGZlYXR1cmVzOiBDaGVja2JveE9wdGlvbltdKTogRmVhdHVyZXNbXSB7XHJcbiAgICB0aGlzLmZlYXR1cmVMaXN0ID0gW107XHJcbiAgICBmZWF0dXJlcz8uZm9yRWFjaCgoZmVhdHVyZTogQ2hlY2tib3hPcHRpb24pID0+IHtcclxuICAgICAgaWYgKGZlYXR1cmUuY2hlY2tlZClcclxuICAgICAgICB0aGlzLmZlYXR1cmVMaXN0Py5wdXNoKHtcclxuICAgICAgICAgIGZlYXR1cmVJZDogZmVhdHVyZT8uaWQgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgZmVhdHVyZU5hbWU6IGZlYXR1cmU/Lm5hbWUgYXMgc3RyaW5nLFxyXG4gICAgICAgICAgaXNEZWZhdWx0OiBmZWF0dXJlPy5jaGVja2VkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5mZWF0dXJlTGlzdDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyByb3N0ZXIgdHlwZSBmcm9tIHNlcnZlciB1c2luZyBIdHRwU2VydmljZS5cclxuICAgKiBAcmV0dXJuIHsqfSAge09ic2VydmFibGU8R2V0Um9zdGVyVHlwZU9yU2V0dGluZ3NSZXNwb25zZT59XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRSb3N0ZXJUeXBlKCk6IE9ic2VydmFibGU8R2V0Um9zdGVyVHlwZU9yU2V0dGluZ3NSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9sb29rdXAvUm9zdGVyVHlwZWApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogR2V0cyBncm91cCB0eXBlIHNldHRpbmdzIGZyb20gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlLlxyXG4gICAqIEByZXR1cm4geyp9ICB7T2JzZXJ2YWJsZTxHZXRSb3N0ZXJUeXBlT3JTZXR0aW5nc1Jlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGdldEdyb3VwVHlwZVNldHRpbmdzKCk6IE9ic2VydmFibGU8R2V0Um9zdGVyVHlwZU9yU2V0dGluZ3NSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLmdldERhdGEoYCR7dGhpcy5hcGlCYXNlVXJsfS9jb25maWd1cmF0aW9ucy9sb29rdXAvR1RfU2V0dGluZ3NgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFBvc3RzIHRoZSBncm91cCB0eXBlIGRldGFpbHMgdG8gc2VydmVyIHVzaW5nIEh0dHBTZXJ2aWNlIHRvIGNyZWF0ZSBuZXcgZ3JvdXAgdHlwZS5cclxuICAgKiBAcGFyYW0ge0NyZWF0ZUdyb3VwVHlwZVJlcXVlc3RQYXlsb2FkfSBjcmVhdGVHcm91cFR5cGVQYXlsb2FkXHJcbiAgICogQHJldHVybiB7Kn0gIHtPYnNlcnZhYmxlPENyZWF0ZUdyb3VwVHlwZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGNyZWF0ZUdyb3VwVHlwZShcclxuICAgIGNyZWF0ZUdyb3VwVHlwZVBheWxvYWQ6IENyZWF0ZUdyb3VwVHlwZVJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxDcmVhdGVHcm91cFR5cGVSZXNwb25zZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcclxuICAgICAgLnBvc3REYXRhKFxyXG4gICAgICAgIGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvY29uZmlnL2dyb3VwVHlwZWAsXHJcbiAgICAgICAgY3JlYXRlR3JvdXBUeXBlUGF5bG9hZFxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBzb3J0ZWQgcm9sZSBsaXN0IGRhdGEuXHJcbiAgICogQHBhcmFtIHtSb2xlW119IHJvbGVMaXN0XHJcbiAgICogQHJldHVybiB7Um9sZVtdfVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc29ydFJvbGVzQnlSb2xlVHlwZShyb2xlTGlzdDogUm9sZVtdKTogUm9sZVtdIHtcclxuICAgIHJldHVybiByb2xlTGlzdC5zb3J0KChhLCBiKSA9PiBhPy52aWV3T3JkZXIgLSBiPy52aWV3T3JkZXIpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyB0aGUgcm9sZSBkZXRhaWxzIHRvIHNlcnZlciB1c2luZyBIdHRwU2VydmljZSBmb3IgZGVsZXRpbmcgdGhlIHJvbGUuXHJcbiAgICogQHBhcmFtIHtEZWxldGVSb2xlUmVxdWVzdFBheWxvYWR9IGRlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZFxyXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8RGVsZXRlUm9sZVJlc3BvbnNlPn1cclxuICAgKiBAbWVtYmVyb2YgVGVuYW50QXBwbGljYXRpb25zU2VydmljZVxyXG4gICAqL1xyXG4gIGRlbGV0ZVJvbGUoXHJcbiAgICBkZWxldGVSb2xlUGF5bG9hZDogRGVsZXRlUm9sZVJlcXVlc3RQYXlsb2FkXHJcbiAgKTogT2JzZXJ2YWJsZTxEZWxldGVSb2xlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5wdXREYXRhKGAke3RoaXMuYXBpQmFzZVVybH0vZ3JvdXBzL3JvbGUvZGVsZXRlUm9sZWAsIGRlbGV0ZVJvbGVQYXlsb2FkKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgZ3JvdXAgdHlwZXMgZnJvbSBzZXJ2ZXIgdXNpbmcgSHR0cFNlcnZpY2UuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcElkXHJcbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxWaWV3R3JvdXBUeXBlUmVzcG9uc2U+fVxyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgZ2V0R3JvdXBUeXBlcyhhcHBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxWaWV3R3JvdXBUeXBlUmVzcG9uc2U+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlXHJcbiAgICAgIC5nZXREYXRhKFxyXG4gICAgICAgIGAke3RoaXMuYXBpQmFzZVVybH0vY29uZmlndXJhdGlvbnMvY29uZmlnL2FwcEdyb3VwVHlwZURldGFpbHMvJHthcHBJZH1gXHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIGdyb3VwIHR5cGUgZGV0YWlscy5cclxuICAgKiBAcGFyYW0ge1ZpZXdHcm91cFR5cGVSZXNwb25zZX0gZ3JvdXBUeXBlc1xyXG4gICAqIEBtZW1iZXJvZiBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlXHJcbiAgICovXHJcbiAgc2V0R3JvdXBUeXBlRGV0YWlscyhncm91cFR5cGVzOiBWaWV3R3JvdXBUeXBlUmVzcG9uc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JvdXBUeXBlcyA9IGdyb3VwVHlwZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGdyb3VwIHR5cGUgZGV0YWlscy5cclxuICAgKiBAcmV0dXJuIHtWaWV3R3JvdXBUeXBlUmVzcG9uc2V9XHJcbiAgICogQG1lbWJlcm9mIFRlbmFudEFwcGxpY2F0aW9uc1NlcnZpY2VcclxuICAgKi9cclxuICBnZXRHcm91cFR5cGVEZXRhaWxzKCk6IFZpZXdHcm91cFR5cGVSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncm91cFR5cGVzO1xyXG4gIH1cclxufVxyXG4iXX0=
|