@csmart/ngc-smart-core 0.7.95 → 1.13.2

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.
Files changed (91) hide show
  1. package/csmart-ngc-smart-core.d.ts +1 -5
  2. package/esm2020/csmart-ngc-smart-core.mjs +5 -0
  3. package/esm2020/lib/ngc-smart-core.module.mjs +97 -0
  4. package/esm2020/lib/smart-auth/smart-access-control-config.mjs +12 -0
  5. package/esm2020/lib/smart-auth/smart-access-control.directive.mjs +40 -0
  6. package/esm2020/lib/smart-auth/smart-auth.service.mjs +479 -0
  7. package/esm2020/lib/smart-auth/smart-authorization-guard.service.mjs +35 -0
  8. package/esm2020/lib/smart-auth/smart-error.component.mjs +37 -0
  9. package/esm2020/lib/smart-auth/smart-login-staff-resolver.service.mjs +59 -0
  10. package/esm2020/lib/smart-auth/smart-selected-offender-resolver.service.mjs +49 -0
  11. package/esm2020/lib/smart-navbar/smart-navbar-config.mjs +2 -0
  12. package/esm2020/lib/smart-navbar/smart-navbar.component.mjs +132 -0
  13. package/esm2020/lib/smart-navbar/smart-navbar.service.mjs +63 -0
  14. package/esm2020/lib/smart-offender-header/smart-offender-header.component.mjs +151 -0
  15. package/esm2020/lib/smart-offender-header/smart-offender-header.service.mjs +41 -0
  16. package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.mjs +25 -0
  17. package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.component.mjs +78 -0
  18. package/esm2020/lib/smart-staff-offender-options/smart-staff-offender-options.service.mjs +134 -0
  19. package/esm2020/lib/smart-storage/smart-storage-model.mjs +30 -0
  20. package/esm2020/lib/smart-storage/xdm.service.mjs +158 -0
  21. package/esm2020/public-api.mjs +20 -0
  22. package/fesm2015/csmart-ngc-smart-core.mjs +1529 -0
  23. package/fesm2015/csmart-ngc-smart-core.mjs.map +1 -0
  24. package/fesm2020/csmart-ngc-smart-core.mjs +1514 -0
  25. package/fesm2020/csmart-ngc-smart-core.mjs.map +1 -0
  26. package/lib/ngc-smart-core.module.d.ts +18 -0
  27. package/lib/smart-auth/smart-access-control.directive.d.ts +3 -0
  28. package/lib/smart-auth/smart-auth.service.d.ts +4 -0
  29. package/lib/smart-auth/smart-authorization-guard.service.d.ts +3 -0
  30. package/lib/smart-auth/smart-error.component.d.ts +3 -0
  31. package/lib/smart-auth/smart-login-staff-resolver.service.d.ts +3 -0
  32. package/lib/smart-auth/smart-selected-offender-resolver.service.d.ts +3 -0
  33. package/lib/smart-navbar/smart-navbar.component.d.ts +6 -3
  34. package/lib/smart-navbar/smart-navbar.service.d.ts +3 -0
  35. package/lib/smart-offender-header/smart-offender-header.component.d.ts +4 -1
  36. package/lib/smart-offender-header/smart-offender-header.service.d.ts +3 -0
  37. package/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.d.ts +3 -0
  38. package/lib/smart-staff-offender-options/smart-staff-offender-options.component.d.ts +3 -0
  39. package/lib/smart-staff-offender-options/smart-staff-offender-options.service.d.ts +6 -3
  40. package/lib/smart-storage/xdm.service.d.ts +3 -0
  41. package/package.json +25 -14
  42. package/public-api.d.ts +3 -0
  43. package/bundles/csmart-ngc-smart-core.umd.js +0 -2620
  44. package/bundles/csmart-ngc-smart-core.umd.js.map +0 -1
  45. package/bundles/csmart-ngc-smart-core.umd.min.js +0 -2
  46. package/bundles/csmart-ngc-smart-core.umd.min.js.map +0 -1
  47. package/csmart-ngc-smart-core.metadata.json +0 -1
  48. package/esm2015/csmart-ngc-smart-core.js +0 -15
  49. package/esm2015/lib/ngc-smart-core.module.js +0 -59
  50. package/esm2015/lib/smart-auth/smart-access-control-config.js +0 -32
  51. package/esm2015/lib/smart-auth/smart-access-control.directive.js +0 -70
  52. package/esm2015/lib/smart-auth/smart-auth.service.js +0 -693
  53. package/esm2015/lib/smart-auth/smart-authorization-guard.service.js +0 -63
  54. package/esm2015/lib/smart-auth/smart-error.component.js +0 -77
  55. package/esm2015/lib/smart-auth/smart-login-staff-resolver.service.js +0 -94
  56. package/esm2015/lib/smart-auth/smart-selected-offender-resolver.service.js +0 -101
  57. package/esm2015/lib/smart-navbar/smart-navbar-config.js +0 -22
  58. package/esm2015/lib/smart-navbar/smart-navbar.component.js +0 -224
  59. package/esm2015/lib/smart-navbar/smart-navbar.service.js +0 -89
  60. package/esm2015/lib/smart-offender-header/smart-offender-header.component.js +0 -253
  61. package/esm2015/lib/smart-offender-header/smart-offender-header.service.js +0 -85
  62. package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.js +0 -49
  63. package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options.component.js +0 -151
  64. package/esm2015/lib/smart-staff-offender-options/smart-staff-offender-options.service.js +0 -222
  65. package/esm2015/lib/smart-storage/smart-storage-model.js +0 -131
  66. package/esm2015/lib/smart-storage/xdm.service.js +0 -317
  67. package/esm2015/public-api.js +0 -22
  68. package/esm5/csmart-ngc-smart-core.js +0 -15
  69. package/esm5/lib/ngc-smart-core.module.js +0 -63
  70. package/esm5/lib/smart-auth/smart-access-control-config.js +0 -32
  71. package/esm5/lib/smart-auth/smart-access-control.directive.js +0 -74
  72. package/esm5/lib/smart-auth/smart-auth.service.js +0 -762
  73. package/esm5/lib/smart-auth/smart-authorization-guard.service.js +0 -67
  74. package/esm5/lib/smart-auth/smart-error.component.js +0 -83
  75. package/esm5/lib/smart-auth/smart-login-staff-resolver.service.js +0 -98
  76. package/esm5/lib/smart-auth/smart-selected-offender-resolver.service.js +0 -108
  77. package/esm5/lib/smart-navbar/smart-navbar-config.js +0 -22
  78. package/esm5/lib/smart-navbar/smart-navbar.component.js +0 -251
  79. package/esm5/lib/smart-navbar/smart-navbar.service.js +0 -114
  80. package/esm5/lib/smart-offender-header/smart-offender-header.component.js +0 -283
  81. package/esm5/lib/smart-offender-header/smart-offender-header.service.js +0 -76
  82. package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options-resolver.service.js +0 -52
  83. package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options.component.js +0 -165
  84. package/esm5/lib/smart-staff-offender-options/smart-staff-offender-options.service.js +0 -232
  85. package/esm5/lib/smart-storage/smart-storage-model.js +0 -155
  86. package/esm5/lib/smart-storage/xdm.service.js +0 -389
  87. package/esm5/public-api.js +0 -22
  88. package/fesm2015/csmart-ngc-smart-core.js +0 -2231
  89. package/fesm2015/csmart-ngc-smart-core.js.map +0 -1
  90. package/fesm5/csmart-ngc-smart-core.js +0 -2502
  91. package/fesm5/csmart-ngc-smart-core.js.map +0 -1
