@esfaenza/httpservice 11.2.60 → 11.2.61

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.
@@ -413,6 +413,9 @@ export class HTTPService {
413
413
  // In ogni caso questa posso rimuoverla
414
414
  delete this.callStatus[guid];
415
415
  }
416
+ // Se non ho nessun'altra chiamata in corso considero la situazione stabilizzatasi
417
+ if (Object.keys(this.callStatus).length == 0)
418
+ this.Stabilized.next(true);
416
419
  // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata
417
420
  if (cacheInfos && cacheInfos.cache) {
418
421
  this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;
@@ -433,7 +436,6 @@ export class HTTPService {
433
436
  toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));
434
437
  }
435
438
  this.log(this.loc("No more HTTP calls to be executed, entering idle state and persisting modified caches") + "...");
436
- this.Stabilized.next(true);
437
439
  var ret = yield forkJoin(toCall).toPromise();
438
440
  if (ret)
439
441
  this.log(this.loc("Caches succesfully persisted"));
@@ -771,4 +773,4 @@ HTTPService.ctorParameters = () => [
771
773
  { type: CacheService },
772
774
  { type: UtilityService }
773
775
  ];
774
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQWEsYUFBYSxFQUFFLFdBQVcsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUN6SixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsWUFBWTtBQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRSxrQ0FBa0M7QUFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4SCxXQUFXO0FBQ1gsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVFqRDs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sV0FBVztJQTZCdEI7O09BRUc7SUFDSCxZQUNVLGVBQXNDLEVBQ0MsaUJBQWlCLEVBQ3ZCLE1BQU0sRUFDVCxRQUFRLEVBQ08sdUJBQXVCLEVBQ2pDLGFBQXNCLEVBQ3pCLFVBQW1CLEVBQ25ELElBQWdCLEVBQ2hCLFlBQTBCLEVBQzFCLFFBQXdCOztRQVR4QixvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFDQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQUE7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBQTtRQUNULGFBQVEsR0FBUixRQUFRLENBQUE7UUFDTyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQUE7UUFDakMsa0JBQWEsR0FBYixhQUFhLENBQVM7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQUNuRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBeENsQyxtS0FBbUs7UUFDM0osZUFBVSxHQUF3RCxFQUFFLENBQUM7UUFDN0UsMkhBQTJIO1FBQ25ILDZCQUF3QixHQUFHLElBQUksQ0FBQztRQUN4QyxrTEFBa0w7UUFDMUssa0NBQTZCLEdBQUcsSUFBSSxDQUFDO1FBQzdDLG9HQUFvRztRQUM1RixtQ0FBOEIsR0FBRyxJQUFJLENBQUM7UUFDOUMscUxBQXFMO1FBQzdLLE9BQUUsR0FBeUMsSUFBSSxDQUFDO1FBQ3hELDJFQUEyRTtRQUNuRSwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDL0MseUZBQXlGO1FBQ2pGLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUNqRCx1SUFBdUk7UUFDaEksZUFBVSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBU3ZELDRJQUE0STtRQUNySSw0QkFBdUIsR0FBYSxFQUFFLENBQUM7UUFrQjVDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLHdCQUF3QixHQUFHLE9BQUMsSUFBSSxDQUFDLFFBQVEsbUNBQUksS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDNUYsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQUMsSUFBSSxDQUFDLFFBQVEsbUNBQUksS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztRQUN0RyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQztRQUVoRixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ1csc0JBQXNCOztZQUNsQyxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVM7Z0JBQ3hCLE9BQU87WUFFVCxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzVELFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDdkQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzdDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVuRCxNQUFNLFFBQVEsQ0FBQztnQkFDYixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsT0FBTyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsU0FBUyxDQUFDO2FBQ3BFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUVmLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztLQUFBO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxHQUFHLENBQUksR0FBVyxFQUFFLFNBQXFCLElBQUksRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFFLDJCQUFvQyxJQUFJLEVBQUUsZ0JBQTBCLElBQUk7UUFDOUkseUJBQXlCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzVDLFNBQVMsQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1lBQzNCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUQsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztnQkFDdEYsT0FBTyxFQUFFLENBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDekc7WUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFakgsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixHQUFHLENBQUMsQ0FBQyxHQUFNLEVBQUUsRUFBRTtnQkFDYixJQUFJLFlBQVksR0FBTSxHQUFHLENBQUM7Z0JBRTFCLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTtvQkFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2lCQUNyRDtnQkFFRCxPQUFPLFlBQVksQ0FBQztZQUN0QixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFpQixFQUFFO2dCQUN4QyxJQUFJLGFBQWE7b0JBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9HLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2pFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ksTUFBTSxDQUFDLEdBQVcsRUFBRSxTQUFxQixJQUFJLEVBQUUsT0FBK0IsYUFBYSxFQUFFLFdBQVcsR0FBRyxFQUFFLEVBQUUsMkJBQW9DLElBQUksRUFBRSxhQUFhLEdBQUcsSUFBSTtRQUNsTCxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM1QyxTQUFTLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUMzQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVELElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFO2dCQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLE9BQU8sRUFBRSxDQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNHO1lBRUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksRUFBTyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFdkksT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixHQUFHLENBQUMsQ0FBQyxJQUF3QixFQUFFLEVBQUU7Z0JBRS9CLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTtvQkFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztpQkFDckQ7Z0JBRUQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFvQixFQUFFO2dCQUMzQyxJQUFJLGFBQWE7b0JBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQ25DLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9HLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2pFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7OztNQVdFO0lBQ0ssSUFBSSxDQUFJLEdBQVcsRUFBRSxRQUFhLEVBQUUsU0FBcUIsSUFBSSxFQUFFLFdBQVcsR0FBRyxFQUFFLEVBQUUsMkJBQW9DLElBQUk7UUFDOUgsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUMsU0FBUyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFFM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBRTNHLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBaUIsRUFBRTtnQkFDeEMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0csQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7OztNQVVFO0lBQ0ssTUFBTSxDQUFJLEdBQVcsRUFBRSxTQUFxQixJQUFJLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSwyQkFBb0MsSUFBSTtRQUVqSCxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM1QyxTQUFTLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUUzQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUVuRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQ2xCLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQWlCLEVBQUU7Z0JBQ3hDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQy9HLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxHQUFHLENBQUksR0FBVyxFQUFFLFFBQWEsRUFBRSxTQUFxQixJQUFJLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSwyQkFBb0MsSUFBSTtRQUM3SCxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM1QyxTQUFTLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUUzQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFMUcsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFpQixFQUFFO2dCQUN4QyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvRyxDQUFDLENBQUMsRUFDRixRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxhQUFhLENBQUksR0FBVyxFQUFFLFFBQWEsRUFBRSxlQUE4QixFQUFFLFNBQXFCLElBQUk7UUFDM0csT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDNUMsU0FBUyxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUU7WUFFM0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUVsRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBSSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFdEgsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUNsQixVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFpQixFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQy9HLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksV0FBVyxDQUFJLEdBQVcsRUFBRSxRQUFXLEVBQUUsUUFBZ0IsRUFBRSxlQUF1RCxFQUFFLGVBQTBCLElBQUksRUFBRSxjQUF1QixJQUFJLEVBQUUsSUFBaUI7UUFDdk0sSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3pILFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQXNCLEVBQUU7WUFDN0MsSUFBSSxZQUFZLElBQUksQ0FBQyxXQUFXO2dCQUFFLFlBQVksRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNwRCxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTs7WUFDM0MsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksRUFBRSwyQkFBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsMkNBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLDJDQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQ0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVwSSxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLFlBQVk7Z0JBQUUsWUFBWSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksT0FBTyxDQUFDLEdBQVcsRUFBRSxTQUFxQixJQUFJLEVBQUUsUUFBZ0IsRUFBRSxlQUF1RCxFQUFFLGVBQTBCLElBQUksRUFBRSxjQUF1QixJQUFJO1FBQzNMLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ2hILFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQXNCLEVBQUU7WUFDN0MsSUFBSSxZQUFZLElBQUksQ0FBQyxXQUFXO2dCQUFFLFlBQVksRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNwRCxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTs7WUFDM0MsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksRUFBRSwyQkFBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsMkNBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLDJDQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQ0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVwSSxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLFlBQVk7Z0JBQUUsWUFBWSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsR0FBVyxFQUFFLFNBQXFCLElBQUk7UUFFekQsd0RBQXdEO1FBQ3hELHdDQUF3QztRQUN4QywrQkFBK0I7UUFDL0IsMkNBQTJDO1FBQzNDLCtGQUErRjtRQUUvRixJQUFJLFFBQVEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNJLG1CQUFtQixDQUFDLEdBQVcsRUFBRSxTQUFxQixJQUFJLEVBQUUsZUFBdUQ7UUFDeEgsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDckksSUFBSSxDQUNILElBQUksQ0FBQyxDQUFDLFFBQWtCLEVBQUUsS0FBc0IsRUFBWSxFQUFFO1lBRTVELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNuQyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztnQkFDckksT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7YUFDbkU7WUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtvQkFDZCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDckcsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwRCxlQUFlLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUN4QztnQkFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7YUFDN0Q7WUFFRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ3BELFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQXdCLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsRUFDaEgsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNwRCxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ00sY0FBYyxDQUFJLEtBQW1CO1FBQzVDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsUUFBUSxDQUFBO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLEtBQXlCO1FBQ25ELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsY0FBYyxDQUFBO0lBQ3JHLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQ2xDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHNCQUFzQixDQUFDLEdBQVc7UUFDeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDL0UsSUFBSSxHQUFHLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDcEMsSUFBSSxpQkFBaUIsR0FBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEYsSUFBSSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBRWxGLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO1lBQzdFLE9BQU87UUFFVCxJQUFJLGdCQUFnQixHQUFhLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDbkQsT0FBTztRQUVULElBQUksWUFBWSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLO2dCQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQjtRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ1csaUJBQWlCLENBQUMsSUFBWSxFQUFFLFVBQXVCOztZQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFN00saUhBQWlIO1lBQ2pILElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsd0hBQXdIO2dCQUN4SCw2Q0FBNkM7Z0JBQzdDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDOUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFcEQsNERBQTREO2dCQUM1RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQy9ELElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUN6QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBRXJDLHVDQUF1QztnQkFDdkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO1lBRUQsOEhBQThIO1lBQzlILElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO2dCQUNuRixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbURBQW1ELENBQUMsQ0FBQyxDQUFDO2FBQ3pFO1lBRUQsc0pBQXNKO1lBQ3RKLHNDQUFzQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBRTVHLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtvQkFDOUIsTUFBTSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztvQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFFRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDaEMsTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztvQkFDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4RjtnQkFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsdUZBQXVGLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDcEgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTNCLElBQUksR0FBRyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLEdBQUc7b0JBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQzs7b0JBRW5ELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7Z0JBQ25DLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7YUFDdEM7UUFDSCxDQUFDO0tBQUE7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGdCQUFnQixDQUFDLGVBQW9CO1FBQzNDLElBQUksUUFBUSxHQUFhLElBQUksUUFBUSxFQUFFLENBQUM7UUFFeEMsSUFBSSxlQUFlLEVBQUU7WUFDbkIsSUFBSSxlQUFlLENBQUMsTUFBTTtnQkFDeEIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkUsSUFBSSxlQUFlLENBQUMsSUFBSTtnQkFDM0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRTtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxVQUFVLENBQUMsYUFBYSxHQUFHLEVBQUUsRUFBRSxjQUF1QixJQUFJLEVBQUUsY0FBc0Isa0JBQWtCLEVBQUUsU0FBaUIsa0JBQWtCOztRQUMvSSxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUxRCxJQUFJLFdBQVc7WUFDYixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFeEQsSUFBSSxhQUFhO1lBQ2YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRXJELElBQUksU0FBUyxJQUFJLFdBQVc7WUFDMUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUVuRSxJQUFJLE1BQU07WUFDUixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFN0MsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLFFBQUUsSUFBSSxDQUFDLE1BQU0sbUNBQUksT0FBTyxDQUFDLENBQUM7UUFDcEUsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ1csT0FBTyxDQUFDLEdBQWtDLEVBQUUsSUFBWTs7WUFDcEUsSUFBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBRXhDLGdGQUFnRjtZQUNoRixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUNyRixPQUFPO2FBQ1I7WUFFRCx3REFBd0Q7WUFDeEQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3REFBd0QsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDMUYsT0FBTzthQUNSOztnQkFFQyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXJELElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixVQUFVLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDekIsV0FBVyxHQUFHLDZCQUE2QixDQUFDO2FBQzdDO2lCQUNJLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUV0QyxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwRCxXQUFXLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFcEMsUUFBUSxHQUFHLENBQUMsTUFBTSxFQUFFO29CQUNsQixlQUFlO29CQUNmLEtBQUssR0FBRzt3QkFDTixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsRUFBRTs0QkFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLENBQUM7NEJBQ2hJLE9BQU87eUJBQ1I7d0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7d0JBQy9GLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ3RDLE9BQU87b0JBQ1Qsb0JBQW9CO29CQUNwQixLQUFLLEdBQUcsQ0FBQztvQkFDVCxpQkFBaUI7b0JBQ2pCLEtBQUssR0FBRzt3QkFDTixJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ3BFLE9BQU87b0JBQ1QsWUFBWTtvQkFDWixLQUFLLEdBQUc7d0JBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO3dCQUN4RixPQUFPO29CQUNULHlCQUF5QjtvQkFDekIsS0FBSyxHQUFHO3dCQUNOLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRTs0QkFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLENBQUM7NkJBQzdILElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixFQUFFOzRCQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ3RFLE9BQU87b0JBQ1QsS0FBSyxDQUFDO3dCQUNKLFVBQVUsR0FBRyx5QkFBeUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2pHO2FBQ0Y7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0QsQ0FBQztLQUFBO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssZ0JBQWdCLENBQUMsR0FBUTtRQUMvQiw0RUFBNEU7UUFDNUUscUZBQXFGO1FBQ3JGLE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNyQyxJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUU7Z0JBQ3ZCLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFRLEVBQUUsRUFBRTtvQkFDM0IsSUFBSSxNQUFNLEdBQVMsQ0FBQyxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7b0JBQ3BDLElBQUksVUFBZSxDQUFDO29CQUNwQixJQUFJO3dCQUFFLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUFFO29CQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUc7b0JBQ3RELE9BQU8sT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xHLENBQUMsQ0FBQztnQkFDRixNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ3ZCO2lCQUNJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7Z0JBQzdCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7O2dCQUVsQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsUUFBUSxHQUFHLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxHQUFROztRQUMzQixPQUFPLENBQUMsUUFBQyxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsS0FBSywwQ0FBRSxPQUFPLENBQUEsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQixDQUFDLEdBQVE7UUFDbEMsT0FBTyxHQUFHLFlBQVksaUJBQWlCLENBQUM7SUFDMUMsQ0FBQztJQUVBOzs7O01BSUU7SUFDSyxXQUFXLENBQUMsR0FBUTtRQUMxQixPQUFPLEdBQUcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLHFDQUFxQyxDQUFDLEdBQVEsRUFBRSxJQUFZLEVBQUUsY0FBdUIsSUFBSTtRQUMvRixJQUFJLFdBQVc7WUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssdUJBQXVCLENBQUMsR0FBVyxFQUFFLE1BQWtCO1FBRTdELElBQUksVUFBVSxHQUFHLElBQUksRUFBRSxTQUFTLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUM7UUFDckQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxHQUFHLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRWhDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQzFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBRXRDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFBO1lBQzdGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFbkMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO2dCQUNoRiw4RkFBOEY7Z0JBQzlGLDJFQUEyRTtnQkFDM0UsSUFBSSxTQUFTO29CQUNYLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFFcEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTthQUN6QjtTQUNGO1FBRUQscUZBQXFGO1FBQ3JGLE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssYUFBYSxDQUFJLElBQU8sRUFBRSxVQUFzQjtRQUN0RCxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQTtRQUN4RyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRW5DLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksVUFBVSxDQUFDLFNBQVM7WUFDdEIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFckYsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CO1FBQ3pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0sscUJBQXFCLENBQUMsSUFBUztRQUNyQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ1UsNEJBQTRCOzs7WUFDdkMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0UsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE9BQUMsSUFBSSxDQUFDLHVCQUF1QixtQ0FBSSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDOztLQUN4STtJQUVEOztPQUVHO0lBQ1UsMEJBQTBCOztZQUNyQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0RixDQUFDO0tBQUE7SUFFRDs7Ozs7OztPQU9HO0lBQ00sWUFBWSxDQUFDLEdBQVcsRUFBRSxNQUFrQjtRQUNuRCxJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLElBQUksYUFBYSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQVMsRUFBRSxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0osT0FBTyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsYUFBYSxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssT0FBTztRQUNiLE9BQU8sc0NBQXNDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7WUFDeEUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssR0FBRyxDQUFDLE9BQWU7UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxHQUFHLENBQUMsT0FBZTtRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLENBQUE7WUFDaEQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7WUFyMkJGLFVBQVU7OztZQWZGLHFCQUFxQjs0Q0FrRHpCLFFBQVEsWUFBSSxNQUFNLFNBQUMsaUJBQWlCOzRDQUNwQyxRQUFRLFlBQUksTUFBTSxTQUFDLFdBQVc7NENBQzlCLFFBQVEsWUFBSSxNQUFNLFNBQUMsUUFBUTs0Q0FDM0IsUUFBUSxZQUFJLE1BQU0sU0FBQyx1QkFBdUI7MENBQzFDLFFBQVEsWUFBSSxNQUFNLFNBQUMsYUFBYTswQ0FDaEMsUUFBUSxZQUFJLE1BQU0sU0FBQyxVQUFVO1lBdEV6QixVQUFVO1lBSVYsWUFBWTtZQUNaLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUHJvZ3Jlc3NFdmVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRXMgRmFlbnphXHJcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvcHJlZmVyZW5jZXNcIjtcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbi8vIERpcmV0dGl2ZSwgQ29tcG9uZW50aSwgTGlicmVyaWVcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgZmluYWxpemUsIG1hcCwgc2NhbiB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRocm93RXJyb3IgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLy8gQ2hpYW1hdGUgYWkgUmVwb3NpdG9yeSAvIHRva2Vuc1xyXG5pbXBvcnQgeyBIVFRQX0lOVkFMSURBVElPTiwgQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MsIEhUVFBfTE9DQUxFLCBBUFBfTkFNRSwgQ0FDSEVfQllfVVNFUiwgREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcclxuXHJcbi8vIE1vZGVsbGkgXHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyB9IGZyb20gJy4vY29uZmlnL0h0dHBTZXJ2aWNlRXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IERvd25sb2FkIH0gZnJvbSAnLi9tb2RlbHMvRG93bmxvYWQnO1xyXG5pbXBvcnQgeyBMb2MgfSBmcm9tICcuL2h0dHBzZXJ2aWNlLnNlcnZpY2UubG9jJztcclxuaW1wb3J0IHsgQ2FjaGVJbmZvcyB9IGZyb20gXCIuL21vZGVscy9DYWNoZUluZm9zXCI7XHJcblxyXG4vKipcclxuICogRGljaGlhcmF6aW9uZSBkZWxsYSB2YXJpYWJpbGUgZ2xvYmFsZSBkYXlqcy4gTCdvbmVyZSBkaSBcImNyZWFybGFcIiDDqCBhZmZpZGF0byBhbGwnYXBwbGljYXppb25lIGNoZSB1dGlsaXp6YSBxdWVzdGEgbGlicmVyaWEsIFxyXG4gKiBjaGUgZG92csOgIGltcG9ydGFyZSBsbyBzY3JpcHQgZ2xvYmFsZSBkaSBkYXlqcyBuZWxsYSBDTElcclxuICovXHJcbmRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4vKipcclxuICogU2Vydml6aW8gdXRpbGl6emF0byBwZXIgZWZmZXR0dWFyZSBxdWFsc2lhc2kgdGlwbyBkaSBjaGlhbWF0YSBIVFRQIGRhbGwnYXBwbGljYXppb25lLCBnZXN0aXNjZSBlcnJvcmkgZSBjYWNoZSBkZWxsZSByaXNwb3N0ZSBuYXRpdmFtZW50ZSBlIG5lIHB1w7IgZXNzZXJlIFxyXG4gKiBlc3Rlc28vbW9kaWZpY2F0byBpbCBjb21wb3J0YW1lbnRvIGltcGxlbWVudGFuZG8gbGEgY2xhc3NlIGRpIFwiaG9va1wiICoqSUh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqIGUgcmVnaXN0cmFuZG9sYSBuZWwgcHJvdmlkZXIgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKipcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEhUVFBTZXJ2aWNlIHtcclxuXHJcbiAgLyoqIENhY2hlIGRlbGxvIHN0YXRvIGRlbGxlIGNoaWFtYXRlIEhUVFAgYXR0dWFsbWVudGUgZWZmZXR0dWF0ZS4gT2duaSBjaGlhbWF0YSDDqCByYXBwcmVzZW50YXRhIGRhIHVuIEdVSUQgZSBsbyBzdGF0dXMgYXNzdW1lIHZhbG9yZSAqKmZhbHNlKiogc29sbyBzdWdsaSBlcnJvcmkgKi9cclxuICBwcml2YXRlIGNhbGxTdGF0dXM6IHsgW2lkOiBzdHJpbmddOiB7IHVybDogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuIH0gfSA9IHt9O1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGUgcmlzcG9zdGUgZGVsbGUgY2hpYW1hdGUgc290dG8gZm9ybWEgZGkgZGljdGlvbmFyeSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ID0gbnVsbDtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnksIHNvbG8gcGVyIGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkZWZpbml0byBkaSBjYWNoaW5nICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsbyBzY2FkZXJlIGRlbGxhIGNhY2hlIHN0ZXNzYSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gbnVsbDtcclxuICAvKiogSWRlbnRpdMOgIGNvbGxlZ2F0YSBhbCB0b2tlbiBkaSBhdXRlbnRpY2F6aW9uZSBkYSB1c2FyZSwgcmljaGllc3RhIGFsIHByb2dyYW1tYSBjaGUgdXRpbGl6emEgbGEgbGlicmVyaWEgYXR0cmF2ZXJzbyBsJ2hvb2sgKipyZXRyaWV2ZUlkZW50aXR5KiogZGVsbGEgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKiAqL1xyXG4gIHByaXZhdGUgbWU6IHsgSWR0ZW5hbnQ6IHN0cmluZywgSWRVc2VyOiBzdHJpbmcgfSA9IG51bGw7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgYSB0ZW1wbyBkZXYnZXNzZXJlIHBlcnNpc3RpdGEgaWwgcHJpbWEgcG9zc2liaWxlICovXHJcbiAgcHJpdmF0ZSBQZXJzaXN0VGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogSW5kaWNhIGNoZSBsYSBjYWNoZSBzZW56YSBsaW1pdGkgZGkgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFVudGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogU3ViamVjdCBlbWVzc28gcXVhbmRvIGlsIHNlcnZpemlvIGh0dHAgc2kgc3RhYmlsaXp6YSwgY2lvw6ggcXVhbmRvIG5vbiBjJ8OoIG5lc3N1bmEgY2hpYW1hdGEgcGVuZGluZyBvIGluIGNvcnNvIGRhIHF1YWxjaGUgaXN0YW50ZSAqL1xyXG4gIHB1YmxpYyBTdGFiaWxpemVkOiBTdWJqZWN0PHRydWU+ID0gbmV3IFN1YmplY3Q8dHJ1ZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50YXppb25lIGRlbGxhIGNsYXNzZSBkaSBlc3RlbnNpb25lIHBlciBjb2xsZWdhcmUgaSBjb21wb3J0YW1lbnRpIGRlbGxhIGxpYnJlcmlhIGFsbCdhcHBsaWNhemlvbmUgaW4gY3VpIMOoIHVzYXRhLiBcclxuICAgKiBcclxuICAgKiBTZSDDqCBzdGF0byBlZmZldHR1YXRvIGlsIHByb3ZpZGUgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogdmVycsOgIHVzYXRvIHF1ZWwgcHJvdmlkZXIsIGFsdHJpbWVudGkgdmVycsOgIGNyZWF0YSB1bmEgbnVvdmEgaXN0YW56YSBkaSBkZWZhdWx0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBFeHRlbnNpb25zSW1wbDogSHR0cFNlcnZpY2VFeHRlbnNpb25zO1xyXG5cclxuICAvKiogTGlzdGEgZGVsbGUgdWx0aW1lIDMgY2hpYW1hdGUgY29tcGxldGF0ZSBjb24gc3VjY2Vzc28gaW4gb3JkaW5lIGRpIGNvbXBsZXRhbWVudG8gKGluIHBvc2l6aW9uZSAwIGMnw6ggbCd1bHRpbWEgY29tcGxldGF0YSBlY2NldGVyYS4uLikgKi9cclxuICBwdWJsaWMgTGFzdFRocmVlQ29tcGxldGVkQ2FsbHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgRVhURU5TSU9OX0NMQVNTOiBIdHRwU2VydmljZUV4dGVuc2lvbnMsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfSU5WQUxJREFUSU9OKSBwcml2YXRlIEhUVFBfSU5WQUxJREFUSU9OLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIVFRQX0xPQ0FMRSkgcHJpdmF0ZSBMT0NBTEUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9OQU1FKSBwcml2YXRlIEFQUF9OQU1FLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDTElFTlRfQ0FDSEVfRFVSQVRJT05fUykgcHJpdmF0ZSBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUyxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0FDSEVfQllfVVNFUikgcHJpdmF0ZSBDQUNIRV9CWV9VU0VSOiBib29sZWFuLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChERUJVR19NT0RFKSBwcml2YXRlIERFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dGlzRXh0czogVXRpbGl0eVNlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5tZSA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSA/PyBcIkFQUFwiKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FID8/IFwiQVBQXCIpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCBsc1RpbWVkKSxcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgbHNVbnRpbWVkKVxyXG4gICAgXSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJDb252ZXJ0ZWQgb2xkIHN0b3JhZ2Ugc3lzdGVtIHRvIG5ldyBvbmVcIikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgLy8gVE9ETyBwcm92YXJlIGUgdGVzdGFyZVxyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgICAgIHJldHVybiBvZjxUPihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0PFQ+KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzOiBUKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNhY2hlUmVzcG9uc2UodGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUocmVzcG9uc2VJdGVtKSwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQ2FzbyBzcGVjaWZpY28gZGkgY2hpYW1hdGEgY2hlIGRldmUgcmVzdGl0dWlyZSB1biBCbG9iIG8gdW4gQXJyYXlCdWZmZXIgbmF0aXZvIGRhIGVsYWJvcmFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtcImFycmF5YnVmZmVyXCJ8IFwiYmxvYlwifSB0eXBlIFRpcG8gZGkgcml0b3JubyByaWNoaWVzdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRSYXcodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHR5cGU6IFwiYXJyYXlidWZmZXJcIiB8IFwiYmxvYlwiID0gXCJhcnJheWJ1ZmZlclwiLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2sgPSBudWxsKTogT2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+IHtcclxuICAgIHJldHVybiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgobXlHdWlkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgY2FjaGVkSW5mb3MgPSB0aGlzLnRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybCwgcGFyYW1zKTtcclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgICAgICByZXR1cm4gb2Y8YW55PihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogPGFueT50eXBlLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKGJsb2IsIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPEJsb2I+ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkLCBjYWNoZWRJbmZvcyk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICogXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgREVMRVRFIEhUVFBcclxuICAqXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuXHJcbiAgICByZXR1cm4gZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKG15R3VpZDogc3RyaW5nKSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQVVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucHV0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgYmlzb2duYSBhbmNoZSBpbnZpYXJlIGRlaSBGaWxlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RmlsZVtdIHwgRmlsZX0gZmlsZUFycmF5T3JGaWxlIFNpbmdvbG8gZmlsZSBvIGxpc3RhIGRpIGZpbGUgZGEgaW52aWFyZS4gSWwgdGlwbyAqKkZpbGUqKiDDqCBxdWVsbG8gbmF0aXZvIGRlbCBKYXZhc2NyaXB0XHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwb3N0d2l0aEZpbGVzPFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBmaWxlQXJyYXlPckZpbGU6IEZpbGVbXSB8IEZpbGUsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgobXlHdWlkOiBzdHJpbmcpID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGZvcm1EYXRhID0gdGhpcy5nZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZSk7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiYm9keVwiLCBKU09OLnN0cmluZ2lmeShib2R5RGF0YSkpO1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCkgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCk7IH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7S30gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3RHZXRGaWxlPEs+KHVybDogc3RyaW5nLCBib2R5RGF0YTogSywgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUsIHBhcnM/OiBIdHRwUGFyYW1zKTogdm9pZCB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBib2R5RGF0YSwgeyBwYXJhbXM6IHBhcnMsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgICAgICBpZiAoYWZ0ZXJHZXRGaWxlICYmICFoYW5kbGVFcnJvcikgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCwgaGFuZGxlRXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxCbG9iPikgPT4ge1xyXG4gICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIGxldCBmbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk/LnNwbGl0KCc7JylbMV0/LnNwbGl0KCdmaWxlbmFtZScpWzFdPy5zcGxpdCgnPScpWzFdPy50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcblxyXG4gICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBmaWxlbmFtZSB8fCBmbik7XHJcbiAgICAgIGlmIChhZnRlckdldEZpbGUpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEVuY29kbyB0dXR0aSBpIHBhcmFtZXRyaSBwZXIgZXZpdGFyZSBjYXNpIHBhcnRpY29sYXJpXHJcbiAgICAvLyB2YXIgZW5jb2RlZFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAvLyBsZXQgcGFyS2V5cyA9IHBhcmFtcy5rZXlzKCk7XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhcktleXMubGVuZ3RoOyBpKyspXHJcbiAgICAvLyAgIGVuY29kZWRQYXJhbXMgPSBlbmNvZGVkUGFyYW1zLnNldChwYXJLZXlzW2ldLCBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldChwYXJLZXlzW2ldKSkpO1xyXG5cclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoL1xcKy9nLCAnJTJiJykgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc2NhbigocHJldmlvdXM6IERvd25sb2FkLCBldmVudDogSHR0cEV2ZW50PEJsb2I+KTogRG93bmxvYWQgPT4ge1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IGV2ZW50LnRvdGFsID8gKGV2ZW50LmxvYWRlZCA+IGV2ZW50LnRvdGFsID8gMTAwIDogTWF0aC5yb3VuZCgoMTAwICogZXZlbnQubG9hZGVkKSAvIGV2ZW50LnRvdGFsKSkgOiBwcmV2aW91cy5wcm9ncmVzcztcclxuICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNkaXNwID0gZXZlbnQuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGNkaXNwRmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IHByb2dyZXNzOiAxMDAsIHN0YXRlOiAnRE9ORScsIGNvbnRlbnQ6IGV2ZW50LmJvZHkgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICB9LCB7IHN0YXRlOiAnUEVORElORycsIHByb2dyZXNzOiAwLCBjb250ZW50OiBudWxsIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCkgfSksXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdldmVudG8gSFRUUCDDqCBkaSB0aXBvICoqSHR0cFJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICAgcHJpdmF0ZSBpc0h0dHBSZXNwb25zZTxUPihldmVudDogSHR0cEV2ZW50PFQ+KTogZXZlbnQgaXMgSHR0cFJlc3BvbnNlPFQ+IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUHJvZ3Jlc3NFdmVudCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50OiBIdHRwRXZlbnQ8dW5rbm93bj4pOiBldmVudCBpcyBIdHRwUHJvZ3Jlc3NFdmVudCB7XHJcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzIHx8IGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3NcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpb25lIGRlbGwnaW5pemlvIGRpIHVuYSBjaGlhbWF0YSBhZCB1biBjZXJ0byBVUkwsIHZpZW5lIGdlbmVyYXRvIHVuIEdVSUQgZGEgYXNzZWduYXJjaSwgY29udHJvbGxhdGEgbGEgc2NhZGVuemEgZGVsbGEgY2FjaGUsIFxyXG4gICAqIGUgZXZlbnR1YWxtZW50ZSBsb2dnYXRvIGlsIGZhdHRvIGNoZSBzdGEgcGVyIGVzc2VyZSBlZmZldHR1YXRhIHVuYSBjaGlhbWF0YSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVcmwgYSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdVSUQgYXNzZWduYXRvIGFsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwcml2YXRlIGRlZmF1bHRTdGFydENhbGwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZ2V0R1VJRCgpO1xyXG4gICAgdGhpcy5jaGVja0NhY2hlSW52YWxpZGF0aW9uKHVybCk7XHJcbiAgICB0aGlzLmNhbGxTdGF0dXNbbXlHdWlkXSA9IHsgdXJsOiB1cmwsIHN1Y2Nlc3M6IHRydWUgfTtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU3RhcnRpbmcgY2FsbFwiKSArIFwiIFwiICsgbXlHdWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcImF0IFVSTFwiKSArIFwiOiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbXlHdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biB1cmwgdmVuZ29ubyBjb250cm9sbGF0ZSBsZSBpbmZvcm1hemlvbmkgc3UgdHV0dGkgZ2xpIHVybCBkYSBpbnZhbGlkYXJlIGNvbGxlZ2F0aSBhbGwndXJsIGNoaWFtYXRvIGUsIHNlIHByZXNlbnRpIGluIGNhY2hlLCBpbnZhbGlkYXRpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgcGVyIGN1aSBjb250cm9sbGFyZSBzZSBjaSBzb25vIGNoaWFtYXRlIGluIGNhY2hlIGRhIGludmFsaWRhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCBjYWNoZSA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbTxhbnk+KHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgbGV0IGNhY2hlVGltZSA9IHRtcCA/IHRtcFsyXSA6IG51bGw7XHJcbiAgICBsZXQgbm9ybWFsaXplZFVybF90bXAgPSAgdXJsLnJlcGxhY2UoXCIjY2FjaGVcIiArIChjYWNoZVRpbWUgPyBcIi1cIiArIGNhY2hlVGltZSA6IFwiXCIpLCBcIlwiKTtcclxuICAgIGxldCBub3JtYWxpemVkVXJsID0gbm9ybWFsaXplZFVybF90bXAuc3Vic3RyaW5nKG5vcm1hbGl6ZWRVcmxfdG1wLmluZGV4T2YoJy9hcGknKSlcclxuXHJcbiAgICBpZiAoIWNhY2hlIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGFwaXNUb0ludmFsaWRhdGU6IHN0cmluZ1tdID0gdGhpcy5IVFRQX0lOVkFMSURBVElPTltub3JtYWxpemVkVXJsXTtcclxuICAgIGlmICghYXBpc1RvSW52YWxpZGF0ZSB8fCBhcGlzVG9JbnZhbGlkYXRlLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGtleXNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcclxuICAgIGFwaXNUb0ludmFsaWRhdGUuZm9yRWFjaChhcGkgPT4ge1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSB0aGlzLm1ha2VDYWNoZUtleShhcGksIG51bGwpO1xyXG4gICAgICBmb3IgKGxldCBpdGVtIGluIGNhY2hlKVxyXG4gICAgICAgIGlmIChpdGVtLmluZGV4T2YoY2FjaGVLZXkpICE9IC0xKVxyXG4gICAgICAgICAga2V5c1RvUmVtb3ZlLnB1c2goaXRlbSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgayA9IGtleXNUb1JlbW92ZVtpXTtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJJbnZsYWxpZGF0aW5nIGNhY2hlIGVsZW1lbnRcIikgKyBcIiBcIiArIGspO1xyXG4gICAgICBkZWxldGUgY2FjaGVba107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0TG9jYWxJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5hbGl6emF6aW9uZSBkaSB1bmEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBHVUlEIGNvbGxlZ2F0byBhbGxhIGNoaWFtYXRhIGFwcGVuYSB0ZXJtaW5hdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RDYWNoZUlmSWRsZSBFZmZldHR1YSBpbCBwZXJzaXN0IGRlbGxhIGNhY2hlIEhUVFAgc29sbyBzZSBub24gY2kgc29ubyBhbHRyZSBjaGlhbWF0ZSBpbiBjb3JzbywgcGVyIGV2aXRhcmVcclxuICAgKiBjaGUgbWkgY2FtYmkgc290dG8gbCdvZ2dldHRvIGRpIGNhY2hlIG1lbnRyZSBzdG8gc2FsdmFuZG8gbGUgaW5mb3JtYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB0cnlGaW5hbGl6ZUJ5R3VpZChndWlkOiBzdHJpbmcsIGNhY2hlSW5mb3M/OiBDYWNoZUluZm9zKSB7XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkZpbmFsaXppbmcgY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHN0YXR1c1wiKSArIFwiOiBcIiArICghdGhpcy5jYWxsU3RhdHVzW2d1aWRdID8gJ1Vua25vd24nIDogdGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vIFRPRE86IFBlcmRlcmUgMy00IG9yZSBwZXIgY2FwaXJlIHBlcmNow6kgb2duaSB0YW50byBhcnJpdmEgbnVsbCBpbiBjYXNpIHBlc2FudGkgZGkgT2JzZXJ2YWJsZSBzcGFtbWF0aSBhIHJhbmRvbVxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSkge1xyXG4gICAgICAvLyBBbGxhIHByaW1hIGNoaWFtYXRhIGJ1b25hLCBzaWduaWZpY2EgY2hlIGFsbWVubyBpbCBsb2dpbiBjZSBsJ2hvLiBQb3NzbyBtZXR0ZXJtaSBpbiBtb2RhbGl0w6AgcmVkaXJlY3RJblByb2dyZXNzIGZhbHNlXHJcbiAgICAgIC8vIGUgcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgICBpZiAodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgJiYgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXMoZmFsc2UpO1xyXG5cclxuICAgICAgLy8gQWdnaXVuZ28gbGEgY2hpYW1hdGEgYWxsYSBsaXN0YSBkZWxsZSB1bHRpbWUgMyBjb21wbGV0YXRlXHJcbiAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMudW5zaGlmdCh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0udXJsKVxyXG4gICAgICBpZiAodGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy5sZW5ndGggPiAzKVxyXG4gICAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMucG9wKCk7XHJcblxyXG4gICAgICAvLyBJbiBvZ25pIGNhc28gcXVlc3RhIHBvc3NvIHJpbXVvdmVybGFcclxuICAgICAgZGVsZXRlIHRoaXMuY2FsbFN0YXR1c1tndWlkXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSB2ZW5nbyBkYSB1bmEgY2hpYW1hdGEgY2hlIGhhIGFnZ2lvcm5hdG8gbGEgY2FjaGUgYSB0aW1lciBvIGdsb2JhbGUgbWFyY28gaWwgZmF0dG8gY2hlIHF1ZWxsYSBjYWNoZSBkZXYnZXNzZXJlIGFnZ2lvcm5hdGFcclxuICAgIGlmIChjYWNoZUluZm9zICYmIGNhY2hlSW5mb3MuY2FjaGUpIHtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSB0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCB8fCAhIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQID0gdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgIWNhY2hlSW5mb3MuY2FjaGVUaW1lO1xyXG4gICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIk1hcmtpbmcgY2FjaGUgdG8gYmUgcGVyc2lzdGVkIGFzIHNvb24gYXMgcG9zc2libGVcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIHVuYSBkZWxsZSBkdWUgY2FjaGUgZGV2b25vIGVzc2VyZSBhZ2dpb3JuYXRlIGUgbm9uIGhvIG5lc3N1bmEgY2hpYW1hdGEgaW4gY29yc28gZWZmZXR0dW8gbCdhZ2dpb3JuYW1lbnRvIGluIGJhc2UgYSBxdWFsZSBkZWxsZSBkdWUgdmEgYWdnaW9ybmF0YVxyXG4gICAgLy8gQWxsYSBmaW5lIGRpIHR1dHRvIG1hcmNvIGNvbWUgZmF0dG9cclxuICAgIGlmICgodGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCkgJiYgT2JqZWN0LmtleXModGhpcy5jYWxsU3RhdHVzKS5sZW5ndGggPT0gMCkge1xyXG5cclxuICAgICAgdmFyIHRvQ2FsbCA9IFtdO1xyXG4gICAgICBsZXQgdG1wS2V5ID0gXCJcIjtcclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVApIHtcclxuICAgICAgICB0bXBLZXkgPSB0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleTtcclxuICAgICAgICB0b0NhbGwucHVzaCh0aGlzLmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRtcEtleSwgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKHRtcEtleSkpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJObyBtb3JlIEhUVFAgY2FsbHMgdG8gYmUgZXhlY3V0ZWQsIGVudGVyaW5nIGlkbGUgc3RhdGUgYW5kIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpICsgXCIuLi5cIik7XHJcbiAgICAgIHRoaXMuU3RhYmlsaXplZC5uZXh0KHRydWUpO1xyXG4gICAgICBcclxuICAgICAgdmFyIHJldCA9IGF3YWl0IGZvcmtKb2luKHRvQ2FsbCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXQpXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZXMgc3VjY2VzZnVsbHkgcGVyc2lzdGVkXCIpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3JzIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpKTtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBkYXRvIHVuIHVuaWNvIEZpbGUgbyB1bmEgbGlzdGEgZGkgRmlsZSBjcmVhIHVuIG9nZ2V0dG8gRm9ybURhdGEgY2hlIHB1w7IgZXNzZXJlIGludmlhdG8gY29tb2RhbWVudGUgXHJcbiAgICogYWQgdW4gYmFja2VuZCBBU1AuTkVUIGRhIGN1aSBzaSBwb3Ryw6AgYWNjZWRlcmUgYSBSZXF1ZXN0LkZvcm0uRmlsZXNcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0ZpbGUgfCBGaWxlW119IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIEZpbGUgbyBsaXN0YSBkaSBGaWxlLiBOLkI6IG5lbGxhIGZpcm1hIGRlbGxhIGZ1bnppb25lIHZpZW5lIGNvbnNpZGVyYXRvICoqYW55KiogcGVyIGZhcmUgdGVzdCBzdWxsZSBwcm9wcmlldMOgIFxyXG4gICAqIGludmVjZSBjaGUgZmFyZSB0ZXN0IGNvbiBsJyoqaXN0YW5jZW9mKipcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IEZvcm1EYXRhIGNvbnRlbmVudGUgdHV0dGkgaSBmaWxlIHBhc3NhdGlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlOiBhbnkpOiBGb3JtRGF0YSB7XHJcbiAgICB2YXIgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgaWYgKGZpbGVBcnJheU9yRmlsZSkge1xyXG4gICAgICBpZiAoZmlsZUFycmF5T3JGaWxlLmxlbmd0aClcclxuICAgICAgICBmaWxlQXJyYXlPckZpbGUuZm9yRWFjaCh0ID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCB0LCB0Lm5hbWUpOyB9KTtcclxuICAgICAgZWxzZSBpZiAoZmlsZUFycmF5T3JGaWxlLm5hbWUpXHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZUFycmF5T3JGaWxlLCBmaWxlQXJyYXlPckZpbGUubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1EYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBpbiBiYXNlIGFpIHBhcmFtZXRyaSBkaXNwb25pYmlsaSBnZW5lcmEgZ2xpIEhlYWRlciBIVFRQIHBlciBsYSBjaGlhbWF0YSBkYSBlZmZldHR1YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQ29udGVudC1UeXBlXCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2VwdCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkFjY2VwdFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUF1dGggSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBdXRob3JpemF0aW9uXCIsIHZhbG9yaXp6YXRvIGNvbCB0b2tlbiByZWN1cGVyYXRvIGRhbGwnaG9vayAqKnJldHJpZXZlQWNjZXNzVG9rZW4qKiBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbklkIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiWC1UWC1JRFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtIdHRwSGVhZGVyc30gSGVhZGVyIGdlbmVyYXRpIGluIGJhc2UgYWkgcGFyYW1ldHJpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKHRyYW5zYWN0aW9uSWQgPSBcIlwiLCBpbmNsdWRlQXV0aDogYm9vbGVhbiA9IHRydWUsIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIiwgYWNjZXB0OiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IEh0dHBIZWFkZXJzIHtcclxuICAgIHZhciBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICB2YXIgYXV0aHRva2VuID0gdGhpcy5FeHRlbnNpb25zSW1wbC5yZXRyaWV2ZUFjY2Vzc1Rva2VuKCk7XHJcblxyXG4gICAgaWYgKGNvbnRlbnRUeXBlKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgY29udGVudFR5cGUpO1xyXG5cclxuICAgIGlmICh0cmFuc2FjdGlvbklkKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJYLVRYLUlEXCIsIHRyYW5zYWN0aW9uSWQpO1xyXG5cclxuICAgIGlmIChhdXRodG9rZW4gJiYgaW5jbHVkZUF1dGgpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBhdXRodG9rZW4pO1xyXG5cclxuICAgIGlmIChhY2NlcHQpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdFwiLCBhY2NlcHQpO1xyXG5cclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdC1MYW5ndWFnZVwiLCB0aGlzLkxPQ0FMRSA/PyAnaXQtSVQnKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgaWYodGhpcy5jYWxsU3RhdHVzW2d1aWRdKVxyXG4gICAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA9IGZhbHNlO1xyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHR1dHRpIGdsaSBlcnJvcmkgZHVyYW50ZSBpbCByZWRpcmVjdCBhbCBsb2dpbiB2ZW5nYW5vIGlnbm9yYXRpXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3RpbmdUb0xvZ2luKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWRpcmVjdGluZyB0byBMb2dpbiwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHZlbmdhIGdlc3RpdG8gdW4gc29sbyBlcnJvcmUgcGVyIHZvbHRhXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkSGFuZGxpbmdFcnJvclN0YXR1cygpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlSGFuZGxpbmdFcnJvclN0YXR1cyh0cnVlKTtcclxuXHJcbiAgICBsZXQgZmluYWxFcnJvciA9IFwiXCI7XHJcbiAgICBsZXQgZmluYWxTdGF0dXMgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlRXJyb3IocmVzKSkge1xyXG4gICAgICBmaW5hbEVycm9yID0gcmVzLm1lc3NhZ2U7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gXCJIVFRQIFNlcnZpY2UgSW50ZXJuYWwgRXJyb3JcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNIdHRwRXJyb3JSZXNwb25zZShyZXMpKSB7XHJcblxyXG4gICAgICBmaW5hbEVycm9yID0gYXdhaXQgdGhpcy5nZXRIdHRwRXJyb3JUZXh0KHJlcy5lcnJvcik7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gcmVzLnN0YXR1cy50b1N0cmluZygpO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzKSB7XHJcbiAgICAgICAgLy8gVW5hdXRob3JpemVkXHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwicmVkaXJlY3RpbmcgdG8gbG9naW4uXCIpKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGluZ1RvTG9naW4odHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlZGlyZWN0VG9Mb2dpbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIEhhbmRsZWQgZXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgLy8gTm8gUGVybWlzc2lvbnNcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90IGZvdW5kXHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIHRoaXMubG9jKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3RDb25maWd1cmVkRXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0NDQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0NDQgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoIXRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlTm90Q29uZmlndXJlZEV4Y2VwdGlvbigpKVxyXG4gICAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZpbmFsRXJyb3IgPSBcIlNlcnZlciBtaWdodCBiZSBvZmZsaW5lXCIgKyAocmVzLnN0YXR1c1RleHQgPyBcIiAoXCIgKyByZXMuc3RhdHVzVGV4dCArIFwiKSBcIiA6IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVFeGNlcHRpb24oZmluYWxTdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBlcnJvcmUgcmVzdGl0dWlzY2UgdW5hIHByb21pc2UgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlIGluIG1vZG8gZGEgcG90ZXIgZmFyZSB1biBhd2FpdFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSBjaGUgcmlzb2x2ZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEh0dHBFcnJvclRleHQoZXJyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgLy8gU2UgaG8gdW4gQmxvYiBwdcOyIGVzc2VyZSBvIHVuIENhbGxSZXN1bHQgbyBzdXBwb25nbyB1bmEgc2VtcGxpY2Ugc3RyaW5nYSxcclxuICAgIC8vIGFsdHJpbWVudGkgcG90cmViYmUgZXNzZXJlIGRpcmV0dGFtZW50ZSB1biBDYWxsUmVzdWx0LCBvcHB1cmUgdW5hIHNlbXBsaWNlIHN0cmluZ2FcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVyck1zZyA9ICg8YW55PmUudGFyZ2V0KS5yZXN1bHQ7XHJcbiAgICAgICAgICBsZXQganNvbmVyck1zZzogYW55O1xyXG4gICAgICAgICAgdHJ5IHsganNvbmVyck1zZyA9IEpTT04ucGFyc2UoZXJyTXNnKTsgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqc29uZXJyTXNnICYmIHRoaXMuaXNDYWxsUmVzdWx0KGpzb25lcnJNc2cpID8ganNvbmVyck1zZy5lcnJvci5tZXNzYWdlIDogZXJyTXNnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGVycilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmlzQ2FsbFJlc3VsdChlcnIpKVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVycj8udG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ29nZ2V0dG8gw6ggZGkgdGlwbyAqKkNhbGxSZXN1bHQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0NhbGxSZXN1bHQoZXJyOiBhbnkpOiBlcnIgaXMgeyBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSB9IHtcclxuICAgIHJldHVybiAhIWVycj8uZXJyb3I/Lm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKkh0dHBFcnJvclJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwRXJyb3JSZXNwb25zZShlcnI6IGFueSk6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipUeXBlRXJyb3IqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1R5cGVFcnJvcihlcnI6IGFueSk6IGVyciBpcyBUeXBlRXJyb3Ige1xyXG4gICAgcmV0dXJuIGVyci5uYW1lID09IFwiVHlwZUVycm9yXCI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21lIGRpY2UgaWwgbm9tZSwgcmVnaXN0cmEgdW4gZXJyb3JlIGUgcmVzdGl0dWlzY2UgdW4gT2JzZXJ2YWJsZSB2dW90byBjb21lIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBnZXN0aXJlIGwnZXJyb3JlIHZpYSBsaWJyZXJpYSBvIHNlIGxpbWl0YXJzaSBhIHJlc3RpdHVpcmUgbCdPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShyZXM6IGFueSwgZ3VpZDogc3RyaW5nLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGhhbmRsZUVycm9yKVxyXG4gICAgICB0aGlzLm9uRXJyb3IocmVzLCBndWlkKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBVcmwgZSBkZWkgcGFyYW1ldHJpIGNlcmNhIGRpIHJlY3VwZXJhcmUgbCdldmVudHVhbGUgb2dnZXR0byBnacOgIHNhbHZhdG8gaW4gY2FjaGUgY29uIGxlIGluZm9ybWF6aW9uaSBiYXNlIGRlbGxhIGNhY2hlIHN0ZXNzYVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhIChudWxsaSBpbiBjYXNvIGRpIFBPU1QpXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NhY2hlSW5mb3N9IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IENhY2hlSW5mb3Mge1xyXG5cclxuICAgIGxldCBjYWNoaW5nS2V5ID0gbnVsbCwgY2FjaGVUaW1lID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICAgIGlmIChjYWNoZSAmJiBjYWNoZVtjYWNoaW5nS2V5XSAmJiAhdGhpcy50aW1lZENhY2hlSXRlbUV4cGlyZWQoY2FjaGVbY2FjaGluZ0tleV0pKSB7XHJcbiAgICAgICAgLy8gU2UgZ2VzdGlzY28gaWwgdGVtcG8gZXNhdHRvIGRlbGxhIGNhY2hlIHByaW1hIGRpIHJlc3RpdHVpcmUgbCdvZ2dldHRvIGNhY2hhdG8gbG8gcmlwdWxpc2NvIFxyXG4gICAgICAgIC8vIGRhbGxlIHByb3ByaWV0w6AgaW50ZXJuZSBjaGUgZ2xpIGhvIGFnZ2l1bnRvIHBlciBjb250cm9sbGFybmUgbGEgc2NhZGVuemFcclxuICAgICAgICBpZiAoY2FjaGVUaW1lKVxyXG4gICAgICAgICAgZGVsZXRlIGNhY2hlW2NhY2hpbmdLZXldLl9fZXhwaXJlO1xyXG5cclxuICAgICAgICBpdGVtID0gY2FjaGVbY2FjaGluZ0tleV1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlciBhc3NpY3VyYXJtaSBjaGUgaWwgcmlmZWlybWVudG8gZGVnbGkgb2dnZXR0aSBzaWEgZGl2ZXJzbyB1dGlsaXp6byBpbCBkZWVwQ2xvbmVcclxuICAgIHJldHVybiBuZXcgQ2FjaGVJbmZvcyh1cmwsIHVzZUNhY2hpbmcsIGNhY2hpbmdLZXksIGNhY2hlVGltZSwgdGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJpc2NlIHVuIG9nZ2V0dG8gbmVsbGEgY2FjaGUgYXBwcm9wcmlhdGEgaW4gYmFzZSBhbGxlIGluZm9ybWF6aW9uaSBjb250ZW51dGUgbmVsIHBhcmFtZXRybyAqKmNhY2hlSW5mb3MqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VH0gaXRlbSBPZ2dldHRvIGRhIGluc2VyaXJlIG5lbGxhIGNhY2hlXHJcbiAgICogQHBhcmFtIHtDYWNoZUluZm9zfSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IENhY2hlSW5mb3MpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZUtleSA9IGNhY2hlSW5mb3MuY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICBsZXQgY2FjaGVMcyA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbShjYWNoZUtleSk7XHJcbiAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldID0gaXRlbTtcclxuICAgIGlmIChjYWNoZUluZm9zLmNhY2hlVGltZSlcclxuICAgICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0uX19leHBpcmUgPSBkYXlqcygpLmFkZChjYWNoZUluZm9zLmNhY2hlVGltZSwgXCJzZWNvbmRzXCIpO1xyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldExvY2FsSXRlbShjYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciBsZSBjaGlhbWF0ZSBzZW56YSBleHBpcmUgdGltZSDDqCBzY2FkdXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdW50aW1lZENhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBleHBpcmUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5KSk7XHJcbiAgICByZXR1cm4gIWV4cGlyZSB8fCBleHBpcmUgJiYgZGF5anMoZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIHVuYSBjaGlhbWF0YSBjaGUgaGEgdW4gdGVtcG8gZGkgdml0YSBiZW4gZGVmaW5pdG8gw6ggc2NhZHV0YSBvIG1lbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHJlY3VwZXJhdG8gZGFsbGEgY2FjaGUgYSBjdWkgaG8gYWdnaXVudG8gbGEgY2hpYXZlIGludGVybmEgX19leHBpcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aW1lZENhY2hlSXRlbUV4cGlyZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGF5anMoaXRlbS5fX2V4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGUgaW1wb3N0YSBsYSBwcm9zc2ltYSBzY2FkZW56YSBhZCBhZGVzc28gKyAqKkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TKiogKHRva2VuIHZhbG9yaXp6YXRvIGluIGZhc2UgZGkgY29uZmlndXJhemlvbmUgZGFsbGEgcHJvcHJpZXTDoCAqKmNsaWVudENhY2hlRHVyYXRpb25TKiogZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VNb2R1bGVDb25maWcqKilcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5LCBKU09OLnN0cmluZ2lmeShkYXlqcygpLmFkZCh0aGlzLkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TID8/IDM2MDAsIFwic2Vjb25kXCIpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZGVsbGUgY2hpYW1hdGUgY29uIHVuIHRlbXBvIGRpIGV4cGlyZSBkZWZpbml0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZXNldEh0dHBUaW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSwge30pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIHVuYSBjaGlhdmUgcGVyIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGluIGJhc2UgYWQgVVJMIGUgUGFyYW1ldHJpIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENoaWF2ZSBjaGUgcmFwcHJlc2VudGEgaW4gbWFuaWVyYSB1bml2b2NhIGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgIHByaXZhdGUgbWFrZUNhY2hlS2V5KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgbGV0IGF1dGhLZXlQYXJ0ID0gKHRoaXMubWUgPyB0aGlzLm1lLklkdGVuYW50IDogXCJcIikgKyAodGhpcy5tZSAmJiB0aGlzLkNBQ0hFX0JZX1VTRVIgPyB0aGlzLm1lLklkVXNlciA6IFwiXCIpO1xyXG4gICAgbGV0IHBhcmFtc0tleVBhcnQgPSBwYXJhbXMgJiYgcGFyYW1zLmtleXMoKS5sZW5ndGggPiAwID8gcGFyYW1zLmtleXMoKS5yZWR1Y2UoKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiBwcmV2ICsgXCIsXCIgKyBuZXh0ICsgJz0nICsgcGFyYW1zLmdldChuZXh0KSwgXCJcIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIGF1dGhLZXlQYXJ0ICsgXCJfXCIgKyB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiYXBpXCIpICsgNCkgKyBcIj9cIiArIHBhcmFtc0tleVBhcnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF6aW9uZSBHVUlEXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTnVvdm8gR1VJRCBnZW5lcmF0byBpbiBtYW5pZXJhIGNhc3VhbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEdVSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNjcml2ZXJlIGxvZyBhIGNvbnNvbGUgcXVhbG9yYSAqKkRFQlVHX01PREUqKiByaXN1bHRhc3NlICoqdHJ1ZSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRpIGxvZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuREVCVUdfTU9ERSlcclxuICAgICAgY29uc29sZS5sb2coXCJAaHR0cHNlcnZpY2U6IFwiICsgbWVzc2FnZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBwZXIgbGEgbG9jYWxpenphemlvbmUgZGVpIG1lc3NhZ2dpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGxvY2FsaXp6YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIGxvY2FsaXp6YXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2MobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghTG9jW21lc3NhZ2VdKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIlVudHJhbnNsYXRlZCBtZXNzYWdlOiBcIiArIG1lc3NhZ2UpXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIExvY1ttZXNzYWdlXVt0aGlzLkxPQ0FMRV07XHJcbiAgfVxyXG59Il19
776
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cHNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHBzZXJ2aWNlL3NyYy9saWIvaHR0cHNlcnZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQWEsYUFBYSxFQUFFLFdBQVcsRUFBK0MsTUFBTSxzQkFBc0IsQ0FBQztBQUN6SixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsWUFBWTtBQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRSxrQ0FBa0M7QUFDbEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV4SCxXQUFXO0FBQ1gsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVFqRDs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sV0FBVztJQTZCdEI7O09BRUc7SUFD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QUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssR0FBRyxDQUFDLE9BQWU7UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxHQUFHLENBQUMsT0FBZTtRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsT0FBTyxDQUFDLENBQUE7WUFDaEQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDOzs7WUF4MkJGLFVBQVU7OztZQWZGLHFCQUFxQjs0Q0FrRHpCLFFBQVEsWUFBSSxNQUFNLFNBQUMsaUJBQWlCOzRDQUNwQyxRQUFRLFlBQUksTUFBTSxTQUFDLFdBQVc7NENBQzlCLFFBQVEsWUFBSSxNQUFNLFNBQUMsUUFBUTs0Q0FDM0IsUUFBUSxZQUFJLE1BQU0sU0FBQyx1QkFBdUI7MENBQzFDLFFBQVEsWUFBSSxNQUFNLFNBQUMsYUFBYTswQ0FDaEMsUUFBUSxZQUFJLE1BQU0sU0FBQyxVQUFVO1lBdEV6QixVQUFVO1lBSVYsWUFBWTtZQUNaLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUHJvZ3Jlc3NFdmVudCwgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRXMgRmFlbnphXHJcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvcHJlZmVyZW5jZXNcIjtcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbi8vIERpcmV0dGl2ZSwgQ29tcG9uZW50aSwgTGlicmVyaWVcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgZmluYWxpemUsIG1hcCwgc2NhbiB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBmb3JrSm9pbiwgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRocm93RXJyb3IgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLy8gQ2hpYW1hdGUgYWkgUmVwb3NpdG9yeSAvIHRva2Vuc1xyXG5pbXBvcnQgeyBIVFRQX0lOVkFMSURBVElPTiwgQ0xJRU5UX0NBQ0hFX0RVUkFUSU9OX1MsIEhUVFBfTE9DQUxFLCBBUFBfTkFNRSwgQ0FDSEVfQllfVVNFUiwgREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcclxuXHJcbi8vIE1vZGVsbGkgXHJcbmltcG9ydCB7IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyB9IGZyb20gJy4vY29uZmlnL0h0dHBTZXJ2aWNlRXh0ZW5zaW9ucyc7XHJcbmltcG9ydCB7IERvd25sb2FkIH0gZnJvbSAnLi9tb2RlbHMvRG93bmxvYWQnO1xyXG5pbXBvcnQgeyBMb2MgfSBmcm9tICcuL2h0dHBzZXJ2aWNlLnNlcnZpY2UubG9jJztcclxuaW1wb3J0IHsgQ2FjaGVJbmZvcyB9IGZyb20gXCIuL21vZGVscy9DYWNoZUluZm9zXCI7XHJcblxyXG4vKipcclxuICogRGljaGlhcmF6aW9uZSBkZWxsYSB2YXJpYWJpbGUgZ2xvYmFsZSBkYXlqcy4gTCdvbmVyZSBkaSBcImNyZWFybGFcIiDDqCBhZmZpZGF0byBhbGwnYXBwbGljYXppb25lIGNoZSB1dGlsaXp6YSBxdWVzdGEgbGlicmVyaWEsIFxyXG4gKiBjaGUgZG92csOgIGltcG9ydGFyZSBsbyBzY3JpcHQgZ2xvYmFsZSBkaSBkYXlqcyBuZWxsYSBDTElcclxuICovXHJcbmRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4vKipcclxuICogU2Vydml6aW8gdXRpbGl6emF0byBwZXIgZWZmZXR0dWFyZSBxdWFsc2lhc2kgdGlwbyBkaSBjaGlhbWF0YSBIVFRQIGRhbGwnYXBwbGljYXppb25lLCBnZXN0aXNjZSBlcnJvcmkgZSBjYWNoZSBkZWxsZSByaXNwb3N0ZSBuYXRpdmFtZW50ZSBlIG5lIHB1w7IgZXNzZXJlIFxyXG4gKiBlc3Rlc28vbW9kaWZpY2F0byBpbCBjb21wb3J0YW1lbnRvIGltcGxlbWVudGFuZG8gbGEgY2xhc3NlIGRpIFwiaG9va1wiICoqSUh0dHBTZXJ2aWNlRXh0ZW5zaW9ucyoqIGUgcmVnaXN0cmFuZG9sYSBuZWwgcHJvdmlkZXIgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKipcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEhUVFBTZXJ2aWNlIHtcclxuXHJcbiAgLyoqIENhY2hlIGRlbGxvIHN0YXRvIGRlbGxlIGNoaWFtYXRlIEhUVFAgYXR0dWFsbWVudGUgZWZmZXR0dWF0ZS4gT2duaSBjaGlhbWF0YSDDqCByYXBwcmVzZW50YXRhIGRhIHVuIEdVSUQgZSBsbyBzdGF0dXMgYXNzdW1lIHZhbG9yZSAqKmZhbHNlKiogc29sbyBzdWdsaSBlcnJvcmkgKi9cclxuICBwcml2YXRlIGNhbGxTdGF0dXM6IHsgW2lkOiBzdHJpbmddOiB7IHVybDogc3RyaW5nLCBzdWNjZXNzOiBib29sZWFuIH0gfSA9IHt9O1xyXG4gIC8qKiBOb21lIGRlbGxhIGNhY2hlIGluIGN1aSB2ZW5nb25vIHN0b3JpY2l6emF0ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGUgcmlzcG9zdGUgZGVsbGUgY2hpYW1hdGUgc290dG8gZm9ybWEgZGkgZGljdGlvbmFyeSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5ID0gbnVsbDtcclxuICAvKiogTm9tZSBkZWxsYSBjYWNoZSBpbiBjdWkgdmVuZ29ubyBzdG9yaWNpenphdGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIHJpc3Bvc3RlIGRlbGxlIGNoaWFtYXRlIHNvdHRvIGZvcm1hIGRpIGRpY3Rpb25hcnksIHNvbG8gcGVyIGxlIGNoaWFtYXRlIGNvbiB1biB0ZW1wbyBkZWZpbml0byBkaSBjYWNoaW5nICovXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9IG51bGw7XHJcbiAgLyoqIE5vbWUgZGVsbGEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gc3RvcmljaXp6YXRlIGxlIGluZm9ybWF6aW9uaSBzdWxsbyBzY2FkZXJlIGRlbGxhIGNhY2hlIHN0ZXNzYSAqL1xyXG4gIHByaXZhdGUgbG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gbnVsbDtcclxuICAvKiogSWRlbnRpdMOgIGNvbGxlZ2F0YSBhbCB0b2tlbiBkaSBhdXRlbnRpY2F6aW9uZSBkYSB1c2FyZSwgcmljaGllc3RhIGFsIHByb2dyYW1tYSBjaGUgdXRpbGl6emEgbGEgbGlicmVyaWEgYXR0cmF2ZXJzbyBsJ2hvb2sgKipyZXRyaWV2ZUlkZW50aXR5KiogZGVsbGEgKipIdHRwU2VydmljZUV4dGVuc2lvbnMqKiAqL1xyXG4gIHByaXZhdGUgbWU6IHsgSWR0ZW5hbnQ6IHN0cmluZywgSWRVc2VyOiBzdHJpbmcgfSA9IG51bGw7XHJcbiAgLyoqIEluZGljYSBjaGUgbGEgY2FjaGUgYSB0ZW1wbyBkZXYnZXNzZXJlIHBlcnNpc3RpdGEgaWwgcHJpbWEgcG9zc2liaWxlICovXHJcbiAgcHJpdmF0ZSBQZXJzaXN0VGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogSW5kaWNhIGNoZSBsYSBjYWNoZSBzZW56YSBsaW1pdGkgZGkgdGVtcG8gZGV2J2Vzc2VyZSBwZXJzaXN0aXRhIGlsIHByaW1hIHBvc3NpYmlsZSAqL1xyXG4gIHByaXZhdGUgUGVyc2lzdFVudGltZWRDYWNoZUFTQVA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogU3ViamVjdCBlbWVzc28gcXVhbmRvIGlsIHNlcnZpemlvIGh0dHAgc2kgc3RhYmlsaXp6YSwgY2lvw6ggcXVhbmRvIG5vbiBjJ8OoIG5lc3N1bmEgY2hpYW1hdGEgcGVuZGluZyBvIGluIGNvcnNvIGRhIHF1YWxjaGUgaXN0YW50ZSAqL1xyXG4gIHB1YmxpYyBTdGFiaWxpemVkOiBTdWJqZWN0PHRydWU+ID0gbmV3IFN1YmplY3Q8dHJ1ZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50YXppb25lIGRlbGxhIGNsYXNzZSBkaSBlc3RlbnNpb25lIHBlciBjb2xsZWdhcmUgaSBjb21wb3J0YW1lbnRpIGRlbGxhIGxpYnJlcmlhIGFsbCdhcHBsaWNhemlvbmUgaW4gY3VpIMOoIHVzYXRhLiBcclxuICAgKiBcclxuICAgKiBTZSDDqCBzdGF0byBlZmZldHR1YXRvIGlsIHByb3ZpZGUgZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VFeHRlbnNpb25zKiogdmVycsOgIHVzYXRvIHF1ZWwgcHJvdmlkZXIsIGFsdHJpbWVudGkgdmVycsOgIGNyZWF0YSB1bmEgbnVvdmEgaXN0YW56YSBkaSBkZWZhdWx0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBFeHRlbnNpb25zSW1wbDogSHR0cFNlcnZpY2VFeHRlbnNpb25zO1xyXG5cclxuICAvKiogTGlzdGEgZGVsbGUgdWx0aW1lIDMgY2hpYW1hdGUgY29tcGxldGF0ZSBjb24gc3VjY2Vzc28gaW4gb3JkaW5lIGRpIGNvbXBsZXRhbWVudG8gKGluIHBvc2l6aW9uZSAwIGMnw6ggbCd1bHRpbWEgY29tcGxldGF0YSBlY2NldGVyYS4uLikgKi9cclxuICBwdWJsaWMgTGFzdFRocmVlQ29tcGxldGVkQ2FsbHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgRVhURU5TSU9OX0NMQVNTOiBIdHRwU2VydmljZUV4dGVuc2lvbnMsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhUVFBfSU5WQUxJREFUSU9OKSBwcml2YXRlIEhUVFBfSU5WQUxJREFUSU9OLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIVFRQX0xPQ0FMRSkgcHJpdmF0ZSBMT0NBTEUsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9OQU1FKSBwcml2YXRlIEFQUF9OQU1FLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChDTElFTlRfQ0FDSEVfRFVSQVRJT05fUykgcHJpdmF0ZSBDTElFTlRfQ0FDSEVfRFVSQVRJT05fUyxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ0FDSEVfQllfVVNFUikgcHJpdmF0ZSBDQUNIRV9CWV9VU0VSOiBib29sZWFuLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChERUJVR19NT0RFKSBwcml2YXRlIERFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1dGlzRXh0czogVXRpbGl0eVNlcnZpY2VcclxuICApIHtcclxuXHJcbiAgICB0aGlzLkV4dGVuc2lvbnNJbXBsID0gdGhpcy5FWFRFTlNJT05fQ0xBU1MgfHwgbmV3IEh0dHBTZXJ2aWNlRXh0ZW5zaW9ucygpO1xyXG4gICAgdGhpcy5tZSA9IHRoaXMuRXh0ZW5zaW9uc0ltcGwucmV0cmlldmVJZGVudGl0eSgpO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgPSAodGhpcy5BUFBfTkFNRSA/PyBcIkFQUFwiKS5yZXBsYWNlKC9cXHMvZywgJ18nKSArIFwiX0h0dHBDYWNoZVwiO1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA9ICh0aGlzLkFQUF9OQU1FID8/IFwiQVBQXCIpLnJlcGxhY2UoL1xccy9nLCAnXycpICsgXCJfSHR0cFRpbWVkQ2FjaGVcIjtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXkgKyBcIl9FeHBpcmVcIjtcclxuXHJcbiAgICB0aGlzLmFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKTtcclxuXHJcbiAgICBpZiAodGhpcy51bnRpbWVkQ2FjaGVFeHBpcmVkKCkpXHJcbiAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgdmVkbyBjaGUgY2kgc29ubyBlbGVtZW50aSBzYWx2YXRpIG5lbCBsb2NhbFN0b3JhZ2UgcHJvdm8gYSB0b2dsaWVybGkgZSBhIHJpc2FsdmFybGkgdmlhIHByZWZlcmVuY2UuXHJcbiAgICogTmVsIGNhc28gbWlnbGlvcmUgbGkgc3Bvc3RvIGRhbCBsb2NhbFN0b3JhZ2UgYWwgREIgZGkgcHJlZmVyZW5jZSwgbmVsIGNhc28gcGVnZ2lvcmUgbGkgdG9sZ28gZSBsaSByaXNhbHZvIG5lbCBsb2NhbFN0b3JhZ2VcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGFkanVzdE9sZFN0b3JhZ2VTeXN0ZW0oKSB7XHJcbiAgICB2YXIgbHNUaW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXkpO1xyXG4gICAgdmFyIGxzVW50aW1lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGlmICghbHNUaW1lZCAmJiAhbHNVbnRpbWVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSk7XHJcbiAgICBsc1RpbWVkID0gbHNUaW1lZCA/IEpTT04ucGFyc2UobHNUaW1lZCkgOiB7fTtcclxuICAgIGxzVW50aW1lZCA9IGxzVW50aW1lZCA/IEpTT04ucGFyc2UobHNVbnRpbWVkKSA6IHt9O1xyXG5cclxuICAgIGF3YWl0IGZvcmtKb2luKFtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBUaW1lZENhY2hlS2V5LCBsc1RpbWVkKSxcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUh0dHBDYWNoZUtleSwgbHNVbnRpbWVkKVxyXG4gICAgXSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgdGhpcy5sb2codGhpcy5sb2MoXCJDb252ZXJ0ZWQgb2xkIHN0b3JhZ2Ugc3lzdGVtIHRvIG5ldyBvbmVcIikpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFQ+fSBPYnNlcnZhYmxlIGNoZSBjb250aWVuZSBpbCByaXN1bHRhdG8gZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2s6IEZ1bmN0aW9uID0gbnVsbCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgLy8gVE9ETyBwcm92YXJlIGUgdGVzdGFyZVxyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGxldCBjYWNoZWRJbmZvcyA9IHRoaXMudHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsLCBwYXJhbXMpO1xyXG4gICAgICAgIGlmIChjYWNoZWRJbmZvcy5jYWNoZSAmJiBjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiUmVzdWx0IGZvclwiKSArIFwiIFwiICsgdXJsICsgXCIgXCIgKyB0aGlzLmxvYyhcInJldHJpZXZlZCBmcm9tIGNhY2hlXCIpKTtcclxuICAgICAgICAgIHJldHVybiBvZjxUPihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0PFQ+KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzOiBUKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZUl0ZW0gPSA8VD5yZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNhY2hlUmVzcG9uc2UodGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUocmVzcG9uc2VJdGVtKSwgY2FjaGVkSW5mb3MpO1xyXG4gICAgICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQ2FjaGVkIHJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZUl0ZW07XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvckNhbGxiYWNrKSBlcnJvckNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCwgY2FjaGVkSW5mb3MpOyB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNlY3V6aW9uZSBkaSB1bmEgR0VUIEhUVFAgY29uIGV2ZW50dWFsbWVudGUgbGEgZ2VzdGlvbmUgZGVsbGEgY2FjaGUgcXVhbG9yYSBsYSBjaGlhbWF0YSB0ZXJtaW5pIGNvbiBsYSBjb252ZW56aW9uZSBcIiNjYWNoZVwiXHJcbiAgICogXHJcbiAgICogQ2FzbyBzcGVjaWZpY28gZGkgY2hpYW1hdGEgY2hlIGRldmUgcmVzdGl0dWlyZSB1biBCbG9iIG8gdW4gQXJyYXlCdWZmZXIgbmF0aXZvIGRhIGVsYWJvcmFyZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtcImFycmF5YnVmZmVyXCJ8IFwiYmxvYlwifSB0eXBlIFRpcG8gZGkgcml0b3JubyByaWNoaWVzdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXJyb3JDYWxsYmFjayBDYWxsYmFjayBjaGlhbWF0byBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPEJsb2IgfCBBcnJheUJ1ZmZlcj59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRSYXcodXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHR5cGU6IFwiYXJyYXlidWZmZXJcIiB8IFwiYmxvYlwiID0gXCJhcnJheWJ1ZmZlclwiLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUsIGVycm9yQ2FsbGJhY2sgPSBudWxsKTogT2JzZXJ2YWJsZTxCbG9iIHwgQXJyYXlCdWZmZXI+IHtcclxuICAgIHJldHVybiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgobXlHdWlkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBsZXQgY2FjaGVkSW5mb3MgPSB0aGlzLnRyeUdldENhY2hlSW5mb3JtYXRpb25zKHVybCwgcGFyYW1zKTtcclxuICAgICAgICBpZiAoY2FjaGVkSW5mb3MuY2FjaGUgJiYgY2FjaGVkSW5mb3MuY2FjaGVJdGVtKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIlJlc3VsdCBmb3JcIikgKyBcIiBcIiArIHVybCArIFwiIFwiICsgdGhpcy5sb2MoXCJyZXRyaWV2ZWQgZnJvbSBjYWNoZVwiKSk7XHJcbiAgICAgICAgICByZXR1cm4gb2Y8YW55PihjYWNoZWRJbmZvcy5jYWNoZUl0ZW0pLnBpcGUoZGVsYXkoMCksIGZpbmFsaXplKCgpID0+IHsgdGhpcy50cnlGaW5hbGl6ZUJ5R3VpZChteUd1aWQpOyB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAuZ2V0KGNhY2hlZEluZm9zLmZpbmFsVXJsLCB7IHJlc3BvbnNlVHlwZTogPGFueT50eXBlLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnModHJhbnNhY3Rpb24pLCBwYXJhbXM6IHBhcmFtcyB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGh0dHBDYWxsLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKGJsb2I6IEJsb2IgfCBBcnJheUJ1ZmZlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhY2hlZEluZm9zLmNhY2hlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZVJlc3BvbnNlKGJsb2IsIGNhY2hlZEluZm9zKTtcclxuICAgICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkNhY2hlZCByZXN1bHQgZm9yXCIpICsgXCIgXCIgKyB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPEJsb2I+ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yQ2FsbGJhY2spIGVycm9yQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkLCBjYWNoZWRJbmZvcyk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICogXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtzdHJpbmd9IHRyYW5zYWN0aW9uIENvZGljZSB0cmFuc2F6aW9uZSBjb2xsZWdhdG8gYSBxdWVzdGEgY2hpYW1hdGEuIFZpZW5lIGluc2VyaXRvIG5lbGwnSGVhZGVyIFwiWC1UWC1JRFwiIGUgbGF0byBCYWNrZW5kIGRvdnLDoCBlc3NlcmUgZ2VzdGl0byBkaSBjb25zZWd1ZW56YVxyXG4gICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgKiByYWNjb2x0byBkYSBjaGkgdXNhIGxhIGxpYnJlcmlhIG5lbGxhIHBpcGUgXCJvbkVycm9yXCIgZGVsbCdPYnNlcnZhYmxlIHJlc3RpdHVpdG8gZWQgZXNzZXJlIGdlc3RpdG8gaW4gbWFuaWVyYSBub24gc3RhbmRhcmRcclxuICAqIFxyXG4gICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICovXHJcbiAgcHVibGljIHBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGJvZHlEYXRhLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICogRXNlY3V6aW9uZSBkaSB1bmEgREVMRVRFIEhUVFBcclxuICAqXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeSBJbmRpY2EgY2hlIHF1ZXN0YSBjaGlhbWF0YSBkZXZlIGFzc29sdXRhbWVudGUgYW5kYXJlIGJlbmUuIEluIGNhc28gY29udHJhcmlvIHZpZW5lIGZpc2ljYW1lbnRlIGZhdHRvIGlsIHRocm93IGNoZSBwdcOyIGVzc2VyZSBcclxuICAqIHJhY2NvbHRvIGRhIGNoaSB1c2EgbGEgbGlicmVyaWEgbmVsbGEgcGlwZSBcIm9uRXJyb3JcIiBkZWxsJ09ic2VydmFibGUgcmVzdGl0dWl0byBlZCBlc3NlcmUgZ2VzdGl0byBpbiBtYW5pZXJhIG5vbiBzdGFuZGFyZFxyXG4gICogXHJcbiAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxUPn0gT2JzZXJ2YWJsZSBjaGUgY29udGllbmUgaWwgcmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhXHJcbiAgKi9cclxuICBwdWJsaWMgZGVsZXRlPFQ+KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCB0cmFuc2FjdGlvbiA9IFwiXCIsIHN1Y2Nlc2Z1bFJlc3VsdE1hbmRhdG9yeTogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuXHJcbiAgICByZXR1cm4gZnJvbShbdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCldKS5waXBlKFxyXG4gICAgICBjb25jYXRNYXAoKG15R3VpZDogc3RyaW5nKSA9PiB7XHJcblxyXG4gICAgICAgIHZhciBodHRwQ2FsbCA9IHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7IGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycyh0cmFuc2FjdGlvbiksIHBhcmFtczogcGFyYW1zIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaHR0cENhbGwucGlwZShcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxUPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5ID8gdGhyb3dFcnJvcihlcnIpIDogdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkKTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQVVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHthbnl9IGJvZHlEYXRhIERUTyBwZXIgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb24gQ29kaWNlIHRyYW5zYXppb25lIGNvbGxlZ2F0byBhIHF1ZXN0YSBjaGlhbWF0YS4gVmllbmUgaW5zZXJpdG8gbmVsbCdIZWFkZXIgXCJYLVRYLUlEXCIgZSBsYXRvIEJhY2tlbmQgZG92csOgIGVzc2VyZSBnZXN0aXRvIGRpIGNvbnNlZ3VlbnphXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgSW5kaWNhIGNoZSBxdWVzdGEgY2hpYW1hdGEgZGV2ZSBhc3NvbHV0YW1lbnRlIGFuZGFyZSBiZW5lLiBJbiBjYXNvIGNvbnRyYXJpbyB2aWVuZSBmaXNpY2FtZW50ZSBmYXR0byBpbCB0aHJvdyBjaGUgcHXDsiBlc3NlcmUgXHJcbiAgICogcmFjY29sdG8gZGEgY2hpIHVzYSBsYSBsaWJyZXJpYSBuZWxsYSBwaXBlIFwib25FcnJvclwiIGRlbGwnT2JzZXJ2YWJsZSByZXN0aXR1aXRvIGVkIGVzc2VyZSBnZXN0aXRvIGluIG1hbmllcmEgbm9uIHN0YW5kYXJkXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHlEYXRhOiBhbnksIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwsIHRyYW5zYWN0aW9uID0gXCJcIiwgc3VjY2VzZnVsUmVzdWx0TWFuZGF0b3J5OiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGZyb20oW3RoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpXSkucGlwZShcclxuICAgICAgY29uY2F0TWFwKChteUd1aWQ6IHN0cmluZykgPT4ge1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucHV0PFQ+KHVybCwgYm9keURhdGEsIHsgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKHRyYW5zYWN0aW9uKSwgcGFyYW1zOiBwYXJhbXMgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICFzdWNjZXNmdWxSZXN1bHRNYW5kYXRvcnkgPyB0aHJvd0Vycm9yKGVycikgOiB0aGlzLnJlZ2lzdGVyRXJyb3JBbmRSZXR1cm5FbXB0eU9ic2VydmFibGUoZXJyLCBteUd1aWQpO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVzZWN1emlvbmUgZGkgdW5hIFBPU1QgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgYmlzb2duYSBhbmNoZSBpbnZpYXJlIGRlaSBGaWxlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge2FueX0gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7RmlsZVtdIHwgRmlsZX0gZmlsZUFycmF5T3JGaWxlIFNpbmdvbG8gZmlsZSBvIGxpc3RhIGRpIGZpbGUgZGEgaW52aWFyZS4gSWwgdGlwbyAqKkZpbGUqKiDDqCBxdWVsbG8gbmF0aXZvIGRlbCBKYXZhc2NyaXB0XHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8VD59IE9ic2VydmFibGUgY2hlIGNvbnRpZW5lIGlsIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBwb3N0d2l0aEZpbGVzPFQ+KHVybDogc3RyaW5nLCBib2R5RGF0YTogYW55LCBmaWxlQXJyYXlPckZpbGU6IEZpbGVbXSB8IEZpbGUsIHBhcmFtczogSHR0cFBhcmFtcyA9IG51bGwpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiBmcm9tKFt0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKV0pLnBpcGUoXHJcbiAgICAgIGNvbmNhdE1hcCgobXlHdWlkOiBzdHJpbmcpID0+IHtcclxuXHJcbiAgICAgICAgdmFyIGZvcm1EYXRhID0gdGhpcy5nZXRGaWxlc0Zvcm1EYXRhKGZpbGVBcnJheU9yRmlsZSk7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiYm9keVwiLCBKU09OLnN0cmluZ2lmeShib2R5RGF0YSkpO1xyXG5cclxuICAgICAgICB2YXIgaHR0cENhbGwgPSB0aGlzLmh0dHAucG9zdDxUPih1cmwsIGZvcm1EYXRhLCB7IHBhcmFtczogcGFyYW1zLCBoZWFkZXJzOiB0aGlzLmdldEhlYWRlcnMobnVsbCwgdHJ1ZSwgbnVsbCwgbnVsbCkgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBodHRwQ2FsbC5waXBlKFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPFQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCk7IH0pLFxyXG4gICAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBQT1NUIEhUVFBcclxuICAgKiBcclxuICAgKiBDYXNpc3RpY2EgcGFydGljb2xhcmUgaW4gY3VpIHZpZW5lIHJlc3RpdHVpdG8gdW4gZmlsZSBnZXN0aXRvIGNvbWUgT2JqZWN0VVJMIGlsIGN1aSBVUkwgc2kgcHXDsiBnZXN0aXJlIGRhbCBwYXJhbWV0cm8gZGkgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKi4gXHJcbiAgICogTGEgY2hpYW1hdGEgbm9uIGhhIHVuIHRpcG8gcmVzdGl0dWl0byBpbiBxdWFudG8gaWwgcmlzdWx0YXRvIGRldidlc3NlcmUgZ2VzdGl0byBhdHRyYXZlcnNvIGxhIGNhbGxiYWNrICoqZ2V0RmlsZUNhbGxiYWNrKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7S30gYm9keURhdGEgRFRPIHBlciBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZSBOb21lIGRlbCBmaWxlIGNoZSBzaSBzdGEgcmljaGllZGVuZG8sIHJpbWFuZSBsYXRvIEZyb250ZW5kIGUgc2VydmUgcGVyIGFzc2VnbmFyZSBhcmJpdHJhcmlhbWVudGUgdW4gbm9tZSBhbCBmaWxlIHJlc3RpdHVpdG8sIHNlIHZ1b3RvIHZpZW5lIHV0aWxpenphdGEgbGEgQ29udGVudC1EaXNwb3NpdGlvbiBkZWxsYSByaXNwb3N0YVxyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGdldEZpbGVDYWxsYmFjayBDYWxsYmFjayBhIGR1ZSBwYXJhbWV0cmkgKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSBwZXIgZ2VzdGlyZSBpbCByaXN1bHRhdG8gZGVsIGZpbGUgcmljaGllc3RvLiAqKlV0aWxpenphcmUgVXRpbGl0eVNlcnZpY2UuZmlsZURvd25sb2FkKiogZGkgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhZnRlckdldEZpbGUgQ2FsbGJhY2sgZGEgY2hpYW1hcmUgZG9wbyBhdmVyIGdlc3RpdG8gbGEgcmlzcG9zdGEgZGVsICoqZ2V0RmlsZUNhbGxiYWNrKiosIGluIGNhc28gKipoYW5kbGVFcnJvcioqIGZvc3NlICoqZmFsc2UqKiB2ZXJyw6AgcmljaGlhbWF0byBhbmNoZSBpbiBjYXNvIGRpIGVycm9yZVxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFuZGxlRXJyb3IgSW5kaWNhIHNlIGRpIGRlZmF1bHQgZ2xpIGVycm9yaSBkZXZvbm8gZXNzZXJlIGdlc3RpdGkgZGFsbGEgbGlicmVyaWEgbyBzZSBkZXZvbm8gZXNzZXJlIGlnbm9yYXRpXHJcbiAgICovXHJcbiAgcHVibGljIHBvc3RHZXRGaWxlPEs+KHVybDogc3RyaW5nLCBib2R5RGF0YTogSywgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUsIHBhcnM/OiBIdHRwUGFyYW1zKTogdm9pZCB7XHJcbiAgICBsZXQgbXlHdWlkID0gdGhpcy5kZWZhdWx0U3RhcnRDYWxsKHVybCk7XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QodXJsLCBib2R5RGF0YSwgeyBwYXJhbXM6IHBhcnMsIGhlYWRlcnM6IHRoaXMuZ2V0SGVhZGVycygpLCBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0pLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVyciwgY2F1Z2h0KTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgICAgICBpZiAoYWZ0ZXJHZXRGaWxlICYmICFoYW5kbGVFcnJvcikgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCwgaGFuZGxlRXJyb3IpO1xyXG4gICAgICB9KSxcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICApLnN1YnNjcmliZSgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxCbG9iPikgPT4ge1xyXG4gICAgICBsZXQgcmV0VXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgIGxldCBmbiA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk/LnNwbGl0KCc7JylbMV0/LnNwbGl0KCdmaWxlbmFtZScpWzFdPy5zcGxpdCgnPScpWzFdPy50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcblxyXG4gICAgICBnZXRGaWxlQ2FsbGJhY2socmV0VXJsLCBmaWxlbmFtZSB8fCBmbik7XHJcbiAgICAgIGlmIChhZnRlckdldEZpbGUpIGFmdGVyR2V0RmlsZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgSFRUUFxyXG4gICAqIFxyXG4gICAqIENhc2lzdGljYSBwYXJ0aWNvbGFyZSBpbiBjdWkgdmllbmUgcmVzdGl0dWl0byB1biBmaWxlIGdlc3RpdG8gY29tZSBPYmplY3RVUkwgaWwgY3VpIFVSTCBzaSBwdcOyIGdlc3RpcmUgZGFsIHBhcmFtZXRybyBkaSBjYWxsYmFjayAqKmdldEZpbGVDYWxsYmFjayoqLiBcclxuICAgKiBMYSBjaGlhbWF0YSBub24gaGEgdW4gdGlwbyByZXN0aXR1aXRvIGluIHF1YW50byBpbCByaXN1bHRhdG8gZGV2J2Vzc2VyZSBnZXN0aXRvIGF0dHJhdmVyc28gbGEgY2FsbGJhY2sgKipnZXRGaWxlQ2FsbGJhY2sqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIE5vbWUgZGVsIGZpbGUgY2hlIHNpIHN0YSByaWNoaWVkZW5kbywgcmltYW5lIGxhdG8gRnJvbnRlbmQgZSBzZXJ2ZSBwZXIgYXNzZWduYXJlIGFyYml0cmFyaWFtZW50ZSB1biBub21lIGFsIGZpbGUgcmVzdGl0dWl0bywgc2UgdnVvdG8gdmllbmUgdXRpbGl6emF0YSBsYSBDb250ZW50LURpc3Bvc2l0aW9uIGRlbGxhIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZ2V0RmlsZUNhbGxiYWNrIENhbGxiYWNrIGEgZHVlIHBhcmFtZXRyaSAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpIHBlciBnZXN0aXJlIGlsIHJpc3VsdGF0byBkZWwgZmlsZSByaWNoaWVzdG8uICoqVXRpbGl6emFyZSBVdGlsaXR5U2VydmljZS5maWxlRG93bmxvYWQqKiBkaSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyR2V0RmlsZSBDYWxsYmFjayBkYSBjaGlhbWFyZSBkb3BvIGF2ZXIgZ2VzdGl0byBsYSByaXNwb3N0YSBkZWwgKipnZXRGaWxlQ2FsbGJhY2sqKiwgaW4gY2FzbyAqKmhhbmRsZUVycm9yKiogZm9zc2UgKipmYWxzZSoqIHZlcnLDoCByaWNoaWFtYXRvIGFuY2hlIGluIGNhc28gZGkgZXJyb3JlXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBoYW5kbGVFcnJvciBJbmRpY2Egc2UgZGkgZGVmYXVsdCBnbGkgZXJyb3JpIGRldm9ubyBlc3NlcmUgZ2VzdGl0aSBkYWxsYSBsaWJyZXJpYSBvIHNlIGRldm9ubyBlc3NlcmUgaWdub3JhdGlcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCwgZmlsZW5hbWU6IHN0cmluZywgZ2V0RmlsZUNhbGxiYWNrOiAodXJsOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpID0+IGFueSwgYWZ0ZXJHZXRGaWxlOiAoKSA9PiBhbnkgPSBudWxsLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGxldCBteUd1aWQgPSB0aGlzLmRlZmF1bHRTdGFydENhbGwodXJsKTtcclxuXHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyBwYXJhbXM6IHBhcmFtcywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIG9ic2VydmU6ICdyZXNwb25zZScsIHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyLCBjYXVnaHQpOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xyXG4gICAgICAgIGlmIChhZnRlckdldEZpbGUgJiYgIWhhbmRsZUVycm9yKSBhZnRlckdldEZpbGUoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckVycm9yQW5kUmV0dXJuRW1wdHlPYnNlcnZhYmxlKGVyciwgbXlHdWlkLCBoYW5kbGVFcnJvcik7XHJcbiAgICAgIH0pLFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMudHJ5RmluYWxpemVCeUd1aWQobXlHdWlkKTsgfSlcclxuICAgICkuc3Vic2NyaWJlKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPEJsb2I+KSA9PiB7XHJcbiAgICAgIGxldCByZXRVcmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZS5ib2R5KTtcclxuICAgICAgbGV0IGZuID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKT8uc3BsaXQoJzsnKVsxXT8uc3BsaXQoJ2ZpbGVuYW1lJylbMV0/LnNwbGl0KCc9JylbMV0/LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKTtcclxuXHJcbiAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGZpbGVuYW1lIHx8IGZuKTtcclxuICAgICAgaWYgKGFmdGVyR2V0RmlsZSkgYWZ0ZXJHZXRGaWxlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIG5hdGl2byBkaSB1biBmaWxlLiBJbnRlcm5hbWVudGUgdXRpbGl6emEgaWwgcGF0dGVybiAqKndpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCIuLi5cIioqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0RmlsZU5hdGl2ZSh1cmw6IHN0cmluZywgcGFyYW1zOiBIdHRwUGFyYW1zID0gbnVsbCk6IHZvaWQge1xyXG5cclxuICAgIC8vIEVuY29kbyB0dXR0aSBpIHBhcmFtZXRyaSBwZXIgZXZpdGFyZSBjYXNpIHBhcnRpY29sYXJpXHJcbiAgICAvLyB2YXIgZW5jb2RlZFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAvLyBsZXQgcGFyS2V5cyA9IHBhcmFtcy5rZXlzKCk7XHJcbiAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHBhcktleXMubGVuZ3RoOyBpKyspXHJcbiAgICAvLyAgIGVuY29kZWRQYXJhbXMgPSBlbmNvZGVkUGFyYW1zLnNldChwYXJLZXlzW2ldLCBlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmdldChwYXJLZXlzW2ldKSkpO1xyXG5cclxuICAgIGxldCBmaW5hbFVybCA9IHVybCArIChwYXJhbXMgPyBcIj9cIiArIHBhcmFtcy50b1N0cmluZygpLnJlcGxhY2UoL1xcKy9nLCAnJTJiJykgOiBcIlwiKTtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZmluYWxVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2VjdXppb25lIGRpIHVuYSBHRVQgZGkgdW4gZmlsZSBjaGUgZW1ldHRlIGkgdmFyaSBldmVudGkgZGkgcHJvZ3Jlc3NvIGRpIGRvd25sb2FkLlxyXG4gICAqIFV0aWxpenphcmxhIHBlciBvdmVycmlkYXJlIGxhIGRpYWxvZyBuYXRpdmEgZGkgcHJvZ3Jlc3MgZGVsIGJyb3dzZXIgZSBzb3N0aXR1aXJsYSBjb24gcXVhbGNvc2EgdGlwbyBxdWVsbG8gY2hlIGZhIE1FR0EuXHJcbiAgICogXHJcbiAgICogSW4gY2FzbyBzaSB2b2dsaWEgb3R0ZW5lcmUgaWwgcmlzdWx0YXRvIG5hdGl2byBkZWwgYnJvd3NlciBkZWwgZG93bmxvYWQgdXRpbGl6emFyZSAqKmdldEZpbGVOYXRpdmUodXJsLCBwYXJzKSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgc3UgY3VpIGVmZmV0dHVhcmUgbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyBQYXJhbWV0cmkgZGVsbGEgY2hpYW1hdGFcclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXRGaWxlQ2FsbGJhY2sgQ2FsbGJhY2sgYSBkdWUgcGFyYW1ldHJpICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgcGVyIGdlc3RpcmUgaWwgcmlzdWx0YXRvIGRlbCBmaWxlIHJpY2hpZXN0by4gKipVdGlsaXp6YXJlIFV0aWxpdHlTZXJ2aWNlLmZpbGVEb3dubG9hZCoqIGRpIEBlc2ZhZW56YS9leHRlbnNpb25zXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8RG93bmxvYWQ+fSBPYnNlcnZhYmxlIGRlaSB2YXJpIHN0ZXAgZGkgcHJvZ3Jlc3NvIGRlbCBkb3dubG9hZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRGaWxlV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMgPSBudWxsLCBnZXRGaWxlQ2FsbGJhY2s6ICh1cmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZykgPT4gYW55KTogT2JzZXJ2YWJsZTxEb3dubG9hZD4ge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZGVmYXVsdFN0YXJ0Q2FsbCh1cmwpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgeyByZXNwb25zZVR5cGU6ICdibG9iJywgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M6IHRydWUgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc2NhbigocHJldmlvdXM6IERvd25sb2FkLCBldmVudDogSHR0cEV2ZW50PEJsb2I+KTogRG93bmxvYWQgPT4ge1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmlzSHR0cFByb2dyZXNzRXZlbnQoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IGV2ZW50LnRvdGFsID8gKGV2ZW50LmxvYWRlZCA+IGV2ZW50LnRvdGFsID8gMTAwIDogTWF0aC5yb3VuZCgoMTAwICogZXZlbnQubG9hZGVkKSAvIGV2ZW50LnRvdGFsKSkgOiBwcmV2aW91cy5wcm9ncmVzcztcclxuICAgICAgICAgICAgcmV0dXJuIHsgcHJvZ3Jlc3M6IHByb2dyZXNzLCBzdGF0ZTogJ0lOX1BST0dSRVNTJywgY29udGVudDogbnVsbCB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNIdHRwUmVzcG9uc2UoZXZlbnQpKSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgbGV0IGNkaXNwID0gZXZlbnQuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgICAgICAgICBsZXQgY2Rpc3BGaWxlbmFtZSA9IGNkaXNwLnNwbGl0KCc7JylbMV0uc3BsaXQoJ2ZpbGVuYW1lJylbMV0uc3BsaXQoJz0nKVsxXS50cmltKCkucmVwbGFjZSgvXFxcIi9nLCAnJyk7XHJcbiAgICAgICAgICAgICAgbGV0IHJldFVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGV2ZW50LmJvZHkpO1xyXG4gICAgICAgICAgICAgIGdldEZpbGVDYWxsYmFjayhyZXRVcmwsIGNkaXNwRmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7IHByb2dyZXNzOiAxMDAsIHN0YXRlOiAnRE9ORScsIGNvbnRlbnQ6IGV2ZW50LmJvZHkgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICB9LCB7IHN0YXRlOiAnUEVORElORycsIHByb2dyZXNzOiAwLCBjb250ZW50OiBudWxsIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVyciwgXyk6IE9ic2VydmFibGU8RG93bmxvYWQ+ID0+IHsgcmV0dXJuIHRoaXMucmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShlcnIsIG15R3VpZCkgfSksXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnRyeUZpbmFsaXplQnlHdWlkKG15R3VpZCk7IH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdldmVudG8gSFRUUCDDqCBkaSB0aXBvICoqSHR0cFJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKi9cclxuICAgcHJpdmF0ZSBpc0h0dHBSZXNwb25zZTxUPihldmVudDogSHR0cEV2ZW50PFQ+KTogZXZlbnQgaXMgSHR0cFJlc3BvbnNlPFQ+IHtcclxuICAgIHJldHVybiBldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ2V2ZW50byBIVFRQIMOoIGRpIHRpcG8gKipIdHRwUHJvZ3Jlc3NFdmVudCoqIGUsIHNlIHPDrCwgbG8gY2FzdGEgYWwgdGlwbyBjb3JyZXR0byBwZXIgZXNzZXJlIHV0aWxpenphdG8gY29ycmV0dGFtZW50ZSBuZWwgYmxvY2NvIGRpIGNvZGljZSBzdWNjZXNzaXZvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0h0dHBQcm9ncmVzc0V2ZW50KGV2ZW50OiBIdHRwRXZlbnQ8dW5rbm93bj4pOiBldmVudCBpcyBIdHRwUHJvZ3Jlc3NFdmVudCB7XHJcbiAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5Eb3dubG9hZFByb2dyZXNzIHx8IGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3NcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpb25lIGRlbGwnaW5pemlvIGRpIHVuYSBjaGlhbWF0YSBhZCB1biBjZXJ0byBVUkwsIHZpZW5lIGdlbmVyYXRvIHVuIEdVSUQgZGEgYXNzZWduYXJjaSwgY29udHJvbGxhdGEgbGEgc2NhZGVuemEgZGVsbGEgY2FjaGUsIFxyXG4gICAqIGUgZXZlbnR1YWxtZW50ZSBsb2dnYXRvIGlsIGZhdHRvIGNoZSBzdGEgcGVyIGVzc2VyZSBlZmZldHR1YXRhIHVuYSBjaGlhbWF0YSBIVFRQXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVcmwgYSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEdVSUQgYXNzZWduYXRvIGFsbGEgY2hpYW1hdGFcclxuICAgKi9cclxuICBwcml2YXRlIGRlZmF1bHRTdGFydENhbGwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IG15R3VpZCA9IHRoaXMuZ2V0R1VJRCgpO1xyXG4gICAgdGhpcy5jaGVja0NhY2hlSW52YWxpZGF0aW9uKHVybCk7XHJcbiAgICB0aGlzLmNhbGxTdGF0dXNbbXlHdWlkXSA9IHsgdXJsOiB1cmwsIHN1Y2Nlc3M6IHRydWUgfTtcclxuICAgIHRoaXMubG9nKHRoaXMubG9jKFwiU3RhcnRpbmcgY2FsbFwiKSArIFwiIFwiICsgbXlHdWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcImF0IFVSTFwiKSArIFwiOiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbXlHdWlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biB1cmwgdmVuZ29ubyBjb250cm9sbGF0ZSBsZSBpbmZvcm1hemlvbmkgc3UgdHV0dGkgZ2xpIHVybCBkYSBpbnZhbGlkYXJlIGNvbGxlZ2F0aSBhbGwndXJsIGNoaWFtYXRvIGUsIHNlIHByZXNlbnRpIGluIGNhY2hlLCBpbnZhbGlkYXRpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgcGVyIGN1aSBjb250cm9sbGFyZSBzZSBjaSBzb25vIGNoaWFtYXRlIGluIGNhY2hlIGRhIGludmFsaWRhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQ2FjaGVJbnZhbGlkYXRpb24odXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCBjYWNoZSA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbTxhbnk+KHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5KTtcclxuICAgIGxldCB0bXAgPSAvI2NhY2hlKDo/LShcXGQrKSkvZ2kuZXhlYyh1cmwpO1xyXG4gICAgbGV0IGNhY2hlVGltZSA9IHRtcCA/IHRtcFsyXSA6IG51bGw7XHJcbiAgICBsZXQgbm9ybWFsaXplZFVybF90bXAgPSAgdXJsLnJlcGxhY2UoXCIjY2FjaGVcIiArIChjYWNoZVRpbWUgPyBcIi1cIiArIGNhY2hlVGltZSA6IFwiXCIpLCBcIlwiKTtcclxuICAgIGxldCBub3JtYWxpemVkVXJsID0gbm9ybWFsaXplZFVybF90bXAuc3Vic3RyaW5nKG5vcm1hbGl6ZWRVcmxfdG1wLmluZGV4T2YoJy9hcGknKSlcclxuXHJcbiAgICBpZiAoIWNhY2hlIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OIHx8ICF0aGlzLkhUVFBfSU5WQUxJREFUSU9OW25vcm1hbGl6ZWRVcmxdKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGFwaXNUb0ludmFsaWRhdGU6IHN0cmluZ1tdID0gdGhpcy5IVFRQX0lOVkFMSURBVElPTltub3JtYWxpemVkVXJsXTtcclxuICAgIGlmICghYXBpc1RvSW52YWxpZGF0ZSB8fCBhcGlzVG9JbnZhbGlkYXRlLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGtleXNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcclxuICAgIGFwaXNUb0ludmFsaWRhdGUuZm9yRWFjaChhcGkgPT4ge1xyXG4gICAgICBsZXQgY2FjaGVLZXkgPSB0aGlzLm1ha2VDYWNoZUtleShhcGksIG51bGwpO1xyXG4gICAgICBmb3IgKGxldCBpdGVtIGluIGNhY2hlKVxyXG4gICAgICAgIGlmIChpdGVtLmluZGV4T2YoY2FjaGVLZXkpICE9IC0xKVxyXG4gICAgICAgICAga2V5c1RvUmVtb3ZlLnB1c2goaXRlbSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgayA9IGtleXNUb1JlbW92ZVtpXTtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJJbnZsYWxpZGF0aW5nIGNhY2hlIGVsZW1lbnRcIikgKyBcIiBcIiArIGspO1xyXG4gICAgICBkZWxldGUgY2FjaGVba107XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc2V0TG9jYWxJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5LCBjYWNoZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5hbGl6emF6aW9uZSBkaSB1bmEgY2hpYW1hdGFcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBHVUlEIGNvbGxlZ2F0byBhbGxhIGNoaWFtYXRhIGFwcGVuYSB0ZXJtaW5hdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBlcnNpc3RDYWNoZUlmSWRsZSBFZmZldHR1YSBpbCBwZXJzaXN0IGRlbGxhIGNhY2hlIEhUVFAgc29sbyBzZSBub24gY2kgc29ubyBhbHRyZSBjaGlhbWF0ZSBpbiBjb3JzbywgcGVyIGV2aXRhcmVcclxuICAgKiBjaGUgbWkgY2FtYmkgc290dG8gbCdvZ2dldHRvIGRpIGNhY2hlIG1lbnRyZSBzdG8gc2FsdmFuZG8gbGUgaW5mb3JtYXppb25pXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyB0cnlGaW5hbGl6ZUJ5R3VpZChndWlkOiBzdHJpbmcsIGNhY2hlSW5mb3M/OiBDYWNoZUluZm9zKSB7XHJcbiAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkZpbmFsaXppbmcgY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHN0YXR1c1wiKSArIFwiOiBcIiArICghdGhpcy5jYWxsU3RhdHVzW2d1aWRdID8gJ1Vua25vd24nIDogdGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgPyB0aGlzLmxvYygnU3VjY2VzcycpIDogdGhpcy5sb2MoJ0ZhaWx1cmUnKSkpO1xyXG5cclxuICAgIC8vIFRPRE86IFBlcmRlcmUgMy00IG9yZSBwZXIgY2FwaXJlIHBlcmNow6kgb2duaSB0YW50byBhcnJpdmEgbnVsbCBpbiBjYXNpIHBlc2FudGkgZGkgT2JzZXJ2YWJsZSBzcGFtbWF0aSBhIHJhbmRvbVxyXG4gICAgaWYgKHRoaXMuY2FsbFN0YXR1c1tndWlkXSkge1xyXG4gICAgICAvLyBBbGxhIHByaW1hIGNoaWFtYXRhIGJ1b25hLCBzaWduaWZpY2EgY2hlIGFsbWVubyBpbCBsb2dpbiBjZSBsJ2hvLiBQb3NzbyBtZXR0ZXJtaSBpbiBtb2RhbGl0w6AgcmVkaXJlY3RJblByb2dyZXNzIGZhbHNlXHJcbiAgICAgIC8vIGUgcmlpbml6aWFyZSBhIHZhbHV0YXJlIGVycm9yaSBkaSBqYXZhc2hpdFxyXG4gICAgICBpZiAodGhpcy5jYWxsU3RhdHVzW2d1aWRdLnN1Y2Nlc3MgJiYgdGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlUmVkaXJlY3Rpb25TdGF0dXMoZmFsc2UpO1xyXG5cclxuICAgICAgLy8gQWdnaXVuZ28gbGEgY2hpYW1hdGEgYWxsYSBsaXN0YSBkZWxsZSB1bHRpbWUgMyBjb21wbGV0YXRlXHJcbiAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMudW5zaGlmdCh0aGlzLmNhbGxTdGF0dXNbZ3VpZF0udXJsKVxyXG4gICAgICBpZiAodGhpcy5MYXN0VGhyZWVDb21wbGV0ZWRDYWxscy5sZW5ndGggPiAzKVxyXG4gICAgICAgIHRoaXMuTGFzdFRocmVlQ29tcGxldGVkQ2FsbHMucG9wKCk7XHJcblxyXG4gICAgICAvLyBJbiBvZ25pIGNhc28gcXVlc3RhIHBvc3NvIHJpbXVvdmVybGFcclxuICAgICAgZGVsZXRlIHRoaXMuY2FsbFN0YXR1c1tndWlkXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSBub24gaG8gbmVzc3VuJ2FsdHJhIGNoaWFtYXRhIGluIGNvcnNvIGNvbnNpZGVybyBsYSBzaXR1YXppb25lIHN0YWJpbGl6emF0YXNpXHJcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5jYWxsU3RhdHVzKS5sZW5ndGggPT0gMClcclxuICAgICAgdGhpcy5TdGFiaWxpemVkLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgLy8gU2UgdmVuZ28gZGEgdW5hIGNoaWFtYXRhIGNoZSBoYSBhZ2dpb3JuYXRvIGxhIGNhY2hlIGEgdGltZXIgbyBnbG9iYWxlIG1hcmNvIGlsIGZhdHRvIGNoZSBxdWVsbGEgY2FjaGUgZGV2J2Vzc2VyZSBhZ2dpb3JuYXRhXHJcbiAgICBpZiAoY2FjaGVJbmZvcyAmJiBjYWNoZUluZm9zLmNhY2hlKSB7XHJcbiAgICAgIHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQID0gdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgfHwgISFjYWNoZUluZm9zLmNhY2hlVGltZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8ICFjYWNoZUluZm9zLmNhY2hlVGltZTtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJNYXJraW5nIGNhY2hlIHRvIGJlIHBlcnNpc3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZSB1bmEgZGVsbGUgZHVlIGNhY2hlIGRldm9ubyBlc3NlcmUgYWdnaW9ybmF0ZSBlIG5vbiBobyBuZXNzdW5hIGNoaWFtYXRhIGluIGNvcnNvIGVmZmV0dHVvIGwnYWdnaW9ybmFtZW50byBpbiBiYXNlIGEgcXVhbGUgZGVsbGUgZHVlIHZhIGFnZ2lvcm5hdGFcclxuICAgIC8vIEFsbGEgZmluZSBkaSB0dXR0byBtYXJjbyBjb21lIGZhdHRvXHJcbiAgICBpZiAoKHRoaXMuUGVyc2lzdFRpbWVkQ2FjaGVBU0FQIHx8IHRoaXMuUGVyc2lzdFVudGltZWRDYWNoZUFTQVApICYmIE9iamVjdC5rZXlzKHRoaXMuY2FsbFN0YXR1cykubGVuZ3RoID09IDApIHtcclxuXHJcbiAgICAgIHZhciB0b0NhbGwgPSBbXTtcclxuICAgICAgbGV0IHRtcEtleSA9IFwiXCI7XHJcbiAgICAgIGlmICh0aGlzLlBlcnNpc3RUaW1lZENhY2hlQVNBUCkge1xyXG4gICAgICAgIHRtcEtleSA9IHRoaXMubG9jYWxTdG9yYWdlSHR0cFRpbWVkQ2FjaGVLZXk7XHJcbiAgICAgICAgdG9DYWxsLnB1c2godGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0bXBLZXksIHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbSh0bXBLZXkpKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlBlcnNpc3RVbnRpbWVkQ2FjaGVBU0FQKSB7XHJcbiAgICAgICAgdG1wS2V5ID0gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXk7XHJcbiAgICAgICAgdG9DYWxsLnB1c2godGhpcy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0bXBLZXksIHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbSh0bXBLZXkpKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiTm8gbW9yZSBIVFRQIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCBlbnRlcmluZyBpZGxlIHN0YXRlIGFuZCBwZXJzaXN0aW5nIG1vZGlmaWVkIGNhY2hlc1wiKSArIFwiLi4uXCIpO1xyXG5cclxuICAgICAgdmFyIHJldCA9IGF3YWl0IGZvcmtKb2luKHRvQ2FsbCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXQpXHJcbiAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJDYWNoZXMgc3VjY2VzZnVsbHkgcGVyc2lzdGVkXCIpKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3JzIHBlcnNpc3RpbmcgbW9kaWZpZWQgY2FjaGVzXCIpKTtcclxuICAgICAgdGhpcy5QZXJzaXN0VGltZWRDYWNoZUFTQVAgPSBmYWxzZTtcclxuICAgICAgdGhpcy5QZXJzaXN0VW50aW1lZENhY2hlQVNBUCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBkYXRvIHVuIHVuaWNvIEZpbGUgbyB1bmEgbGlzdGEgZGkgRmlsZSBjcmVhIHVuIG9nZ2V0dG8gRm9ybURhdGEgY2hlIHB1w7IgZXNzZXJlIGludmlhdG8gY29tb2RhbWVudGUgXHJcbiAgICogYWQgdW4gYmFja2VuZCBBU1AuTkVUIGRhIGN1aSBzaSBwb3Ryw6AgYWNjZWRlcmUgYSBSZXF1ZXN0LkZvcm0uRmlsZXNcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge0ZpbGUgfCBGaWxlW119IGZpbGVBcnJheU9yRmlsZSBTaW5nb2xvIEZpbGUgbyBsaXN0YSBkaSBGaWxlLiBOLkI6IG5lbGxhIGZpcm1hIGRlbGxhIGZ1bnppb25lIHZpZW5lIGNvbnNpZGVyYXRvICoqYW55KiogcGVyIGZhcmUgdGVzdCBzdWxsZSBwcm9wcmlldMOgIFxyXG4gICAqIGludmVjZSBjaGUgZmFyZSB0ZXN0IGNvbiBsJyoqaXN0YW5jZW9mKipcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IEZvcm1EYXRhIGNvbnRlbmVudGUgdHV0dGkgaSBmaWxlIHBhc3NhdGlcclxuICAgKi9cclxuICBwcml2YXRlIGdldEZpbGVzRm9ybURhdGEoZmlsZUFycmF5T3JGaWxlOiBhbnkpOiBGb3JtRGF0YSB7XHJcbiAgICB2YXIgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgaWYgKGZpbGVBcnJheU9yRmlsZSkge1xyXG4gICAgICBpZiAoZmlsZUFycmF5T3JGaWxlLmxlbmd0aClcclxuICAgICAgICBmaWxlQXJyYXlPckZpbGUuZm9yRWFjaCh0ID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCB0LCB0Lm5hbWUpOyB9KTtcclxuICAgICAgZWxzZSBpZiAoZmlsZUFycmF5T3JGaWxlLm5hbWUpXHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZUFycmF5T3JGaWxlLCBmaWxlQXJyYXlPckZpbGUubmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1EYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVscGVyIGNoZSBpbiBiYXNlIGFpIHBhcmFtZXRyaSBkaXNwb25pYmlsaSBnZW5lcmEgZ2xpIEhlYWRlciBIVFRQIHBlciBsYSBjaGlhbWF0YSBkYSBlZmZldHR1YXJlXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRUeXBlIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiQ29udGVudC1UeXBlXCIsIHZhbG9yaXp6YXRvIGFsIHZhbG9yZSBkZWwgcGFyYW1ldHJvXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2VwdCBJbmRpY2Egc2UgYWdnaXVuZ2VyZSBhZ2xpIGhlYWRlciBcIkFjY2VwdFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUF1dGggSW5kaWNhIHNlIGFnZ2l1bmdlcmUgYWdsaSBoZWFkZXIgXCJBdXRob3JpemF0aW9uXCIsIHZhbG9yaXp6YXRvIGNvbCB0b2tlbiByZWN1cGVyYXRvIGRhbGwnaG9vayAqKnJldHJpZXZlQWNjZXNzVG9rZW4qKiBkZWxsYSBjbGFzc2UgZGkgZXN0ZW5zaW9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2FjdGlvbklkIEluZGljYSBzZSBhZ2dpdW5nZXJlIGFnbGkgaGVhZGVyIFwiWC1UWC1JRFwiLCB2YWxvcml6emF0byBhbCB2YWxvcmUgZGVsIHBhcmFtZXRyb1xyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtIdHRwSGVhZGVyc30gSGVhZGVyIGdlbmVyYXRpIGluIGJhc2UgYWkgcGFyYW1ldHJpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKHRyYW5zYWN0aW9uSWQgPSBcIlwiLCBpbmNsdWRlQXV0aDogYm9vbGVhbiA9IHRydWUsIGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIiwgYWNjZXB0OiBzdHJpbmcgPSBcImFwcGxpY2F0aW9uL2pzb25cIik6IEh0dHBIZWFkZXJzIHtcclxuICAgIHZhciBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICB2YXIgYXV0aHRva2VuID0gdGhpcy5FeHRlbnNpb25zSW1wbC5yZXRyaWV2ZUFjY2Vzc1Rva2VuKCk7XHJcblxyXG4gICAgaWYgKGNvbnRlbnRUeXBlKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJDb250ZW50LVR5cGVcIiwgY29udGVudFR5cGUpO1xyXG5cclxuICAgIGlmICh0cmFuc2FjdGlvbklkKVxyXG4gICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXCJYLVRYLUlEXCIsIHRyYW5zYWN0aW9uSWQpO1xyXG5cclxuICAgIGlmIChhdXRodG9rZW4gJiYgaW5jbHVkZUF1dGgpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkF1dGhvcml6YXRpb25cIiwgXCJCZWFyZXIgXCIgKyBhdXRodG9rZW4pO1xyXG5cclxuICAgIGlmIChhY2NlcHQpXHJcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdFwiLCBhY2NlcHQpO1xyXG5cclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLmFwcGVuZChcIkFjY2VwdC1MYW5ndWFnZVwiLCB0aGlzLkxPQ0FMRSA/PyAnaXQtSVQnKTtcclxuICAgIHJldHVybiBoZWFkZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VzdGlvbmUgZGkgZGVmYXVsdCBkZWdsaSBlcnJvcmlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gcmVzIFJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgSWRlbnRpZmljYXRpdm8gR1VJRCBkZWxsYSBjaGlhbWF0YSBlZmZldHR1YXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvbkVycm9yKHJlczogSHR0cEVycm9yUmVzcG9uc2UgfCBUeXBlRXJyb3IsIGd1aWQ6IHN0cmluZykge1xyXG4gICAgaWYodGhpcy5jYWxsU3RhdHVzW2d1aWRdKVxyXG4gICAgICB0aGlzLmNhbGxTdGF0dXNbZ3VpZF0uc3VjY2VzcyA9IGZhbHNlO1xyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHR1dHRpIGdsaSBlcnJvcmkgZHVyYW50ZSBpbCByZWRpcmVjdCBhbCBsb2dpbiB2ZW5nYW5vIGlnbm9yYXRpXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3RpbmdUb0xvZ2luKCkpIHtcclxuICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJSZWRpcmVjdGluZyB0byBMb2dpbiwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vTWkgYXNzaWN1cm8gY2hlIHZlbmdhIGdlc3RpdG8gdW4gc29sbyBlcnJvcmUgcGVyIHZvbHRhXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkSGFuZGxpbmdFcnJvclN0YXR1cygpKSB7XHJcbiAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiQWxyZWFkeSBIYW5kbGluZyBhbiBlcnJvciwgaWdub3JpbmcgSFRUUCBlcnJvciBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLndyaXRlSGFuZGxpbmdFcnJvclN0YXR1cyh0cnVlKTtcclxuXHJcbiAgICBsZXQgZmluYWxFcnJvciA9IFwiXCI7XHJcbiAgICBsZXQgZmluYWxTdGF0dXMgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuaXNUeXBlRXJyb3IocmVzKSkge1xyXG4gICAgICBmaW5hbEVycm9yID0gcmVzLm1lc3NhZ2U7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gXCJIVFRQIFNlcnZpY2UgSW50ZXJuYWwgRXJyb3JcIjtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuaXNIdHRwRXJyb3JSZXNwb25zZShyZXMpKSB7XHJcblxyXG4gICAgICBmaW5hbEVycm9yID0gYXdhaXQgdGhpcy5nZXRIdHRwRXJyb3JUZXh0KHJlcy5lcnJvcik7XHJcbiAgICAgIGZpbmFsU3RhdHVzID0gcmVzLnN0YXR1cy50b1N0cmluZygpO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzKSB7XHJcbiAgICAgICAgLy8gVW5hdXRob3JpemVkXHJcbiAgICAgICAgY2FzZSA0MDE6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZyh0aGlzLmxvYyhcIkVycm9yIDQwMSBvbiBjYWxsXCIpICsgXCIgXCIgKyBndWlkICsgXCIgXCIgKyB0aGlzLmxvYyhcIndpdGggcmVkaXJlY3QgYWxyZWFkeSBpbiBwcm9ncmVzcy4gSWdub3JpbmcgdGhpcyBldmVudFwiKSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9nKHRoaXMubG9jKFwiRXJyb3IgNDAxIG9uIGNhbGxcIikgKyBcIiBcIiArIGd1aWQgKyBcIiBcIiArIHRoaXMubG9jKFwicmVkaXJlY3RpbmcgdG8gbG9naW4uXCIpKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGlvblN0YXR1cyh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwud3JpdGVSZWRpcmVjdGluZ1RvTG9naW4odHJ1ZSk7XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLnJlZGlyZWN0VG9Mb2dpbigpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIEhhbmRsZWQgZXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0MDA6XHJcbiAgICAgICAgLy8gTm8gUGVybWlzc2lvbnNcclxuICAgICAgICBjYXNlIDQwMzpcclxuICAgICAgICAgIHRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlQmxvY2tpbmdFeGNlcHRpb24ocmVzLnN0YXR1cywgZmluYWxFcnJvcik7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gTm90IGZvdW5kXHJcbiAgICAgICAgY2FzZSA0MDQ6XHJcbiAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIHRoaXMubG9jKFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyBOb3RDb25maWd1cmVkRXhjZXB0aW9uXHJcbiAgICAgICAgY2FzZSA0NDQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5FeHRlbnNpb25zSW1wbC5yZWFkUmVkaXJlY3Rpb25TdGF0dXMoKSlcclxuICAgICAgICAgICAgdGhpcy5sb2codGhpcy5sb2MoXCJFcnJvciA0NDQgb24gY2FsbFwiKSArIFwiIFwiICsgZ3VpZCArIFwiIFwiICsgdGhpcy5sb2MoXCJ3aXRoIHJlZGlyZWN0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIElnbm9yaW5nIHRoaXMgZXZlbnRcIikpO1xyXG4gICAgICAgICAgZWxzZSBpZiAoIXRoaXMuRXh0ZW5zaW9uc0ltcGwuaGFuZGxlTm90Q29uZmlndXJlZEV4Y2VwdGlvbigpKVxyXG4gICAgICAgICAgICB0aGlzLkV4dGVuc2lvbnNJbXBsLmhhbmRsZUJsb2NraW5nRXhjZXB0aW9uKHJlcy5zdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgIGZpbmFsRXJyb3IgPSBcIlNlcnZlciBtaWdodCBiZSBvZmZsaW5lXCIgKyAocmVzLnN0YXR1c1RleHQgPyBcIiAoXCIgKyByZXMuc3RhdHVzVGV4dCArIFwiKSBcIiA6IFwiXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5FeHRlbnNpb25zSW1wbC5oYW5kbGVFeGNlcHRpb24oZmluYWxTdGF0dXMsIGZpbmFsRXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBlcnJvcmUgcmVzdGl0dWlzY2UgdW5hIHByb21pc2UgY29uIGxhIHN0cmluZ2EgZmluYWxlIGRlbGwnZXJyb3JlIGluIG1vZG8gZGEgcG90ZXIgZmFyZSB1biBhd2FpdFxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSBjaGUgcmlzb2x2ZSBjb24gbGEgc3RyaW5nYSBmaW5hbGUgZGVsbCdlcnJvcmVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEh0dHBFcnJvclRleHQoZXJyOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgLy8gU2UgaG8gdW4gQmxvYiBwdcOyIGVzc2VyZSBvIHVuIENhbGxSZXN1bHQgbyBzdXBwb25nbyB1bmEgc2VtcGxpY2Ugc3RyaW5nYSxcclxuICAgIC8vIGFsdHJpbWVudGkgcG90cmViYmUgZXNzZXJlIGRpcmV0dGFtZW50ZSB1biBDYWxsUmVzdWx0LCBvcHB1cmUgdW5hIHNlbXBsaWNlIHN0cmluZ2FcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCbG9iKSB7XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGVyck1zZyA9ICg8YW55PmUudGFyZ2V0KS5yZXN1bHQ7XHJcbiAgICAgICAgICBsZXQganNvbmVyck1zZzogYW55O1xyXG4gICAgICAgICAgdHJ5IHsganNvbmVyck1zZyA9IEpTT04ucGFyc2UoZXJyTXNnKTsgfSBjYXRjaCAoZSkgeyB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqc29uZXJyTXNnICYmIHRoaXMuaXNDYWxsUmVzdWx0KGpzb25lcnJNc2cpID8ganNvbmVyck1zZy5lcnJvci5tZXNzYWdlIDogZXJyTXNnKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGVycilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmlzQ2FsbFJlc3VsdChlcnIpKVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGVycj8udG9TdHJpbmcoKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpY29ub3NjZSBzZSBsJ29nZ2V0dG8gw6ggZGkgdGlwbyAqKkNhbGxSZXN1bHQqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc0NhbGxSZXN1bHQoZXJyOiBhbnkpOiBlcnIgaXMgeyBlcnJvcjogeyBtZXNzYWdlOiBzdHJpbmcgfSB9IHtcclxuICAgIHJldHVybiAhIWVycj8uZXJyb3I/Lm1lc3NhZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaWNvbm9zY2Ugc2UgbCdlcnJvcmUgw6ggZGkgdGlwbyAqKkh0dHBFcnJvclJlc3BvbnNlKiogZSwgc2Ugc8OsLCBsbyBjYXN0YSBhbCB0aXBvIGNvcnJldHRvIHBlciBlc3NlcmUgdXRpbGl6emF0byBjb3JyZXR0YW1lbnRlIG5lbCBibG9jY28gZGkgY29kaWNlIHN1Y2Nlc3Npdm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gZXJyIEVycm9yZSBkYSBjb250cm9sbGFyZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNIdHRwRXJyb3JSZXNwb25zZShlcnI6IGFueSk6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XHJcbiAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICAgLyoqXHJcbiAgICogUmljb25vc2NlIHNlIGwnZXJyb3JlIMOoIGRpIHRpcG8gKipUeXBlRXJyb3IqKiBlLCBzZSBzw6wsIGxvIGNhc3RhIGFsIHRpcG8gY29ycmV0dG8gcGVyIGVzc2VyZSB1dGlsaXp6YXRvIGNvcnJldHRhbWVudGUgbmVsIGJsb2NjbyBkaSBjb2RpY2Ugc3VjY2Vzc2l2b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSBlcnIgRXJyb3JlIGRhIGNvbnRyb2xsYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1R5cGVFcnJvcihlcnI6IGFueSk6IGVyciBpcyBUeXBlRXJyb3Ige1xyXG4gICAgcmV0dXJuIGVyci5uYW1lID09IFwiVHlwZUVycm9yXCI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21lIGRpY2UgaWwgbm9tZSwgcmVnaXN0cmEgdW4gZXJyb3JlIGUgcmVzdGl0dWlzY2UgdW4gT2JzZXJ2YWJsZSB2dW90byBjb21lIHJpc3VsdGF0byBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7YW55fSByZXMgUmlzdWx0YXRvIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCBJZGVudGlmaWNhdGl2byBHVUlEIGRlbGxhIGNoaWFtYXRhIGVmZmV0dHVhdGFcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhbmRsZUVycm9yIEluZGljYSBzZSBnZXN0aXJlIGwnZXJyb3JlIHZpYSBsaWJyZXJpYSBvIHNlIGxpbWl0YXJzaSBhIHJlc3RpdHVpcmUgbCdPYnNlcnZhYmxlIHZ1b3RvXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge09ic2VydmFibGU8YW55Pn0gT2JzZXJ2YWJsZSB2dW90b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJFcnJvckFuZFJldHVybkVtcHR5T2JzZXJ2YWJsZShyZXM6IGFueSwgZ3VpZDogc3RyaW5nLCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKGhhbmRsZUVycm9yKVxyXG4gICAgICB0aGlzLm9uRXJyb3IocmVzLCBndWlkKTtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKSA9PiB7IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0byB1biBVcmwgZSBkZWkgcGFyYW1ldHJpIGNlcmNhIGRpIHJlY3VwZXJhcmUgbCdldmVudHVhbGUgb2dnZXR0byBnacOgIHNhbHZhdG8gaW4gY2FjaGUgY29uIGxlIGluZm9ybWF6aW9uaSBiYXNlIGRlbGxhIGNhY2hlIHN0ZXNzYVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVVJMIHN1IGN1aSBlZmZldHR1YXJlIGxhIGNoaWFtYXRhXHJcbiAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgUGFyYW1ldHJpIGRlbGxhIGNoaWFtYXRhIChudWxsaSBpbiBjYXNvIGRpIFBPU1QpXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge0NhY2hlSW5mb3N9IE9nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgc3VsbGEgY2FjaGUgcGVyIGwnb2dnZXR0byBzcGVjaWZpY2F0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJ5R2V0Q2FjaGVJbmZvcm1hdGlvbnModXJsOiBzdHJpbmcsIHBhcmFtczogSHR0cFBhcmFtcyk6IENhY2hlSW5mb3Mge1xyXG5cclxuICAgIGxldCBjYWNoaW5nS2V5ID0gbnVsbCwgY2FjaGVUaW1lID0gbnVsbCwgaXRlbSA9IG51bGw7XHJcbiAgICBsZXQgdXNlQ2FjaGluZyA9ICEhKC8jY2FjaGUvZ2kuZXhlYyh1cmwpKTtcclxuXHJcbiAgICBpZiAodXNlQ2FjaGluZykge1xyXG4gICAgICBsZXQgdG1wID0gLyNjYWNoZSg6Py0oXFxkKykpL2dpLmV4ZWModXJsKTtcclxuICAgICAgY2FjaGVUaW1lID0gdG1wID8gdG1wWzJdIDogbnVsbDtcclxuXHJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKFwiI2NhY2hlXCIgKyAoY2FjaGVUaW1lID8gXCItXCIgKyBjYWNoZVRpbWUgOiBcIlwiKSwgXCJcIik7XHJcbiAgICAgIGlmICh0aGlzLnVudGltZWRDYWNoZUV4cGlyZWQoKSAmJiAhY2FjaGVUaW1lKVxyXG4gICAgICAgIHRoaXMucmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpO1xyXG5cclxuICAgICAgY2FjaGluZ0tleSA9IHRoaXMubWFrZUNhY2hlS2V5KHVybCwgcGFyYW1zKTtcclxuICAgICAgbGV0IGNhY2hlS2V5ID0gY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICAgIGxldCBjYWNoZUxzID0gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0TG9jYWxJdGVtKGNhY2hlS2V5KTtcclxuICAgICAgbGV0IGNhY2hlID0gY2FjaGVMcyA/IGNhY2hlTHMgOiB7fTtcclxuXHJcbiAgICAgIGlmIChjYWNoZSAmJiBjYWNoZVtjYWNoaW5nS2V5XSAmJiAhdGhpcy50aW1lZENhY2hlSXRlbUV4cGlyZWQoY2FjaGVbY2FjaGluZ0tleV0pKSB7XHJcbiAgICAgICAgLy8gU2UgZ2VzdGlzY28gaWwgdGVtcG8gZXNhdHRvIGRlbGxhIGNhY2hlIHByaW1hIGRpIHJlc3RpdHVpcmUgbCdvZ2dldHRvIGNhY2hhdG8gbG8gcmlwdWxpc2NvIFxyXG4gICAgICAgIC8vIGRhbGxlIHByb3ByaWV0w6AgaW50ZXJuZSBjaGUgZ2xpIGhvIGFnZ2l1bnRvIHBlciBjb250cm9sbGFybmUgbGEgc2NhZGVuemFcclxuICAgICAgICBpZiAoY2FjaGVUaW1lKVxyXG4gICAgICAgICAgZGVsZXRlIGNhY2hlW2NhY2hpbmdLZXldLl9fZXhwaXJlO1xyXG5cclxuICAgICAgICBpdGVtID0gY2FjaGVbY2FjaGluZ0tleV1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFBlciBhc3NpY3VyYXJtaSBjaGUgaWwgcmlmZWlybWVudG8gZGVnbGkgb2dnZXR0aSBzaWEgZGl2ZXJzbyB1dGlsaXp6byBpbCBkZWVwQ2xvbmVcclxuICAgIHJldHVybiBuZXcgQ2FjaGVJbmZvcyh1cmwsIHVzZUNhY2hpbmcsIGNhY2hpbmdLZXksIGNhY2hlVGltZSwgdGhpcy51dGlzRXh0cy5kZWVwQ2xvbmUoaXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJpc2NlIHVuIG9nZ2V0dG8gbmVsbGEgY2FjaGUgYXBwcm9wcmlhdGEgaW4gYmFzZSBhbGxlIGluZm9ybWF6aW9uaSBjb250ZW51dGUgbmVsIHBhcmFtZXRybyAqKmNhY2hlSW5mb3MqKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7VH0gaXRlbSBPZ2dldHRvIGRhIGluc2VyaXJlIG5lbGxhIGNhY2hlXHJcbiAgICogQHBhcmFtIHtDYWNoZUluZm9zfSBjYWNoZUluZm9zIEluZm9ybWF6aW9uaSBzdWxsYSBjYWNoZSByZWN1cGVyYXRlIGRhIHVuYSBjaGlhbWF0YSBwcmVjZWRlbnRlIGEgKip0cnlHZXRDYWNoZUluZm9ybWF0aW9ucyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWNoZVJlc3BvbnNlPFQ+KGl0ZW06IFQsIGNhY2hlSW5mb3M6IENhY2hlSW5mb3MpOiB2b2lkIHtcclxuICAgIGxldCBjYWNoZUtleSA9IGNhY2hlSW5mb3MuY2FjaGVUaW1lID8gdGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSA6IHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlS2V5XHJcbiAgICBsZXQgY2FjaGVMcyA9IHRoaXMubG9jYWxTdG9yYWdlLmdldExvY2FsSXRlbShjYWNoZUtleSk7XHJcbiAgICBsZXQgY2FjaGUgPSBjYWNoZUxzID8gY2FjaGVMcyA6IHt9O1xyXG5cclxuICAgIGNhY2hlW2NhY2hlSW5mb3MuY2FjaGVLZXldID0gaXRlbTtcclxuICAgIGlmIChjYWNoZUluZm9zLmNhY2hlVGltZSlcclxuICAgICAgY2FjaGVbY2FjaGVJbmZvcy5jYWNoZUtleV0uX19leHBpcmUgPSBkYXlqcygpLmFkZChjYWNoZUluZm9zLmNhY2hlVGltZSwgXCJzZWNvbmRzXCIpO1xyXG5cclxuICAgIHRoaXMubG9jYWxTdG9yYWdlLnNldExvY2FsSXRlbShjYWNoZUtleSwgY2FjaGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbGxhIHNlIGxhIGNhY2hlIHBlciBsZSBjaGlhbWF0ZSBzZW56YSBleHBpcmUgdGltZSDDqCBzY2FkdXRhXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNhY2hlIMOoIHNjYWR1dGEgZSBkZXYnZXNzZXJlIHJpcHVsaXRhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdW50aW1lZENhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGxldCBleHBpcmUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5KSk7XHJcbiAgICByZXR1cm4gIWV4cGlyZSB8fCBleHBpcmUgJiYgZGF5anMoZXhwaXJlKSA8IGRheWpzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb250cm9sbGEgc2UgbGEgY2FjaGUgcGVyIHVuYSBjaGlhbWF0YSBjaGUgaGEgdW4gdGVtcG8gZGkgdml0YSBiZW4gZGVmaW5pdG8gw6ggc2NhZHV0YSBvIG1lbm9cclxuICAgKiBcclxuICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIHJlY3VwZXJhdG8gZGFsbGEgY2FjaGUgYSBjdWkgaG8gYWdnaXVudG8gbGEgY2hpYXZlIGludGVybmEgX19leHBpcmVcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gKip0cnVlKiogc2UgbGEgY2FjaGUgw6ggc2NhZHV0YSBlIGRldidlc3NlcmUgcmlwdWxpdGEsICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aW1lZENhY2hlSXRlbUV4cGlyZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZGF5anMoaXRlbS5fX2V4cGlyZSkgPCBkYXlqcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmlwdWxpc2NlIGxhIGNhY2hlIGUgaW1wb3N0YSBsYSBwcm9zc2ltYSBzY2FkZW56YSBhZCBhZGVzc28gKyAqKkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TKiogKHRva2VuIHZhbG9yaXp6YXRvIGluIGZhc2UgZGkgY29uZmlndXJhemlvbmUgZGFsbGEgcHJvcHJpZXTDoCAqKmNsaWVudENhY2hlRHVyYXRpb25TKiogZGVsbGEgY2xhc3NlICoqSHR0cFNlcnZpY2VNb2R1bGVDb25maWcqKilcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgcmVzZXRIdHRwVW50aW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwQ2FjaGVLZXksIHt9KS50b1Byb21pc2UoKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlSHR0cENhY2hlRXhwaXJlS2V5LCBKU09OLnN0cmluZ2lmeShkYXlqcygpLmFkZCh0aGlzLkNMSUVOVF9DQUNIRV9EVVJBVElPTl9TID8/IDM2MDAsIFwic2Vjb25kXCIpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXB1bGlzY2UgbGEgY2FjaGUgZGVsbGUgY2hpYW1hdGUgY29uIHVuIHRlbXBvIGRpIGV4cGlyZSBkZWZpbml0b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZXNldEh0dHBUaW1lZENhY2hlU3RvcmFnZSgpIHtcclxuICAgIGF3YWl0IHRoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIdHRwVGltZWRDYWNoZUtleSwge30pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhIHVuYSBjaGlhdmUgcGVyIGxhIGNhY2hlIGRlbGxlIGNoaWFtYXRlIGluIGJhc2UgYWQgVVJMIGUgUGFyYW1ldHJpIEhUVFBcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCBzdSBjdWkgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YVxyXG4gICAqIEBwYXJhbSB7SHR0cFBhcmFtc30gcGFyYW1zIFBhcmFtZXRyaSBkZWxsYSBjaGlhbWF0YVxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENoaWF2ZSBjaGUgcmFwcHJlc2VudGEgaW4gbWFuaWVyYSB1bml2b2NhIGxhIGNoaWFtYXRhXHJcbiAgICovXHJcbiAgIHByaXZhdGUgbWFrZUNhY2hlS2V5KHVybDogc3RyaW5nLCBwYXJhbXM6IEh0dHBQYXJhbXMpOiBzdHJpbmcge1xyXG4gICAgbGV0IGF1dGhLZXlQYXJ0ID0gKHRoaXMubWUgPyB0aGlzLm1lLklkdGVuYW50IDogXCJcIikgKyAodGhpcy5tZSAmJiB0aGlzLkNBQ0hFX0JZX1VTRVIgPyB0aGlzLm1lLklkVXNlciA6IFwiXCIpO1xyXG4gICAgbGV0IHBhcmFtc0tleVBhcnQgPSBwYXJhbXMgJiYgcGFyYW1zLmtleXMoKS5sZW5ndGggPiAwID8gcGFyYW1zLmtleXMoKS5yZWR1Y2UoKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiBwcmV2ICsgXCIsXCIgKyBuZXh0ICsgJz0nICsgcGFyYW1zLmdldChuZXh0KSwgXCJcIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIGF1dGhLZXlQYXJ0ICsgXCJfXCIgKyB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiYXBpXCIpICsgNCkgKyBcIj9cIiArIHBhcmFtc0tleVBhcnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF6aW9uZSBHVUlEXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTnVvdm8gR1VJRCBnZW5lcmF0byBpbiBtYW5pZXJhIGNhc3VhbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdldEdVSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNjcml2ZXJlIGxvZyBhIGNvbnNvbGUgcXVhbG9yYSAqKkRFQlVHX01PREUqKiByaXN1bHRhc3NlICoqdHJ1ZSoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRpIGxvZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuREVCVUdfTU9ERSlcclxuICAgICAgY29uc29sZS5sb2coXCJAaHR0cHNlcnZpY2U6IFwiICsgbWVzc2FnZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciBwZXIgbGEgbG9jYWxpenphemlvbmUgZGVpIG1lc3NhZ2dpXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGxvY2FsaXp6YXJlXHJcbiAgICogXHJcbiAgICogQHJldHVybnMge3N0cmluZ30gTWVzc2FnZ2lvIGxvY2FsaXp6YXRvXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2MobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghTG9jW21lc3NhZ2VdKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIlVudHJhbnNsYXRlZCBtZXNzYWdlOiBcIiArIG1lc3NhZ2UpXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIExvY1ttZXNzYWdlXVt0aGlzLkxPQ0FMRV07XHJcbiAgfVxyXG59Il19
@@ -547,6 +547,9 @@ class HTTPService {
547
547
  // In ogni caso questa posso rimuoverla
548
548
  delete this.callStatus[guid];
549
549
  }
550
+ // Se non ho nessun'altra chiamata in corso considero la situazione stabilizzatasi
551
+ if (Object.keys(this.callStatus).length == 0)
552
+ this.Stabilized.next(true);
550
553
  // Se vengo da una chiamata che ha aggiornato la cache a timer o globale marco il fatto che quella cache dev'essere aggiornata
551
554
  if (cacheInfos && cacheInfos.cache) {
552
555
  this.PersistTimedCacheASAP = this.PersistTimedCacheASAP || !!cacheInfos.cacheTime;
@@ -567,7 +570,6 @@ class HTTPService {
567
570
  toCall.push(this.localStorage.setItem(tmpKey, this.localStorage.getLocalItem(tmpKey)));
568
571
  }
569
572
  this.log(this.loc("No more HTTP calls to be executed, entering idle state and persisting modified caches") + "...");
570
- this.Stabilized.next(true);
571
573
  var ret = yield forkJoin(toCall).toPromise();
572
574
  if (ret)
573
575
  this.log(this.loc("Caches succesfully persisted"));