tnx-shared 5.1.339 → 5.1.342

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/bundles/tnx-shared.umd.js +31 -10
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/form-schema.d.ts +1 -0
  6. package/classes/form-schema.d.ts.map +1 -1
  7. package/components/common-app-component/app.menu.component.d.ts.map +1 -1
  8. package/components/common-app-component/common-app-component.d.ts.map +1 -1
  9. package/components/crud/crud-list/crud-list.component.d.ts +1 -0
  10. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  11. package/components/mask/mask.component.d.ts +2 -1
  12. package/components/mask/mask.component.d.ts.map +1 -1
  13. package/esm2015/classes/form-schema.js +2 -1
  14. package/esm2015/components/common-app-component/app.menu.component.js +2 -4
  15. package/esm2015/components/common-app-component/common-app-component.js +3 -2
  16. package/esm2015/components/crud/crud-form/crud-form.component.js +2 -2
  17. package/esm2015/components/crud/crud-list/crud-list.component.js +7 -2
  18. package/esm2015/components/mask/mask.component.js +11 -5
  19. package/esm2015/components/tn-dialog/tn-dialog.component.js +2 -2
  20. package/esm2015/models/types.js +5 -0
  21. package/esm2015/public-api.js +2 -1
  22. package/esm2015/services/base.service.js +4 -1
  23. package/esm2015/services/user.service.js +2 -2
  24. package/fesm2015/tnx-shared.js +30 -12
  25. package/fesm2015/tnx-shared.js.map +1 -1
  26. package/models/types.d.ts +15 -0
  27. package/models/types.d.ts.map +1 -0
  28. package/package.json +2 -2
  29. package/public-api.d.ts +1 -0
  30. package/public-api.d.ts.map +1 -1
  31. package/services/base.service.d.ts +1 -0
  32. package/services/base.service.d.ts.map +1 -1
  33. package/tnx-shared.metadata.json +1 -1