@@ -1,762 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/smart-auth/smart-auth.service.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import * as tslib_1 from "tslib";
7
- import { Injectable, Inject, isDevMode } from '@angular/core';
8
- import { HttpClient } from '@angular/common/http';
9
- import { of, from, throwError } from 'rxjs';
10
- import { map, switchMap, take, catchError } from 'rxjs/operators';
11
- import { MsalService } from '@azure/msal-angular';
12
- import { SMART_DATA_SERVICE_URL, SMART_DOMAIN_FORMAT, } from '../smart-storage/smart-storage-model';
13
- import { XdmService } from '../smart-storage/xdm.service';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@angular/common/http";
16
- import * as i2 from "@azure/msal-angular";
17
- import * as i3 from "../smart-storage/xdm.service";
18
- import * as i4 from "../smart-storage/smart-storage-model";
19
- // import { stringify } from 'querystring';
20
- var SmartAuthService = /** @class */ (function () {
21
- function SmartAuthService(http, authnService, xdmService, smartDataServiceUrl, smartDomainFormatUrl) {
22
- this.http = http;
23
- this.authnService = authnService;
24
- this.xdmService = xdmService;
25
- this.smartDataServiceUrl = smartDataServiceUrl;
26
- this.smartDomainFormatUrl = smartDomainFormatUrl;
27
- }
28
- /**
29
- * @return {?}
30
- */
31
- SmartAuthService.prototype.getLoginStaff = /**
32
- * @return {?}
33
- */
34
- function () {
35
- var _this = this;
36
- if (isDevMode) {
37
- console.log('SmartAuthService - getLoginStaff()');
38
- }
39
- if (!isDevMode && this.loginStaff) {
40
- if (this.loginStaff.staffId) {
41
- if (isDevMode) {
42
- console.log('##### getLoginStaff(): get internal instance in service', this.loginStaff);
43
- }
44
- return of(this.loginStaff);
45
- }
46
- else if (this.loginStaff.userName) {
47
- if (isDevMode) {
48
- console.log('##### getLoginStaff(): get using preset user name', this.loginStaff);
49
- }
50
- return this.getStaff(this.loginStaff.userName);
51
- }
52
- }
53
- return from(this.xdmService.getLoginStaff()).pipe(switchMap((/**
54
- * @param {?} storedResult
55
- * @return {?}
56
- */
57
- function (storedResult) {
58
- if (storedResult && storedResult.staffId) {
59
- if (isDevMode) {
60
- console.log('##### getLoginStaff(): get from session.', storedResult);
61
- }
62
- _this.loginStaff = storedResult;
63
- return of(storedResult);
64
- }
65
- else if (storedResult && storedResult.userName) {
66
- if (isDevMode) {
67
- console.log('##### getLoginStaff(): get using preset user name', _this.loginStaff);
68
- }
69
- return _this.getStaff(storedResult.userName);
70
- }
71
- else {
72
- /** @type {?} */
73
- var userName = _this.authnService.getAccount().userName;
74
- /** @type {?} */
75
- var staffName = userName.substring(0, userName.indexOf('@'));
76
- if (isDevMode) {
77
- console.log('##### loginLoginStaff(): get using login staff name ', staffName);
78
- }
79
- return _this.getStaff(staffName);
80
- }
81
- })));
82
- };
83
- /**
84
- * @private
85
- * @param {?} app
86
- * @param {?} afterHash
87
- * @return {?}
88
- */
89
- SmartAuthService.prototype.getTeamUrl = /**
90
- * @private
91
- * @param {?} app
92
- * @param {?} afterHash
93
- * @return {?}
94
- */
95
- function (app, afterHash) {
96
- return this.smartDomainFormatUrl.replace('${APP}', app) + afterHash;
97
- };
98
- /**
99
- * @private
100
- * @param {?} url
101
- * @param {?} app
102
- * @return {?}
103
- */
104
- SmartAuthService.prototype.isSameHost = /**
105
- * @private
106
- * @param {?} url
107
- * @param {?} app
108
- * @return {?}
109
- */
110
- function (url, app) {
111
- return this.smartDomainFormatUrl.replace('${APP}', app) === url;
112
- };
113
- /**
114
- * @param {?} loginStaff
115
- * @return {?}
116
- */
117
- SmartAuthService.prototype.redirectToTeam = /**
118
- * @param {?} loginStaff
119
- * @return {?}
120
- */
121
- function (loginStaff) {
122
- if (loginStaff.roles.findIndex((/**
123
- * @param {?} role
124
- * @return {?}
125
- */
126
- function (role) { return role.roleId === 'EUUSPC'; })) > -1) {
127
- if (!this.isSameHost(window.location.origin, 'investigation')) {
128
- window.location.href = this.getTeamUrl('investigation', '/assignment');
129
- }
130
- }
131
- else if (loginStaff.roles.findIndex((/**
132
- * @param {?} role
133
- * @return {?}
134
- */
135
- function (role) { return role.roleId.substring(0, 3) === 'RSC'; })) > -1) {
136
- if (!this.isSameHost(window.location.origin, 'rsc')) {
137
- window.location.href = this.getTeamUrl('rsc', '/offender-list');
138
- }
139
- }
140
- };
141
- /**
142
- * @param {?} selectedOffender
143
- * @return {?}
144
- */
145
- SmartAuthService.prototype.setSelectedOffender = /**
146
- * @param {?} selectedOffender
147
- * @return {?}
148
- */
149
- function (selectedOffender) {
150
- return tslib_1.__awaiter(this, void 0, void 0, function () {
151
- var relation;
152
- return tslib_1.__generator(this, function (_a) {
153
- switch (_a.label) {
154
- case 0:
155
- if (!selectedOffender) return [3 /*break*/, 2];
156
- // if (!selectedOffender.assignmentStaffRelationId) {
157
- return [4 /*yield*/, this.getStaffOffenderRelation(this.loginStaff.staffId, selectedOffender.offenderId).toPromise()];
158
- case 1:
159
- relation = _a.sent();
160
- if (relation) {
161
- selectedOffender.assignmentStaffRelationId = relation;
162
- }
163
- else {
164
- selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
165
- }
166
- _a.label = 2;
167
- case 2:
168
- this.xdmService.setSelectedOffender(selectedOffender);
169
- this.selectedOffender = selectedOffender;
170
- return [2 /*return*/];
171
- }
172
- });
173
- });
174
- };
175
- /**
176
- * @return {?}
177
- */
178
- SmartAuthService.prototype.logout = /**
179
- * @return {?}
180
- */
181
- function () {
182
- this.xdmService.clearAll();
183
- this.authnService.logout();
184
- };
185
- /**
186
- * @param {?} appModuleId
187
- * @param {?} route
188
- * @return {?}
189
- */
190
- SmartAuthService.prototype.setPermission = /**
191
- * @param {?} appModuleId
192
- * @param {?} route
193
- * @return {?}
194
- */
195
- function (appModuleId, route) {
196
- return tslib_1.__awaiter(this, void 0, void 0, function () {
197
- var _a, permissions, resource, _b, relation, assignmentStaffRelationId, elements, pattern;
198
- var _this = this;
199
- return tslib_1.__generator(this, function (_c) {
200
- switch (_c.label) {
201
- case 0:
202
- if (!!this.loginStaff) return [3 /*break*/, 2];
203
- _a = this;
204
- return [4 /*yield*/, this.xdmService.getLoginStaff()];
205
- case 1:
206
- _a.loginStaff = _c.sent();
207
- _c.label = 2;
208
- case 2:
209
- permissions = this.loginStaff.permissions;
210
- resource = route.url[0].path;
211
- if (!!this.selectedOffender) return [3 /*break*/, 4];
212
- _b = this;
213
- return [4 /*yield*/, this.xdmService.getSelectedOffender()];
214
- case 3:
215
- _b.selectedOffender = _c.sent();
216
- _c.label = 4;
217
- case 4:
218
- if (!this.selectedOffender) return [3 /*break*/, 6];
219
- // if (!this.selectedOffender.assignmentStaffRelationId) {
220
- return [4 /*yield*/, this.getStaffOffenderRelation(this.loginStaff.staffId, this.selectedOffender.offenderId).toPromise()];
221
- case 5:
222
- relation = _c.sent();
223
- if (relation) {
224
- this.selectedOffender.assignmentStaffRelationId = relation;
225
- }
226
- else {
227
- this.selectedOffender.assignmentStaffRelationId = 'NOASSIGN';
228
- }
229
- this.xdmService.setSelectedOffender(this.selectedOffender);
230
- _c.label = 6;
231
- case 6:
232
- assignmentStaffRelationId = this.selectedOffender
233
- .assignmentStaffRelationId;
234
- elements = document.querySelectorAll('[class^="sac-"]');
235
- pattern = /^sac-(\S+)-(\S+)$/i;
236
- Array.from(elements).forEach((/**
237
- * @param {?} element
238
- * @return {?}
239
- */
240
- function (element) {
241
- /** @type {?} */
242
- var hide;
243
- /** @type {?} */
244
- var disable;
245
- element.classList.forEach((/**
246
- * @param {?} c
247
- * @return {?}
248
- */
249
- function (c) {
250
- /** @type {?} */
251
- var results = c.match(pattern);
252
- // console.log(results);
253
- if (results && results.length > 2) {
254
- /** @type {?} */
255
- var roleId_1 = results[1] ? results[1].toUpperCase() : null;
256
- /** @type {?} */
257
- var right = results[2];
258
- // console.log(results[0]);
259
- // console.log(results[1]);
260
- // console.log(results[2]);
261
- /** @type {?} */
262
- var permission = permissions.find((/**
263
- * @param {?} p
264
- * @return {?}
265
- */
266
- function (p) {
267
- return (p.appModuleId === appModuleId &&
268
- p.resource === resource &&
269
- p.roleId === roleId_1 &&
270
- p.assignmentStaffRelationId === assignmentStaffRelationId);
271
- }));
272
- /*
273
- console.log('##### setPermission() resource: ', resource);
274
- console.log('##### setPermission() appModuleId: ', appModuleId);
275
- console.log('##### setPermission() roleId: ', roleId);
276
- console.log(
277
- '##### setPermission() assignment relation: ',
278
- assignmentStaffRelationId,
279
- );
280
- */
281
- console.log('##### Matched permission: ', permission);
282
- if (permission) {
283
- if (right === 'read') {
284
- if (!permission.readFlag) {
285
- if (hide !== false) {
286
- hide = true;
287
- }
288
- }
289
- else {
290
- hide = false;
291
- }
292
- }
293
- else if ((right === 'create' && !permission.createFlag) ||
294
- (right === 'update' && !permission.updateFlag) ||
295
- (right === 'delete' && !permission.deleteFlag) ||
296
- (right === 'assign' && !permission.assignFlag) ||
297
- (right === 'close' && !permission.closeFlag) ||
298
- (right === 'expunge' && !permission.expungeFlag) ||
299
- (right === 'reopen' && !permission.reopenFlag)) {
300
- if (element.nodeName === 'BUTTON') {
301
- if (hide !== false) {
302
- hide = true;
303
- }
304
- }
305
- else {
306
- if (disable !== false) {
307
- disable = true;
308
- }
309
- }
310
- }
311
- else {
312
- if (element.nodeName === 'BUTTON') {
313
- hide = false;
314
- }
315
- else {
316
- disable = false;
317
- }
318
- }
319
- }
320
- else {
321
- if (right === 'read') {
322
- if (hide !== false) {
323
- hide = true;
324
- }
325
- }
326
- else if (element.nodeName === 'BUTTON') {
327
- if (hide !== false) {
328
- hide = true;
329
- }
330
- }
331
- else if (disable !== false) {
332
- disable = true;
333
- }
334
- }
335
- }
336
- }));
337
- console.log('hide: ', hide);
338
- console.log('disable: ', disable);
339
- if (hide === true) {
340
- _this.hideHtmlElement(element);
341
- }
342
- else if (disable === true) {
343
- _this.disableHtmlElement(element);
344
- }
345
- }));
346
- return [2 /*return*/];
347
- }
348
- });
349
- });
350
- };
351
- /**
352
- * @param {?} accessControlConfig
353
- * @return {?}
354
- */
355
- SmartAuthService.prototype.checkPermission = /**
356
- * @param {?} accessControlConfig
357
- * @return {?}
358
- */
359
- function (accessControlConfig) {
360
- /** @type {?} */
361
- var selData = accessControlConfig.route.data;
362
- this.loginStaff = selData.loginStaff;
363
- this.selectedOffender = selData.selectedOffender;
364
- /** @type {?} */
365
- var permissions = this.loginStaff.permissions;
366
- /** @type {?} */
367
- var resource = accessControlConfig.route.url[0].path;
368
- /** @type {?} */
369
- var roleId = accessControlConfig.roleId
370
- ? accessControlConfig.roleId.toUpperCase()
371
- : null;
372
- /** @type {?} */
373
- var accessType = accessControlConfig.accessType;
374
- /** @type {?} */
375
- var assignmentStaffRelationId = !this.selectedOffender
376
- .assignmentStaffRelationId
377
- ? 'N/A'
378
- : this.selectedOffender.assignmentStaffRelationId;
379
- /** @type {?} */
380
- var permission = permissions.find((/**
381
- * @param {?} p
382
- * @return {?}
383
- */
384
- function (p) {
385
- return (p.appModuleId === accessControlConfig.appModuleId
386
- && p.resource === resource
387
- && (!roleId || p.roleId === roleId)
388
- && (p.assignmentStaffRelationId === 'N/A' ||
389
- p.assignmentStaffRelationId === assignmentStaffRelationId));
390
- }));
391
- if (permission) {
392
- if (accessType === 'read') {
393
- if (!permission.readFlag) {
394
- return false;
395
- }
396
- else {
397
- return true;
398
- }
399
- }
400
- else if ((accessType === 'create' && !permission.createFlag) ||
401
- (accessType === 'update' && !permission.updateFlag) ||
402
- (accessType === 'delete' && !permission.deleteFlag) ||
403
- (accessType === 'assign' && !permission.assignFlag) ||
404
- (accessType === 'close' && !permission.closeFlag) ||
405
- (accessType === 'expunge' && !permission.expungeFlag) ||
406
- (accessType === 'reopen' && !permission.reopenFlag)) {
407
- return false;
408
- }
409
- else {
410
- return true;
411
- }
412
- }
413
- else {
414
- if (accessType === 'read') {
415
- return false;
416
- }
417
- }
418
- return false;
419
- };
420
- /**
421
- * @param {?} loginStaff
422
- * @param {?} feature
423
- * @param {?=} appModuleId
424
- * @return {?}
425
- */
426
- SmartAuthService.prototype.canAppFeatureActivate = /**
427
- * @param {?} loginStaff
428
- * @param {?} feature
429
- * @param {?=} appModuleId
430
- * @return {?}
431
- */
432
- function (loginStaff, feature, appModuleId) {
433
- if (appModuleId === void 0) { appModuleId = null; }
434
- // if (!this.isAuthEnable(loginStaff.roles, appModuleId)) {
435
- // return true;
436
- // }
437
- return this.hasAppFeaturePermission(loginStaff.permissions, feature, appModuleId);
438
- };
439
- // public isAuthEnable(roles: Role[], appModuleId: string) {
440
- // if (roles && roles.length > 0) {
441
- // return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
442
- // }
443
- // return false;
444
- // }
445
- // public isAuthEnable(roles: Role[], appModuleId: string) {
446
- // if (roles && roles.length > 0) {
447
- // return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
448
- // }
449
- // return false;
450
- // }
451
- /**
452
- * @param {?} roles
453
- * @return {?}
454
- */
455
- SmartAuthService.prototype.hasIntakeRole =
456
- // public isAuthEnable(roles: Role[], appModuleId: string) {
457
- // if (roles && roles.length > 0) {
458
- // return roles.map(r => r.roleId).findIndex(this.isExternalRole) > -1 || appModuleId === 'RR';
459
- // }
460
- // return false;
461
- // }
462
- /**
463
- * @param {?} roles
464
- * @return {?}
465
- */
466
- function (roles) {
467
- if (roles && roles.length > 0) {
468
- return roles.findIndex(this.isIntakeRole) > -1;
469
- }
470
- return false;
471
- };
472
- /**
473
- * @private
474
- * @param {?} permissions
475
- * @param {?} feature
476
- * @param {?} appModuleId
477
- * @return {?}
478
- */
479
- SmartAuthService.prototype.hasAppFeaturePermission = /**
480
- * @private
481
- * @param {?} permissions
482
- * @param {?} feature
483
- * @param {?} appModuleId
484
- * @return {?}
485
- */
486
- function (permissions, feature, appModuleId) {
487
- if (permissions && permissions.length > 0) {
488
- if (appModuleId) {
489
- return (permissions.findIndex((/**
490
- * @param {?} p
491
- * @return {?}
492
- */
493
- function (p) { return p.resource === feature && p.appModuleId === appModuleId; })) > -1);
494
- }
495
- else {
496
- return permissions.findIndex((/**
497
- * @param {?} p
498
- * @return {?}
499
- */
500
- function (p) { return p.resource === feature; })) > -1;
501
- }
502
- }
503
- return false;
504
- };
505
- /**
506
- * @private
507
- * @param {?} roleId
508
- * @return {?}
509
- */
510
- SmartAuthService.prototype.isExternalRole = /**
511
- * @private
512
- * @param {?} roleId
513
- * @return {?}
514
- */
515
- function (roleId) {
516
- switch (roleId) {
517
- case 'EUDTL':
518
- case 'EUDUSM':
519
- case 'EUJDG':
520
- case 'EUMPD':
521
- case 'EUSOTV':
522
- case 'EUUSA2':
523
- case 'EUUSAO':
524
- case 'EUUSPC':
525
- return true;
526
- default:
527
- return false;
528
- }
529
- };
530
- /**
531
- * @private
532
- * @param {?} role
533
- * @return {?}
534
- */
535
- SmartAuthService.prototype.isIntakeRole = /**
536
- * @private
537
- * @param {?} role
538
- * @return {?}
539
- */
540
- function (role) {
541
- switch (role.roleId) {
542
- case 'OPA':
543
- case 'OPS':
544
- case 'SOPS':
545
- return true;
546
- default:
547
- return false;
548
- }
549
- };
550
- /**
551
- * @private
552
- * @param {?} element
553
- * @return {?}
554
- */
555
- SmartAuthService.prototype.disableHtmlElement = /**
556
- * @private
557
- * @param {?} element
558
- * @return {?}
559
- */
560
- function (element) {
561
- // console.log(element);
562
- switch (element.nodeName) {
563
- case 'A':
564
- element.setAttribute('style', 'pointer-events: none;cursor: not-allowed;');
565
- element.setAttribute('tabIndex', '-1');
566
- break;
567
- default:
568
- element.setAttribute('disabled', 'disabled');
569
- break;
570
- }
571
- };
572
- /**
573
- * @private
574
- * @param {?} element
575
- * @return {?}
576
- */
577
- SmartAuthService.prototype.hideHtmlElement = /**
578
- * @private
579
- * @param {?} element
580
- * @return {?}
581
- */
582
- function (element) {
583
- // element.setAttribute('hidden', 'hidden');
584
- element.setAttribute('style', 'display: none;');
585
- };
586
- /**
587
- * @private
588
- * @param {?} userName
589
- * @return {?}
590
- */
591
- SmartAuthService.prototype.getStaff = /**
592
- * @private
593
- * @param {?} userName
594
- * @return {?}
595
- */
596
- function (userName) {
597
- var _this = this;
598
- /** @type {?} */
599
- var queryString = "\n {\n findvStaffs(input: {where: {userName: \"" + userName + "\", activeFlag: true}}) {\n totalCount\n message\n data {\n staffId\n userName\n lastName\n firstName\n phone\n email\n roles {\n roleId\n role\n }\n permissions {\n roleId\n appModuleId\n resource\n assignmentStaffRelationId\n readFlag\n createFlag\n updateFlag\n deleteFlag\n assignFlag\n reopenFlag\n closeFlag\n expungeFlag\n }\n options {\n offenderListOptionId\n name\n serviceApiFieldName\n selectedFlag\n }\n }\n }\n }";
600
- return this.http
601
- .post(this.smartDataServiceUrl, { query: queryString })
602
- .pipe(take(1), map((/**
603
- * @param {?} result
604
- * @return {?}
605
- */
606
- function (result) {
607
- if (isDevMode) {
608
- console.log('##### getStaff() from service ', result);
609
- }
610
- if (result.data.findvStaffs.data.length > 0) {
611
- /** @type {?} */
612
- var data = result.data.findvStaffs.data[0];
613
- _this.xdmService.setLoginStaff(data);
614
- _this.loginStaff = data;
615
- return data;
616
- }
617
- else {
618
- return null;
619
- // return throwError('No access right.');
620
- }
621
- })), catchError((/**
622
- * @param {?} error
623
- * @return {?}
624
- */
625
- function (error) {
626
- console.log('error ' + error);
627
- return null;
628
- })));
629
- };
630
- /**
631
- * @private
632
- * @param {?} staffId
633
- * @param {?} offenderId
634
- * @return {?}
635
- */
636
- SmartAuthService.prototype.getStaffOffenderRelation = /**
637
- * @private
638
- * @param {?} staffId
639
- * @param {?} offenderId
640
- * @return {?}
641
- */
642
- function (staffId, offenderId) {
643
- /** @type {?} */
644
- var queryString = "\n {\n findvStaffOffenderRelations(input: {where: {staffId: " + staffId + ", offenderId: " + offenderId + "}}) {\n data {\n assignmentStaffRelationId\n }\n }\n }";
645
- return this.http
646
- .post(this.smartDataServiceUrl, { query: queryString })
647
- .pipe(take(1), map((/**
648
- * @param {?} result
649
- * @return {?}
650
- */
651
- function (result) {
652
- if (isDevMode) {
653
- console.log('##### getStaffOffenderRelation() from service ', result);
654
- }
655
- if (result.data.findvStaffOffenderRelations.data.length > 0) {
656
- /** @type {?} */
657
- var data = result.data.findvStaffOffenderRelations.data[0];
658
- return data.assignmentStaffRelationId;
659
- }
660
- else {
661
- return null;
662
- // return throwError('No access right.');
663
- }
664
- })), catchError((/**
665
- * @param {?} error
666
- * @return {?}
667
- */
668
- function (error) {
669
- console.log('error ' + error);
670
- return null;
671
- })));
672
- };
673
- /**
674
- * @private
675
- * @param {?} appModuleId
676
- * @param {?} resource
677
- * @return {?}
678
- */
679
- SmartAuthService.prototype.getRolePermissions = /**
680
- * @private
681
- * @param {?} appModuleId
682
- * @param {?} resource
683
- * @return {?}
684
- */
685
- function (appModuleId, resource) {
686
- /** @type {?} */
687
- var queryString = "\n query findvRolePermissionPivots{\n findvRolePermissionPivots(input: {where: {appModuleId: " + appModuleId + ", resource: " + resource + "}}){\n totalCount\n message\n }\n }";
688
- return this.http
689
- .post(this.smartDataServiceUrl, { query: queryString })
690
- .pipe(take(1), map((/**
691
- * @param {?} result
692
- * @return {?}
693
- */
694
- function (result) {
695
- if (isDevMode) {
696
- console.log('##### findvRolePermissionPivots() from service ', result);
697
- }
698
- if (result.data.findvRolePermissionPivots.totalCount > 0) {
699
- return true;
700
- }
701
- else {
702
- return false;
703
- // return throwError('No access right.');
704
- }
705
- })), catchError((/**
706
- * @param {?} error
707
- * @return {?}
708
- */
709
- function (error) {
710
- console.log('error ' + error);
711
- return throwError(error);
712
- })));
713
- };
714
- SmartAuthService.decorators = [
715
- { type: Injectable, args: [{
716
- providedIn: 'root',
717
- },] }
718
- ];
719
- /** @nocollapse */
720
- SmartAuthService.ctorParameters = function () { return [
721
- { type: HttpClient },
722
- { type: MsalService },
723
- { type: XdmService },
724
- { type: undefined, decorators: [{ type: Inject, args: [SMART_DATA_SERVICE_URL,] }] },
725
- { type: String, decorators: [{ type: Inject, args: [SMART_DOMAIN_FORMAT,] }] }
726
- ]; };
727
- /** @nocollapse */ SmartAuthService.ngInjectableDef = i0.defineInjectable({ factory: function SmartAuthService_Factory() { return new SmartAuthService(i0.inject(i1.HttpClient), i0.inject(i2.MsalService), i0.inject(i3.XdmService), i0.inject(i4.SMART_DATA_SERVICE_URL), i0.inject(i4.SMART_DOMAIN_FORMAT)); }, token: SmartAuthService, providedIn: "root" });
728
- return SmartAuthService;
729
- }());
730
- export { SmartAuthService };
731
- if (false) {
732
- /** @type {?} */
733
- SmartAuthService.prototype.loginStaff;
734
- /** @type {?} */
735
- SmartAuthService.prototype.selectedOffender;
736
- /**
737
- * @type {?}
738
- * @private
739
- */
740
- SmartAuthService.prototype.http;
741
- /**
742
- * @type {?}
743
- * @private
744
- */
745
- SmartAuthService.prototype.authnService;
746
- /**
747
- * @type {?}
748
- * @private
749
- */
750
- SmartAuthService.prototype.xdmService;
751
- /**
752
- * @type {?}
753
- * @private
754
- */
755
- SmartAuthService.prototype.smartDataServiceUrl;
756
- /**
757
- * @type {?}
758
- * @private
759
- */
760
- SmartAuthService.prototype.smartDomainFormatUrl;
761
- }
762
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNzbWFydC9uZ2Mtc21hcnQtY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zbWFydC1hdXRoL3NtYXJ0LWF1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7O0FBSzFEO0lBT0UsMEJBQ1UsSUFBZ0IsRUFDaEIsWUFBeUIsRUFDekIsVUFBc0IsRUFDVSxtQkFBbUIsRUFDdEIsb0JBQTRCO1FBSnpELFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBQTtRQUN0Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVE7SUFDaEUsQ0FBQzs7OztJQUVHLHdDQUFhOzs7SUFBcEI7UUFBQSxpQkF1REM7UUF0REMsSUFBSSxTQUFTLEVBQUU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsU0FB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Ozs7O0lBQ2pDLHNDQUE4Qjs7Ozs7SUFDOUIsK0NBQTJEOzs7OztJQUMzRCxnREFBaUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZSwgY2F0Y2hFcnJvcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gJ0BhenVyZS9tc2FsLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTG9naW5TdGFmZixcclxuICBTZWxlY3RlZE9mZmVuZGVyLFxyXG4gIFNNQVJUX0RBVEFfU0VSVklDRV9VUkwsXHJcbiAgU01BUlRfRE9NQUlOX0ZPUk1BVCxcclxuICBSb2xlLFxyXG4gIFBlcm1pc3Npb24sXHJcbn0gZnJvbSAnLi4vc21hcnQtc3RvcmFnZS9zbWFydC1zdG9yYWdlLW1vZGVsJztcclxuaW1wb3J0IHsgWGRtU2VydmljZSB9IGZyb20gJy4uL3NtYXJ0LXN0b3JhZ2UveGRtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTbWFydEFjY2Vzc0NvbnRyb2xDb25maWcgfSBmcm9tICcuL3NtYXJ0LWFjY2Vzcy1jb250cm9sLWNvbmZpZyc7XHJcbmltcG9ydCB7IG51bGxTYWZlSXNFcXVpdmFsZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXIvc3JjL291dHB1dC9vdXRwdXRfYXN0JztcclxuLy8gaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSAncXVlcnlzdHJpbmcnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0QXV0aFNlcnZpY2Uge1xyXG4gIGxvZ2luU3RhZmY6IExvZ2luU3RhZmY7XHJcbiAgc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGF1dGhuU2VydmljZTogTXNhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHhkbVNlcnZpY2U6IFhkbVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFNNQVJUX0RBVEFfU0VSVklDRV9VUkwpIHByaXZhdGUgc21hcnREYXRhU2VydmljZVVybCxcclxuICAgIEBJbmplY3QoU01BUlRfRE9NQUlOX0ZPUk1BVCkgcHJpdmF0ZSBzbWFydERvbWFpbkZvcm1hdFVybDogc3RyaW5nLFxyXG4gICkge31cclxuXHJcbiAgcHVibGljIGdldExvZ2luU3RhZmYoKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTbWFydEF1dGhTZXJ2aWNlIC0gZ2V0TG9naW5TdGFmZigpJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzRGV2TW9kZSAmJiB0aGlzLmxvZ2luU3RhZmYpIHtcclxuICAgICAgaWYgKHRoaXMubG9naW5TdGFmZi5zdGFmZklkKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBpbnRlcm5hbCBpbnN0YW5jZSBpbiBzZXJ2aWNlJyxcclxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMubG9naW5TdGFmZik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCB1c2luZyBwcmVzZXQgdXNlciBuYW1lJyxcclxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZyb20odGhpcy54ZG1TZXJ2aWNlLmdldExvZ2luU3RhZmYoKSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChzdG9yZWRSZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoc3RvcmVkUmVzdWx0ICYmIHN0b3JlZFJlc3VsdC5zdGFmZklkKSB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBmcm9tIHNlc3Npb24uJyxcclxuICAgICAgICAgICAgICBzdG9yZWRSZXN1bHQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBzdG9yZWRSZXN1bHQ7XHJcbiAgICAgICAgICByZXR1cm4gb2Yoc3RvcmVkUmVzdWx0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZFJlc3VsdCAmJiBzdG9yZWRSZXN1bHQudXNlck5hbWUpIHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIHByZXNldCB1c2VyIG5hbWUnLFxyXG4gICAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZixcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0YWZmKHN0b3JlZFJlc3VsdC51c2VyTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJOYW1lID0gdGhpcy5hdXRoblNlcnZpY2UuZ2V0QWNjb3VudCgpLnVzZXJOYW1lO1xyXG4gICAgICAgICAgY29uc3Qgc3RhZmZOYW1lID0gdXNlck5hbWUuc3Vic3RyaW5nKDAsIHVzZXJOYW1lLmluZGV4T2YoJ0AnKSk7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBsb2dpbkxvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIGxvZ2luIHN0YWZmIG5hbWUgJyxcclxuICAgICAgICAgICAgICBzdGFmZk5hbWUsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFmZihzdGFmZk5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUZWFtVXJsKGFwcDogc3RyaW5nLCBhZnRlckhhc2g6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydERvbWFpbkZvcm1hdFVybC5yZXBsYWNlKCcke0FQUH0nLCBhcHApICsgYWZ0ZXJIYXNoO1xyXG4gIH1cclxuICBwcml2YXRlIGlzU2FtZUhvc3QodXJsLCBhcHApIHtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0RG9tYWluRm9ybWF0VXJsLnJlcGxhY2UoJyR7QVBQfScsIGFwcCkgPT09IHVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRpcmVjdFRvVGVhbShsb2dpblN0YWZmOiBMb2dpblN0YWZmKSB7XHJcbiAgICBpZiAobG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoKHJvbGUpID0+IHJvbGUucm9sZUlkID09PSAnRVVVU1BDJykgPiAtMSkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNTYW1lSG9zdCh3aW5kb3cubG9jYXRpb24ub3JpZ2luLCAnaW52ZXN0aWdhdGlvbicpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldFRlYW1VcmwoJ2ludmVzdGlnYXRpb24nLCAnL2Fzc2lnbm1lbnQnKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoXHJcbiAgICAgICAgKHJvbGUpID0+IHJvbGUucm9sZUlkLnN1YnN0cmluZygwLCAzKSA9PT0gJ1JTQycsXHJcbiAgICAgICkgPiAtMVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1NhbWVIb3N0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sICdyc2MnKSkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5nZXRUZWFtVXJsKCdyc2MnLCAnL29mZmVuZGVyLWxpc3QnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcikge1xyXG4gICAgaWYgKHNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgLy8gaWYgKCFzZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCB0aGlzLmdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgICAgICB0aGlzLmxvZ2luU3RhZmYuc3RhZmZJZCxcclxuICAgICAgICBzZWxlY3RlZE9mZmVuZGVyLm9mZmVuZGVySWQsXHJcbiAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZWxhdGlvbikge1xyXG4gICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9IHJlbGF0aW9uO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9ICdOT0FTU0lHTic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gICAgdGhpcy54ZG1TZXJ2aWNlLnNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcik7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBzZWxlY3RlZE9mZmVuZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvZ291dCgpOiB2b2lkIHtcclxuICAgIHRoaXMueGRtU2VydmljZS5jbGVhckFsbCgpO1xyXG4gICAgdGhpcy5hdXRoblNlcnZpY2UubG9nb3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0UGVybWlzc2lvbihcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICApIHtcclxuICAgIGlmICghdGhpcy5sb2dpblN0YWZmKSB7XHJcbiAgICAgIHRoaXMubG9naW5TdGFmZiA9IGF3YWl0IHRoaXMueGRtU2VydmljZS5nZXRMb2dpblN0YWZmKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMubG9naW5TdGFmZi5wZXJtaXNzaW9ucztcclxuICAgIGNvbnN0IHJlc291cmNlID0gcm91dGUudXJsWzBdLnBhdGg7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyID0gYXdhaXQgdGhpcy54ZG1TZXJ2aWNlLmdldFNlbGVjdGVkT2ZmZW5kZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICAgIC8vIGlmICghdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCB0aGlzLmdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgICAgICB0aGlzLmxvZ2luU3RhZmYuc3RhZmZJZCxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIub2ZmZW5kZXJJZCxcclxuICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJlbGF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSByZWxhdGlvbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9ICdOT0FTU0lHTic7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy54ZG1TZXJ2aWNlLnNldFNlbGVjdGVkT2ZmZW5kZXIodGhpcy5zZWxlY3RlZE9mZmVuZGVyKTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSB0aGlzLnNlbGVjdGVkT2ZmZW5kZXJcclxuICAgICAgLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3NePVwic2FjLVwiXScpO1xyXG4gICAgY29uc3QgcGF0dGVybiA9IC9ec2FjLShcXFMrKS0oXFxTKykkL2k7XHJcblxyXG4gICAgQXJyYXkuZnJvbShlbGVtZW50cykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBsZXQgaGlkZTtcclxuICAgICAgbGV0IGRpc2FibGU7XHJcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICBjb25zdCByZXN1bHRzID0gYy5tYXRjaChwYXR0ZXJuKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzKTtcclxuICAgICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgIGNvbnN0IHJvbGVJZCA9IHJlc3VsdHNbMV0gPyByZXN1bHRzWzFdLnRvVXBwZXJDYXNlKCkgOiBudWxsO1xyXG4gICAgICAgICAgY29uc3QgcmlnaHQgPSByZXN1bHRzWzJdO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0c1swXSk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzWzFdKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMl0pO1xyXG4gICAgICAgICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoZnVuY3Rpb24gKHApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCAmJlxyXG4gICAgICAgICAgICAgIHAucmVzb3VyY2UgPT09IHJlc291cmNlICYmXHJcbiAgICAgICAgICAgICAgcC5yb2xlSWQgPT09IHJvbGVJZCAmJlxyXG4gICAgICAgICAgICAgIHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSByZXNvdXJjZTogJywgcmVzb3VyY2UpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSBhcHBNb2R1bGVJZDogJywgYXBwTW9kdWxlSWQpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIHNldFBlcm1pc3Npb24oKSByb2xlSWQ6ICcsIHJvbGVJZCk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJyMjIyMjIHNldFBlcm1pc3Npb24oKSBhc3NpZ25tZW50IHJlbGF0aW9uOiAnLFxyXG4gICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgICovXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgTWF0Y2hlZCBwZXJtaXNzaW9uOiAnLCBwZXJtaXNzaW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICBpZiAocmlnaHQgPT09ICdyZWFkJykge1xyXG4gICAgICAgICAgICAgIGlmICghcGVybWlzc2lvbi5yZWFkRmxhZykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICd1cGRhdGUnICYmICFwZXJtaXNzaW9uLnVwZGF0ZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnZGVsZXRlJyAmJiAhcGVybWlzc2lvbi5kZWxldGVGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdjbG9zZScgJiYgIXBlcm1pc3Npb24uY2xvc2VGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2V4cHVuZ2UnICYmICFwZXJtaXNzaW9uLmV4cHVuZ2VGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGRpc2FibGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodCA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXNhYmxlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIGRpc2FibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2coJ2hpZGU6ICcsIGhpZGUpO1xyXG4gICAgICBjb25zb2xlLmxvZygnZGlzYWJsZTogJywgZGlzYWJsZSk7XHJcbiAgICAgIGlmIChoaWRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlSHRtbEVsZW1lbnQoZWxlbWVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUh0bWxFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja1Blcm1pc3Npb24oYWNjZXNzQ29udHJvbENvbmZpZzogU21hcnRBY2Nlc3NDb250cm9sQ29uZmlnKSB7XHJcbiAgICBjb25zdCBzZWxEYXRhID0gYWNjZXNzQ29udHJvbENvbmZpZy5yb3V0ZS5kYXRhO1xyXG4gICAgdGhpcy5sb2dpblN0YWZmID0gc2VsRGF0YS5sb2dpblN0YWZmO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyID0gc2VsRGF0YS5zZWxlY3RlZE9mZmVuZGVyO1xyXG5cclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5sb2dpblN0YWZmLnBlcm1pc3Npb25zO1xyXG4gICAgY29uc3QgcmVzb3VyY2UgPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvdXRlLnVybFswXS5wYXRoO1xyXG4gICAgY29uc3Qgcm9sZUlkID0gYWNjZXNzQ29udHJvbENvbmZpZy5yb2xlSWRcclxuICAgICAgPyBhY2Nlc3NDb250cm9sQ29uZmlnLnJvbGVJZC50b1VwcGVyQ2FzZSgpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IGFjY2Vzc1R5cGUgPSBhY2Nlc3NDb250cm9sQ29uZmlnLmFjY2Vzc1R5cGU7XHJcbiAgICBjb25zdCBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gIXRoaXMuc2VsZWN0ZWRPZmZlbmRlclxyXG4gICAgICAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICA/ICdOL0EnXHJcbiAgICAgIDogdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoKHApID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIHAuYXBwTW9kdWxlSWQgPT09IGFjY2Vzc0NvbnRyb2xDb25maWcuYXBwTW9kdWxlSWRcclxuICAgICAgICAgICYmIHAucmVzb3VyY2UgPT09IHJlc291cmNlXHJcbiAgICAgICAgICAmJiAoIXJvbGVJZCB8fCBwLnJvbGVJZCA9PT0gcm9sZUlkKVxyXG4gICAgICAgICAgJiYgKHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gJ04vQScgfHxcclxuICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uLnJlYWRGbGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XHJcbiAgICAgICAgKGFjY2Vzc1R5cGUgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuQXBwRmVhdHVyZUFjdGl2YXRlKFxyXG4gICAgbG9naW5TdGFmZjogTG9naW5TdGFmZixcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkID0gbnVsbCxcclxuICApIHtcclxuICAgIC8vIGlmICghdGhpcy5pc0F1dGhFbmFibGUobG9naW5TdGFmZi5yb2xlcywgYXBwTW9kdWxlSWQpKSB7XHJcbiAgICAvLyAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaGFzQXBwRmVhdHVyZVBlcm1pc3Npb24oXHJcbiAgICAgIGxvZ2luU3RhZmYucGVybWlzc2lvbnMsXHJcbiAgICAgIGZlYXR1cmUsXHJcbiAgICAgIGFwcE1vZHVsZUlkLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBpc0F1dGhFbmFibGUocm9sZXM6IFJvbGVbXSwgYXBwTW9kdWxlSWQ6IHN0cmluZykge1xyXG4gIC8vICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgcmV0dXJuIHJvbGVzLm1hcChyID0+IHIucm9sZUlkKS5maW5kSW5kZXgodGhpcy5pc0V4dGVybmFsUm9sZSkgPiAtMSB8fCBhcHBNb2R1bGVJZCA9PT0gJ1JSJztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBoYXNJbnRha2VSb2xlKHJvbGVzOiBSb2xlW10pIHtcclxuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiByb2xlcy5maW5kSW5kZXgodGhpcy5pc0ludGFrZVJvbGUpID4gLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0FwcEZlYXR1cmVQZXJtaXNzaW9uKFxyXG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSxcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgKSB7XHJcbiAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoYXBwTW9kdWxlSWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSAmJiBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCxcclxuICAgICAgICAgICkgPiAtMVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSkgPiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNFeHRlcm5hbFJvbGUocm9sZUlkKSB7XHJcbiAgICBzd2l0Y2ggKHJvbGVJZCkge1xyXG4gICAgICBjYXNlICdFVURUTCc6XHJcbiAgICAgIGNhc2UgJ0VVRFVTTSc6XHJcbiAgICAgIGNhc2UgJ0VVSkRHJzpcclxuICAgICAgY2FzZSAnRVVNUEQnOlxyXG4gICAgICBjYXNlICdFVVNPVFYnOlxyXG4gICAgICBjYXNlICdFVVVTQTInOlxyXG4gICAgICBjYXNlICdFVVVTQU8nOlxyXG4gICAgICBjYXNlICdFVVVTUEMnOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNJbnRha2VSb2xlKHJvbGU6IFJvbGUpIHtcclxuICAgIHN3aXRjaCAocm9sZS5yb2xlSWQpIHtcclxuICAgICAgY2FzZSAnT1BBJzpcclxuICAgICAgY2FzZSAnT1BTJzpcclxuICAgICAgY2FzZSAnU09QUyc6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coZWxlbWVudCk7XHJcbiAgICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcclxuICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzOiBub25lO2N1cnNvcjogbm90LWFsbG93ZWQ7JyxcclxuICAgICAgICApO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZih1c2VyTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpbmR2U3RhZmZzKGlucHV0OiB7d2hlcmU6IHt1c2VyTmFtZTogXCIke3VzZXJOYW1lfVwiLCBhY3RpdmVGbGFnOiB0cnVlfX0pIHtcclxuICAgICAgICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcclxuICAgICAgICAgICAgICAgIGRhdGEge1xyXG4gICAgICAgICAgICAgICAgICBzdGFmZklkXHJcbiAgICAgICAgICAgICAgICAgIHVzZXJOYW1lXHJcbiAgICAgICAgICAgICAgICAgIGxhc3ROYW1lXHJcbiAgICAgICAgICAgICAgICAgIGZpcnN0TmFtZVxyXG4gICAgICAgICAgICAgICAgICBwaG9uZVxyXG4gICAgICAgICAgICAgICAgICBlbWFpbFxyXG4gICAgICAgICAgICAgICAgICByb2xlcyB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZUlkXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgICAgICAgICAgICAgICByb2xlSWRcclxuICAgICAgICAgICAgICAgICAgICBhcHBNb2R1bGVJZFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICAgICAgICAgIHJlYWRGbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRmxhZ1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZsYWdcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGVGbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzaWduRmxhZ1xyXG4gICAgICAgICAgICAgICAgICAgIHJlb3BlbkZsYWdcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZUZsYWdcclxuICAgICAgICAgICAgICAgICAgICBleHB1bmdlRmxhZ1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMge1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZmVuZGVyTGlzdE9wdGlvbklkXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VBcGlGaWVsZE5hbWVcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEZsYWdcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KHRoaXMuc21hcnREYXRhU2VydmljZVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgZ2V0U3RhZmYoKSBmcm9tIHNlcnZpY2UgJywgcmVzdWx0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5maW5kdlN0YWZmcy5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZzLmRhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMueGRtU2VydmljZS5zZXRMb2dpblN0YWZmKGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBkYXRhO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oXHJcbiAgICBzdGFmZklkOiBudW1iZXIsXHJcbiAgICBvZmZlbmRlcklkOiBudW1iZXIsXHJcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmluZHZTdGFmZk9mZmVuZGVyUmVsYXRpb25zKGlucHV0OiB7d2hlcmU6IHtzdGFmZklkOiAke3N0YWZmSWR9LCBvZmZlbmRlcklkOiAke29mZmVuZGVySWR9fX0pIHtcclxuICAgICAgICAgICAgICAgIGRhdGEge1xyXG4gICAgICAgICAgICAgICAgICBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9YDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5wb3N0PGFueT4odGhpcy5zbWFydERhdGFTZXJ2aWNlVXJsLCB7IHF1ZXJ5OiBxdWVyeVN0cmluZyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBnZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oKSBmcm9tIHNlcnZpY2UgJyxcclxuICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzdWx0LmRhdGEuZmluZHZTdGFmZk9mZmVuZGVyUmVsYXRpb25zLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzdWx0LmRhdGEuZmluZHZTdGFmZk9mZmVuZGVyUmVsYXRpb25zLmRhdGFbMF07XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRocm93RXJyb3IoJ05vIGFjY2VzcyByaWdodC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yICcgKyBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Um9sZVBlcm1pc3Npb25zKFxyXG4gICAgYXBwTW9kdWxlSWQ6IHN0cmluZyxcclxuICAgIHJlc291cmNlOiBzdHJpbmcsXHJcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBcclxuICAgICAgICAgICBxdWVyeSBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3Rze1xyXG4gICAgICAgICAgICBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3RzKGlucHV0OiB7d2hlcmU6IHthcHBNb2R1bGVJZDogJHthcHBNb2R1bGVJZH0sIHJlc291cmNlOiAke3Jlc291cmNlfX19KXtcclxuICAgICAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgICAgICAgbWVzc2FnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9YDtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgIC5wb3N0PGFueT4odGhpcy5zbWFydERhdGFTZXJ2aWNlVXJsLCB7IHF1ZXJ5OiBxdWVyeVN0cmluZyB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBmaW5kdlJvbGVQZXJtaXNzaW9uUGl2b3RzKCkgZnJvbSBzZXJ2aWNlICcsXHJcbiAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHMudG90YWxDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0aHJvd0Vycm9yKCdObyBhY2Nlc3MgcmlnaHQuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yICcgKyBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==