@propmix/profet-common-header 3.2.0-beta.2 → 3.2.0-beta.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.
@@ -33,6 +33,8 @@ export class HeaderComponent {
33
33
  this._snackbar = inject(MatSnackBar);
34
34
  this._headerSer = inject(CommonHeaderService);
35
35
  this._domSanitizer = inject(DomSanitizer);
36
+ this.componentInitTime = 0;
37
+ this.lastProcessedLogoutTimestamp = 0;
36
38
  this.INACTIVITY_LIMIT = 30 * 60 * 1000; // 30 minutes
37
39
  this.logoutEvent = new EventEmitter();
38
40
  this.companyControl = new FormControl();
@@ -71,9 +73,15 @@ export class HeaderComponent {
71
73
  // },
72
74
  // });
73
75
  // }
74
- this.resetTimer();
75
- // Clear any stale logout signal on init
76
- this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, '', -1);
76
+ // Capture when this component/app was loaded
77
+ this.componentInitTime = Date.now();
78
+ // Remove legacy boolean check or reset if needed, but primarily we rely on timestamps now.
79
+ // We do NOT want to clear the cookie immediately on init if it's a valid persistent signal,
80
+ // but the timestamp check guards against "looping" on reload.
81
+ // However, if we want to support "fresh login means fresh session", we might just ignore old timestamps (which we do via > initTime check).
82
+ // So distinct cleanup isn't strictly necessary if the login page no longer deletes it.
83
+ // But let's leave it as is or remove it. The user's issue was "delete cookie" logic on LOGIN PAGE caused race condition.
84
+ // Here we just want to start monitoring.
77
85
  this.startLogoutCheck();
78
86
  }