@@ -118,7 +118,7 @@ export class UserService extends BaseService {
118
118
  populateCurrentUser() {
119
119
  const storageItem = localStorage.getItem(this.CURRENT_USER_KEY);
120
120
  const user = new TnUser(Object.assign({}, JSON.parse(storageItem)));
121
- if (user) {
121
+ if (user && user.userId) {
122
122
  if (!user.userId) {
123
123
  this._authenService.logout();
124
124
  localStorage.setItem(this.CURRENT_USER_KEY, JSON.stringify(user));
@@ -591,4 +591,4 @@ UserService.ctorParameters = () => [
591
591
  { type: ExceptionHandlerService },
592
592
  { type: ApplicationContextService }
593
593
  ];
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL3VzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUd4RSxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7O0FBRW5ELHFCQUFxQjtBQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFLakIsTUFB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QUFjO1lBRmQsdUJBQXVCO1lBWHZCLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcclxuaW1wb3J0ICogYXMgSldUXyBmcm9tICdqd3QtZGVjb2RlJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCByZXRyeSwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9hcHAtY29udGV4dC9hcHBsaWNhdGlvbi1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlncy9tb2R1bGUtY29uZmlnJztcclxuaW1wb3J0IHsgQmFzaWNVc2VySW5mbyB9IGZyb20gJy4uL21vZGVscy9iYXNpYy11c2VyLWluZm8nO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEdyaWRJbmZvIH0gZnJvbSAnLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFBhZ2VPcHRpb25CYXNlIH0gZnJvbSAnLi4vbW9kZWxzL3BhZ2Utb3B0aW9uJztcclxuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcclxuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vbW9kZWxzL3RuLXVzZXInO1xyXG5pbXBvcnQgeyBBdXRoZW5TZXJ2aWNlIH0gZnJvbSAnLi9hdXRoZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEV4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi9leGNlcHRpb24taGFuZGxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4vbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lnbmFsUlNlcnZpY2UgfSBmcm9tICcuL3NpZ25hbHIuc2VydmljZSc7XHJcblxyXG4vLyBmaXggZm9yIHByb2QgYnVpbGRcclxuY29uc3QgSldUID0gSldUXztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XHJcbiAgICByZWFkb25seSBVU0VSX0lORk9fS0VZID0gJ3VzZXJfaW5mbyc7XHJcbiAgICByZWFkb25seSBDVVJSRU5UX1VTRVJfS0VZID0gJ2N1cnJlbnRfdXNlcl9pbmZvJztcclxuICAgIHJlYWRvbmx5IFJFVFJZX0NPVU5UOiBudW1iZXIgPSAwO1xyXG4gICAgcmVhZG9ubHkgUkVQTEFZX0NPVU5UOiBudW1iZXIgPSAxMDtcclxuICAgIHJlYWRvbmx5IERFRkFVTFRfQVZBVEFSX01BTEU7XHJcbiAgICByZWFkb25seSBERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICByZWFkb25seSBvcmdhbml6YXRpb25FbmRwb2ludDtcclxuICAgIHJlYWRvbmx5IF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX29hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3NpZ25hbHJTZXJ2aWNlOiBTaWduYWxSU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9leGNlcHRpb25IYW5kbGVyU2VydmljZTogRXhjZXB0aW9uSGFuZGxlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfYXBwbGljYXRpb25Db250ZXh0OiBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihodHRwLCBpbmplY3RvciwgYCR7X21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQuYXBpRG9tYWluLnVzZXJPcmdFbmRwb2ludH0vJHtfbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5hcGlWZXJzaW9ufS91c2VyYCk7XHJcbiAgICAgICAgdGhpcy5lbmRQb2ludCA9IF9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50LmFwaURvbWFpbi51c2VyT3JnRW5kcG9pbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuX21vZHVsZUNvbmZpZyA9IF9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuc2VydmljZVVyaSA9IHRoaXMuZ2V0U2VydmljZVVybCgpO1xyXG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uRW5kcG9pbnQgPSB0aGlzLmdldFNlcnZpY2VVcmwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwcE1ldGFkYXRhLm1haW4uZGVmYXVsdE1hbGVBdmF0YXI7XHJcbiAgICAgICAgdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEUgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBwTWV0YWRhdGEubWFpbi5kZWZhdWx0RmVtYWxlQXZhdGFyO1xyXG5cclxuICAgICAgICBjb25zdCByb290Q29udGV4dFN1YiA9IHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5yb290Q29udGV4dExvYWRlZC5zdWJzY3JpYmUocnMxID0+IHtcclxuICAgICAgICAgICAgaWYgKHJzMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYmluZGluZyBldmVudCB1c2VyIGNoYW5nZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfSU5GT19DSEFOR0VELCBycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJvb3RDb250ZXh0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2lnbmFsclNlcnZpY2Uuc3RhcnQobnVsbCwgJ1VTRVJfSU5GT19FRElURUQnLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5mb0NoYW5nZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFNlcnZpY2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNVc2VPbGRPcmdhbml6YXRpb24oKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyT2xkT3JnYW5pemF0aW9uID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaURvbWFpbi5vcmdhbml6YXRpb25FbmRwb2ludDtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3VzZXJPbGRPcmdhbml6YXRpb259L3VzZXJgO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlck9yZ0VuZHBvaW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaURvbWFpbi51c2VyT3JnRW5kcG9pbnQ7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt1c2VyT3JnRW5kcG9pbnR9LyR7dGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaVZlcnNpb259L3VzZXJgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVXNlT2xkT3JnYW5pemF0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHVzZU9sZE9yZ2FuaXphdGlvbiA9IHRoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC51c2VPbGRPcmdhbml6YXRpb247XHJcbiAgICAgICAgaWYgKHVzZU9sZE9yZ2FuaXphdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZ1bGxDYW5Cb0xhYmVsKGl0ZW0sIGdldERpc3BsYXlOYW1lID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgbGFiZWwgPSBnZXREaXNwbGF5TmFtZSAmJiBpdGVtLmRpc3BsYXlOYW1lID8gaXRlbS5kaXNwbGF5TmFtZSA6IHRoaXMuZ2V0VXNlck5hbWUoaXRlbSk7XHJcbiAgICAgICAgbGFiZWwgPSAoaXRlbS5tYUNodWNWdSA/IGAke2l0ZW0ubWFDaHVjVnV9LiBgIDogJycpICsgYCR7bGFiZWx9YCArIChpdGVtLnRlbkRvblZpID8gYCAtICR7aXRlbS50ZW5Eb25WaX1gIDogJycpO1xyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxXaXRoSW5mbyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGFDdXN0b21Sb3V0ZSgnV2l0aEluZm8nLCBmaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQYWdlV2l0aEluZm8oZ3JpZEluZm86IEdyaWRJbmZvKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlHcmlkUmVxdWVzdChncmlkSW5mbywgJ1dpdGhJbmZvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5mbyhpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChgJHt0aGlzLnNlcnZpY2VVcml9L0dldEluZm8vJHtpZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmZvRm9yV29ya2Zsb3coaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRHZXQoYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRJbmZvRm9yV29ya2Zsb3cvJHtpZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDbGFpbShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBKV1QuZGVmYXVsdCh0aGlzLl9vYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSk7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZWRba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRKd3REZWNvZGVkKCkge1xyXG4gICAgICAgIHJldHVybiBKV1QuZGVmYXVsdCh0aGlzLl9vYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlVXNlckluZm9DaGFuZ2UoZGF0YSkge1xyXG4gICAgICAgIGxldCBkYXRhT2JqO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBkYXRhT2JqID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5mb1VzZXIgPSBKU09OLnBhcnNlKGRhdGFPYmoubWVzc2FnZS5jb250ZW50KTtcclxuICAgICAgICBpZiAoaW5mb1VzZXIuSWQpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgaW5mb1VzZXIuSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldEJhc2ljVXNlckluZm8oaW5mb1VzZXIuSWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JBdXRvQ29tcGxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRGb3JBdXRvQ29tcGxldGU/a2V5PSR7a2V5fWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2V4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKVxyXG4gICAgICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvcHVsYXRlQ3VycmVudFVzZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVG5Vc2VyKHsgLi4uSlNPTi5wYXJzZShzdG9yYWdlSXRlbSkgfSk7XHJcbiAgICAgICAgaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgaWYgKCF1c2VyLnVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5sb2dvdXQoKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VXNlcklkID0gdXNlci51c2VySWQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIocmF3VXNlcklkKTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIub3JpZ2luSWQgPSB1c2VyLnVzZXJJZDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJJZCA9IHVzZXIuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVksIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyID0gdXNlcjtcclxuICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZmlyZVJlcGxheUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVELCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLnJlcGxheVN1YnNjcmliZU9uY2UoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9SRUFEWSwgcnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUaW1lTG9naW4gPSBycyA/PyBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdGhpcy5fb2F1dGhTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkOiBhbnkgPSBKV1QuZGVmYXVsdChhY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgICAgICAgICAvLyBDaHV54buDbiDEkeG7lWkgc2FuZyBkw7luZyBpbnN0YW5jZUlkIG7hur91IMSRxINuZyBuaOG6rXAgYuG6sW5nIGlkZW50aXR5djQgbmjGsG5nIHBo4bqjaSBz4butIGThu6VuZyBiYXNlIHVzZXJPcmd2NVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VXNlcklkID0gZGVjb2RlZC5zdWI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIocmF3VXNlcklkKTtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VySWRSZXN1bHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IGRlY29kZWQuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IHJhd1VzZXJJZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3RhZmZJbmZvKHVzZXJJZFJlc3VsdCkudGhlbihyczEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVG5Vc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmlzc3VwZXJ1c2VyID0gZGVjb2RlZC5pc3N1cGVydXNlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pc2FkbWluID0gZGVjb2RlZC5pc2FkbWluO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJJZCA9IHVzZXJJZFJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5mdWxsTmFtZSA9IGRlY29kZWQuZnVsbG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudXNlck5hbWUgPSBkZWNvZGVkLnVzZXJuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm1hQ2FuQm8gPSBkZWNvZGVkLm1hQ2FuQm87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWFOZ3VvaUhvYyA9IGRlY29kZWQubWFOZ3VvaUhvYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5hdmF0YXIgPSByczEuYXZhdGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnBvc2l0aW9uID0gcnMxLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnJvbGUgPSByczEucm9sZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5nZW5kZXIgPSByczEuZ2VuZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnBvc2l0aW9uQ29kZSA9IHJzMS5wb3NpdGlvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuaW5zdGFuY2VpZCA9IGRlY29kZWQuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pZENhbkJvID0gZGVjb2RlZC5pZENhbkJvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm9yaWdpbklkID0gZGVjb2RlZC5zdWI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZXIuYXZhdGFyIHx8IHVzZXIuYXZhdGFyID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlci5nZW5kZXIgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmF2YXRhciA9IHRoaXMuREVGQVVMVF9BVkFUQVJfTUFMRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVksIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZGF0YS5jdXJyZW50VXNlciA9IHVzZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWVMb2dpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuTkVFRF9DTEVBUl9QRVJNSVNTSU9OX0NBQ0hFKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmZpcmVSZXBsYXlFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0xPQURFRCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Byb2ZpbGVzJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzS2hvYVZpZW4oaWRMb2FpRG9uVmkpIHtcclxuICAgICAgICByZXR1cm4gaWRMb2FpRG9uVmkgPT0gJzIwJyB8fCBpZExvYWlEb25WaSA9PSAnNjAnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQm9Nb24oaWRMb2FpRG9uVmkpIHtcclxuICAgICAgICByZXR1cm4gaWRMb2FpRG9uVmkgPT0gJzIxJztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50VXNlcigpOiBUblVzZXIge1xyXG4gICAgICAgIHJldHVybiA8VG5Vc2VyPih0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VyTmFtZShpdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5mdWxsTmFtZU5ld1xyXG4gICAgICAgICAgICA/IGAke2l0ZW0uZnVsbE5hbWVOZXd9YFxyXG4gICAgICAgICAgICA6IGAke2l0ZW0ubGFzdE5hbWV9ICR7aXRlbS5maXN0TmFtZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJJZENvbWJpbmUoKSB7XHJcbiAgICAgICAgY29uc3QgcmF3VXNlcklkID0gdGhpcy5nZXRJZCgpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IE51bWJlcihyYXdVc2VySWQpO1xyXG4gICAgICAgIGxldCB1c2VySWRSZXN1bHQgPSAnJztcclxuICAgICAgICBpZiAoIWlzTmFOKHVzZXJJZCkpIHtcclxuICAgICAgICAgICAgdXNlcklkUmVzdWx0ID0gdGhpcy5nZXRJbnN0YW5jZUlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB1c2VySWRSZXN1bHQgPSByYXdVc2VySWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1c2VySWRSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGFmZkluZm8odXNlcklkKTogUHJvbWlzZTxUblVzZXI+IHtcclxuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9LyR7dXNlcklkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0Pih1cmwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gPFRuVXNlcj57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiBycy5kYXRhID8gcnMuZGF0YS5mdWxsTmFtZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBycy5kYXRhID8gcnMuZGF0YS5yb2xlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogcnMuZGF0YSA/IHJzLmRhdGEuYXZhdGFyIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmRlcjogcnMuZGF0YSA/IHJzLmRhdGEuZ2VuZGVyIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Db2RlOiBycy5kYXRhLnBvc2l0aW9uQ29kZSA/IHJzLmRhdGEucG9zaXRpb25Db2RlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlaWQ6IHJzLmRhdGEuaW5zdGFuY2VpZFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghb3AuYXZhdGFyIHx8IG9wLmF2YXRhciA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AuZ2VuZGVyID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmF2YXRhciA9IHRoaXMuREVGQVVMVF9BVkFUQVJfRkVNQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldElkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8VG5Vc2VyPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLnVzZXJJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRVc2VyKCkudXNlcklkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbnN0YW5jZUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8VG5Vc2VyPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLmluc3RhbmNlaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VXNlcigpLmluc3RhbmNlaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25saW5lKGZvcm1EYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3JlZ2lzdGVyT25saW5lYDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBmb3JtRGF0YSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCYXNpY1VzZXJJbmZvKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvPiB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlcklkKTtcclxuICAgICAgICAvLyBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2VySW5mb3MgPyB1c2VySW5mb3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IHVzZXJJZCkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VySWQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJJbmZvP2lkPSR7dXNlcklkfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcmVzcG9uc2UgdG8gbG9jYWwgc3RvcmFnZSBoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArIHJlcHNvbnNlLmRhdGEuaWQsIEpTT04uc3RyaW5naWZ5KHJlcHNvbnNlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2ljVXNlcnNJbmZvKHVzZXJJZHM6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mb1tdPiB7XHJcbiAgICAgICAgaWYgKCF1c2VySWRzIHx8IHVzZXJJZHMgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvW10+W10pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJbmZvcyA9IDxCYXNpY1VzZXJJbmZvW10+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZXJzID0gdXNlckluZm9zID8gdXNlckluZm9zLmZpbHRlcihpdGVtID0+IHVzZXJJZHMuaW5kZXhPZihgLCR7aXRlbS5pZH0sYCkgPiAtMSkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gdXNlckluZm9zID8gdXNlcklkcy5pbmRleE9mKHVzZXJJbmZvc1snaWQnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiByZXNvbHZlKHVzZXJJbmZvcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJzSW5mbz91c2VySWRzPSR7dXNlcklkc31gO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4gPEJhc2ljVXNlckluZm9bXT5yZXBzb25zZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSMOgbSBkw7luZyDEkeG7gyBs4bqleSB0aMO0bmcgdGluIGPGoSBi4bqjbiBuaGnhu4F1IG5nxrDhu51pIGTDuW5nIGThu7FhIHbDoG8gdXNlck5hbWUsXHJcbiAgICAgKiBoaeG7h24gdOG6oWkgY2jGsGEgY8OzIHRow7RuZyB0aW4gduG7gSDEkcahbiB24buLIHbDoCBjaOG7qWMgduG7pSBuZ8aw4budaSBkw7luZyDEkeG7gyBnaeG6o20gbG9hZCB2w6AgdsOsIGNoxrBhIGTDuW5nIMSR4bq/blxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lXHJcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm9bXT5cclxuICAgICAqL1xyXG4gICAgZ2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWUodXNlck5hbWU6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mbz4ge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlck5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJOYW1lID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTmFtZSAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWU/dXNlck5hbWU9JHt1c2VyTmFtZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSByZXNwb25zZSB0byBsb2NhbCBzdG9yYWdlIGhlcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkgKyAnXycgKyByZXBzb25zZS5kYXRhLnVzZXJOYW1lLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKS50b1Byb21pc2UoKS50aGVuKHJzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSg8YW55Pnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEjDoG0gZMO5bmcgxJHhu4MgbOG6pXkgdGjDtG5nIHRpbiBjxqEgYuG6o24gbmhp4buBdSBuZ8aw4budaSBkw7luZyBk4buxYSB2w6BvIHVzZXJOYW1lLFxyXG4gICAgICogaGnhu4duIHThuqFpIGNoxrBhIGPDsyB0aMO0bmcgdGluIHbhu4EgxJHGoW4gduG7iyB2w6AgY2jhu6ljIHbhu6UgbmfGsOG7nWkgZMO5bmcgxJHhu4MgZ2nhuqNtIGxvYWQgdsOgIHbDrCBjaMawYSBkw7luZyDEkeG6v25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZXNcclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8QmFzaWNVc2VySW5mb1tdPlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYXNpY1VzZXJzSW5mb0J5VXNlck5hbWVzKHVzZXJOYW1lczogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvW10+IHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlckluZm9zID0gPEJhc2ljVXNlckluZm9bXT5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJOYW1lcy5pbmRleE9mKHVzZXJJbmZvc1sndXNlck5hbWUnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VySW5mb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2Vyc0luZm9CeVVzZXJOYW1lcz91c2VyTmFtZXM9JHt1c2VyTmFtZXN9YDtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArICg8QmFzaWNVc2VySW5mb1tdPnJlcHNvbnNlLmRhdGEpLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgudXNlck5hbWUpIHJldHVybiB4LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvW10+cmVwc29uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICkudG9Qcm9taXNlKCkuY2F0Y2goZXJyID0+IFtdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydExpc3RVc2VySWRUb1N0cmluZyh1c2VySWRzOiBudW1iZXJbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHVzZXJJZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYCwke3VzZXJJZHMuam9pbignLCcpfSxgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJywnO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbGxCYXNpY1VzZXJJbmZvKGRhdGFTb3VyY2U6IGFueVtdLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBkYXRhU291cmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IGl0ZW1bcHJvcGVydHlOYW1lXS5pZCA/IGl0ZW1bcHJvcGVydHlOYW1lXS5pZCA6IGl0ZW1bcHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHVzZXIgPT4gdXNlci5pZCA9PT0gdXNlcklkKTtcclxuICAgICAgICAgICAgLy8gaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgLy8gICAgIGl0ZW1bcHJvcGVydHlOYW1lXSA9IHVzZXI7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJlc3RvcmVQYXNzd29yZChpdGVtOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KGAke3RoaXMuc2VydmljZVVyaX0vcmVzdG9yZVBhc3N3b3JkYCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0NoYW5nZVBhc3N3b3JkYDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UGFzc3dvcmQoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3Jlc2V0UGFzc3dvcmRgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRzQnlNYW5hZ2VySWRBcnJheUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRMb3dlclN0YWZmc0J5VXNlcklkP3VzZXJJZD0ke2lkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChhcGlVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc0FkbWluKHVzZXJJZDogbnVtYmVyLCBpc0FkbWluOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9tYXJrQXNBZG1pbi8ke3VzZXJJZH0vJHtpc0FkbWlufWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgLnB1dDxSZXNwb25zZVJlc3VsdD4odXJsLCBpc0FkbWluKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc1JlcHJlc2VudCh1c2VySWQ6IG51bWJlciwgaXNSZXByZXNlbnQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vbWFya0FzUmVwcmVzZW50LyR7dXNlcklkfS8ke2lzUmVwcmVzZW50fWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KHVybCwgaXNSZXByZXNlbnQpXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0c0J5T3JnYW5pemF0aW9uTGlzdElkKHBhZ2VPcHRpb246IFBhZ2VPcHRpb25CYXNlLCBmdW5HZXROYW1lOiBzdHJpbmcgPSAnJywgb3B0aW9uUGFyYW1ldGVyOiBzdHJpbmcgPSAnJywgZGVmYXVsdFBhcmFtZXRlcjogc3RyaW5nID0gJycpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGxldCBxdWVyeVN0cmluZyA9IGA/a2V5PSR7cGFnZU9wdGlvbi5xdWVyeX1gO1xyXG5cclxuICAgICAgICBpZiAoIXBhZ2VPcHRpb24ub2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHBhZ2VPcHRpb24ub2Zmc2V0ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmb2Zmc2V0PSR7cGFnZU9wdGlvbi5vZmZzZXR9YDtcclxuXHJcblxyXG4gICAgICAgIGlmICghcGFnZU9wdGlvbi5saW1pdCkge1xyXG4gICAgICAgICAgICBwYWdlT3B0aW9uLmxpbWl0ID0gdGhpcy5MSU1JVF9ERUZBVUxUO1xyXG4gICAgICAgIH1cclxuICAgICAgICBxdWVyeVN0cmluZyArPSBgJmxpbWl0PSR7cGFnZU9wdGlvbi5saW1pdCArIDF9YDtcclxuXHJcblxyXG4gICAgICAgIGlmIChwYWdlT3B0aW9uLnNvcnRGaWVsZCkge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJnNvcnRGaWVsZD0ke3BhZ2VPcHRpb24uc29ydEZpZWxkfSZpc0FzYz0ke3BhZ2VPcHRpb24uaXNBc2N9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlZmF1bHRQYXJhbWV0ZXIgIT0gJycpIHtcclxuICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gYCYke2RlZmF1bHRQYXJhbWV0ZXJ9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvblBhcmFtZXRlciAhPSAnJykge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJiR7b3B0aW9uUGFyYW1ldGVyfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMub3JnYW5pemF0aW9uRW5kcG9pbnR9JHtmdW5HZXROYW1lfSR7cXVlcnlTdHJpbmd9YDtcclxuICAgICAgICBpZiAocGFnZU9wdGlvbi5pc0lnbm9yZUNsaWVudENhY2hlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElnbm9yZUNsaWVudENhY2hlKGFwaVVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGFwaVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0c0J5T3JnYW5pemF0aW9uSWQob3JnYW5pemF0aW9uSWQ6IHN0cmluZywga2V5d29yZD86IHN0cmluZywgb2Zmc2V0PzogbnVtYmVyLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgaWYgKCFrZXl3b3JkKSB7XHJcbiAgICAgICAgICAgIGtleXdvcmQgPSAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9mZnNldCkge1xyXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFsaW1pdCkge1xyXG4gICAgICAgICAgICBsaW1pdCA9IDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRzQnlPcmdhbml6YXRpb25JZGBcclxuICAgICAgICAgICAgKyBgP29yZ2FuaXphdGlvbklkPSR7b3JnYW5pemF0aW9uSWR9YFxyXG4gICAgICAgICAgICArIGAma2V5d29yZD0ke2tleXdvcmR9YFxyXG4gICAgICAgICAgICArIGAmb2Zmc2V0PSR7b2Zmc2V0fWBcclxuICAgICAgICAgICAgKyBgJmxpbWl0PSR7bGltaXR9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGFwaVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGVmYXVsdEF2YXRhcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IGNvbW1vblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoQ29tbW9uU2VydmljZSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyb3IsIGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NrVXNlcihpdGVtOiBhbnkpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vbG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja1VzZXIoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3VubG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU3VwZXJVc2VyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIuaXNzdXBlcnVzZXIgPT09ICdUcnVlJztcclxuICAgIH1cclxuXHJcbiAgICBpc0FkbWluKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIuaXNhZG1pbiA9PT0gJ1RydWUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsaWRBY2Nlc3NUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2Vyc0J5R3JvdXBDb2RlKGdyb3VwQ29kZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0VXNlcnNCeUdyb3VwQ29kZT9ncm91cENvZGU9JHtncm91cENvZGV9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLl9leGNlcHRpb25IYW5kbGVyU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuc2VydmljZVVyaX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2luaFZpZW5BY2NvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHVzZXJMb2dpbiA9IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICBpZiAodXNlckxvZ2luKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyTG9naW4ubWFOZ3VvaUhvYykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBhZ2VVc2VySW5mbyh1c2VySWRzOiBzdHJpbmcpOiBQcm9taXNlPEJhc2ljVXNlckluZm9bXT4ge1xyXG4gICAgICAgIGlmICghdXNlcklkcyB8fCB1c2VySWRzID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSg8QmFzaWNVc2VySW5mb1tdPltdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZKTtcclxuICAgICAgICBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG5cclxuICAgICAgICAvLyBjb25zdCB1c2VycyA9IHVzZXJJbmZvcyA/IHVzZXJJbmZvcy5maWx0ZXIoaXRlbSA9PiB1c2VySWRzLmluZGV4T2YoYCwke2l0ZW0uaWR9LGApID4gLTEpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJJZHMuaW5kZXhPZih1c2VySW5mb3NbJ2lkJ10pID4gLTEgOiBudWxsO1xyXG4gICAgICAgIGlmIChjaGVjaykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VySW5mb3MpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0UGFnZWRgO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2lkJyxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2luJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdXNlcklkc1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChpdGVtRmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAxMDAwMFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc29ydHM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIGdyaWRJbmZvKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4gPEJhc2ljVXNlckluZm9bXT5yZXBzb25zZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
594
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL3VzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUd4RSxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7O0FBRW5ELHFCQUFxQjtBQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFLakIsTUFB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QUFhO1lBWGIsWUFBWTtZQWdCWixjQUFjO1lBRmQsdUJBQXVCO1lBWHZCLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcclxuaW1wb3J0ICogYXMgSldUXyBmcm9tICdqd3QtZGVjb2RlJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCByZXRyeSwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9hcHAtY29udGV4dC9hcHBsaWNhdGlvbi1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlncy9tb2R1bGUtY29uZmlnJztcclxuaW1wb3J0IHsgQmFzaWNVc2VySW5mbyB9IGZyb20gJy4uL21vZGVscy9iYXNpYy11c2VyLWluZm8nO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEdyaWRJbmZvIH0gZnJvbSAnLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IFBhZ2VPcHRpb25CYXNlIH0gZnJvbSAnLi4vbW9kZWxzL3BhZ2Utb3B0aW9uJztcclxuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcclxuaW1wb3J0IHsgVG5Vc2VyIH0gZnJvbSAnLi4vbW9kZWxzL3RuLXVzZXInO1xyXG5pbXBvcnQgeyBBdXRoZW5TZXJ2aWNlIH0gZnJvbSAnLi9hdXRoZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21tb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEV4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi9leGNlcHRpb24taGFuZGxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnU2VydmljZSB9IGZyb20gJy4vbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lnbmFsUlNlcnZpY2UgfSBmcm9tICcuL3NpZ25hbHIuc2VydmljZSc7XHJcblxyXG4vLyBmaXggZm9yIHByb2QgYnVpbGRcclxuY29uc3QgSldUID0gSldUXztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlclNlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSB7XHJcbiAgICByZWFkb25seSBVU0VSX0lORk9fS0VZID0gJ3VzZXJfaW5mbyc7XHJcbiAgICByZWFkb25seSBDVVJSRU5UX1VTRVJfS0VZID0gJ2N1cnJlbnRfdXNlcl9pbmZvJztcclxuICAgIHJlYWRvbmx5IFJFVFJZX0NPVU5UOiBudW1iZXIgPSAwO1xyXG4gICAgcmVhZG9ubHkgUkVQTEFZX0NPVU5UOiBudW1iZXIgPSAxMDtcclxuICAgIHJlYWRvbmx5IERFRkFVTFRfQVZBVEFSX01BTEU7XHJcbiAgICByZWFkb25seSBERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICByZWFkb25seSBvcmdhbml6YXRpb25FbmRwb2ludDtcclxuICAgIHJlYWRvbmx5IF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9hdXRoZW5TZXJ2aWNlOiBBdXRoZW5TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX29hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX3NpZ25hbHJTZXJ2aWNlOiBTaWduYWxSU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9leGNlcHRpb25IYW5kbGVyU2VydmljZTogRXhjZXB0aW9uSGFuZGxlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfYXBwbGljYXRpb25Db250ZXh0OiBBcHBsaWNhdGlvbkNvbnRleHRTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihodHRwLCBpbmplY3RvciwgYCR7X21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQuYXBpRG9tYWluLnVzZXJPcmdFbmRwb2ludH0vJHtfbW9kdWxlQ29uZmlnU2VydmljZS5nZXRDb25maWcoKS5lbnZpcm9ubWVudC5hcGlWZXJzaW9ufS91c2VyYCk7XHJcbiAgICAgICAgdGhpcy5lbmRQb2ludCA9IF9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50LmFwaURvbWFpbi51c2VyT3JnRW5kcG9pbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuX21vZHVsZUNvbmZpZyA9IF9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuc2VydmljZVVyaSA9IHRoaXMuZ2V0U2VydmljZVVybCgpO1xyXG4gICAgICAgIHRoaXMub3JnYW5pemF0aW9uRW5kcG9pbnQgPSB0aGlzLmdldFNlcnZpY2VVcmwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwcE1ldGFkYXRhLm1haW4uZGVmYXVsdE1hbGVBdmF0YXI7XHJcbiAgICAgICAgdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEUgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQuYXBwTWV0YWRhdGEubWFpbi5kZWZhdWx0RmVtYWxlQXZhdGFyO1xyXG5cclxuICAgICAgICBjb25zdCByb290Q29udGV4dFN1YiA9IHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5yb290Q29udGV4dExvYWRlZC5zdWJzY3JpYmUocnMxID0+IHtcclxuICAgICAgICAgICAgaWYgKHJzMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYmluZGluZyBldmVudCB1c2VyIGNoYW5nZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfSU5GT19DSEFOR0VELCBycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJvb3RDb250ZXh0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2lnbmFsclNlcnZpY2Uuc3RhcnQobnVsbCwgJ1VTRVJfSU5GT19FRElURUQnLCBkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVVc2VySW5mb0NoYW5nZShkYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFNlcnZpY2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNVc2VPbGRPcmdhbml6YXRpb24oKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyT2xkT3JnYW5pemF0aW9uID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaURvbWFpbi5vcmdhbml6YXRpb25FbmRwb2ludDtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3VzZXJPbGRPcmdhbml6YXRpb259L3VzZXJgO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdXNlck9yZ0VuZHBvaW50ID0gdGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaURvbWFpbi51c2VyT3JnRW5kcG9pbnQ7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt1c2VyT3JnRW5kcG9pbnR9LyR7dGhpcy5fbW9kdWxlQ29uZmlnLmVudmlyb25tZW50LmFwaVZlcnNpb259L3VzZXJgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVXNlT2xkT3JnYW5pemF0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHVzZU9sZE9yZ2FuaXphdGlvbiA9IHRoaXMuX21vZHVsZUNvbmZpZy5lbnZpcm9ubWVudC51c2VPbGRPcmdhbml6YXRpb247XHJcbiAgICAgICAgaWYgKHVzZU9sZE9yZ2FuaXphdGlvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZ1bGxDYW5Cb0xhYmVsKGl0ZW0sIGdldERpc3BsYXlOYW1lID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgbGFiZWwgPSBnZXREaXNwbGF5TmFtZSAmJiBpdGVtLmRpc3BsYXlOYW1lID8gaXRlbS5kaXNwbGF5TmFtZSA6IHRoaXMuZ2V0VXNlck5hbWUoaXRlbSk7XHJcbiAgICAgICAgbGFiZWwgPSAoaXRlbS5tYUNodWNWdSA/IGAke2l0ZW0ubWFDaHVjVnV9LiBgIDogJycpICsgYCR7bGFiZWx9YCArIChpdGVtLnRlbkRvblZpID8gYCAtICR7aXRlbS50ZW5Eb25WaX1gIDogJycpO1xyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGxXaXRoSW5mbyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGFDdXN0b21Sb3V0ZSgnV2l0aEluZm8nLCBmaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQYWdlV2l0aEluZm8oZ3JpZEluZm86IEdyaWRJbmZvKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnlHcmlkUmVxdWVzdChncmlkSW5mbywgJ1dpdGhJbmZvJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW5mbyhpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChgJHt0aGlzLnNlcnZpY2VVcml9L0dldEluZm8vJHtpZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmZvRm9yV29ya2Zsb3coaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRHZXQoYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRJbmZvRm9yV29ya2Zsb3cvJHtpZH1gKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDbGFpbShrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBKV1QuZGVmYXVsdCh0aGlzLl9vYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSk7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZWRba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRKd3REZWNvZGVkKCkge1xyXG4gICAgICAgIHJldHVybiBKV1QuZGVmYXVsdCh0aGlzLl9vYXV0aFNlcnZpY2UuZ2V0QWNjZXNzVG9rZW4oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlVXNlckluZm9DaGFuZ2UoZGF0YSkge1xyXG4gICAgICAgIGxldCBkYXRhT2JqO1xyXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBkYXRhT2JqID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5mb1VzZXIgPSBKU09OLnBhcnNlKGRhdGFPYmoubWVzc2FnZS5jb250ZW50KTtcclxuICAgICAgICBpZiAoaW5mb1VzZXIuSWQpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgaW5mb1VzZXIuSWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldEJhc2ljVXNlckluZm8oaW5mb1VzZXIuSWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRGb3JBdXRvQ29tcGxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRGb3JBdXRvQ29tcGxldGU/a2V5PSR7a2V5fWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2V4Y2VwdGlvbkhhbmRsZXJTZXJ2aWNlLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKVxyXG4gICAgICAgICAgICApLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvcHVsYXRlQ3VycmVudFVzZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVG5Vc2VyKHsgLi4uSlNPTi5wYXJzZShzdG9yYWdlSXRlbSkgfSk7XHJcbiAgICAgICAgaWYgKHVzZXIgJiYgdXNlci51c2VySWQpIHtcclxuICAgICAgICAgICAgaWYgKCF1c2VyLnVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXV0aGVuU2VydmljZS5sb2dvdXQoKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ1VSUkVOVF9VU0VSX0tFWSwgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VXNlcklkID0gdXNlci51c2VySWQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIocmF3VXNlcklkKTtcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXIub3JpZ2luSWQgPSB1c2VyLnVzZXJJZDtcclxuICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJJZCA9IHVzZXIuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVksIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyID0gdXNlcjtcclxuICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZmlyZVJlcGxheUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULlVTRVJfTE9BREVELCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLnJlcGxheVN1YnNjcmliZU9uY2UoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuVVNFUl9SRUFEWSwgcnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUaW1lTG9naW4gPSBycyA/PyBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdGhpcy5fb2F1dGhTZXJ2aWNlLmdldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkOiBhbnkgPSBKV1QuZGVmYXVsdChhY2Nlc3NUb2tlbik7XHJcbiAgICAgICAgICAgICAgICAvLyBDaHV54buDbiDEkeG7lWkgc2FuZyBkw7luZyBpbnN0YW5jZUlkIG7hur91IMSRxINuZyBuaOG6rXAgYuG6sW5nIGlkZW50aXR5djQgbmjGsG5nIHBo4bqjaSBz4butIGThu6VuZyBiYXNlIHVzZXJPcmd2NVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmF3VXNlcklkID0gZGVjb2RlZC5zdWI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIocmF3VXNlcklkKTtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VySWRSZXN1bHQgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odXNlcklkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IGRlY29kZWQuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFJlc3VsdCA9IHJhd1VzZXJJZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U3RhZmZJbmZvKHVzZXJJZFJlc3VsdCkudGhlbihyczEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVG5Vc2VyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJzMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmlzc3VwZXJ1c2VyID0gZGVjb2RlZC5pc3N1cGVydXNlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pc2FkbWluID0gZGVjb2RlZC5pc2FkbWluO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnVzZXJJZCA9IHVzZXJJZFJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5mdWxsTmFtZSA9IGRlY29kZWQuZnVsbG5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIudXNlck5hbWUgPSBkZWNvZGVkLnVzZXJuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm1hQ2FuQm8gPSBkZWNvZGVkLm1hQ2FuQm87XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIubWFOZ3VvaUhvYyA9IGRlY29kZWQubWFOZ3VvaUhvYztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5hdmF0YXIgPSByczEuYXZhdGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnBvc2l0aW9uID0gcnMxLnBvc2l0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnJvbGUgPSByczEucm9sZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5nZW5kZXIgPSByczEuZ2VuZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnBvc2l0aW9uQ29kZSA9IHJzMS5wb3NpdGlvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuaW5zdGFuY2VpZCA9IGRlY29kZWQuaW5zdGFuY2VpZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlci5pZENhbkJvID0gZGVjb2RlZC5pZENhbkJvO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLm9yaWdpbklkID0gZGVjb2RlZC5zdWI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZXIuYXZhdGFyIHx8IHVzZXIuYXZhdGFyID09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlci5nZW5kZXIgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9GRU1BTEU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmF2YXRhciA9IHRoaXMuREVGQVVMVF9BVkFUQVJfTUFMRTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVksIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25Db250ZXh0LmdldFJvb3RDb250ZXh0KCkuZGF0YS5jdXJyZW50VXNlciA9IHVzZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFRpbWVMb2dpbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuTkVFRF9DTEVBUl9QRVJNSVNTSU9OX0NBQ0hFKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmZpcmVSZXBsYXlFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5VU0VSX0xPQURFRCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgZXJyID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVJbmZvKCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3Byb2ZpbGVzJykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzS2hvYVZpZW4oaWRMb2FpRG9uVmkpIHtcclxuICAgICAgICByZXR1cm4gaWRMb2FpRG9uVmkgPT0gJzIwJyB8fCBpZExvYWlEb25WaSA9PSAnNjAnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQm9Nb24oaWRMb2FpRG9uVmkpIHtcclxuICAgICAgICByZXR1cm4gaWRMb2FpRG9uVmkgPT0gJzIxJztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50VXNlcigpOiBUblVzZXIge1xyXG4gICAgICAgIHJldHVybiA8VG5Vc2VyPih0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VyTmFtZShpdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5mdWxsTmFtZU5ld1xyXG4gICAgICAgICAgICA/IGAke2l0ZW0uZnVsbE5hbWVOZXd9YFxyXG4gICAgICAgICAgICA6IGAke2l0ZW0ubGFzdE5hbWV9ICR7aXRlbS5maXN0TmFtZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFVzZXJJZENvbWJpbmUoKSB7XHJcbiAgICAgICAgY29uc3QgcmF3VXNlcklkID0gdGhpcy5nZXRJZCgpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IE51bWJlcihyYXdVc2VySWQpO1xyXG4gICAgICAgIGxldCB1c2VySWRSZXN1bHQgPSAnJztcclxuICAgICAgICBpZiAoIWlzTmFOKHVzZXJJZCkpIHtcclxuICAgICAgICAgICAgdXNlcklkUmVzdWx0ID0gdGhpcy5nZXRJbnN0YW5jZUlkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB1c2VySWRSZXN1bHQgPSByYXdVc2VySWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1c2VySWRSZXN1bHQudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGFmZkluZm8odXNlcklkKTogUHJvbWlzZTxUblVzZXI+IHtcclxuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9LyR7dXNlcklkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0Pih1cmwpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wID0gPFRuVXNlcj57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiBycy5kYXRhID8gcnMuZGF0YS5mdWxsTmFtZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBycy5kYXRhID8gcnMuZGF0YS5yb2xlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhcjogcnMuZGF0YSA/IHJzLmRhdGEuYXZhdGFyIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmRlcjogcnMuZGF0YSA/IHJzLmRhdGEuZ2VuZGVyIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Db2RlOiBycy5kYXRhLnBvc2l0aW9uQ29kZSA/IHJzLmRhdGEucG9zaXRpb25Db2RlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlaWQ6IHJzLmRhdGEuaW5zdGFuY2VpZFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghb3AuYXZhdGFyIHx8IG9wLmF2YXRhciA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AuZ2VuZGVyID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmF2YXRhciA9IHRoaXMuREVGQVVMVF9BVkFUQVJfRkVNQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYXZhdGFyID0gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3A7XHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldElkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8VG5Vc2VyPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLnVzZXJJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRVc2VyKCkudXNlcklkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbnN0YW5jZUlkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNVUlJFTlRfVVNFUl9LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8VG5Vc2VyPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIGlmICh1c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VyLmluc3RhbmNlaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50VXNlcigpLmluc3RhbmNlaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25saW5lKGZvcm1EYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3JlZ2lzdGVyT25saW5lYDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBmb3JtRGF0YSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCYXNpY1VzZXJJbmZvKHVzZXJJZDogbnVtYmVyKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvPiB7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlcklkKTtcclxuICAgICAgICAvLyBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2VySW5mb3MgPyB1c2VySW5mb3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IHVzZXJJZCkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJJZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VySWQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJJbmZvP2lkPSR7dXNlcklkfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkodGhpcy5SRVBMQVlfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcmVzcG9uc2UgdG8gbG9jYWwgc3RvcmFnZSBoZXJlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArIHJlcHNvbnNlLmRhdGEuaWQsIEpTT04uc3RyaW5naWZ5KHJlcHNvbnNlLmRhdGEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2ljVXNlcnNJbmZvKHVzZXJJZHM6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mb1tdPiB7XHJcbiAgICAgICAgaWYgKCF1c2VySWRzIHx8IHVzZXJJZHMgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvW10+W10pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJbmZvcyA9IDxCYXNpY1VzZXJJbmZvW10+SlNPTi5wYXJzZShzdG9yYWdlSXRlbSk7XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IHVzZXJzID0gdXNlckluZm9zID8gdXNlckluZm9zLmZpbHRlcihpdGVtID0+IHVzZXJJZHMuaW5kZXhPZihgLCR7aXRlbS5pZH0sYCkgPiAtMSkgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gdXNlckluZm9zID8gdXNlcklkcy5pbmRleE9mKHVzZXJJbmZvc1snaWQnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiByZXNvbHZlKHVzZXJJbmZvcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN2VXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRCYXNpY1VzZXJzSW5mbz91c2VySWRzPSR7dXNlcklkc31gO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHN2VXJsKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4gPEJhc2ljVXNlckluZm9bXT5yZXBzb25zZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSMOgbSBkw7luZyDEkeG7gyBs4bqleSB0aMO0bmcgdGluIGPGoSBi4bqjbiBuaGnhu4F1IG5nxrDhu51pIGTDuW5nIGThu7FhIHbDoG8gdXNlck5hbWUsXHJcbiAgICAgKiBoaeG7h24gdOG6oWkgY2jGsGEgY8OzIHRow7RuZyB0aW4gduG7gSDEkcahbiB24buLIHbDoCBjaOG7qWMgduG7pSBuZ8aw4budaSBkw7luZyDEkeG7gyBnaeG6o20gbG9hZCB2w6AgdsOsIGNoxrBhIGTDuW5nIMSR4bq/blxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJOYW1lXHJcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm9bXT5cclxuICAgICAqL1xyXG4gICAgZ2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWUodXNlck5hbWU6IHN0cmluZyk6IFByb21pc2U8QmFzaWNVc2VySW5mbz4ge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZICsgJ18nICsgdXNlck5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSA8QmFzaWNVc2VySW5mbz5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBpZiAodXNlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVzZXJOYW1lID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKDxCYXNpY1VzZXJJbmZvPnt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTmFtZSAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2VySW5mb0J5VXNlck5hbWU/dXNlck5hbWU9JHt1c2VyTmFtZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9odHRwLmdldDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSh0aGlzLlJFUExBWV9DT1VOVCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChyZXBzb25zZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSByZXNwb25zZSB0byBsb2NhbCBzdG9yYWdlIGhlcmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlVTRVJfSU5GT19LRVkgKyAnXycgKyByZXBzb25zZS5kYXRhLnVzZXJOYW1lLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvPnJlcHNvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKS50b1Byb21pc2UoKS50aGVuKHJzcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSg8YW55Pnt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEjDoG0gZMO5bmcgxJHhu4MgbOG6pXkgdGjDtG5nIHRpbiBjxqEgYuG6o24gbmhp4buBdSBuZ8aw4budaSBkw7luZyBk4buxYSB2w6BvIHVzZXJOYW1lLFxyXG4gICAgICogaGnhu4duIHThuqFpIGNoxrBhIGPDsyB0aMO0bmcgdGluIHbhu4EgxJHGoW4gduG7iyB2w6AgY2jhu6ljIHbhu6UgbmfGsOG7nWkgZMO5bmcgxJHhu4MgZ2nhuqNtIGxvYWQgdsOgIHbDrCBjaMawYSBkw7luZyDEkeG6v25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyTmFtZXNcclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8QmFzaWNVc2VySW5mb1tdPlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRCYXNpY1VzZXJzSW5mb0J5VXNlck5hbWVzKHVzZXJOYW1lczogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1VzZXJJbmZvW10+IHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlSXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSk7XHJcbiAgICAgICAgY29uc3QgdXNlckluZm9zID0gPEJhc2ljVXNlckluZm9bXT5KU09OLnBhcnNlKHN0b3JhZ2VJdGVtKTtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJOYW1lcy5pbmRleE9mKHVzZXJJbmZvc1sndXNlck5hbWUnXSkgPiAtMSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNoZWNrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1c2VySW5mb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0QmFzaWNVc2Vyc0luZm9CeVVzZXJOYW1lcz91c2VyTmFtZXM9JHt1c2VyTmFtZXN9YDtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHAuZ2V0PFJlc3BvbnNlUmVzdWx0PihzdlVybCkucGlwZShcclxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgIHJldHJ5KHRoaXMuUkVUUllfQ09VTlQpLFxyXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSksXHJcbiAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuVVNFUl9JTkZPX0tFWSArICdfJyArICg8QmFzaWNVc2VySW5mb1tdPnJlcHNvbnNlLmRhdGEpLm1hcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgudXNlck5hbWUpIHJldHVybiB4LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLCBKU09OLnN0cmluZ2lmeShyZXBzb25zZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxCYXNpY1VzZXJJbmZvW10+cmVwc29uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICkudG9Qcm9taXNlKCkuY2F0Y2goZXJyID0+IFtdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydExpc3RVc2VySWRUb1N0cmluZyh1c2VySWRzOiBudW1iZXJbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHVzZXJJZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYCwke3VzZXJJZHMuam9pbignLCcpfSxgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJywnO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbGxCYXNpY1VzZXJJbmZvKGRhdGFTb3VyY2U6IGFueVtdLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgICAgICBkYXRhU291cmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJZCA9IGl0ZW1bcHJvcGVydHlOYW1lXS5pZCA/IGl0ZW1bcHJvcGVydHlOYW1lXS5pZCA6IGl0ZW1bcHJvcGVydHlOYW1lXTtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHVzZXIgPT4gdXNlci5pZCA9PT0gdXNlcklkKTtcclxuICAgICAgICAgICAgLy8gaWYgKHVzZXIpIHtcclxuICAgICAgICAgICAgLy8gICAgIGl0ZW1bcHJvcGVydHlOYW1lXSA9IHVzZXI7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJlc3RvcmVQYXNzd29yZChpdGVtOiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KGAke3RoaXMuc2VydmljZVVyaX0vcmVzdG9yZVBhc3N3b3JkYCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VQYXNzd29yZCh1c2VySWQ6IHN0cmluZywgaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L0NoYW5nZVBhc3N3b3JkYDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UGFzc3dvcmQoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3Jlc2V0UGFzc3dvcmRgO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybCwgaXRlbSlcclxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBHZXRzQnlNYW5hZ2VySWRBcnJheUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRMb3dlclN0YWZmc0J5VXNlcklkP3VzZXJJZD0ke2lkfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEdldChhcGlVcmwpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc0FkbWluKHVzZXJJZDogbnVtYmVyLCBpc0FkbWluOiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9tYXJrQXNBZG1pbi8ke3VzZXJJZH0vJHtpc0FkbWlufWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBcclxuICAgICAgICAgICAgLnB1dDxSZXNwb25zZVJlc3VsdD4odXJsLCBpc0FkbWluKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtBc1JlcHJlc2VudCh1c2VySWQ6IG51bWJlciwgaXNSZXByZXNlbnQ6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vbWFya0FzUmVwcmVzZW50LyR7dXNlcklkfS8ke2lzUmVwcmVzZW50fWA7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwXHJcbiAgICAgICAgICAgIC5wdXQ8UmVzcG9uc2VSZXN1bHQ+KHVybCwgaXNSZXByZXNlbnQpXHJcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0c0J5T3JnYW5pemF0aW9uTGlzdElkKHBhZ2VPcHRpb246IFBhZ2VPcHRpb25CYXNlLCBmdW5HZXROYW1lOiBzdHJpbmcgPSAnJywgb3B0aW9uUGFyYW1ldGVyOiBzdHJpbmcgPSAnJywgZGVmYXVsdFBhcmFtZXRlcjogc3RyaW5nID0gJycpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGxldCBxdWVyeVN0cmluZyA9IGA/a2V5PSR7cGFnZU9wdGlvbi5xdWVyeX1gO1xyXG5cclxuICAgICAgICBpZiAoIXBhZ2VPcHRpb24ub2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIHBhZ2VPcHRpb24ub2Zmc2V0ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmb2Zmc2V0PSR7cGFnZU9wdGlvbi5vZmZzZXR9YDtcclxuXHJcblxyXG4gICAgICAgIGlmICghcGFnZU9wdGlvbi5saW1pdCkge1xyXG4gICAgICAgICAgICBwYWdlT3B0aW9uLmxpbWl0ID0gdGhpcy5MSU1JVF9ERUZBVUxUO1xyXG4gICAgICAgIH1cclxuICAgICAgICBxdWVyeVN0cmluZyArPSBgJmxpbWl0PSR7cGFnZU9wdGlvbi5saW1pdCArIDF9YDtcclxuXHJcblxyXG4gICAgICAgIGlmIChwYWdlT3B0aW9uLnNvcnRGaWVsZCkge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJnNvcnRGaWVsZD0ke3BhZ2VPcHRpb24uc29ydEZpZWxkfSZpc0FzYz0ke3BhZ2VPcHRpb24uaXNBc2N9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRlZmF1bHRQYXJhbWV0ZXIgIT0gJycpIHtcclxuICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gYCYke2RlZmF1bHRQYXJhbWV0ZXJ9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvblBhcmFtZXRlciAhPSAnJykge1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJiR7b3B0aW9uUGFyYW1ldGVyfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMub3JnYW5pemF0aW9uRW5kcG9pbnR9JHtmdW5HZXROYW1lfSR7cXVlcnlTdHJpbmd9YDtcclxuICAgICAgICBpZiAocGFnZU9wdGlvbi5pc0lnbm9yZUNsaWVudENhY2hlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldElnbm9yZUNsaWVudENhY2hlKGFwaVVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGFwaVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0c0J5T3JnYW5pemF0aW9uSWQob3JnYW5pemF0aW9uSWQ6IHN0cmluZywga2V5d29yZD86IHN0cmluZywgb2Zmc2V0PzogbnVtYmVyLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcclxuXHJcbiAgICAgICAgaWYgKCFrZXl3b3JkKSB7XHJcbiAgICAgICAgICAgIGtleXdvcmQgPSAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghb2Zmc2V0KSB7XHJcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW9mZnNldCkge1xyXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFsaW1pdCkge1xyXG4gICAgICAgICAgICBsaW1pdCA9IDEwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXBpVXJsID0gYCR7dGhpcy5zZXJ2aWNlVXJpfS9HZXRzQnlPcmdhbml6YXRpb25JZGBcclxuICAgICAgICAgICAgKyBgP29yZ2FuaXphdGlvbklkPSR7b3JnYW5pemF0aW9uSWR9YFxyXG4gICAgICAgICAgICArIGAma2V5d29yZD0ke2tleXdvcmR9YFxyXG4gICAgICAgICAgICArIGAmb2Zmc2V0PSR7b2Zmc2V0fWBcclxuICAgICAgICAgICAgKyBgJmxpbWl0PSR7bGltaXR9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0R2V0KGFwaVVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGVmYXVsdEF2YXRhcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ERUZBVUxUX0FWQVRBUl9NQUxFO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yKGVycm9yOiBhbnksIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIGNvbnN0IGNvbW1vblNlcnZpY2UgPSBpbmplY3Rvci5nZXQoQ29tbW9uU2VydmljZSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyb3IsIGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2NrVXNlcihpdGVtOiBhbnkpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vbG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVubG9ja1VzZXIoaXRlbTogYW55KTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG5cclxuICAgICAgICBjb25zdCBhcGlVcmwgPSBgJHt0aGlzLnNlcnZpY2VVcml9L3VubG9ja1VzZXJBY2NvdW50YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cFxyXG4gICAgICAgICAgICAucG9zdDxSZXNwb25zZVJlc3VsdD4oYXBpVXJsLCBpdGVtKVxyXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU3VwZXJVc2VyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIuaXNzdXBlcnVzZXIgPT09ICdUcnVlJztcclxuICAgIH1cclxuXHJcbiAgICBpc0FkbWluKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbkNvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5kYXRhLmN1cnJlbnRVc2VyXHJcbiAgICAgICAgICAgICYmIHRoaXMuX2FwcGxpY2F0aW9uQ29udGV4dC5nZXRSb290Q29udGV4dCgpLmRhdGEuY3VycmVudFVzZXIuaXNhZG1pbiA9PT0gJ1RydWUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsaWRBY2Nlc3NUb2tlbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2Vyc0J5R3JvdXBDb2RlKGdyb3VwQ29kZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xyXG4gICAgICAgIGNvbnN0IGFwaVVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0VXNlcnNCeUdyb3VwQ29kZT9ncm91cENvZGU9JHtncm91cENvZGV9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLl9leGNlcHRpb25IYW5kbGVyU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSlcclxuICAgICAgICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXJ2aWNlRW5kcG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuc2VydmljZVVyaX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGlzU2luaFZpZW5BY2NvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHVzZXJMb2dpbiA9IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICBpZiAodXNlckxvZ2luKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyTG9naW4ubWFOZ3VvaUhvYykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBhZ2VVc2VySW5mbyh1c2VySWRzOiBzdHJpbmcpOiBQcm9taXNlPEJhc2ljVXNlckluZm9bXT4ge1xyXG4gICAgICAgIGlmICghdXNlcklkcyB8fCB1c2VySWRzID09PSAnJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSg8QmFzaWNVc2VySW5mb1tdPltdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5VU0VSX0lORk9fS0VZKTtcclxuICAgICAgICBjb25zdCB1c2VySW5mb3MgPSA8QmFzaWNVc2VySW5mb1tdPkpTT04ucGFyc2Uoc3RvcmFnZUl0ZW0pO1xyXG5cclxuICAgICAgICAvLyBjb25zdCB1c2VycyA9IHVzZXJJbmZvcyA/IHVzZXJJbmZvcy5maWx0ZXIoaXRlbSA9PiB1c2VySWRzLmluZGV4T2YoYCwke2l0ZW0uaWR9LGApID4gLTEpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBjaGVjayA9IHVzZXJJbmZvcyA/IHVzZXJJZHMuaW5kZXhPZih1c2VySW5mb3NbJ2lkJ10pID4gLTEgOiBudWxsO1xyXG4gICAgICAgIGlmIChjaGVjaykge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gcmVzb2x2ZSh1c2VySW5mb3MpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdlVybCA9IGAke3RoaXMuc2VydmljZVVyaX0vR2V0UGFnZWRgO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2lkJyxcclxuICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2luJyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdXNlcklkc1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChpdGVtRmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcclxuICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAxMDAwMFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc29ydHM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2h0dHAucG9zdDxSZXNwb25zZVJlc3VsdD4oc3ZVcmwsIGdyaWRJbmZvKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KHRoaXMuUkVQTEFZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICByZXRyeSh0aGlzLlJFVFJZX0NPVU5UKSxcclxuICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSxcclxuICAgICAgICAgICAgICAgICAgICBtYXAocmVwc29uc2UgPT4gPEJhc2ljVXNlckluZm9bXT5yZXBzb25zZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgKS50b1Byb21pc2UoKS50aGVuKHN1Y2Nlc3MgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3VjY2Vzcyk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoPEJhc2ljVXNlckluZm9bXT5bXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==