79
87
  resetTimer(isUserActivity = true) {
@@ -108,16 +116,26 @@ export class HeaderComponent {
108
116
  startLogoutCheck() {
109
117
  // Poll for the logout signal cookie (works across ports/subdomains)
110
118
  this.logoutCheckInterval = setInterval(() => {
111
- if (this._headerSer.getCookie(this._headerSer.SESSION_EXPIRED_KEY)) {
112
- // Check if tab still "active" according to the shared time
113
- // If tab is active but receiving a logout signal, it implies a MANUAL logout from another tab.
114
- // If tab is inactive and receiving a logout signal, it implies a TIMEOUT.
115
- const lastActive = this._headerSer.getCookie(this._headerSer.LAST_ACTIVE_SESSION_KEY);
116
- const now = Date.now();
117
- const lastActiveTime = lastActive ? parseInt(lastActive, 10) : 0;
118
- const elapsed = now - lastActiveTime;
119
- const isManual = elapsed < this.INACTIVITY_LIMIT;
120
- this.handleLogout(false, false, isManual);
119
+ const logoutCookie = this._headerSer.getCookie(this._headerSer.SESSION_EXPIRED_KEY);
120
+ if (logoutCookie) {
121
+ const logoutTimestamp = parseInt(logoutCookie, 10);
122
+ // 1. Check if it's a valid number (legacy 'true' string support is irrelevant if we fully switch, but safe to check NaN)
123
+ if (!isNaN(logoutTimestamp)) {
124
+ // 2. Check if this logout event happened AFTER this app was initialized
125
+ // This prevents infinite loops if the user just logged in and the cookie is still there.
126
+ if (logoutTimestamp > this.componentInitTime) {
127
+ // 3. Check if we haven't already processed this exact logout event
128
+ if (logoutTimestamp > this.lastProcessedLogoutTimestamp) {
129
+ this.lastProcessedLogoutTimestamp = logoutTimestamp;
130
+ const lastActive = this._headerSer.getCookie(this._headerSer.LAST_ACTIVE_SESSION_KEY);
131
+ const now = Date.now();
132
+ const lastActiveTime = lastActive ? parseInt(lastActive, 10) : 0;
133
+ const elapsed = now - lastActiveTime;
134
+ const isManual = elapsed < this.INACTIVITY_LIMIT;
135
+ this.handleLogout(false, false, isManual);
136
+ }
137
+ }
138
+ }
121
139
  }
122
140
  }, 2000); // Check every 2 seconds
123
141
  }
@@ -127,14 +145,17 @@ export class HeaderComponent {
127
145
  // return;
128
146
  // }
129
147
  if (broadcast) {
130
- // Set a cookie to signal other tabs/ports
131
- this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, 'true', 1);
148
+ // Set a cookie to signal other tabs/ports with the current TIMESTAMP
149
+ // This timestamp allows other tabs to know if this is a "new" logout event relative to their session start.
150
+ const now = Date.now();
151
+ this.lastProcessedLogoutTimestamp = now; // Don't logout myself again based on this
152
+ this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, now.toString(), 1);
132
153
  }
133
154
  this.logoutEvent.emit();
134
155
  let sessionUrl = this._headerSer.headerConfig.signOutUrl;
135
156
  if (this._headerSer.headerConfig.enableLastUrlRedirection) {
136
157
  const separator = sessionUrl.includes('?') ? '&' : '?';
137
- sessionUrl = sessionUrl + separator + 'returnUrl=' + encodeURIComponent(window.location.href);
158
+ sessionUrl = sessionUrl + separator + 'redirectUrl=' + encodeURIComponent(window.location.href);
138
159
  }
139
160
  // Only add sessionExpired params if it is NOT a manual logout
140
161
  if (!isManual) {
@@ -249,7 +270,9 @@ export class HeaderComponent {
249
270
  onLogoutClick() {
250
271
  this.menuTrigger.closeMenu();
251
272
  // Sync with other tabs
252
- this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, 'true', 1);
273
+ const now = Date.now();
274
+ this.lastProcessedLogoutTimestamp = now;
275
+ this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, now.toString(), 1);
253
276
  // Clear timers
254
277
  if (this.inactivityTimeout)
255
278
  clearTimeout(this.inactivityTimeout);
@@ -257,10 +280,10 @@ export class HeaderComponent {
257
280
  clearInterval(this.logoutCheckInterval);
258
281
  this.logoutEvent.emit();
259
282
  let sessionUrl = this._headerSer.headerConfig.signOutUrl;
260
- if (this._headerSer.headerConfig.enableLastUrlRedirection) {
261
- const separator = sessionUrl.includes('?') ? '&' : '?';
262
- sessionUrl = sessionUrl + separator + 'returnUrl=' + encodeURIComponent(window.location.href);
263
- }
283
+ // if (this._headerSer.headerConfig.enableLastUrlRedirection) {
284
+ // const separator = sessionUrl.includes('?') ? '&' : '?';
285
+ // sessionUrl = sessionUrl + separator + 'returnUrl=' + encodeURIComponent(window.location.href);
286
+ // }
264
287
  signOut({ global: true, oauth: { redirectUrl: sessionUrl } })
265
288
  .then((data) => {
266
289
  window.open(sessionUrl, '_self');
@@ -382,4 +405,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
382
405
  type: HostListener,
383
406
  args: ['window:focus']
384
407
  }] } });
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbi1oZWFkZXIvc3JjL2xpYi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbi1oZWFkZXIvc3JjL2xpYi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDM0csT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBT3RELE1BQU0sT0FBTyxlQUFlO0lBeUIxQjtRQXZCQSxjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGtCQUFh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QUNGLENBQUMsQ0FBQztvQkFDSCxLQUFLO29CQUNMLFNBQVM7b0JBQ1Qsb0NBQW9DO29CQUNwQyx5QkFBeUI7b0JBQ3pCLDZFQUE2RTtvQkFDN0UsWUFBWTtvQkFDWix5QkFBeUI7b0JBQ3pCLE9BQU87b0JBQ1AsSUFBSTtpQkFDTDthQUNGO2lCQUNJO2dCQUNILElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN0QztRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7OzZHQXhYVSxlQUFlO2lHQUFmLGVBQWUsb2lCQXFCZixjQUFjLGdEQ25EM0IseWhNQTZHYzs0RkQvRUQsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxZQUFZOzBFQWlCYixnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFLZSxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ08sV0FBVztzQkFBckMsU0FBUzt1QkFBQyxjQUFjO2dCQXNEekIsVUFBVTtzQkFQVCxZQUFZO3VCQUFDLG9CQUFvQjs7c0JBQ2pDLFlBQVk7dUJBQUMsa0JBQWtCOztzQkFDL0IsWUFBWTt1QkFBQyxnQkFBZ0I7O3NCQUM3QixZQUFZO3VCQUFDLHFCQUFxQjs7c0JBQ2xDLFlBQVk7dUJBQUMsb0JBQW9COztzQkFDakMsWUFBWTt1QkFBQyxpQkFBaUI7O3NCQUM5QixZQUFZO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRTaWRlbmF2IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBzaWduT3V0IH0gZnJvbSAnYXdzLWFtcGxpZnkvYXV0aCc7XG5pbXBvcnQgeyBBcHBNZW51LCBDb21wYW55IH0gZnJvbSAnLi4vY29tbW9uLWhlYWRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tbW9uSGVhZGVyU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi1oZWFkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wYW55U3dpdGNoV2FybmluZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBhbnktc3dpdGNoLXdhcm5pbmcvY29tcGFueS1zd2l0Y2gtd2FybmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2FwcC5jb25maWcnO1xuaW1wb3J0IHsgUFJPRkVUX0FQUFMgfSBmcm9tICcuLi91dGlscy9hcHBzLmVudW0nO1xuaW1wb3J0IHsgaW1hZ2VEYXRhVXJsIH0gZnJvbSAnLi4vdXRpbHMvaW1hZ2UuZGF0YXVybCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgY29tcGFueVByb2ZpbGU6IGFueTtcbiAgcG9ydGFsVXJsOiBzdHJpbmcgPSAnJztcbiAgdXNlckF1dGhEYXRhOiBhbnk7XG4gIHVzZXJJbWFnZUxpbms6IGFueSA9IG51bGw7XG4gIHVzZXJDb21wYW55TG9nbzogYW55ID0gJyc7XG4gIGltYWdlRGF0YVVybHMgPSBpbWFnZURhdGFVcmw7XG4gIHB1YmxpYyBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgX3NuYWNrYmFyID0gaW5qZWN0KE1hdFNuYWNrQmFyKTtcbiAgcHVibGljIF9oZWFkZXJTZXIgPSBpbmplY3QoQ29tbW9uSGVhZGVyU2VydmljZSk7XG4gIHB1YmxpYyBfZG9tU2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gIHByaXZhdGUgaW5hY3Rpdml0eVRpbWVvdXQ6IGFueTtcbiAgcHJpdmF0ZSBsb2dvdXRDaGVja0ludGVydmFsOiBhbnk7XG4gIEBJbnB1dCgpIElOQUNUSVZJVFlfTElNSVQgPSAzMCAqIDYwICogMTAwMDsgLy8gMzAgbWludXRlc1xuXG4gIEBPdXRwdXQoKSBsb2dvdXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb21wYW55Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBhcHBDb25maWc6IGFueSA9IEFwcENvbmZpZy5hcHBDb25maWc7XG4gIGNvbXBhbnlMaXN0OiBDb21wYW55W10gPSBbXTtcbiAgQFZpZXdDaGlsZCgnc2lkZW5hdicpIHNpZGVuYXYhOiBNYXRTaWRlbmF2O1xuICBAVmlld0NoaWxkKE1hdE1lbnVUcmlnZ2VyKSBtZW51VHJpZ2dlciE6IE1hdE1lbnVUcmlnZ2VyO1xuICBtZW51TGlzdDogeyBrZXk6IHN0cmluZywgdmFsdWU6IEFwcE1lbnVbXSB9W10gPSBbXTtcbiAgYWN0aXZlQ29tcGFueTogQ29tcGFueSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXBkYXRlTGFzdEFjY2Vzc2VkQXBwSW5mbygpO1xuICAgIHRoaXMuZ2V0Q29tcGFueUxpc3QoKTtcblxuICAgIHRoaXMuX2hlYWRlclNlci5nZXRVc2VyRGV0YWlscygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLnVzZXJBdXRoRGF0YSA9IHJlcztcbiAgICAgICAgICB0aGlzLmdldE1lbnVMaXN0KCk7XG4gICAgICAgICAgaWYgKHJlcy5wcm9maWxlSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckltYWdlTGluayA9IHJlcy5wcm9maWxlSW1hZ2UubG9jYXRpb25VcmxcbiAgICAgICAgICAgICAgPyB0aGlzLl9kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChyZXMucHJvZmlsZUltYWdlLmxvY2F0aW9uVXJsKVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBpZiAodXNlckluZm8/LnVzZXJuYW1lKSB7XG4gICAgLy8gICBsZXQgdXNlckRldGFpbHMgPSB0aGlzLl9oZWFkZXJTZXIuZ2V0VXNlckRldGFpbHMoKTtcbiAgICAvLyAgIGZvcmtKb2luKFt1c2VyRGV0YWlsc10pLnN1YnNjcmliZSh7XG4gICAgLy8gICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAvLyAgICAgICBpZiAocmVzICYmIHJlc1swXSkge1xuICAgIC8vICAgICAgICAgdGhpcy51c2VyQXV0aERhdGEgPSByZXNbMF07XG4gICAgLy8gICAgICAgICB0aGlzLnVzZXJuYW1lID0gdGhpcy51c2VyQXV0aERhdGEuZmlyc3ROYW1lO1xuICAgIC8vICAgICAgICAgdGhpcy5nZXRNZW51TGlzdCgpO1xuICAgIC8vICAgICAgICAgaWYgKHRoaXMudXNlckF1dGhEYXRhPy5fbGlua3M/LnByb2ZpbGVJbWFnZT8uaHJlZikge1xuICAgIC8vICAgICAgICAgICB0aGlzLmdldFVzZXJQcm9maWxlKCk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9LFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuICAgIHRoaXMucmVzZXRUaW1lcigpO1xuXG4gICAgLy8gQ2xlYXIgYW55IHN0YWxlIGxvZ291dCBzaWduYWwgb24gaW5pdFxuICAgIHRoaXMuX2hlYWRlclNlci5zZXRDb29raWUodGhpcy5faGVhZGVyU2VyLlNFU1NJT05fRVhQSVJFRF9LRVksICcnLCAtMSk7XG5cbiAgICB0aGlzLnN0YXJ0TG9nb3V0Q2hlY2soKTtcbiAgfVxuXG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJylcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicpXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hzdGFydCcpXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNobW92ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnNjcm9sbCcpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmb2N1cycpXG4gIHJlc2V0VGltZXIoaXNVc2VyQWN0aXZpdHk6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5hY3Rpdml0eVRpbWVvdXQpO1xuXG4gICAgLy8gVXBkYXRlIGdsb2JhbCBhY3Rpdml0eSB0aW1lc3RhbXAgaW4gY29va2llIE9OTFkgaWYgdHJpZ2dlcmVkIGJ5IHVzZXIgYWN0aXZpdHlcbiAgICBpZiAoaXNVc2VyQWN0aXZpdHkpIHtcbiAgICAgIC8vIFVzZSBhIHNob3J0IGV4cGlyeSAoZS5nLiAxIGRheSkgb3Igc3luYyB3aXRoIHNlc3Npb24gbGVuZ3RoXG4gICAgICB0aGlzLl9oZWFkZXJTZXIuc2V0Q29va2llKHRoaXMuX2hlYWRlclNlci5MQVNUX0FDVElWRV9TRVNTSU9OX0tFWSwgRGF0ZS5ub3coKS50b1N0cmluZygpLCAxKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoIXRoaXMuX2hlYWRlclNlci5pc1Nlc3Npb25FeHBpcnlEaWFsb2dPcGVuKSB7XG4gICAgdGhpcy5pbmFjdGl2aXR5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gQ2hlY2sgZ2xvYmFsIGFjdGl2aXR5IGJlZm9yZSBsb2dnaW5nIG91dFxuICAgICAgY29uc3QgbGFzdEFjdGl2ZSA9IHRoaXMuX2hlYWRlclNlci5nZXRDb29raWUodGhpcy5faGVhZGVyU2VyLkxBU1RfQUNUSVZFX1NFU1NJT05fS0VZKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBsYXN0QWN0aXZlVGltZSA9IGxhc3RBY3RpdmUgPyBwYXJzZUludChsYXN0QWN0aXZlLCAxMCkgOiAwO1xuICAgICAgY29uc3QgZWxhcHNlZCA9IG5vdyAtIGxhc3RBY3RpdmVUaW1lO1xuXG4gICAgICBpZiAobGFzdEFjdGl2ZSAmJiBlbGFwc2VkIDwgdGhpcy5JTkFDVElWSVRZX0xJTUlUKSB7XG4gICAgICAgIC8vIFVzZXIgd2FzIGFjdGl2ZSBpbiBhbm90aGVyIHRhYi9hcHAgcmVjZW50bHlcbiAgICAgICAgLy8gUmVzY2hlZHVsZSB0aGUgY2hlY2ssIGJ1dCBETyBOT1QgdXBkYXRlIHRoZSBhY3Rpdml0eSB0aW1lc3RhbXBcbiAgICAgICAgdGhpcy5yZXNldFRpbWVyKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlYWxseSBpbmFjdGl2ZSBhY3Jvc3MgYWxsIGtub3duIHRhYnNcbiAgICAgICAgdGhpcy5oYW5kbGVMb2dvdXQoKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLklOQUNUSVZJVFlfTElNSVQpO1xuICAgIC8vIH1cbiAgfVxuXG5cblxuICAvKipcbiAgICAgKiBIZWxwZXIgdG8gaWRlbnRpZnkgdGhlIHNlc3Npb24gZXhwaXJ5IGluIGluLWFjdGl2ZSB0YWJzLlxuICAqL1xuICBwcml2YXRlIHN0YXJ0TG9nb3V0Q2hlY2soKSB7XG4gICAgLy8gUG9sbCBmb3IgdGhlIGxvZ291dCBzaWduYWwgY29va2llICh3b3JrcyBhY3Jvc3MgcG9ydHMvc3ViZG9tYWlucylcbiAgICB0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5faGVhZGVyU2VyLmdldENvb2tpZSh0aGlzLl9oZWFkZXJTZXIuU0VTU0lPTl9FWFBJUkVEX0tFWSkpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGFiIHN0aWxsIFwiYWN0aXZlXCIgYWNjb3JkaW5nIHRvIHRoZSBzaGFyZWQgdGltZVxuICAgICAgICAvLyBJZiB0YWIgaXMgYWN0aXZlIGJ1dCByZWNlaXZpbmcgYSBsb2dvdXQgc2lnbmFsLCBpdCBpbXBsaWVzIGEgTUFOVUFMIGxvZ291dCBmcm9tIGFub3RoZXIgdGFiLlxuICAgICAgICAvLyBJZiB0YWIgaXMgaW5hY3RpdmUgYW5kIHJlY2VpdmluZyBhIGxvZ291dCBzaWduYWwsIGl0IGltcGxpZXMgYSBUSU1FT1VULlxuICAgICAgICBjb25zdCBsYXN0QWN0aXZlID0gdGhpcy5faGVhZGVyU2VyLmdldENvb2tpZSh0aGlzLl9oZWFkZXJTZXIuTEFTVF9BQ1RJVkVfU0VTU0lPTl9LRVkpO1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBsYXN0QWN0aXZlVGltZSA9IGxhc3RBY3RpdmUgPyBwYXJzZUludChsYXN0QWN0aXZlLCAxMCkgOiAwO1xuICAgICAgICBjb25zdCBlbGFwc2VkID0gbm93IC0gbGFzdEFjdGl2ZVRpbWU7XG5cbiAgICAgICAgY29uc3QgaXNNYW51YWwgPSBlbGFwc2VkIDwgdGhpcy5JTkFDVElWSVRZX0xJTUlUO1xuICAgICAgICB0aGlzLmhhbmRsZUxvZ291dChmYWxzZSwgZmFsc2UsIGlzTWFudWFsKTtcbiAgICAgIH1cbiAgICB9LCAyMDAwKTsgLy8gQ2hlY2sgZXZlcnkgMiBzZWNvbmRzXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvZ291dChicm9hZGNhc3Q6IGJvb2xlYW4gPSB0cnVlLCBzaG93UG9wdXA6IGJvb2xlYW4gPSB0cnVlLCBpc01hbnVhbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgLy8gUHJldmVudCBtdWx0aXBsZSBwb3B1cHMgaWYgYWxyZWFkeSBvcGVuXG4gICAgLy8gaWYgKHRoaXMuX2hlYWRlclNlci5pc1Nlc3Npb25FeHBpcnlEaWFsb2dPcGVuICYmIHNob3dQb3B1cCkge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIGlmIChicm9hZGNhc3QpIHtcbiAgICAgIC8vIFNldCBhIGNvb2tpZSB0byBzaWduYWwgb3RoZXIgdGFicy9wb3J0c1xuICAgICAgdGhpcy5faGVhZGVyU2VyLnNldENvb2tpZSh0aGlzLl9oZWFkZXJTZXIuU0VTU0lPTl9FWFBJUkVEX0tFWSwgJ3RydWUnLCAxKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ291dEV2ZW50LmVtaXQoKTtcblxuICAgIGxldCBzZXNzaW9uVXJsID0gdGhpcy5faGVhZGVyU2VyLmhlYWRlckNvbmZpZy5zaWduT3V0VXJsO1xuXG4gICAgaWYgKHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuZW5hYmxlTGFzdFVybFJlZGlyZWN0aW9uKSB7XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSBzZXNzaW9uVXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICBzZXNzaW9uVXJsID0gc2Vzc2lvblVybCArIHNlcGFyYXRvciArICdyZXR1cm5Vcmw9JyArIGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgLy8gT25seSBhZGQgc2Vzc2lvbkV4cGlyZWQgcGFyYW1zIGlmIGl0IGlzIE5PVCBhIG1hbnVhbCBsb2dvdXRcbiAgICBpZiAoIWlzTWFudWFsKSB7XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSBzZXNzaW9uVXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICBzZXNzaW9uVXJsID0gc2Vzc2lvblVybCArIHNlcGFyYXRvciArICdzZXNzaW9uRXhwaXJlZD10cnVlJnRpbWVvdXQ9JyArIHRoaXMuSU5BQ1RJVklUWV9MSU1JVDtcbiAgICB9XG4gICAgc2lnbk91dCh7IGdsb2JhbDogdHJ1ZSwgb2F1dGg6IHsgcmVkaXJlY3RVcmw6IHNlc3Npb25VcmwgfSB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB3aW5kb3cub3BlbihzZXNzaW9uVXJsLCAnX3NlbGYnKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xvZ291dCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICB3aW5kb3cub3BlbihzZXNzaW9uVXJsLCAnX3NlbGYnKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gaWYgKHNob3dQb3B1cCkge1xuICAgIC8vICAgdGhpcy5faGVhZGVyU2VyLm9wZW5TZXNzaW9uRXhwaXJlSW5mbyh7IHNlc3Npb25PdXRUaW1lSW5NaW5zOiB0aGlzLklOQUNUSVZJVFlfTElNSVQgfSk7XG4gICAgLy8gfVxuXG4gICAgaWYgKHRoaXMuaW5hY3Rpdml0eVRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmluYWN0aXZpdHlUaW1lb3V0KTtcbiAgICB9XG4gICAgLy8gU3RvcCBwb2xsaW5nIG9uY2Ugd2UgYXJlIGxvZ2dpbmcgb3V0XG4gICAgaWYgKHRoaXMubG9nb3V0Q2hlY2tJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEN1cnJlbnRDb21wYW55KCkge1xuICAgIGxldCBjb20gPSB0aGlzLmNvbXBhbnlMaXN0LmZpbmQoeCA9PiB4LmlzQWN0aXZlKTtcbiAgICB0aGlzLmFjdGl2ZUNvbXBhbnkgPSBjb207XG4gIH1cblxuICBwYXRjaEN1cnJlbnRDb21wYW55SW5mbygpIHtcbiAgICBsZXQgY29tID0gdGhpcy5jb21wYW55TGlzdC5maW5kKHggPT4geC5pc0FjdGl2ZSk7XG4gICAgdGhpcy5jb21wYW55Q29udHJvbC5wYXRjaFZhbHVlKGNvbSk7XG4gIH1cblxuICBzaWRlTWVudVRvZ2dsZSgpIHtcbiAgICB0aGlzLnNpZGVuYXYudG9nZ2xlKCk7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwQnlBcHBUeXBlKG1lbnVMaXN0OiBBcHBNZW51W10pOiB7IGtleTogc3RyaW5nLCB2YWx1ZTogQXBwTWVudVtdIH1bXSB7XG4gICAgbGV0IGdyb3VwZWQgPSBtZW51TGlzdC5yZWR1Y2UoKHIsIGEpID0+IHtcbiAgICAgIHJbYS5hcHBUeXBlXSA9IHJbYS5hcHBUeXBlXSB8fCBbXTtcblxuICAgICAgLy8gVE9ETzogUGF0aCByZWZlcmVuY2VzIGFyZSB0byBiZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIGJhY2tlbmQgQVBJIHJlc3BvbnNlLiBSZW1vdmUgdGhpcyBibG9jayB3aGVuIGJhY2tlbmQgaXMgcmVhZHlcbiAgICAgIGlmIChhLmFwcFR5cGUgPT0gUFJPRkVUX0FQUFMucHJvZmV0X3BvcnRhbCkge1xuICAgICAgICBsZXQgaXNDb21wYW55TWVudSA9IGEucGF0aCA9PT0gJ2FwcC9jb21wYW5pZXMnO1xuICAgICAgICBsZXQgaXNDb21wYW55QWRtaW4gPSB0aGlzLnVzZXJBdXRoRGF0YT8ucm9sZXNGb3JDdXJyZW50Q29tcGFueS5pbmNsdWRlcyhcIkNPTVBBTllfQURNSU5cIik7XG5cbiAgICAgICAgaWYgKGlzQ29tcGFueU1lbnUgJiYgaXNDb21wYW55QWRtaW4pIHtcbiAgICAgICAgICBhID0geyAuLi5hLCBwYXRoOiAnYXBwL2FkZENvbXBhbnkvY29tcGFueURldGFpbHMnIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEVORCBvZiBUT0RPIGJsb2NrXG5cbiAgICAgIHJbYS5hcHBUeXBlXS5wdXNoKGEpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdyb3VwZWQpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoeyBrZXksIHZhbHVlOiB2YWx1ZSBhcyBBcHBNZW51W10gfSkpO1xuICB9XG5cbiAgbWVudVNlbGVjdGlvbihtZW51OiBBcHBNZW51KSB7XG4gICAgdGhpcy5zaWRlTWVudVRvZ2dsZSgpO1xuICAgIGxldCBhY3RpdmVDb20gPSB0aGlzLmNvbXBhbnlMaXN0LmZpbmQoeCA9PiB4LmlzQWN0aXZlKTtcbiAgICBsZXQgaXNDb21wYW55TWVudSA9IG1lbnUucGF0aCA9PT0gJ2FwcC9hZGRDb21wYW55L2NvbXBhbnlEZXRhaWxzJztcbiAgICBsZXQgaXNDb21wYW55QWRtaW4gPSB0aGlzLnVzZXJBdXRoRGF0YT8ucm9sZXNGb3JDdXJyZW50Q29tcGFueS5pbmNsdWRlcyhcIkNPTVBBTllfQURNSU5cIik7XG5cbiAgICBpZiAobWVudS5hcHBUeXBlID09IHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuYXBwVHlwZSkge1xuICAgICAgLy8gVE9ETzogUGF0aCByZWZlcmVuY2VzIGFyZSB0byBiZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIGJhY2tlbmQgQVBJIHJlc3BvbnNlXG4gICAgICBpZiAoaXNDb21wYW55TWVudSAmJiBpc0NvbXBhbnlBZG1pbikge1xuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW21lbnUucGF0aCwgYWN0aXZlQ29tPy5pZF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFttZW51LnBhdGhdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoYWN0aXZlQ29tKSB7XG4gICAgICAgIGlmIChhY3RpdmVDb20uYmFzZVVybHNbbWVudS5hcHBUeXBlXSkge1xuICAgICAgICAgIC8vIFRPRE86IFBhdGggcmVmZXJlbmNlcyBhcmUgdG8gYmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSBiYWNrZW5kIEFQSSByZXNwb25zZVxuICAgICAgICAgIGlmIChpc0NvbXBhbnlNZW51ICYmIGlzQ29tcGFueUFkbWluKSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYCR7YWN0aXZlQ29tLmJhc2VVcmxzW21lbnUuYXBwVHlwZV19LyR7bWVudS5wYXRofS8ke2FjdGl2ZUNvbS5pZH1gO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAke2FjdGl2ZUNvbS5iYXNlVXJsc1ttZW51LmFwcFR5cGVdfS8ke21lbnUucGF0aH1gO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb21wYW55TGlzdCgpIHtcbiAgICB0aGlzLl9oZWFkZXJTZXIuZ2V0Q29tcGFueUxpc3QoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHY6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9oZWFkZXJTZXIuc2V0Q29tcGFueUxpc3Qodik7XG4gICAgICAgIHRoaXMuY29tcGFueUxpc3QgPSB2O1xuICAgICAgICB0aGlzLnNlbGVjdEN1cnJlbnRDb21wYW55KCk7XG4gICAgICAgIHRoaXMucGF0Y2hDdXJyZW50Q29tcGFueUluZm8oKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIGdldE1lbnVMaXN0KCkge1xuICAgIHRoaXMuX2hlYWRlclNlci5nZXRNZW51TGlzdCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuX2hlYWRlclNlci5zZXRNZW51U3RhdGUodik7XG4gICAgICAgIHRoaXMubWVudUxpc3QgPSB0aGlzLmdyb3VwQnlBcHBUeXBlKHYpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm9maWxlKCkge1xuICAgIHRoaXMubWVudVRyaWdnZXIuY2xvc2VNZW51KCk7XG4gICAgaWYgKHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuYXBwVHlwZSA9PSBQUk9GRVRfQVBQUy5wcm9mZXRfcG9ydGFsKSB7XG4gICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGVCeVVybCgnL2FwcC9wcm9maWxlJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbGV0IHVybCA9IHRoaXMuYWN0aXZlQ29tcGFueT8uYmFzZVVybHMucHJvZmV0X3BvcnRhbCArICcvYXBwL3Byb2ZpbGUnO1xuICAgICAgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICB9XG4gIH1cbiAgb25Mb2dvdXRDbGljaygpIHtcbiAgICB0aGlzLm1lbnVUcmlnZ2VyLmNsb3NlTWVudSgpO1xuICAgIC8vIFN5bmMgd2l0aCBvdGhlciB0YWJzXG4gICAgdGhpcy5faGVhZGVyU2VyLnNldENvb2tpZSh0aGlzLl9oZWFkZXJTZXIuU0VTU0lPTl9FWFBJUkVEX0tFWSwgJ3RydWUnLCAxKTtcblxuICAgIC8vIENsZWFyIHRpbWVyc1xuICAgIGlmICh0aGlzLmluYWN0aXZpdHlUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5pbmFjdGl2aXR5VGltZW91dCk7XG4gICAgaWYgKHRoaXMubG9nb3V0Q2hlY2tJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy5sb2dvdXRFdmVudC5lbWl0KCk7XG4gICAgbGV0IHNlc3Npb25VcmwgPSB0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLnNpZ25PdXRVcmw7XG4gICAgaWYgKHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuZW5hYmxlTGFzdFVybFJlZGlyZWN0aW9uKSB7XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSBzZXNzaW9uVXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICBzZXNzaW9uVXJsID0gc2Vzc2lvblVybCArIHNlcGFyYXRvciArICdyZXR1cm5Vcmw9JyArIGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgc2lnbk91dCh7IGdsb2JhbDogdHJ1ZSwgb2F1dGg6IHsgcmVkaXJlY3RVcmw6IHNlc3Npb25VcmwgfSB9KVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgd2luZG93Lm9wZW4oc2Vzc2lvblVybCwgJ19zZWxmJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgc2lnbk91dCh7IGdsb2JhbDogdHJ1ZSwgb2F1dGg6IHsgcmVkaXJlY3RVcmw6IHNlc3Npb25VcmwgfSB9KVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHNlc3Npb25VcmwsICdfc2VsZicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gY29uc29sZS5sb2coZXJyb3IpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTGFzdEFjY2Vzc2VkQXBwSW5mbygpIHtcbiAgICBsZXQgcmVxID0ge1xuICAgICAgbGFzdEFjY2Vzc2VkQXBwbGljYXRpb246IHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuYXBwVHlwZVxuICAgIH07XG5cbiAgICB0aGlzLl9oZWFkZXJTZXIudXBkYXRlTGFzdEFjY2Vzc2VkQXBwbGljYXRpb24ocmVxKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzd2l0Y2hDb21wYW55KGluZm86IGFueSkge1xuICAgIGxldCBjb21wYW55ID0gaW5mby52YWx1ZTtcbiAgICBsZXQgY29tSW5mbyA9IHtcbiAgICAgIGFjdGl2ZUNvbXBhbnk6IHRoaXMuYWN0aXZlQ29tcGFueT8ubmFtZSxcbiAgICAgIHN3aXRjaGluZ0NvbXBhbnk6IGNvbXBhbnkubmFtZVxuICAgIH07XG4gICAgdGhpcy5faGVhZGVyU2VyLl9kaWFsb2cub3BlbihDb21wYW55U3dpdGNoV2FybmluZ0NvbXBvbmVudCwgeyBkYXRhOiBjb21JbmZvIH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGRvbWFpbiBpbmZvcm1hdGlvblxuICAgICAgICBpZiAoIWNvbXBhbnkuaXNBY3RpdmUpIHtcbiAgICAgICAgICAvLyBsZXQgZG9tYWluSW5mbyA9IHRoaXMuX2hlYWRlclNlci5nZXREb21haW5JbmZvKCk7XG4gICAgICAgICAgLy8gaWYgKGRvbWFpbkluZm8pIHtcbiAgICAgICAgICBsZXQgcmVxOiBhbnkgPSB7XG4gICAgICAgICAgICBjb21wYW55S2V5OiBjb21wYW55LmNvbXBhbnlLZXksXG4gICAgICAgICAgICBhcHBOYW1lOiB0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLmFwcFR5cGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJTZXIudXBkYXRlVXNlckNvbXBhbnkocmVxKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnR5cGUgJiYgcmVzcG9uc2UudHlwZSA9PSAnT0snKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYXBwbGljYXRpb25VUkwpIHtcbiAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSByZXNwb25zZS5kYXRhLmFwcGxpY2F0aW9uVVJMO1xuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgY3VycmVudCBwYWdlIHRvIHJlbG9hZCB0aGUgY29udGVudHMgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcGFueVxuICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGEgbWVzc2FnZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb21wYW55IGNvdWxkIG5vdCBiZSBzd2l0Y2hlZC5cbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuKFxuICAgICAgICAgICAgICAgICAgJ0NvbXBhbnkgY291bGQgbm90IGJlIHN3aXRjaGVkLiBQbGVhc2UgdHJ5IGFnYWluIG9yIGNvbnRhY3Qgc3VwcG9ydC4nLFxuICAgICAgICAgICAgICAgICAgJ09LJyxcbiAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMDAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5wYXRjaEN1cnJlbnRDb21wYW55SW5mbygpO1xuICAgICAgICAgICAgICAvLyBkaXNwbGF5IGEgbWVzc2FnZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb21wYW55IGNvdWxkIG5vdCBiZSBzd2l0Y2hlZC5cbiAgICAgICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbihcbiAgICAgICAgICAgICAgICAnQ29tcGFueSBjb3VsZCBub3QgYmUgc3dpdGNoZWQuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0LicsXG4gICAgICAgICAgICAgICAgJ09LJyxcbiAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAwIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gfSBcbiAgICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgICAvLyAgIHRoaXMucGF0Y2hDdXJyZW50Q29tcGFueUluZm8oKTtcbiAgICAgICAgICAvLyAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oXG4gICAgICAgICAgLy8gICAgICdDb21wYW55IGNvdWxkIG5vdCBiZSBzd2l0Y2hlZC4gUGxlYXNlIHRyeSBhZ2FpbiBvciBjb250YWN0IHN1cHBvcnQuJyxcbiAgICAgICAgICAvLyAgICAgJ09LJyxcbiAgICAgICAgICAvLyAgICAgeyBkdXJhdGlvbjogNTAwMCB9XG4gICAgICAgICAgLy8gICApO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMucGF0Y2hDdXJyZW50Q29tcGFueUluZm8oKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluYWN0aXZpdHlUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5pbmFjdGl2aXR5VGltZW91dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5sb2dvdXRDaGVja0ludGVydmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxtYXQtc2lkZW5hdi1jb250YWluZXIgY2xhc3M9XCJhcHAtbWVudS1zaWRlbmF2LWNvbnRhaW5lclwiPlxuICAgIDxtYXQtc2lkZW5hdiBjZGtNZW51QmFyICNzaWRlbmF2IG1vZGU9XCJvdmVyXCIgY2xhc3M9XCJzaWRlbmF2RHJhd2VyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXJIZWFkTG9nb1wiPjxpbWcgW3NyY109XCJfZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwoaW1hZ2VEYXRhVXJscy5wcm9mZXRMb2dvKVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW1lbnUtY29udGVudC1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhcHBUeXBlIG9mIG1lbnVMaXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcExpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImFwcENvbmZpZ1thcHBUeXBlLmtleV0/LmFwcExvZ29VcmlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJfZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwoYXBwQ29uZmlnW2FwcFR5cGUua2V5XT8uYXBwTG9nb1VyaSlcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViSGVhZExpc3RJdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFwcFR5cGUudmFsdWVcIiBjbGFzcz1cIm1lbnUtaXRlbVwiIChjbGljayk9XCJtZW51U2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLW1lbnUnOiBpdGVtIHwgYWN0aXZlUm91dGUgOiBfcm91dGVyLnVybDpfaGVhZGVyU2VyLmhlYWRlckNvbmZpZy5hcHBUeXBlfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWVudUljb25MaXN0XCIgKm5nSWY9XCJpdGVtLmljb25cIj57eyBpdGVtLmljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5tZW51TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtc2lkZW5hdj5cblxuPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XG48bWF0LXRvb2xiYXIgY2RrTWVudUJhciBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cImhlYWRlci13cmFwcGVyIGNvbW1vbl9oZWFkZXIgc2hhZG93LXNtXCI+XG4gICAgPCEtLSBNYWluIG5hdiBidXR0b24gYW5kIG5hdmlnYXRpb24gbGlua3MgLS0+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ0aGVtZS13aGl0ZVwiIChjbGljayk9XCJzaWRlbmF2LnRvZ2dsZSgpXCJcbiAgICAgICAgY2xhc3M9XCJwbXgtYnV0dG9uIHBteC1tZW51LWJ1dHRvbiBvcmRlcnMtbWVudSBpY29uLWJ0biBtcy0wIG1lLTNcIiBhcmlhLWxhYmVsPVwibWFpbiBtZW51XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIk1haW4gbWVudVwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwicG9jLWhlYWRlci10b29sdGlwXCI+PG1hdC1pY29uPm1lbnU8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgIDxhIGNsYXNzPVwibmF2YmFyLWJyYW5kIG1lLWF1dG9cIiBocmVmPVwiI1wiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiX2RvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGFwcENvbmZpZ1tfaGVhZGVyU2VyLmhlYWRlckNvbmZpZy5hcHBUeXBlXT8uYXBwTG9nb1VyaSlcIlxuICAgICAgICAgICAgYWx0PVwiQXBwIExvZ29cIiBjbGFzcz1cImFwcC1sb2dvXCI+XG4gICAgPC9hPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJzd2l0Y2hDb21wYW55RmllbGRcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5Db21wYW55PC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJjb21wYW55Q29udHJvbFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwic3dpdGNoQ29tcGFueSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGNvbXBhbnlMaXN0XCIgW3ZhbHVlXT1cIm9wdFwiPlxuICAgICAgICAgICAgICAgIHt7b3B0Lm5hbWV9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuXG4gICAgPCEtLSBQcm9maWxlIGJ1dHRvbiBhbmQgcHJvZmlsZSBkcm9wZG93biBsaW5rcyAtLT5cbiAgICA8YnV0dG9uIGNsYXNzPVwicG14LWJ1dHRvbiBwbXgtbWVudS1idXR0b24gcHJvZmlsZS1idXR0b25cIiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtaW5uZXJcIj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJyYW5kLWxvZ28gYWxpZ24tc2VsZi1jZW50ZXJcIiAqbmdJZj1cImFjdGl2ZUNvbXBhbnk/LmxvZ29cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZUNvbXBhbnk/LmxvZ28gPyAnYnJhbmRlZC1sb2dvLXRydWUnIDogJ2JyYW5kZWQtbG9nby1mYWxzZSdcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIGFjdGl2ZUNvbXBhbnk/LmxvZ28gKyAnKSd9XCI+PC9kaXY+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhclwiPlxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJ1c2VySW1hZ2VMaW5rO2Vsc2UgZGVmYXVsdEF2YXRhclwiIFtzcmNdPVwidXNlckltYWdlTGlua1wiIGNsYXNzPVwiYXZhdGFyLWltYWdlXCIgYWx0PVwiQXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QXZhdGFyPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiX2RvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGltYWdlRGF0YVVybHMuZGVmYXVsdFVzZXJJbWFnZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdmF0YXItZGVmYXVsdFwiIGFsdD1cInByb2ZpbGUgcGljXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJhY2NvdW50c19kcnBtZW51IHBteC1tZW51LWdyb3VwIGhlYWRlci1kcm9wZG93bi1wcm9maWxlXCIgeFBvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnQgc2hvdy1tZW51XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItdXNlci10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwidXNlckltYWdlTGluaztlbHNlIGRlZmF1bHRMYXJnZUF2YXRhclwiIFtzcmNdPVwidXNlckltYWdlTGlua1wiIGNsYXNzPVwiYXZhdGFyLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TGFyZ2VBdmF0YXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKCcgKyBpbWFnZURhdGFVcmxzLmRlZmF1bHRVc2VySW1hZ2UgKyAnKSd9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdmF0YXItaWNvbiBkZWZhdWx0LWF2YXRhclwiIGFsdD1cIkF2YXRhciBpY29uXCI+Jm5ic3A7PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwicHJvZmlsZS1uYW1lXCI+PHNwYW4gKm5nSWY9XCJ1c2VyQXV0aERhdGFcIj57eyB1c2VyQXV0aERhdGE/LmZpcnN0TmFtZSB9fSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQXV0aERhdGE/Lmxhc3ROYW1lIH19PC9zcGFuPjwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiBjbGFzcz1cInBteC1idXR0b24gYnRuIGJ0bi1zbWFsbCB2aWV3LXByb2ZpbGUgbXMtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInByb2ZpbGUoKVwiPlZpZXcgUHJvZmlsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cD5PdmVydmlldzwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckF1dGhEYXRhPy5lbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtdGV4dCBsaXN0LXRleHQtZW1haWwgbXQtMiBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsaXN0LWljb25cIj5tYWlsPC9tYXQtaWNvbj48c3BhbiBjbGFzcz1cInBteC1sb3dlci1jYXNlIHBteC10ZXh0LXdyYXAgbWUtYXV0b1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckF1dGhEYXRhPy5lbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyQXV0aERhdGE/LmNvbnRhY3RQaG9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtdGV4dCBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsaXN0LWljb25cIj5jYWxsPC9tYXQtaWNvbj48c3BhbiBjbGFzcz1cInRpdGxlLWNhc2UgbWUtYXV0b1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckF1dGhEYXRhPy5jb250YWN0UGhvbmUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgICAgIDx1bCBjZGtNZW51IGNsYXNzPVwibGlzdC1ncm91cCBsYXN0LWdyb3VwIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNka01lbnVJdGVtIGNsYXNzPVwibGlzdC1pdGVtIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBjbGFzcz1cInBteC1idXR0b24gbGlzdC1idXR0b24gYnRuLWxvZ291dFwiIChjbGljayk9XCJvbkxvZ291dENsaWNrKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cG93ZXJfc2V0dGluZ3NfbmV3PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpc3QtdGV4dFwiPkxvZ291dDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbWVudT5cbjwvbWF0LXRvb2xiYXI+Il19
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbi1oZWFkZXIvc3JjL2xpYi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbi1oZWFkZXIvc3JjL2xpYi9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDM0csT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBT3RELE1BQU0sT0FBTyxlQUFlO0lBMkIxQjtRQXpCQSxjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGtCQUFhLEdBQVEsSUFBSSxDQUFDO1FBQzFCLG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBQzFCLGtCQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ3RCLFlBQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsY0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxlQUFVLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDekMsa0JBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFHcEMsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLGlDQUE0QixHQUFXLENBQUMsQ0FBQztRQUN4QyxxQkFBZ0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLGFBQWE7UUFFL0MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRWpELG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxjQUFTLEdBQVEsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUNyQyxnQkFBVyxHQUFjLEVBQUUsQ0FBQztRQUc1QixhQUFRLEdBQXdDLEVBQUUsQ0FBQztJQUduQyxDQUFDO0lBRWpCLEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksR0FBRyxFQUFFO29CQUNQLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO29CQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25CLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRTt3QkFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVc7NEJBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDOzRCQUN6RSxDQUFDLENBQUMsSUFBSSxDQUFDO3FCQUNWO2lCQUNGO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQTtRQUNGLDRCQUE0QjtRQUM1Qix3REFBd0Q7UUFDeEQsd0NBQXdDO1FBQ3hDLHVCQUF1QjtRQUN2Qiw2QkFBNkI7UUFDN0Isc0NBQXNDO1FBQ3RDLHVEQUF1RDtRQUN2RCw4QkFBOEI7UUFDOUIsK0RBQStEO1FBQy9ELG1DQUFtQztRQUNuQyxZQUFZO1FBQ1osVUFBVTtRQUNWLFNBQVM7UUFDVCxRQUFRO1FBQ1IsSUFBSTtRQUNKLDZDQUE2QztRQUM3QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXBDLDJGQUEyRjtRQUMzRiw2RkFBNkY7UUFDN0YsOERBQThEO1FBQzlELDRJQUE0STtRQUM1SSx3RkFBd0Y7UUFDeEYseUhBQXlIO1FBQ3pILHlDQUF5QztRQUV6QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBVUQsVUFBVSxDQUFDLGlCQUEwQixJQUFJO1FBQ3ZDLFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVyQyxnRkFBZ0Y7UUFDaEYsSUFBSSxjQUFjLEVBQUU7WUFDbEIsOERBQThEO1lBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3ZDLDJDQUEyQztZQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDdEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxjQUFjLENBQUM7WUFFckMsSUFBSSxVQUFVLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDakQsOENBQThDO2dCQUM5QyxpRUFBaUU7Z0JBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEI7aUJBQU07Z0JBQ0wsd0NBQXdDO2dCQUN4QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDckI7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUIsSUFBSTtJQUNOLENBQUM7SUFJRDs7TUFFRTtJQUNNLGdCQUFnQjtRQUN0QixvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRXBGLElBQUksWUFBWSxFQUFFO2dCQUNoQixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUVuRCx5SEFBeUg7Z0JBQ3pILElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUU7b0JBQzNCLHdFQUF3RTtvQkFDeEUsNEZBQTRGO29CQUM1RixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7d0JBRTVDLG1FQUFtRTt3QkFDbkUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFOzRCQUV2RCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsZUFBZSxDQUFDOzRCQUVwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLENBQUM7NEJBQ3RGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs0QkFDdkIsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2pFLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxjQUFjLENBQUM7NEJBRXJDLE1BQU0sUUFBUSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7NEJBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQzt5QkFDM0M7cUJBQ0Y7aUJBQ0Y7YUFDRjtRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNwQyxDQUFDO0lBRU8sWUFBWSxDQUFDLFlBQXFCLElBQUksRUFBRSxZQUFxQixJQUFJLEVBQUUsV0FBb0IsS0FBSztRQUNsRywwQ0FBMEM7UUFDMUMsZ0VBQWdFO1FBQ2hFLFlBQVk7UUFDWixJQUFJO1FBRUosSUFBSSxTQUFTLEVBQUU7WUFDYixxRUFBcUU7WUFDckUsNEdBQTRHO1lBQzVHLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDLENBQUMsMENBQTBDO1lBQ25GLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ25GO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFFekQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRTtZQUN6RCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN2RCxVQUFVLEdBQUcsVUFBVSxHQUFHLFNBQVMsR0FBRyxjQUFjLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqRztRQUVELDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDdkQsVUFBVSxHQUFHLFVBQVUsR0FBRyxTQUFTLEdBQUcsOEJBQThCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1NBQzlGO1FBQ0QsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQzthQUMxRCxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUwsbUJBQW1CO1FBQ25CLDRGQUE0RjtRQUM1RixJQUFJO1FBRUosSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7SUFDM0IsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxRQUFtQjtRQUN4QyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbEMsMEhBQTBIO1lBQzFILElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsYUFBYSxFQUFFO2dCQUMxQyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQztnQkFDL0MsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRXpGLElBQUksYUFBYSxJQUFJLGNBQWMsRUFBRTtvQkFDbkMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLCtCQUErQixFQUFFLENBQUM7aUJBQ3JEO2FBQ0Y7WUFDRCxvQkFBb0I7WUFFcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQWE7UUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssK0JBQStCLENBQUM7UUFDbEUsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFekYsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUN4RCxpRkFBaUY7WUFDakYsSUFBSSxhQUFhLElBQUksY0FBYyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkQ7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNwQztTQUNGO2FBQ0k7WUFDSCxJQUFJLFNBQVMsRUFBRTtnQkFDYixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNwQyxpRkFBaUY7b0JBQ2pGLElBQUksYUFBYSxJQUFJLGNBQWMsRUFBRTt3QkFDbkMsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDN0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzlCO3lCQUFNO3dCQUNMLElBQUksR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM3RCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDOUI7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QyxJQUFJLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN0QyxJQUFJLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM1QzthQUNJO1lBQ0gsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQztZQUN0RSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBQ0QsYUFBYTtRQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDN0IsdUJBQXVCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsNEJBQTRCLEdBQUcsR0FBRyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWxGLGVBQWU7UUFDZixJQUFJLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsbUJBQW1CO1lBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQ3pELCtEQUErRDtRQUMvRCw0REFBNEQ7UUFDNUQsbUdBQW1HO1FBQ25HLElBQUk7UUFFSixPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDO2FBQzFELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUM7aUJBQzFELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixJQUFJLEdBQUcsR0FBRztZQUNSLHVCQUF1QixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU87U0FDOUQsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzNELElBQUksRUFBRSxHQUFHLEVBQUU7WUFDWCxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFTO1FBQ3JCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxPQUFPLEdBQUc7WUFDWixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJO1lBQ3ZDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJO1NBQy9CLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDM0csSUFBSSxHQUFHLEVBQUU7Z0JBQ1AsOEJBQThCO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtvQkFDckIsb0RBQW9EO29CQUNwRCxvQkFBb0I7b0JBQ3BCLElBQUksR0FBRyxHQUFRO3dCQUNiLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTt3QkFDOUIsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU87cUJBQzlDLENBQUM7b0JBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7d0JBQy9DLElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFOzRCQUN0QixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO2dDQUN0RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO29DQUNoQyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztvQ0FDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7aUNBQzlCO2dDQUNELCtFQUErRTtnQ0FDL0UsNEJBQTRCOzZCQUM3QjtpQ0FBTTtnQ0FDTCx3RUFBd0U7Z0NBQ3hFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNqQixxRUFBcUUsRUFDckUsSUFBSSxFQUNKLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUNuQixDQUFDOzZCQUNIO3dCQUNILENBQUM7d0JBQ0QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7NEJBQ1gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7NEJBQy9CLHdFQUF3RTs0QkFDeEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2pCLHFFQUFxRSxFQUNyRSxJQUFJLEVBQ0osRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQ25CLENBQUM7d0JBQ0osQ0FBQztxQkFDRixDQUFDLENBQUM7b0JBQ0gsS0FBSztvQkFDTCxTQUFTO29CQUNULG9DQUFvQztvQkFDcEMseUJBQXlCO29CQUN6Qiw2RUFBNkU7b0JBQzdFLFlBQVk7b0JBQ1oseUJBQXlCO29CQUN6QixPQUFPO29CQUNQLElBQUk7aUJBQ0w7YUFDRjtpQkFDSTtnQkFDSCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUNoQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixhQUFhLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDOzs2R0FwWlUsZUFBZTtpR0FBZixlQUFlLG9pQkF1QmYsY0FBYyxnRENyRDNCLHloTUE2R2M7NEZEL0VELGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsWUFBWTswRUFtQmIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBS2UsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQUNPLFdBQVc7c0JBQXJDLFNBQVM7dUJBQUMsY0FBYztnQkE0RHpCLFVBQVU7c0JBUFQsWUFBWTt1QkFBQyxvQkFBb0I7O3NCQUNqQyxZQUFZO3VCQUFDLGtCQUFrQjs7c0JBQy9CLFlBQVk7dUJBQUMsZ0JBQWdCOztzQkFDN0IsWUFBWTt1QkFBQyxxQkFBcUI7O3NCQUNsQyxZQUFZO3VCQUFDLG9CQUFvQjs7c0JBQ2pDLFlBQVk7dUJBQUMsaUJBQWlCOztzQkFDOUIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0U2lkZW5hdiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgc2lnbk91dCB9IGZyb20gJ2F3cy1hbXBsaWZ5L2F1dGgnO1xuaW1wb3J0IHsgQXBwTWVudSwgQ29tcGFueSB9IGZyb20gJy4uL2NvbW1vbi1oZWFkZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbW1vbkhlYWRlclNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24taGVhZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcGFueVN3aXRjaFdhcm5pbmdDb21wb25lbnQgfSBmcm9tICcuLi9jb21wYW55LXN3aXRjaC13YXJuaW5nL2NvbXBhbnktc3dpdGNoLXdhcm5pbmcuY29tcG9uZW50JztcbmltcG9ydCB7IEFwcENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9hcHAuY29uZmlnJztcbmltcG9ydCB7IFBST0ZFVF9BUFBTIH0gZnJvbSAnLi4vdXRpbHMvYXBwcy5lbnVtJztcbmltcG9ydCB7IGltYWdlRGF0YVVybCB9IGZyb20gJy4uL3V0aWxzL2ltYWdlLmRhdGF1cmwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItaGVhZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2hlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hlYWRlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNvbXBhbnlQcm9maWxlOiBhbnk7XG4gIHBvcnRhbFVybDogc3RyaW5nID0gJyc7XG4gIHVzZXJBdXRoRGF0YTogYW55O1xuICB1c2VySW1hZ2VMaW5rOiBhbnkgPSBudWxsO1xuICB1c2VyQ29tcGFueUxvZ286IGFueSA9ICcnO1xuICBpbWFnZURhdGFVcmxzID0gaW1hZ2VEYXRhVXJsO1xuICBwdWJsaWMgX3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwcml2YXRlIF9zbmFja2JhciA9IGluamVjdChNYXRTbmFja0Jhcik7XG4gIHB1YmxpYyBfaGVhZGVyU2VyID0gaW5qZWN0KENvbW1vbkhlYWRlclNlcnZpY2UpO1xuICBwdWJsaWMgX2RvbVNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xuICBwcml2YXRlIGluYWN0aXZpdHlUaW1lb3V0OiBhbnk7XG4gIHByaXZhdGUgbG9nb3V0Q2hlY2tJbnRlcnZhbDogYW55O1xuICBwcml2YXRlIGNvbXBvbmVudEluaXRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGxhc3RQcm9jZXNzZWRMb2dvdXRUaW1lc3RhbXA6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIElOQUNUSVZJVFlfTElNSVQgPSAzMCAqIDYwICogMTAwMDsgLy8gMzAgbWludXRlc1xuXG4gIEBPdXRwdXQoKSBsb2dvdXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBjb21wYW55Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBhcHBDb25maWc6IGFueSA9IEFwcENvbmZpZy5hcHBDb25maWc7XG4gIGNvbXBhbnlMaXN0OiBDb21wYW55W10gPSBbXTtcbiAgQFZpZXdDaGlsZCgnc2lkZW5hdicpIHNpZGVuYXYhOiBNYXRTaWRlbmF2O1xuICBAVmlld0NoaWxkKE1hdE1lbnVUcmlnZ2VyKSBtZW51VHJpZ2dlciE6IE1hdE1lbnVUcmlnZ2VyO1xuICBtZW51TGlzdDogeyBrZXk6IHN0cmluZywgdmFsdWU6IEFwcE1lbnVbXSB9W10gPSBbXTtcbiAgYWN0aXZlQ29tcGFueTogQ29tcGFueSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXBkYXRlTGFzdEFjY2Vzc2VkQXBwSW5mbygpO1xuICAgIHRoaXMuZ2V0Q29tcGFueUxpc3QoKTtcblxuICAgIHRoaXMuX2hlYWRlclNlci5nZXRVc2VyRGV0YWlscygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICB0aGlzLnVzZXJBdXRoRGF0YSA9IHJlcztcbiAgICAgICAgICB0aGlzLmdldE1lbnVMaXN0KCk7XG4gICAgICAgICAgaWYgKHJlcy5wcm9maWxlSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckltYWdlTGluayA9IHJlcy5wcm9maWxlSW1hZ2UubG9jYXRpb25VcmxcbiAgICAgICAgICAgICAgPyB0aGlzLl9kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChyZXMucHJvZmlsZUltYWdlLmxvY2F0aW9uVXJsKVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBpZiAodXNlckluZm8/LnVzZXJuYW1lKSB7XG4gICAgLy8gICBsZXQgdXNlckRldGFpbHMgPSB0aGlzLl9oZWFkZXJTZXIuZ2V0VXNlckRldGFpbHMoKTtcbiAgICAvLyAgIGZvcmtKb2luKFt1c2VyRGV0YWlsc10pLnN1YnNjcmliZSh7XG4gICAgLy8gICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAvLyAgICAgICBpZiAocmVzICYmIHJlc1swXSkge1xuICAgIC8vICAgICAgICAgdGhpcy51c2VyQXV0aERhdGEgPSByZXNbMF07XG4gICAgLy8gICAgICAgICB0aGlzLnVzZXJuYW1lID0gdGhpcy51c2VyQXV0aERhdGEuZmlyc3ROYW1lO1xuICAgIC8vICAgICAgICAgdGhpcy5nZXRNZW51TGlzdCgpO1xuICAgIC8vICAgICAgICAgaWYgKHRoaXMudXNlckF1dGhEYXRhPy5fbGlua3M/LnByb2ZpbGVJbWFnZT8uaHJlZikge1xuICAgIC8vICAgICAgICAgICB0aGlzLmdldFVzZXJQcm9maWxlKCk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9LFxuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuICAgIC8vIENhcHR1cmUgd2hlbiB0aGlzIGNvbXBvbmVudC9hcHAgd2FzIGxvYWRlZFxuICAgIHRoaXMuY29tcG9uZW50SW5pdFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgLy8gUmVtb3ZlIGxlZ2FjeSBib29sZWFuIGNoZWNrIG9yIHJlc2V0IGlmIG5lZWRlZCwgYnV0IHByaW1hcmlseSB3ZSByZWx5IG9uIHRpbWVzdGFtcHMgbm93LlxuICAgIC8vIFdlIGRvIE5PVCB3YW50IHRvIGNsZWFyIHRoZSBjb29raWUgaW1tZWRpYXRlbHkgb24gaW5pdCBpZiBpdCdzIGEgdmFsaWQgcGVyc2lzdGVudCBzaWduYWwsIFxuICAgIC8vIGJ1dCB0aGUgdGltZXN0YW1wIGNoZWNrIGd1YXJkcyBhZ2FpbnN0IFwibG9vcGluZ1wiIG9uIHJlbG9hZC5cbiAgICAvLyBIb3dldmVyLCBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgXCJmcmVzaCBsb2dpbiBtZWFucyBmcmVzaCBzZXNzaW9uXCIsIHdlIG1pZ2h0IGp1c3QgaWdub3JlIG9sZCB0aW1lc3RhbXBzICh3aGljaCB3ZSBkbyB2aWEgPiBpbml0VGltZSBjaGVjaykuXG4gICAgLy8gU28gZGlzdGluY3QgY2xlYW51cCBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnkgaWYgdGhlIGxvZ2luIHBhZ2Ugbm8gbG9uZ2VyIGRlbGV0ZXMgaXQuIFxuICAgIC8vIEJ1dCBsZXQncyBsZWF2ZSBpdCBhcyBpcyBvciByZW1vdmUgaXQuIFRoZSB1c2VyJ3MgaXNzdWUgd2FzIFwiZGVsZXRlIGNvb2tpZVwiIGxvZ2ljIG9uIExPR0lOIFBBR0UgY2F1c2VkIHJhY2UgY29uZGl0aW9uLlxuICAgIC8vIEhlcmUgd2UganVzdCB3YW50IHRvIHN0YXJ0IG1vbml0b3JpbmcuXG5cbiAgICB0aGlzLnN0YXJ0TG9nb3V0Q2hlY2soKTtcbiAgfVxuXG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJylcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicpXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6dG91Y2hzdGFydCcpXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNobW92ZScpXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnNjcm9sbCcpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmb2N1cycpXG4gIHJlc2V0VGltZXIoaXNVc2VyQWN0aXZpdHk6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5hY3Rpdml0eVRpbWVvdXQpO1xuXG4gICAgLy8gVXBkYXRlIGdsb2JhbCBhY3Rpdml0eSB0aW1lc3RhbXAgaW4gY29va2llIE9OTFkgaWYgdHJpZ2dlcmVkIGJ5IHVzZXIgYWN0aXZpdHlcbiAgICBpZiAoaXNVc2VyQWN0aXZpdHkpIHtcbiAgICAgIC8vIFVzZSBhIHNob3J0IGV4cGlyeSAoZS5nLiAxIGRheSkgb3Igc3luYyB3aXRoIHNlc3Npb24gbGVuZ3RoXG4gICAgICB0aGlzLl9oZWFkZXJTZXIuc2V0Q29va2llKHRoaXMuX2hlYWRlclNlci5MQVNUX0FDVElWRV9TRVNTSU9OX0tFWSwgRGF0ZS5ub3coKS50b1N0cmluZygpLCAxKTtcbiAgICB9XG5cbiAgICAvLyBpZiAoIXRoaXMuX2hlYWRlclNlci5pc1Nlc3Npb25FeHBpcnlEaWFsb2dPcGVuKSB7XG4gICAgdGhpcy5pbmFjdGl2aXR5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gQ2hlY2sgZ2xvYmFsIGFjdGl2aXR5IGJlZm9yZSBsb2dnaW5nIG91dFxuICAgICAgY29uc3QgbGFzdEFjdGl2ZSA9IHRoaXMuX2hlYWRlclNlci5nZXRDb29raWUodGhpcy5faGVhZGVyU2VyLkxBU1RfQUNUSVZFX1NFU1NJT05fS0VZKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBsYXN0QWN0aXZlVGltZSA9IGxhc3RBY3RpdmUgPyBwYXJzZUludChsYXN0QWN0aXZlLCAxMCkgOiAwO1xuICAgICAgY29uc3QgZWxhcHNlZCA9IG5vdyAtIGxhc3RBY3RpdmVUaW1lO1xuXG4gICAgICBpZiAobGFzdEFjdGl2ZSAmJiBlbGFwc2VkIDwgdGhpcy5JTkFDVElWSVRZX0xJTUlUKSB7XG4gICAgICAgIC8vIFVzZXIgd2FzIGFjdGl2ZSBpbiBhbm90aGVyIHRhYi9hcHAgcmVjZW50bHlcbiAgICAgICAgLy8gUmVzY2hlZHVsZSB0aGUgY2hlY2ssIGJ1dCBETyBOT1QgdXBkYXRlIHRoZSBhY3Rpdml0eSB0aW1lc3RhbXBcbiAgICAgICAgdGhpcy5yZXNldFRpbWVyKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlYWxseSBpbmFjdGl2ZSBhY3Jvc3MgYWxsIGtub3duIHRhYnNcbiAgICAgICAgdGhpcy5oYW5kbGVMb2dvdXQoKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLklOQUNUSVZJVFlfTElNSVQpO1xuICAgIC8vIH1cbiAgfVxuXG5cblxuICAvKipcbiAgICAgKiBIZWxwZXIgdG8gaWRlbnRpZnkgdGhlIHNlc3Npb24gZXhwaXJ5IGluIGluLWFjdGl2ZSB0YWJzLlxuICAqL1xuICBwcml2YXRlIHN0YXJ0TG9nb3V0Q2hlY2soKSB7XG4gICAgLy8gUG9sbCBmb3IgdGhlIGxvZ291dCBzaWduYWwgY29va2llICh3b3JrcyBhY3Jvc3MgcG9ydHMvc3ViZG9tYWlucylcbiAgICB0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCBsb2dvdXRDb29raWUgPSB0aGlzLl9oZWFkZXJTZXIuZ2V0Q29va2llKHRoaXMuX2hlYWRlclNlci5TRVNTSU9OX0VYUElSRURfS0VZKTtcblxuICAgICAgaWYgKGxvZ291dENvb2tpZSkge1xuICAgICAgICBjb25zdCBsb2dvdXRUaW1lc3RhbXAgPSBwYXJzZUludChsb2dvdXRDb29raWUsIDEwKTtcblxuICAgICAgICAvLyAxLiBDaGVjayBpZiBpdCdzIGEgdmFsaWQgbnVtYmVyIChsZWdhY3kgJ3RydWUnIHN0cmluZyBzdXBwb3J0IGlzIGlycmVsZXZhbnQgaWYgd2UgZnVsbHkgc3dpdGNoLCBidXQgc2FmZSB0byBjaGVjayBOYU4pXG4gICAgICAgIGlmICghaXNOYU4obG9nb3V0VGltZXN0YW1wKSkge1xuICAgICAgICAgIC8vIDIuIENoZWNrIGlmIHRoaXMgbG9nb3V0IGV2ZW50IGhhcHBlbmVkIEFGVEVSIHRoaXMgYXBwIHdhcyBpbml0aWFsaXplZFxuICAgICAgICAgIC8vICAgIFRoaXMgcHJldmVudHMgaW5maW5pdGUgbG9vcHMgaWYgdGhlIHVzZXIganVzdCBsb2dnZWQgaW4gYW5kIHRoZSBjb29raWUgaXMgc3RpbGwgdGhlcmUuXG4gICAgICAgICAgaWYgKGxvZ291dFRpbWVzdGFtcCA+IHRoaXMuY29tcG9uZW50SW5pdFRpbWUpIHtcblxuICAgICAgICAgICAgLy8gMy4gQ2hlY2sgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGV4YWN0IGxvZ291dCBldmVudFxuICAgICAgICAgICAgaWYgKGxvZ291dFRpbWVzdGFtcCA+IHRoaXMubGFzdFByb2Nlc3NlZExvZ291dFRpbWVzdGFtcCkge1xuXG4gICAgICAgICAgICAgIHRoaXMubGFzdFByb2Nlc3NlZExvZ291dFRpbWVzdGFtcCA9IGxvZ291dFRpbWVzdGFtcDtcblxuICAgICAgICAgICAgICBjb25zdCBsYXN0QWN0aXZlID0gdGhpcy5faGVhZGVyU2VyLmdldENvb2tpZSh0aGlzLl9oZWFkZXJTZXIuTEFTVF9BQ1RJVkVfU0VTU0lPTl9LRVkpO1xuICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICBjb25zdCBsYXN0QWN0aXZlVGltZSA9IGxhc3RBY3RpdmUgPyBwYXJzZUludChsYXN0QWN0aXZlLCAxMCkgOiAwO1xuICAgICAgICAgICAgICBjb25zdCBlbGFwc2VkID0gbm93IC0gbGFzdEFjdGl2ZVRpbWU7XG5cbiAgICAgICAgICAgICAgY29uc3QgaXNNYW51YWwgPSBlbGFwc2VkIDwgdGhpcy5JTkFDVElWSVRZX0xJTUlUO1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUxvZ291dChmYWxzZSwgZmFsc2UsIGlzTWFudWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAyMDAwKTsgLy8gQ2hlY2sgZXZlcnkgMiBzZWNvbmRzXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUxvZ291dChicm9hZGNhc3Q6IGJvb2xlYW4gPSB0cnVlLCBzaG93UG9wdXA6IGJvb2xlYW4gPSB0cnVlLCBpc01hbnVhbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgLy8gUHJldmVudCBtdWx0aXBsZSBwb3B1cHMgaWYgYWxyZWFkeSBvcGVuXG4gICAgLy8gaWYgKHRoaXMuX2hlYWRlclNlci5pc1Nlc3Npb25FeHBpcnlEaWFsb2dPcGVuICYmIHNob3dQb3B1cCkge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIGlmIChicm9hZGNhc3QpIHtcbiAgICAgIC8vIFNldCBhIGNvb2tpZSB0byBzaWduYWwgb3RoZXIgdGFicy9wb3J0cyB3aXRoIHRoZSBjdXJyZW50IFRJTUVTVEFNUFxuICAgICAgLy8gVGhpcyB0aW1lc3RhbXAgYWxsb3dzIG90aGVyIHRhYnMgdG8ga25vdyBpZiB0aGlzIGlzIGEgXCJuZXdcIiBsb2dvdXQgZXZlbnQgcmVsYXRpdmUgdG8gdGhlaXIgc2Vzc2lvbiBzdGFydC5cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLmxhc3RQcm9jZXNzZWRMb2dvdXRUaW1lc3RhbXAgPSBub3c7IC8vIERvbid0IGxvZ291dCBteXNlbGYgYWdhaW4gYmFzZWQgb24gdGhpc1xuICAgICAgdGhpcy5faGVhZGVyU2VyLnNldENvb2tpZSh0aGlzLl9oZWFkZXJTZXIuU0VTU0lPTl9FWFBJUkVEX0tFWSwgbm93LnRvU3RyaW5nKCksIDEpO1xuICAgIH1cblxuICAgIHRoaXMubG9nb3V0RXZlbnQuZW1pdCgpO1xuXG4gICAgbGV0IHNlc3Npb25VcmwgPSB0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLnNpZ25PdXRVcmw7XG5cbiAgICBpZiAodGhpcy5faGVhZGVyU2VyLmhlYWRlckNvbmZpZy5lbmFibGVMYXN0VXJsUmVkaXJlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHNlc3Npb25VcmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICAgIHNlc3Npb25VcmwgPSBzZXNzaW9uVXJsICsgc2VwYXJhdG9yICsgJ3JlZGlyZWN0VXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIC8vIE9ubHkgYWRkIHNlc3Npb25FeHBpcmVkIHBhcmFtcyBpZiBpdCBpcyBOT1QgYSBtYW51YWwgbG9nb3V0XG4gICAgaWYgKCFpc01hbnVhbCkge1xuICAgICAgY29uc3Qgc2VwYXJhdG9yID0gc2Vzc2lvblVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nO1xuICAgICAgc2Vzc2lvblVybCA9IHNlc3Npb25VcmwgKyBzZXBhcmF0b3IgKyAnc2Vzc2lvbkV4cGlyZWQ9dHJ1ZSZ0aW1lb3V0PScgKyB0aGlzLklOQUNUSVZJVFlfTElNSVQ7XG4gICAgfVxuICAgIHNpZ25PdXQoeyBnbG9iYWw6IHRydWUsIG9hdXRoOiB7IHJlZGlyZWN0VXJsOiBzZXNzaW9uVXJsIH0gfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgd2luZG93Lm9wZW4oc2Vzc2lvblVybCwgJ19zZWxmJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdMb2dvdXQgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgd2luZG93Lm9wZW4oc2Vzc2lvblVybCwgJ19zZWxmJyk7XG4gICAgICB9KTtcblxuICAgIC8vIGlmIChzaG93UG9wdXApIHtcbiAgICAvLyAgIHRoaXMuX2hlYWRlclNlci5vcGVuU2Vzc2lvbkV4cGlyZUluZm8oeyBzZXNzaW9uT3V0VGltZUluTWluczogdGhpcy5JTkFDVElWSVRZX0xJTUlUIH0pO1xuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLmluYWN0aXZpdHlUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5pbmFjdGl2aXR5VGltZW91dCk7XG4gICAgfVxuICAgIC8vIFN0b3AgcG9sbGluZyBvbmNlIHdlIGFyZSBsb2dnaW5nIG91dFxuICAgIGlmICh0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5sb2dvdXRDaGVja0ludGVydmFsKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDdXJyZW50Q29tcGFueSgpIHtcbiAgICBsZXQgY29tID0gdGhpcy5jb21wYW55TGlzdC5maW5kKHggPT4geC5pc0FjdGl2ZSk7XG4gICAgdGhpcy5hY3RpdmVDb21wYW55ID0gY29tO1xuICB9XG5cbiAgcGF0Y2hDdXJyZW50Q29tcGFueUluZm8oKSB7XG4gICAgbGV0IGNvbSA9IHRoaXMuY29tcGFueUxpc3QuZmluZCh4ID0+IHguaXNBY3RpdmUpO1xuICAgIHRoaXMuY29tcGFueUNvbnRyb2wucGF0Y2hWYWx1ZShjb20pO1xuICB9XG5cbiAgc2lkZU1lbnVUb2dnbGUoKSB7XG4gICAgdGhpcy5zaWRlbmF2LnRvZ2dsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cEJ5QXBwVHlwZShtZW51TGlzdDogQXBwTWVudVtdKTogeyBrZXk6IHN0cmluZywgdmFsdWU6IEFwcE1lbnVbXSB9W10ge1xuICAgIGxldCBncm91cGVkID0gbWVudUxpc3QucmVkdWNlKChyLCBhKSA9PiB7XG4gICAgICByW2EuYXBwVHlwZV0gPSByW2EuYXBwVHlwZV0gfHwgW107XG5cbiAgICAgIC8vIFRPRE86IFBhdGggcmVmZXJlbmNlcyBhcmUgdG8gYmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSBiYWNrZW5kIEFQSSByZXNwb25zZS4gUmVtb3ZlIHRoaXMgYmxvY2sgd2hlbiBiYWNrZW5kIGlzIHJlYWR5XG4gICAgICBpZiAoYS5hcHBUeXBlID09IFBST0ZFVF9BUFBTLnByb2ZldF9wb3J0YWwpIHtcbiAgICAgICAgbGV0IGlzQ29tcGFueU1lbnUgPSBhLnBhdGggPT09ICdhcHAvY29tcGFuaWVzJztcbiAgICAgICAgbGV0IGlzQ29tcGFueUFkbWluID0gdGhpcy51c2VyQXV0aERhdGE/LnJvbGVzRm9yQ3VycmVudENvbXBhbnkuaW5jbHVkZXMoXCJDT01QQU5ZX0FETUlOXCIpO1xuXG4gICAgICAgIGlmIChpc0NvbXBhbnlNZW51ICYmIGlzQ29tcGFueUFkbWluKSB7XG4gICAgICAgICAgYSA9IHsgLi4uYSwgcGF0aDogJ2FwcC9hZGRDb21wYW55L2NvbXBhbnlEZXRhaWxzJyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBFTkQgb2YgVE9ETyBibG9ja1xuXG4gICAgICByW2EuYXBwVHlwZV0ucHVzaChhKTtcbiAgICAgIHJldHVybiByO1xuICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhncm91cGVkKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZTogdmFsdWUgYXMgQXBwTWVudVtdIH0pKTtcbiAgfVxuXG4gIG1lbnVTZWxlY3Rpb24obWVudTogQXBwTWVudSkge1xuICAgIHRoaXMuc2lkZU1lbnVUb2dnbGUoKTtcbiAgICBsZXQgYWN0aXZlQ29tID0gdGhpcy5jb21wYW55TGlzdC5maW5kKHggPT4geC5pc0FjdGl2ZSk7XG4gICAgbGV0IGlzQ29tcGFueU1lbnUgPSBtZW51LnBhdGggPT09ICdhcHAvYWRkQ29tcGFueS9jb21wYW55RGV0YWlscyc7XG4gICAgbGV0IGlzQ29tcGFueUFkbWluID0gdGhpcy51c2VyQXV0aERhdGE/LnJvbGVzRm9yQ3VycmVudENvbXBhbnkuaW5jbHVkZXMoXCJDT01QQU5ZX0FETUlOXCIpO1xuXG4gICAgaWYgKG1lbnUuYXBwVHlwZSA9PSB0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLmFwcFR5cGUpIHtcbiAgICAgIC8vIFRPRE86IFBhdGggcmVmZXJlbmNlcyBhcmUgdG8gYmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSBiYWNrZW5kIEFQSSByZXNwb25zZVxuICAgICAgaWYgKGlzQ29tcGFueU1lbnUgJiYgaXNDb21wYW55QWRtaW4pIHtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFttZW51LnBhdGgsIGFjdGl2ZUNvbT8uaWRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbbWVudS5wYXRoXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGFjdGl2ZUNvbSkge1xuICAgICAgICBpZiAoYWN0aXZlQ29tLmJhc2VVcmxzW21lbnUuYXBwVHlwZV0pIHtcbiAgICAgICAgICAvLyBUT0RPOiBQYXRoIHJlZmVyZW5jZXMgYXJlIHRvIGJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gYmFja2VuZCBBUEkgcmVzcG9uc2VcbiAgICAgICAgICBpZiAoaXNDb21wYW55TWVudSAmJiBpc0NvbXBhbnlBZG1pbikge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAke2FjdGl2ZUNvbS5iYXNlVXJsc1ttZW51LmFwcFR5cGVdfS8ke21lbnUucGF0aH0vJHthY3RpdmVDb20uaWR9YDtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgJHthY3RpdmVDb20uYmFzZVVybHNbbWVudS5hcHBUeXBlXX0vJHttZW51LnBhdGh9YDtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcGFueUxpc3QoKSB7XG4gICAgdGhpcy5faGVhZGVyU2VyLmdldENvbXBhbnlMaXN0KCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh2OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5faGVhZGVyU2VyLnNldENvbXBhbnlMaXN0KHYpO1xuICAgICAgICB0aGlzLmNvbXBhbnlMaXN0ID0gdjtcbiAgICAgICAgdGhpcy5zZWxlY3RDdXJyZW50Q29tcGFueSgpO1xuICAgICAgICB0aGlzLnBhdGNoQ3VycmVudENvbXBhbnlJbmZvKCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBnZXRNZW51TGlzdCgpIHtcbiAgICB0aGlzLl9oZWFkZXJTZXIuZ2V0TWVudUxpc3QoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHY6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9oZWFkZXJTZXIuc2V0TWVudVN0YXRlKHYpO1xuICAgICAgICB0aGlzLm1lbnVMaXN0ID0gdGhpcy5ncm91cEJ5QXBwVHlwZSh2KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJvZmlsZSgpIHtcbiAgICB0aGlzLm1lbnVUcmlnZ2VyLmNsb3NlTWVudSgpO1xuICAgIGlmICh0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLmFwcFR5cGUgPT0gUFJPRkVUX0FQUFMucHJvZmV0X3BvcnRhbCkge1xuICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlQnlVcmwoJy9hcHAvcHJvZmlsZScpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCB1cmwgPSB0aGlzLmFjdGl2ZUNvbXBhbnk/LmJhc2VVcmxzLnByb2ZldF9wb3J0YWwgKyAnL2FwcC9wcm9maWxlJztcbiAgICAgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgfVxuICB9XG4gIG9uTG9nb3V0Q2xpY2soKSB7XG4gICAgdGhpcy5tZW51VHJpZ2dlci5jbG9zZU1lbnUoKTtcbiAgICAvLyBTeW5jIHdpdGggb3RoZXIgdGFic1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sYXN0UHJvY2Vzc2VkTG9nb3V0VGltZXN0YW1wID0gbm93O1xuICAgIHRoaXMuX2hlYWRlclNlci5zZXRDb29raWUodGhpcy5faGVhZGVyU2VyLlNFU1NJT05fRVhQSVJFRF9LRVksIG5vdy50b1N0cmluZygpLCAxKTtcblxuICAgIC8vIENsZWFyIHRpbWVyc1xuICAgIGlmICh0aGlzLmluYWN0aXZpdHlUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5pbmFjdGl2aXR5VGltZW91dCk7XG4gICAgaWYgKHRoaXMubG9nb3V0Q2hlY2tJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwpO1xuXG4gICAgdGhpcy5sb2dvdXRFdmVudC5lbWl0KCk7XG4gICAgbGV0IHNlc3Npb25VcmwgPSB0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLnNpZ25PdXRVcmw7XG4gICAgLy8gaWYgKHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuZW5hYmxlTGFzdFVybFJlZGlyZWN0aW9uKSB7XG4gICAgLy8gICBjb25zdCBzZXBhcmF0b3IgPSBzZXNzaW9uVXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgLy8gICBzZXNzaW9uVXJsID0gc2Vzc2lvblVybCArIHNlcGFyYXRvciArICdyZXR1cm5Vcmw9JyArIGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgLy8gfVxuXG4gICAgc2lnbk91dCh7IGdsb2JhbDogdHJ1ZSwgb2F1dGg6IHsgcmVkaXJlY3RVcmw6IHNlc3Npb25VcmwgfSB9KVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgd2luZG93Lm9wZW4oc2Vzc2lvblVybCwgJ19zZWxmJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgc2lnbk91dCh7IGdsb2JhbDogdHJ1ZSwgb2F1dGg6IHsgcmVkaXJlY3RVcmw6IHNlc3Npb25VcmwgfSB9KVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHNlc3Npb25VcmwsICdfc2VsZicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gY29uc29sZS5sb2coZXJyb3IpKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTGFzdEFjY2Vzc2VkQXBwSW5mbygpIHtcbiAgICBsZXQgcmVxID0ge1xuICAgICAgbGFzdEFjY2Vzc2VkQXBwbGljYXRpb246IHRoaXMuX2hlYWRlclNlci5oZWFkZXJDb25maWcuYXBwVHlwZVxuICAgIH07XG5cbiAgICB0aGlzLl9oZWFkZXJTZXIudXBkYXRlTGFzdEFjY2Vzc2VkQXBwbGljYXRpb24ocmVxKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzd2l0Y2hDb21wYW55KGluZm86IGFueSkge1xuICAgIGxldCBjb21wYW55ID0gaW5mby52YWx1ZTtcbiAgICBsZXQgY29tSW5mbyA9IHtcbiAgICAgIGFjdGl2ZUNvbXBhbnk6IHRoaXMuYWN0aXZlQ29tcGFueT8ubmFtZSxcbiAgICAgIHN3aXRjaGluZ0NvbXBhbnk6IGNvbXBhbnkubmFtZVxuICAgIH07XG4gICAgdGhpcy5faGVhZGVyU2VyLl9kaWFsb2cub3BlbihDb21wYW55U3dpdGNoV2FybmluZ0NvbXBvbmVudCwgeyBkYXRhOiBjb21JbmZvIH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGRvbWFpbiBpbmZvcm1hdGlvblxuICAgICAgICBpZiAoIWNvbXBhbnkuaXNBY3RpdmUpIHtcbiAgICAgICAgICAvLyBsZXQgZG9tYWluSW5mbyA9IHRoaXMuX2hlYWRlclNlci5nZXREb21haW5JbmZvKCk7XG4gICAgICAgICAgLy8gaWYgKGRvbWFpbkluZm8pIHtcbiAgICAgICAgICBsZXQgcmVxOiBhbnkgPSB7XG4gICAgICAgICAgICBjb21wYW55S2V5OiBjb21wYW55LmNvbXBhbnlLZXksXG4gICAgICAgICAgICBhcHBOYW1lOiB0aGlzLl9oZWFkZXJTZXIuaGVhZGVyQ29uZmlnLmFwcFR5cGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLl9oZWFkZXJTZXIudXBkYXRlVXNlckNvbXBhbnkocmVxKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnR5cGUgJiYgcmVzcG9uc2UudHlwZSA9PSAnT0snKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuYXBwbGljYXRpb25VUkwpIHtcbiAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSByZXNwb25zZS5kYXRhLmFwcGxpY2F0aW9uVVJMO1xuICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgY3VycmVudCBwYWdlIHRvIHJlbG9hZCB0aGUgY29udGVudHMgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcGFueVxuICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGEgbWVzc2FnZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb21wYW55IGNvdWxkIG5vdCBiZSBzd2l0Y2hlZC5cbiAgICAgICAgICAgICAgICB0aGlzLl9zbmFja2Jhci5vcGVuKFxuICAgICAgICAgICAgICAgICAgJ0NvbXBhbnkgY291bGQgbm90IGJlIHN3aXRjaGVkLiBQbGVhc2UgdHJ5IGFnYWluIG9yIGNvbnRhY3Qgc3VwcG9ydC4nLFxuICAgICAgICAgICAgICAgICAgJ09LJyxcbiAgICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDUwMDAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGUpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5wYXRjaEN1cnJlbnRDb21wYW55SW5mbygpO1xuICAgICAgICAgICAgICAvLyBkaXNwbGF5IGEgbWVzc2FnZSB0byB0aGUgdXNlciB0aGF0IHRoZSBjb21wYW55IGNvdWxkIG5vdCBiZSBzd2l0Y2hlZC5cbiAgICAgICAgICAgICAgdGhpcy5fc25hY2tiYXIub3BlbihcbiAgICAgICAgICAgICAgICAnQ29tcGFueSBjb3VsZCBub3QgYmUgc3dpdGNoZWQuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0LicsXG4gICAgICAgICAgICAgICAgJ09LJyxcbiAgICAgICAgICAgICAgICB7IGR1cmF0aW9uOiA1MDAwIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gfSBcbiAgICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgICAvLyAgIHRoaXMucGF0Y2hDdXJyZW50Q29tcGFueUluZm8oKTtcbiAgICAgICAgICAvLyAgIHRoaXMuX3NuYWNrYmFyLm9wZW4oXG4gICAgICAgICAgLy8gICAgICdDb21wYW55IGNvdWxkIG5vdCBiZSBzd2l0Y2hlZC4gUGxlYXNlIHRyeSBhZ2FpbiBvciBjb250YWN0IHN1cHBvcnQuJyxcbiAgICAgICAgICAvLyAgICAgJ09LJyxcbiAgICAgICAgICAvLyAgICAgeyBkdXJhdGlvbjogNTAwMCB9XG4gICAgICAgICAgLy8gICApO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMucGF0Y2hDdXJyZW50Q29tcGFueUluZm8oKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluYWN0aXZpdHlUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5pbmFjdGl2aXR5VGltZW91dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvZ291dENoZWNrSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5sb2dvdXRDaGVja0ludGVydmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxtYXQtc2lkZW5hdi1jb250YWluZXIgY2xhc3M9XCJhcHAtbWVudS1zaWRlbmF2LWNvbnRhaW5lclwiPlxuICAgIDxtYXQtc2lkZW5hdiBjZGtNZW51QmFyICNzaWRlbmF2IG1vZGU9XCJvdmVyXCIgY2xhc3M9XCJzaWRlbmF2RHJhd2VyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXJIZWFkTG9nb1wiPjxpbWcgW3NyY109XCJfZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwoaW1hZ2VEYXRhVXJscy5wcm9mZXRMb2dvKVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW1lbnUtY29udGVudC1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhcHBUeXBlIG9mIG1lbnVMaXN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcExpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImFwcENvbmZpZ1thcHBUeXBlLmtleV0/LmFwcExvZ29VcmlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJfZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwoYXBwQ29uZmlnW2FwcFR5cGUua2V5XT8uYXBwTG9nb1VyaSlcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViSGVhZExpc3RJdGVtc1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFwcFR5cGUudmFsdWVcIiBjbGFzcz1cIm1lbnUtaXRlbVwiIChjbGljayk9XCJtZW51U2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLW1lbnUnOiBpdGVtIHwgYWN0aXZlUm91dGUgOiBfcm91dGVyLnVybDpfaGVhZGVyU2VyLmhlYWRlckNvbmZpZy5hcHBUeXBlfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWVudUljb25MaXN0XCIgKm5nSWY9XCJpdGVtLmljb25cIj57eyBpdGVtLmljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5tZW51TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtc2lkZW5hdj5cblxuPC9tYXQtc2lkZW5hdi1jb250YWluZXI+XG48bWF0LXRvb2xiYXIgY2RrTWVudUJhciBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cImhlYWRlci13cmFwcGVyIGNvbW1vbl9oZWFkZXIgc2hhZG93LXNtXCI+XG4gICAgPCEtLSBNYWluIG5hdiBidXR0b24gYW5kIG5hdmlnYXRpb24gbGlua3MgLS0+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ0aGVtZS13aGl0ZVwiIChjbGljayk9XCJzaWRlbmF2LnRvZ2dsZSgpXCJcbiAgICAgICAgY2xhc3M9XCJwbXgtYnV0dG9uIHBteC1tZW51LWJ1dHRvbiBvcmRlcnMtbWVudSBpY29uLWJ0biBtcy0wIG1lLTNcIiBhcmlhLWxhYmVsPVwibWFpbiBtZW51XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgbWF0VG9vbHRpcD1cIk1haW4gbWVudVwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwicG9jLWhlYWRlci10b29sdGlwXCI+PG1hdC1pY29uPm1lbnU8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgIDxhIGNsYXNzPVwibmF2YmFyLWJyYW5kIG1lLWF1dG9cIiBocmVmPVwiI1wiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiX2RvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGFwcENvbmZpZ1tfaGVhZGVyU2VyLmhlYWRlckNvbmZpZy5hcHBUeXBlXT8uYXBwTG9nb1VyaSlcIlxuICAgICAgICAgICAgYWx0PVwiQXBwIExvZ29cIiBjbGFzcz1cImFwcC1sb2dvXCI+XG4gICAgPC9hPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJzd2l0Y2hDb21wYW55RmllbGRcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5Db21wYW55PC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJjb21wYW55Q29udHJvbFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwic3dpdGNoQ29tcGFueSgkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0IG9mIGNvbXBhbnlMaXN0XCIgW3ZhbHVlXT1cIm9wdFwiPlxuICAgICAgICAgICAgICAgIHt7b3B0Lm5hbWV9fVxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuXG4gICAgPCEtLSBQcm9maWxlIGJ1dHRvbiBhbmQgcHJvZmlsZSBkcm9wZG93biBsaW5rcyAtLT5cbiAgICA8YnV0dG9uIGNsYXNzPVwicG14LWJ1dHRvbiBwbXgtbWVudS1idXR0b24gcHJvZmlsZS1idXR0b25cIiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2ZpbGUtaW5uZXJcIj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJyYW5kLWxvZ28gYWxpZ24tc2VsZi1jZW50ZXJcIiAqbmdJZj1cImFjdGl2ZUNvbXBhbnk/LmxvZ29cIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGl2ZUNvbXBhbnk/LmxvZ28gPyAnYnJhbmRlZC1sb2dvLXRydWUnIDogJ2JyYW5kZWQtbG9nby1mYWxzZSdcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIGFjdGl2ZUNvbXBhbnk/LmxvZ28gKyAnKSd9XCI+PC9kaXY+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhclwiPlxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJ1c2VySW1hZ2VMaW5rO2Vsc2UgZGVmYXVsdEF2YXRhclwiIFtzcmNdPVwidXNlckltYWdlTGlua1wiIGNsYXNzPVwiYXZhdGFyLWltYWdlXCIgYWx0PVwiQXZhdGFyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0QXZhdGFyPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiX2RvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGltYWdlRGF0YVVybHMuZGVmYXVsdFVzZXJJbWFnZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdmF0YXItZGVmYXVsdFwiIGFsdD1cInByb2ZpbGUgcGljXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJhY2NvdW50c19kcnBtZW51IHBteC1tZW51LWdyb3VwIGhlYWRlci1kcm9wZG93bi1wcm9maWxlXCIgeFBvc2l0aW9uPVwiYmVmb3JlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnQgc2hvdy1tZW51XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItdXNlci10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwidXNlckltYWdlTGluaztlbHNlIGRlZmF1bHRMYXJnZUF2YXRhclwiIFtzcmNdPVwidXNlckltYWdlTGlua1wiIGNsYXNzPVwiYXZhdGFyLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkF2YXRhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TGFyZ2VBdmF0YXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKCcgKyBpbWFnZURhdGFVcmxzLmRlZmF1bHRVc2VySW1hZ2UgKyAnKSd9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhdmF0YXItaWNvbiBkZWZhdWx0LWF2YXRhclwiIGFsdD1cIkF2YXRhciBpY29uXCI+Jm5ic3A7PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwicHJvZmlsZS1uYW1lXCI+PHNwYW4gKm5nSWY9XCJ1c2VyQXV0aERhdGFcIj57eyB1c2VyQXV0aERhdGE/LmZpcnN0TmFtZSB9fSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQXV0aERhdGE/Lmxhc3ROYW1lIH19PC9zcGFuPjwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiBjbGFzcz1cInBteC1idXR0b24gYnRuIGJ0bi1zbWFsbCB2aWV3LXByb2ZpbGUgbXMtMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInByb2ZpbGUoKVwiPlZpZXcgUHJvZmlsZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItYm9keVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInBvcG92ZXItY29udGVudC10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cD5PdmVydmlldzwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlckF1dGhEYXRhPy5lbWFpbFwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtdGV4dCBsaXN0LXRleHQtZW1haWwgbXQtMiBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsaXN0LWljb25cIj5tYWlsPC9tYXQtaWNvbj48c3BhbiBjbGFzcz1cInBteC1sb3dlci1jYXNlIHBteC10ZXh0LXdyYXAgbWUtYXV0b1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckF1dGhEYXRhPy5lbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyQXV0aERhdGE/LmNvbnRhY3RQaG9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtdGV4dCBtYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsaXN0LWljb25cIj5jYWxsPC9tYXQtaWNvbj48c3BhbiBjbGFzcz1cInRpdGxlLWNhc2UgbWUtYXV0b1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckF1dGhEYXRhPy5jb250YWN0UGhvbmUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxociAvPlxuICAgICAgICAgICAgICAgIDx1bCBjZGtNZW51IGNsYXNzPVwibGlzdC1ncm91cCBsYXN0LWdyb3VwIG15LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNka01lbnVJdGVtIGNsYXNzPVwibGlzdC1pdGVtIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBjbGFzcz1cInBteC1idXR0b24gbGlzdC1idXR0b24gYnRuLWxvZ291dFwiIChjbGljayk9XCJvbkxvZ291dENsaWNrKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cG93ZXJfc2V0dGluZ3NfbmV3PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpc3QtdGV4dFwiPkxvZ291dDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbWVudT5cbjwvbWF0LXRvb2xiYXI+Il19
@@ -473,6 +473,8 @@ class HeaderComponent {
473
473
  this._snackbar = inject(MatSnackBar);
474
474
  this._headerSer = inject(CommonHeaderService);
475
475
  this._domSanitizer = inject(DomSanitizer);
476
+ this.componentInitTime = 0;
477
+ this.lastProcessedLogoutTimestamp = 0;
476
478
  this.INACTIVITY_LIMIT = 30 * 60 * 1000; // 30 minutes
477
479
  this.logoutEvent = new EventEmitter();
478
480
  this.companyControl = new FormControl();
@@ -512,9 +514,15 @@ class HeaderComponent {
512
514
  // },
513
515
  // });
514
516
  // }
515
- this.resetTimer();
516
- // Clear any stale logout signal on init
517
- this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, '', -1);
517
+ // Capture when this component/app was loaded
518
+ this.componentInitTime = Date.now();
519
+ // Remove legacy boolean check or reset if needed, but primarily we rely on timestamps now.
520
+ // We do NOT want to clear the cookie immediately on init if it's a valid persistent signal,
521
+ // but the timestamp check guards against "looping" on reload.
522
+ // However, if we want to support "fresh login means fresh session", we might just ignore old timestamps (which we do via > initTime check).
523
+ // So distinct cleanup isn't strictly necessary if the login page no longer deletes it.
524
+ // But let's leave it as is or remove it. The user's issue was "delete cookie" logic on LOGIN PAGE caused race condition.
525
+ // Here we just want to start monitoring.
518
526
  this.startLogoutCheck();
519
527
  });
520
528
  }
@@ -550,16 +558,26 @@ class HeaderComponent {
550
558
  startLogoutCheck() {
551
559
  // Poll for the logout signal cookie (works across ports/subdomains)
552
560
  this.logoutCheckInterval = setInterval(() => {
553
- if (this._headerSer.getCookie(this._headerSer.SESSION_EXPIRED_KEY)) {
554
- // Check if tab still "active" according to the shared time
555
- // If tab is active but receiving a logout signal, it implies a MANUAL logout from another tab.
556
- // If tab is inactive and receiving a logout signal, it implies a TIMEOUT.
557
- const lastActive = this._headerSer.getCookie(this._headerSer.LAST_ACTIVE_SESSION_KEY);
558
- const now = Date.now();
559
- const lastActiveTime = lastActive ? parseInt(lastActive, 10) : 0;
560
- const elapsed = now - lastActiveTime;
561
- const isManual = elapsed < this.INACTIVITY_LIMIT;
562
- this.handleLogout(false, false, isManual);
561
+ const logoutCookie = this._headerSer.getCookie(this._headerSer.SESSION_EXPIRED_KEY);
562
+ if (logoutCookie) {
563
+ const logoutTimestamp = parseInt(logoutCookie, 10);
564
+ // 1. Check if it's a valid number (legacy 'true' string support is irrelevant if we fully switch, but safe to check NaN)
565
+ if (!isNaN(logoutTimestamp)) {
566
+ // 2. Check if this logout event happened AFTER this app was initialized
567
+ // This prevents infinite loops if the user just logged in and the cookie is still there.
568
+ if (logoutTimestamp > this.componentInitTime) {
569
+ // 3. Check if we haven't already processed this exact logout event
570
+ if (logoutTimestamp > this.lastProcessedLogoutTimestamp) {
571
+ this.lastProcessedLogoutTimestamp = logoutTimestamp;
572
+ const lastActive = this._headerSer.getCookie(this._headerSer.LAST_ACTIVE_SESSION_KEY);
573
+ const now = Date.now();
574
+ const lastActiveTime = lastActive ? parseInt(lastActive, 10) : 0;
575
+ const elapsed = now - lastActiveTime;
576
+ const isManual = elapsed < this.INACTIVITY_LIMIT;
577
+ this.handleLogout(false, false, isManual);
578
+ }
579
+ }
580
+ }
563
581
  }
564
582
  }, 2000); // Check every 2 seconds
565
583
  }
@@ -569,14 +587,17 @@ class HeaderComponent {
569
587
  // return;
570
588
  // }
571
589
  if (broadcast) {
572
- // Set a cookie to signal other tabs/ports
573
- this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, 'true', 1);
590
+ // Set a cookie to signal other tabs/ports with the current TIMESTAMP
591
+ // This timestamp allows other tabs to know if this is a "new" logout event relative to their session start.
592
+ const now = Date.now();
593
+ this.lastProcessedLogoutTimestamp = now; // Don't logout myself again based on this
594
+ this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, now.toString(), 1);
574
595
  }
575
596
  this.logoutEvent.emit();
576
597
  let sessionUrl = this._headerSer.headerConfig.signOutUrl;
577
598
  if (this._headerSer.headerConfig.enableLastUrlRedirection) {
578
599
  const separator = sessionUrl.includes('?') ? '&' : '?';
579
- sessionUrl = sessionUrl + separator + 'returnUrl=' + encodeURIComponent(window.location.href);
600
+ sessionUrl = sessionUrl + separator + 'redirectUrl=' + encodeURIComponent(window.location.href);
580
601
  }
581
602
  // Only add sessionExpired params if it is NOT a manual logout
582
603
  if (!isManual) {
@@ -694,7 +715,9 @@ class HeaderComponent {
694
715
  onLogoutClick() {
695
716
  this.menuTrigger.closeMenu();
696
717
  // Sync with other tabs
697
- this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, 'true', 1);
718
+ const now = Date.now();
719
+ this.lastProcessedLogoutTimestamp = now;
720
+ this._headerSer.setCookie(this._headerSer.SESSION_EXPIRED_KEY, now.toString(), 1);
698
721
  // Clear timers
699
722
  if (this.inactivityTimeout)
700
723
  clearTimeout(this.inactivityTimeout);
@@ -702,10 +725,10 @@ class HeaderComponent {
702
725
  clearInterval(this.logoutCheckInterval);
703
726
  this.logoutEvent.emit();
704
727
  let sessionUrl = this._headerSer.headerConfig.signOutUrl;
705
- if (this._headerSer.headerConfig.enableLastUrlRedirection) {
706
- const separator = sessionUrl.includes('?') ? '&' : '?';
707
- sessionUrl = sessionUrl + separator + 'returnUrl=' + encodeURIComponent(window.location.href);
708
- }
728
+ // if (this._headerSer.headerConfig.enableLastUrlRedirection) {
729
+ // const separator = sessionUrl.includes('?') ? '&' : '?';
730
+ // sessionUrl = sessionUrl + separator + 'returnUrl=' + encodeURIComponent(window.location.href);
731
+ // }
709
732
  signOut({ global: true, oauth: { redirectUrl: sessionUrl } })
710
733
  .then((data) => {
711
734
  window.open(sessionUrl, '_self');